├── .commitlintrc.json ├── .editorconfig ├── .env.example ├── .eslintrc.json ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .nvmrc ├── .prettierignore ├── .react-email ├── .eslintrc.json ├── .next │ ├── app-build-manifest.json │ ├── build-manifest.json │ ├── cache │ │ └── webpack │ │ │ ├── client-development │ │ │ ├── 0.pack.gz │ │ │ ├── 1.pack.gz │ │ │ ├── 2.pack.gz │ │ │ ├── 3.pack.gz │ │ │ ├── 4.pack.gz │ │ │ ├── 5.pack.gz │ │ │ ├── 6.pack.gz │ │ │ ├── index.pack.gz │ │ │ └── index.pack.gz.old │ │ │ └── server-development │ │ │ ├── 0.pack.gz │ │ │ ├── 1.pack.gz │ │ │ ├── 2.pack.gz │ │ │ ├── 3.pack.gz │ │ │ ├── 4.pack.gz │ │ │ ├── 5.pack.gz │ │ │ ├── index.pack.gz │ │ │ └── index.pack.gz.old │ ├── package.json │ ├── react-loadable-manifest.json │ ├── server │ │ ├── app-paths-manifest.json │ │ ├── client-reference-manifest.js │ │ ├── client-reference-manifest.json │ │ ├── middleware-build-manifest.js │ │ ├── middleware-manifest.json │ │ ├── middleware-react-loadable-manifest.js │ │ ├── next-font-manifest.js │ │ ├── next-font-manifest.json │ │ ├── pages-manifest.json │ │ ├── server-reference-manifest.js │ │ └── server-reference-manifest.json │ ├── static │ │ ├── chunks │ │ │ ├── polyfills.js │ │ │ ├── react-refresh.js │ │ │ └── webpack.js │ │ └── development │ │ │ ├── _buildManifest.js │ │ │ └── _ssgManifest.js │ ├── trace │ └── types │ │ └── package.json ├── .prettierignore ├── .prettierrc.js ├── emails │ └── reminder-email.tsx ├── next.config.js ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── src │ ├── app │ │ ├── home.tsx │ │ ├── layout.tsx │ │ ├── page.tsx │ │ └── preview │ │ │ └── [slug] │ │ │ ├── page.tsx │ │ │ └── preview.tsx │ ├── components │ │ ├── button.tsx │ │ ├── code-container.tsx │ │ ├── code.tsx │ │ ├── heading.tsx │ │ ├── icon-base.tsx │ │ ├── icon-button.tsx │ │ ├── icon-check.tsx │ │ ├── icon-clipboard.tsx │ │ ├── icon-download.tsx │ │ ├── index.ts │ │ ├── logo.tsx │ │ ├── send.tsx │ │ ├── shell.tsx │ │ ├── sidebar.tsx │ │ ├── text.tsx │ │ ├── tooltip-content.tsx │ │ ├── tooltip.tsx │ │ └── topbar.tsx │ ├── styles │ │ └── globals.css │ └── utils │ │ ├── as.ts │ │ ├── copy-text-to-clipboard.ts │ │ ├── get-emails.ts │ │ ├── index.ts │ │ ├── language-map.ts │ │ └── unreachable.ts ├── tailwind.config.js ├── tsconfig.json └── yarn.lock ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LEARN.md ├── LICENSE.md ├── README.md ├── SECURITY.md ├── assets └── fonts │ ├── Inter-Bold.ttf │ ├── Inter-Regular.ttf │ ├── Satoshi-Black.ttf │ ├── Satoshi-Bold.ttf │ └── Satoshi-Variable.woff2 ├── components.json ├── contentlayer.config.js ├── docker-compose.yml ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── prettier.config.js ├── prisma ├── migrations │ ├── 20240408163644_neon_migration │ │ └── migration.sql │ ├── 20240607201413_docker │ │ └── migration.sql │ └── migration_lock.toml └── schema.prisma ├── public ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── grid.svg ├── images │ ├── auth-bg.webp │ ├── features │ │ ├── editor.webp │ │ └── reminder.webp │ ├── hero-dark.webp │ └── testimonials │ │ ├── alex.webp │ │ ├── emily.webp │ │ ├── john.webp │ │ ├── lisa.webp │ │ ├── mark.webp │ │ └── sara.webp ├── lottie │ └── GIRL STUDYING ON LAPTOP.json ├── next.svg ├── noise.webp ├── scribbly-logo.svg ├── site.webmanifest └── window.svg ├── sentry.client.config.ts ├── sentry.edge.config.ts ├── sentry.server.config.ts ├── src ├── app │ ├── (auth) │ │ ├── layout.tsx │ │ ├── sign-in │ │ │ └── [[...sign-in]] │ │ │ │ └── page.tsx │ │ └── sign-up │ │ │ └── [[...sign-up]] │ │ │ └── page.tsx │ ├── (editor) │ │ └── editor │ │ │ ├── [entryId] │ │ │ ├── loading.tsx │ │ │ ├── not-found.tsx │ │ │ └── page.tsx │ │ │ └── layout.tsx │ ├── (journal) │ │ ├── _components │ │ │ ├── billing │ │ │ │ └── billing-form.tsx │ │ │ ├── editor.tsx │ │ │ ├── entry-list.tsx │ │ │ ├── entry-operations.tsx │ │ │ ├── journal-entry-card.tsx │ │ │ ├── journal-entry-create-button.tsx │ │ │ ├── journal-entry.tsx │ │ │ └── settings │ │ │ │ ├── appearance-form.tsx │ │ │ │ ├── reminder-form.tsx │ │ │ │ └── user-name-form.tsx │ │ └── journal │ │ │ ├── billing │ │ │ ├── loading.tsx │ │ │ └── page.tsx │ │ │ ├── error.tsx │ │ │ ├── layout.tsx │ │ │ ├── loading.tsx │ │ │ ├── page.tsx │ │ │ └── settings │ │ │ ├── loading.tsx │ │ │ ├── page.tsx │ │ │ └── user-profile │ │ │ └── [[...user-profile]] │ │ │ └── page.tsx │ ├── (legal) │ │ ├── [...slug] │ │ │ └── page.tsx │ │ └── layout.tsx │ ├── (marketing) │ │ ├── _components │ │ │ ├── background.tsx │ │ │ ├── features │ │ │ │ ├── features.tsx │ │ │ │ └── featuresSection.tsx │ │ │ ├── hero │ │ │ │ ├── heroImage.tsx │ │ │ │ └── heroSection.tsx │ │ │ ├── openSource │ │ │ │ └── openSourceSection.tsx │ │ │ ├── pricing │ │ │ │ ├── pricing.tsx │ │ │ │ └── pricingSection.tsx │ │ │ ├── testimonials │ │ │ │ ├── testimonials.tsx │ │ │ │ └── testimonialsSection.tsx │ │ │ └── wobble-card.tsx │ │ ├── layout.tsx │ │ └── page.tsx │ ├── api │ │ ├── cron │ │ │ └── route.ts │ │ ├── sentry-example-api │ │ │ └── route.js │ │ ├── uploadthing │ │ │ ├── core.ts │ │ │ └── route.ts │ │ └── webhooks │ │ │ ├── stripe │ │ │ └── route.ts │ │ │ └── user │ │ │ └── route.ts │ ├── global-error.tsx │ ├── layout.tsx │ ├── not-found.tsx │ ├── opengraph-image.jpg │ ├── robots.ts │ └── sitemap.ts ├── components │ ├── analytics-provider.tsx │ ├── analytics.tsx │ ├── animated-gradient-text.tsx │ ├── border-beam.tsx │ ├── callout.tsx │ ├── card-skeleton.tsx │ ├── copy-button.tsx │ ├── emails │ │ └── reminder-email.tsx │ ├── empty-placeholder.tsx │ ├── error-card.tsx │ ├── fade-in.tsx │ ├── header.tsx │ ├── icons.tsx │ ├── lottie-anim.tsx │ ├── main-nav.tsx │ ├── marquee.tsx │ ├── mdx-card.tsx │ ├── mdx-components.tsx │ ├── mobile-nav.tsx │ ├── nav.tsx │ ├── providers.tsx │ ├── shell.tsx │ ├── site-footer.tsx │ ├── sticky-scroll-reveal.tsx │ ├── tailwind-indicator.tsx │ ├── theme-provider.tsx │ ├── tweet-card.tsx │ ├── ui │ │ ├── alert-dialog.tsx │ │ ├── alert.tsx │ │ ├── aspect-ratio.tsx │ │ ├── avatar.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── dropdown-menu.tsx │ │ ├── form.tsx │ │ ├── input.tsx │ │ ├── label.tsx │ │ ├── radio-group.tsx │ │ ├── select.tsx │ │ ├── separator.tsx │ │ ├── skeleton.tsx │ │ ├── switch.tsx │ │ ├── table.tsx │ │ ├── tabs.tsx │ │ ├── textarea.tsx │ │ ├── toast.tsx │ │ ├── toaster.tsx │ │ ├── tooltip.tsx │ │ └── use-toast.ts │ ├── user-account-nav.tsx │ └── user-avatar.tsx ├── config │ ├── journal.ts │ ├── marketing.ts │ ├── site.ts │ └── subscriptions.ts ├── content │ └── pages │ │ ├── privacy.mdx │ │ └── terms.mdx ├── env.mjs ├── hooks │ ├── use-lock-body.ts │ ├── use-mounted.ts │ └── use-scroll.ts ├── lib │ ├── auth.ts │ ├── db.ts │ ├── events.ts │ ├── exceptions.ts │ ├── resend.ts │ ├── stripe.ts │ ├── uploadthing.ts │ ├── utils.ts │ ├── validations │ │ ├── entry.ts │ │ ├── reminder.ts │ │ └── user.ts │ └── verify-current-user-has-access-to-entry.ts ├── middleware.ts ├── server │ ├── actions │ │ ├── journal.ts │ │ ├── reminder.ts │ │ ├── stripe.ts │ │ └── user.ts │ └── queries │ │ ├── editor.ts │ │ └── reminder.ts ├── styles │ ├── editor.css │ └── globals.css └── types │ └── index.d.ts ├── tailwind.config.js ├── tsconfig.json └── vercel.json /.commitlintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@commitlint/config-conventional"] 3 | } 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # App 3 | # ----------------------------------------------------------------------------- 4 | NEXT_PUBLIC_APP_URL=http://localhost:3000 5 | NODE_ENV=development 6 | 7 | # ----------------------------------------------------------------------------- 8 | # Analytics (PostHog) 9 | # ----------------------------------------------------------------------------- 10 | 11 | NEXT_PUBLIC_POSTHOG_KEY= 12 | NEXT_PUBLIC_POSTHOG_HOST= 13 | 14 | 15 | # ----------------------------------------------------------------------------- 16 | # Database (MySQL - PlanetScale) 17 | # ----------------------------------------------------------------------------- 18 | DATABASE_URL= 19 | 20 | 21 | 22 | # ----------------------------------------------------------------------------- 23 | # Authentication (clerk) 24 | # ----------------------------------------------------------------------------- 25 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= 26 | CLERK_SECRET_KEY= 27 | CLERK_WEBHOOK_SECRET= 28 | NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in 29 | NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up 30 | NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/journal 31 | NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/journal 32 | 33 | # ----------------------------------------------------------------------------- 34 | # Editor Image Upload (Uplaodthing) 35 | # ----------------------------------------------------------------------------- 36 | UPLOADTHING_SECRET= 37 | UPLOADTHING_APP_ID= 38 | 39 | # ----------------------------------------------------------------------------- 40 | # Subscriptions (Stripe) 41 | # ----------------------------------------------------------------------------- 42 | STRIPE_API_KEY= 43 | STRIPE_WEBHOOK_SECRET= 44 | STRIPE_PRO_MONTHLY_PLAN_ID= 45 | 46 | 47 | # ----------------------------------------------------------------------------- 48 | # Reminder emails (Resend) 49 | # ----------------------------------------------------------------------------- 50 | RESEND_API_KEY= 51 | # Register a domain at https://resend.com/domains 52 | EMAIL_FROM_ADDRESS="mail@[yourdomain]" 53 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/eslintrc", 3 | "root": true, 4 | "extends": [ 5 | "next/core-web-vitals", 6 | "prettier", 7 | "plugin:tailwindcss/recommended" 8 | ], 9 | "plugins": ["tailwindcss"], 10 | "rules": { 11 | "@next/next/no-html-link-for-pages": "off", 12 | "react/jsx-key": "off", 13 | "tailwindcss/no-custom-classname": "off", 14 | "tailwindcss/classnames-order": "error" 15 | }, 16 | "settings": { 17 | "tailwindcss": { 18 | "callees": ["cn"], 19 | "config": "tailwind.config.js" 20 | } 21 | }, 22 | "overrides": [ 23 | { 24 | "files": ["*.ts", "*.tsx"], 25 | "parser": "@typescript-eslint/parser" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.react-email/node_modules 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | .pnpm-debug.log* 28 | 29 | # local env files 30 | .env*.local 31 | .env 32 | 33 | # vercel 34 | .vercel 35 | 36 | # typescript 37 | *.tsbuildinfo 38 | next-env.d.ts 39 | 40 | .vscode 41 | 42 | # vercel 43 | .vercel 44 | 45 | # Contentlayer 46 | *.tsbuildinfo 47 | .contentlayer 48 | 49 | # Sentry Config File 50 | .sentryclirc 51 | 52 | db-data 53 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx commitlint --edit $1 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx pretty-quick --staged 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.16.0 -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .next 4 | build 5 | .contentlayer -------------------------------------------------------------------------------- /.react-email/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next", "prettier"], 3 | "plugins": ["simple-import-sort", "unused-imports"], 4 | "rules": { 5 | "react/no-unescaped-entities": 0, 6 | "react-hooks/rules-of-hooks": 0, 7 | "no-unused-vars": "off", 8 | "simple-import-sort/imports": [ 9 | "error", 10 | { 11 | // The default grouping, but with no blank lines. 12 | "groups": [["^\\u0000", "^@?\\w", "^", "^\\."]] 13 | } 14 | ], 15 | "simple-import-sort/exports": "error" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.react-email/.next/app-build-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": {} 3 | } -------------------------------------------------------------------------------- /.react-email/.next/build-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "polyfillFiles": [ 3 | "static/chunks/polyfills.js" 4 | ], 5 | "devFiles": [ 6 | "static/chunks/webpack.js", 7 | "static/chunks/react-refresh.js" 8 | ], 9 | "ampDevFiles": [], 10 | "lowPriorityFiles": [ 11 | "static/development/_buildManifest.js", 12 | "static/development/_ssgManifest.js" 13 | ], 14 | "rootMainFiles": [], 15 | "pages": { 16 | "/_app": [] 17 | }, 18 | "ampFirstPages": [] 19 | } -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/0.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/0.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/1.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/1.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/2.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/2.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/3.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/3.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/4.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/4.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/5.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/5.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/6.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/6.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/index.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/index.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/client-development/index.pack.gz.old: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/client-development/index.pack.gz.old -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/0.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/0.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/1.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/1.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/2.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/2.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/3.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/3.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/4.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/4.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/5.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/5.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/index.pack.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/index.pack.gz -------------------------------------------------------------------------------- /.react-email/.next/cache/webpack/server-development/index.pack.gz.old: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhamBharadwaz/scribbly/3c3a0a21072bbc1382af729eef334e620400b351/.react-email/.next/cache/webpack/server-development/index.pack.gz.old -------------------------------------------------------------------------------- /.react-email/.next/package.json: -------------------------------------------------------------------------------- 1 | {"type": "commonjs"} -------------------------------------------------------------------------------- /.react-email/.next/react-loadable-manifest.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.react-email/.next/server/app-paths-manifest.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.react-email/.next/server/client-reference-manifest.js: -------------------------------------------------------------------------------- 1 | self.__RSC_MANIFEST="{\n \"ssrModuleMapping\": {},\n \"edgeSSRModuleMapping\": {},\n \"clientModules\": {},\n \"entryCSSFiles\": {}\n}" -------------------------------------------------------------------------------- /.react-email/.next/server/client-reference-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "ssrModuleMapping": {}, 3 | "edgeSSRModuleMapping": {}, 4 | "clientModules": {}, 5 | "entryCSSFiles": {} 6 | } -------------------------------------------------------------------------------- /.react-email/.next/server/middleware-build-manifest.js: -------------------------------------------------------------------------------- 1 | self.__BUILD_MANIFEST={"polyfillFiles":["static/chunks/polyfills.js"],"devFiles":["static/chunks/webpack.js","static/chunks/react-refresh.js"],"ampDevFiles":[],"lowPriorityFiles":["static/development/_buildManifest.js","static/development/_ssgManifest.js"],"rootMainFiles":[],"pages":{"/_app":[]},"ampFirstPages":[]} -------------------------------------------------------------------------------- /.react-email/.next/server/middleware-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "sortedMiddleware": [], 3 | "middleware": {}, 4 | "functions": {}, 5 | "version": 2 6 | } -------------------------------------------------------------------------------- /.react-email/.next/server/middleware-react-loadable-manifest.js: -------------------------------------------------------------------------------- 1 | self.__REACT_LOADABLE_MANIFEST="{}" -------------------------------------------------------------------------------- /.react-email/.next/server/next-font-manifest.js: -------------------------------------------------------------------------------- 1 | self.__NEXT_FONT_MANIFEST="{\"pages\":{},\"app\":{},\"appUsingSizeAdjust\":false,\"pagesUsingSizeAdjust\":false}" -------------------------------------------------------------------------------- /.react-email/.next/server/next-font-manifest.json: -------------------------------------------------------------------------------- 1 | {"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false} -------------------------------------------------------------------------------- /.react-email/.next/server/pages-manifest.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.react-email/.next/server/server-reference-manifest.js: -------------------------------------------------------------------------------- 1 | self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {}\n}" -------------------------------------------------------------------------------- /.react-email/.next/server/server-reference-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "node": {}, 3 | "edge": {} 4 | } -------------------------------------------------------------------------------- /.react-email/.next/static/development/_buildManifest.js: -------------------------------------------------------------------------------- 1 | self.__BUILD_MANIFEST = {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},sortedPages:["\u002F_app"]};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() -------------------------------------------------------------------------------- /.react-email/.next/static/development/_ssgManifest.js: -------------------------------------------------------------------------------- 1 | self.__SSG_MANIFEST=new Set;self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() -------------------------------------------------------------------------------- /.react-email/.next/types/package.json: -------------------------------------------------------------------------------- 1 | {"type": "module"} -------------------------------------------------------------------------------- /.react-email/.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | .next 3 | node_modules -------------------------------------------------------------------------------- /.react-email/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | quoteProps: 'consistent', 3 | singleQuote: true, 4 | trailingComma: 'all', 5 | printWidth: 80, 6 | useTabs: false, 7 | bracketSpacing: true, 8 | }; 9 | -------------------------------------------------------------------------------- /.react-email/emails/reminder-email.tsx: -------------------------------------------------------------------------------- 1 | import Mail from '../../src/components/emails/reminder-email.tsx'; 2 | export default Mail; 3 | -------------------------------------------------------------------------------- /.react-email/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | swcMinify: true, 5 | experimental: { 6 | appDir: true, 7 | externalDir: true, // compile files that are located next to the .react-email directory 8 | }, 9 | }; 10 | 11 | module.exports = nextConfig; 12 | -------------------------------------------------------------------------------- /.react-email/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /.react-email/src/app/home.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import Link from 'next/link'; 4 | import { Button, Heading, Text } from '../components'; 5 | import { Shell } from '../components/shell'; 6 | 7 | export default function Home({ navItems }) { 8 | return ( 9 | 10 |
11 | 12 | Welcome to the React Email preview! 13 | 14 | 15 | To start developing your next email template, you can create a{' '} 16 | .jsx or .tsx file under the "emails" folder. 17 | 18 | 19 | 22 |
23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /.react-email/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import '../styles/globals.css'; 2 | import classnames from 'classnames'; 3 | import { Inter } from 'next/font/google'; 4 | 5 | export const inter = Inter({ 6 | subsets: ['latin'], 7 | variable: '--font-inter', 8 | }); 9 | 10 | export default function RootLayout({ 11 | children, 12 | }: { 13 | children: React.ReactNode; 14 | }) { 15 | return ( 16 | 17 | 18 |
19 | {children} 20 |
21 | 22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /.react-email/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { getEmails } from '../utils/get-emails'; 2 | import Home from './home'; 3 | 4 | export default async function Index() { 5 | const { emails } = await getEmails(); 6 | return ; 7 | } 8 | 9 | export const metadata = { 10 | title: 'React Email', 11 | }; 12 | -------------------------------------------------------------------------------- /.react-email/src/app/preview/[slug]/page.tsx: -------------------------------------------------------------------------------- 1 | import { render } from '@react-email/render'; 2 | import { promises as fs } from 'fs'; 3 | import { dirname, join as pathJoin } from 'path'; 4 | import { CONTENT_DIR, getEmails } from '../../../utils/get-emails'; 5 | import Preview from './preview'; 6 | 7 | export const dynamicParams = true; 8 | 9 | export async function generateStaticParams() { 10 | const { emails } = await getEmails(); 11 | 12 | const paths = emails.map((email) => { 13 | return { slug: email }; 14 | }); 15 | 16 | return paths; 17 | } 18 | 19 | export default async function Page({ params }) { 20 | const { emails, filenames } = await getEmails(); 21 | const template = filenames.filter((email) => { 22 | const [fileName] = email.split('.'); 23 | return params.slug === fileName; 24 | }); 25 | 26 | const Email = (await import(`../../../../emails/${params.slug}`)).default; 27 | const markup = render(, { pretty: true }); 28 | const plainText = render(, { plainText: true }); 29 | const basePath = pathJoin(process.cwd(), CONTENT_DIR); 30 | const path = pathJoin(basePath, template[0]); 31 | 32 | // the file is actually just re-exporting the default export of the original file. We need to resolve this first 33 | const exportTemplateFile: string = await fs.readFile(path, { 34 | encoding: 'utf-8', 35 | }); 36 | const importPath = exportTemplateFile.match(/import Mail from '(.+)';/)![1]; 37 | const originalFilePath = pathJoin(dirname(path), importPath); 38 | 39 | const reactMarkup: string = await fs.readFile(originalFilePath, { 40 | encoding: 'utf-8', 41 | }); 42 | 43 | return ( 44 | 51 | ); 52 | } 53 | 54 | export async function generateMetadata({ params }) { 55 | return { title: `${params.slug} — React Email` }; 56 | } 57 | -------------------------------------------------------------------------------- /.react-email/src/app/preview/[slug]/preview.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { usePathname, useRouter, useSearchParams } from 'next/navigation'; 4 | import React from 'react'; 5 | import { CodeContainer } from '../../../components/code-container'; 6 | import { Shell } from '../../../components/shell'; 7 | import { Tooltip } from '../../../components/tooltip'; 8 | 9 | export default function Preview({ 10 | navItems, 11 | slug, 12 | markup, 13 | reactMarkup, 14 | plainText, 15 | }) { 16 | const router = useRouter(); 17 | const pathname = usePathname(); 18 | const searchParams = useSearchParams(); 19 | const [activeView, setActiveView] = React.useState('desktop'); 20 | const [activeLang, setActiveLang] = React.useState('jsx'); 21 | 22 | React.useEffect(() => { 23 | const view = searchParams.get('view'); 24 | const lang = searchParams.get('lang'); 25 | 26 | if (view === 'source' || view === 'desktop') { 27 | setActiveView(view); 28 | } 29 | 30 | if (lang === 'jsx' || lang === 'markup' || lang === 'markdown') { 31 | setActiveLang(lang); 32 | } 33 | }, [searchParams]); 34 | 35 | const handleViewChange = (view: string) => { 36 | setActiveView(view); 37 | router.push(`${pathname}?view=${view}`); 38 | }; 39 | 40 | const handleLangChange = (lang: string) => { 41 | setActiveLang(lang); 42 | router.push(`${pathname}?view=source&lang=${lang}`); 43 | }; 44 | 45 | return ( 46 | 53 | {activeView === 'desktop' ? ( 54 |