From 7ce8d75d911b6cc5d8885b92549f73f1bc3012c4 Mon Sep 17 00:00:00 2001 From: Matthias Nannt Date: Tue, 22 Aug 2023 13:58:23 +0200 Subject: [PATCH] add new template --- apps/formbricks-com-old/.env.example | 6 + apps/formbricks-com-old/.eslintrc.js | 4 + apps/formbricks-com-old/.gitignore | 37 + .../components/docs/DocsFeedback.tsx | 0 .../components/docs/FeedbackButtonPopover.tsx | 0 .../components/docs/Layout.tsx | 0 .../components/docs/MobileNavigation.jsx | 0 .../components/dummyUI/AddEventDummy.tsx | 0 .../dummyUI/AddNoCodeEventModalDummy.tsx | 0 .../components/dummyUI/CTAQuestion.tsx | 0 .../components/dummyUI/ContentWrapper.tsx | 0 .../components/dummyUI/DemoPreview.tsx | 0 .../components/dummyUI/DemoView.tsx | 0 .../components/dummyUI/Headline.tsx | 0 .../components/dummyUI/HtmlBody.tsx | 0 .../components/dummyUI/Modal.tsx | 0 .../dummyUI/MultipleChoiceMultiQuestion.tsx | 0 .../dummyUI/MultipleChoiceSingleQuestion.tsx | 0 .../components/dummyUI/NPSQuestion.tsx | 0 .../components/dummyUI/OpenTextQuestion.tsx | 0 .../components/dummyUI/PreviewModal.tsx | 0 .../components/dummyUI/PreviewSurvey.tsx | 0 .../components/dummyUI/Progress.tsx | 0 .../dummyUI/QuestionConditional.tsx | 0 .../components/dummyUI/RatingQuestion.tsx | 0 .../components/dummyUI/Subheader.tsx | 0 .../components/dummyUI/TemplateList.tsx | 0 .../components/dummyUI/ThankYouCard.tsx | 0 .../components/dummyUI/templates.ts | 0 .../components/home/Features.tsx | 0 .../components/home/GitHubSponsorship.tsx | 0 .../components/home/Hero.tsx | 0 .../components/home/HeroAnimation.tsx | 0 .../components/home/Highlights.tsx | 0 .../components/home/SetupTabs.tsx | 0 .../components/home/Steps.tsx | 0 .../components/home/VideoWalkThrough.tsx | 0 .../components/shared/APILayout.tsx | 0 .../components/shared/AuthorBox.tsx | 0 .../shared/BestPracticeNavigation.tsx | 0 .../components/shared/BestPractices.tsx | 0 .../components/shared/BreakerCTA.tsx | 0 .../components/shared/CTA.tsx | 0 .../components/shared/Callout.tsx | 0 .../components/shared/Card.jsx | 0 .../components/shared/CodeBlock.tsx | 0 .../components/shared/EarlyBirdDeal.tsx | 0 .../components/shared/FeatureHighlight.tsx | 0 .../components/shared/Fence.jsx | 0 .../components/shared/Footer.tsx | 0 .../components/shared/Header.tsx | 0 .../components/shared/HeaderLight.tsx | 0 .../components/shared/HeadingCentered.tsx | 0 .../components/shared/HeroAnimation.tsx | 0 .../components/shared/HeroTitle.tsx | 0 .../components/shared/Icon.jsx | 0 .../components/shared/Layout.tsx | 0 .../components/shared/LayoutLight.tsx | 0 .../components/shared/LayoutMdx.tsx | 0 .../components/shared/Logo.tsx | 0 .../components/shared/MdxCTA.tsx | 0 .../components/shared/MdxTryItCTA.tsx | 0 .../components/shared/MetaInformation.tsx | 0 .../components/shared/MobileNavigation.jsx | 0 .../components/shared/Modal.tsx | 0 .../components/shared/Navigation.tsx | 0 .../components/shared/NewsletterSignup.tsx | 0 .../components/shared/Pricing.tsx | 0 .../components/shared/Prose.jsx | 0 .../components/shared/Search.tsx | 0 .../components/shared/ThemeSelector.jsx | 0 .../components/shared/TryItCTA.tsx | 0 .../components/shared/UseCaseCTA.tsx | 0 .../components/shared/UseCaseHeader.tsx | 0 .../components/shared/WhyFormbricks.tsx | 0 .../shared/icons/InstallationIcon.jsx | 0 .../components/shared/icons/LightbulbIcon.jsx | 0 .../components/shared/icons/PluginsIcon.jsx | 0 .../components/shared/icons/PresetsIcon.jsx | 0 .../components/shared/icons/ThemingIcon.jsx | 0 .../components/shared/icons/WarningIcon.jsx | 0 ... and build forms surveys easy and fast.png | Bin ...view for open source forms and surveys.png | Bin ...to build forms fast in reactjs smaller.png | Bin ...son post for form backend as a service.png | Bin ...DPR CCPA HIPAA open source alternative.png | Bin ...bricks Open-source Online Form Builder.png | Bin ...y open source self-hosting alternative.png | Bin ...ource forms and survey library builder.png | Bin ...ository stars for form builder library.png | Bin ...t survey Library and Builder 2023 2022.png | Bin ...th-image-in-react-library-Oopen-source.png | Bin ...ho gets the crown of open source forms.gif | Bin .../images/ask-nothing-twice.png | Bin .../images/attributes-dark.png | Bin .../images/attributes-dark.svg | 0 .../images/attributes-light.png | Bin .../images/attributes-light.svg | 0 .../johannes-co-founder-formbricks-small.jpg | Bin .../images/blur-cyan.png | Bin .../images/blur-indigo.png | Bin .../images/clients/cal-logo-dark.svg | 0 .../images/clients/cal-logo-light.svg | 0 .../images/clients/clovyr-logo.svg | 0 .../images/clients/crowd-logo-dark.svg | 0 .../images/clients/crowd-logo-light.svg | 0 .../images/clients/niLogoDark.svg | 0 .../images/clients/niLogoWhite.svg | 0 .../images/connect-analytics.png | Bin .../images/core-api.svg | 0 .../images/dark-connect-analytics.png | Bin .../images/dark-insights.png | Bin .../images/dashboard-mockup-dark.png | Bin .../images/dashboard-mockup.png | Bin .../images/data-pipelines.png | Bin .../images/docs/copy-id.png | Bin .../images/docs/create-feedback-box.png | Bin .../images/docs/fb-id.png | Bin .../images/docs/new-pmf.png | Bin ...ternative typeform and surveymonkey_v2.svg | 0 .../images/email.svg | 0 .../images/event-trigger-dark.png | Bin .../images/event-trigger-dark.svg | 0 .../images/event-trigger-light.png | Bin .../images/event-trigger-light.svg | 0 .../images/form-hq.png | Bin .../images/github-mark-white.svg | 0 .../images/github-mark.svg | 0 .../images/insights.png | Bin .../images/logo/footerlogo-dark.svg | 0 .../images/logo/footerlogo.svg | 0 .../images/logo/logo.svg | 0 .../images/logo/logo_dark.svg | 0 .../images/logo/logomark.svg | 0 .../images/newsletter-signup-gif.gif | Bin .../images/pipelines-dark.png | Bin .../images/pipelines.png | Bin .../images/pre-segmentation-dark.png | Bin .../images/pre-segmentation.png | Bin .../images/pre-segmentation.svg | 0 .../images/react-lib.png | Bin .../images/schema-generation-svg.svg | 0 .../images/schema-generation.png | Bin .../images/webhook-png.png | Bin .../lib/articles.ts | 0 .../lib/cleanHtml.ts | 0 .../lib/docsNavigation.ts | 0 .../lib/handleFeedbackSubmit.ts | 0 .../lib/utils.ts | 0 .../next-sitemap.config.js | 0 apps/formbricks-com-old/next.config.mjs | 130 ++++ apps/formbricks-com-old/package.json | 48 ++ .../pages/404.tsx | 0 .../pages/_app.tsx | 0 .../pages/_document.tsx | 0 .../pages/api/oss-friends/index.ts | 0 ...survey-software-tools-and-alternatives.png | Bin ...survey-open-source-software-opensource.png | Bin .../index.mdx | 0 ...e-2023-formbricks-typeform-alternative.png | Bin ...survey-tools-builder-2023-self-hostign.jpg | Bin ...vey-tool-software-to-make-surveys-2023.png | Bin ...orm-builder-survey-software-opensource.jpg | Bin .../email-results-PMF-cal.png | Bin .../index.mdx | 0 .../matti-jojo.jpg | Bin .../peer-tweet-typeform-open-source.png | Bin .../pmf-survey-dashboard.png | Bin ...forms-open-source-typeform-alternative.png | Bin .../survey-display-peak.png | Bin ...vey-tool-software-to-make-surveys-2023.png | Bin .../twitter-results-PMF-cal.png | Bin ...-sponsored-by-github-accelerator-2023.webp | Bin .../github-accelerator-2022-teams.png | Bin .../github-accelerator-selection-mail.png | Bin .../github-accelerator-experience/index.mdx | 0 ...-experience-github-acc-demo-screenshot.png | Bin ...-sponsored-by-github-accelerator-2023.webp | Bin .../index.mdx | 0 .../pages/blog/index.tsx | 0 .../everything_everywhere_all_at_once.png | Bin .../index.mdx | 0 .../robin-hood-meme.png | Bin .../why-we-do-it.png | Bin .../formbricks-sneak.png | Bin .../index.mdx | 0 .../ohmyform.png | Bin .../snoopforms-how-it-began.png | Bin .../tellform.png | Bin .../tripetto.png | Bin .../typeform-value-prop.png | Bin .../wrestling.jpg | Bin ...header-open-source-form-infrastructure.svg | 0 .../snoopforms-becomes-formbricks/index.mdx | 0 .../formbricks-logo.svg | 0 .../index.mdx | 0 .../propietary-dependence.jpeg | Bin .../snoopforms-logo.svg | 0 .../title-image.png | Bin .../pages/careers.tsx | 0 .../pages/community.tsx | 0 .../pages/concierge.tsx | 0 .../pages/demo/index.tsx | 0 .../pages/docs-feedback/index.tsx | 0 .../pages/docs/actions/code/index.mdx | 0 .../pages/docs/actions/no-code/index.mdx | 0 .../pages/docs/actions/why/index.mdx | 0 .../docs/api/api-key-setup/add-api-key.png | Bin .../docs/api/api-key-setup/api-key-secret.png | Bin .../pages/docs/api/api-key-setup/index.mdx | 0 .../pages/docs/api/overview/index.mdx | 0 .../attributes/custom-attributes/index.mdx | 0 .../docs/attributes/identify-users/index.mdx | 0 .../pages/docs/attributes/why/index.mdx | 0 .../cancel-subscription/change-text.png | Bin .../create-cancel-flow.png | Bin .../cancel-subscription/index.mdx | 0 .../cancel-subscription/publish-survey.png | Bin .../cancel-subscription/recontact-options.png | Bin .../cancel-subscription/select-action.png | Bin .../trigger-css-selector.png | Bin .../trigger-inner-text.png | Bin .../cancel-subscription/trigger-page-url.png | Bin .../docs-feedback/add-action.png | Bin .../docs-feedback/change-id.png | Bin .../best-practices/docs-feedback/copy-ids.png | Bin .../docs-feedback/docs-navi.png | Bin .../docs-feedback/docs-template.png | Bin .../best-practices/docs-feedback/index.mdx | 0 .../docs-feedback/select-nonevent.png | Bin .../docs-feedback/switch-to-dev.png | Bin .../docs-feedback/when-to-ask.png | Bin .../feature-chaser/action-css.png | Bin .../feature-chaser/action-text.png | Bin .../feature-chaser/change-text.png | Bin .../feature-chaser/create-survey.png | Bin .../best-practices/feature-chaser/index.mdx | 0 .../best-practices/feature-chaser/publish.png | Bin .../feature-chaser/recontact-options.png | Bin .../feature-chaser/select-action.png | Bin .../feedback-box/add-action.png | Bin .../feedback-box/add-css-action.png | Bin .../feedback-box/add-html-action.png | Bin .../feedback-box/change-text-content.png | Bin .../create-feedback-box-by-template.png | Bin .../best-practices/feedback-box/index.mdx | 0 .../feedback-box/publish-survey.png | Bin .../select-feedback-button-action.png | Bin .../feedback-box/set-recontact-options.png | Bin .../improve-trial-cr/action-innertext.png | Bin .../improve-trial-cr/action-pageurl.png | Bin .../improve-trial-cr/change-text.png | Bin .../improve-trial-cr/create-survey.png | Bin .../best-practices/improve-trial-cr/index.mdx | 0 .../improve-trial-cr/publish.png | Bin .../improve-trial-cr/recontact-options.png | Bin .../improve-trial-cr/select-action.png | Bin .../interview-prompt/action-css.png | Bin .../interview-prompt/action-innertext.png | Bin .../interview-prompt/action-pageurl.png | Bin .../interview-prompt/add-action.png | Bin .../interview-prompt/change-text.png | Bin .../interview-prompt/create-prompt.png | Bin .../best-practices/interview-prompt/index.mdx | 0 .../interview-prompt/interview-example.png | Bin .../interview-prompt/publish-survey.png | Bin .../interview-prompt/recontact-options.png | Bin .../interview-prompt/select-action.png | Bin .../best-practices/pmf-survey/action-css.png | Bin .../pmf-survey/action-pageurl.png | Bin .../best-practices/pmf-survey/change-text.png | Bin .../pmf-survey/create-survey.png | Bin .../docs/best-practices/pmf-survey/index.mdx | 0 .../best-practices/pmf-survey/publish.png | Bin .../pmf-survey/recontact-options.png | Bin .../pmf-survey/select-action.png | Bin .../docs/client-api/create-response/index.mdx | 0 .../pages/docs/client-api/overview/index.mdx | 0 .../docs/client-api/update-response/index.mdx | 0 .../pages/docs/contributing/demo/demoapp.png | Bin .../pages/docs/contributing/demo/index.mdx | 0 .../docs/contributing/introduction/index.mdx | 0 .../pages/docs/contributing/setup/index.mdx | 0 .../troubleshooting/clear-app-data.png | Bin .../contributing/troubleshooting/index.mdx | 0 .../contributing/troubleshooting/logout.png | Bin .../troubleshooting/uncaught-promise.png | Bin .../getting-started/nextjs-app/env-id.png | Bin .../docs/getting-started/nextjs-app/index.mdx | 0 .../nextjs-app/widget-connected.png | Bin .../nextjs-app/widget-not-connected.png | Bin .../getting-started/nextjs-pages/env-id.png | Bin .../getting-started/nextjs-pages/index.mdx | 0 .../nextjs-pages/widget-connected.png | Bin .../nextjs-pages/widget-not-connected.png | Bin .../docs/getting-started/quickstart/index.mdx | 0 .../docs/getting-started/vuejs/index.mdx | 0 .../pages/docs/index.mdx | 0 .../docs/integrations/zapier/add-new-zap.png | Bin .../docs/integrations/zapier/choose-event.png | Bin .../zapier/connect-with-formbricks-1.png | Bin .../zapier/connect-with-formbricks-2.png | Bin .../integrations/zapier/duplicate-survey.png | Bin .../pages/docs/integrations/zapier/index.mdx | 0 .../integrations/zapier/select-survey.png | Bin .../integrations/zapier/slack-channel-msg.png | Bin .../integrations/zapier/slack-message.png | Bin .../zapier/submit-test-response.png | Bin .../integrations/zapier/success-connected.png | Bin .../integrations/zapier/test-submission.png | Bin .../zapier/update-question-id.png | Bin .../integrations/zapier/zapier-message.png | Bin .../docs/introduction/how-it-works/index.mdx | 0 .../introduction/what-is-formbricks/index.mdx | 0 .../introduction/why-is-it-better/index.mdx | 0 .../link-surveys/data-prefilling/index.mdx | 0 .../data-prefilling/question-id.png | Bin .../user-identification/index.mdx | 0 .../user-identification/people-view.png | Bin ...urce-tool-for-form-and-survey-overview.png | Bin .../docs/self-hosting/deployment/index.mdx | 0 .../docs/webhook-api/create-webhook/index.mdx | 0 .../docs/webhook-api/delete-webhook/index.mdx | 0 .../docs/webhook-api/get-webhook/index.mdx | 0 .../docs/webhook-api/list-webhooks/index.mdx | 0 .../pages/docs/webhook-api/overview/index.mdx | 0 .../webhook-api/webhook-payload/index.mdx | 0 .../pages/docs/wrappers/email/index.mdx | 0 .../pages/docs/wrappers/inline/index.mdx | 0 .../pages/docs/wrappers/link/index.mdx | 0 .../pages/docs/wrappers/modal/index.mdx | 0 .../pages/docs/wrappers/pop-over/demo.tsx | 0 .../pages/docs/wrappers/pop-over/index.mdx | 0 .../pages/docs/wrappers/slide-out/index.mdx | 0 .../docs/wrappers/what-are-wrappers/index.mdx | 0 .../pages/feature-chaser/index.tsx | 0 .../pages/feedback-box/index.tsx | 0 .../pages/gdpr-guide.mdx | 0 .../pages/gdpr.mdx | 0 .../pages/imprint.mdx | 0 .../pages/improve-trial-conversion/index.tsx | 0 .../pages/index.tsx | 0 .../pages/interview-prompt/index.tsx | 0 .../pages/learn-from-churn/index.tsx | 0 .../pages/learn/[slug].tsx | 0 .../measure-product-market-fit/index.tsx | 0 .../pages/onboarding-segmentation/index.tsx | 0 .../pages/oss-friends.tsx | 0 .../pages/privacy-policy.mdx | 0 .../pages/terms.mdx | 0 .../pages/vs-formspree.mdx | 0 .../pages/vs-google-forms.mdx | 0 .../pages/vs-ohmyform.mdx | 0 apps/formbricks-com-old/postcss.config.js | 6 + ...source-xm-platform-formbricks-fallback.png | Bin .../opensource-xm-platform-formbricks.json | 0 .../public/favicon/android-chrome-192x192.png | Bin .../public/favicon/android-chrome-512x512.png | Bin .../public/favicon/apple-touch-icon.png | Bin .../public/favicon/browserconfig.xml | 0 .../public/favicon/favicon-16x16.png | Bin .../public/favicon/favicon-32x32.png | Bin .../public/favicon/favicon.ico | Bin .../public/favicon/mstile-144x144.png | Bin .../public/favicon/mstile-150x150.png | Bin .../public/favicon/mstile-310x150.png | Bin .../public/favicon/mstile-310x310.png | Bin .../public/favicon/mstile-70x70.png | Bin .../public/favicon/safari-pinned-tab.svg | 0 .../public/favicon/site.webmanifest | 0 .../public/fonts/Inter-italic.var.woff2 | Bin .../public/fonts/Inter-roman.var.woff2 | Bin .../public/fonts/Poppins-Black.woff | Bin .../public/fonts/Poppins-Black.woff2 | Bin .../public/fonts/Poppins-Bold.woff | Bin .../public/fonts/Poppins-Bold.woff2 | Bin .../public/fonts/Poppins-ExtraBold.woff | Bin .../public/fonts/Poppins-ExtraBold.woff2 | Bin .../public/fonts/Poppins-ExtraLight.woff | Bin .../public/fonts/Poppins-ExtraLight.woff2 | Bin .../public/fonts/Poppins-Light.woff | Bin .../public/fonts/Poppins-Light.woff2 | Bin .../public/fonts/Poppins-Medium.woff | Bin .../public/fonts/Poppins-Medium.woff2 | Bin .../public/fonts/Poppins-Regular.woff | Bin .../public/fonts/Poppins-Regular.woff2 | Bin .../public/fonts/Poppins-SemiBold.woff | Bin .../public/fonts/Poppins-SemiBold.woff2 | Bin .../public/fonts/Poppins-Thin.woff | Bin .../public/fonts/Poppins-Thin.woff2 | Bin .../public/fonts/lexend.txt | 0 .../public/fonts/lexend.woff2 | Bin .../public/robots.txt | 0 .../public/social-image.png | Bin .../videos/thumbnail-visual-form-builder.png | Bin .../public/videos/visual-builder-vid.mp4 | Bin .../public/videos/walkthrough-v1.mp4 | Bin .../styles/docsearch.css | 0 .../styles/fonts.css | 0 .../styles/globals.css | 0 .../styles/prism.css | 0 .../tailwind.config.js | 0 apps/formbricks-com-old/tsconfig.json | 15 + apps/formbricks-com/.gitignore | 2 - apps/formbricks-com/LICENSE.md | 129 +++ apps/formbricks-com/mdx-components.tsx | 9 + apps/formbricks-com/next.config.mjs | 139 +--- apps/formbricks-com/package.json | 66 +- apps/formbricks-com/prettier.config.js | 6 + .../src/app/attachments/page.mdx | 363 +++++++++ .../src/app/authentication/page.mdx | 44 ++ apps/formbricks-com/src/app/contacts/page.mdx | 394 ++++++++++ .../src/app/conversations/page.mdx | 407 ++++++++++ apps/formbricks-com/src/app/errors/page.mdx | 70 ++ apps/formbricks-com/src/app/favicon.ico | Bin 0 -> 15086 bytes apps/formbricks-com/src/app/groups/page.mdx | 448 +++++++++++ apps/formbricks-com/src/app/layout.tsx | 42 + apps/formbricks-com/src/app/messages/page.mdx | 441 +++++++++++ apps/formbricks-com/src/app/not-found.tsx | 24 + apps/formbricks-com/src/app/page.mdx | 42 + .../src/app/pagination/page.mdx | 63 ++ apps/formbricks-com/src/app/providers.tsx | 37 + .../src/app/quickstart/page.mdx | 104 +++ apps/formbricks-com/src/app/sdks/page.mdx | 17 + apps/formbricks-com/src/app/webhooks/page.mdx | 175 +++++ apps/formbricks-com/src/components/Button.tsx | 82 ++ apps/formbricks-com/src/components/Code.tsx | 376 +++++++++ .../src/components/Feedback.tsx | 105 +++ apps/formbricks-com/src/components/Footer.tsx | 145 ++++ .../src/components/GridPattern.tsx | 55 ++ apps/formbricks-com/src/components/Guides.tsx | 54 ++ apps/formbricks-com/src/components/Header.tsx | 98 +++ .../formbricks-com/src/components/Heading.tsx | 117 +++ .../src/components/HeroPattern.tsx | 32 + apps/formbricks-com/src/components/Layout.tsx | 46 ++ .../src/components/Libraries.tsx | 82 ++ apps/formbricks-com/src/components/Logo.tsx | 14 + .../src/components/MobileNavigation.tsx | 174 +++++ .../src/components/Navigation.tsx | 279 +++++++ apps/formbricks-com/src/components/Prose.tsx | 19 + .../src/components/Resources.tsx | 186 +++++ apps/formbricks-com/src/components/Search.tsx | 505 ++++++++++++ .../src/components/SectionProvider.tsx | 153 ++++ apps/formbricks-com/src/components/Tag.tsx | 63 ++ .../src/components/ThemeToggle.tsx | 44 ++ .../src/components/icons/BellIcon.tsx | 17 + .../src/components/icons/BoltIcon.tsx | 11 + .../src/components/icons/BookIcon.tsx | 17 + .../src/components/icons/CalendarIcon.tsx | 23 + .../src/components/icons/CartIcon.tsx | 15 + .../src/components/icons/ChatBubbleIcon.tsx | 17 + .../src/components/icons/CheckIcon.tsx | 17 + .../components/icons/ChevronRightLeftIcon.tsx | 19 + .../src/components/icons/ClipboardIcon.tsx | 17 + .../src/components/icons/CogIcon.tsx | 19 + .../src/components/icons/CopyIcon.tsx | 17 + .../src/components/icons/DocumentIcon.tsx | 17 + .../src/components/icons/EnvelopeIcon.tsx | 17 + .../src/components/icons/FaceSmileIcon.tsx | 17 + .../src/components/icons/FolderIcon.tsx | 22 + .../src/components/icons/LinkIcon.tsx | 12 + .../src/components/icons/ListIcon.tsx | 17 + .../components/icons/MagnifyingGlassIcon.tsx | 15 + .../src/components/icons/MapPinIcon.tsx | 19 + .../src/components/icons/PackageIcon.tsx | 16 + .../components/icons/PaperAirplaneIcon.tsx | 19 + .../src/components/icons/PaperClipIcon.tsx | 12 + .../src/components/icons/ShapesIcon.tsx | 17 + .../src/components/icons/ShirtIcon.tsx | 11 + .../src/components/icons/SquaresPlusIcon.tsx | 17 + .../src/components/icons/TagIcon.tsx | 19 + .../src/components/icons/UserIcon.tsx | 24 + .../src/components/icons/UsersIcon.tsx | 28 + apps/formbricks-com/src/components/mdx.tsx | 127 +++ apps/formbricks-com/src/images/logos/go.svg | 14 + apps/formbricks-com/src/images/logos/node.svg | 4 + apps/formbricks-com/src/images/logos/php.svg | 10 + .../src/images/logos/python.svg | 13 + apps/formbricks-com/src/images/logos/ruby.svg | 4 + apps/formbricks-com/src/lib/remToPx.ts | 8 + apps/formbricks-com/src/mdx/recma.mjs | 3 + apps/formbricks-com/src/mdx/rehype.mjs | 124 +++ apps/formbricks-com/src/mdx/remark.mjs | 4 + apps/formbricks-com/src/mdx/search.mjs | 135 ++++ apps/formbricks-com/src/styles/tailwind.css | 21 + apps/formbricks-com/tailwind.config.ts | 46 ++ apps/formbricks-com/tsconfig.json | 31 +- apps/formbricks-com/types.d.ts | 11 + apps/formbricks-com/typography.ts | 361 +++++++++ pnpm-lock.yaml | 732 +++++++++++++----- 490 files changed, 7690 insertions(+), 343 deletions(-) create mode 100644 apps/formbricks-com-old/.env.example create mode 100644 apps/formbricks-com-old/.eslintrc.js create mode 100644 apps/formbricks-com-old/.gitignore rename apps/{formbricks-com => formbricks-com-old}/components/docs/DocsFeedback.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/docs/FeedbackButtonPopover.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/docs/Layout.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/docs/MobileNavigation.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/AddEventDummy.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/AddNoCodeEventModalDummy.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/CTAQuestion.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/ContentWrapper.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/DemoPreview.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/DemoView.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/Headline.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/HtmlBody.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/Modal.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/MultipleChoiceMultiQuestion.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/MultipleChoiceSingleQuestion.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/NPSQuestion.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/OpenTextQuestion.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/PreviewModal.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/PreviewSurvey.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/Progress.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/QuestionConditional.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/RatingQuestion.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/Subheader.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/TemplateList.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/ThankYouCard.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/dummyUI/templates.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/Features.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/GitHubSponsorship.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/Hero.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/HeroAnimation.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/Highlights.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/SetupTabs.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/Steps.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/home/VideoWalkThrough.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/APILayout.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/AuthorBox.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/BestPracticeNavigation.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/BestPractices.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/BreakerCTA.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/CTA.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Callout.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Card.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/CodeBlock.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/EarlyBirdDeal.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/FeatureHighlight.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Fence.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Footer.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Header.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/HeaderLight.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/HeadingCentered.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/HeroAnimation.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/HeroTitle.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Icon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Layout.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/LayoutLight.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/LayoutMdx.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Logo.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/MdxCTA.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/MdxTryItCTA.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/MetaInformation.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/MobileNavigation.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Modal.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Navigation.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/NewsletterSignup.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Pricing.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Prose.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/Search.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/ThemeSelector.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/TryItCTA.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/UseCaseCTA.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/UseCaseHeader.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/WhyFormbricks.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/icons/InstallationIcon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/icons/LightbulbIcon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/icons/PluginsIcon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/icons/PresetsIcon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/icons/ThemingIcon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/components/shared/icons/WarningIcon.jsx (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Best React Form Library and Builder 2023 to create and build forms surveys easy and fast.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Data Controller vs Data Processor Overview for open source forms and surveys.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Formbricks React Form Library vs React Hook Form comparison post to build forms fast in reactjs smaller.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Formspree open source alternative vs Formbricks FormHQ comparison post for form backend as a service.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Google Form Example Customize and make it comply with GDPR CCPA HIPAA open source alternative.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Google Forms Open Source Alternative Comparison with Formbricks Open-source Online Form Builder.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/GoogleForms GDPR compliant for EU company open source self-hosting alternative.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/OhMyForm Typeform Alternative comparison Formbricks open source forms and survey library builder.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Stars - best open source react survey builder 2023 comparison of github repository stars for form builder library.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/Winner comparison best React survey Library and Builder 2023 2022.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/example-lemonade-radio-field-with-image-in-react-library-Oopen-source.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/SEO/who gets the crown of open source forms.gif (100%) rename apps/{formbricks-com => formbricks-com-old}/images/ask-nothing-twice.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/attributes-dark.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/attributes-dark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/attributes-light.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/attributes-light.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/blog/johannes-co-founder-formbricks-small.jpg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/blur-cyan.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/blur-indigo.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/cal-logo-dark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/cal-logo-light.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/clovyr-logo.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/crowd-logo-dark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/crowd-logo-light.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/niLogoDark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/clients/niLogoWhite.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/connect-analytics.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/core-api.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/dark-connect-analytics.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/dark-insights.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/dashboard-mockup-dark.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/dashboard-mockup.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/data-pipelines.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/docs/copy-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/docs/create-feedback-box.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/docs/fb-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/docs/new-pmf.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/early bird deal for open source jotform alternative typeform and surveymonkey_v2.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/email.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/event-trigger-dark.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/event-trigger-dark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/event-trigger-light.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/event-trigger-light.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/form-hq.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/github-mark-white.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/github-mark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/insights.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/logo/footerlogo-dark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/logo/footerlogo.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/logo/logo.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/logo/logo_dark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/logo/logomark.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/newsletter-signup-gif.gif (100%) rename apps/{formbricks-com => formbricks-com-old}/images/pipelines-dark.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/pipelines.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/pre-segmentation-dark.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/pre-segmentation.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/pre-segmentation.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/react-lib.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/schema-generation-svg.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/images/schema-generation.png (100%) rename apps/{formbricks-com => formbricks-com-old}/images/webhook-png.png (100%) rename apps/{formbricks-com => formbricks-com-old}/lib/articles.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/lib/cleanHtml.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/lib/docsNavigation.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/lib/handleFeedbackSubmit.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/lib/utils.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/next-sitemap.config.js (100%) create mode 100644 apps/formbricks-com-old/next.config.mjs create mode 100644 apps/formbricks-com-old/package.json rename apps/{formbricks-com => formbricks-com-old}/pages/404.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/_app.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/_document.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/api/oss-friends/index.ts (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/2023-title-best-open-source-survey-software-tools-and-alternatives.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/free-survey-tool-limesurvey-open-source-software-opensource.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/open-source-survey-software-free-2023-formbricks-typeform-alternative.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/opnform-free-open-source-form-survey-tools-builder-2023-self-hostign.jpg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/best-open-source-survey-software-2023/typebot-open-source-free-conversational-form-builder-survey-software-opensource.jpg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/email-results-PMF-cal.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/matti-jojo.jpg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/peer-tweet-typeform-open-source.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/pmf-survey-dashboard.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/snoopforms-open-source-typeform-alternative.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/survey-display-peak.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/experience-management-open-source/twitter-results-PMF-cal.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/github-accelerator-experience/formbricks-sponsored-by-github-accelerator-2023.webp (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/github-accelerator-experience/github-accelerator-2022-teams.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/github-accelerator-experience/github-accelerator-selection-mail.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/github-accelerator-experience/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/github-accelerator-experience/our-experience-github-acc-demo-screenshot.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/inaugural-batch-github-accelerator/formbricks-sponsored-by-github-accelerator-2023.webp (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/inaugural-batch-github-accelerator/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-forms-will-save-the-world/everything_everywhere_all_at_once.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-forms-will-save-the-world/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-forms-will-save-the-world/robin-hood-meme.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-forms-will-save-the-world/why-we-do-it.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/formbricks-sneak.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/ohmyform.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/snoopforms-how-it-began.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/tellform.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/tripetto.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/typeform-value-prop.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/open-source-qualtrics-beats-typeform/wrestling.jpg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/snoopforms-becomes-formbricks/formbricks-logo-header-open-source-form-infrastructure.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/snoopforms-becomes-formbricks/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/formbricks-logo.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/propietary-dependence.jpeg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/snoopforms-logo.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/title-image.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/careers.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/community.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/concierge.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/demo/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs-feedback/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/actions/code/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/actions/no-code/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/actions/why/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/api/api-key-setup/add-api-key.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/api/api-key-setup/api-key-secret.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/api/api-key-setup/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/api/overview/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/attributes/custom-attributes/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/attributes/identify-users/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/attributes/why/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/change-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/create-cancel-flow.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/publish-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/recontact-options.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/select-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/trigger-css-selector.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/trigger-inner-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/cancel-subscription/trigger-page-url.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/add-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/change-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/copy-ids.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/docs-navi.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/docs-template.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/select-nonevent.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/switch-to-dev.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/docs-feedback/when-to-ask.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/action-css.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/action-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/change-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/create-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/publish.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/recontact-options.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feature-chaser/select-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/add-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/add-css-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/add-html-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/change-text-content.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/create-feedback-box-by-template.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/publish-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/select-feedback-button-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/feedback-box/set-recontact-options.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/action-innertext.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/action-pageurl.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/change-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/create-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/publish.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/recontact-options.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/improve-trial-cr/select-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/action-css.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/action-innertext.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/action-pageurl.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/add-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/change-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/create-prompt.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/interview-example.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/publish-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/recontact-options.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/interview-prompt/select-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/action-css.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/action-pageurl.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/change-text.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/create-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/publish.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/recontact-options.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/best-practices/pmf-survey/select-action.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/client-api/create-response/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/client-api/overview/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/client-api/update-response/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/demo/demoapp.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/demo/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/introduction/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/setup/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/troubleshooting/clear-app-data.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/troubleshooting/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/troubleshooting/logout.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/contributing/troubleshooting/uncaught-promise.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-app/env-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-app/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-app/widget-connected.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-app/widget-not-connected.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-pages/env-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-pages/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-pages/widget-connected.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/nextjs-pages/widget-not-connected.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/quickstart/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/getting-started/vuejs/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/add-new-zap.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/choose-event.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/connect-with-formbricks-1.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/connect-with-formbricks-2.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/duplicate-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/select-survey.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/slack-channel-msg.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/slack-message.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/submit-test-response.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/success-connected.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/test-submission.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/update-question-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/integrations/zapier/zapier-message.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/introduction/how-it-works/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/introduction/what-is-formbricks/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/introduction/why-is-it-better/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/link-surveys/data-prefilling/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/link-surveys/data-prefilling/question-id.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/link-surveys/user-identification/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/link-surveys/user-identification/people-view.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/open-source-tool-for-form-and-survey-overview.png (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/self-hosting/deployment/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/webhook-api/create-webhook/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/webhook-api/delete-webhook/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/webhook-api/get-webhook/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/webhook-api/list-webhooks/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/webhook-api/overview/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/webhook-api/webhook-payload/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/email/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/inline/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/link/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/modal/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/pop-over/demo.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/pop-over/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/slide-out/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/docs/wrappers/what-are-wrappers/index.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/feature-chaser/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/feedback-box/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/gdpr-guide.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/gdpr.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/imprint.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/improve-trial-conversion/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/interview-prompt/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/learn-from-churn/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/learn/[slug].tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/measure-product-market-fit/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/onboarding-segmentation/index.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/oss-friends.tsx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/privacy-policy.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/terms.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/vs-formspree.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/vs-google-forms.mdx (100%) rename apps/{formbricks-com => formbricks-com-old}/pages/vs-ohmyform.mdx (100%) create mode 100644 apps/formbricks-com-old/postcss.config.js rename apps/{formbricks-com => formbricks-com-old}/public/animations/opensource-xm-platform-formbricks-fallback.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/animations/opensource-xm-platform-formbricks.json (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/android-chrome-192x192.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/android-chrome-512x512.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/apple-touch-icon.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/browserconfig.xml (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/favicon-16x16.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/favicon-32x32.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/favicon.ico (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/mstile-144x144.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/mstile-150x150.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/mstile-310x150.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/mstile-310x310.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/mstile-70x70.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/safari-pinned-tab.svg (100%) rename apps/{formbricks-com => formbricks-com-old}/public/favicon/site.webmanifest (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Inter-italic.var.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Inter-roman.var.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Black.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Black.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Bold.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Bold.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-ExtraBold.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-ExtraBold.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-ExtraLight.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-ExtraLight.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Light.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Light.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Medium.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Medium.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Regular.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Regular.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-SemiBold.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-SemiBold.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Thin.woff (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/Poppins-Thin.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/lexend.txt (100%) rename apps/{formbricks-com => formbricks-com-old}/public/fonts/lexend.woff2 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/robots.txt (100%) rename apps/{formbricks-com => formbricks-com-old}/public/social-image.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/videos/thumbnail-visual-form-builder.png (100%) rename apps/{formbricks-com => formbricks-com-old}/public/videos/visual-builder-vid.mp4 (100%) rename apps/{formbricks-com => formbricks-com-old}/public/videos/walkthrough-v1.mp4 (100%) rename apps/{formbricks-com => formbricks-com-old}/styles/docsearch.css (100%) rename apps/{formbricks-com => formbricks-com-old}/styles/fonts.css (100%) rename apps/{formbricks-com => formbricks-com-old}/styles/globals.css (100%) rename apps/{formbricks-com => formbricks-com-old}/styles/prism.css (100%) rename apps/{formbricks-com => formbricks-com-old}/tailwind.config.js (100%) create mode 100644 apps/formbricks-com-old/tsconfig.json create mode 100644 apps/formbricks-com/LICENSE.md create mode 100644 apps/formbricks-com/mdx-components.tsx create mode 100644 apps/formbricks-com/prettier.config.js create mode 100644 apps/formbricks-com/src/app/attachments/page.mdx create mode 100644 apps/formbricks-com/src/app/authentication/page.mdx create mode 100644 apps/formbricks-com/src/app/contacts/page.mdx create mode 100644 apps/formbricks-com/src/app/conversations/page.mdx create mode 100644 apps/formbricks-com/src/app/errors/page.mdx create mode 100644 apps/formbricks-com/src/app/favicon.ico create mode 100644 apps/formbricks-com/src/app/groups/page.mdx create mode 100644 apps/formbricks-com/src/app/layout.tsx create mode 100644 apps/formbricks-com/src/app/messages/page.mdx create mode 100644 apps/formbricks-com/src/app/not-found.tsx create mode 100644 apps/formbricks-com/src/app/page.mdx create mode 100644 apps/formbricks-com/src/app/pagination/page.mdx create mode 100644 apps/formbricks-com/src/app/providers.tsx create mode 100644 apps/formbricks-com/src/app/quickstart/page.mdx create mode 100644 apps/formbricks-com/src/app/sdks/page.mdx create mode 100644 apps/formbricks-com/src/app/webhooks/page.mdx create mode 100644 apps/formbricks-com/src/components/Button.tsx create mode 100644 apps/formbricks-com/src/components/Code.tsx create mode 100644 apps/formbricks-com/src/components/Feedback.tsx create mode 100644 apps/formbricks-com/src/components/Footer.tsx create mode 100644 apps/formbricks-com/src/components/GridPattern.tsx create mode 100644 apps/formbricks-com/src/components/Guides.tsx create mode 100644 apps/formbricks-com/src/components/Header.tsx create mode 100644 apps/formbricks-com/src/components/Heading.tsx create mode 100644 apps/formbricks-com/src/components/HeroPattern.tsx create mode 100644 apps/formbricks-com/src/components/Layout.tsx create mode 100644 apps/formbricks-com/src/components/Libraries.tsx create mode 100644 apps/formbricks-com/src/components/Logo.tsx create mode 100644 apps/formbricks-com/src/components/MobileNavigation.tsx create mode 100644 apps/formbricks-com/src/components/Navigation.tsx create mode 100644 apps/formbricks-com/src/components/Prose.tsx create mode 100644 apps/formbricks-com/src/components/Resources.tsx create mode 100644 apps/formbricks-com/src/components/Search.tsx create mode 100644 apps/formbricks-com/src/components/SectionProvider.tsx create mode 100644 apps/formbricks-com/src/components/Tag.tsx create mode 100644 apps/formbricks-com/src/components/ThemeToggle.tsx create mode 100644 apps/formbricks-com/src/components/icons/BellIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/BoltIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/BookIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/CalendarIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/CartIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/ChatBubbleIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/CheckIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/ChevronRightLeftIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/ClipboardIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/CogIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/CopyIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/DocumentIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/EnvelopeIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/FaceSmileIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/FolderIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/LinkIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/ListIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/MagnifyingGlassIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/MapPinIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/PackageIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/PaperAirplaneIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/PaperClipIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/ShapesIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/ShirtIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/SquaresPlusIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/TagIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/UserIcon.tsx create mode 100644 apps/formbricks-com/src/components/icons/UsersIcon.tsx create mode 100644 apps/formbricks-com/src/components/mdx.tsx create mode 100644 apps/formbricks-com/src/images/logos/go.svg create mode 100644 apps/formbricks-com/src/images/logos/node.svg create mode 100644 apps/formbricks-com/src/images/logos/php.svg create mode 100644 apps/formbricks-com/src/images/logos/python.svg create mode 100644 apps/formbricks-com/src/images/logos/ruby.svg create mode 100644 apps/formbricks-com/src/lib/remToPx.ts create mode 100644 apps/formbricks-com/src/mdx/recma.mjs create mode 100644 apps/formbricks-com/src/mdx/rehype.mjs create mode 100644 apps/formbricks-com/src/mdx/remark.mjs create mode 100644 apps/formbricks-com/src/mdx/search.mjs create mode 100644 apps/formbricks-com/src/styles/tailwind.css create mode 100644 apps/formbricks-com/tailwind.config.ts create mode 100644 apps/formbricks-com/types.d.ts create mode 100644 apps/formbricks-com/typography.ts diff --git a/apps/formbricks-com-old/.env.example b/apps/formbricks-com-old/.env.example new file mode 100644 index 0000000000..26b2ce211f --- /dev/null +++ b/apps/formbricks-com-old/.env.example @@ -0,0 +1,6 @@ +NEXT_PUBLIC_FORMBRICKS_COM_API_HOST=http://localhost:3000 +NEXT_PUBLIC_FORMBRICKS_COM_ENVIRONMENT_ID= +NEXT_PUBLIC_FORMBRICKS_COM_DOCS_FEEDBACK_SURVEY_ID= + +# Strapi API Key +STRAPI_API_KEY= diff --git a/apps/formbricks-com-old/.eslintrc.js b/apps/formbricks-com-old/.eslintrc.js new file mode 100644 index 0000000000..bcf4aad3a3 --- /dev/null +++ b/apps/formbricks-com-old/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ["formbricks"], +}; diff --git a/apps/formbricks-com-old/.gitignore b/apps/formbricks-com-old/.gitignore new file mode 100644 index 0000000000..25374c573c --- /dev/null +++ b/apps/formbricks-com-old/.gitignore @@ -0,0 +1,37 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +public/sitemap*.xml \ No newline at end of file diff --git a/apps/formbricks-com/components/docs/DocsFeedback.tsx b/apps/formbricks-com-old/components/docs/DocsFeedback.tsx similarity index 100% rename from apps/formbricks-com/components/docs/DocsFeedback.tsx rename to apps/formbricks-com-old/components/docs/DocsFeedback.tsx diff --git a/apps/formbricks-com/components/docs/FeedbackButtonPopover.tsx b/apps/formbricks-com-old/components/docs/FeedbackButtonPopover.tsx similarity index 100% rename from apps/formbricks-com/components/docs/FeedbackButtonPopover.tsx rename to apps/formbricks-com-old/components/docs/FeedbackButtonPopover.tsx diff --git a/apps/formbricks-com/components/docs/Layout.tsx b/apps/formbricks-com-old/components/docs/Layout.tsx similarity index 100% rename from apps/formbricks-com/components/docs/Layout.tsx rename to apps/formbricks-com-old/components/docs/Layout.tsx diff --git a/apps/formbricks-com/components/docs/MobileNavigation.jsx b/apps/formbricks-com-old/components/docs/MobileNavigation.jsx similarity index 100% rename from apps/formbricks-com/components/docs/MobileNavigation.jsx rename to apps/formbricks-com-old/components/docs/MobileNavigation.jsx diff --git a/apps/formbricks-com/components/dummyUI/AddEventDummy.tsx b/apps/formbricks-com-old/components/dummyUI/AddEventDummy.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/AddEventDummy.tsx rename to apps/formbricks-com-old/components/dummyUI/AddEventDummy.tsx diff --git a/apps/formbricks-com/components/dummyUI/AddNoCodeEventModalDummy.tsx b/apps/formbricks-com-old/components/dummyUI/AddNoCodeEventModalDummy.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/AddNoCodeEventModalDummy.tsx rename to apps/formbricks-com-old/components/dummyUI/AddNoCodeEventModalDummy.tsx diff --git a/apps/formbricks-com/components/dummyUI/CTAQuestion.tsx b/apps/formbricks-com-old/components/dummyUI/CTAQuestion.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/CTAQuestion.tsx rename to apps/formbricks-com-old/components/dummyUI/CTAQuestion.tsx diff --git a/apps/formbricks-com/components/dummyUI/ContentWrapper.tsx b/apps/formbricks-com-old/components/dummyUI/ContentWrapper.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/ContentWrapper.tsx rename to apps/formbricks-com-old/components/dummyUI/ContentWrapper.tsx diff --git a/apps/formbricks-com/components/dummyUI/DemoPreview.tsx b/apps/formbricks-com-old/components/dummyUI/DemoPreview.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/DemoPreview.tsx rename to apps/formbricks-com-old/components/dummyUI/DemoPreview.tsx diff --git a/apps/formbricks-com/components/dummyUI/DemoView.tsx b/apps/formbricks-com-old/components/dummyUI/DemoView.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/DemoView.tsx rename to apps/formbricks-com-old/components/dummyUI/DemoView.tsx diff --git a/apps/formbricks-com/components/dummyUI/Headline.tsx b/apps/formbricks-com-old/components/dummyUI/Headline.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/Headline.tsx rename to apps/formbricks-com-old/components/dummyUI/Headline.tsx diff --git a/apps/formbricks-com/components/dummyUI/HtmlBody.tsx b/apps/formbricks-com-old/components/dummyUI/HtmlBody.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/HtmlBody.tsx rename to apps/formbricks-com-old/components/dummyUI/HtmlBody.tsx diff --git a/apps/formbricks-com/components/dummyUI/Modal.tsx b/apps/formbricks-com-old/components/dummyUI/Modal.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/Modal.tsx rename to apps/formbricks-com-old/components/dummyUI/Modal.tsx diff --git a/apps/formbricks-com/components/dummyUI/MultipleChoiceMultiQuestion.tsx b/apps/formbricks-com-old/components/dummyUI/MultipleChoiceMultiQuestion.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/MultipleChoiceMultiQuestion.tsx rename to apps/formbricks-com-old/components/dummyUI/MultipleChoiceMultiQuestion.tsx diff --git a/apps/formbricks-com/components/dummyUI/MultipleChoiceSingleQuestion.tsx b/apps/formbricks-com-old/components/dummyUI/MultipleChoiceSingleQuestion.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/MultipleChoiceSingleQuestion.tsx rename to apps/formbricks-com-old/components/dummyUI/MultipleChoiceSingleQuestion.tsx diff --git a/apps/formbricks-com/components/dummyUI/NPSQuestion.tsx b/apps/formbricks-com-old/components/dummyUI/NPSQuestion.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/NPSQuestion.tsx rename to apps/formbricks-com-old/components/dummyUI/NPSQuestion.tsx diff --git a/apps/formbricks-com/components/dummyUI/OpenTextQuestion.tsx b/apps/formbricks-com-old/components/dummyUI/OpenTextQuestion.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/OpenTextQuestion.tsx rename to apps/formbricks-com-old/components/dummyUI/OpenTextQuestion.tsx diff --git a/apps/formbricks-com/components/dummyUI/PreviewModal.tsx b/apps/formbricks-com-old/components/dummyUI/PreviewModal.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/PreviewModal.tsx rename to apps/formbricks-com-old/components/dummyUI/PreviewModal.tsx diff --git a/apps/formbricks-com/components/dummyUI/PreviewSurvey.tsx b/apps/formbricks-com-old/components/dummyUI/PreviewSurvey.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/PreviewSurvey.tsx rename to apps/formbricks-com-old/components/dummyUI/PreviewSurvey.tsx diff --git a/apps/formbricks-com/components/dummyUI/Progress.tsx b/apps/formbricks-com-old/components/dummyUI/Progress.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/Progress.tsx rename to apps/formbricks-com-old/components/dummyUI/Progress.tsx diff --git a/apps/formbricks-com/components/dummyUI/QuestionConditional.tsx b/apps/formbricks-com-old/components/dummyUI/QuestionConditional.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/QuestionConditional.tsx rename to apps/formbricks-com-old/components/dummyUI/QuestionConditional.tsx diff --git a/apps/formbricks-com/components/dummyUI/RatingQuestion.tsx b/apps/formbricks-com-old/components/dummyUI/RatingQuestion.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/RatingQuestion.tsx rename to apps/formbricks-com-old/components/dummyUI/RatingQuestion.tsx diff --git a/apps/formbricks-com/components/dummyUI/Subheader.tsx b/apps/formbricks-com-old/components/dummyUI/Subheader.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/Subheader.tsx rename to apps/formbricks-com-old/components/dummyUI/Subheader.tsx diff --git a/apps/formbricks-com/components/dummyUI/TemplateList.tsx b/apps/formbricks-com-old/components/dummyUI/TemplateList.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/TemplateList.tsx rename to apps/formbricks-com-old/components/dummyUI/TemplateList.tsx diff --git a/apps/formbricks-com/components/dummyUI/ThankYouCard.tsx b/apps/formbricks-com-old/components/dummyUI/ThankYouCard.tsx similarity index 100% rename from apps/formbricks-com/components/dummyUI/ThankYouCard.tsx rename to apps/formbricks-com-old/components/dummyUI/ThankYouCard.tsx diff --git a/apps/formbricks-com/components/dummyUI/templates.ts b/apps/formbricks-com-old/components/dummyUI/templates.ts similarity index 100% rename from apps/formbricks-com/components/dummyUI/templates.ts rename to apps/formbricks-com-old/components/dummyUI/templates.ts diff --git a/apps/formbricks-com/components/home/Features.tsx b/apps/formbricks-com-old/components/home/Features.tsx similarity index 100% rename from apps/formbricks-com/components/home/Features.tsx rename to apps/formbricks-com-old/components/home/Features.tsx diff --git a/apps/formbricks-com/components/home/GitHubSponsorship.tsx b/apps/formbricks-com-old/components/home/GitHubSponsorship.tsx similarity index 100% rename from apps/formbricks-com/components/home/GitHubSponsorship.tsx rename to apps/formbricks-com-old/components/home/GitHubSponsorship.tsx diff --git a/apps/formbricks-com/components/home/Hero.tsx b/apps/formbricks-com-old/components/home/Hero.tsx similarity index 100% rename from apps/formbricks-com/components/home/Hero.tsx rename to apps/formbricks-com-old/components/home/Hero.tsx diff --git a/apps/formbricks-com/components/home/HeroAnimation.tsx b/apps/formbricks-com-old/components/home/HeroAnimation.tsx similarity index 100% rename from apps/formbricks-com/components/home/HeroAnimation.tsx rename to apps/formbricks-com-old/components/home/HeroAnimation.tsx diff --git a/apps/formbricks-com/components/home/Highlights.tsx b/apps/formbricks-com-old/components/home/Highlights.tsx similarity index 100% rename from apps/formbricks-com/components/home/Highlights.tsx rename to apps/formbricks-com-old/components/home/Highlights.tsx diff --git a/apps/formbricks-com/components/home/SetupTabs.tsx b/apps/formbricks-com-old/components/home/SetupTabs.tsx similarity index 100% rename from apps/formbricks-com/components/home/SetupTabs.tsx rename to apps/formbricks-com-old/components/home/SetupTabs.tsx diff --git a/apps/formbricks-com/components/home/Steps.tsx b/apps/formbricks-com-old/components/home/Steps.tsx similarity index 100% rename from apps/formbricks-com/components/home/Steps.tsx rename to apps/formbricks-com-old/components/home/Steps.tsx diff --git a/apps/formbricks-com/components/home/VideoWalkThrough.tsx b/apps/formbricks-com-old/components/home/VideoWalkThrough.tsx similarity index 100% rename from apps/formbricks-com/components/home/VideoWalkThrough.tsx rename to apps/formbricks-com-old/components/home/VideoWalkThrough.tsx diff --git a/apps/formbricks-com/components/shared/APILayout.tsx b/apps/formbricks-com-old/components/shared/APILayout.tsx similarity index 100% rename from apps/formbricks-com/components/shared/APILayout.tsx rename to apps/formbricks-com-old/components/shared/APILayout.tsx diff --git a/apps/formbricks-com/components/shared/AuthorBox.tsx b/apps/formbricks-com-old/components/shared/AuthorBox.tsx similarity index 100% rename from apps/formbricks-com/components/shared/AuthorBox.tsx rename to apps/formbricks-com-old/components/shared/AuthorBox.tsx diff --git a/apps/formbricks-com/components/shared/BestPracticeNavigation.tsx b/apps/formbricks-com-old/components/shared/BestPracticeNavigation.tsx similarity index 100% rename from apps/formbricks-com/components/shared/BestPracticeNavigation.tsx rename to apps/formbricks-com-old/components/shared/BestPracticeNavigation.tsx diff --git a/apps/formbricks-com/components/shared/BestPractices.tsx b/apps/formbricks-com-old/components/shared/BestPractices.tsx similarity index 100% rename from apps/formbricks-com/components/shared/BestPractices.tsx rename to apps/formbricks-com-old/components/shared/BestPractices.tsx diff --git a/apps/formbricks-com/components/shared/BreakerCTA.tsx b/apps/formbricks-com-old/components/shared/BreakerCTA.tsx similarity index 100% rename from apps/formbricks-com/components/shared/BreakerCTA.tsx rename to apps/formbricks-com-old/components/shared/BreakerCTA.tsx diff --git a/apps/formbricks-com/components/shared/CTA.tsx b/apps/formbricks-com-old/components/shared/CTA.tsx similarity index 100% rename from apps/formbricks-com/components/shared/CTA.tsx rename to apps/formbricks-com-old/components/shared/CTA.tsx diff --git a/apps/formbricks-com/components/shared/Callout.tsx b/apps/formbricks-com-old/components/shared/Callout.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Callout.tsx rename to apps/formbricks-com-old/components/shared/Callout.tsx diff --git a/apps/formbricks-com/components/shared/Card.jsx b/apps/formbricks-com-old/components/shared/Card.jsx similarity index 100% rename from apps/formbricks-com/components/shared/Card.jsx rename to apps/formbricks-com-old/components/shared/Card.jsx diff --git a/apps/formbricks-com/components/shared/CodeBlock.tsx b/apps/formbricks-com-old/components/shared/CodeBlock.tsx similarity index 100% rename from apps/formbricks-com/components/shared/CodeBlock.tsx rename to apps/formbricks-com-old/components/shared/CodeBlock.tsx diff --git a/apps/formbricks-com/components/shared/EarlyBirdDeal.tsx b/apps/formbricks-com-old/components/shared/EarlyBirdDeal.tsx similarity index 100% rename from apps/formbricks-com/components/shared/EarlyBirdDeal.tsx rename to apps/formbricks-com-old/components/shared/EarlyBirdDeal.tsx diff --git a/apps/formbricks-com/components/shared/FeatureHighlight.tsx b/apps/formbricks-com-old/components/shared/FeatureHighlight.tsx similarity index 100% rename from apps/formbricks-com/components/shared/FeatureHighlight.tsx rename to apps/formbricks-com-old/components/shared/FeatureHighlight.tsx diff --git a/apps/formbricks-com/components/shared/Fence.jsx b/apps/formbricks-com-old/components/shared/Fence.jsx similarity index 100% rename from apps/formbricks-com/components/shared/Fence.jsx rename to apps/formbricks-com-old/components/shared/Fence.jsx diff --git a/apps/formbricks-com/components/shared/Footer.tsx b/apps/formbricks-com-old/components/shared/Footer.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Footer.tsx rename to apps/formbricks-com-old/components/shared/Footer.tsx diff --git a/apps/formbricks-com/components/shared/Header.tsx b/apps/formbricks-com-old/components/shared/Header.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Header.tsx rename to apps/formbricks-com-old/components/shared/Header.tsx diff --git a/apps/formbricks-com/components/shared/HeaderLight.tsx b/apps/formbricks-com-old/components/shared/HeaderLight.tsx similarity index 100% rename from apps/formbricks-com/components/shared/HeaderLight.tsx rename to apps/formbricks-com-old/components/shared/HeaderLight.tsx diff --git a/apps/formbricks-com/components/shared/HeadingCentered.tsx b/apps/formbricks-com-old/components/shared/HeadingCentered.tsx similarity index 100% rename from apps/formbricks-com/components/shared/HeadingCentered.tsx rename to apps/formbricks-com-old/components/shared/HeadingCentered.tsx diff --git a/apps/formbricks-com/components/shared/HeroAnimation.tsx b/apps/formbricks-com-old/components/shared/HeroAnimation.tsx similarity index 100% rename from apps/formbricks-com/components/shared/HeroAnimation.tsx rename to apps/formbricks-com-old/components/shared/HeroAnimation.tsx diff --git a/apps/formbricks-com/components/shared/HeroTitle.tsx b/apps/formbricks-com-old/components/shared/HeroTitle.tsx similarity index 100% rename from apps/formbricks-com/components/shared/HeroTitle.tsx rename to apps/formbricks-com-old/components/shared/HeroTitle.tsx diff --git a/apps/formbricks-com/components/shared/Icon.jsx b/apps/formbricks-com-old/components/shared/Icon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/Icon.jsx rename to apps/formbricks-com-old/components/shared/Icon.jsx diff --git a/apps/formbricks-com/components/shared/Layout.tsx b/apps/formbricks-com-old/components/shared/Layout.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Layout.tsx rename to apps/formbricks-com-old/components/shared/Layout.tsx diff --git a/apps/formbricks-com/components/shared/LayoutLight.tsx b/apps/formbricks-com-old/components/shared/LayoutLight.tsx similarity index 100% rename from apps/formbricks-com/components/shared/LayoutLight.tsx rename to apps/formbricks-com-old/components/shared/LayoutLight.tsx diff --git a/apps/formbricks-com/components/shared/LayoutMdx.tsx b/apps/formbricks-com-old/components/shared/LayoutMdx.tsx similarity index 100% rename from apps/formbricks-com/components/shared/LayoutMdx.tsx rename to apps/formbricks-com-old/components/shared/LayoutMdx.tsx diff --git a/apps/formbricks-com/components/shared/Logo.tsx b/apps/formbricks-com-old/components/shared/Logo.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Logo.tsx rename to apps/formbricks-com-old/components/shared/Logo.tsx diff --git a/apps/formbricks-com/components/shared/MdxCTA.tsx b/apps/formbricks-com-old/components/shared/MdxCTA.tsx similarity index 100% rename from apps/formbricks-com/components/shared/MdxCTA.tsx rename to apps/formbricks-com-old/components/shared/MdxCTA.tsx diff --git a/apps/formbricks-com/components/shared/MdxTryItCTA.tsx b/apps/formbricks-com-old/components/shared/MdxTryItCTA.tsx similarity index 100% rename from apps/formbricks-com/components/shared/MdxTryItCTA.tsx rename to apps/formbricks-com-old/components/shared/MdxTryItCTA.tsx diff --git a/apps/formbricks-com/components/shared/MetaInformation.tsx b/apps/formbricks-com-old/components/shared/MetaInformation.tsx similarity index 100% rename from apps/formbricks-com/components/shared/MetaInformation.tsx rename to apps/formbricks-com-old/components/shared/MetaInformation.tsx diff --git a/apps/formbricks-com/components/shared/MobileNavigation.jsx b/apps/formbricks-com-old/components/shared/MobileNavigation.jsx similarity index 100% rename from apps/formbricks-com/components/shared/MobileNavigation.jsx rename to apps/formbricks-com-old/components/shared/MobileNavigation.jsx diff --git a/apps/formbricks-com/components/shared/Modal.tsx b/apps/formbricks-com-old/components/shared/Modal.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Modal.tsx rename to apps/formbricks-com-old/components/shared/Modal.tsx diff --git a/apps/formbricks-com/components/shared/Navigation.tsx b/apps/formbricks-com-old/components/shared/Navigation.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Navigation.tsx rename to apps/formbricks-com-old/components/shared/Navigation.tsx diff --git a/apps/formbricks-com/components/shared/NewsletterSignup.tsx b/apps/formbricks-com-old/components/shared/NewsletterSignup.tsx similarity index 100% rename from apps/formbricks-com/components/shared/NewsletterSignup.tsx rename to apps/formbricks-com-old/components/shared/NewsletterSignup.tsx diff --git a/apps/formbricks-com/components/shared/Pricing.tsx b/apps/formbricks-com-old/components/shared/Pricing.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Pricing.tsx rename to apps/formbricks-com-old/components/shared/Pricing.tsx diff --git a/apps/formbricks-com/components/shared/Prose.jsx b/apps/formbricks-com-old/components/shared/Prose.jsx similarity index 100% rename from apps/formbricks-com/components/shared/Prose.jsx rename to apps/formbricks-com-old/components/shared/Prose.jsx diff --git a/apps/formbricks-com/components/shared/Search.tsx b/apps/formbricks-com-old/components/shared/Search.tsx similarity index 100% rename from apps/formbricks-com/components/shared/Search.tsx rename to apps/formbricks-com-old/components/shared/Search.tsx diff --git a/apps/formbricks-com/components/shared/ThemeSelector.jsx b/apps/formbricks-com-old/components/shared/ThemeSelector.jsx similarity index 100% rename from apps/formbricks-com/components/shared/ThemeSelector.jsx rename to apps/formbricks-com-old/components/shared/ThemeSelector.jsx diff --git a/apps/formbricks-com/components/shared/TryItCTA.tsx b/apps/formbricks-com-old/components/shared/TryItCTA.tsx similarity index 100% rename from apps/formbricks-com/components/shared/TryItCTA.tsx rename to apps/formbricks-com-old/components/shared/TryItCTA.tsx diff --git a/apps/formbricks-com/components/shared/UseCaseCTA.tsx b/apps/formbricks-com-old/components/shared/UseCaseCTA.tsx similarity index 100% rename from apps/formbricks-com/components/shared/UseCaseCTA.tsx rename to apps/formbricks-com-old/components/shared/UseCaseCTA.tsx diff --git a/apps/formbricks-com/components/shared/UseCaseHeader.tsx b/apps/formbricks-com-old/components/shared/UseCaseHeader.tsx similarity index 100% rename from apps/formbricks-com/components/shared/UseCaseHeader.tsx rename to apps/formbricks-com-old/components/shared/UseCaseHeader.tsx diff --git a/apps/formbricks-com/components/shared/WhyFormbricks.tsx b/apps/formbricks-com-old/components/shared/WhyFormbricks.tsx similarity index 100% rename from apps/formbricks-com/components/shared/WhyFormbricks.tsx rename to apps/formbricks-com-old/components/shared/WhyFormbricks.tsx diff --git a/apps/formbricks-com/components/shared/icons/InstallationIcon.jsx b/apps/formbricks-com-old/components/shared/icons/InstallationIcon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/icons/InstallationIcon.jsx rename to apps/formbricks-com-old/components/shared/icons/InstallationIcon.jsx diff --git a/apps/formbricks-com/components/shared/icons/LightbulbIcon.jsx b/apps/formbricks-com-old/components/shared/icons/LightbulbIcon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/icons/LightbulbIcon.jsx rename to apps/formbricks-com-old/components/shared/icons/LightbulbIcon.jsx diff --git a/apps/formbricks-com/components/shared/icons/PluginsIcon.jsx b/apps/formbricks-com-old/components/shared/icons/PluginsIcon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/icons/PluginsIcon.jsx rename to apps/formbricks-com-old/components/shared/icons/PluginsIcon.jsx diff --git a/apps/formbricks-com/components/shared/icons/PresetsIcon.jsx b/apps/formbricks-com-old/components/shared/icons/PresetsIcon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/icons/PresetsIcon.jsx rename to apps/formbricks-com-old/components/shared/icons/PresetsIcon.jsx diff --git a/apps/formbricks-com/components/shared/icons/ThemingIcon.jsx b/apps/formbricks-com-old/components/shared/icons/ThemingIcon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/icons/ThemingIcon.jsx rename to apps/formbricks-com-old/components/shared/icons/ThemingIcon.jsx diff --git a/apps/formbricks-com/components/shared/icons/WarningIcon.jsx b/apps/formbricks-com-old/components/shared/icons/WarningIcon.jsx similarity index 100% rename from apps/formbricks-com/components/shared/icons/WarningIcon.jsx rename to apps/formbricks-com-old/components/shared/icons/WarningIcon.jsx diff --git a/apps/formbricks-com/images/SEO/Best React Form Library and Builder 2023 to create and build forms surveys easy and fast.png b/apps/formbricks-com-old/images/SEO/Best React Form Library and Builder 2023 to create and build forms surveys easy and fast.png similarity index 100% rename from apps/formbricks-com/images/SEO/Best React Form Library and Builder 2023 to create and build forms surveys easy and fast.png rename to apps/formbricks-com-old/images/SEO/Best React Form Library and Builder 2023 to create and build forms surveys easy and fast.png diff --git a/apps/formbricks-com/images/SEO/Data Controller vs Data Processor Overview for open source forms and surveys.png b/apps/formbricks-com-old/images/SEO/Data Controller vs Data Processor Overview for open source forms and surveys.png similarity index 100% rename from apps/formbricks-com/images/SEO/Data Controller vs Data Processor Overview for open source forms and surveys.png rename to apps/formbricks-com-old/images/SEO/Data Controller vs Data Processor Overview for open source forms and surveys.png diff --git a/apps/formbricks-com/images/SEO/Formbricks React Form Library vs React Hook Form comparison post to build forms fast in reactjs smaller.png b/apps/formbricks-com-old/images/SEO/Formbricks React Form Library vs React Hook Form comparison post to build forms fast in reactjs smaller.png similarity index 100% rename from apps/formbricks-com/images/SEO/Formbricks React Form Library vs React Hook Form comparison post to build forms fast in reactjs smaller.png rename to apps/formbricks-com-old/images/SEO/Formbricks React Form Library vs React Hook Form comparison post to build forms fast in reactjs smaller.png diff --git a/apps/formbricks-com/images/SEO/Formspree open source alternative vs Formbricks FormHQ comparison post for form backend as a service.png b/apps/formbricks-com-old/images/SEO/Formspree open source alternative vs Formbricks FormHQ comparison post for form backend as a service.png similarity index 100% rename from apps/formbricks-com/images/SEO/Formspree open source alternative vs Formbricks FormHQ comparison post for form backend as a service.png rename to apps/formbricks-com-old/images/SEO/Formspree open source alternative vs Formbricks FormHQ comparison post for form backend as a service.png diff --git a/apps/formbricks-com/images/SEO/Google Form Example Customize and make it comply with GDPR CCPA HIPAA open source alternative.png b/apps/formbricks-com-old/images/SEO/Google Form Example Customize and make it comply with GDPR CCPA HIPAA open source alternative.png similarity index 100% rename from apps/formbricks-com/images/SEO/Google Form Example Customize and make it comply with GDPR CCPA HIPAA open source alternative.png rename to apps/formbricks-com-old/images/SEO/Google Form Example Customize and make it comply with GDPR CCPA HIPAA open source alternative.png diff --git a/apps/formbricks-com/images/SEO/Google Forms Open Source Alternative Comparison with Formbricks Open-source Online Form Builder.png b/apps/formbricks-com-old/images/SEO/Google Forms Open Source Alternative Comparison with Formbricks Open-source Online Form Builder.png similarity index 100% rename from apps/formbricks-com/images/SEO/Google Forms Open Source Alternative Comparison with Formbricks Open-source Online Form Builder.png rename to apps/formbricks-com-old/images/SEO/Google Forms Open Source Alternative Comparison with Formbricks Open-source Online Form Builder.png diff --git a/apps/formbricks-com/images/SEO/GoogleForms GDPR compliant for EU company open source self-hosting alternative.png b/apps/formbricks-com-old/images/SEO/GoogleForms GDPR compliant for EU company open source self-hosting alternative.png similarity index 100% rename from apps/formbricks-com/images/SEO/GoogleForms GDPR compliant for EU company open source self-hosting alternative.png rename to apps/formbricks-com-old/images/SEO/GoogleForms GDPR compliant for EU company open source self-hosting alternative.png diff --git a/apps/formbricks-com/images/SEO/OhMyForm Typeform Alternative comparison Formbricks open source forms and survey library builder.png b/apps/formbricks-com-old/images/SEO/OhMyForm Typeform Alternative comparison Formbricks open source forms and survey library builder.png similarity index 100% rename from apps/formbricks-com/images/SEO/OhMyForm Typeform Alternative comparison Formbricks open source forms and survey library builder.png rename to apps/formbricks-com-old/images/SEO/OhMyForm Typeform Alternative comparison Formbricks open source forms and survey library builder.png diff --git a/apps/formbricks-com/images/SEO/Stars - best open source react survey builder 2023 comparison of github repository stars for form builder library.png b/apps/formbricks-com-old/images/SEO/Stars - best open source react survey builder 2023 comparison of github repository stars for form builder library.png similarity index 100% rename from apps/formbricks-com/images/SEO/Stars - best open source react survey builder 2023 comparison of github repository stars for form builder library.png rename to apps/formbricks-com-old/images/SEO/Stars - best open source react survey builder 2023 comparison of github repository stars for form builder library.png diff --git a/apps/formbricks-com/images/SEO/Winner comparison best React survey Library and Builder 2023 2022.png b/apps/formbricks-com-old/images/SEO/Winner comparison best React survey Library and Builder 2023 2022.png similarity index 100% rename from apps/formbricks-com/images/SEO/Winner comparison best React survey Library and Builder 2023 2022.png rename to apps/formbricks-com-old/images/SEO/Winner comparison best React survey Library and Builder 2023 2022.png diff --git a/apps/formbricks-com/images/SEO/example-lemonade-radio-field-with-image-in-react-library-Oopen-source.png b/apps/formbricks-com-old/images/SEO/example-lemonade-radio-field-with-image-in-react-library-Oopen-source.png similarity index 100% rename from apps/formbricks-com/images/SEO/example-lemonade-radio-field-with-image-in-react-library-Oopen-source.png rename to apps/formbricks-com-old/images/SEO/example-lemonade-radio-field-with-image-in-react-library-Oopen-source.png diff --git a/apps/formbricks-com/images/SEO/who gets the crown of open source forms.gif b/apps/formbricks-com-old/images/SEO/who gets the crown of open source forms.gif similarity index 100% rename from apps/formbricks-com/images/SEO/who gets the crown of open source forms.gif rename to apps/formbricks-com-old/images/SEO/who gets the crown of open source forms.gif diff --git a/apps/formbricks-com/images/ask-nothing-twice.png b/apps/formbricks-com-old/images/ask-nothing-twice.png similarity index 100% rename from apps/formbricks-com/images/ask-nothing-twice.png rename to apps/formbricks-com-old/images/ask-nothing-twice.png diff --git a/apps/formbricks-com/images/attributes-dark.png b/apps/formbricks-com-old/images/attributes-dark.png similarity index 100% rename from apps/formbricks-com/images/attributes-dark.png rename to apps/formbricks-com-old/images/attributes-dark.png diff --git a/apps/formbricks-com/images/attributes-dark.svg b/apps/formbricks-com-old/images/attributes-dark.svg similarity index 100% rename from apps/formbricks-com/images/attributes-dark.svg rename to apps/formbricks-com-old/images/attributes-dark.svg diff --git a/apps/formbricks-com/images/attributes-light.png b/apps/formbricks-com-old/images/attributes-light.png similarity index 100% rename from apps/formbricks-com/images/attributes-light.png rename to apps/formbricks-com-old/images/attributes-light.png diff --git a/apps/formbricks-com/images/attributes-light.svg b/apps/formbricks-com-old/images/attributes-light.svg similarity index 100% rename from apps/formbricks-com/images/attributes-light.svg rename to apps/formbricks-com-old/images/attributes-light.svg diff --git a/apps/formbricks-com/images/blog/johannes-co-founder-formbricks-small.jpg b/apps/formbricks-com-old/images/blog/johannes-co-founder-formbricks-small.jpg similarity index 100% rename from apps/formbricks-com/images/blog/johannes-co-founder-formbricks-small.jpg rename to apps/formbricks-com-old/images/blog/johannes-co-founder-formbricks-small.jpg diff --git a/apps/formbricks-com/images/blur-cyan.png b/apps/formbricks-com-old/images/blur-cyan.png similarity index 100% rename from apps/formbricks-com/images/blur-cyan.png rename to apps/formbricks-com-old/images/blur-cyan.png diff --git a/apps/formbricks-com/images/blur-indigo.png b/apps/formbricks-com-old/images/blur-indigo.png similarity index 100% rename from apps/formbricks-com/images/blur-indigo.png rename to apps/formbricks-com-old/images/blur-indigo.png diff --git a/apps/formbricks-com/images/clients/cal-logo-dark.svg b/apps/formbricks-com-old/images/clients/cal-logo-dark.svg similarity index 100% rename from apps/formbricks-com/images/clients/cal-logo-dark.svg rename to apps/formbricks-com-old/images/clients/cal-logo-dark.svg diff --git a/apps/formbricks-com/images/clients/cal-logo-light.svg b/apps/formbricks-com-old/images/clients/cal-logo-light.svg similarity index 100% rename from apps/formbricks-com/images/clients/cal-logo-light.svg rename to apps/formbricks-com-old/images/clients/cal-logo-light.svg diff --git a/apps/formbricks-com/images/clients/clovyr-logo.svg b/apps/formbricks-com-old/images/clients/clovyr-logo.svg similarity index 100% rename from apps/formbricks-com/images/clients/clovyr-logo.svg rename to apps/formbricks-com-old/images/clients/clovyr-logo.svg diff --git a/apps/formbricks-com/images/clients/crowd-logo-dark.svg b/apps/formbricks-com-old/images/clients/crowd-logo-dark.svg similarity index 100% rename from apps/formbricks-com/images/clients/crowd-logo-dark.svg rename to apps/formbricks-com-old/images/clients/crowd-logo-dark.svg diff --git a/apps/formbricks-com/images/clients/crowd-logo-light.svg b/apps/formbricks-com-old/images/clients/crowd-logo-light.svg similarity index 100% rename from apps/formbricks-com/images/clients/crowd-logo-light.svg rename to apps/formbricks-com-old/images/clients/crowd-logo-light.svg diff --git a/apps/formbricks-com/images/clients/niLogoDark.svg b/apps/formbricks-com-old/images/clients/niLogoDark.svg similarity index 100% rename from apps/formbricks-com/images/clients/niLogoDark.svg rename to apps/formbricks-com-old/images/clients/niLogoDark.svg diff --git a/apps/formbricks-com/images/clients/niLogoWhite.svg b/apps/formbricks-com-old/images/clients/niLogoWhite.svg similarity index 100% rename from apps/formbricks-com/images/clients/niLogoWhite.svg rename to apps/formbricks-com-old/images/clients/niLogoWhite.svg diff --git a/apps/formbricks-com/images/connect-analytics.png b/apps/formbricks-com-old/images/connect-analytics.png similarity index 100% rename from apps/formbricks-com/images/connect-analytics.png rename to apps/formbricks-com-old/images/connect-analytics.png diff --git a/apps/formbricks-com/images/core-api.svg b/apps/formbricks-com-old/images/core-api.svg similarity index 100% rename from apps/formbricks-com/images/core-api.svg rename to apps/formbricks-com-old/images/core-api.svg diff --git a/apps/formbricks-com/images/dark-connect-analytics.png b/apps/formbricks-com-old/images/dark-connect-analytics.png similarity index 100% rename from apps/formbricks-com/images/dark-connect-analytics.png rename to apps/formbricks-com-old/images/dark-connect-analytics.png diff --git a/apps/formbricks-com/images/dark-insights.png b/apps/formbricks-com-old/images/dark-insights.png similarity index 100% rename from apps/formbricks-com/images/dark-insights.png rename to apps/formbricks-com-old/images/dark-insights.png diff --git a/apps/formbricks-com/images/dashboard-mockup-dark.png b/apps/formbricks-com-old/images/dashboard-mockup-dark.png similarity index 100% rename from apps/formbricks-com/images/dashboard-mockup-dark.png rename to apps/formbricks-com-old/images/dashboard-mockup-dark.png diff --git a/apps/formbricks-com/images/dashboard-mockup.png b/apps/formbricks-com-old/images/dashboard-mockup.png similarity index 100% rename from apps/formbricks-com/images/dashboard-mockup.png rename to apps/formbricks-com-old/images/dashboard-mockup.png diff --git a/apps/formbricks-com/images/data-pipelines.png b/apps/formbricks-com-old/images/data-pipelines.png similarity index 100% rename from apps/formbricks-com/images/data-pipelines.png rename to apps/formbricks-com-old/images/data-pipelines.png diff --git a/apps/formbricks-com/images/docs/copy-id.png b/apps/formbricks-com-old/images/docs/copy-id.png similarity index 100% rename from apps/formbricks-com/images/docs/copy-id.png rename to apps/formbricks-com-old/images/docs/copy-id.png diff --git a/apps/formbricks-com/images/docs/create-feedback-box.png b/apps/formbricks-com-old/images/docs/create-feedback-box.png similarity index 100% rename from apps/formbricks-com/images/docs/create-feedback-box.png rename to apps/formbricks-com-old/images/docs/create-feedback-box.png diff --git a/apps/formbricks-com/images/docs/fb-id.png b/apps/formbricks-com-old/images/docs/fb-id.png similarity index 100% rename from apps/formbricks-com/images/docs/fb-id.png rename to apps/formbricks-com-old/images/docs/fb-id.png diff --git a/apps/formbricks-com/images/docs/new-pmf.png b/apps/formbricks-com-old/images/docs/new-pmf.png similarity index 100% rename from apps/formbricks-com/images/docs/new-pmf.png rename to apps/formbricks-com-old/images/docs/new-pmf.png diff --git a/apps/formbricks-com/images/early bird deal for open source jotform alternative typeform and surveymonkey_v2.svg b/apps/formbricks-com-old/images/early bird deal for open source jotform alternative typeform and surveymonkey_v2.svg similarity index 100% rename from apps/formbricks-com/images/early bird deal for open source jotform alternative typeform and surveymonkey_v2.svg rename to apps/formbricks-com-old/images/early bird deal for open source jotform alternative typeform and surveymonkey_v2.svg diff --git a/apps/formbricks-com/images/email.svg b/apps/formbricks-com-old/images/email.svg similarity index 100% rename from apps/formbricks-com/images/email.svg rename to apps/formbricks-com-old/images/email.svg diff --git a/apps/formbricks-com/images/event-trigger-dark.png b/apps/formbricks-com-old/images/event-trigger-dark.png similarity index 100% rename from apps/formbricks-com/images/event-trigger-dark.png rename to apps/formbricks-com-old/images/event-trigger-dark.png diff --git a/apps/formbricks-com/images/event-trigger-dark.svg b/apps/formbricks-com-old/images/event-trigger-dark.svg similarity index 100% rename from apps/formbricks-com/images/event-trigger-dark.svg rename to apps/formbricks-com-old/images/event-trigger-dark.svg diff --git a/apps/formbricks-com/images/event-trigger-light.png b/apps/formbricks-com-old/images/event-trigger-light.png similarity index 100% rename from apps/formbricks-com/images/event-trigger-light.png rename to apps/formbricks-com-old/images/event-trigger-light.png diff --git a/apps/formbricks-com/images/event-trigger-light.svg b/apps/formbricks-com-old/images/event-trigger-light.svg similarity index 100% rename from apps/formbricks-com/images/event-trigger-light.svg rename to apps/formbricks-com-old/images/event-trigger-light.svg diff --git a/apps/formbricks-com/images/form-hq.png b/apps/formbricks-com-old/images/form-hq.png similarity index 100% rename from apps/formbricks-com/images/form-hq.png rename to apps/formbricks-com-old/images/form-hq.png diff --git a/apps/formbricks-com/images/github-mark-white.svg b/apps/formbricks-com-old/images/github-mark-white.svg similarity index 100% rename from apps/formbricks-com/images/github-mark-white.svg rename to apps/formbricks-com-old/images/github-mark-white.svg diff --git a/apps/formbricks-com/images/github-mark.svg b/apps/formbricks-com-old/images/github-mark.svg similarity index 100% rename from apps/formbricks-com/images/github-mark.svg rename to apps/formbricks-com-old/images/github-mark.svg diff --git a/apps/formbricks-com/images/insights.png b/apps/formbricks-com-old/images/insights.png similarity index 100% rename from apps/formbricks-com/images/insights.png rename to apps/formbricks-com-old/images/insights.png diff --git a/apps/formbricks-com/images/logo/footerlogo-dark.svg b/apps/formbricks-com-old/images/logo/footerlogo-dark.svg similarity index 100% rename from apps/formbricks-com/images/logo/footerlogo-dark.svg rename to apps/formbricks-com-old/images/logo/footerlogo-dark.svg diff --git a/apps/formbricks-com/images/logo/footerlogo.svg b/apps/formbricks-com-old/images/logo/footerlogo.svg similarity index 100% rename from apps/formbricks-com/images/logo/footerlogo.svg rename to apps/formbricks-com-old/images/logo/footerlogo.svg diff --git a/apps/formbricks-com/images/logo/logo.svg b/apps/formbricks-com-old/images/logo/logo.svg similarity index 100% rename from apps/formbricks-com/images/logo/logo.svg rename to apps/formbricks-com-old/images/logo/logo.svg diff --git a/apps/formbricks-com/images/logo/logo_dark.svg b/apps/formbricks-com-old/images/logo/logo_dark.svg similarity index 100% rename from apps/formbricks-com/images/logo/logo_dark.svg rename to apps/formbricks-com-old/images/logo/logo_dark.svg diff --git a/apps/formbricks-com/images/logo/logomark.svg b/apps/formbricks-com-old/images/logo/logomark.svg similarity index 100% rename from apps/formbricks-com/images/logo/logomark.svg rename to apps/formbricks-com-old/images/logo/logomark.svg diff --git a/apps/formbricks-com/images/newsletter-signup-gif.gif b/apps/formbricks-com-old/images/newsletter-signup-gif.gif similarity index 100% rename from apps/formbricks-com/images/newsletter-signup-gif.gif rename to apps/formbricks-com-old/images/newsletter-signup-gif.gif diff --git a/apps/formbricks-com/images/pipelines-dark.png b/apps/formbricks-com-old/images/pipelines-dark.png similarity index 100% rename from apps/formbricks-com/images/pipelines-dark.png rename to apps/formbricks-com-old/images/pipelines-dark.png diff --git a/apps/formbricks-com/images/pipelines.png b/apps/formbricks-com-old/images/pipelines.png similarity index 100% rename from apps/formbricks-com/images/pipelines.png rename to apps/formbricks-com-old/images/pipelines.png diff --git a/apps/formbricks-com/images/pre-segmentation-dark.png b/apps/formbricks-com-old/images/pre-segmentation-dark.png similarity index 100% rename from apps/formbricks-com/images/pre-segmentation-dark.png rename to apps/formbricks-com-old/images/pre-segmentation-dark.png diff --git a/apps/formbricks-com/images/pre-segmentation.png b/apps/formbricks-com-old/images/pre-segmentation.png similarity index 100% rename from apps/formbricks-com/images/pre-segmentation.png rename to apps/formbricks-com-old/images/pre-segmentation.png diff --git a/apps/formbricks-com/images/pre-segmentation.svg b/apps/formbricks-com-old/images/pre-segmentation.svg similarity index 100% rename from apps/formbricks-com/images/pre-segmentation.svg rename to apps/formbricks-com-old/images/pre-segmentation.svg diff --git a/apps/formbricks-com/images/react-lib.png b/apps/formbricks-com-old/images/react-lib.png similarity index 100% rename from apps/formbricks-com/images/react-lib.png rename to apps/formbricks-com-old/images/react-lib.png diff --git a/apps/formbricks-com/images/schema-generation-svg.svg b/apps/formbricks-com-old/images/schema-generation-svg.svg similarity index 100% rename from apps/formbricks-com/images/schema-generation-svg.svg rename to apps/formbricks-com-old/images/schema-generation-svg.svg diff --git a/apps/formbricks-com/images/schema-generation.png b/apps/formbricks-com-old/images/schema-generation.png similarity index 100% rename from apps/formbricks-com/images/schema-generation.png rename to apps/formbricks-com-old/images/schema-generation.png diff --git a/apps/formbricks-com/images/webhook-png.png b/apps/formbricks-com-old/images/webhook-png.png similarity index 100% rename from apps/formbricks-com/images/webhook-png.png rename to apps/formbricks-com-old/images/webhook-png.png diff --git a/apps/formbricks-com/lib/articles.ts b/apps/formbricks-com-old/lib/articles.ts similarity index 100% rename from apps/formbricks-com/lib/articles.ts rename to apps/formbricks-com-old/lib/articles.ts diff --git a/apps/formbricks-com/lib/cleanHtml.ts b/apps/formbricks-com-old/lib/cleanHtml.ts similarity index 100% rename from apps/formbricks-com/lib/cleanHtml.ts rename to apps/formbricks-com-old/lib/cleanHtml.ts diff --git a/apps/formbricks-com/lib/docsNavigation.ts b/apps/formbricks-com-old/lib/docsNavigation.ts similarity index 100% rename from apps/formbricks-com/lib/docsNavigation.ts rename to apps/formbricks-com-old/lib/docsNavigation.ts diff --git a/apps/formbricks-com/lib/handleFeedbackSubmit.ts b/apps/formbricks-com-old/lib/handleFeedbackSubmit.ts similarity index 100% rename from apps/formbricks-com/lib/handleFeedbackSubmit.ts rename to apps/formbricks-com-old/lib/handleFeedbackSubmit.ts diff --git a/apps/formbricks-com/lib/utils.ts b/apps/formbricks-com-old/lib/utils.ts similarity index 100% rename from apps/formbricks-com/lib/utils.ts rename to apps/formbricks-com-old/lib/utils.ts diff --git a/apps/formbricks-com/next-sitemap.config.js b/apps/formbricks-com-old/next-sitemap.config.js similarity index 100% rename from apps/formbricks-com/next-sitemap.config.js rename to apps/formbricks-com-old/next-sitemap.config.js diff --git a/apps/formbricks-com-old/next.config.mjs b/apps/formbricks-com-old/next.config.mjs new file mode 100644 index 0000000000..339e699170 --- /dev/null +++ b/apps/formbricks-com-old/next.config.mjs @@ -0,0 +1,130 @@ +/** @type {import('next').NextConfig} */ + +import rehypePrism from "@mapbox/rehype-prism"; +import nextMDX from "@next/mdx"; +import { withPlausibleProxy } from "next-plausible"; +import remarkGfm from "remark-gfm"; + +const nextConfig = { + reactStrictMode: true, + pageExtensions: ["ts", "tsx", "js", "jsx", "md", "mdx"], + transpilePackages: ["@formbricks/ui", "@formbricks/lib"], + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "seo-strapi-aws-s3.s3.eu-central-1.amazonaws.com", + port: "", + }, + ], + }, + async redirects() { + return [ + { + source: "/discord", + destination: "https://discord.gg/3YFcABF2Ts", + permanent: true, + }, + { + source: "/roadmap", + destination: "https://github.com/orgs/formbricks/projects/1", + permanent: true, + }, + { + source: "/github", + destination: "https://github.com/formbricks/formbricks", + permanent: true, + }, + { + source: "/deal", + destination: "/concierge", + permanent: false, + }, + { + source: "/privacy", + destination: "/privacy-policy", + permanent: true, + }, + { + source: "/form-hq", + destination: "/", + permanent: true, + }, + { + source: "/docs", + destination: "/docs/introduction/what-is-formbricks", + permanent: true, + }, + { + source: "/docs/getting-started/nextjs", + destination: "/docs/getting-started/nextjs-app", + permanent: true, + }, + { + source: "/docs/formbricks-hq/self-hosting", + destination: "/docs", + permanent: true, + }, + { + source: "/docs/react-form-library/getting-started", + destination: "/docs", + permanent: true, + }, + { + source: "/docs/react-form-library/work-with-components", + destination: "/docs", + permanent: true, + }, + { + source: "/docs/react-form-library/introduction", + destination: "/docs", + permanent: true, + }, + { + source: "/docs/formbricks-hq/schema", + destination: "/docs", + permanent: true, + }, + { + source: "/docs/events/why", + destination: "/docs/actions/why", + permanent: true, + }, + { + source: "/docs/events/code", + destination: "/docs/actions/code", + permanent: true, + }, + { + source: "/docs/events/code", + destination: "/docs/actions/code", + permanent: true, + }, + { + source: "/pmf", + destination: "/", + permanent: true, + }, + { + source: "/blog/v1-and-how-we-got-here", + destination: "/blog/experience-management-open-source", + permanent: true, + }, + ]; + }, +}; + +const withMDX = nextMDX({ + extension: /\.mdx?$/, + options: { + // If you use remark-gfm, you'll need to use next.config.mjs + // as the package is ESM only + // https://github.com/remarkjs/remark-gfm#install + remarkPlugins: [remarkGfm], + rehypePlugins: [rehypePrism], + // If you use `MDXProvider`, uncomment the following line. + // providerImportSource: "@mdx-js/react", + }, +}); + +export default withPlausibleProxy({ customDomain: "https://plausible.formbricks.com" })(withMDX(nextConfig)); diff --git a/apps/formbricks-com-old/package.json b/apps/formbricks-com-old/package.json new file mode 100644 index 0000000000..141bab3efa --- /dev/null +++ b/apps/formbricks-com-old/package.json @@ -0,0 +1,48 @@ +{ + "name": "@formbricks/formbricks-com-old", + "version": "0.1.0", + "private": true, + "scripts": { + "clean": "rimraf .turbo node_modules .next", + "dev": "next dev -p 3002", + "build": "next build", + "postbuild": "next-sitemap", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@calcom/embed-react": "^1.3.0", + "@docsearch/react": "^3.5.1", + "@formbricks/lib": "workspace:*", + "@formbricks/types": "workspace:*", + "@formbricks/ui": "workspace:*", + "@headlessui/react": "^1.7.16", + "@heroicons/react": "^2.0.18", + "@mapbox/rehype-prism": "^0.8.0", + "@mdx-js/loader": "^2.3.0", + "@mdx-js/react": "^2.3.0", + "@next/mdx": "^13.4.12", + "@paralleldrive/cuid2": "^2.2.1", + "clsx": "^2.0.0", + "lottie-web": "^5.12.2", + "next": "13.4.12", + "next-plausible": "^3.10.1", + "next-seo": "^6.1.0", + "next-sitemap": "^4.1.8", + "node-fetch": "^3.3.2", + "prism-react-renderer": "^2.0.6", + "prismjs": "^1.29.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-icons": "^4.10.1", + "react-markdown": "^8.0.7", + "react-responsive-embed": "^2.1.0", + "remark-gfm": "^3.0.1", + "sharp": "^0.32.4" + }, + "devDependencies": { + "@formbricks/tsconfig": "workspace:*", + "@types/prismjs": "^1.26.0", + "eslint-config-formbricks": "workspace:*" + } +} diff --git a/apps/formbricks-com/pages/404.tsx b/apps/formbricks-com-old/pages/404.tsx similarity index 100% rename from apps/formbricks-com/pages/404.tsx rename to apps/formbricks-com-old/pages/404.tsx diff --git a/apps/formbricks-com/pages/_app.tsx b/apps/formbricks-com-old/pages/_app.tsx similarity index 100% rename from apps/formbricks-com/pages/_app.tsx rename to apps/formbricks-com-old/pages/_app.tsx diff --git a/apps/formbricks-com/pages/_document.tsx b/apps/formbricks-com-old/pages/_document.tsx similarity index 100% rename from apps/formbricks-com/pages/_document.tsx rename to apps/formbricks-com-old/pages/_document.tsx diff --git a/apps/formbricks-com/pages/api/oss-friends/index.ts b/apps/formbricks-com-old/pages/api/oss-friends/index.ts similarity index 100% rename from apps/formbricks-com/pages/api/oss-friends/index.ts rename to apps/formbricks-com-old/pages/api/oss-friends/index.ts diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/2023-title-best-open-source-survey-software-tools-and-alternatives.png b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/2023-title-best-open-source-survey-software-tools-and-alternatives.png similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/2023-title-best-open-source-survey-software-tools-and-alternatives.png rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/2023-title-best-open-source-survey-software-tools-and-alternatives.png diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/free-survey-tool-limesurvey-open-source-software-opensource.png b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/free-survey-tool-limesurvey-open-source-software-opensource.png similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/free-survey-tool-limesurvey-open-source-software-opensource.png rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/free-survey-tool-limesurvey-open-source-software-opensource.png diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/index.mdx b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/index.mdx rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/index.mdx diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/open-source-survey-software-free-2023-formbricks-typeform-alternative.png b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/open-source-survey-software-free-2023-formbricks-typeform-alternative.png similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/open-source-survey-software-free-2023-formbricks-typeform-alternative.png rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/open-source-survey-software-free-2023-formbricks-typeform-alternative.png diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/opnform-free-open-source-form-survey-tools-builder-2023-self-hostign.jpg b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/opnform-free-open-source-form-survey-tools-builder-2023-self-hostign.jpg similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/opnform-free-open-source-form-survey-tools-builder-2023-self-hostign.jpg rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/opnform-free-open-source-form-survey-tools-builder-2023-self-hostign.jpg diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png diff --git a/apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/typebot-open-source-free-conversational-form-builder-survey-software-opensource.jpg b/apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/typebot-open-source-free-conversational-form-builder-survey-software-opensource.jpg similarity index 100% rename from apps/formbricks-com/pages/blog/best-open-source-survey-software-2023/typebot-open-source-free-conversational-form-builder-survey-software-opensource.jpg rename to apps/formbricks-com-old/pages/blog/best-open-source-survey-software-2023/typebot-open-source-free-conversational-form-builder-survey-software-opensource.jpg diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/email-results-PMF-cal.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/email-results-PMF-cal.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/email-results-PMF-cal.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/email-results-PMF-cal.png diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/index.mdx b/apps/formbricks-com-old/pages/blog/experience-management-open-source/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/index.mdx rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/index.mdx diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/matti-jojo.jpg b/apps/formbricks-com-old/pages/blog/experience-management-open-source/matti-jojo.jpg similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/matti-jojo.jpg rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/matti-jojo.jpg diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/peer-tweet-typeform-open-source.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/peer-tweet-typeform-open-source.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/peer-tweet-typeform-open-source.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/peer-tweet-typeform-open-source.png diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/pmf-survey-dashboard.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/pmf-survey-dashboard.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/pmf-survey-dashboard.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/pmf-survey-dashboard.png diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/snoopforms-open-source-typeform-alternative.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/snoopforms-open-source-typeform-alternative.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/snoopforms-open-source-typeform-alternative.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/snoopforms-open-source-typeform-alternative.png diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/survey-display-peak.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/survey-display-peak.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/survey-display-peak.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/survey-display-peak.png diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/surveyjs-free-opensource-form-survey-tool-software-to-make-surveys-2023.png diff --git a/apps/formbricks-com/pages/blog/experience-management-open-source/twitter-results-PMF-cal.png b/apps/formbricks-com-old/pages/blog/experience-management-open-source/twitter-results-PMF-cal.png similarity index 100% rename from apps/formbricks-com/pages/blog/experience-management-open-source/twitter-results-PMF-cal.png rename to apps/formbricks-com-old/pages/blog/experience-management-open-source/twitter-results-PMF-cal.png diff --git a/apps/formbricks-com/pages/blog/github-accelerator-experience/formbricks-sponsored-by-github-accelerator-2023.webp b/apps/formbricks-com-old/pages/blog/github-accelerator-experience/formbricks-sponsored-by-github-accelerator-2023.webp similarity index 100% rename from apps/formbricks-com/pages/blog/github-accelerator-experience/formbricks-sponsored-by-github-accelerator-2023.webp rename to apps/formbricks-com-old/pages/blog/github-accelerator-experience/formbricks-sponsored-by-github-accelerator-2023.webp diff --git a/apps/formbricks-com/pages/blog/github-accelerator-experience/github-accelerator-2022-teams.png b/apps/formbricks-com-old/pages/blog/github-accelerator-experience/github-accelerator-2022-teams.png similarity index 100% rename from apps/formbricks-com/pages/blog/github-accelerator-experience/github-accelerator-2022-teams.png rename to apps/formbricks-com-old/pages/blog/github-accelerator-experience/github-accelerator-2022-teams.png diff --git a/apps/formbricks-com/pages/blog/github-accelerator-experience/github-accelerator-selection-mail.png b/apps/formbricks-com-old/pages/blog/github-accelerator-experience/github-accelerator-selection-mail.png similarity index 100% rename from apps/formbricks-com/pages/blog/github-accelerator-experience/github-accelerator-selection-mail.png rename to apps/formbricks-com-old/pages/blog/github-accelerator-experience/github-accelerator-selection-mail.png diff --git a/apps/formbricks-com/pages/blog/github-accelerator-experience/index.mdx b/apps/formbricks-com-old/pages/blog/github-accelerator-experience/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/github-accelerator-experience/index.mdx rename to apps/formbricks-com-old/pages/blog/github-accelerator-experience/index.mdx diff --git a/apps/formbricks-com/pages/blog/github-accelerator-experience/our-experience-github-acc-demo-screenshot.png b/apps/formbricks-com-old/pages/blog/github-accelerator-experience/our-experience-github-acc-demo-screenshot.png similarity index 100% rename from apps/formbricks-com/pages/blog/github-accelerator-experience/our-experience-github-acc-demo-screenshot.png rename to apps/formbricks-com-old/pages/blog/github-accelerator-experience/our-experience-github-acc-demo-screenshot.png diff --git a/apps/formbricks-com/pages/blog/inaugural-batch-github-accelerator/formbricks-sponsored-by-github-accelerator-2023.webp b/apps/formbricks-com-old/pages/blog/inaugural-batch-github-accelerator/formbricks-sponsored-by-github-accelerator-2023.webp similarity index 100% rename from apps/formbricks-com/pages/blog/inaugural-batch-github-accelerator/formbricks-sponsored-by-github-accelerator-2023.webp rename to apps/formbricks-com-old/pages/blog/inaugural-batch-github-accelerator/formbricks-sponsored-by-github-accelerator-2023.webp diff --git a/apps/formbricks-com/pages/blog/inaugural-batch-github-accelerator/index.mdx b/apps/formbricks-com-old/pages/blog/inaugural-batch-github-accelerator/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/inaugural-batch-github-accelerator/index.mdx rename to apps/formbricks-com-old/pages/blog/inaugural-batch-github-accelerator/index.mdx diff --git a/apps/formbricks-com/pages/blog/index.tsx b/apps/formbricks-com-old/pages/blog/index.tsx similarity index 100% rename from apps/formbricks-com/pages/blog/index.tsx rename to apps/formbricks-com-old/pages/blog/index.tsx diff --git a/apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/everything_everywhere_all_at_once.png b/apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/everything_everywhere_all_at_once.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/everything_everywhere_all_at_once.png rename to apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/everything_everywhere_all_at_once.png diff --git a/apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/index.mdx b/apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/index.mdx rename to apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/index.mdx diff --git a/apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/robin-hood-meme.png b/apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/robin-hood-meme.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/robin-hood-meme.png rename to apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/robin-hood-meme.png diff --git a/apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/why-we-do-it.png b/apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/why-we-do-it.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-forms-will-save-the-world/why-we-do-it.png rename to apps/formbricks-com-old/pages/blog/open-source-forms-will-save-the-world/why-we-do-it.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/formbricks-sneak.png b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/formbricks-sneak.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/formbricks-sneak.png rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/formbricks-sneak.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/index.mdx b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/index.mdx rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/index.mdx diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/ohmyform.png b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/ohmyform.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/ohmyform.png rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/ohmyform.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/snoopforms-how-it-began.png b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/snoopforms-how-it-began.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/snoopforms-how-it-began.png rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/snoopforms-how-it-began.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/tellform.png b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/tellform.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/tellform.png rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/tellform.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/tripetto.png b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/tripetto.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/tripetto.png rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/tripetto.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/typeform-value-prop.png b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/typeform-value-prop.png similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/typeform-value-prop.png rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/typeform-value-prop.png diff --git a/apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/wrestling.jpg b/apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/wrestling.jpg similarity index 100% rename from apps/formbricks-com/pages/blog/open-source-qualtrics-beats-typeform/wrestling.jpg rename to apps/formbricks-com-old/pages/blog/open-source-qualtrics-beats-typeform/wrestling.jpg diff --git a/apps/formbricks-com/pages/blog/snoopforms-becomes-formbricks/formbricks-logo-header-open-source-form-infrastructure.svg b/apps/formbricks-com-old/pages/blog/snoopforms-becomes-formbricks/formbricks-logo-header-open-source-form-infrastructure.svg similarity index 100% rename from apps/formbricks-com/pages/blog/snoopforms-becomes-formbricks/formbricks-logo-header-open-source-form-infrastructure.svg rename to apps/formbricks-com-old/pages/blog/snoopforms-becomes-formbricks/formbricks-logo-header-open-source-form-infrastructure.svg diff --git a/apps/formbricks-com/pages/blog/snoopforms-becomes-formbricks/index.mdx b/apps/formbricks-com-old/pages/blog/snoopforms-becomes-formbricks/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/snoopforms-becomes-formbricks/index.mdx rename to apps/formbricks-com-old/pages/blog/snoopforms-becomes-formbricks/index.mdx diff --git a/apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/formbricks-logo.svg b/apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/formbricks-logo.svg similarity index 100% rename from apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/formbricks-logo.svg rename to apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/formbricks-logo.svg diff --git a/apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/index.mdx b/apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/index.mdx similarity index 100% rename from apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/index.mdx rename to apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/index.mdx diff --git a/apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/propietary-dependence.jpeg b/apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/propietary-dependence.jpeg similarity index 100% rename from apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/propietary-dependence.jpeg rename to apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/propietary-dependence.jpeg diff --git a/apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/snoopforms-logo.svg b/apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/snoopforms-logo.svg similarity index 100% rename from apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/snoopforms-logo.svg rename to apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/snoopforms-logo.svg diff --git a/apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/title-image.png b/apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/title-image.png similarity index 100% rename from apps/formbricks-com/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/title-image.png rename to apps/formbricks-com-old/pages/blog/why-open-source-no-code-is-the-future-of-enterprise-gov-software/title-image.png diff --git a/apps/formbricks-com/pages/careers.tsx b/apps/formbricks-com-old/pages/careers.tsx similarity index 100% rename from apps/formbricks-com/pages/careers.tsx rename to apps/formbricks-com-old/pages/careers.tsx diff --git a/apps/formbricks-com/pages/community.tsx b/apps/formbricks-com-old/pages/community.tsx similarity index 100% rename from apps/formbricks-com/pages/community.tsx rename to apps/formbricks-com-old/pages/community.tsx diff --git a/apps/formbricks-com/pages/concierge.tsx b/apps/formbricks-com-old/pages/concierge.tsx similarity index 100% rename from apps/formbricks-com/pages/concierge.tsx rename to apps/formbricks-com-old/pages/concierge.tsx diff --git a/apps/formbricks-com/pages/demo/index.tsx b/apps/formbricks-com-old/pages/demo/index.tsx similarity index 100% rename from apps/formbricks-com/pages/demo/index.tsx rename to apps/formbricks-com-old/pages/demo/index.tsx diff --git a/apps/formbricks-com/pages/docs-feedback/index.tsx b/apps/formbricks-com-old/pages/docs-feedback/index.tsx similarity index 100% rename from apps/formbricks-com/pages/docs-feedback/index.tsx rename to apps/formbricks-com-old/pages/docs-feedback/index.tsx diff --git a/apps/formbricks-com/pages/docs/actions/code/index.mdx b/apps/formbricks-com-old/pages/docs/actions/code/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/actions/code/index.mdx rename to apps/formbricks-com-old/pages/docs/actions/code/index.mdx diff --git a/apps/formbricks-com/pages/docs/actions/no-code/index.mdx b/apps/formbricks-com-old/pages/docs/actions/no-code/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/actions/no-code/index.mdx rename to apps/formbricks-com-old/pages/docs/actions/no-code/index.mdx diff --git a/apps/formbricks-com/pages/docs/actions/why/index.mdx b/apps/formbricks-com-old/pages/docs/actions/why/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/actions/why/index.mdx rename to apps/formbricks-com-old/pages/docs/actions/why/index.mdx diff --git a/apps/formbricks-com/pages/docs/api/api-key-setup/add-api-key.png b/apps/formbricks-com-old/pages/docs/api/api-key-setup/add-api-key.png similarity index 100% rename from apps/formbricks-com/pages/docs/api/api-key-setup/add-api-key.png rename to apps/formbricks-com-old/pages/docs/api/api-key-setup/add-api-key.png diff --git a/apps/formbricks-com/pages/docs/api/api-key-setup/api-key-secret.png b/apps/formbricks-com-old/pages/docs/api/api-key-setup/api-key-secret.png similarity index 100% rename from apps/formbricks-com/pages/docs/api/api-key-setup/api-key-secret.png rename to apps/formbricks-com-old/pages/docs/api/api-key-setup/api-key-secret.png diff --git a/apps/formbricks-com/pages/docs/api/api-key-setup/index.mdx b/apps/formbricks-com-old/pages/docs/api/api-key-setup/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/api/api-key-setup/index.mdx rename to apps/formbricks-com-old/pages/docs/api/api-key-setup/index.mdx diff --git a/apps/formbricks-com/pages/docs/api/overview/index.mdx b/apps/formbricks-com-old/pages/docs/api/overview/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/api/overview/index.mdx rename to apps/formbricks-com-old/pages/docs/api/overview/index.mdx diff --git a/apps/formbricks-com/pages/docs/attributes/custom-attributes/index.mdx b/apps/formbricks-com-old/pages/docs/attributes/custom-attributes/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/attributes/custom-attributes/index.mdx rename to apps/formbricks-com-old/pages/docs/attributes/custom-attributes/index.mdx diff --git a/apps/formbricks-com/pages/docs/attributes/identify-users/index.mdx b/apps/formbricks-com-old/pages/docs/attributes/identify-users/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/attributes/identify-users/index.mdx rename to apps/formbricks-com-old/pages/docs/attributes/identify-users/index.mdx diff --git a/apps/formbricks-com/pages/docs/attributes/why/index.mdx b/apps/formbricks-com-old/pages/docs/attributes/why/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/attributes/why/index.mdx rename to apps/formbricks-com-old/pages/docs/attributes/why/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/change-text.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/change-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/change-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/change-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/create-cancel-flow.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/create-cancel-flow.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/create-cancel-flow.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/create-cancel-flow.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/publish-survey.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/publish-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/publish-survey.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/publish-survey.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/recontact-options.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/recontact-options.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/recontact-options.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/recontact-options.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/select-action.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/select-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/select-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/select-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/trigger-css-selector.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/trigger-css-selector.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/trigger-css-selector.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/trigger-css-selector.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/trigger-inner-text.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/trigger-inner-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/trigger-inner-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/trigger-inner-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/cancel-subscription/trigger-page-url.png b/apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/trigger-page-url.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/cancel-subscription/trigger-page-url.png rename to apps/formbricks-com-old/pages/docs/best-practices/cancel-subscription/trigger-page-url.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/add-action.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/add-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/add-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/add-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/change-id.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/change-id.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/change-id.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/change-id.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/copy-ids.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/copy-ids.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/copy-ids.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/copy-ids.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/docs-navi.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/docs-navi.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/docs-navi.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/docs-navi.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/docs-template.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/docs-template.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/docs-template.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/docs-template.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/select-nonevent.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/select-nonevent.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/select-nonevent.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/select-nonevent.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/switch-to-dev.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/switch-to-dev.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/switch-to-dev.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/switch-to-dev.png diff --git a/apps/formbricks-com/pages/docs/best-practices/docs-feedback/when-to-ask.png b/apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/when-to-ask.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/docs-feedback/when-to-ask.png rename to apps/formbricks-com-old/pages/docs/best-practices/docs-feedback/when-to-ask.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/action-css.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/action-css.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/action-css.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/action-css.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/action-text.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/action-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/action-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/action-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/change-text.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/change-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/change-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/change-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/create-survey.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/create-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/create-survey.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/create-survey.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/publish.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/publish.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/publish.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/publish.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/recontact-options.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/recontact-options.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/recontact-options.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/recontact-options.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feature-chaser/select-action.png b/apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/select-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feature-chaser/select-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/feature-chaser/select-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/add-action.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/add-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/add-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/add-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/add-css-action.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/add-css-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/add-css-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/add-css-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/add-html-action.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/add-html-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/add-html-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/add-html-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/change-text-content.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/change-text-content.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/change-text-content.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/change-text-content.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/create-feedback-box-by-template.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/create-feedback-box-by-template.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/create-feedback-box-by-template.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/create-feedback-box-by-template.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/publish-survey.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/publish-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/publish-survey.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/publish-survey.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/select-feedback-button-action.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/select-feedback-button-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/select-feedback-button-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/select-feedback-button-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/feedback-box/set-recontact-options.png b/apps/formbricks-com-old/pages/docs/best-practices/feedback-box/set-recontact-options.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/feedback-box/set-recontact-options.png rename to apps/formbricks-com-old/pages/docs/best-practices/feedback-box/set-recontact-options.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/action-innertext.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/action-innertext.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/action-innertext.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/action-innertext.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/action-pageurl.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/action-pageurl.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/action-pageurl.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/action-pageurl.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/change-text.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/change-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/change-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/change-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/create-survey.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/create-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/create-survey.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/create-survey.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/publish.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/publish.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/publish.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/publish.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/recontact-options.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/recontact-options.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/recontact-options.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/recontact-options.png diff --git a/apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/select-action.png b/apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/select-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/improve-trial-cr/select-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/improve-trial-cr/select-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/action-css.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/action-css.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/action-css.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/action-css.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/action-innertext.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/action-innertext.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/action-innertext.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/action-innertext.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/action-pageurl.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/action-pageurl.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/action-pageurl.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/action-pageurl.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/add-action.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/add-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/add-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/add-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/change-text.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/change-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/change-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/change-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/create-prompt.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/create-prompt.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/create-prompt.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/create-prompt.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/interview-example.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/interview-example.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/interview-example.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/interview-example.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/publish-survey.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/publish-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/publish-survey.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/publish-survey.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/recontact-options.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/recontact-options.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/recontact-options.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/recontact-options.png diff --git a/apps/formbricks-com/pages/docs/best-practices/interview-prompt/select-action.png b/apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/select-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/interview-prompt/select-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/interview-prompt/select-action.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/action-css.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/action-css.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/action-css.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/action-css.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/action-pageurl.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/action-pageurl.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/action-pageurl.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/action-pageurl.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/change-text.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/change-text.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/change-text.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/change-text.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/create-survey.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/create-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/create-survey.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/create-survey.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/index.mdx b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/index.mdx rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/index.mdx diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/publish.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/publish.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/publish.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/publish.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/recontact-options.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/recontact-options.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/recontact-options.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/recontact-options.png diff --git a/apps/formbricks-com/pages/docs/best-practices/pmf-survey/select-action.png b/apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/select-action.png similarity index 100% rename from apps/formbricks-com/pages/docs/best-practices/pmf-survey/select-action.png rename to apps/formbricks-com-old/pages/docs/best-practices/pmf-survey/select-action.png diff --git a/apps/formbricks-com/pages/docs/client-api/create-response/index.mdx b/apps/formbricks-com-old/pages/docs/client-api/create-response/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/client-api/create-response/index.mdx rename to apps/formbricks-com-old/pages/docs/client-api/create-response/index.mdx diff --git a/apps/formbricks-com/pages/docs/client-api/overview/index.mdx b/apps/formbricks-com-old/pages/docs/client-api/overview/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/client-api/overview/index.mdx rename to apps/formbricks-com-old/pages/docs/client-api/overview/index.mdx diff --git a/apps/formbricks-com/pages/docs/client-api/update-response/index.mdx b/apps/formbricks-com-old/pages/docs/client-api/update-response/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/client-api/update-response/index.mdx rename to apps/formbricks-com-old/pages/docs/client-api/update-response/index.mdx diff --git a/apps/formbricks-com/pages/docs/contributing/demo/demoapp.png b/apps/formbricks-com-old/pages/docs/contributing/demo/demoapp.png similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/demo/demoapp.png rename to apps/formbricks-com-old/pages/docs/contributing/demo/demoapp.png diff --git a/apps/formbricks-com/pages/docs/contributing/demo/index.mdx b/apps/formbricks-com-old/pages/docs/contributing/demo/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/demo/index.mdx rename to apps/formbricks-com-old/pages/docs/contributing/demo/index.mdx diff --git a/apps/formbricks-com/pages/docs/contributing/introduction/index.mdx b/apps/formbricks-com-old/pages/docs/contributing/introduction/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/introduction/index.mdx rename to apps/formbricks-com-old/pages/docs/contributing/introduction/index.mdx diff --git a/apps/formbricks-com/pages/docs/contributing/setup/index.mdx b/apps/formbricks-com-old/pages/docs/contributing/setup/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/setup/index.mdx rename to apps/formbricks-com-old/pages/docs/contributing/setup/index.mdx diff --git a/apps/formbricks-com/pages/docs/contributing/troubleshooting/clear-app-data.png b/apps/formbricks-com-old/pages/docs/contributing/troubleshooting/clear-app-data.png similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/troubleshooting/clear-app-data.png rename to apps/formbricks-com-old/pages/docs/contributing/troubleshooting/clear-app-data.png diff --git a/apps/formbricks-com/pages/docs/contributing/troubleshooting/index.mdx b/apps/formbricks-com-old/pages/docs/contributing/troubleshooting/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/troubleshooting/index.mdx rename to apps/formbricks-com-old/pages/docs/contributing/troubleshooting/index.mdx diff --git a/apps/formbricks-com/pages/docs/contributing/troubleshooting/logout.png b/apps/formbricks-com-old/pages/docs/contributing/troubleshooting/logout.png similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/troubleshooting/logout.png rename to apps/formbricks-com-old/pages/docs/contributing/troubleshooting/logout.png diff --git a/apps/formbricks-com/pages/docs/contributing/troubleshooting/uncaught-promise.png b/apps/formbricks-com-old/pages/docs/contributing/troubleshooting/uncaught-promise.png similarity index 100% rename from apps/formbricks-com/pages/docs/contributing/troubleshooting/uncaught-promise.png rename to apps/formbricks-com-old/pages/docs/contributing/troubleshooting/uncaught-promise.png diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-app/env-id.png b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/env-id.png similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-app/env-id.png rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/env-id.png diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-app/index.mdx b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-app/index.mdx rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/index.mdx diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-app/widget-connected.png b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/widget-connected.png similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-app/widget-connected.png rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/widget-connected.png diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-app/widget-not-connected.png b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/widget-not-connected.png similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-app/widget-not-connected.png rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-app/widget-not-connected.png diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-pages/env-id.png b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/env-id.png similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-pages/env-id.png rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/env-id.png diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-pages/index.mdx b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-pages/index.mdx rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/index.mdx diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-pages/widget-connected.png b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/widget-connected.png similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-pages/widget-connected.png rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/widget-connected.png diff --git a/apps/formbricks-com/pages/docs/getting-started/nextjs-pages/widget-not-connected.png b/apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/widget-not-connected.png similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/nextjs-pages/widget-not-connected.png rename to apps/formbricks-com-old/pages/docs/getting-started/nextjs-pages/widget-not-connected.png diff --git a/apps/formbricks-com/pages/docs/getting-started/quickstart/index.mdx b/apps/formbricks-com-old/pages/docs/getting-started/quickstart/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/quickstart/index.mdx rename to apps/formbricks-com-old/pages/docs/getting-started/quickstart/index.mdx diff --git a/apps/formbricks-com/pages/docs/getting-started/vuejs/index.mdx b/apps/formbricks-com-old/pages/docs/getting-started/vuejs/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/getting-started/vuejs/index.mdx rename to apps/formbricks-com-old/pages/docs/getting-started/vuejs/index.mdx diff --git a/apps/formbricks-com/pages/docs/index.mdx b/apps/formbricks-com-old/pages/docs/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/index.mdx rename to apps/formbricks-com-old/pages/docs/index.mdx diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/add-new-zap.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/add-new-zap.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/add-new-zap.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/add-new-zap.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/choose-event.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/choose-event.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/choose-event.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/choose-event.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/connect-with-formbricks-1.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/connect-with-formbricks-1.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/connect-with-formbricks-1.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/connect-with-formbricks-1.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/connect-with-formbricks-2.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/connect-with-formbricks-2.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/connect-with-formbricks-2.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/connect-with-formbricks-2.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/duplicate-survey.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/duplicate-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/duplicate-survey.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/duplicate-survey.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/index.mdx b/apps/formbricks-com-old/pages/docs/integrations/zapier/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/index.mdx rename to apps/formbricks-com-old/pages/docs/integrations/zapier/index.mdx diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/select-survey.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/select-survey.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/select-survey.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/select-survey.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/slack-channel-msg.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/slack-channel-msg.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/slack-channel-msg.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/slack-channel-msg.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/slack-message.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/slack-message.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/slack-message.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/slack-message.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/submit-test-response.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/submit-test-response.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/submit-test-response.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/submit-test-response.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/success-connected.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/success-connected.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/success-connected.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/success-connected.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/test-submission.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/test-submission.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/test-submission.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/test-submission.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/update-question-id.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/update-question-id.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/update-question-id.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/update-question-id.png diff --git a/apps/formbricks-com/pages/docs/integrations/zapier/zapier-message.png b/apps/formbricks-com-old/pages/docs/integrations/zapier/zapier-message.png similarity index 100% rename from apps/formbricks-com/pages/docs/integrations/zapier/zapier-message.png rename to apps/formbricks-com-old/pages/docs/integrations/zapier/zapier-message.png diff --git a/apps/formbricks-com/pages/docs/introduction/how-it-works/index.mdx b/apps/formbricks-com-old/pages/docs/introduction/how-it-works/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/introduction/how-it-works/index.mdx rename to apps/formbricks-com-old/pages/docs/introduction/how-it-works/index.mdx diff --git a/apps/formbricks-com/pages/docs/introduction/what-is-formbricks/index.mdx b/apps/formbricks-com-old/pages/docs/introduction/what-is-formbricks/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/introduction/what-is-formbricks/index.mdx rename to apps/formbricks-com-old/pages/docs/introduction/what-is-formbricks/index.mdx diff --git a/apps/formbricks-com/pages/docs/introduction/why-is-it-better/index.mdx b/apps/formbricks-com-old/pages/docs/introduction/why-is-it-better/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/introduction/why-is-it-better/index.mdx rename to apps/formbricks-com-old/pages/docs/introduction/why-is-it-better/index.mdx diff --git a/apps/formbricks-com/pages/docs/link-surveys/data-prefilling/index.mdx b/apps/formbricks-com-old/pages/docs/link-surveys/data-prefilling/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/link-surveys/data-prefilling/index.mdx rename to apps/formbricks-com-old/pages/docs/link-surveys/data-prefilling/index.mdx diff --git a/apps/formbricks-com/pages/docs/link-surveys/data-prefilling/question-id.png b/apps/formbricks-com-old/pages/docs/link-surveys/data-prefilling/question-id.png similarity index 100% rename from apps/formbricks-com/pages/docs/link-surveys/data-prefilling/question-id.png rename to apps/formbricks-com-old/pages/docs/link-surveys/data-prefilling/question-id.png diff --git a/apps/formbricks-com/pages/docs/link-surveys/user-identification/index.mdx b/apps/formbricks-com-old/pages/docs/link-surveys/user-identification/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/link-surveys/user-identification/index.mdx rename to apps/formbricks-com-old/pages/docs/link-surveys/user-identification/index.mdx diff --git a/apps/formbricks-com/pages/docs/link-surveys/user-identification/people-view.png b/apps/formbricks-com-old/pages/docs/link-surveys/user-identification/people-view.png similarity index 100% rename from apps/formbricks-com/pages/docs/link-surveys/user-identification/people-view.png rename to apps/formbricks-com-old/pages/docs/link-surveys/user-identification/people-view.png diff --git a/apps/formbricks-com/pages/docs/open-source-tool-for-form-and-survey-overview.png b/apps/formbricks-com-old/pages/docs/open-source-tool-for-form-and-survey-overview.png similarity index 100% rename from apps/formbricks-com/pages/docs/open-source-tool-for-form-and-survey-overview.png rename to apps/formbricks-com-old/pages/docs/open-source-tool-for-form-and-survey-overview.png diff --git a/apps/formbricks-com/pages/docs/self-hosting/deployment/index.mdx b/apps/formbricks-com-old/pages/docs/self-hosting/deployment/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/self-hosting/deployment/index.mdx rename to apps/formbricks-com-old/pages/docs/self-hosting/deployment/index.mdx diff --git a/apps/formbricks-com/pages/docs/webhook-api/create-webhook/index.mdx b/apps/formbricks-com-old/pages/docs/webhook-api/create-webhook/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/webhook-api/create-webhook/index.mdx rename to apps/formbricks-com-old/pages/docs/webhook-api/create-webhook/index.mdx diff --git a/apps/formbricks-com/pages/docs/webhook-api/delete-webhook/index.mdx b/apps/formbricks-com-old/pages/docs/webhook-api/delete-webhook/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/webhook-api/delete-webhook/index.mdx rename to apps/formbricks-com-old/pages/docs/webhook-api/delete-webhook/index.mdx diff --git a/apps/formbricks-com/pages/docs/webhook-api/get-webhook/index.mdx b/apps/formbricks-com-old/pages/docs/webhook-api/get-webhook/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/webhook-api/get-webhook/index.mdx rename to apps/formbricks-com-old/pages/docs/webhook-api/get-webhook/index.mdx diff --git a/apps/formbricks-com/pages/docs/webhook-api/list-webhooks/index.mdx b/apps/formbricks-com-old/pages/docs/webhook-api/list-webhooks/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/webhook-api/list-webhooks/index.mdx rename to apps/formbricks-com-old/pages/docs/webhook-api/list-webhooks/index.mdx diff --git a/apps/formbricks-com/pages/docs/webhook-api/overview/index.mdx b/apps/formbricks-com-old/pages/docs/webhook-api/overview/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/webhook-api/overview/index.mdx rename to apps/formbricks-com-old/pages/docs/webhook-api/overview/index.mdx diff --git a/apps/formbricks-com/pages/docs/webhook-api/webhook-payload/index.mdx b/apps/formbricks-com-old/pages/docs/webhook-api/webhook-payload/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/webhook-api/webhook-payload/index.mdx rename to apps/formbricks-com-old/pages/docs/webhook-api/webhook-payload/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/email/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/email/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/email/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/email/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/inline/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/inline/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/inline/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/inline/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/link/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/link/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/link/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/link/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/modal/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/modal/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/modal/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/modal/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/pop-over/demo.tsx b/apps/formbricks-com-old/pages/docs/wrappers/pop-over/demo.tsx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/pop-over/demo.tsx rename to apps/formbricks-com-old/pages/docs/wrappers/pop-over/demo.tsx diff --git a/apps/formbricks-com/pages/docs/wrappers/pop-over/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/pop-over/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/pop-over/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/pop-over/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/slide-out/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/slide-out/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/slide-out/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/slide-out/index.mdx diff --git a/apps/formbricks-com/pages/docs/wrappers/what-are-wrappers/index.mdx b/apps/formbricks-com-old/pages/docs/wrappers/what-are-wrappers/index.mdx similarity index 100% rename from apps/formbricks-com/pages/docs/wrappers/what-are-wrappers/index.mdx rename to apps/formbricks-com-old/pages/docs/wrappers/what-are-wrappers/index.mdx diff --git a/apps/formbricks-com/pages/feature-chaser/index.tsx b/apps/formbricks-com-old/pages/feature-chaser/index.tsx similarity index 100% rename from apps/formbricks-com/pages/feature-chaser/index.tsx rename to apps/formbricks-com-old/pages/feature-chaser/index.tsx diff --git a/apps/formbricks-com/pages/feedback-box/index.tsx b/apps/formbricks-com-old/pages/feedback-box/index.tsx similarity index 100% rename from apps/formbricks-com/pages/feedback-box/index.tsx rename to apps/formbricks-com-old/pages/feedback-box/index.tsx diff --git a/apps/formbricks-com/pages/gdpr-guide.mdx b/apps/formbricks-com-old/pages/gdpr-guide.mdx similarity index 100% rename from apps/formbricks-com/pages/gdpr-guide.mdx rename to apps/formbricks-com-old/pages/gdpr-guide.mdx diff --git a/apps/formbricks-com/pages/gdpr.mdx b/apps/formbricks-com-old/pages/gdpr.mdx similarity index 100% rename from apps/formbricks-com/pages/gdpr.mdx rename to apps/formbricks-com-old/pages/gdpr.mdx diff --git a/apps/formbricks-com/pages/imprint.mdx b/apps/formbricks-com-old/pages/imprint.mdx similarity index 100% rename from apps/formbricks-com/pages/imprint.mdx rename to apps/formbricks-com-old/pages/imprint.mdx diff --git a/apps/formbricks-com/pages/improve-trial-conversion/index.tsx b/apps/formbricks-com-old/pages/improve-trial-conversion/index.tsx similarity index 100% rename from apps/formbricks-com/pages/improve-trial-conversion/index.tsx rename to apps/formbricks-com-old/pages/improve-trial-conversion/index.tsx diff --git a/apps/formbricks-com/pages/index.tsx b/apps/formbricks-com-old/pages/index.tsx similarity index 100% rename from apps/formbricks-com/pages/index.tsx rename to apps/formbricks-com-old/pages/index.tsx diff --git a/apps/formbricks-com/pages/interview-prompt/index.tsx b/apps/formbricks-com-old/pages/interview-prompt/index.tsx similarity index 100% rename from apps/formbricks-com/pages/interview-prompt/index.tsx rename to apps/formbricks-com-old/pages/interview-prompt/index.tsx diff --git a/apps/formbricks-com/pages/learn-from-churn/index.tsx b/apps/formbricks-com-old/pages/learn-from-churn/index.tsx similarity index 100% rename from apps/formbricks-com/pages/learn-from-churn/index.tsx rename to apps/formbricks-com-old/pages/learn-from-churn/index.tsx diff --git a/apps/formbricks-com/pages/learn/[slug].tsx b/apps/formbricks-com-old/pages/learn/[slug].tsx similarity index 100% rename from apps/formbricks-com/pages/learn/[slug].tsx rename to apps/formbricks-com-old/pages/learn/[slug].tsx diff --git a/apps/formbricks-com/pages/measure-product-market-fit/index.tsx b/apps/formbricks-com-old/pages/measure-product-market-fit/index.tsx similarity index 100% rename from apps/formbricks-com/pages/measure-product-market-fit/index.tsx rename to apps/formbricks-com-old/pages/measure-product-market-fit/index.tsx diff --git a/apps/formbricks-com/pages/onboarding-segmentation/index.tsx b/apps/formbricks-com-old/pages/onboarding-segmentation/index.tsx similarity index 100% rename from apps/formbricks-com/pages/onboarding-segmentation/index.tsx rename to apps/formbricks-com-old/pages/onboarding-segmentation/index.tsx diff --git a/apps/formbricks-com/pages/oss-friends.tsx b/apps/formbricks-com-old/pages/oss-friends.tsx similarity index 100% rename from apps/formbricks-com/pages/oss-friends.tsx rename to apps/formbricks-com-old/pages/oss-friends.tsx diff --git a/apps/formbricks-com/pages/privacy-policy.mdx b/apps/formbricks-com-old/pages/privacy-policy.mdx similarity index 100% rename from apps/formbricks-com/pages/privacy-policy.mdx rename to apps/formbricks-com-old/pages/privacy-policy.mdx diff --git a/apps/formbricks-com/pages/terms.mdx b/apps/formbricks-com-old/pages/terms.mdx similarity index 100% rename from apps/formbricks-com/pages/terms.mdx rename to apps/formbricks-com-old/pages/terms.mdx diff --git a/apps/formbricks-com/pages/vs-formspree.mdx b/apps/formbricks-com-old/pages/vs-formspree.mdx similarity index 100% rename from apps/formbricks-com/pages/vs-formspree.mdx rename to apps/formbricks-com-old/pages/vs-formspree.mdx diff --git a/apps/formbricks-com/pages/vs-google-forms.mdx b/apps/formbricks-com-old/pages/vs-google-forms.mdx similarity index 100% rename from apps/formbricks-com/pages/vs-google-forms.mdx rename to apps/formbricks-com-old/pages/vs-google-forms.mdx diff --git a/apps/formbricks-com/pages/vs-ohmyform.mdx b/apps/formbricks-com-old/pages/vs-ohmyform.mdx similarity index 100% rename from apps/formbricks-com/pages/vs-ohmyform.mdx rename to apps/formbricks-com-old/pages/vs-ohmyform.mdx diff --git a/apps/formbricks-com-old/postcss.config.js b/apps/formbricks-com-old/postcss.config.js new file mode 100644 index 0000000000..33ad091d26 --- /dev/null +++ b/apps/formbricks-com-old/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/apps/formbricks-com/public/animations/opensource-xm-platform-formbricks-fallback.png b/apps/formbricks-com-old/public/animations/opensource-xm-platform-formbricks-fallback.png similarity index 100% rename from apps/formbricks-com/public/animations/opensource-xm-platform-formbricks-fallback.png rename to apps/formbricks-com-old/public/animations/opensource-xm-platform-formbricks-fallback.png diff --git a/apps/formbricks-com/public/animations/opensource-xm-platform-formbricks.json b/apps/formbricks-com-old/public/animations/opensource-xm-platform-formbricks.json similarity index 100% rename from apps/formbricks-com/public/animations/opensource-xm-platform-formbricks.json rename to apps/formbricks-com-old/public/animations/opensource-xm-platform-formbricks.json diff --git a/apps/formbricks-com/public/favicon/android-chrome-192x192.png b/apps/formbricks-com-old/public/favicon/android-chrome-192x192.png similarity index 100% rename from apps/formbricks-com/public/favicon/android-chrome-192x192.png rename to apps/formbricks-com-old/public/favicon/android-chrome-192x192.png diff --git a/apps/formbricks-com/public/favicon/android-chrome-512x512.png b/apps/formbricks-com-old/public/favicon/android-chrome-512x512.png similarity index 100% rename from apps/formbricks-com/public/favicon/android-chrome-512x512.png rename to apps/formbricks-com-old/public/favicon/android-chrome-512x512.png diff --git a/apps/formbricks-com/public/favicon/apple-touch-icon.png b/apps/formbricks-com-old/public/favicon/apple-touch-icon.png similarity index 100% rename from apps/formbricks-com/public/favicon/apple-touch-icon.png rename to apps/formbricks-com-old/public/favicon/apple-touch-icon.png diff --git a/apps/formbricks-com/public/favicon/browserconfig.xml b/apps/formbricks-com-old/public/favicon/browserconfig.xml similarity index 100% rename from apps/formbricks-com/public/favicon/browserconfig.xml rename to apps/formbricks-com-old/public/favicon/browserconfig.xml diff --git a/apps/formbricks-com/public/favicon/favicon-16x16.png b/apps/formbricks-com-old/public/favicon/favicon-16x16.png similarity index 100% rename from apps/formbricks-com/public/favicon/favicon-16x16.png rename to apps/formbricks-com-old/public/favicon/favicon-16x16.png diff --git a/apps/formbricks-com/public/favicon/favicon-32x32.png b/apps/formbricks-com-old/public/favicon/favicon-32x32.png similarity index 100% rename from apps/formbricks-com/public/favicon/favicon-32x32.png rename to apps/formbricks-com-old/public/favicon/favicon-32x32.png diff --git a/apps/formbricks-com/public/favicon/favicon.ico b/apps/formbricks-com-old/public/favicon/favicon.ico similarity index 100% rename from apps/formbricks-com/public/favicon/favicon.ico rename to apps/formbricks-com-old/public/favicon/favicon.ico diff --git a/apps/formbricks-com/public/favicon/mstile-144x144.png b/apps/formbricks-com-old/public/favicon/mstile-144x144.png similarity index 100% rename from apps/formbricks-com/public/favicon/mstile-144x144.png rename to apps/formbricks-com-old/public/favicon/mstile-144x144.png diff --git a/apps/formbricks-com/public/favicon/mstile-150x150.png b/apps/formbricks-com-old/public/favicon/mstile-150x150.png similarity index 100% rename from apps/formbricks-com/public/favicon/mstile-150x150.png rename to apps/formbricks-com-old/public/favicon/mstile-150x150.png diff --git a/apps/formbricks-com/public/favicon/mstile-310x150.png b/apps/formbricks-com-old/public/favicon/mstile-310x150.png similarity index 100% rename from apps/formbricks-com/public/favicon/mstile-310x150.png rename to apps/formbricks-com-old/public/favicon/mstile-310x150.png diff --git a/apps/formbricks-com/public/favicon/mstile-310x310.png b/apps/formbricks-com-old/public/favicon/mstile-310x310.png similarity index 100% rename from apps/formbricks-com/public/favicon/mstile-310x310.png rename to apps/formbricks-com-old/public/favicon/mstile-310x310.png diff --git a/apps/formbricks-com/public/favicon/mstile-70x70.png b/apps/formbricks-com-old/public/favicon/mstile-70x70.png similarity index 100% rename from apps/formbricks-com/public/favicon/mstile-70x70.png rename to apps/formbricks-com-old/public/favicon/mstile-70x70.png diff --git a/apps/formbricks-com/public/favicon/safari-pinned-tab.svg b/apps/formbricks-com-old/public/favicon/safari-pinned-tab.svg similarity index 100% rename from apps/formbricks-com/public/favicon/safari-pinned-tab.svg rename to apps/formbricks-com-old/public/favicon/safari-pinned-tab.svg diff --git a/apps/formbricks-com/public/favicon/site.webmanifest b/apps/formbricks-com-old/public/favicon/site.webmanifest similarity index 100% rename from apps/formbricks-com/public/favicon/site.webmanifest rename to apps/formbricks-com-old/public/favicon/site.webmanifest diff --git a/apps/formbricks-com/public/fonts/Inter-italic.var.woff2 b/apps/formbricks-com-old/public/fonts/Inter-italic.var.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Inter-italic.var.woff2 rename to apps/formbricks-com-old/public/fonts/Inter-italic.var.woff2 diff --git a/apps/formbricks-com/public/fonts/Inter-roman.var.woff2 b/apps/formbricks-com-old/public/fonts/Inter-roman.var.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Inter-roman.var.woff2 rename to apps/formbricks-com-old/public/fonts/Inter-roman.var.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-Black.woff b/apps/formbricks-com-old/public/fonts/Poppins-Black.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Black.woff rename to apps/formbricks-com-old/public/fonts/Poppins-Black.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-Black.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-Black.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Black.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-Black.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-Bold.woff b/apps/formbricks-com-old/public/fonts/Poppins-Bold.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Bold.woff rename to apps/formbricks-com-old/public/fonts/Poppins-Bold.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-Bold.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-Bold.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Bold.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-Bold.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-ExtraBold.woff b/apps/formbricks-com-old/public/fonts/Poppins-ExtraBold.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-ExtraBold.woff rename to apps/formbricks-com-old/public/fonts/Poppins-ExtraBold.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-ExtraBold.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-ExtraBold.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-ExtraBold.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-ExtraBold.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-ExtraLight.woff b/apps/formbricks-com-old/public/fonts/Poppins-ExtraLight.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-ExtraLight.woff rename to apps/formbricks-com-old/public/fonts/Poppins-ExtraLight.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-ExtraLight.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-ExtraLight.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-ExtraLight.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-ExtraLight.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-Light.woff b/apps/formbricks-com-old/public/fonts/Poppins-Light.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Light.woff rename to apps/formbricks-com-old/public/fonts/Poppins-Light.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-Light.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-Light.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Light.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-Light.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-Medium.woff b/apps/formbricks-com-old/public/fonts/Poppins-Medium.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Medium.woff rename to apps/formbricks-com-old/public/fonts/Poppins-Medium.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-Medium.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-Medium.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Medium.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-Medium.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-Regular.woff b/apps/formbricks-com-old/public/fonts/Poppins-Regular.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Regular.woff rename to apps/formbricks-com-old/public/fonts/Poppins-Regular.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-Regular.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-Regular.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Regular.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-Regular.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-SemiBold.woff b/apps/formbricks-com-old/public/fonts/Poppins-SemiBold.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-SemiBold.woff rename to apps/formbricks-com-old/public/fonts/Poppins-SemiBold.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-SemiBold.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-SemiBold.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-SemiBold.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-SemiBold.woff2 diff --git a/apps/formbricks-com/public/fonts/Poppins-Thin.woff b/apps/formbricks-com-old/public/fonts/Poppins-Thin.woff similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Thin.woff rename to apps/formbricks-com-old/public/fonts/Poppins-Thin.woff diff --git a/apps/formbricks-com/public/fonts/Poppins-Thin.woff2 b/apps/formbricks-com-old/public/fonts/Poppins-Thin.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/Poppins-Thin.woff2 rename to apps/formbricks-com-old/public/fonts/Poppins-Thin.woff2 diff --git a/apps/formbricks-com/public/fonts/lexend.txt b/apps/formbricks-com-old/public/fonts/lexend.txt similarity index 100% rename from apps/formbricks-com/public/fonts/lexend.txt rename to apps/formbricks-com-old/public/fonts/lexend.txt diff --git a/apps/formbricks-com/public/fonts/lexend.woff2 b/apps/formbricks-com-old/public/fonts/lexend.woff2 similarity index 100% rename from apps/formbricks-com/public/fonts/lexend.woff2 rename to apps/formbricks-com-old/public/fonts/lexend.woff2 diff --git a/apps/formbricks-com/public/robots.txt b/apps/formbricks-com-old/public/robots.txt similarity index 100% rename from apps/formbricks-com/public/robots.txt rename to apps/formbricks-com-old/public/robots.txt diff --git a/apps/formbricks-com/public/social-image.png b/apps/formbricks-com-old/public/social-image.png similarity index 100% rename from apps/formbricks-com/public/social-image.png rename to apps/formbricks-com-old/public/social-image.png diff --git a/apps/formbricks-com/public/videos/thumbnail-visual-form-builder.png b/apps/formbricks-com-old/public/videos/thumbnail-visual-form-builder.png similarity index 100% rename from apps/formbricks-com/public/videos/thumbnail-visual-form-builder.png rename to apps/formbricks-com-old/public/videos/thumbnail-visual-form-builder.png diff --git a/apps/formbricks-com/public/videos/visual-builder-vid.mp4 b/apps/formbricks-com-old/public/videos/visual-builder-vid.mp4 similarity index 100% rename from apps/formbricks-com/public/videos/visual-builder-vid.mp4 rename to apps/formbricks-com-old/public/videos/visual-builder-vid.mp4 diff --git a/apps/formbricks-com/public/videos/walkthrough-v1.mp4 b/apps/formbricks-com-old/public/videos/walkthrough-v1.mp4 similarity index 100% rename from apps/formbricks-com/public/videos/walkthrough-v1.mp4 rename to apps/formbricks-com-old/public/videos/walkthrough-v1.mp4 diff --git a/apps/formbricks-com/styles/docsearch.css b/apps/formbricks-com-old/styles/docsearch.css similarity index 100% rename from apps/formbricks-com/styles/docsearch.css rename to apps/formbricks-com-old/styles/docsearch.css diff --git a/apps/formbricks-com/styles/fonts.css b/apps/formbricks-com-old/styles/fonts.css similarity index 100% rename from apps/formbricks-com/styles/fonts.css rename to apps/formbricks-com-old/styles/fonts.css diff --git a/apps/formbricks-com/styles/globals.css b/apps/formbricks-com-old/styles/globals.css similarity index 100% rename from apps/formbricks-com/styles/globals.css rename to apps/formbricks-com-old/styles/globals.css diff --git a/apps/formbricks-com/styles/prism.css b/apps/formbricks-com-old/styles/prism.css similarity index 100% rename from apps/formbricks-com/styles/prism.css rename to apps/formbricks-com-old/styles/prism.css diff --git a/apps/formbricks-com/tailwind.config.js b/apps/formbricks-com-old/tailwind.config.js similarity index 100% rename from apps/formbricks-com/tailwind.config.js rename to apps/formbricks-com-old/tailwind.config.js diff --git a/apps/formbricks-com-old/tsconfig.json b/apps/formbricks-com-old/tsconfig.json new file mode 100644 index 0000000000..a678898cf4 --- /dev/null +++ b/apps/formbricks-com-old/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@formbricks/tsconfig/nextjs.json", + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/types/*.d.ts"], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./*"] + } + }, + "plugins": [ + { + "name": "next" + } + ] +} diff --git a/apps/formbricks-com/.gitignore b/apps/formbricks-com/.gitignore index 25374c573c..8f322f0d8f 100644 --- a/apps/formbricks-com/.gitignore +++ b/apps/formbricks-com/.gitignore @@ -33,5 +33,3 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts - -public/sitemap*.xml \ No newline at end of file diff --git a/apps/formbricks-com/LICENSE.md b/apps/formbricks-com/LICENSE.md new file mode 100644 index 0000000000..3a28c7d33e --- /dev/null +++ b/apps/formbricks-com/LICENSE.md @@ -0,0 +1,129 @@ +# Tailwind UI License + +## Personal License + +Tailwind Labs Inc. grants you an on-going, non-exclusive license to use the Components and Templates. + +The license grants permission to **one individual** (the Licensee) to access and use the Components and Templates. + +You **can**: + +- Use the Components and Templates to create unlimited End Products. +- Modify the Components and Templates to create derivative components and templates. Those components and templates are subject to this license. +- Use the Components and Templates to create unlimited End Products for unlimited Clients. +- Use the Components and Templates to create End Products where the End Product is sold to End Users. +- Use the Components and Templates to create End Products that are open source and freely available to End Users. + +You **cannot**: + +- Use the Components and Templates to create End Products that are designed to allow an End User to build their own End Products using the Components and Templates or derivatives of the Components and Templates. +- Re-distribute the Components and Templates or derivatives of the Components and Templates separately from an End Product, neither in code or as design assets. +- Share your access to the Components and Templates with any other individuals. +- Use the Components and Templates to produce anything that may be deemed by Tailwind Labs Inc, in their sole and absolute discretion, to be competitive or in conflict with the business of Tailwind Labs Inc. + +### Example usage + +Examples of usage **allowed** by the license: + +- Creating a personal website by yourself. +- Creating a website or web application for a client that will be owned by that client. +- Creating a commercial SaaS application (like an invoicing app for example) where end users have to pay a fee to use the application. +- Creating a commercial self-hosted web application that is sold to end users for a one-time fee. +- Creating a web application where the primary purpose is clearly not to simply re-distribute the components (like a conference organization app that uses the components for its UI for example) that is free and open source, where the source code is publicly available. + +Examples of usage **not allowed** by the license: + +- Creating a repository of your favorite Tailwind UI components or templates (or derivatives based on Tailwind UI components or templates) and publishing it publicly. +- Creating a React or Vue version of Tailwind UI and making it available either for sale or for free. +- Create a Figma or Sketch UI kit based on the Tailwind UI component designs. +- Creating a "website builder" project where end users can build their own websites using components or templates included with or derived from Tailwind UI. +- Creating a theme, template, or project starter kit using the components or templates and making it available either for sale or for free. +- Creating an admin panel tool (like [Laravel Nova](https://nova.laravel.com/) or [ActiveAdmin](https://activeadmin.info/)) that is made available either for sale or for free. + +In simple terms, use Tailwind UI for anything you like as long as it doesn't compete with Tailwind UI. + +### Personal License Definitions + +Licensee is the individual who has purchased a Personal License. + +Components and Templates are the source code and design assets made available to the Licensee after purchasing a Tailwind UI license. + +End Product is any artifact produced that incorporates the Components or Templates or derivatives of the Components or Templates. + +End User is a user of an End Product. + +Client is an individual or entity receiving custom professional services directly from the Licensee, produced specifically for that individual or entity. Customers of software-as-a-service products are not considered clients for the purpose of this document. + +## Team License + +Tailwind Labs Inc. grants you an on-going, non-exclusive license to use the Components and Templates. + +The license grants permission for **up to 25 Employees and Contractors of the Licensee** to access and use the Components and Templates. + +You **can**: + +- Use the Components and Templates to create unlimited End Products. +- Modify the Components and Templates to create derivative components and templates. Those components and templates are subject to this license. +- Use the Components and Templates to create unlimited End Products for unlimited Clients. +- Use the Components and Templates to create End Products where the End Product is sold to End Users. +- Use the Components and Templates to create End Products that are open source and freely available to End Users. + +You **cannot**: + +- Use the Components or Templates to create End Products that are designed to allow an End User to build their own End Products using the Components or Templates or derivatives of the Components or Templates. +- Re-distribute the Components or Templates or derivatives of the Components or Templates separately from an End Product. +- Use the Components or Templates to create End Products that are the property of any individual or entity other than the Licensee or Clients of the Licensee. +- Use the Components or Templates to produce anything that may be deemed by Tailwind Labs Inc, in their sole and absolute discretion, to be competitive or in conflict with the business of Tailwind Labs Inc. + +### Example usage + +Examples of usage **allowed** by the license: + +- Creating a website for your company. +- Creating a website or web application for a client that will be owned by that client. +- Creating a commercial SaaS application (like an invoicing app for example) where end users have to pay a fee to use the application. +- Creating a commercial self-hosted web application that is sold to end users for a one-time fee. +- Creating a web application where the primary purpose is clearly not to simply re-distribute the components or templates (like a conference organization app that uses the components or a template for its UI for example) that is free and open source, where the source code is publicly available. + +Examples of use **not allowed** by the license: + +- Creating a repository of your favorite Tailwind UI components or template (or derivatives based on Tailwind UI components or templates) and publishing it publicly. +- Creating a React or Vue version of Tailwind UI and making it available either for sale or for free. +- Creating a "website builder" project where end users can build their own websites using components or templates included with or derived from Tailwind UI. +- Creating a theme or template using the components or templates and making it available either for sale or for free. +- Creating an admin panel tool (like [Laravel Nova](https://nova.laravel.com/) or [ActiveAdmin](https://activeadmin.info/)) that is made available either for sale or for free. +- Creating any End Product that is not the sole property of either your company or a client of your company. For example your employees/contractors can't use your company Tailwind UI license to build their own websites or side projects. + +### Team License Definitions + +Licensee is the business entity who has purchased a Team License. + +Components and Templates are the source code and design assets made available to the Licensee after purchasing a Tailwind UI license. + +End Product is any artifact produced that incorporates the Components or Templates or derivatives of the Components or Templates. + +End User is a user of an End Product. + +Employee is a full-time or part-time employee of the Licensee. + +Contractor is an individual or business entity contracted to perform services for the Licensee. + +Client is an individual or entity receiving custom professional services directly from the Licensee, produced specifically for that individual or entity. Customers of software-as-a-service products are not considered clients for the purpose of this document. + +## Enforcement + +If you are found to be in violation of the license, access to your Tailwind UI account will be terminated, and a refund may be issued at our discretion. When license violation is blatant and malicious (such as intentionally redistributing the Components or Templates through private warez channels), no refund will be issued. + +The copyright of the Components and Templates is owned by Tailwind Labs Inc. You are granted only the permissions described in this license; all other rights are reserved. Tailwind Labs Inc. reserves the right to pursue legal remedies for any unauthorized use of the Components or Templates outside the scope of this license. + +## Liability + +Tailwind Labs Inc.’s liability to you for costs, damages, or other losses arising from your use of the Components or Templates — including third-party claims against you — is limited to a refund of your license fee. Tailwind Labs Inc. may not be held liable for any consequential damages related to your use of the Components or Templates. + +This Agreement is governed by the laws of the Province of Ontario and the applicable laws of Canada. Legal proceedings related to this Agreement may only be brought in the courts of Ontario. You agree to service of process at the e-mail address on your original order. + +## Questions? + +Unsure which license you need, or unsure if your use case is covered by our licenses? + +Email us at [support@tailwindui.com](mailto:support@tailwindui.com) with your questions. diff --git a/apps/formbricks-com/mdx-components.tsx b/apps/formbricks-com/mdx-components.tsx new file mode 100644 index 0000000000..819168d274 --- /dev/null +++ b/apps/formbricks-com/mdx-components.tsx @@ -0,0 +1,9 @@ +import * as mdxComponents from '@/components/mdx' +import { type MDXComponents } from 'mdx/types' + +export function useMDXComponents(components: MDXComponents) { + return { + ...components, + ...mdxComponents, + } +} diff --git a/apps/formbricks-com/next.config.mjs b/apps/formbricks-com/next.config.mjs index 339e699170..579a40a2ad 100644 --- a/apps/formbricks-com/next.config.mjs +++ b/apps/formbricks-com/next.config.mjs @@ -1,130 +1,21 @@ -/** @type {import('next').NextConfig} */ +import nextMDX from '@next/mdx' -import rehypePrism from "@mapbox/rehype-prism"; -import nextMDX from "@next/mdx"; -import { withPlausibleProxy } from "next-plausible"; -import remarkGfm from "remark-gfm"; - -const nextConfig = { - reactStrictMode: true, - pageExtensions: ["ts", "tsx", "js", "jsx", "md", "mdx"], - transpilePackages: ["@formbricks/ui", "@formbricks/lib"], - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "seo-strapi-aws-s3.s3.eu-central-1.amazonaws.com", - port: "", - }, - ], - }, - async redirects() { - return [ - { - source: "/discord", - destination: "https://discord.gg/3YFcABF2Ts", - permanent: true, - }, - { - source: "/roadmap", - destination: "https://github.com/orgs/formbricks/projects/1", - permanent: true, - }, - { - source: "/github", - destination: "https://github.com/formbricks/formbricks", - permanent: true, - }, - { - source: "/deal", - destination: "/concierge", - permanent: false, - }, - { - source: "/privacy", - destination: "/privacy-policy", - permanent: true, - }, - { - source: "/form-hq", - destination: "/", - permanent: true, - }, - { - source: "/docs", - destination: "/docs/introduction/what-is-formbricks", - permanent: true, - }, - { - source: "/docs/getting-started/nextjs", - destination: "/docs/getting-started/nextjs-app", - permanent: true, - }, - { - source: "/docs/formbricks-hq/self-hosting", - destination: "/docs", - permanent: true, - }, - { - source: "/docs/react-form-library/getting-started", - destination: "/docs", - permanent: true, - }, - { - source: "/docs/react-form-library/work-with-components", - destination: "/docs", - permanent: true, - }, - { - source: "/docs/react-form-library/introduction", - destination: "/docs", - permanent: true, - }, - { - source: "/docs/formbricks-hq/schema", - destination: "/docs", - permanent: true, - }, - { - source: "/docs/events/why", - destination: "/docs/actions/why", - permanent: true, - }, - { - source: "/docs/events/code", - destination: "/docs/actions/code", - permanent: true, - }, - { - source: "/docs/events/code", - destination: "/docs/actions/code", - permanent: true, - }, - { - source: "/pmf", - destination: "/", - permanent: true, - }, - { - source: "/blog/v1-and-how-we-got-here", - destination: "/blog/experience-management-open-source", - permanent: true, - }, - ]; - }, -}; +import { recmaPlugins } from './src/mdx/recma.mjs' +import { rehypePlugins } from './src/mdx/rehype.mjs' +import { remarkPlugins } from './src/mdx/remark.mjs' +import withSearch from './src/mdx/search.mjs' const withMDX = nextMDX({ - extension: /\.mdx?$/, options: { - // If you use remark-gfm, you'll need to use next.config.mjs - // as the package is ESM only - // https://github.com/remarkjs/remark-gfm#install - remarkPlugins: [remarkGfm], - rehypePlugins: [rehypePrism], - // If you use `MDXProvider`, uncomment the following line. - // providerImportSource: "@mdx-js/react", + remarkPlugins, + rehypePlugins, + recmaPlugins, }, -}); +}) -export default withPlausibleProxy({ customDomain: "https://plausible.formbricks.com" })(withMDX(nextConfig)); +/** @type {import('next').NextConfig} */ +const nextConfig = { + pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'], +} + +export default withSearch(withMDX(nextConfig)) diff --git a/apps/formbricks-com/package.json b/apps/formbricks-com/package.json index 4b3f02d7da..cfbc3430be 100644 --- a/apps/formbricks-com/package.json +++ b/apps/formbricks-com/package.json @@ -1,48 +1,56 @@ { "name": "@formbricks/formbricks-com", - "version": "0.1.0", + "version": "1.0.0", "private": true, "scripts": { "clean": "rimraf .turbo node_modules .next", - "dev": "next dev -p 3001", + "dev": "next dev --port 3001", "build": "next build", - "postbuild": "next-sitemap", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "postbuild": "next-sitemap" }, + "browserslist": "defaults, not ie <= 11", "dependencies": { - "@calcom/embed-react": "^1.3.0", - "@docsearch/react": "^3.5.1", - "@formbricks/lib": "workspace:*", - "@formbricks/types": "workspace:*", - "@formbricks/ui": "workspace:*", - "@headlessui/react": "^1.7.16", - "@heroicons/react": "^2.0.18", - "@mapbox/rehype-prism": "^0.8.0", + "@algolia/autocomplete-core": "^1.7.3", + "@headlessui/react": "^1.7.15", + "@headlessui/tailwindcss": "^0.2.0", "@mdx-js/loader": "^2.3.0", "@mdx-js/react": "^2.3.0", - "@next/mdx": "^13.4.12", - "@paralleldrive/cuid2": "^2.2.1", - "clsx": "^2.0.0", - "lottie-web": "^5.12.2", - "next": "13.4.12", - "next-plausible": "^3.10.1", - "next-seo": "^6.1.0", - "next-sitemap": "^4.1.8", - "node-fetch": "^3.3.2", - "prism-react-renderer": "^2.0.6", - "prismjs": "^1.29.0", + "@next/mdx": "13.4.16", + "@sindresorhus/slugify": "^2.1.1", + "@tailwindcss/typography": "^0.5.8", + "@types/node": "20.4.7", + "@types/react": "18.2.18", + "@types/react-dom": "18.2.7", + "@types/react-highlight-words": "^0.16.4", + "acorn": "^8.8.1", + "autoprefixer": "^10.4.7", + "clsx": "^1.2.0", + "fast-glob": "^3.3.0", + "flexsearch": "^0.7.31", + "framer-motion": "7.8.1", + "mdast-util-to-string": "^3.2.0", + "mdx-annotations": "^0.1.1", + "next": "13.4.16", + "next-themes": "^0.2.1", "react": "18.2.0", "react-dom": "18.2.0", - "react-icons": "^4.10.1", - "react-markdown": "^8.0.7", - "react-responsive-embed": "^2.1.0", + "react-highlight-words": "^0.20.0", + "remark": "^14.0.2", "remark-gfm": "^3.0.1", - "sharp": "^0.32.4" + "remark-mdx": "^2.3.0", + "shiki": "^0.11.1", + "simple-functional-loader": "^1.2.1", + "tailwindcss": "^3.3.3", + "typescript": "5.1.6", + "unist-util-filter": "^4.0.1", + "unist-util-visit": "^4.1.1", + "zustand": "^4.3.2" }, "devDependencies": { "@formbricks/tsconfig": "workspace:*", - "@types/prismjs": "^1.26.0", - "eslint-config-formbricks": "workspace:*" + "eslint-config-formbricks": "workspace:*", + "sharp": "^0.32.0" } } diff --git a/apps/formbricks-com/prettier.config.js b/apps/formbricks-com/prettier.config.js new file mode 100644 index 0000000000..6b16840e2b --- /dev/null +++ b/apps/formbricks-com/prettier.config.js @@ -0,0 +1,6 @@ +/** @type {import('prettier').Options} */ +module.exports = { + singleQuote: true, + semi: false, + plugins: ['prettier-plugin-tailwindcss'], +} diff --git a/apps/formbricks-com/src/app/attachments/page.mdx b/apps/formbricks-com/src/app/attachments/page.mdx new file mode 100644 index 0000000000..cd36364d74 --- /dev/null +++ b/apps/formbricks-com/src/app/attachments/page.mdx @@ -0,0 +1,363 @@ +export const metadata = { + title: 'Attachments', + description: + 'On this page, we’ll dive into the different attachment endpoints you can use to manage attachments programmatically.', +} + +# Attachments + +Attachments are how you share things in Protocol — they allow you to send all sorts of files to your contacts and groups. On this page, we'll dive into the different attachment endpoints you can use to manage attachments programmatically. We'll look at how to query, upload, update, and delete attachments. {{ className: 'lead' }} + +## The attachment model + +The attachment model contains all the information about the files you send to your contacts and groups, including the name, type, and size. + +### Properties + + + + Unique identifier for the attachment. + + + Unique identifier for the message associated with the attachment. + + + The filename for the attachment. + + + The URL for the attached file. + + + The MIME type of the attached file. + + + The file size of the attachment in bytes. + + + Timestamp of when the attachment was created. + + + +--- + +## List all attachments {{ tag: 'GET', label: '/v1/attachments' }} + + + + + This endpoint allows you to retrieve a paginated list of all your attachments (in a conversation if a conversation id is provided). By default, a maximum of ten attachments are shown per page. + + ### Optional attributes + + + + Limit to attachments from a given conversation. + + + Limit the number of attachments returned. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -G https://api.protocol.chat/v1/attachments \ + -H "Authorization: Bearer {token}" \ + -d conversation_id="xgQQXg3hrtjh7AvZ" \ + -d limit=10 + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.attachments.list() + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.attachments.list() + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->attachments->list(); + ``` + + + + ```json {{ title: 'Response' }} + { + "has_more": false, + "data": [ + { + "id": "Nc6yKKMpcxiiFxp6", + "message_id": "LoPsJaMcPBuFNjg1", + "filename": "Invoice_room_service__Plaza_Hotel.pdf", + "file_url": "https://assets.protocol.chat/attachments/Invoice_room_service__Plaza_Hotel.pdf", + "file_type": "application/pdf", + "file_size": 21352, + "created_at": 692233200 + }, + { + "id": "hSIhXBhNe8X1d8Et" + // ... + } + ] + } + ``` + + + + +--- + +## Create an attachment {{ tag: 'POST', label: '/v1/attachments' }} + + + + + This endpoint allows you to upload a new attachment to a conversation. See the code examples for how to send the file to the Protocol API. + + ### Required attributes + + + + The file you want to add as an attachment. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/attachments \ + -H "Authorization: Bearer {token}" \ + -F file="../Invoice_room_service__Plaza_Hotel.pdf" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.attachments.create({ file }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.attachments.create(file=file) + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->attachments->create([ + 'file' => $file, + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "Nc6yKKMpcxiiFxp6", + "message_id": "LoPsJaMcPBuFNjg1", + "filename": "Invoice_room_service__Plaza_Hotel.pdf", + "file_url": "https://assets.protocol.chat/attachments/Invoice_room_service__Plaza_Hotel.pdf", + "file_type": "application/pdf", + "file_size": 21352, + "created_at": 692233200 + } + ``` + + + + +--- + +## Retrieve an attachment {{ tag: 'GET', label: '/v1/attachments/:id' }} + + + + + This endpoint allows you to retrieve an attachment by providing the attachment id. Refer to [the list](#the-attachment-model) at the top of this page to see which properties are included with attachment objects. + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/attachments/Nc6yKKMpcxiiFxp6 \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.attachments.get('Nc6yKKMpcxiiFxp6') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.attachments.get("Nc6yKKMpcxiiFxp6") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->attachments->get('Nc6yKKMpcxiiFxp6'); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "Nc6yKKMpcxiiFxp6", + "message_id": "LoPsJaMcPBuFNjg1", + "filename": "Invoice_room_service__Plaza_Hotel.pdf", + "file_url": "https://assets.protocol.chat/attachments/Invoice_room_service__Plaza_Hotel.pdf", + "file_type": "application/pdf", + "file_size": 21352, + "created_at": 692233200 + } + ``` + + + + +--- + +## Update an attachment {{ tag: 'PUT', label: '/v1/attachments/:id' }} + + + + + This endpoint allows you to perform an update on an attachment. Currently, the only supported type of update is changing the filename. + + ### Optional attributes + + + + The new filename for the attachment. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -X PUT https://api.protocol.chat/v1/attachments/Nc6yKKMpcxiiFxp6 \ + -H "Authorization: Bearer {token}" \ + -d filename="Invoice_room_service__Plaza_Hotel_updated.pdf" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.attachments.update('Nc6yKKMpcxiiFxp6', { + filename: 'Invoice_room_service__Plaza_Hotel_updated.pdf', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.attachments.update("Nc6yKKMpcxiiFxp6", filename="Invoice_room_service__Plaza_Hotel_updated.pdf") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->attachments->update('Nc6yKKMpcxiiFxp6', [ + 'filename' => 'Invoice_room_service__Plaza_Hotel_updated.pdf', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "Nc6yKKMpcxiiFxp6", + "message_id": "LoPsJaMcPBuFNjg1", + "filename": "Invoice_room_service__Plaza_Hotel.pdf", + "file_url": "https://assets.protocol.chat/attachments/Invoice_room_service__Plaza_Hotel_updated.pdf", + "file_type": "application/pdf", + "file_size": 21352, + "created_at": 692233200 + } + ``` + + + + +--- + +## Delete an attachment {{ tag: 'DELETE', label: '/v1/attachments/:id' }} + + + + + This endpoint allows you to delete attachments. Note: This will permanently delete the file. + + + + + + + ```bash {{ title: 'cURL' }} + curl -X DELETE https://api.protocol.chat/v1/attachments/Nc6yKKMpcxiiFxp6 \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.attachments.delete('Nc6yKKMpcxiiFxp6') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.attachments.delete("Nc6yKKMpcxiiFxp6") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->attachments->delete('Nc6yKKMpcxiiFxp6'); + ``` + + + + + diff --git a/apps/formbricks-com/src/app/authentication/page.mdx b/apps/formbricks-com/src/app/authentication/page.mdx new file mode 100644 index 0000000000..e9e2f8e0f7 --- /dev/null +++ b/apps/formbricks-com/src/app/authentication/page.mdx @@ -0,0 +1,44 @@ +export const metadata = { + title: 'Authentication', + description: + 'In this guide, we’ll look at how authentication works. Protocol offers two ways to authenticate your API requests: Basic authentication and OAuth2 with a token.', +} + +# Authentication + +You'll need to authenticate your requests to access any of the endpoints in the Protocol API. In this guide, we'll look at how authentication works. Protocol offers two ways to authenticate your API requests: Basic authentication and OAuth2 with a token — OAuth2 is the recommended way. {{ className: 'lead' }} + +## Basic authentication + +With basic authentication, you use your username and password to authenticate your HTTP requests. Unless you have a very good reason, you probably shouldn't use basic auth. Here's how to authenticate using cURL: + +```bash {{ title: 'Example request with basic auth' }} +curl https://api.protocol.chat/v1/conversations \ + -u username:password +``` + +Please don't commit your Protocol password to GitHub! + +## OAuth2 with bearer token + +The recommended way to authenticate with the Protocol API is by using OAuth2. When establishing a connection using OAuth2, you will need your access token — you will find it in the [Protocol dashboard](#) under API settings. Here's how to add the token to the request header using cURL: + +```bash {{ title: 'Example request with bearer token' }} +curl https://api.protocol.chat/v1/conversations \ + -H "Authorization: Bearer {token}" +``` + +Always keep your token safe and reset it if you suspect it has been compromised. + +## Using an SDK + +If you use one of our official SDKs, you won't have to worry about any of the above — fetch your access token from the [Protocol dashboard](#) under API settings, and the client library will take care of the rest. All the client libraries use OAuth2 behind the scenes. + +
+
diff --git a/apps/formbricks-com/src/app/contacts/page.mdx b/apps/formbricks-com/src/app/contacts/page.mdx new file mode 100644 index 0000000000..b75afa9a9f --- /dev/null +++ b/apps/formbricks-com/src/app/contacts/page.mdx @@ -0,0 +1,394 @@ +export const metadata = { + title: 'Contacts', + description: + 'On this page, we’ll dive into the different contact endpoints you can use to manage contacts programmatically.', +} + +# Contacts + +As the name suggests, contacts are a core part of Protocol — the very reason Protocol exists is so you can have secure conversations with your contacts. On this page, we'll dive into the different contact endpoints you can use to manage contacts programmatically. We'll look at how to query, create, update, and delete contacts. {{ className: 'lead' }} + +## The contact model + +The contact model contains all the information about your contacts, such as their username, avatar, and phone number. It also contains a reference to the conversation between you and the contact and information about when they were last active on Protocol. + +### Properties + + + + Unique identifier for the contact. + + + The username for the contact. + + + The phone number for the contact. + + + The avatar image URL for the contact. + + + The contact display name in the contact list. By default, this is just the + username. + + + Unique identifier for the conversation associated with the contact. + + + Timestamp of when the contact was last active on the platform. + + + Timestamp of when the contact was created. + + + +--- + +## List all contacts {{ tag: 'GET', label: '/v1/contacts' }} + + + + + This endpoint allows you to retrieve a paginated list of all your contacts. By default, a maximum of ten contacts are shown per page. + + ### Optional attributes + + + + Limit the number of contacts returned. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -G https://api.protocol.chat/v1/contacts \ + -H "Authorization: Bearer {token}" \ + -d active=true \ + -d limit=10 + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.contacts.list() + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.contacts.list() + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->contacts->list(); + ``` + + + + ```json {{ title: 'Response' }} + { + "has_more": false, + "data": [ + { + "id": "WAz8eIbvDR60rouK", + "username": "FrankMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/frank.jpg", + "display_name": null, + "conversation_id": "xgQQXg3hrtjh7AvZ", + "last_active_at": 705103200, + "created_at": 692233200 + }, + { + "id": "hSIhXBhNe8X1d8Et" + // ... + } + ] + } + ``` + + + + +--- + +## Create a contact {{ tag: 'POST', label: '/v1/contacts' }} + + + + + This endpoint allows you to add a new contact to your contact list in Protocol. To add a contact, you must provide their Protocol username and phone number. + + ### Required attributes + + + + The username for the contact. + + + The phone number for the contact. + + + + ### Optional attributes + + + + The avatar image URL for the contact. + + + The contact display name in the contact list. By default, this is just the username. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/contacts \ + -H "Authorization: Bearer {token}" \ + -d username="FrankMcCallister" \ + -d phone_number="1-800-759-3000" \ + -d avatar_url="https://assets.protocol.chat/avatars/frank.jpg" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.contacts.create({ + username: 'FrankMcCallister', + phone_number: '1-800-759-3000', + avatar_url: 'https://assets.protocol.chat/avatars/frank.jpg', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.contacts.create( + username="FrankMcCallister", + phone_number="1-800-759-3000", + avatar_url="https://assets.protocol.chat/avatars/frank.jpg", + ) + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->contacts->create([ + 'username' => 'FrankMcCallister', + 'phone_number' => '1-800-759-3000', + 'avatar_url' => 'https://assets.protocol.chat/avatars/frank.jpg', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "WAz8eIbvDR60rouK", + "username": "FrankMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/frank.jpg", + "display_name": null, + "conversation_id": "xgQQXg3hrtjh7AvZ", + "last_active_at": null, + "created_at": 692233200 + } + ``` + + + + +--- + +## Retrieve a contact {{ tag: 'GET', label: '/v1/contacts/:id' }} + + + + + This endpoint allows you to retrieve a contact by providing their Protocol id. Refer to [the list](#the-contact-model) at the top of this page to see which properties are included with contact objects. + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/contacts/WAz8eIbvDR60rouK \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.contacts.get('WAz8eIbvDR60rouK') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.contacts.get("WAz8eIbvDR60rouK") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->contacts->get('WAz8eIbvDR60rouK'); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "WAz8eIbvDR60rouK", + "username": "FrankMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/frank.jpg", + "display_name": null, + "conversation_id": "xgQQXg3hrtjh7AvZ", + "last_active_at": 705103200, + "created_at": 692233200 + } + ``` + + + + +--- + +## Update a contact {{ tag: 'PUT', label: '/v1/contacts/:id' }} + + + + + This endpoint allows you to perform an update on a contact. Currently, the only attribute that can be updated on contacts is the `display_name` attribute which controls how a contact appears in your contact list in Protocol. + + ### Optional attributes + + + + The contact display name in the contact list. By default, this is just the username. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -X PUT https://api.protocol.chat/v1/contacts/WAz8eIbvDR60rouK \ + -H "Authorization: Bearer {token}" \ + -d display_name="UncleFrank" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.contacts.update('WAz8eIbvDR60rouK', { + display_name: 'UncleFrank', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.contacts.update("WAz8eIbvDR60rouK", display_name="UncleFrank") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->contacts->update('WAz8eIbvDR60rouK', [ + 'display_name' => 'UncleFrank', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "WAz8eIbvDR60rouK", + "username": "FrankMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/frank.jpg", + "display_name": "UncleFrank", + "conversation_id": "xgQQXg3hrtjh7AvZ", + "last_active_at": 705103200, + "created_at": 692233200 + } + ``` + + + + +--- + +## Delete a contact {{ tag: 'DELETE', label: '/v1/contacts/:id' }} + + + + + This endpoint allows you to delete contacts from your contact list in Protocol. Note: This will also delete your conversation with the given contact. + + + + + + + ```bash {{ title: 'cURL' }} + curl -X DELETE https://api.protocol.chat/v1/contacts/WAz8eIbvDR60rouK \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.contacts.delete('WAz8eIbvDR60rouK') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.contacts.delete("WAz8eIbvDR60rouK") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->contacts->delete('WAz8eIbvDR60rouK'); + ``` + + + + + diff --git a/apps/formbricks-com/src/app/conversations/page.mdx b/apps/formbricks-com/src/app/conversations/page.mdx new file mode 100644 index 0000000000..87fae527ab --- /dev/null +++ b/apps/formbricks-com/src/app/conversations/page.mdx @@ -0,0 +1,407 @@ +export const metadata = { + title: 'Conversations', + description: + 'On this page, we’ll dive into the different conversation endpoints you can use to manage conversations programmatically.', +} + +# Conversations + +Conversations are an essential part of Protocol — they are the containers for the messages between you, your contacts, and groups. On this page, we’ll dive into the different conversation endpoints you can use to manage conversations programmatically. We'll look at how to query, create, update, and delete conversations. {{ className: 'lead' }} + +## The conversation model + +The conversation model contains all the information about the conversations between you and your contacts. In addition, conversations can also be group-based with more than one contact, they can have a pinned message, and they can be muted. + +### Properties + + + + Unique identifier for the conversation. + + + Unique identifier for the other contact in the conversation. + + + Unique identifier for the group that the conversation belongs to. + + + Unique identifier for the pinned message. + + + Whether or not the conversation has been pinned. + + + Whether or not the conversation has been muted. + + + Timestamp of when the conversation was last active. + + + Timestamp of when the conversation was last opened by the authenticated + user. + + + Timestamp of when the conversation was created. + + + Timestamp of when the conversation was archived. + + + +--- + +## List all conversations {{ tag: 'GET', label: '/v1/conversations' }} + + + + + This endpoint allows you to retrieve a paginated list of all your conversations. By default, a maximum of ten conversations are shown per page. + + ### Optional attributes + + + + Limit the number of conversations returned. + + + Only show conversations that are muted when set to `true`. + + + Only show conversations that are archived when set to `true`. + + + Only show conversations that are pinned when set to `true`. + + + Only show conversations for the specified group. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -G https://api.protocol.chat/v1/conversations \ + -H "Authorization: Bearer {token}" \ + -d limit=10 + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.conversations.list() + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.conversations.list() + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->conversations->list(); + ``` + + + + ```json {{ title: 'Response' }} + { + "has_more": false, + "data": [ + { + "id": "xgQQXg3hrtjh7AvZ", + "contact_id": "WAz8eIbvDR60rouK", + "group_id": null, + "pinned_message_id": null, + "is_pinned": false, + "is_muted": false, + "last_active_at": 705103200, + "last_opened_at": 705103200, + "created_at": 692233200, + "archived_at": null + }, + { + "id": "hSIhXBhNe8X1d8Et" + // ... + } + ] + } + ``` + + + + +--- + +## Create a conversation {{ tag: 'POST', label: '/v1/conversations' }} + + + + + This endpoint allows you to add a new conversation between you and a contact or group. A contact or group id is required to create a conversation. + + ### Required attributes + + + + Unique identifier for the other contact in the conversation. + + + Unique identifier for the group that the conversation belongs to. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/conversations \ + -H "Authorization: Bearer {token}" \ + -d 'contact_id'="WAz8eIbvDR60rouK" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.conversations.create({ + contact_id: 'WAz8eIbvDR60rouK', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.conversations.create(contact_id="WAz8eIbvDR60rouK") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->conversations->create([ + 'contact_id' => 'WAz8eIbvDR60rouK', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "xgQQXg3hrtjh7AvZ", + "contact_id": "WAz8eIbvDR60rouK", + "group_id": null, + "pinned_message_id": null, + "is_pinned": false, + "is_muted": false, + "last_active_at": null, + "last_opened_at": null, + "created_at": 692233200, + "archived_at": null + } + ``` + + + + +--- + +## Retrieve a conversation {{ tag: 'GET', label: '/v1/conversations/:id' }} + + + + + This endpoint allows you to retrieve a conversation by providing the conversation id. Refer to [the list](#the-conversation-model) at the top of this page to see which properties are included with conversation objects. + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/conversations/xgQQXg3hrtjh7AvZ \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.conversations.get('xgQQXg3hrtjh7AvZ') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.conversations.get("xgQQXg3hrtjh7AvZ") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->conversations->get('xgQQXg3hrtjh7AvZ'); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "xgQQXg3hrtjh7AvZ", + "contact_id": "WAz8eIbvDR60rouK", + "group_id": null, + "pinned_message_id": null, + "is_pinned": false, + "is_muted": false, + "last_active_at": 705103200, + "last_opened_at": 705103200, + "created_at": 692233200, + "archived_at": null + } + ``` + + + + +--- + +## Update a conversation {{ tag: 'PUT', label: '/v1/conversations/:id' }} + + + + + This endpoint allows you to perform an update on a conversation. Examples of updates are pinning a message, muting or archiving the conversation, or pinning the conversation itself. + + ### Optional attributes + + + + Unique identifier for the pinned message. + + + Whether or not the conversation has been pinned. + + + Whether or not the conversation has been muted. + + + Timestamp of when the conversation was archived. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -X PUT https://api.protocol.chat/v1/conversations/xgQQXg3hrtjh7AvZ \ + -H "Authorization: Bearer {token}" \ + -d 'is_muted'=true + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.conversations.update('xgQQXg3hrtjh7AvZ', { + is_muted: true, + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.conversations.update("xgQQXg3hrtjh7AvZ", is_muted=True) + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->conversations->update('xgQQXg3hrtjh7AvZ', [ + 'is_muted' => true, + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "xgQQXg3hrtjh7AvZ", + "contact_id": "WAz8eIbvDR60rouK", + "group_id": null, + "pinned_message_id": null, + "is_pinned": false, + "is_muted": true, + "last_active_at": 705103200, + "last_opened_at": 705103200, + "created_at": 692233200, + "archived_at": null + } + ``` + + + + +--- + +## Delete a conversation {{ tag: 'DELETE', label: '/v1/conversations/:id' }} + + + + + This endpoint allows you to delete your conversations in Protocol. Note: This will permanently delete the conversation and all its messages — archive it instead if you want to be able to restore it later. + + + + + + + ```bash {{ title: 'cURL' }} + curl -X DELETE https://api.protocol.chat/v1/conversations/xgQQXg3hrtjh7AvZ \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.conversations.delete('xgQQXg3hrtjh7AvZ') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.conversations.delete("xgQQXg3hrtjh7AvZ") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->conversations->delete('xgQQXg3hrtjh7AvZ'); + ``` + + + + + diff --git a/apps/formbricks-com/src/app/errors/page.mdx b/apps/formbricks-com/src/app/errors/page.mdx new file mode 100644 index 0000000000..15f070b4e4 --- /dev/null +++ b/apps/formbricks-com/src/app/errors/page.mdx @@ -0,0 +1,70 @@ +export const metadata = { + title: 'Errors', + description: + 'In this guide, we will talk about what happens when something goes wrong while you work with the API.', +} + +# Errors + +In this guide, we will talk about what happens when something goes wrong while you work with the API. Mistakes happen, and mostly they will be yours, not ours. Let's look at some status codes and error types you might encounter. {{ className: 'lead' }} + +You can tell if your request was successful by checking the status code when receiving an API response. If a response comes back unsuccessful, you can use the error type and error message to figure out what has gone wrong and do some rudimentary debugging (before contacting support). + + + Before reaching out to support with an error, please be aware that 99% of all + reported errors are, in fact, user errors. Therefore, please carefully check + your code before contacting Protocol support. + + +--- + +## Status codes + +Here is a list of the different categories of status codes returned by the Protocol API. Use these to understand if a request was successful. + + + + A 2xx status code indicates a successful response. + + + A 4xx status code indicates a client error — this means it's a _you_ + problem. + + + A 5xx status code indicates a server error — you won't be seeing these. + + + +--- + +## Error types + + + + + Whenever a request is unsuccessful, the Protocol API will return an error response with an error type and message. You can use this information to understand better what has gone wrong and how to fix it. Most of the error messages are pretty helpful and actionable. + + Here is a list of the two error types supported by the Protocol API — use these to understand what you have done wrong. + + + + This means that we made an error, which is highly speculative and unlikely. + + + This means that you made an error, which is much more likely. + + + + + + + ```bash {{ title: "Error response" }} + { + "type": "api_error", + "message": "No way this is happening!?", + "documentation_url": "https://protocol.chat/docs/errors/api_error" + } + ``` + + + diff --git a/apps/formbricks-com/src/app/favicon.ico b/apps/formbricks-com/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2deafb7ba9477100832fca12b760676acd1cbb75 GIT binary patch literal 15086 zcmeI3PiPcZ9LL|1nuPi%L9C(@XXziPpqQ48$*CKmLa%x#s0VGOp*<<&;4xZg4~5>9 z-isdmgIGK%p#_U5_0I|g!6ft$@z6H5v{a3WpRbu&*KuYtZ66~io?hFm`h68u*T;u?IA*KtVUzhd|e_QSHg#gWo~#qbw=2|am=!NPyV z@C3eBoxH?g>AzwSS77If%0SDXv32^d82*HFa0Cv*rxtvI?k?C0-HnVT_2ZtOL0@Mj zm5UGHEHIWO-sbEN>b1)M+J5;RKSqyN20Cpc$cg`oMc?^fw6Xt+VG_33#DIPt@~1YJ zjsjG28S}mb&uAvzWiH zMgLBY{Fg6lQ~Q6r)QSF?9QiL_tk!YS*V?_-v$M>LG;QlQ&x2|EKG37i8n~PT|K-CQ zfnPR~dV}z53uBP&K^vdLx_%6okdK=fhiu7aL%s*G(9SwI4El{uznRWKn%uR~QJW7z zHV(nMz;PzVv*l3Mx0I!% zTsP(apPW;t6JH<+nNH^4QTAg=P8rjM)IO~u3`2FF7JIoCI~d>B#bSC{T*vMT_zq6N z<}7R^wTVp+CPDYdE%=b%y_>c_3VX6Y1+p*h!w6V?M<&IXbPYRU`|_b_`;%hq%ZH}y zFG{d4AB6S?m9xr;6!zuAG<*xY;iE;^!FB!S+L1Kw!8PHF368p0WL>v_INH`|6h;VP%{T8OJaC_n@zZ_LbY7vmf09 zO&EXI|1SUB{TF@vW&Qo5=dZi}@_qkpV2rdUD()So(Q>uDAtwElf8B5)L;F9-Mx1?> zbA1o!y|K|)!}ZnX-Xz<;ef7atpm|TYje5`3mfB2=J@5@Z&A~r|UqJ8J_1aZkwV}2m z=kzS5%>NA!VMdg}1J-9|Sd*DCrVO4>53*tYqdmbI#+cSAdZ7r_b&8nX$;6=bfqf90 z!!#3nP;V3H9aMQJ(^dy{JkT>#qYpJ7 zj~eT!GU?WipPozSE$U16rRNUkLvS7DAj+o7bWJ)#LH=sZ_Xhk7KfyTv8)ckTjWkT5 F`wWs{%d-Fg literal 0 HcmV?d00001 diff --git a/apps/formbricks-com/src/app/groups/page.mdx b/apps/formbricks-com/src/app/groups/page.mdx new file mode 100644 index 0000000000..e30478703c --- /dev/null +++ b/apps/formbricks-com/src/app/groups/page.mdx @@ -0,0 +1,448 @@ +export const metadata = { + title: 'Groups', + description: + 'On this page, we’ll dive into the different group endpoints you can use to manage groups programmatically.', +} + +# Groups + +Groups are where communities live in Protocol — they are a collection of contacts you're talking to all at once. On this page, we'll dive into the different group endpoints you can use to manage groups programmatically. We'll look at how to query, create, update, and delete groups. {{ className: 'lead' }} + +## The group model + +The group model contains all the information about your groups, including what contacts are in the group and the group's name, description, and avatar. + +### Properties + + + + Unique identifier for the group. + + + The name for the group. + + + The description for the group. + + + The avatar image URL for the group. + + + Unique identifier for the conversation that belongs to the group. + + + An array of contact objects that are members of the group. + + + Timestamp of when the group was created. + + + Timestamp of when the group was archived. + + + +--- + +## List all groups {{ tag: 'GET', label: '/v1/groups' }} + + + + + This endpoint allows you to retrieve a paginated list of all your groups. By default, a maximum of ten groups are shown per page. + + ### Optional attributes + + + + Limit the number of groups returned. + + + Only show groups that are archived when set to `true`. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -G https://api.protocol.chat/v1/groups \ + -H "Authorization: Bearer {token}" \ + -d limit=10 + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.groups.list() + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.groups.list() + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->groups->list(); + ``` + + + + ```json {{ title: 'Response' }} + { + "has_more": false, + "data": [ + { + "id": "l7cGNIBKZiNJ6wqF", + "name": "Plaza Hotel", + "description": "World-renowned.", + "avatar_url": "https://assets.protocol.chat/avatars/plazahotel.jpg", + "conversation_id": "ZYjVAbCE9g5XRlra", + "contacts": [ + { + "username": "Hector" + // ... + }, + { + "username": "Cedric" + // ... + }, + { + "username": "Hester" + // ... + }, + { + "username": "Cliff" + // ... + } + ], + "created_at": 692233200, + "archived_at": null + }, + { + "id": "hSIhXBhNe8X1d8Et" + // ... + } + ] + } + ``` + + + + +--- + +## Create a group {{ tag: 'POST', label: '/v1/groups' }} + + + + + This endpoint allows you to create a new group conversation between you and a group of your Protocol contacts. + + ### Required attributes + + + + The name for the group. + + + + ### Optional attributes + + + + The description for the group. + + + The avatar image URL for the group. + + + An array of contact objects that are members of the group. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/groups \ + -H "Authorization: Bearer {token}" \ + -d name="Plaza Hotel" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.groups.create({ + name: 'Plaza Hotel', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.groups.create(name="Plaza Hotel") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->groups->create([ + 'name' => 'Plaza Hotel', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "l7cGNIBKZiNJ6wqF", + "name": "Plaza Hotel", + "description": null, + "avatar_url": null, + "conversation_id": "ZYjVAbCE9g5XRlra", + "contacts": [], + "created_at": 692233200, + "archived_at": null + } + ``` + + + + +--- + +## Retrieve a group {{ tag: 'GET', label: '/v1/groups/:id' }} + + + + + This endpoint allows you to retrieve a group by providing the group id. Refer to [the list](#the-group-model) at the top of this page to see which properties are included with group objects. + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/groups/L7cGNIBKZiNJ6wqF \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.groups.get('L7cGNIBKZiNJ6wqF') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.groups.get("L7cGNIBKZiNJ6wqF") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->groups->get('L7cGNIBKZiNJ6wqF'); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "l7cGNIBKZiNJ6wqF", + "name": "Plaza Hotel", + "description": "World-renowned.", + "avatar_url": "https://assets.protocol.chat/avatars/plazahotel.jpg", + "conversation_id": "ZYjVAbCE9g5XRlra", + "contacts": [ + { + "username": "Hector" + // ... + }, + { + "username": "Cedric" + // ... + }, + { + "username": "Hester" + // ... + }, + { + "username": "Cliff" + // ... + } + ], + "created_at": 692233200, + "archived_at": null + } + ``` + + + + +--- + +## Update a group {{ tag: 'PUT', label: '/v1/groups/:id' }} + + + + + This endpoint allows you to perform an update on a group. Examples of updates are changing the name, description, and avatar or adding and removing contacts from the group. + + ### Optional attributes + + + + The new name for the group. + + + The new description for the group. + + + The new avatar image URL for the group. + + + An array of contact objects that are members of the group. + + + Timestamp of when the group was archived. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -X PUT https://api.protocol.chat/v1/groups/L7cGNIBKZiNJ6wqF \ + -H "Authorization: Bearer {token}" \ + -d description="The finest in New York." + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.groups.update('L7cGNIBKZiNJ6wqF', { + description: 'The finest in New York.', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.groups.update("L7cGNIBKZiNJ6wqF", description="The finest in New York.") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->groups->update('L7cGNIBKZiNJ6wqF', [ + 'description' => 'The finest in New York.', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "l7cGNIBKZiNJ6wqF", + "name": "Plaza Hotel", + "description": "The finest in New York.", + "avatar_url": "https://assets.protocol.chat/avatars/plazahotel.jpg", + "conversation_id": "ZYjVAbCE9g5XRlra", + "contacts": [ + { + "username": "Hector" + // ... + }, + { + "username": "Cedric" + // ... + }, + { + "username": "Hester" + // ... + }, + { + "username": "Cliff" + // ... + } + ], + "created_at": 692233200, + "archived_at": null + }, + ``` + + + + +--- + +## Delete a group {{ tag: 'DELETE', label: '/v1/groups/:id' }} + + + + + This endpoint allows you to delete groups. Note: This will permanently delete the group, including the messages — archive it instead if you want to be able to restore it later. + + + + + + + ```bash {{ title: 'cURL' }} + curl -X DELETE https://api.protocol.chat/v1/groups/L7cGNIBKZiNJ6wqF \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.groups.delete('L7cGNIBKZiNJ6wqF') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.groups.delete("L7cGNIBKZiNJ6wqF") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->groups->delete('L7cGNIBKZiNJ6wqF'); + ``` + + + + + diff --git a/apps/formbricks-com/src/app/layout.tsx b/apps/formbricks-com/src/app/layout.tsx new file mode 100644 index 0000000000..35fea22fb2 --- /dev/null +++ b/apps/formbricks-com/src/app/layout.tsx @@ -0,0 +1,42 @@ +import glob from 'fast-glob' + +import { Providers } from '@/app/providers' +import { Layout } from '@/components/Layout' + +import '@/styles/tailwind.css' +import { type Metadata } from 'next' +import { type Section } from '@/components/SectionProvider' + +export const metadata: Metadata = { + title: { + template: '%s - Protocol API Reference', + default: 'Protocol API Reference', + }, +} + +export default async function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + let pages = await glob('**/*.mdx', { cwd: 'src/app' }) + let allSectionsEntries = (await Promise.all( + pages.map(async (filename) => [ + '/' + filename.replace(/(^|\/)page\.mdx$/, ''), + (await import(`./${filename}`)).sections, + ]), + )) as Array<[string, Array
]> + let allSections = Object.fromEntries(allSectionsEntries) + + return ( + + + +
+ {children} +
+
+ + + ) +} diff --git a/apps/formbricks-com/src/app/messages/page.mdx b/apps/formbricks-com/src/app/messages/page.mdx new file mode 100644 index 0000000000..e3cbca0a24 --- /dev/null +++ b/apps/formbricks-com/src/app/messages/page.mdx @@ -0,0 +1,441 @@ +export const metadata = { + title: 'Messages', + description: + 'On this page, we’ll dive into the different message endpoints you can use to manage messages programmatically.', +} + +# Messages + +Messages are what conversations are made of in Protocol — they are the basic building blocks of your conversations with your Protocol contacts. On this page, we'll dive into the different message endpoints you can use to manage messages programmatically. We'll look at how to query, send, update, and delete messages. {{ className: 'lead' }} + +## The message model + +The message model contains all the information about the messages and attachments you send to your contacts and groups, including how your contacts have reacted to them. + +### Properties + + + + Unique identifier for the message. + + + Unique identifier for the conversation the message belongs to. + + + The contact object for the contact who sent the message. + + + The message content. + + + An array of reaction objects associated with the message. + + + An array of attachment objects associated with the message. + + + Timestamp of when the message was read. + + + Timestamp of when the message was created. + + + Timestamp of when the message was last updated. + + + +--- + +## List all messages {{ tag: 'GET', label: '/v1/messages' }} + + + + + This endpoint allows you to retrieve a paginated list of all your messages (in a conversation if a conversation id is provided). By default, a maximum of ten messages are shown per page. + + ### Optional attributes + + + + Limit to messages from a given conversation. + + + Limit the number of messages returned. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -G https://api.protocol.chat/v1/messages \ + -H "Authorization: Bearer {token}" \ + -d conversation_id=xgQQXg3hrtjh7AvZ \ + -d limit=10 + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.messages.list() + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.messages.list() + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->messages->list(); + ``` + + + + ```json {{ title: 'Response' }} + { + "has_more": false, + "data": [ + { + "id": "SIuAFUNKdSYHZF2w", + "conversation_id": "xgQQXg3hrtjh7AvZ", + "contact": { + "id": "WAz8eIbvDR60rouK", + "username": "KevinMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/buzzboy.jpg", + "last_active_at": 705103200, + "created_at": 692233200 + }, + "message": "It’s a nice night for a neck injury.", + "reactions": [], + "attachments": [], + "read_at": 705103200, + "created_at": 692233200, + "updated_at": 692233200 + }, + { + "id": "hSIhXBhNe8X1d8Et", + // .. + } + ] + } + ``` + + + + +--- + +## Send a message {{ tag: 'POST', label: '/v1/messages' }} + + + + + This endpoint allows you to send a new message to one of your conversations. + + ### Required attributes + + + + Unique identifier for the conversation the message belongs to. + + + The message content. + + + + ### Optional attributes + + + + An array of attachment objects associated with the message. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/messages \ + -H "Authorization: Bearer {token}" \ + -d conversation_id="xgQQXg3hrtjh7AvZ" \ + -d message="You’re what the French call ‘les incompetents.’" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.messages.send({ + conversation_id: 'xgQQXg3hrtjh7AvZ', + message: 'You’re what the French call ‘les incompetents.’', + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.messages.send( + conversation_id="xgQQXg3hrtjh7AvZ", + message="You’re what the French call ‘les incompetents.’", + ) + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->messages->send([ + 'conversation_id' => 'xgQQXg3hrtjh7AvZ', + 'message' => 'You’re what the French call ‘les incompetents.’', + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "gWqY86BMFRiH5o11", + "conversation_id": "xgQQXg3hrtjh7AvZ", + "contact": { + "id": "inEIRvzjC6YLMX3o", + "username": "LinnieMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/linnie.jpg", + "last_active_at": 705103200, + "created_at": 692233200 + }, + "message": "You’re what the French call ‘les incompetents.’", + "reactions": [], + "attachments": [], + "read_at": null, + "created_at": 692233200, + "updated_at": null + } + ``` + + + + +--- + +## Retrieve a message {{ tag: 'GET', label: '/v1/messages/:id' }} + + + + + This endpoint allows you to retrieve a message by providing the message id. Refer to [the list](#the-message-model) at the top of this page to see which properties are included with message objects. + + + + + + + ```bash {{ title: 'cURL' }} + curl https://api.protocol.chat/v1/messages/SIuAFUNKdSYHZF2w \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.messages.get('SIuAFUNKdSYHZF2w') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.messages.get("SIuAFUNKdSYHZF2w") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->messages->get('SIuAFUNKdSYHZF2w'); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "SIuAFUNKdSYHZF2w", + "conversation_id": "xgQQXg3hrtjh7AvZ", + "contact": { + "id": "WAz8eIbvDR60rouK", + "username": "KevinMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/kevin.jpg", + "last_active_at": 705103200, + "created_at": 692233200 + }, + "message": "I’m traveling with my dad. He’s at a meeting. I hate meetings.", + "reactions": [], + "attachments": [], + "read_at": 705103200, + "created_at": 692233200, + "updated_at": 692233200 + } + ``` + + + + +--- + +## Update a message {{ tag: 'PUT', label: '/v1/messages/:id' }} + + + + + This endpoint allows you to perform an update on a message. Examples of updates are adding a reaction, editing the message, or adding an attachment. + + ### Optional attributes + + + + The message content. + + + An array of reaction objects associated with the message. + + + An array of attachment objects associated with the message. + + + + + + + + + ```bash {{ title: 'cURL' }} + curl -X PUT https://api.protocol.chat/v1/messages/SIuAFUNKdSYHZF2w \ + -H "Authorization: Bearer {token}" \ + -d reactions[red_angry_face][]="KateMcCallister" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.messages.update('SIuAFUNKdSYHZF2w', { + reactions: { + red_angry_face: ['KateMcCallister'] + } + }) + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.messages.update("SIuAFUNKdSYHZF2w", + reactions={"red_angry_face": ["KateMcCallister"]}) + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->messages->update('SIuAFUNKdSYHZF2w', [ + 'reactions' => [ + 'red_angry_face' => ['KateMcCallister'], + ], + ]); + ``` + + + + ```json {{ title: 'Response' }} + { + "id": "SIuAFUNKdSYHZF2w", + "conversation_id": "xgQQXg3hrtjh7AvZ", + "contact": { + "id": "WAz8eIbvDR60rouK", + "username": "KevinMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/buzzboy.jpg", + "last_active_at": 705103200, + "created_at": 692233200 + }, + "message": "I'm not apologizing. I'd rather kiss a toilet seat.", + "reactions": [ + { + "red_angry_face": [ + "KateMcCallister" + ] + } + ], + "attachments": [], + "read_at": 705103200, + "created_at": 692233200, + "updated_at": 692233200 + } + ``` + + + + +--- + +## Delete a message {{ tag: 'DELETE', label: '/v1/messages/:id' }} + + + + + This endpoint allows you to delete messages from your conversations. Note: This will permanently delete the message. + + + + + + + ```bash {{ title: 'cURL' }} + curl -X DELETE https://api.protocol.chat/v1/messages/SIuAFUNKdSYHZF2w \ + -H "Authorization: Bearer {token}" + ``` + + ```js + import ApiClient from '@example/protocol-api' + + const client = new ApiClient(token) + + await client.messages.delete('SIuAFUNKdSYHZF2w') + ``` + + ```python + from protocol_api import ApiClient + + client = ApiClient(token) + + client.messages.delete("SIuAFUNKdSYHZF2w") + ``` + + ```php + $client = new \Protocol\ApiClient($token); + + $client->messages->delete('SIuAFUNKdSYHZF2w'); + ``` + + + + + diff --git a/apps/formbricks-com/src/app/not-found.tsx b/apps/formbricks-com/src/app/not-found.tsx new file mode 100644 index 0000000000..ad652f957d --- /dev/null +++ b/apps/formbricks-com/src/app/not-found.tsx @@ -0,0 +1,24 @@ +import { Button } from '@/components/Button' +import { HeroPattern } from '@/components/HeroPattern' + +export default function NotFound() { + return ( + <> + +
+

+ 404 +

+

+ Page not found +

+

+ Sorry, we couldn’t find the page you’re looking for. +

+ +
+ + ) +} diff --git a/apps/formbricks-com/src/app/page.mdx b/apps/formbricks-com/src/app/page.mdx new file mode 100644 index 0000000000..fb5158b7ec --- /dev/null +++ b/apps/formbricks-com/src/app/page.mdx @@ -0,0 +1,42 @@ +import { Guides } from '@/components/Guides' +import { Resources } from '@/components/Resources' +import { HeroPattern } from '@/components/HeroPattern' + +export const metadata = { + title: 'API Documentation', + description: + 'Learn everything there is to know about the Protocol API and integrate Protocol into your product.', +} + +export const sections = [ + { title: 'Guides', id: 'guides' }, + { title: 'Resources', id: 'resources' }, +] + + + +# API Documentation + +Use the Protocol API to access contacts, conversations, group messages, and more and seamlessly integrate your product into the workflows of dozens of devoted Protocol users. {{ className: 'lead' }} + +
+
+ +## Getting started {{ anchor: false }} + +To get started, create a new application in your [developer settings](#), then read about how to make requests for the resources you need to access using our HTTP APIs or dedicated client SDKs. When your integration is ready to go live, publish it to our [integrations directory](#) to reach the Protocol community. {{ className: 'lead' }} + +
+
+ + + + diff --git a/apps/formbricks-com/src/app/pagination/page.mdx b/apps/formbricks-com/src/app/pagination/page.mdx new file mode 100644 index 0000000000..8bec705237 --- /dev/null +++ b/apps/formbricks-com/src/app/pagination/page.mdx @@ -0,0 +1,63 @@ +export const metadata = { + title: 'Pagination', + description: + 'In this guide, we will look at how to work with paginated responses when querying the Protocol API', +} + +# Pagination + +In this guide, we will look at how to work with paginated responses when querying the Protocol API. By default, all responses limit results to ten. However, you can go as high as 100 by adding a `limit` parameter to your requests. If you are using one of the official Protocol API client libraries, you don't need to worry about pagination, as it's all being taken care of behind the scenes. {{ className: 'lead' }} + +When an API response returns a list of objects, no matter the amount, pagination is supported. In paginated responses, objects are nested in a `data` attribute and have a `has_more` attribute that indicates whether you have reached the end of the last page. You can use the `starting_after` and `endding_before` query parameters to browse pages. + +## Example using cursors + + + + + In this example, we request the page that starts after the conversation with id `s4WycXedwhQrEFuM`. As a result, we get a list of three conversations and can tell by the `has_more` attribute that we have reached the end of the resultset. + + + + The last ID on the page you're currently on when you want to fetch the next page. + + + The first ID on the page you're currently on when you want to fetch the previous page. + + + Limit the number of items returned. + + + + + + + ```bash {{ title: 'Manual pagination using cURL' }} + curl -G https://api.protocol.chat/v1/conversations \ + -H "Authorization: Bearer {token}" \ + -d starting_after="s4WycXedwhQrEFuM" \ + -d limit=10 + ``` + + ```json {{ title: 'Paginated response' }} + { + "has_more": false, + "data": [ + { + "id": "WAz8eIbvDR60rouK", + // ... + }, + { + "id": "hSIhXBhNe8X1d8Et" + // ... + }, + { + "id": "fbwYwpi9C2ybt6Yb" + // ... + } + ] + } + ``` + + + diff --git a/apps/formbricks-com/src/app/providers.tsx b/apps/formbricks-com/src/app/providers.tsx new file mode 100644 index 0000000000..016cd48500 --- /dev/null +++ b/apps/formbricks-com/src/app/providers.tsx @@ -0,0 +1,37 @@ +'use client' + +import { useEffect } from 'react' +import { ThemeProvider, useTheme } from 'next-themes' + +function ThemeWatcher() { + let { resolvedTheme, setTheme } = useTheme() + + useEffect(() => { + let media = window.matchMedia('(prefers-color-scheme: dark)') + + function onMediaChange() { + let systemTheme = media.matches ? 'dark' : 'light' + if (resolvedTheme === systemTheme) { + setTheme('system') + } + } + + onMediaChange() + media.addEventListener('change', onMediaChange) + + return () => { + media.removeEventListener('change', onMediaChange) + } + }, [resolvedTheme, setTheme]) + + return null +} + +export function Providers({ children }: { children: React.ReactNode }) { + return ( + + + {children} + + ) +} diff --git a/apps/formbricks-com/src/app/quickstart/page.mdx b/apps/formbricks-com/src/app/quickstart/page.mdx new file mode 100644 index 0000000000..d3a46bcf99 --- /dev/null +++ b/apps/formbricks-com/src/app/quickstart/page.mdx @@ -0,0 +1,104 @@ +export const metadata = { + title: 'Quickstart', + description: + 'This guide will get you all set up and ready to use the Protocol API. We’ll cover how to get started an API client and how to make your first API request.', +} + +# Quickstart + +This guide will get you all set up and ready to use the Protocol API. We'll cover how to get started using one of our API clients and how to make your first API request. We'll also look at where to go next to find all the information you need to take full advantage of our powerful REST API. {{ className: 'lead' }} + + + Before you can make requests to the Protocol API, you will need to grab your + API key from your dashboard. You find it under [Settings » API](#). + + +## Choose your client + +Before making your first API request, you need to pick which API client you will use. In addition to good ol' cURL HTTP requests, Protocol offers clients for JavaScript, Python, and PHP. In the following example, you can see how to install each client. + + + +```bash {{ title: 'cURL' }} +# cURL is most likely already installed on your machine +curl --version +``` + +```bash {{ language: 'js' }} +# Install the Protocol JavaScript SDK +npm install @example/protocol-api --save +``` + +```bash {{ language: 'python' }} +# Install the Protocol Python SDK +pip install protocol_api +``` + +```bash {{ language: 'php' }} +# Install the Protocol PHP SDK +composer require protocol/sdk +``` + + + +
+
+ +## Making your first API request + +After picking your preferred client, you are ready to make your first call to the Protocol API. Below, you can see how to send a GET request to the Conversations endpoint to get a list of all your conversations. In the cURL example, results are limited to ten conversations, the default page length for each client. + + + +```bash {{ title: 'cURL' }} +curl -G https://api.protocol.chat/v1/conversations \ + -H "Authorization: Bearer {token}" \ + -d limit=10 +``` + +```js +import ApiClient from '@example/protocol-api' + +const client = new ApiClient(token) + +await client.conversations.list() +``` + +```python +from protocol_api import ApiClient + +client = ApiClient(token) + +client.conversations.list() +``` + +```php +$client = new \Protocol\ApiClient($token); + +$client->conversations->list(); +``` + + + +
+
+ +## What's next? + +Great, you're now set up with an API client and have made your first request to the API. Here are a few links that might be handy as you venture further into the Protocol API: + +- [Grab your API key from the Protocol dashboard](#) +- [Check out the Conversations endpoint](/conversations) +- [Learn about the different error messages in Protocol](/errors) diff --git a/apps/formbricks-com/src/app/sdks/page.mdx b/apps/formbricks-com/src/app/sdks/page.mdx new file mode 100644 index 0000000000..ec7acd1a7f --- /dev/null +++ b/apps/formbricks-com/src/app/sdks/page.mdx @@ -0,0 +1,17 @@ +import { Libraries } from '@/components/Libraries' + +export const metadata = { + title: 'Protocol SDKs', + description: + 'Protocol offers fine-tuned JavaScript, Ruby, PHP, Python, and Go libraries to make your life easier and give you the best experience when consuming the API.', +} + +export const sections = [ + { title: 'Official libraries', id: 'official-libraries' }, +] + +# Protocol SDKs + +The recommended way to interact with the Protocol API is by using one of our official SDKs. Today, Protocol offers fine-tuned JavaScript, Ruby, PHP, Python, and Go libraries to make your life easier and give you the best experience when consuming the API. {{ className: 'lead' }} + + diff --git a/apps/formbricks-com/src/app/webhooks/page.mdx b/apps/formbricks-com/src/app/webhooks/page.mdx new file mode 100644 index 0000000000..e8f4612147 --- /dev/null +++ b/apps/formbricks-com/src/app/webhooks/page.mdx @@ -0,0 +1,175 @@ +export const metadata = { + title: 'Webhooks', + description: + 'In this guide, we will look at how to register and consume webhooks to integrate your app with Protocol.', +} + +# Webhooks + +In this guide, we will look at how to register and consume webhooks to integrate your app with Protocol. With webhooks, your app can know when something happens in Protocol, such as someone sending a message or adding a contact. {{ className: 'lead' }} + +## Registering webhooks + +To register a new webhook, you need to have a URL in your app that Protocol can call. You can configure a new webhook from the Protocol dashboard under [API settings](#). Give your webhook a name, pick the [events](#event-types) you want to listen for, and add your URL. + +Now, whenever something of interest happens in your app, a webhook is fired off by Protocol. In the next section, we'll look at how to consume webhooks. + +## Consuming webhooks + +When your app receives a webhook request from Protocol, check the `type` attribute to see what event caused it. The first part of the event type will tell you the payload type, e.g., a conversation, message, etc. + +```json {{ title: 'Example webhook payload' }} +{ + "id": "a056V7R7NmNRjl70", + "type": "conversation.updated", + "payload": { + "id": "WAz8eIbvDR60rouK" + // ... + } +} +``` + +In the example above, a conversation was `updated`, and the payload type is a `conversation`. + +
+
+ +--- + +## Event types + + + + + + + A new contact was created. + + + An existing contact was updated. + + + A contact was successfully deleted. + + + A new conversation was created. + + + An existing conversation was updated. + + + A conversation was successfully deleted. + + + A new message was created. + + + An existing message was updated. + + + A message was successfully deleted. + + + A new group was created. + + + An existing group was updated. + + + A group was successfully deleted. + + + A new attachment was created. + + + An existing attachment was updated. + + + An attachment was successfully deleted. + + + + + + + ```json {{ 'title': 'Example payload' }} + { + "id": "a056V7R7NmNRjl70", + "type": "message.updated", + "payload": { + "id": "SIuAFUNKdSYHZF2w", + "conversation_id": "xgQQXg3hrtjh7AvZ", + "contact": { + "id": "WAz8eIbvDR60rouK", + "username": "KevinMcCallister", + "phone_number": "1-800-759-3000", + "avatar_url": "https://assets.protocol.chat/avatars/kevin.jpg", + "last_active_at": 705103200, + "created_at": 692233200 + }, + "message": "I’m traveling with my dad. He’s at a meeting. I hate meetings.", + "reactions": [], + "attachments": [], + "read_at": 705103200, + "created_at": 692233200, + "updated_at": 692233200 + } + } + ``` + + + + +--- + +## Security + +To know for sure that a webhook was, in fact, sent by Protocol instead of a malicious actor, you can verify the request signature. Each webhook request contains a header named `x-protocol-signature`, and you can verify this signature by using your secret webhook key. The signature is an HMAC hash of the request payload hashed using your secret key. Here is an example of how to verify the signature in your app: + + + +```js +const signature = req.headers['x-protocol-signature'] +const hash = crypto.createHmac('sha256', secret).update(payload).digest('hex') + +if (hash === signature) { + // Request is verified +} else { + // Request could not be verified +} +``` + +```python +from flask import request +import hashlib +import hmac + +signature = request.headers.get("x-protocol-signature") +hash = hmac.new(bytes(secret, "ascii"), bytes(payload, "ascii"), hashlib.sha256) + +if hash.hexdigest() == signature: + # Request is verified +else: + # Request could not be verified +``` + +```php +$signature = $request['headers']['x-protocol-signature']; +$hash = hash_hmac('sha256', $payload, $secret); + +if (hash_equals($hash, $signature)) { + // Request is verified +} else { + // Request could not be verified +} +``` + + + +If your generated signature matches the `x-protocol-signature` header, you can be sure that the request was truly coming from Protocol. It's essential to keep your secret webhook key safe — otherwise, you can no longer be sure that a given webhook was sent by Protocol. Don't commit your secret webhook key to GitHub! diff --git a/apps/formbricks-com/src/components/Button.tsx b/apps/formbricks-com/src/components/Button.tsx new file mode 100644 index 0000000000..556e2f4238 --- /dev/null +++ b/apps/formbricks-com/src/components/Button.tsx @@ -0,0 +1,82 @@ +import Link from 'next/link' +import clsx from 'clsx' + +function ArrowIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +const variantStyles = { + primary: + 'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-emerald-400/10 dark:text-emerald-400 dark:ring-1 dark:ring-inset dark:ring-emerald-400/20 dark:hover:bg-emerald-400/10 dark:hover:text-emerald-300 dark:hover:ring-emerald-300', + secondary: + 'rounded-full bg-zinc-100 py-1 px-3 text-zinc-900 hover:bg-zinc-200 dark:bg-zinc-800/40 dark:text-zinc-400 dark:ring-1 dark:ring-inset dark:ring-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-300', + filled: + 'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-emerald-500 dark:text-white dark:hover:bg-emerald-400', + outline: + 'rounded-full py-1 px-3 text-zinc-700 ring-1 ring-inset ring-zinc-900/10 hover:bg-zinc-900/2.5 hover:text-zinc-900 dark:text-zinc-400 dark:ring-white/10 dark:hover:bg-white/5 dark:hover:text-white', + text: 'text-emerald-500 hover:text-emerald-600 dark:text-emerald-400 dark:hover:text-emerald-500', +} + +type ButtonProps = { + variant?: keyof typeof variantStyles + arrow?: 'left' | 'right' +} & ( + | React.ComponentPropsWithoutRef + | (React.ComponentPropsWithoutRef<'button'> & { href?: undefined }) +) + +export function Button({ + variant = 'primary', + className, + children, + arrow, + ...props +}: ButtonProps) { + className = clsx( + 'inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition', + variantStyles[variant], + className, + ) + + let arrowIcon = ( + + ) + + let inner = ( + <> + {arrow === 'left' && arrowIcon} + {children} + {arrow === 'right' && arrowIcon} + + ) + + if (typeof props.href === 'undefined') { + return ( + + ) + } + + return ( + + {inner} + + ) +} diff --git a/apps/formbricks-com/src/components/Code.tsx b/apps/formbricks-com/src/components/Code.tsx new file mode 100644 index 0000000000..59d55f464f --- /dev/null +++ b/apps/formbricks-com/src/components/Code.tsx @@ -0,0 +1,376 @@ +'use client' + +import { + Children, + createContext, + isValidElement, + useContext, + useEffect, + useRef, + useState, +} from 'react' +import { Tab } from '@headlessui/react' +import clsx from 'clsx' +import { create } from 'zustand' + +import { Tag } from '@/components/Tag' + +const languageNames: Record = { + js: 'JavaScript', + ts: 'TypeScript', + javascript: 'JavaScript', + typescript: 'TypeScript', + php: 'PHP', + python: 'Python', + ruby: 'Ruby', + go: 'Go', +} + +function getPanelTitle({ + title, + language, +}: { + title?: string + language?: string +}) { + if (title) { + return title + } + if (language && language in languageNames) { + return languageNames[language] + } + return 'Code' +} + +function ClipboardIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function CopyButton({ code }: { code: string }) { + let [copyCount, setCopyCount] = useState(0) + let copied = copyCount > 0 + + useEffect(() => { + if (copyCount > 0) { + let timeout = setTimeout(() => setCopyCount(0), 1000) + return () => { + clearTimeout(timeout) + } + } + }, [copyCount]) + + return ( + + ) +} + +function CodePanelHeader({ tag, label }: { tag?: string; label?: string }) { + if (!tag && !label) { + return null + } + + return ( +
+ {tag && ( +
+ {tag} +
+ )} + {tag && label && ( + + )} + {label && ( + {label} + )} +
+ ) +} + +function CodePanel({ + children, + tag, + label, + code, +}: { + children: React.ReactNode + tag?: string + label?: string + code?: string +}) { + let child = Children.only(children) + + if (isValidElement(child)) { + tag = child.props.tag ?? tag + label = child.props.label ?? label + code = child.props.code ?? code + } + + if (!code) { + throw new Error( + '`CodePanel` requires a `code` prop, or a child with a `code` prop.', + ) + } + + return ( +
+ +
+
{children}
+ +
+
+ ) +} + +function CodeGroupHeader({ + title, + children, + selectedIndex, +}: { + title: string + children: React.ReactNode + selectedIndex: number +}) { + let hasTabs = Children.count(children) > 1 + + if (!title && !hasTabs) { + return null + } + + return ( +
+ {title && ( +

+ {title} +

+ )} + {hasTabs && ( + + {Children.map(children, (child, childIndex) => ( + + {getPanelTitle(isValidElement(child) ? child.props : {})} + + ))} + + )} +
+ ) +} + +function CodeGroupPanels({ + children, + ...props +}: React.ComponentPropsWithoutRef) { + let hasTabs = Children.count(children) > 1 + + if (hasTabs) { + return ( + + {Children.map(children, (child) => ( + + {child} + + ))} + + ) + } + + return {children} +} + +function usePreventLayoutShift() { + let positionRef = useRef(null) + let rafRef = useRef() + + useEffect(() => { + return () => { + if (typeof rafRef.current !== 'undefined') { + window.cancelAnimationFrame(rafRef.current) + } + } + }, []) + + return { + positionRef, + preventLayoutShift(callback: () => void) { + if (!positionRef.current) { + return + } + + let initialTop = positionRef.current.getBoundingClientRect().top + + callback() + + rafRef.current = window.requestAnimationFrame(() => { + let newTop = + positionRef.current?.getBoundingClientRect().top ?? initialTop + window.scrollBy(0, newTop - initialTop) + }) + }, + } +} + +const usePreferredLanguageStore = create<{ + preferredLanguages: Array + addPreferredLanguage: (language: string) => void +}>()((set) => ({ + preferredLanguages: [], + addPreferredLanguage: (language) => + set((state) => ({ + preferredLanguages: [ + ...state.preferredLanguages.filter( + (preferredLanguage) => preferredLanguage !== language, + ), + language, + ], + })), +})) + +function useTabGroupProps(availableLanguages: Array) { + let { preferredLanguages, addPreferredLanguage } = usePreferredLanguageStore() + let [selectedIndex, setSelectedIndex] = useState(0) + let activeLanguage = [...availableLanguages].sort( + (a, z) => preferredLanguages.indexOf(z) - preferredLanguages.indexOf(a), + )[0] + let languageIndex = availableLanguages.indexOf(activeLanguage) + let newSelectedIndex = languageIndex === -1 ? selectedIndex : languageIndex + if (newSelectedIndex !== selectedIndex) { + setSelectedIndex(newSelectedIndex) + } + + let { positionRef, preventLayoutShift } = usePreventLayoutShift() + + return { + as: 'div' as const, + ref: positionRef, + selectedIndex, + onChange: (newSelectedIndex: number) => { + preventLayoutShift(() => + addPreferredLanguage(availableLanguages[newSelectedIndex]), + ) + }, + } +} + +const CodeGroupContext = createContext(false) + +export function CodeGroup({ + children, + title, + ...props +}: React.ComponentPropsWithoutRef & { title: string }) { + let languages = + Children.map(children, (child) => + getPanelTitle(isValidElement(child) ? child.props : {}), + ) ?? [] + let tabGroupProps = useTabGroupProps(languages) + let hasTabs = Children.count(children) > 1 + + let containerClassName = + 'not-prose my-6 overflow-hidden rounded-2xl bg-zinc-900 shadow-md dark:ring-1 dark:ring-white/10' + let header = ( + + {children} + + ) + let panels = {children} + + return ( + + {hasTabs ? ( + + {header} + {panels} + + ) : ( +
+ {header} + {panels} +
+ )} +
+ ) +} + +export function Code({ + children, + ...props +}: React.ComponentPropsWithoutRef<'code'>) { + let isGrouped = useContext(CodeGroupContext) + + if (isGrouped) { + if (typeof children !== 'string') { + throw new Error( + '`Code` children must be a string when nested inside a `CodeGroup`.', + ) + } + return + } + + return {children} +} + +export function Pre({ + children, + ...props +}: React.ComponentPropsWithoutRef) { + let isGrouped = useContext(CodeGroupContext) + + if (isGrouped) { + return children + } + + return {children} +} diff --git a/apps/formbricks-com/src/components/Feedback.tsx b/apps/formbricks-com/src/components/Feedback.tsx new file mode 100644 index 0000000000..4fa92ed4d1 --- /dev/null +++ b/apps/formbricks-com/src/components/Feedback.tsx @@ -0,0 +1,105 @@ +'use client' + +import { forwardRef, Fragment, useState } from 'react' +import { Transition } from '@headlessui/react' + +function CheckIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function FeedbackButton( + props: Omit, 'type' | 'className'>, +) { + return ( + + + {page.title} + + + ) +} + +function PageNavigation() { + let pathname = usePathname() + let allPages = navigation.flatMap((group) => group.links) + let currentPageIndex = allPages.findIndex((page) => page.href === pathname) + + if (currentPageIndex === -1) { + return null + } + + let previousPage = allPages[currentPageIndex - 1] + let nextPage = allPages[currentPageIndex + 1] + + if (!previousPage && !nextPage) { + return null + } + + return ( +
+ {previousPage && ( +
+ +
+ )} + {nextPage && ( +
+ +
+ )} +
+ ) +} + +function TwitterIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function GitHubIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function DiscordIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function SocialLink({ + href, + icon: Icon, + children, +}: { + href: string + icon: React.ComponentType<{ className?: string }> + children: React.ReactNode +}) { + return ( + + {children} + + + ) +} + +function SmallPrint() { + return ( +
+

+ © Copyright {new Date().getFullYear()}. All rights reserved. +

+
+ + Follow us on Twitter + + + Follow us on GitHub + + + Join our Discord server + +
+
+ ) +} + +export function Footer() { + return ( +
+ + +
+ ) +} diff --git a/apps/formbricks-com/src/components/GridPattern.tsx b/apps/formbricks-com/src/components/GridPattern.tsx new file mode 100644 index 0000000000..520299114f --- /dev/null +++ b/apps/formbricks-com/src/components/GridPattern.tsx @@ -0,0 +1,55 @@ +import { useId } from 'react' + +export function GridPattern({ + width, + height, + x, + y, + squares, + ...props +}: React.ComponentPropsWithoutRef<'svg'> & { + width: number + height: number + x: string | number + y: string | number + squares: Array<[x: number, y: number]> +}) { + let patternId = useId() + + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/Guides.tsx b/apps/formbricks-com/src/components/Guides.tsx new file mode 100644 index 0000000000..3950039037 --- /dev/null +++ b/apps/formbricks-com/src/components/Guides.tsx @@ -0,0 +1,54 @@ +import { Button } from '@/components/Button' +import { Heading } from '@/components/Heading' + +const guides = [ + { + href: '/authentication', + name: 'Authentication', + description: 'Learn how to authenticate your API requests.', + }, + { + href: '/pagination', + name: 'Pagination', + description: 'Understand how to work with paginated responses.', + }, + { + href: '/errors', + name: 'Errors', + description: + 'Read about the different types of errors returned by the API.', + }, + { + href: '/webhooks', + name: 'Webhooks', + description: + 'Learn how to programmatically configure webhooks for your app.', + }, +] + +export function Guides() { + return ( +
+ + Guides + +
+ {guides.map((guide) => ( +
+

+ {guide.name} +

+

+ {guide.description} +

+

+ +

+
+ ))} +
+
+ ) +} diff --git a/apps/formbricks-com/src/components/Header.tsx b/apps/formbricks-com/src/components/Header.tsx new file mode 100644 index 0000000000..72bdbdd691 --- /dev/null +++ b/apps/formbricks-com/src/components/Header.tsx @@ -0,0 +1,98 @@ +import { forwardRef } from 'react' +import Link from 'next/link' +import clsx from 'clsx' +import { motion, useScroll, useTransform } from 'framer-motion' + +import { Button } from '@/components/Button' +import { Logo } from '@/components/Logo' +import { + MobileNavigation, + useIsInsideMobileNavigation, +} from '@/components/MobileNavigation' +import { useMobileNavigationStore } from '@/components/MobileNavigation' +import { MobileSearch, Search } from '@/components/Search' +import { ThemeToggle } from '@/components/ThemeToggle' + +function TopLevelNavItem({ + href, + children, +}: { + href: string + children: React.ReactNode +}) { + return ( +
  • + + {children} + +
  • + ) +} + +export const Header = forwardRef< + React.ElementRef<'div'>, + { className?: string } +>(function Header({ className }, ref) { + let { isOpen: mobileNavIsOpen } = useMobileNavigationStore() + let isInsideMobileNavigation = useIsInsideMobileNavigation() + + let { scrollY } = useScroll() + let bgOpacityLight = useTransform(scrollY, [0, 72], [0.5, 0.9]) + let bgOpacityDark = useTransform(scrollY, [0, 72], [0.2, 0.8]) + + return ( + +
    + +
    + + + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + ) +}) diff --git a/apps/formbricks-com/src/components/Heading.tsx b/apps/formbricks-com/src/components/Heading.tsx new file mode 100644 index 0000000000..8e2d471a5b --- /dev/null +++ b/apps/formbricks-com/src/components/Heading.tsx @@ -0,0 +1,117 @@ +'use client' + +import { useEffect, useRef } from 'react' +import Link from 'next/link' +import { useInView } from 'framer-motion' + +import { useSectionStore } from '@/components/SectionProvider' +import { Tag } from '@/components/Tag' +import { remToPx } from '@/lib/remToPx' + +function AnchorIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function Eyebrow({ tag, label }: { tag?: string; label?: string }) { + if (!tag && !label) { + return null + } + + return ( +
    + {tag && {tag}} + {tag && label && ( + + )} + {label && ( + {label} + )} +
    + ) +} + +function Anchor({ + id, + inView, + children, +}: { + id: string + inView: boolean + children: React.ReactNode +}) { + return ( + + {inView && ( +
    +
    + +
    +
    + )} + {children} + + ) +} + +export function Heading({ + children, + tag, + label, + level, + anchor = true, + ...props +}: React.ComponentPropsWithoutRef<`h${Level}`> & { + id: string + tag?: string + label?: string + level?: Level + anchor?: boolean +}) { + level = level ?? (2 as Level) + let Component = `h${level}` as 'h2' | 'h3' + let ref = useRef(null) + let registerHeading = useSectionStore((s) => s.registerHeading) + + let inView = useInView(ref, { + margin: `${remToPx(-3.5)}px 0px 0px 0px`, + amount: 'all', + }) + + useEffect(() => { + if (level === 2) { + registerHeading({ id: props.id, ref, offsetRem: tag || label ? 8 : 6 }) + } + }) + + return ( + <> + + + {anchor ? ( + + {children} + + ) : ( + children + )} + + + ) +} diff --git a/apps/formbricks-com/src/components/HeroPattern.tsx b/apps/formbricks-com/src/components/HeroPattern.tsx new file mode 100644 index 0000000000..0b4ca3f277 --- /dev/null +++ b/apps/formbricks-com/src/components/HeroPattern.tsx @@ -0,0 +1,32 @@ +import { GridPattern } from '@/components/GridPattern' + +export function HeroPattern() { + return ( +
    +
    +
    + +
    + +
    +
    + ) +} diff --git a/apps/formbricks-com/src/components/Layout.tsx b/apps/formbricks-com/src/components/Layout.tsx new file mode 100644 index 0000000000..4b32edf836 --- /dev/null +++ b/apps/formbricks-com/src/components/Layout.tsx @@ -0,0 +1,46 @@ +'use client' + +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { motion } from 'framer-motion' + +import { Footer } from '@/components/Footer' +import { Header } from '@/components/Header' +import { Logo } from '@/components/Logo' +import { Navigation } from '@/components/Navigation' +import { type Section, SectionProvider } from '@/components/SectionProvider' + +export function Layout({ + children, + allSections, +}: { + children: React.ReactNode + allSections: Record> +}) { + let pathname = usePathname() + + return ( + +
    + +
    +
    + + + +
    +
    + +
    +
    +
    +
    {children}
    +
    +
    +
    +
    + ) +} diff --git a/apps/formbricks-com/src/components/Libraries.tsx b/apps/formbricks-com/src/components/Libraries.tsx new file mode 100644 index 0000000000..c3b452c662 --- /dev/null +++ b/apps/formbricks-com/src/components/Libraries.tsx @@ -0,0 +1,82 @@ +import Image from 'next/image' + +import { Button } from '@/components/Button' +import { Heading } from '@/components/Heading' +import logoGo from '@/images/logos/go.svg' +import logoNode from '@/images/logos/node.svg' +import logoPhp from '@/images/logos/php.svg' +import logoPython from '@/images/logos/python.svg' +import logoRuby from '@/images/logos/ruby.svg' + +const libraries = [ + { + href: '#', + name: 'PHP', + description: + 'A popular general-purpose scripting language that is especially suited to web development.', + logo: logoPhp, + }, + { + href: '#', + name: 'Ruby', + description: + 'A dynamic, open source programming language with a focus on simplicity and productivity.', + logo: logoRuby, + }, + { + href: '#', + name: 'Node.js', + description: + 'Node.js® is an open-source, cross-platform JavaScript runtime environment.', + logo: logoNode, + }, + { + href: '#', + name: 'Python', + description: + 'Python is a programming language that lets you work quickly and integrate systems more effectively.', + logo: logoPython, + }, + { + href: '#', + name: 'Go', + description: + 'An open-source programming language supported by Google with built-in concurrency.', + logo: logoGo, + }, +] + +export function Libraries() { + return ( +
    + + Official libraries + +
    + {libraries.map((library) => ( +
    +
    +

    + {library.name} +

    +

    + {library.description} +

    +

    + +

    +
    + +
    + ))} +
    +
    + ) +} diff --git a/apps/formbricks-com/src/components/Logo.tsx b/apps/formbricks-com/src/components/Logo.tsx new file mode 100644 index 0000000000..ac0eb273f9 --- /dev/null +++ b/apps/formbricks-com/src/components/Logo.tsx @@ -0,0 +1,14 @@ +export function Logo(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/MobileNavigation.tsx b/apps/formbricks-com/src/components/MobileNavigation.tsx new file mode 100644 index 0000000000..e021f52439 --- /dev/null +++ b/apps/formbricks-com/src/components/MobileNavigation.tsx @@ -0,0 +1,174 @@ +'use client' + +import { + createContext, + Fragment, + Suspense, + useContext, + useEffect, + useRef, +} from 'react' +import { usePathname, useSearchParams } from 'next/navigation' +import { Dialog, Transition } from '@headlessui/react' +import { motion } from 'framer-motion' +import { create } from 'zustand' + +import { Header } from '@/components/Header' +import { Navigation } from '@/components/Navigation' + +function MenuIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function XIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +const IsInsideMobileNavigationContext = createContext(false) + +function MobileNavigationDialog({ + isOpen, + close, +}: { + isOpen: boolean + close: () => void +}) { + let pathname = usePathname() + let searchParams = useSearchParams() + let initialPathname = useRef(pathname).current + let initialSearchParams = useRef(searchParams).current + + useEffect(() => { + if (pathname !== initialPathname || searchParams !== initialSearchParams) { + close() + } + }, [pathname, searchParams, close, initialPathname, initialSearchParams]) + + function onClickDialog(event: React.MouseEvent) { + if (!(event.target instanceof HTMLElement)) { + return + } + + let link = event.target.closest('a') + if ( + link && + link.pathname + link.search + link.hash === + window.location.pathname + window.location.search + window.location.hash + ) { + close() + } + } + + return ( + + + +
    + + + + +
    + + + + + + + + +
    +
    + ) +} + +export function useIsInsideMobileNavigation() { + return useContext(IsInsideMobileNavigationContext) +} + +export const useMobileNavigationStore = create<{ + isOpen: boolean + open: () => void + close: () => void + toggle: () => void +}>()((set) => ({ + isOpen: false, + open: () => set({ isOpen: true }), + close: () => set({ isOpen: false }), + toggle: () => set((state) => ({ isOpen: !state.isOpen })), +})) + +export function MobileNavigation() { + let isInsideMobileNavigation = useIsInsideMobileNavigation() + let { isOpen, toggle, close } = useMobileNavigationStore() + let ToggleIcon = isOpen ? XIcon : MenuIcon + + return ( + + + {!isInsideMobileNavigation && ( + + + + )} + + ) +} diff --git a/apps/formbricks-com/src/components/Navigation.tsx b/apps/formbricks-com/src/components/Navigation.tsx new file mode 100644 index 0000000000..f95188385b --- /dev/null +++ b/apps/formbricks-com/src/components/Navigation.tsx @@ -0,0 +1,279 @@ +'use client' + +import { useRef } from 'react' +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import clsx from 'clsx' +import { AnimatePresence, motion, useIsPresent } from 'framer-motion' + +import { Button } from '@/components/Button' +import { useIsInsideMobileNavigation } from '@/components/MobileNavigation' +import { useSectionStore } from '@/components/SectionProvider' +import { Tag } from '@/components/Tag' +import { remToPx } from '@/lib/remToPx' + +interface NavGroup { + title: string + links: Array<{ + title: string + href: string + }> +} + +function useInitialValue(value: T, condition = true) { + let initialValue = useRef(value).current + return condition ? initialValue : value +} + +function TopLevelNavItem({ + href, + children, +}: { + href: string + children: React.ReactNode +}) { + return ( +
  • + + {children} + +
  • + ) +} + +function NavLink({ + href, + children, + tag, + active = false, + isAnchorLink = false, +}: { + href: string + children: React.ReactNode + tag?: string + active?: boolean + isAnchorLink?: boolean +}) { + return ( + + {children} + {tag && ( + + {tag} + + )} + + ) +} + +function VisibleSectionHighlight({ + group, + pathname, +}: { + group: NavGroup + pathname: string +}) { + let [sections, visibleSections] = useInitialValue( + [ + useSectionStore((s) => s.sections), + useSectionStore((s) => s.visibleSections), + ], + useIsInsideMobileNavigation(), + ) + + let isPresent = useIsPresent() + let firstVisibleSectionIndex = Math.max( + 0, + [{ id: '_top' }, ...sections].findIndex( + (section) => section.id === visibleSections[0], + ), + ) + let itemHeight = remToPx(2) + let height = isPresent + ? Math.max(1, visibleSections.length) * itemHeight + : itemHeight + let top = + group.links.findIndex((link) => link.href === pathname) * itemHeight + + firstVisibleSectionIndex * itemHeight + + return ( + + ) +} + +function ActivePageMarker({ + group, + pathname, +}: { + group: NavGroup + pathname: string +}) { + let itemHeight = remToPx(2) + let offset = remToPx(0.25) + let activePageIndex = group.links.findIndex((link) => link.href === pathname) + let top = offset + activePageIndex * itemHeight + + return ( + + ) +} + +function NavigationGroup({ + group, + className, +}: { + group: NavGroup + className?: string +}) { + // If this is the mobile navigation then we always render the initial + // state, so that the state does not change during the close animation. + // The state will still update when we re-open (re-render) the navigation. + let isInsideMobileNavigation = useIsInsideMobileNavigation() + let [pathname, sections] = useInitialValue( + [usePathname(), useSectionStore((s) => s.sections)], + isInsideMobileNavigation, + ) + + let isActiveGroup = + group.links.findIndex((link) => link.href === pathname) !== -1 + + return ( +
  • + + {group.title} + +
    + + {isActiveGroup && ( + + )} + + + + {isActiveGroup && ( + + )} + +
      + {group.links.map((link) => ( + + + {link.title} + + + {link.href === pathname && sections.length > 0 && ( + + {sections.map((section) => ( +
    • + + {section.title} + +
    • + ))} +
      + )} +
      +
      + ))} +
    +
    +
  • + ) +} + +export const navigation: Array = [ + { + title: 'Guides', + links: [ + { title: 'Introduction', href: '/' }, + { title: 'Quickstart', href: '/quickstart' }, + { title: 'SDKs', href: '/sdks' }, + { title: 'Authentication', href: '/authentication' }, + { title: 'Pagination', href: '/pagination' }, + { title: 'Errors', href: '/errors' }, + { title: 'Webhooks', href: '/webhooks' }, + ], + }, + { + title: 'Resources', + links: [ + { title: 'Contacts', href: '/contacts' }, + { title: 'Conversations', href: '/conversations' }, + { title: 'Messages', href: '/messages' }, + { title: 'Groups', href: '/groups' }, + { title: 'Attachments', href: '/attachments' }, + ], + }, +] + +export function Navigation(props: React.ComponentPropsWithoutRef<'nav'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/Prose.tsx b/apps/formbricks-com/src/components/Prose.tsx new file mode 100644 index 0000000000..a6bb5f1687 --- /dev/null +++ b/apps/formbricks-com/src/components/Prose.tsx @@ -0,0 +1,19 @@ +import clsx from 'clsx' + +export function Prose({ + as, + className, + ...props +}: Omit, 'as' | 'className'> & { + as?: T + className?: string +}) { + let Component = as ?? 'div' + + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/Resources.tsx b/apps/formbricks-com/src/components/Resources.tsx new file mode 100644 index 0000000000..c3d661d349 --- /dev/null +++ b/apps/formbricks-com/src/components/Resources.tsx @@ -0,0 +1,186 @@ +'use client' + +import Link from 'next/link' +import { + type MotionValue, + motion, + useMotionTemplate, + useMotionValue, +} from 'framer-motion' + +import { GridPattern } from '@/components/GridPattern' +import { Heading } from '@/components/Heading' +import { ChatBubbleIcon } from '@/components/icons/ChatBubbleIcon' +import { EnvelopeIcon } from '@/components/icons/EnvelopeIcon' +import { UserIcon } from '@/components/icons/UserIcon' +import { UsersIcon } from '@/components/icons/UsersIcon' + +interface Resource { + href: string + name: string + description: string + icon: React.ComponentType<{ className?: string }> + pattern: Omit< + React.ComponentPropsWithoutRef, + 'width' | 'height' | 'x' + > +} + +const resources: Array = [ + { + href: '/contacts', + name: 'Contacts', + description: + 'Learn about the contact model and how to create, retrieve, update, delete, and list contacts.', + icon: UserIcon, + pattern: { + y: 16, + squares: [ + [0, 1], + [1, 3], + ], + }, + }, + { + href: '/conversations', + name: 'Conversations', + description: + 'Learn about the conversation model and how to create, retrieve, update, delete, and list conversations.', + icon: ChatBubbleIcon, + pattern: { + y: -6, + squares: [ + [-1, 2], + [1, 3], + ], + }, + }, + { + href: '/messages', + name: 'Messages', + description: + 'Learn about the message model and how to create, retrieve, update, delete, and list messages.', + icon: EnvelopeIcon, + pattern: { + y: 32, + squares: [ + [0, 2], + [1, 4], + ], + }, + }, + { + href: '/groups', + name: 'Groups', + description: + 'Learn about the group model and how to create, retrieve, update, delete, and list groups.', + icon: UsersIcon, + pattern: { + y: 22, + squares: [[0, 1]], + }, + }, +] + +function ResourceIcon({ icon: Icon }: { icon: Resource['icon'] }) { + return ( +
    + +
    + ) +} + +function ResourcePattern({ + mouseX, + mouseY, + ...gridProps +}: Resource['pattern'] & { + mouseX: MotionValue + mouseY: MotionValue +}) { + let maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)` + let style = { maskImage, WebkitMaskImage: maskImage } + + return ( +
    +
    + +
    + + + + +
    + ) +} + +function Resource({ resource }: { resource: Resource }) { + let mouseX = useMotionValue(0) + let mouseY = useMotionValue(0) + + function onMouseMove({ + currentTarget, + clientX, + clientY, + }: React.MouseEvent) { + let { left, top } = currentTarget.getBoundingClientRect() + mouseX.set(clientX - left) + mouseY.set(clientY - top) + } + + return ( +
    + +
    +
    + +

    + + + {resource.name} + +

    +

    + {resource.description} +

    +
    +
    + ) +} + +export function Resources() { + return ( +
    + + Resources + +
    + {resources.map((resource) => ( + + ))} +
    +
    + ) +} diff --git a/apps/formbricks-com/src/components/Search.tsx b/apps/formbricks-com/src/components/Search.tsx new file mode 100644 index 0000000000..6472ba59d3 --- /dev/null +++ b/apps/formbricks-com/src/components/Search.tsx @@ -0,0 +1,505 @@ +'use client' + +import { + forwardRef, + Fragment, + Suspense, + useCallback, + useEffect, + useId, + useRef, + useState, +} from 'react' +import Highlighter from 'react-highlight-words' +import { usePathname, useRouter, useSearchParams } from 'next/navigation' +import { + type AutocompleteApi, + createAutocomplete, + type AutocompleteState, + type AutocompleteCollection, +} from '@algolia/autocomplete-core' +import { Dialog, Transition } from '@headlessui/react' +import clsx from 'clsx' + +import { navigation } from '@/components/Navigation' +import { type Result } from '@/mdx/search.mjs' + +type EmptyObject = Record + +type Autocomplete = AutocompleteApi< + Result, + React.SyntheticEvent, + React.MouseEvent, + React.KeyboardEvent +> + +function useAutocomplete({ close }: { close: () => void }) { + let id = useId() + let router = useRouter() + let [autocompleteState, setAutocompleteState] = useState< + AutocompleteState | EmptyObject + >({}) + + function navigate({ itemUrl }: { itemUrl?: string }) { + if (!itemUrl) { + return + } + + router.push(itemUrl) + + if ( + itemUrl === + window.location.pathname + window.location.search + window.location.hash + ) { + close() + } + } + + let [autocomplete] = useState(() => + createAutocomplete< + Result, + React.SyntheticEvent, + React.MouseEvent, + React.KeyboardEvent + >({ + id, + placeholder: 'Find something...', + defaultActiveItemId: 0, + onStateChange({ state }) { + setAutocompleteState(state) + }, + shouldPanelOpen({ state }) { + return state.query !== '' + }, + navigator: { + navigate, + }, + getSources({ query }) { + return import('@/mdx/search.mjs').then(({ search }) => { + return [ + { + sourceId: 'documentation', + getItems() { + return search(query, { limit: 5 }) + }, + getItemUrl({ item }) { + return item.url + }, + onSelect: navigate, + }, + ] + }) + }, + }), + ) + + return { autocomplete, autocompleteState } +} + +function SearchIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function NoResultsIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function LoadingIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + let id = useId() + + return ( + + ) +} + +function HighlightQuery({ text, query }: { text: string; query: string }) { + return ( + + ) +} + +function SearchResult({ + result, + resultIndex, + autocomplete, + collection, + query, +}: { + result: Result + resultIndex: number + autocomplete: Autocomplete + collection: AutocompleteCollection + query: string +}) { + let id = useId() + + let sectionTitle = navigation.find((section) => + section.links.find((link) => link.href === result.url.split('#')[0]), + )?.title + let hierarchy = [sectionTitle, result.pageTitle].filter( + (x): x is string => typeof x === 'string', + ) + + return ( +
  • 0 && 'border-t border-zinc-100 dark:border-zinc-800', + )} + aria-labelledby={`${id}-hierarchy ${id}-title`} + {...autocomplete.getItemProps({ + item: result, + source: collection.source, + })} + > + + {hierarchy.length > 0 && ( + + )} +
  • + ) +} + +function SearchResults({ + autocomplete, + query, + collection, +}: { + autocomplete: Autocomplete + query: string + collection: AutocompleteCollection +}) { + if (collection.items.length === 0) { + return ( +
    + +

    + Nothing found for{' '} + + ‘{query}’ + + . Please try again. +

    +
    + ) + } + + return ( +
      + {collection.items.map((result, resultIndex) => ( + + ))} +
    + ) +} + +const SearchInput = forwardRef< + React.ElementRef<'input'>, + { + autocomplete: Autocomplete + autocompleteState: AutocompleteState | EmptyObject + onClose: () => void + } +>(function SearchInput({ autocomplete, autocompleteState, onClose }, inputRef) { + let inputProps = autocomplete.getInputProps({ inputElement: null }) + + return ( +
    + + { + if ( + event.key === 'Escape' && + !autocompleteState.isOpen && + autocompleteState.query === '' + ) { + // In Safari, closing the dialog with the escape key can sometimes cause the scroll position to jump to the + // bottom of the page. This is a workaround for that until we can figure out a proper fix in Headless UI. + if (document.activeElement instanceof HTMLElement) { + document.activeElement.blur() + } + + onClose() + } else { + inputProps.onKeyDown(event) + } + }} + /> + {autocompleteState.status === 'stalled' && ( +
    + +
    + )} +
    + ) +}) + +function SearchDialog({ + open, + setOpen, + className, +}: { + open: boolean + setOpen: (open: boolean) => void + className?: string +}) { + let formRef = useRef>(null) + let panelRef = useRef>(null) + let inputRef = useRef>(null) + let { autocomplete, autocompleteState } = useAutocomplete({ + close() { + setOpen(false) + }, + }) + let pathname = usePathname() + let searchParams = useSearchParams() + + useEffect(() => { + setOpen(false) + }, [pathname, searchParams, setOpen]) + + useEffect(() => { + if (open) { + return + } + + function onKeyDown(event: KeyboardEvent) { + if (event.key === 'k' && (event.metaKey || event.ctrlKey)) { + event.preventDefault() + setOpen(true) + } + } + + window.addEventListener('keydown', onKeyDown) + + return () => { + window.removeEventListener('keydown', onKeyDown) + } + }, [open, setOpen]) + + return ( + autocomplete.setQuery('')} + > + + +
    + + +
    + + +
    +
    + setOpen(false)} + /> +
    + {autocompleteState.isOpen && ( + + )} +
    + +
    +
    +
    +
    +
    +
    + ) +} + +function useSearchProps() { + let buttonRef = useRef>(null) + let [open, setOpen] = useState(false) + + return { + buttonProps: { + ref: buttonRef, + onClick() { + setOpen(true) + }, + }, + dialogProps: { + open, + setOpen: useCallback( + (open: boolean) => { + let { width = 0, height = 0 } = + buttonRef.current?.getBoundingClientRect() ?? {} + if (!open || (width !== 0 && height !== 0)) { + setOpen(open) + } + }, + [setOpen], + ), + }, + } +} + +export function Search() { + let [modifierKey, setModifierKey] = useState() + let { buttonProps, dialogProps } = useSearchProps() + + useEffect(() => { + setModifierKey( + /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? '⌘' : 'Ctrl ', + ) + }, []) + + return ( +
    + + + + +
    + ) +} + +export function MobileSearch() { + let { buttonProps, dialogProps } = useSearchProps() + + return ( +
    + + + + +
    + ) +} diff --git a/apps/formbricks-com/src/components/SectionProvider.tsx b/apps/formbricks-com/src/components/SectionProvider.tsx new file mode 100644 index 0000000000..7056e23da7 --- /dev/null +++ b/apps/formbricks-com/src/components/SectionProvider.tsx @@ -0,0 +1,153 @@ +'use client' + +import { + createContext, + useContext, + useEffect, + useLayoutEffect, + useState, +} from 'react' +import { type StoreApi, createStore, useStore } from 'zustand' + +import { remToPx } from '@/lib/remToPx' + +export interface Section { + id: string + title: string + offsetRem?: number + tag?: string + headingRef?: React.RefObject +} + +interface SectionState { + sections: Array
    + visibleSections: Array + setVisibleSections: (visibleSections: Array) => void + registerHeading: ({ + id, + ref, + offsetRem, + }: { + id: string + ref: React.RefObject + offsetRem: number + }) => void +} + +function createSectionStore(sections: Array
    ) { + return createStore()((set) => ({ + sections, + visibleSections: [], + setVisibleSections: (visibleSections) => + set((state) => + state.visibleSections.join() === visibleSections.join() + ? {} + : { visibleSections }, + ), + registerHeading: ({ id, ref, offsetRem }) => + set((state) => { + return { + sections: state.sections.map((section) => { + if (section.id === id) { + return { + ...section, + headingRef: ref, + offsetRem, + } + } + return section + }), + } + }), + })) +} + +function useVisibleSections(sectionStore: StoreApi) { + let setVisibleSections = useStore(sectionStore, (s) => s.setVisibleSections) + let sections = useStore(sectionStore, (s) => s.sections) + + useEffect(() => { + function checkVisibleSections() { + let { innerHeight, scrollY } = window + let newVisibleSections = [] + + for ( + let sectionIndex = 0; + sectionIndex < sections.length; + sectionIndex++ + ) { + let { id, headingRef, offsetRem = 0 } = sections[sectionIndex] + + if (!headingRef?.current) { + continue + } + + let offset = remToPx(offsetRem) + let top = headingRef.current.getBoundingClientRect().top + scrollY + + if (sectionIndex === 0 && top - offset > scrollY) { + newVisibleSections.push('_top') + } + + let nextSection = sections[sectionIndex + 1] + let bottom = + (nextSection?.headingRef?.current?.getBoundingClientRect().top ?? + Infinity) + + scrollY - + remToPx(nextSection?.offsetRem ?? 0) + + if ( + (top > scrollY && top < scrollY + innerHeight) || + (bottom > scrollY && bottom < scrollY + innerHeight) || + (top <= scrollY && bottom >= scrollY + innerHeight) + ) { + newVisibleSections.push(id) + } + } + + setVisibleSections(newVisibleSections) + } + + let raf = window.requestAnimationFrame(() => checkVisibleSections()) + window.addEventListener('scroll', checkVisibleSections, { passive: true }) + window.addEventListener('resize', checkVisibleSections) + + return () => { + window.cancelAnimationFrame(raf) + window.removeEventListener('scroll', checkVisibleSections) + window.removeEventListener('resize', checkVisibleSections) + } + }, [setVisibleSections, sections]) +} + +const SectionStoreContext = createContext | null>(null) + +const useIsomorphicLayoutEffect = + typeof window === 'undefined' ? useEffect : useLayoutEffect + +export function SectionProvider({ + sections, + children, +}: { + sections: Array
    + children: React.ReactNode +}) { + let [sectionStore] = useState(() => createSectionStore(sections)) + + useVisibleSections(sectionStore) + + useIsomorphicLayoutEffect(() => { + sectionStore.setState({ sections }) + }, [sectionStore, sections]) + + return ( + + {children} + + ) +} + +export function useSectionStore(selector: (state: SectionState) => T) { + let store = useContext(SectionStoreContext) + return useStore(store!, selector) +} diff --git a/apps/formbricks-com/src/components/Tag.tsx b/apps/formbricks-com/src/components/Tag.tsx new file mode 100644 index 0000000000..06b21d6448 --- /dev/null +++ b/apps/formbricks-com/src/components/Tag.tsx @@ -0,0 +1,63 @@ +import clsx from 'clsx' + +const variantStyles = { + small: '', + medium: 'rounded-lg px-1.5 ring-1 ring-inset', +} + +const colorStyles = { + emerald: { + small: 'text-emerald-500 dark:text-emerald-400', + medium: + 'ring-emerald-300 dark:ring-emerald-400/30 bg-emerald-400/10 text-emerald-500 dark:text-emerald-400', + }, + sky: { + small: 'text-sky-500', + medium: + 'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400', + }, + amber: { + small: 'text-amber-500', + medium: + 'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400', + }, + rose: { + small: 'text-red-500 dark:text-rose-500', + medium: + 'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400', + }, + zinc: { + small: 'text-zinc-400 dark:text-zinc-500', + medium: + 'ring-zinc-200 bg-zinc-50 text-zinc-500 dark:ring-zinc-500/20 dark:bg-zinc-400/10 dark:text-zinc-400', + }, +} + +const valueColorMap = { + GET: 'emerald', + POST: 'sky', + PUT: 'amber', + DELETE: 'rose', +} as Record + +export function Tag({ + children, + variant = 'medium', + color = valueColorMap[children] ?? 'emerald', +}: { + children: keyof typeof valueColorMap & (string | {}) + variant?: keyof typeof variantStyles + color?: keyof typeof colorStyles +}) { + return ( + + {children} + + ) +} diff --git a/apps/formbricks-com/src/components/ThemeToggle.tsx b/apps/formbricks-com/src/components/ThemeToggle.tsx new file mode 100644 index 0000000000..eb9969fd7d --- /dev/null +++ b/apps/formbricks-com/src/components/ThemeToggle.tsx @@ -0,0 +1,44 @@ +import { useEffect, useState } from 'react' +import { useTheme } from 'next-themes' + +function SunIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +function MoonIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +export function ThemeToggle() { + let { resolvedTheme, setTheme } = useTheme() + let otherTheme = resolvedTheme === 'dark' ? 'light' : 'dark' + let [mounted, setMounted] = useState(false) + + useEffect(() => { + setMounted(true) + }, []) + + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/BellIcon.tsx b/apps/formbricks-com/src/components/icons/BellIcon.tsx new file mode 100644 index 0000000000..1c0c2291cd --- /dev/null +++ b/apps/formbricks-com/src/components/icons/BellIcon.tsx @@ -0,0 +1,17 @@ +export function BellIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/BoltIcon.tsx b/apps/formbricks-com/src/components/icons/BoltIcon.tsx new file mode 100644 index 0000000000..308d997cc0 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/BoltIcon.tsx @@ -0,0 +1,11 @@ +export function BoltIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/BookIcon.tsx b/apps/formbricks-com/src/components/icons/BookIcon.tsx new file mode 100644 index 0000000000..9f7709bc3c --- /dev/null +++ b/apps/formbricks-com/src/components/icons/BookIcon.tsx @@ -0,0 +1,17 @@ +export function BookIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/CalendarIcon.tsx b/apps/formbricks-com/src/components/icons/CalendarIcon.tsx new file mode 100644 index 0000000000..e9d374867d --- /dev/null +++ b/apps/formbricks-com/src/components/icons/CalendarIcon.tsx @@ -0,0 +1,23 @@ +export function CalendarIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/CartIcon.tsx b/apps/formbricks-com/src/components/icons/CartIcon.tsx new file mode 100644 index 0000000000..30c9438f7f --- /dev/null +++ b/apps/formbricks-com/src/components/icons/CartIcon.tsx @@ -0,0 +1,15 @@ +export function CartIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/ChatBubbleIcon.tsx b/apps/formbricks-com/src/components/icons/ChatBubbleIcon.tsx new file mode 100644 index 0000000000..418427b05d --- /dev/null +++ b/apps/formbricks-com/src/components/icons/ChatBubbleIcon.tsx @@ -0,0 +1,17 @@ +export function ChatBubbleIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/CheckIcon.tsx b/apps/formbricks-com/src/components/icons/CheckIcon.tsx new file mode 100644 index 0000000000..b9433644d1 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/CheckIcon.tsx @@ -0,0 +1,17 @@ +export function CheckIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/ChevronRightLeftIcon.tsx b/apps/formbricks-com/src/components/icons/ChevronRightLeftIcon.tsx new file mode 100644 index 0000000000..281c9de529 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/ChevronRightLeftIcon.tsx @@ -0,0 +1,19 @@ +export function ChevronRightLeftIcon( + props: React.ComponentPropsWithoutRef<'svg'>, +) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/ClipboardIcon.tsx b/apps/formbricks-com/src/components/icons/ClipboardIcon.tsx new file mode 100644 index 0000000000..33d997b5b3 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/ClipboardIcon.tsx @@ -0,0 +1,17 @@ +export function ClipboardIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/CogIcon.tsx b/apps/formbricks-com/src/components/icons/CogIcon.tsx new file mode 100644 index 0000000000..cedecf5420 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/CogIcon.tsx @@ -0,0 +1,19 @@ +export function CogIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/CopyIcon.tsx b/apps/formbricks-com/src/components/icons/CopyIcon.tsx new file mode 100644 index 0000000000..0eedaaa4cb --- /dev/null +++ b/apps/formbricks-com/src/components/icons/CopyIcon.tsx @@ -0,0 +1,17 @@ +export function CopyIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/DocumentIcon.tsx b/apps/formbricks-com/src/components/icons/DocumentIcon.tsx new file mode 100644 index 0000000000..8f83d2094f --- /dev/null +++ b/apps/formbricks-com/src/components/icons/DocumentIcon.tsx @@ -0,0 +1,17 @@ +export function DocumentIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/EnvelopeIcon.tsx b/apps/formbricks-com/src/components/icons/EnvelopeIcon.tsx new file mode 100644 index 0000000000..de57e4c475 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/EnvelopeIcon.tsx @@ -0,0 +1,17 @@ +export function EnvelopeIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/FaceSmileIcon.tsx b/apps/formbricks-com/src/components/icons/FaceSmileIcon.tsx new file mode 100644 index 0000000000..7c855a63ea --- /dev/null +++ b/apps/formbricks-com/src/components/icons/FaceSmileIcon.tsx @@ -0,0 +1,17 @@ +export function FaceSmileIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/FolderIcon.tsx b/apps/formbricks-com/src/components/icons/FolderIcon.tsx new file mode 100644 index 0000000000..050c77bb75 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/FolderIcon.tsx @@ -0,0 +1,22 @@ +export function FolderIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/LinkIcon.tsx b/apps/formbricks-com/src/components/icons/LinkIcon.tsx new file mode 100644 index 0000000000..f77d6184ab --- /dev/null +++ b/apps/formbricks-com/src/components/icons/LinkIcon.tsx @@ -0,0 +1,12 @@ +export function LinkIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/ListIcon.tsx b/apps/formbricks-com/src/components/icons/ListIcon.tsx new file mode 100644 index 0000000000..69354ec067 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/ListIcon.tsx @@ -0,0 +1,17 @@ +export function ListIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/MagnifyingGlassIcon.tsx b/apps/formbricks-com/src/components/icons/MagnifyingGlassIcon.tsx new file mode 100644 index 0000000000..5e219f6340 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/MagnifyingGlassIcon.tsx @@ -0,0 +1,15 @@ +export function MagnifyingGlassIcon( + props: React.ComponentPropsWithoutRef<'svg'>, +) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/MapPinIcon.tsx b/apps/formbricks-com/src/components/icons/MapPinIcon.tsx new file mode 100644 index 0000000000..6070adb133 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/MapPinIcon.tsx @@ -0,0 +1,19 @@ +export function MapPinIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/PackageIcon.tsx b/apps/formbricks-com/src/components/icons/PackageIcon.tsx new file mode 100644 index 0000000000..6bd9225f5f --- /dev/null +++ b/apps/formbricks-com/src/components/icons/PackageIcon.tsx @@ -0,0 +1,16 @@ +export function PackageIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/PaperAirplaneIcon.tsx b/apps/formbricks-com/src/components/icons/PaperAirplaneIcon.tsx new file mode 100644 index 0000000000..12c29b9150 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/PaperAirplaneIcon.tsx @@ -0,0 +1,19 @@ +export function PaperAirplaneIcon( + props: React.ComponentPropsWithoutRef<'svg'>, +) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/PaperClipIcon.tsx b/apps/formbricks-com/src/components/icons/PaperClipIcon.tsx new file mode 100644 index 0000000000..db51c7f708 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/PaperClipIcon.tsx @@ -0,0 +1,12 @@ +export function PaperClipIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/ShapesIcon.tsx b/apps/formbricks-com/src/components/icons/ShapesIcon.tsx new file mode 100644 index 0000000000..ac57a52ca2 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/ShapesIcon.tsx @@ -0,0 +1,17 @@ +export function ShapesIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/ShirtIcon.tsx b/apps/formbricks-com/src/components/icons/ShirtIcon.tsx new file mode 100644 index 0000000000..f8cdfd5086 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/ShirtIcon.tsx @@ -0,0 +1,11 @@ +export function ShirtIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/SquaresPlusIcon.tsx b/apps/formbricks-com/src/components/icons/SquaresPlusIcon.tsx new file mode 100644 index 0000000000..0005f59d57 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/SquaresPlusIcon.tsx @@ -0,0 +1,17 @@ +export function SquaresPlusIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/TagIcon.tsx b/apps/formbricks-com/src/components/icons/TagIcon.tsx new file mode 100644 index 0000000000..f360241439 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/TagIcon.tsx @@ -0,0 +1,19 @@ +export function TagIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/UserIcon.tsx b/apps/formbricks-com/src/components/icons/UserIcon.tsx new file mode 100644 index 0000000000..78bb8f6174 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/UserIcon.tsx @@ -0,0 +1,24 @@ +export function UserIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/icons/UsersIcon.tsx b/apps/formbricks-com/src/components/icons/UsersIcon.tsx new file mode 100644 index 0000000000..aa7d13b3d1 --- /dev/null +++ b/apps/formbricks-com/src/components/icons/UsersIcon.tsx @@ -0,0 +1,28 @@ +export function UsersIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} diff --git a/apps/formbricks-com/src/components/mdx.tsx b/apps/formbricks-com/src/components/mdx.tsx new file mode 100644 index 0000000000..b8489b99f6 --- /dev/null +++ b/apps/formbricks-com/src/components/mdx.tsx @@ -0,0 +1,127 @@ +import Link from 'next/link' +import clsx from 'clsx' + +import { Feedback } from '@/components/Feedback' +import { Heading } from '@/components/Heading' +import { Prose } from '@/components/Prose' + +export const a = Link +export { Button } from '@/components/Button' +export { CodeGroup, Code as code, Pre as pre } from '@/components/Code' + +export function wrapper({ children }: { children: React.ReactNode }) { + return ( +
    + {children} +
    + +
    +
    + ) +} + +export const h2 = function H2( + props: Omit, 'level'>, +) { + return +} + +function InfoIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +export function Note({ children }: { children: React.ReactNode }) { + return ( +
    + +
    + {children} +
    +
    + ) +} + +export function Row({ children }: { children: React.ReactNode }) { + return ( +
    + {children} +
    + ) +} + +export function Col({ + children, + sticky = false, +}: { + children: React.ReactNode + sticky?: boolean +}) { + return ( +
    :first-child]:mt-0 [&>:last-child]:mb-0', + sticky && 'xl:sticky xl:top-24', + )} + > + {children} +
    + ) +} + +export function Properties({ children }: { children: React.ReactNode }) { + return ( +
    +
      + {children} +
    +
    + ) +} + +export function Property({ + name, + children, + type, +}: { + name: string + children: React.ReactNode + type?: string +}) { + return ( +
  • +
    +
    Name
    +
    + {name} +
    + {type && ( + <> +
    Type
    +
    + {type} +
    + + )} +
    Description
    +
    + {children} +
    +
    +
  • + ) +} diff --git a/apps/formbricks-com/src/images/logos/go.svg b/apps/formbricks-com/src/images/logos/go.svg new file mode 100644 index 0000000000..7f7b19de5c --- /dev/null +++ b/apps/formbricks-com/src/images/logos/go.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/apps/formbricks-com/src/images/logos/node.svg b/apps/formbricks-com/src/images/logos/node.svg new file mode 100644 index 0000000000..1d09de22bb --- /dev/null +++ b/apps/formbricks-com/src/images/logos/node.svg @@ -0,0 +1,4 @@ + + + diff --git a/apps/formbricks-com/src/images/logos/php.svg b/apps/formbricks-com/src/images/logos/php.svg new file mode 100644 index 0000000000..0a9ac462a1 --- /dev/null +++ b/apps/formbricks-com/src/images/logos/php.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/apps/formbricks-com/src/images/logos/python.svg b/apps/formbricks-com/src/images/logos/python.svg new file mode 100644 index 0000000000..9bceb587ab --- /dev/null +++ b/apps/formbricks-com/src/images/logos/python.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/apps/formbricks-com/src/images/logos/ruby.svg b/apps/formbricks-com/src/images/logos/ruby.svg new file mode 100644 index 0000000000..b22a5bf106 --- /dev/null +++ b/apps/formbricks-com/src/images/logos/ruby.svg @@ -0,0 +1,4 @@ + + + diff --git a/apps/formbricks-com/src/lib/remToPx.ts b/apps/formbricks-com/src/lib/remToPx.ts new file mode 100644 index 0000000000..d3c3953a13 --- /dev/null +++ b/apps/formbricks-com/src/lib/remToPx.ts @@ -0,0 +1,8 @@ +export function remToPx(remValue: number) { + let rootFontSize = + typeof window === 'undefined' + ? 16 + : parseFloat(window.getComputedStyle(document.documentElement).fontSize) + + return remValue * rootFontSize +} diff --git a/apps/formbricks-com/src/mdx/recma.mjs b/apps/formbricks-com/src/mdx/recma.mjs new file mode 100644 index 0000000000..b88cc48d42 --- /dev/null +++ b/apps/formbricks-com/src/mdx/recma.mjs @@ -0,0 +1,3 @@ +import { mdxAnnotations } from 'mdx-annotations' + +export const recmaPlugins = [mdxAnnotations.recma] diff --git a/apps/formbricks-com/src/mdx/rehype.mjs b/apps/formbricks-com/src/mdx/rehype.mjs new file mode 100644 index 0000000000..06b2007788 --- /dev/null +++ b/apps/formbricks-com/src/mdx/rehype.mjs @@ -0,0 +1,124 @@ +import { slugifyWithCounter } from '@sindresorhus/slugify' +import * as acorn from 'acorn' +import { toString } from 'mdast-util-to-string' +import { mdxAnnotations } from 'mdx-annotations' +import shiki from 'shiki' +import { visit } from 'unist-util-visit' + +function rehypeParseCodeBlocks() { + return (tree) => { + visit(tree, 'element', (node, _nodeIndex, parentNode) => { + if (node.tagName === 'code' && node.properties.className) { + parentNode.properties.language = node.properties.className[0]?.replace( + /^language-/, + '', + ) + } + }) + } +} + +let highlighter + +function rehypeShiki() { + return async (tree) => { + highlighter = + highlighter ?? (await shiki.getHighlighter({ theme: 'css-variables' })) + + visit(tree, 'element', (node) => { + if (node.tagName === 'pre' && node.children[0]?.tagName === 'code') { + let codeNode = node.children[0] + let textNode = codeNode.children[0] + + node.properties.code = textNode.value + + if (node.properties.language) { + let tokens = highlighter.codeToThemedTokens( + textNode.value, + node.properties.language, + ) + + textNode.value = shiki.renderToHtml(tokens, { + elements: { + pre: ({ children }) => children, + code: ({ children }) => children, + line: ({ children }) => `${children}`, + }, + }) + } + } + }) + } +} + +function rehypeSlugify() { + return (tree) => { + let slugify = slugifyWithCounter() + visit(tree, 'element', (node) => { + if (node.tagName === 'h2' && !node.properties.id) { + node.properties.id = slugify(toString(node)) + } + }) + } +} + +function rehypeAddMDXExports(getExports) { + return (tree) => { + let exports = Object.entries(getExports(tree)) + + for (let [name, value] of exports) { + for (let node of tree.children) { + if ( + node.type === 'mdxjsEsm' && + new RegExp(`export\\s+const\\s+${name}\\s*=`).test(node.value) + ) { + return + } + } + + let exportStr = `export const ${name} = ${value}` + + tree.children.push({ + type: 'mdxjsEsm', + value: exportStr, + data: { + estree: acorn.parse(exportStr, { + sourceType: 'module', + ecmaVersion: 'latest', + }), + }, + }) + } + } +} + +function getSections(node) { + let sections = [] + + for (let child of node.children ?? []) { + if (child.type === 'element' && child.tagName === 'h2') { + sections.push(`{ + title: ${JSON.stringify(toString(child))}, + id: ${JSON.stringify(child.properties.id)}, + ...${child.properties.annotation} + }`) + } else if (child.children) { + sections.push(...getSections(child)) + } + } + + return sections +} + +export const rehypePlugins = [ + mdxAnnotations.rehype, + rehypeParseCodeBlocks, + rehypeShiki, + rehypeSlugify, + [ + rehypeAddMDXExports, + (tree) => ({ + sections: `[${getSections(tree).join()}]`, + }), + ], +] diff --git a/apps/formbricks-com/src/mdx/remark.mjs b/apps/formbricks-com/src/mdx/remark.mjs new file mode 100644 index 0000000000..e523464b4e --- /dev/null +++ b/apps/formbricks-com/src/mdx/remark.mjs @@ -0,0 +1,4 @@ +import { mdxAnnotations } from 'mdx-annotations' +import remarkGfm from 'remark-gfm' + +export const remarkPlugins = [mdxAnnotations.remark, remarkGfm] diff --git a/apps/formbricks-com/src/mdx/search.mjs b/apps/formbricks-com/src/mdx/search.mjs new file mode 100644 index 0000000000..a605e8bd38 --- /dev/null +++ b/apps/formbricks-com/src/mdx/search.mjs @@ -0,0 +1,135 @@ +import { slugifyWithCounter } from '@sindresorhus/slugify' +import glob from 'fast-glob' +import * as fs from 'fs' +import { toString } from 'mdast-util-to-string' +import * as path from 'path' +import { remark } from 'remark' +import remarkMdx from 'remark-mdx' +import { createLoader } from 'simple-functional-loader' +import { filter } from 'unist-util-filter' +import { SKIP, visit } from 'unist-util-visit' +import * as url from 'url' + +const __filename = url.fileURLToPath(import.meta.url) +const processor = remark().use(remarkMdx).use(extractSections) +const slugify = slugifyWithCounter() + +function isObjectExpression(node) { + return ( + node.type === 'mdxTextExpression' && + node.data?.estree?.body?.[0]?.expression?.type === 'ObjectExpression' + ) +} + +function excludeObjectExpressions(tree) { + return filter(tree, (node) => !isObjectExpression(node)) +} + +function extractSections() { + return (tree, { sections }) => { + slugify.reset() + + visit(tree, (node) => { + if (node.type === 'heading' || node.type === 'paragraph') { + let content = toString(excludeObjectExpressions(node)) + if (node.type === 'heading' && node.depth <= 2) { + let hash = node.depth === 1 ? null : slugify(content) + sections.push([content, hash, []]) + } else { + sections.at(-1)?.[2].push(content) + } + return SKIP + } + }) + } +} + +export default function (nextConfig = {}) { + let cache = new Map() + + return Object.assign({}, nextConfig, { + webpack(config, options) { + config.module.rules.push({ + test: __filename, + use: [ + createLoader(function () { + let appDir = path.resolve('./src/app') + this.addContextDependency(appDir) + + let files = glob.sync('**/*.mdx', { cwd: appDir }) + let data = files.map((file) => { + let url = '/' + file.replace(/(^|\/)page\.mdx$/, '') + let mdx = fs.readFileSync(path.join(appDir, file), 'utf8') + + let sections = [] + + if (cache.get(file)?.[0] === mdx) { + sections = cache.get(file)[1] + } else { + let vfile = { value: mdx, sections } + processor.runSync(processor.parse(vfile), vfile) + cache.set(file, [mdx, sections]) + } + + return { url, sections } + }) + + // When this file is imported within the application + // the following module is loaded: + return ` + import FlexSearch from 'flexsearch' + + let sectionIndex = new FlexSearch.Document({ + tokenize: 'full', + document: { + id: 'url', + index: 'content', + store: ['title', 'pageTitle'], + }, + context: { + resolution: 9, + depth: 2, + bidirectional: true + } + }) + + let data = ${JSON.stringify(data)} + + for (let { url, sections } of data) { + for (let [title, hash, content] of sections) { + sectionIndex.add({ + url: url + (hash ? ('#' + hash) : ''), + title, + content: [title, ...content].join('\\n'), + pageTitle: hash ? sections[0][0] : undefined, + }) + } + } + + export function search(query, options = {}) { + let result = sectionIndex.search(query, { + ...options, + enrich: true, + }) + if (result.length === 0) { + return [] + } + return result[0].result.map((item) => ({ + url: item.id, + title: item.doc.title, + pageTitle: item.doc.pageTitle, + })) + } + ` + }), + ], + }) + + if (typeof nextConfig.webpack === 'function') { + return nextConfig.webpack(config, options) + } + + return config + }, + }) +} diff --git a/apps/formbricks-com/src/styles/tailwind.css b/apps/formbricks-com/src/styles/tailwind.css new file mode 100644 index 0000000000..6673210f08 --- /dev/null +++ b/apps/formbricks-com/src/styles/tailwind.css @@ -0,0 +1,21 @@ +@layer base { + :root { + --shiki-color-text: theme('colors.white'); + --shiki-token-constant: theme('colors.emerald.300'); + --shiki-token-string: theme('colors.emerald.300'); + --shiki-token-comment: theme('colors.zinc.500'); + --shiki-token-keyword: theme('colors.sky.300'); + --shiki-token-parameter: theme('colors.pink.300'); + --shiki-token-function: theme('colors.violet.300'); + --shiki-token-string-expression: theme('colors.emerald.300'); + --shiki-token-punctuation: theme('colors.zinc.200'); + } + + [inert] ::-webkit-scrollbar { + display: none; + } +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/formbricks-com/tailwind.config.ts b/apps/formbricks-com/tailwind.config.ts new file mode 100644 index 0000000000..42ac3fe529 --- /dev/null +++ b/apps/formbricks-com/tailwind.config.ts @@ -0,0 +1,46 @@ +import { type Config } from 'tailwindcss' +import typographyStyles from './typography' +import typographyPlugin from '@tailwindcss/typography' +import headlessuiPlugin from '@headlessui/tailwindcss' + +export default { + content: ['./src/**/*.{js,mjs,jsx,ts,tsx,mdx}'], + darkMode: 'class', + theme: { + fontSize: { + '2xs': ['0.75rem', { lineHeight: '1.25rem' }], + xs: ['0.8125rem', { lineHeight: '1.5rem' }], + sm: ['0.875rem', { lineHeight: '1.5rem' }], + base: ['1rem', { lineHeight: '1.75rem' }], + lg: ['1.125rem', { lineHeight: '1.75rem' }], + xl: ['1.25rem', { lineHeight: '1.75rem' }], + '2xl': ['1.5rem', { lineHeight: '2rem' }], + '3xl': ['1.875rem', { lineHeight: '2.25rem' }], + '4xl': ['2.25rem', { lineHeight: '2.5rem' }], + '5xl': ['3rem', { lineHeight: '1' }], + '6xl': ['3.75rem', { lineHeight: '1' }], + '7xl': ['4.5rem', { lineHeight: '1' }], + '8xl': ['6rem', { lineHeight: '1' }], + '9xl': ['8rem', { lineHeight: '1' }], + }, + typography: typographyStyles, + extend: { + boxShadow: { + glow: '0 0 4px rgb(0 0 0 / 0.1)', + }, + maxWidth: { + lg: '33rem', + '2xl': '40rem', + '3xl': '50rem', + '5xl': '66rem', + }, + opacity: { + 1: '0.01', + 2.5: '0.025', + 7.5: '0.075', + 15: '0.15', + }, + }, + }, + plugins: [typographyPlugin, headlessuiPlugin], +} satisfies Config diff --git a/apps/formbricks-com/tsconfig.json b/apps/formbricks-com/tsconfig.json index a678898cf4..13d6b45cae 100644 --- a/apps/formbricks-com/tsconfig.json +++ b/apps/formbricks-com/tsconfig.json @@ -1,15 +1,28 @@ { - "extends": "@formbricks/tsconfig/nextjs.json", - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/types/*.d.ts"], "compilerOptions": { - "baseUrl": ".", + "target": "es6", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], "paths": { - "@/*": ["./*"] + "@/*": ["./src/*"] } }, - "plugins": [ - { - "name": "next" - } - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/apps/formbricks-com/types.d.ts b/apps/formbricks-com/types.d.ts new file mode 100644 index 0000000000..2a23707232 --- /dev/null +++ b/apps/formbricks-com/types.d.ts @@ -0,0 +1,11 @@ +import { type SearchOptions } from 'flexsearch' + +declare module '@/mdx/search.mjs' { + export type Result = { + url: string + title: string + pageTitle?: string + } + + export function search(query: string, options?: SearchOptions): Array +} diff --git a/apps/formbricks-com/typography.ts b/apps/formbricks-com/typography.ts new file mode 100644 index 0000000000..c036540f63 --- /dev/null +++ b/apps/formbricks-com/typography.ts @@ -0,0 +1,361 @@ +import { type PluginUtils } from 'tailwindcss/types/config' + +export default function typographyStyles({ theme }: PluginUtils) { + return { + DEFAULT: { + css: { + '--tw-prose-body': theme('colors.zinc.700'), + '--tw-prose-headings': theme('colors.zinc.900'), + '--tw-prose-links': theme('colors.emerald.500'), + '--tw-prose-links-hover': theme('colors.emerald.600'), + '--tw-prose-links-underline': theme('colors.emerald.500 / 0.3'), + '--tw-prose-bold': theme('colors.zinc.900'), + '--tw-prose-counters': theme('colors.zinc.500'), + '--tw-prose-bullets': theme('colors.zinc.300'), + '--tw-prose-hr': theme('colors.zinc.900 / 0.05'), + '--tw-prose-quotes': theme('colors.zinc.900'), + '--tw-prose-quote-borders': theme('colors.zinc.200'), + '--tw-prose-captions': theme('colors.zinc.500'), + '--tw-prose-code': theme('colors.zinc.900'), + '--tw-prose-code-bg': theme('colors.zinc.100'), + '--tw-prose-code-ring': theme('colors.zinc.300'), + '--tw-prose-th-borders': theme('colors.zinc.300'), + '--tw-prose-td-borders': theme('colors.zinc.200'), + + '--tw-prose-invert-body': theme('colors.zinc.400'), + '--tw-prose-invert-headings': theme('colors.white'), + '--tw-prose-invert-links': theme('colors.emerald.400'), + '--tw-prose-invert-links-hover': theme('colors.emerald.500'), + '--tw-prose-invert-links-underline': theme('colors.emerald.500 / 0.3'), + '--tw-prose-invert-bold': theme('colors.white'), + '--tw-prose-invert-counters': theme('colors.zinc.400'), + '--tw-prose-invert-bullets': theme('colors.zinc.600'), + '--tw-prose-invert-hr': theme('colors.white / 0.05'), + '--tw-prose-invert-quotes': theme('colors.zinc.100'), + '--tw-prose-invert-quote-borders': theme('colors.zinc.700'), + '--tw-prose-invert-captions': theme('colors.zinc.400'), + '--tw-prose-invert-code': theme('colors.white'), + '--tw-prose-invert-code-bg': theme('colors.zinc.700 / 0.15'), + '--tw-prose-invert-code-ring': theme('colors.white / 0.1'), + '--tw-prose-invert-th-borders': theme('colors.zinc.600'), + '--tw-prose-invert-td-borders': theme('colors.zinc.700'), + + // Base + color: 'var(--tw-prose-body)', + fontSize: theme('fontSize.sm')[0], + lineHeight: theme('lineHeight.7'), + + // Layout + '> *': { + maxWidth: theme('maxWidth.2xl'), + marginLeft: 'auto', + marginRight: 'auto', + '@screen lg': { + maxWidth: theme('maxWidth.3xl'), + marginLeft: `calc(50% - min(50%, ${theme('maxWidth.lg')}))`, + marginRight: `calc(50% - min(50%, ${theme('maxWidth.lg')}))`, + }, + }, + + // Text + p: { + marginTop: theme('spacing.6'), + marginBottom: theme('spacing.6'), + }, + '[class~="lead"]': { + fontSize: theme('fontSize.base')[0], + ...theme('fontSize.base')[1], + }, + + // Lists + ol: { + listStyleType: 'decimal', + marginTop: theme('spacing.5'), + marginBottom: theme('spacing.5'), + paddingLeft: '1.625rem', + }, + 'ol[type="A"]': { + listStyleType: 'upper-alpha', + }, + 'ol[type="a"]': { + listStyleType: 'lower-alpha', + }, + 'ol[type="A" s]': { + listStyleType: 'upper-alpha', + }, + 'ol[type="a" s]': { + listStyleType: 'lower-alpha', + }, + 'ol[type="I"]': { + listStyleType: 'upper-roman', + }, + 'ol[type="i"]': { + listStyleType: 'lower-roman', + }, + 'ol[type="I" s]': { + listStyleType: 'upper-roman', + }, + 'ol[type="i" s]': { + listStyleType: 'lower-roman', + }, + 'ol[type="1"]': { + listStyleType: 'decimal', + }, + ul: { + listStyleType: 'disc', + marginTop: theme('spacing.5'), + marginBottom: theme('spacing.5'), + paddingLeft: '1.625rem', + }, + li: { + marginTop: theme('spacing.2'), + marginBottom: theme('spacing.2'), + }, + ':is(ol, ul) > li': { + paddingLeft: theme('spacing[1.5]'), + }, + 'ol > li::marker': { + fontWeight: '400', + color: 'var(--tw-prose-counters)', + }, + 'ul > li::marker': { + color: 'var(--tw-prose-bullets)', + }, + '> ul > li p': { + marginTop: theme('spacing.3'), + marginBottom: theme('spacing.3'), + }, + '> ul > li > *:first-child': { + marginTop: theme('spacing.5'), + }, + '> ul > li > *:last-child': { + marginBottom: theme('spacing.5'), + }, + '> ol > li > *:first-child': { + marginTop: theme('spacing.5'), + }, + '> ol > li > *:last-child': { + marginBottom: theme('spacing.5'), + }, + 'ul ul, ul ol, ol ul, ol ol': { + marginTop: theme('spacing.3'), + marginBottom: theme('spacing.3'), + }, + + // Horizontal rules + hr: { + borderColor: 'var(--tw-prose-hr)', + borderTopWidth: 1, + marginTop: theme('spacing.16'), + marginBottom: theme('spacing.16'), + maxWidth: 'none', + marginLeft: `calc(-1 * ${theme('spacing.4')})`, + marginRight: `calc(-1 * ${theme('spacing.4')})`, + '@screen sm': { + marginLeft: `calc(-1 * ${theme('spacing.6')})`, + marginRight: `calc(-1 * ${theme('spacing.6')})`, + }, + '@screen lg': { + marginLeft: `calc(-1 * ${theme('spacing.8')})`, + marginRight: `calc(-1 * ${theme('spacing.8')})`, + }, + }, + + // Quotes + blockquote: { + fontWeight: '500', + fontStyle: 'italic', + color: 'var(--tw-prose-quotes)', + borderLeftWidth: '0.25rem', + borderLeftColor: 'var(--tw-prose-quote-borders)', + quotes: '"\\201C""\\201D""\\2018""\\2019"', + marginTop: theme('spacing.8'), + marginBottom: theme('spacing.8'), + paddingLeft: theme('spacing.5'), + }, + 'blockquote p:first-of-type::before': { + content: 'open-quote', + }, + 'blockquote p:last-of-type::after': { + content: 'close-quote', + }, + + // Headings + h1: { + color: 'var(--tw-prose-headings)', + fontWeight: '700', + fontSize: theme('fontSize.2xl')[0], + ...theme('fontSize.2xl')[1], + marginBottom: theme('spacing.2'), + }, + h2: { + color: 'var(--tw-prose-headings)', + fontWeight: '600', + fontSize: theme('fontSize.lg')[0], + ...theme('fontSize.lg')[1], + marginTop: theme('spacing.16'), + marginBottom: theme('spacing.2'), + }, + h3: { + color: 'var(--tw-prose-headings)', + fontSize: theme('fontSize.base')[0], + ...theme('fontSize.base')[1], + fontWeight: '600', + marginTop: theme('spacing.10'), + marginBottom: theme('spacing.2'), + }, + + // Media + 'img, video, figure': { + marginTop: theme('spacing.8'), + marginBottom: theme('spacing.8'), + }, + 'figure > *': { + marginTop: '0', + marginBottom: '0', + }, + figcaption: { + color: 'var(--tw-prose-captions)', + fontSize: theme('fontSize.xs')[0], + ...theme('fontSize.xs')[1], + marginTop: theme('spacing.2'), + }, + + // Tables + table: { + width: '100%', + tableLayout: 'auto', + textAlign: 'left', + marginTop: theme('spacing.8'), + marginBottom: theme('spacing.8'), + lineHeight: theme('lineHeight.6'), + }, + thead: { + borderBottomWidth: '1px', + borderBottomColor: 'var(--tw-prose-th-borders)', + }, + 'thead th': { + color: 'var(--tw-prose-headings)', + fontWeight: '600', + verticalAlign: 'bottom', + paddingRight: theme('spacing.2'), + paddingBottom: theme('spacing.2'), + paddingLeft: theme('spacing.2'), + }, + 'thead th:first-child': { + paddingLeft: '0', + }, + 'thead th:last-child': { + paddingRight: '0', + }, + 'tbody tr': { + borderBottomWidth: '1px', + borderBottomColor: 'var(--tw-prose-td-borders)', + }, + 'tbody tr:last-child': { + borderBottomWidth: '0', + }, + 'tbody td': { + verticalAlign: 'baseline', + }, + tfoot: { + borderTopWidth: '1px', + borderTopColor: 'var(--tw-prose-th-borders)', + }, + 'tfoot td': { + verticalAlign: 'top', + }, + ':is(tbody, tfoot) td': { + paddingTop: theme('spacing.2'), + paddingRight: theme('spacing.2'), + paddingBottom: theme('spacing.2'), + paddingLeft: theme('spacing.2'), + }, + ':is(tbody, tfoot) td:first-child': { + paddingLeft: '0', + }, + ':is(tbody, tfoot) td:last-child': { + paddingRight: '0', + }, + + // Inline elements + a: { + color: 'var(--tw-prose-links)', + textDecoration: 'underline transparent', + fontWeight: '500', + transitionProperty: 'color, text-decoration-color', + transitionDuration: theme('transitionDuration.DEFAULT'), + transitionTimingFunction: theme('transitionTimingFunction.DEFAULT'), + '&:hover': { + color: 'var(--tw-prose-links-hover)', + textDecorationColor: 'var(--tw-prose-links-underline)', + }, + }, + ':is(h1, h2, h3) a': { + fontWeight: 'inherit', + }, + strong: { + color: 'var(--tw-prose-bold)', + fontWeight: '600', + }, + ':is(a, blockquote, thead th) strong': { + color: 'inherit', + }, + code: { + color: 'var(--tw-prose-code)', + borderRadius: theme('borderRadius.lg'), + paddingTop: theme('padding.1'), + paddingRight: theme('padding[1.5]'), + paddingBottom: theme('padding.1'), + paddingLeft: theme('padding[1.5]'), + boxShadow: 'inset 0 0 0 1px var(--tw-prose-code-ring)', + backgroundColor: 'var(--tw-prose-code-bg)', + fontSize: theme('fontSize.2xs'), + }, + ':is(a, h1, h2, h3, blockquote, thead th) code': { + color: 'inherit', + }, + 'h2 code': { + fontSize: theme('fontSize.base')[0], + fontWeight: 'inherit', + }, + 'h3 code': { + fontSize: theme('fontSize.sm')[0], + fontWeight: 'inherit', + }, + + // Overrides + ':is(h1, h2, h3) + *': { + marginTop: '0', + }, + '> :first-child': { + marginTop: '0 !important', + }, + '> :last-child': { + marginBottom: '0 !important', + }, + }, + }, + invert: { + css: { + '--tw-prose-body': 'var(--tw-prose-invert-body)', + '--tw-prose-headings': 'var(--tw-prose-invert-headings)', + '--tw-prose-links': 'var(--tw-prose-invert-links)', + '--tw-prose-links-hover': 'var(--tw-prose-invert-links-hover)', + '--tw-prose-links-underline': 'var(--tw-prose-invert-links-underline)', + '--tw-prose-bold': 'var(--tw-prose-invert-bold)', + '--tw-prose-counters': 'var(--tw-prose-invert-counters)', + '--tw-prose-bullets': 'var(--tw-prose-invert-bullets)', + '--tw-prose-hr': 'var(--tw-prose-invert-hr)', + '--tw-prose-quotes': 'var(--tw-prose-invert-quotes)', + '--tw-prose-quote-borders': 'var(--tw-prose-invert-quote-borders)', + '--tw-prose-captions': 'var(--tw-prose-invert-captions)', + '--tw-prose-code': 'var(--tw-prose-invert-code)', + '--tw-prose-code-bg': 'var(--tw-prose-invert-code-bg)', + '--tw-prose-code-ring': 'var(--tw-prose-invert-code-ring)', + '--tw-prose-th-borders': 'var(--tw-prose-invert-th-borders)', + '--tw-prose-td-borders': 'var(--tw-prose-invert-td-borders)', + }, + }, + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2c472cd2f..b218d8df22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,124 @@ importers: version: link:../../packages/eslint-config-formbricks apps/formbricks-com: + dependencies: + '@algolia/autocomplete-core': + specifier: ^1.7.3 + version: 1.9.3(@algolia/client-search@4.14.2)(algoliasearch@4.14.2)(search-insights@2.6.0) + '@headlessui/react': + specifier: ^1.7.15 + version: 1.7.16(react-dom@18.2.0)(react@18.2.0) + '@headlessui/tailwindcss': + specifier: ^0.2.0 + version: 0.2.0(tailwindcss@3.3.3) + '@mdx-js/loader': + specifier: ^2.3.0 + version: 2.3.0(webpack@5.75.0) + '@mdx-js/react': + specifier: ^2.3.0 + version: 2.3.0(react@18.2.0) + '@next/mdx': + specifier: 13.4.16 + version: 13.4.16(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0) + '@sindresorhus/slugify': + specifier: ^2.1.1 + version: 2.1.1 + '@tailwindcss/typography': + specifier: ^0.5.8 + version: 0.5.9(tailwindcss@3.3.3) + '@types/node': + specifier: 20.4.7 + version: 20.4.7 + '@types/react': + specifier: 18.2.18 + version: 18.2.18 + '@types/react-dom': + specifier: 18.2.7 + version: 18.2.7 + '@types/react-highlight-words': + specifier: ^0.16.4 + version: 0.16.4 + acorn: + specifier: ^8.8.1 + version: 8.8.1 + autoprefixer: + specifier: ^10.4.7 + version: 10.4.14(postcss@8.4.27) + clsx: + specifier: ^1.2.0 + version: 1.2.1 + fast-glob: + specifier: ^3.3.0 + version: 3.3.0 + flexsearch: + specifier: ^0.7.31 + version: 0.7.31 + framer-motion: + specifier: 7.8.1 + version: 7.8.1(react-dom@18.2.0)(react@18.2.0) + mdast-util-to-string: + specifier: ^3.2.0 + version: 3.2.0 + mdx-annotations: + specifier: ^0.1.1 + version: 0.1.1 + next: + specifier: 13.4.16 + version: 13.4.16(react-dom@18.2.0)(react@18.2.0) + next-themes: + specifier: ^0.2.1 + version: 0.2.1(next@13.4.16)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-highlight-words: + specifier: ^0.20.0 + version: 0.20.0(react@18.2.0) + remark: + specifier: ^14.0.2 + version: 14.0.2 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + remark-mdx: + specifier: ^2.3.0 + version: 2.3.0 + shiki: + specifier: ^0.11.1 + version: 0.11.1 + simple-functional-loader: + specifier: ^1.2.1 + version: 1.2.1 + tailwindcss: + specifier: ^3.3.3 + version: 3.3.3 + typescript: + specifier: 5.1.6 + version: 5.1.6 + unist-util-filter: + specifier: ^4.0.1 + version: 4.0.1 + unist-util-visit: + specifier: ^4.1.1 + version: 4.1.1 + zustand: + specifier: ^4.3.2 + version: 4.3.2(react@18.2.0) + devDependencies: + '@formbricks/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + eslint-config-formbricks: + specifier: workspace:* + version: link:../../packages/eslint-config-formbricks + sharp: + specifier: ^0.32.0 + version: 0.32.4 + + apps/formbricks-com-old: dependencies: '@calcom/embed-react': specifier: ^1.3.0 @@ -779,7 +897,6 @@ packages: /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - dev: true /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} @@ -2621,6 +2738,19 @@ packages: - search-insights dev: false + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + dev: false + optional: true + /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: @@ -2928,6 +3058,15 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@headlessui/tailwindcss@0.2.0(tailwindcss@3.3.3): + resolution: {integrity: sha512-fpL830Fln1SykOCboExsWr3JIVeQKieLJ3XytLe/tt1A0XzqUthOftDmjcCYLW62w7mQI7wXcoPXr3tZ9QfGxw==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 + dependencies: + tailwindcss: 3.3.3 + dev: false + /@heroicons/react@2.0.18(react@18.2.0): resolution: {integrity: sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==} peerDependencies: @@ -2986,7 +3125,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 jest-message-util: 29.6.2 jest-util: 29.6.2 @@ -3007,14 +3146,14 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.5.0 - jest-config: 29.6.2(@types/node@20.4.6) + jest-config: 29.6.2(@types/node@20.4.7) jest-haste-map: 29.6.2 jest-message-util: 29.6.2 jest-regex-util: 29.4.3 @@ -3042,7 +3181,7 @@ packages: dependencies: '@jest/fake-timers': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 jest-mock: 29.6.2 dev: true @@ -3076,7 +3215,7 @@ packages: dependencies: '@jest/types': 29.6.1 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.4.6 + '@types/node': 20.4.7 jest-message-util: 29.6.2 jest-mock: 29.6.2 jest-util: 29.6.2 @@ -3109,7 +3248,7 @@ packages: '@jest/transform': 29.6.2 '@jest/types': 29.6.1 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -3204,7 +3343,7 @@ packages: '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -3562,7 +3701,7 @@ packages: hast-util-to-estree: 2.1.0 markdown-extensions: 1.1.1 periscopic: 3.0.4 - remark-mdx: 2.1.5 + remark-mdx: 2.3.0 remark-parse: 10.0.1 remark-rehype: 10.1.0 unified: 10.1.2 @@ -3580,10 +3719,57 @@ packages: react: '>=16' dependencies: '@types/mdx': 2.0.3 - '@types/react': 18.2.7 + '@types/react': 18.2.18 react: 18.2.0 dev: false + /@motionone/animation@10.15.1: + resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + dependencies: + '@motionone/easing': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.5.3 + dev: false + + /@motionone/dom@10.16.2: + resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/generators': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.5.3 + dev: false + + /@motionone/easing@10.15.1: + resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + dependencies: + '@motionone/utils': 10.15.1 + tslib: 2.5.3 + dev: false + + /@motionone/generators@10.15.1: + resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + dependencies: + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.5.3 + dev: false + + /@motionone/types@10.15.1: + resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} + dev: false + + /@motionone/utils@10.15.1: + resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + dependencies: + '@motionone/types': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.5.3 + dev: false + /@next/env@13.4.10: resolution: {integrity: sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==} dev: false @@ -3592,8 +3778,8 @@ packages: resolution: {integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==} dev: false - /@next/env@13.4.8: - resolution: {integrity: sha512-twuSf1klb3k9wXI7IZhbZGtFCWvGD4wXTY2rmvzIgVhXhs7ISThrbNyutBx3jWIL8Y/Hk9+woytFz5QsgtcRKQ==} + /@next/env@13.4.16: + resolution: {integrity: sha512-pCU0sJBqdfKP9mwDadxvZd+eLz3fZrTlmmDHY12Hdpl3DD0vy8ou5HWKVfG0zZS6tqhL4wnQqRbspdY5nqa7MA==} dev: false /@next/eslint-plugin-next@13.4.12: @@ -3617,6 +3803,22 @@ packages: source-map: 0.7.4 dev: false + /@next/mdx@13.4.16(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0): + resolution: {integrity: sha512-4Yas2f0DFSi1BbtCAaMiv/EdGrBfflMEGBQf/QVAnVISihp/HwXiNhVN7wAt29vN9Mo/J4PtCKt8HQTYD7jbiA==} + peerDependencies: + '@mdx-js/loader': '>=0.15.0' + '@mdx-js/react': '>=0.15.0' + peerDependenciesMeta: + '@mdx-js/loader': + optional: true + '@mdx-js/react': + optional: true + dependencies: + '@mdx-js/loader': 2.3.0(webpack@5.75.0) + '@mdx-js/react': 2.3.0(react@18.2.0) + source-map: 0.7.4 + dev: false + /@next/swc-darwin-arm64@13.4.10: resolution: {integrity: sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==} engines: {node: '>= 10'} @@ -3635,6 +3837,15 @@ packages: dev: false optional: true + /@next/swc-darwin-arm64@13.4.16: + resolution: {integrity: sha512-Rl6i1uUq0ciRa3VfEpw6GnWAJTSKo9oM2OrkGXPsm7rMxdd2FR5NkKc0C9xzFCI4+QtmBviWBdF2m3ur3Nqstw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64@13.4.10: resolution: {integrity: sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==} engines: {node: '>= 10'} @@ -3653,6 +3864,15 @@ packages: dev: false optional: true + /@next/swc-darwin-x64@13.4.16: + resolution: {integrity: sha512-o1vIKYbZORyDmTrPV1hApt9NLyWrS5vr2p5hhLGpOnkBY1cz6DAXjv8Lgan8t6X87+83F0EUDlu7klN8ieZ06A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-gnu@13.4.10: resolution: {integrity: sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==} engines: {node: '>= 10'} @@ -3671,6 +3891,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-gnu@13.4.16: + resolution: {integrity: sha512-JRyAl8lCfyTng4zoOmE6hNI2f1MFUr7JyTYCHl1RxX42H4a5LMwJhDVQ7a9tmDZ/yj+0hpBn+Aan+d6lA3v0UQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl@13.4.10: resolution: {integrity: sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==} engines: {node: '>= 10'} @@ -3689,6 +3918,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-musl@13.4.16: + resolution: {integrity: sha512-9gqVqNzUMWbUDgDiND18xoUqhwSm2gmksqXgCU0qaOKt6oAjWz8cWYjgpPVD0WICKFylEY/gvPEP1fMZDVFZ/g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu@13.4.10: resolution: {integrity: sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==} engines: {node: '>= 10'} @@ -3707,6 +3945,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-gnu@13.4.16: + resolution: {integrity: sha512-KcQGwchAKmZVPa8i5PLTxvTs1/rcFnSltfpTm803Tr/BtBV3AxCkHLfhtoyVtVzx/kl/oue8oS+DSmbepQKwhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl@13.4.10: resolution: {integrity: sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==} engines: {node: '>= 10'} @@ -3725,6 +3972,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-musl@13.4.16: + resolution: {integrity: sha512-2RbMZNxYnJmW8EPHVBsGZPq5zqWAyBOc/YFxq/jIQ/Yn3RMFZ1dZVCjtIcsiaKmgh7mjA/W0ApbumutHNxRqqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc@13.4.10: resolution: {integrity: sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==} engines: {node: '>= 10'} @@ -3743,6 +3999,15 @@ packages: dev: false optional: true + /@next/swc-win32-arm64-msvc@13.4.16: + resolution: {integrity: sha512-thDcGonELN7edUKzjzlHrdoKkm7y8IAdItQpRvvMxNUXa4d9r0ElofhTZj5emR7AiXft17hpen+QAkcWpqG7Jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc@13.4.10: resolution: {integrity: sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==} engines: {node: '>= 10'} @@ -3761,6 +4026,15 @@ packages: dev: false optional: true + /@next/swc-win32-ia32-msvc@13.4.16: + resolution: {integrity: sha512-f7SE1Mo4JAchUWl0LQsbtySR9xCa+x55C0taetjUApKtcLR3AgAjASrrP+oE1inmLmw573qRnE1eZN8YJfEBQw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-x64-msvc@13.4.10: resolution: {integrity: sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==} engines: {node: '>= 10'} @@ -3779,6 +4053,15 @@ packages: dev: false optional: true + /@next/swc-win32-x64-msvc@13.4.16: + resolution: {integrity: sha512-WamDZm1M/OEM4QLce3lOmD1XdLEl37zYZwlmOLhmF7qYJ2G6oYm9+ejZVv+LakQIsIuXhSpVlOvrxIAHqwRkPQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -5350,6 +5633,21 @@ packages: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} + /@sindresorhus/slugify@2.1.1: + resolution: {integrity: sha512-XokPHZ+q6FtQGEi1hnfvARVJJVPEhwHQTPHPPuNHaN6zcHjzYNynhhHMopa1wNPqLAFOwpsbintunEqWecXJMg==} + engines: {node: '>=12'} + dependencies: + '@sindresorhus/transliterate': 1.6.0 + escape-string-regexp: 5.0.0 + dev: false + + /@sindresorhus/transliterate@1.6.0: + resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: false + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -5427,7 +5725,6 @@ packages: lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 tailwindcss: 3.3.3 - dev: true /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -5442,7 +5739,7 @@ packages: /@ts-morph/common@0.12.3: resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} dependencies: - fast-glob: 3.2.12 + fast-glob: 3.3.0 minimatch: 3.1.2 mkdirp: 1.0.4 path-browserify: 1.0.1 @@ -5491,32 +5788,32 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/connect-history-api-fallback@1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.33 - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/debug@4.1.7: @@ -5564,7 +5861,7 @@ packages: /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -5581,7 +5878,7 @@ packages: /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/hast@2.3.4: @@ -5600,7 +5897,7 @@ packages: /@types/http-proxy@1.17.10: resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/is-ci@3.0.0: @@ -5639,7 +5936,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -5653,7 +5950,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -5699,11 +5996,12 @@ packages: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node@20.4.5: - resolution: {integrity: sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==} - /@types/node@20.4.6: resolution: {integrity: sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==} + dev: true + + /@types/node@20.4.7: + resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -5735,7 +6033,12 @@ packages: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: '@types/react': 18.2.18 - dev: true + + /@types/react-highlight-words@0.16.4: + resolution: {integrity: sha512-KITBX3xzheQLu2s3bUgLmRE7ekmhc52zRjRTwkKayQARh30L4fjEGzGm7ULK9TuX2LgxWWavZqyQGDGjAHbL3w==} + dependencies: + '@types/react': 18.2.18 + dev: false /@types/react-redux@7.1.25: resolution: {integrity: sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==} @@ -5753,24 +6056,16 @@ packages: '@types/scheduler': 0.16.2 csstype: 3.1.1 - /@types/react@18.2.7: - resolution: {integrity: sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - dev: false - /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -5793,13 +6088,13 @@ packages: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/source-list-map@0.1.2: @@ -5835,7 +6130,7 @@ packages: /@types/webpack-sources@3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 '@types/source-list-map': 0.1.2 source-map: 0.7.4 dev: true @@ -5843,7 +6138,7 @@ packages: /@types/webpack@4.41.33: resolution: {integrity: sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 '@types/tapable': 1.0.8 '@types/uglify-js': 3.17.1 '@types/webpack-sources': 3.2.0 @@ -5854,7 +6149,7 @@ packages: /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 dev: true /@types/yargs-parser@21.0.0: @@ -6440,6 +6735,7 @@ packages: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true + dev: false /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -6623,7 +6919,6 @@ packages: /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true /anymatch@2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} @@ -6642,7 +6937,6 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true /aproba@1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} @@ -6679,7 +6973,6 @@ packages: /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -6883,8 +7176,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001466 + browserslist: 4.21.9 + caniuse-lite: 1.0.30001512 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -6899,14 +7192,13 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001466 + browserslist: 4.21.9 + caniuse-lite: 1.0.30001512 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.27 postcss-value-parser: 4.2.0 - dev: true /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} @@ -6942,7 +7234,6 @@ packages: /b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - dev: false /babel-code-frame@6.26.0: resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} @@ -7161,7 +7452,6 @@ packages: /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true /binary-extensions@1.13.1: resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} @@ -7173,7 +7463,6 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: true /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -7391,17 +7680,6 @@ packages: pako: 1.0.11 dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001512 - electron-to-chromium: 1.4.284 - node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: true - /browserslist@4.21.9: resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -7609,7 +7887,6 @@ packages: /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - dev: true /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} @@ -7643,10 +7920,6 @@ packages: lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001466: - resolution: {integrity: sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==} - dev: true - /caniuse-lite@1.0.30001512: resolution: {integrity: sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==} @@ -7800,7 +8073,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 - dev: true /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -8044,7 +8316,6 @@ packages: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - dev: false /colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -8086,7 +8357,6 @@ packages: /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: true /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} @@ -8301,7 +8571,7 @@ packages: webpack: ^4.37.0 || ^5.0.0 dependencies: cacache: 15.3.0 - fast-glob: 3.2.12 + fast-glob: 3.3.0 find-cache-dir: 3.3.2 glob-parent: 5.1.2 globby: 11.1.0 @@ -8611,7 +8881,6 @@ packages: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - dev: true /cssnano-preset-default@4.0.8: resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} @@ -8963,7 +9232,6 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: false /dedent@1.5.0: resolution: {integrity: sha512-3sSQTYoWKGcRHmHl6Y6opLpRJH55bxeGQ0Y1LCI5pZzUXvokVkj0FC4bi7uEwazxA9FQZ0Nv067Zt5kSUvXxEA==} @@ -9093,7 +9361,6 @@ packages: /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - dev: false /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} @@ -9110,7 +9377,6 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true /diff-sequences@29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} @@ -9138,7 +9404,6 @@ packages: /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} @@ -9335,10 +9600,6 @@ packages: jake: 10.8.5 dev: true - /electron-to-chromium@1.4.284: - resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} - dev: true - /electron-to-chromium@1.4.450: resolution: {integrity: sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw==} @@ -9377,7 +9638,6 @@ packages: /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - dev: true /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} @@ -10305,7 +10565,6 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - dev: false /expect@29.5.0: resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} @@ -10323,7 +10582,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.6.2 - '@types/node': 20.4.6 + '@types/node': 20.4.7 jest-get-type: 29.4.3 jest-matcher-utils: 29.6.2 jest-message-util: 29.6.2 @@ -10424,10 +10683,9 @@ packages: /fast-fifo@1.3.0: resolution: {integrity: sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==} - dev: false - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10627,6 +10885,10 @@ packages: /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flexsearch@0.7.31: + resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + dev: false + /flush-write-stream@1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} dependencies: @@ -10723,7 +10985,6 @@ packages: /fraction.js@4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true /fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} @@ -10732,6 +10993,21 @@ packages: map-cache: 0.2.2 dev: true + /framer-motion@7.8.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ujUbAaV7e6tElfez3OmttE000ZWLrGgETTQZRjoq+p+w4gHG97hRpzVfUhR6gshWO869UgvvI1Cn+/4euWQg+Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@motionone/dom': 10.16.2 + hey-listen: 1.0.8 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.4.0 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -10960,7 +11236,6 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false /gittar@0.1.1: resolution: {integrity: sha512-p+XuqWJpW9ahUuNTptqeFjudFq31o6Jd+maMBarkMAR5U3K9c7zJB4sQ4BV8mIqrTOV29TtqikDhnZfCD4XNfQ==} @@ -11016,7 +11291,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} @@ -11089,7 +11363,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -11099,7 +11373,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -11358,6 +11632,14 @@ packages: resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} dev: true + /hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + + /highlight-words-core@1.2.2: + resolution: {integrity: sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==} + dev: false + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: @@ -11847,7 +12129,6 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -12361,7 +12642,7 @@ packages: '@jest/expect': 29.6.2 '@jest/test-result': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.0 @@ -12399,7 +12680,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.6.2(@types/node@20.4.6) + jest-config: 29.6.2(@types/node@20.4.7) jest-util: 29.6.2 jest-validate: 29.6.2 prompts: 2.4.2 @@ -12411,7 +12692,7 @@ packages: - ts-node dev: true - /jest-config@29.6.2(@types/node@20.4.6): + /jest-config@29.6.2(@types/node@20.4.7): resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -12426,7 +12707,7 @@ packages: '@babel/core': 7.22.9 '@jest/test-sequencer': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 babel-jest: 29.6.2(@babel/core@7.22.9) chalk: 4.1.2 ci-info: 3.7.0 @@ -12502,7 +12783,7 @@ packages: '@jest/fake-timers': 29.6.2 '@jest/types': 29.6.1 '@types/jsdom': 20.0.1 - '@types/node': 20.4.5 + '@types/node': 20.4.7 jest-mock: 29.6.2 jest-util: 29.6.2 jsdom: 20.0.3 @@ -12519,7 +12800,7 @@ packages: '@jest/environment': 29.6.2 '@jest/fake-timers': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 jest-mock: 29.6.2 jest-util: 29.6.2 dev: true @@ -12544,7 +12825,7 @@ packages: dependencies: '@jest/types': 29.6.1 '@types/graceful-fs': 4.1.5 - '@types/node': 20.4.6 + '@types/node': 20.4.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -12620,7 +12901,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 jest-util: 29.6.2 dev: true @@ -12703,7 +12984,7 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -12734,7 +13015,7 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -12786,7 +13067,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -12798,7 +13079,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -12839,7 +13120,7 @@ packages: dependencies: '@jest/test-result': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12853,7 +13134,7 @@ packages: dependencies: '@jest/test-result': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.4.6 + '@types/node': 20.4.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12865,7 +13146,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -12874,7 +13155,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -12883,7 +13164,7 @@ packages: resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.4.6 + '@types/node': 20.4.7 jest-util: 29.6.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12913,7 +13194,6 @@ packages: /jiti@1.18.2: resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} hasBin: true - dev: true /jose@4.13.1: resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} @@ -13082,7 +13362,10 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -13276,11 +13559,9 @@ packages: /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true /linkify-it@4.0.1: resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} @@ -13343,7 +13624,6 @@ packages: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} @@ -13381,7 +13661,6 @@ packages: /lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - dev: true /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -13405,7 +13684,6 @@ packages: /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -13629,7 +13907,7 @@ packages: '@types/mdast': 3.0.10 '@types/unist': 2.0.6 decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.1.0 + mdast-util-to-string: 3.2.0 micromark: 3.1.0 micromark-util-decode-numeric-character-reference: 1.0.0 micromark-util-decode-string: 1.0.2 @@ -13767,14 +14045,16 @@ packages: '@types/mdast': 3.0.10 '@types/unist': 2.0.6 longest-streak: 3.1.0 - mdast-util-to-string: 3.1.0 + mdast-util-to-string: 3.2.0 micromark-util-decode-string: 1.0.2 unist-util-visit: 4.1.1 zwitch: 2.0.4 dev: false - /mdast-util-to-string@3.1.0: - resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.10 dev: false /mdn-data@2.0.14: @@ -13788,6 +14068,14 @@ packages: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false + /mdx-annotations@0.1.1: + resolution: {integrity: sha512-/MdUge3y4ZsnU15Hdhd5ktYHA2JwhRm93nSaReQ8OBNatvDcydELMbF7ltgvpDRruVciMDaQdwIBOGZU0KulpQ==} + dependencies: + acorn: 8.10.0 + estree-util-visit: 1.2.0 + unist-util-visit: 4.1.1 + dev: false + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -13800,6 +14088,10 @@ packages: fs-monkey: 1.0.3 dev: true + /memoize-one@4.0.3: + resolution: {integrity: sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==} + dev: false + /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} dev: false @@ -14309,7 +14601,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: false /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} @@ -14456,7 +14747,6 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -14567,7 +14857,6 @@ packages: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true /nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} @@ -14619,7 +14908,6 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false /native-url@0.3.4: resolution: {integrity: sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==} @@ -14705,12 +14993,24 @@ packages: next: '*' dependencies: '@corex/deepmerge': 4.0.43 - '@next/env': 13.4.8 - fast-glob: 3.2.12 + '@next/env': 13.4.12 + fast-glob: 3.3.0 minimist: 1.2.8 next: 13.4.12(react-dom@18.2.0)(react@18.2.0) dev: false + /next-themes@0.2.1(next@13.4.16)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + dependencies: + next: 13.4.16(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /next@13.4.10(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==} engines: {node: '>=16.8.0'} @@ -14797,6 +15097,46 @@ packages: - babel-plugin-macros dev: false + /next@13.4.16(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1xaA/5DrfpPu0eV31Iro7JfPeqO8uxQWb1zYNTe+KDKdzqkAGapLcDYHMLNKXKB7lHjZ7LfKUOf9dyuzcibrhA==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.4.16 + '@swc/helpers': 0.5.1 + busboy: 1.6.0 + caniuse-lite: 1.0.30001512 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + watchpack: 2.4.0 + zod: 3.21.4 + optionalDependencies: + '@next/swc-darwin-arm64': 13.4.16 + '@next/swc-darwin-x64': 13.4.16 + '@next/swc-linux-arm64-gnu': 13.4.16 + '@next/swc-linux-arm64-musl': 13.4.16 + '@next/swc-linux-x64-gnu': 13.4.16 + '@next/swc-linux-x64-musl': 13.4.16 + '@next/swc-win32-arm64-msvc': 13.4.16 + '@next/swc-win32-ia32-msvc': 13.4.16 + '@next/swc-win32-x64-msvc': 13.4.16 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} dependencies: @@ -14808,11 +15148,9 @@ packages: engines: {node: '>=10'} dependencies: semver: 7.5.4 - dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: false /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -14888,10 +15226,6 @@ packages: vm-browserify: 1.1.2 dev: true - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: true - /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} @@ -14921,12 +15255,10 @@ packages: /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: true /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - dev: true /normalize-url@3.3.0: resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} @@ -15015,7 +15347,6 @@ packages: /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - dev: true /object-inspect@1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} @@ -15544,7 +15875,6 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: true /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} @@ -15564,7 +15894,6 @@ packages: /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} - dev: true /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} @@ -15803,7 +16132,6 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.2 - dev: true /postcss-js@4.0.1(postcss@8.4.27): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} @@ -15813,7 +16141,6 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.27 - dev: true /postcss-load-config@3.1.4(postcss@8.4.24): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -15864,7 +16191,6 @@ packages: lilconfig: 2.1.0 postcss: 8.4.27 yaml: 2.1.3 - dev: true /postcss-loader@4.3.0(postcss@8.4.27)(webpack@4.46.0): resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} @@ -16186,7 +16512,6 @@ packages: dependencies: postcss: 8.4.27 postcss-selector-parser: 6.0.11 - dev: true /postcss-normalize-charset@4.0.1: resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} @@ -16559,7 +16884,6 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true /postcss-selector-parser@6.0.11: resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} @@ -16567,7 +16891,6 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true /postcss-svgo@4.0.3: resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} @@ -16635,7 +16958,6 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true /postcss@7.0.39: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} @@ -16670,7 +16992,6 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /posthog-js@1.75.3: resolution: {integrity: sha512-q5xP4R/Tx8E6H0goZQjY+URMLATFiYXc2raHA+31aNvpBs118fPTmExa4RK6MgRZDFhBiMUBZNT6aj7dM3SyUQ==} @@ -16844,7 +17165,6 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: false /preferred-pm@3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} @@ -17229,7 +17549,6 @@ packages: /queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - dev: false /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} @@ -17356,6 +17675,17 @@ packages: react: 18.2.0 dev: false + /react-highlight-words@0.20.0(react@18.2.0): + resolution: {integrity: sha512-asCxy+jCehDVhusNmCBoxDf2mm1AJ//D+EzDx1m5K7EqsMBIHdZ5G4LdwbSEXqZq1Ros0G0UySWmAtntSph7XA==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + highlight-words-core: 1.2.2 + memoize-one: 4.0.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /react-hook-form@7.45.2(react@18.2.0): resolution: {integrity: sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==} engines: {node: '>=12.22.0'} @@ -17584,7 +17914,6 @@ packages: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 - dev: true /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -17659,7 +17988,6 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: true /readme-badger@0.3.0: resolution: {integrity: sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==} @@ -17786,8 +18114,8 @@ packages: - supports-color dev: false - /remark-mdx@2.1.5: - resolution: {integrity: sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==} + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} dependencies: mdast-util-mdx: 2.0.0 micromark-extension-mdxjs: 1.0.0 @@ -17814,6 +18142,25 @@ packages: unified: 10.1.2 dev: false + /remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + unified: 10.1.2 + dev: false + + /remark@14.0.2: + resolution: {integrity: sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA==} + dependencies: + '@types/mdast': 3.0.10 + remark-parse: 10.0.1 + remark-stringify: 10.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /remote-origin-url@1.0.0: resolution: {integrity: sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==} engines: {node: '>= 0.8.0'} @@ -18472,7 +18819,6 @@ packages: simple-get: 4.0.1 tar-fs: 3.0.4 tunnel-agent: 0.6.0 - dev: false /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -18498,6 +18844,14 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true + /shiki@0.11.1: + resolution: {integrity: sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 6.0.0 + dev: false + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -18519,6 +18873,11 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + /simple-functional-loader@1.2.1: + resolution: {integrity: sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ==} + dependencies: + loader-utils: 2.0.4 dev: false /simple-get@4.0.1: @@ -18527,7 +18886,6 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: false /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -18954,7 +19312,6 @@ packages: dependencies: fast-fifo: 1.3.0 queue-tick: 1.0.1 - dev: false /string-hash@1.1.3: resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} @@ -19138,7 +19495,7 @@ packages: resolution: {integrity: sha512-iwVkyZsS9KsWmEVK5qnbPeX/m94+Z3fXIRU7Q4iNBS2Zuj1spGIjLKMN3tejUs/ZZ2o7dCYFJvVdC2aZMYo8GA==} engines: {node: '>=12.*'} dependencies: - '@types/node': 20.4.5 + '@types/node': 20.4.7 qs: 6.11.0 dev: false @@ -19233,7 +19590,6 @@ packages: mz: 2.7.0 pirates: 4.0.5 ts-interface-checker: 0.1.13 - dev: true /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} @@ -19338,7 +19694,7 @@ packages: chokidar: 3.5.3 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.0 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.18.2 @@ -19357,7 +19713,6 @@ packages: sucrase: 3.32.0 transitivePeerDependencies: - ts-node - dev: true /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} @@ -19375,7 +19730,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: false /tar-fs@3.0.4: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} @@ -19383,7 +19737,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 3.1.6 - dev: false /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -19401,7 +19754,6 @@ packages: b4a: 1.6.4 fast-fifo: 1.3.0 streamx: 2.15.0 - dev: false /tar@4.4.19: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} @@ -19568,7 +19920,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.8.1 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19589,13 +19941,11 @@ packages: engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - dev: true /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - dev: true /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -19789,7 +20139,6 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true /ts-morph@13.0.3: resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==} @@ -19825,6 +20174,10 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} @@ -20193,6 +20546,14 @@ packages: '@types/unist': 2.0.6 dev: false + /unist-util-filter@4.0.1: + resolution: {integrity: sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 5.1.1 + dev: false + /unist-util-generated@2.0.0: resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} dev: false @@ -20301,17 +20662,6 @@ packages: engines: {node: '>=4'} dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true @@ -20625,6 +20975,14 @@ packages: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} dev: true + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate@6.0.0: + resolution: {integrity: sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==} + dev: false + /w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -21484,6 +21842,22 @@ packages: /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + /zustand@4.3.2(react@18.2.0): + resolution: {integrity: sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw==} + engines: {node: '>=12.7.0'} + peerDependencies: + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + dependencies: + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false