From a237dcc66b897301e5dc0977fc1c9cced85c4e0a Mon Sep 17 00:00:00 2001 From: Chance Strickland Date: Thu, 15 Sep 2022 12:51:37 -0700 Subject: [PATCH] Remove `examples` (#4205) * Remove all examples * Update examples readme --- examples/.gitignore | 4 - examples/README.md | 39 +- examples/basic/.eslintrc.js | 3 - examples/basic/.gitignore | 6 - examples/basic/README.md | 36 - examples/basic/app/entry.client.tsx | 4 - examples/basic/app/entry.server.tsx | 21 - examples/basic/app/root.tsx | 252 ---- examples/basic/app/routes/demos/about.tsx | 44 - .../basic/app/routes/demos/about/index.tsx | 17 - .../basic/app/routes/demos/about/whoa.tsx | 20 - examples/basic/app/routes/demos/actions.tsx | 102 -- examples/basic/app/routes/demos/correct.tsx | 3 - examples/basic/app/routes/demos/params.tsx | 44 - .../basic/app/routes/demos/params/$id.tsx | 114 -- .../basic/app/routes/demos/params/index.tsx | 36 - examples/basic/app/routes/index.tsx | 101 -- examples/basic/app/styles/dark.css | 7 - examples/basic/app/styles/demos/about.css | 26 - examples/basic/app/styles/demos/remix.css | 120 -- examples/basic/app/styles/global.css | 98 -- examples/basic/package.json | 27 - examples/basic/public/favicon.ico | Bin 16958 -> 0 bytes examples/basic/remix.config.js | 8 - examples/basic/remix.env.d.ts | 2 - examples/basic/sandbox.config.json | 6 - examples/basic/tsconfig.json | 22 - examples/blog-tutorial/.dockerignore | 7 - examples/blog-tutorial/.env.example | 2 - examples/blog-tutorial/.eslintrc.js | 3 - .../.github/workflows/deploy.yml | 202 --- examples/blog-tutorial/.gitignore | 12 - examples/blog-tutorial/.gitpod.Dockerfile | 9 - examples/blog-tutorial/.gitpod.yml | 48 - examples/blog-tutorial/.prettierignore | 7 - examples/blog-tutorial/Dockerfile | 59 - examples/blog-tutorial/README.md | 158 --- examples/blog-tutorial/app/db.server.ts | 22 - examples/blog-tutorial/app/entry.client.tsx | 4 - examples/blog-tutorial/app/entry.server.tsx | 21 - .../blog-tutorial/app/models/note.server.ts | 53 - .../blog-tutorial/app/models/post.server.ts | 17 - .../blog-tutorial/app/models/user.server.ts | 59 - examples/blog-tutorial/app/root.tsx | 54 - .../blog-tutorial/app/routes/healthcheck.tsx | 25 - examples/blog-tutorial/app/routes/index.tsx | 144 -- examples/blog-tutorial/app/routes/join.tsx | 176 --- examples/blog-tutorial/app/routes/login.tsx | 190 --- examples/blog-tutorial/app/routes/logout.tsx | 12 - examples/blog-tutorial/app/routes/notes.tsx | 74 - .../app/routes/notes/$noteId.tsx | 69 - .../blog-tutorial/app/routes/notes/index.tsx | 12 - .../blog-tutorial/app/routes/notes/new.tsx | 117 -- .../blog-tutorial/app/routes/posts/$slug.tsx | 30 - .../blog-tutorial/app/routes/posts/admin.tsx | 38 - .../app/routes/posts/admin/index.tsx | 11 - .../app/routes/posts/admin/new.tsx | 91 -- .../blog-tutorial/app/routes/posts/index.tsx | 36 - examples/blog-tutorial/app/session.server.ts | 97 -- examples/blog-tutorial/app/utils.test.ts | 13 - examples/blog-tutorial/app/utils.ts | 71 - examples/blog-tutorial/cypress.json | 1 - examples/blog-tutorial/cypress/.eslintrc.js | 6 - examples/blog-tutorial/cypress/e2e/smoke.ts | 48 - .../cypress/fixtures/example.json | 5 - .../blog-tutorial/cypress/plugins/index.ts | 25 - .../blog-tutorial/cypress/support/commands.ts | 77 -- .../cypress/support/create-user.ts | 47 - .../cypress/support/delete-user.ts | 22 - .../blog-tutorial/cypress/support/index.ts | 2 - examples/blog-tutorial/cypress/tsconfig.json | 31 - examples/blog-tutorial/fly.toml | 54 - examples/blog-tutorial/mocks/README.md | 7 - examples/blog-tutorial/mocks/index.js | 2 - examples/blog-tutorial/mocks/start.ts | 9 - examples/blog-tutorial/package.json | 84 -- .../20220307190657_init/migration.sql | 31 - .../prisma/migrations/migration_lock.toml | 3 - examples/blog-tutorial/prisma/schema.prisma | 47 - examples/blog-tutorial/prisma/seed.ts | 98 -- examples/blog-tutorial/public/favicon.ico | Bin 16958 -> 0 bytes examples/blog-tutorial/remix.config.js | 5 - examples/blog-tutorial/remix.env.d.ts | 2 - examples/blog-tutorial/sandbox.config.json | 6 - examples/blog-tutorial/start.sh | 10 - examples/blog-tutorial/tailwind.config.js | 8 - examples/blog-tutorial/test/setup-test-env.ts | 4 - examples/blog-tutorial/tsconfig.json | 24 - examples/blog-tutorial/vitest.config.ts | 15 - examples/bullmq-task-queue/.env.example | 1 - examples/bullmq-task-queue/.eslintrc.js | 3 - examples/bullmq-task-queue/.gitignore | 6 - examples/bullmq-task-queue/README.md | 26 - .../bullmq-task-queue/app/entry.client.tsx | 4 - .../bullmq-task-queue/app/entry.server.tsx | 21 - .../app/queues/notifier.server.ts | 14 - examples/bullmq-task-queue/app/root.tsx | 32 - .../bullmq-task-queue/app/routes/index.tsx | 50 - .../app/utils/queue.server.ts | 44 - .../app/utils/redis.server.ts | 27 - examples/bullmq-task-queue/package.json | 30 - examples/bullmq-task-queue/public/favicon.ico | Bin 16958 -> 0 bytes examples/bullmq-task-queue/remix.config.js | 7 - examples/bullmq-task-queue/remix.env.d.ts | 2 - .../bullmq-task-queue/sandbox.config.json | 6 - examples/bullmq-task-queue/tsconfig.json | 22 - examples/catch-boundary/.eslintrc.js | 3 - examples/catch-boundary/.gitignore | 6 - examples/catch-boundary/README.md | 19 - examples/catch-boundary/app/data.server.ts | 61 - examples/catch-boundary/app/entry.client.tsx | 4 - examples/catch-boundary/app/entry.server.tsx | 21 - examples/catch-boundary/app/root.tsx | 32 - examples/catch-boundary/app/routes/index.tsx | 4 - examples/catch-boundary/app/routes/users.tsx | 39 - .../app/routes/users/$userId.tsx | 69 - examples/catch-boundary/package.json | 27 - examples/catch-boundary/public/favicon.ico | Bin 16958 -> 0 bytes examples/catch-boundary/remix.config.js | 8 - examples/catch-boundary/remix.env.d.ts | 2 - examples/catch-boundary/sandbox.config.json | 6 - examples/catch-boundary/tsconfig.json | 22 - examples/chakra-ui/.eslintrc.js | 3 - examples/chakra-ui/.gitignore | 6 - examples/chakra-ui/README.md | 23 - examples/chakra-ui/app/entry.client.tsx | 4 - examples/chakra-ui/app/entry.server.tsx | 21 - examples/chakra-ui/app/root.tsx | 84 -- examples/chakra-ui/app/routes/index.tsx | 11 - examples/chakra-ui/package.json | 31 - examples/chakra-ui/public/favicon.ico | Bin 16958 -> 0 bytes examples/chakra-ui/remix.config.js | 8 - examples/chakra-ui/remix.env.d.ts | 2 - examples/chakra-ui/sandbox.config.json | 6 - examples/chakra-ui/tsconfig.json | 22 - examples/client-only-components/.eslintrc.js | 3 - examples/client-only-components/.gitignore | 6 - examples/client-only-components/README.md | 34 - .../broken-on-the-server.client.tsx | 5 - .../app/components/complex-component.tsx | 24 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/client-only-components/app/root.tsx | 32 - .../app/routes/index.tsx | 26 - examples/client-only-components/package.json | 28 - .../client-only-components/public/favicon.ico | Bin 16958 -> 0 bytes .../client-only-components/remix.config.js | 8 - .../client-only-components/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - examples/client-only-components/tsconfig.json | 22 - examples/client-side-validation/.eslintrc.js | 3 - examples/client-side-validation/.gitignore | 6 - examples/client-side-validation/README.md | 25 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/client-side-validation/app/index.css | 47 - examples/client-side-validation/app/root.tsx | 203 --- examples/client-side-validation/package.json | 27 - .../client-side-validation/public/favicon.ico | Bin 16958 -> 0 bytes .../client-side-validation/remix.config.js | 8 - .../client-side-validation/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - examples/client-side-validation/tsconfig.json | 22 - examples/collected-notes/.env.example | 3 - examples/collected-notes/.eslintrc.js | 3 - examples/collected-notes/.gitignore | 6 - examples/collected-notes/README.md | 23 - examples/collected-notes/app/cn.server.ts | 18 - examples/collected-notes/app/entry.client.tsx | 4 - examples/collected-notes/app/entry.server.tsx | 21 - examples/collected-notes/app/root.tsx | 32 - examples/collected-notes/app/routes/$slug.tsx | 26 - examples/collected-notes/app/routes/index.tsx | 76 -- examples/collected-notes/package.json | 28 - examples/collected-notes/public/favicon.ico | Bin 16958 -> 0 bytes examples/collected-notes/remix.config.js | 8 - examples/collected-notes/remix.env.d.ts | 2 - examples/collected-notes/sandbox.config.json | 6 - examples/collected-notes/tsconfig.json | 22 - examples/combobox-resource-route/.eslintrc.js | 3 - examples/combobox-resource-route/.gitignore | 6 - examples/combobox-resource-route/README.md | 25 - examples/combobox-resource-route/app/app.css | 34 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - .../app/models/langs.ts | 212 --- examples/combobox-resource-route/app/root.tsx | 38 - .../app/routes/index.tsx | 89 -- .../app/routes/lang-search.tsx | 39 - examples/combobox-resource-route/package.json | 29 - .../public/favicon.ico | Bin 16958 -> 0 bytes .../combobox-resource-route/remix.config.js | 8 - .../combobox-resource-route/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - .../combobox-resource-route/tsconfig.json | 22 - examples/dark-mode/.eslintrc.js | 3 - examples/dark-mode/.gitignore | 6 - examples/dark-mode/README.md | 27 - examples/dark-mode/app/entry.client.tsx | 4 - examples/dark-mode/app/entry.server.tsx | 21 - examples/dark-mode/app/root.tsx | 71 - .../dark-mode/app/routes/action/set-theme.tsx | 27 - examples/dark-mode/app/routes/index.tsx | 26 - examples/dark-mode/app/styles/styles.css | 17 - .../dark-mode/app/utils/theme-provider.tsx | 282 ---- examples/dark-mode/app/utils/theme.server.ts | 32 - examples/dark-mode/package.json | 25 - examples/dark-mode/public/favicon.ico | Bin 16958 -> 0 bytes examples/dark-mode/remix.config.js | 8 - examples/dark-mode/remix.env.d.ts | 2 - examples/dark-mode/sandbox.config.json | 6 - examples/dark-mode/tsconfig.json | 22 - examples/dataloader/.eslintrc.js | 3 - examples/dataloader/.gitignore | 6 - examples/dataloader/README.md | 26 - examples/dataloader/app/data.server.ts | 74 - examples/dataloader/app/entry.client.tsx | 4 - examples/dataloader/app/entry.server.tsx | 21 - examples/dataloader/app/loaders/userLoader.ts | 13 - examples/dataloader/app/root.tsx | 32 - examples/dataloader/app/routes/index.tsx | 4 - examples/dataloader/app/routes/users.tsx | 33 - .../dataloader/app/routes/users/index.tsx | 47 - examples/dataloader/package.json | 34 - examples/dataloader/public/favicon.ico | Bin 16958 -> 0 bytes examples/dataloader/remix.config.js | 8 - examples/dataloader/remix.env.d.ts | 2 - examples/dataloader/sandbox.config.json | 6 - examples/dataloader/server/index.ts | 64 - examples/dataloader/tsconfig.json | 20 - examples/emotion/.eslintrc.js | 3 - examples/emotion/.gitignore | 6 - examples/emotion/README.md | 56 - examples/emotion/app/entry.client.tsx | 31 - examples/emotion/app/entry.server.tsx | 43 - examples/emotion/app/root.tsx | 111 -- examples/emotion/app/routes/index.tsx | 24 - examples/emotion/app/routes/jokes-error.tsx | 3 - examples/emotion/app/routes/jokes.tsx | 16 - .../emotion/app/styles/client.context.tsx | 11 - .../emotion/app/styles/createEmotionCache.ts | 5 - .../emotion/app/styles/server.context.tsx | 11 - examples/emotion/package.json | 31 - examples/emotion/public/favicon.ico | Bin 16958 -> 0 bytes examples/emotion/remix.config.js | 8 - examples/emotion/remix.env.d.ts | 2 - examples/emotion/sandbox.config.json | 6 - examples/emotion/tsconfig.json | 22 - .../file-and-cloudinary-upload/.env.sample | 3 - .../file-and-cloudinary-upload/.eslintrc.js | 3 - .../file-and-cloudinary-upload/.gitignore | 6 - examples/file-and-cloudinary-upload/README.md | 31 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - .../file-and-cloudinary-upload/app/root.tsx | 32 - .../app/routes/cloudinary-upload.tsx | 64 - .../app/routes/local-upload.tsx | 53 - .../app/utils/utils.server.ts | 31 - .../file-and-cloudinary-upload/package.json | 28 - .../public/favicon.ico | Bin 16958 -> 0 bytes .../remix.config.js | 8 - .../file-and-cloudinary-upload/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - .../file-and-cloudinary-upload/tsconfig.json | 22 - examples/file-and-s3-upload/.env.sample | 4 - examples/file-and-s3-upload/.eslintrc.js | 3 - examples/file-and-s3-upload/.gitignore | 6 - examples/file-and-s3-upload/README.md | 35 - .../file-and-s3-upload/app/entry.client.tsx | 4 - .../file-and-s3-upload/app/entry.server.tsx | 21 - examples/file-and-s3-upload/app/root.tsx | 32 - .../app/routes/s3-upload.tsx | 67 - .../file-and-s3-upload/app/utils/s3.server.ts | 49 - examples/file-and-s3-upload/package.json | 28 - .../file-and-s3-upload/public/favicon.ico | Bin 16958 -> 0 bytes examples/file-and-s3-upload/remix.config.js | 10 - examples/file-and-s3-upload/remix.env.d.ts | 2 - .../file-and-s3-upload/sandbox.config.json | 6 - examples/file-and-s3-upload/tsconfig.json | 22 - examples/firebase-auth-firestore/.env.example | 5 - examples/firebase-auth-firestore/.eslintrc.js | 3 - examples/firebase-auth-firestore/.gitignore | 10 - examples/firebase-auth-firestore/README.md | 52 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - .../app/firebase-rest.ts | 69 - examples/firebase-auth-firestore/app/root.tsx | 32 - .../app/routes/index.tsx | 101 -- .../app/routes/join.tsx | 82 -- .../app/routes/login.tsx | 125 -- .../app/routes/logout.tsx | 24 - .../app/server/auth.server.ts | 50 - .../app/server/db.server.ts | 36 - .../app/server/firebase.server.ts | 78 -- .../firebase-auth-firestore/app/sessions.ts | 13 - .../firebase-fixtures/auth/accounts.json | 12 - .../firebase-fixtures/auth/config.json | 5 - .../firebase-export-metadata.json | 7 - .../firebase-fixtures/firestore.rules | 10 - .../firebase-auth-firestore/firebase.json | 16 - examples/firebase-auth-firestore/package.json | 30 - .../public/favicon.ico | Bin 16958 -> 0 bytes .../firebase-auth-firestore/remix.config.js | 8 - .../firebase-auth-firestore/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - .../screen_recording.gif | Bin 513723 -> 0 bytes .../firebase-auth-firestore/tsconfig.json | 22 - examples/form-to-notion-db/.env.example | 2 - examples/form-to-notion-db/.eslintrc.js | 3 - examples/form-to-notion-db/.gitignore | 6 - examples/form-to-notion-db/README.md | 28 - .../form-to-notion-db/app/entry.client.tsx | 4 - .../form-to-notion-db/app/entry.server.tsx | 21 - .../form-to-notion-db/app/notion.server.tsx | 8 - examples/form-to-notion-db/app/root.tsx | 86 -- examples/form-to-notion-db/package.json | 28 - examples/form-to-notion-db/public/favicon.ico | Bin 16958 -> 0 bytes examples/form-to-notion-db/remix.config.js | 8 - examples/form-to-notion-db/remix.env.d.ts | 2 - .../form-to-notion-db/sandbox.config.json | 6 - examples/form-to-notion-db/tsconfig.json | 22 - examples/framer-motion/.eslintrc.js | 3 - examples/framer-motion/.gitignore | 6 - examples/framer-motion/README.md | 36 - examples/framer-motion/app/entry.client.tsx | 4 - examples/framer-motion/app/entry.server.tsx | 21 - examples/framer-motion/app/root.tsx | 32 - examples/framer-motion/app/routes/index.tsx | 17 - examples/framer-motion/package.json | 28 - examples/framer-motion/public/favicon.ico | Bin 16958 -> 0 bytes examples/framer-motion/remix.config.js | 8 - examples/framer-motion/sandbox.config.json | 6 - examples/framer-motion/tsconfig.json | 22 - examples/framer-route-animation/.eslintrc.js | 3 - examples/framer-route-animation/.gitignore | 6 - examples/framer-route-animation/README.md | 25 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/framer-route-animation/app/root.tsx | 52 - .../app/routes/about.tsx | 3 - .../app/routes/blogs.tsx | 3 - .../app/routes/index.tsx | 3 - examples/framer-route-animation/package.json | 28 - .../framer-route-animation/public/favicon.ico | Bin 16958 -> 0 bytes .../framer-route-animation/remix.config.js | 8 - .../framer-route-animation/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - examples/framer-route-animation/tsconfig.json | 22 - examples/gdpr-cookie-consent/.eslintrc.js | 3 - examples/gdpr-cookie-consent/.gitignore | 6 - examples/gdpr-cookie-consent/README.md | 24 - examples/gdpr-cookie-consent/app/cookies.ts | 5 - .../gdpr-cookie-consent/app/entry.client.tsx | 4 - .../gdpr-cookie-consent/app/entry.server.tsx | 21 - examples/gdpr-cookie-consent/app/root.tsx | 71 - .../app/routes/enable-analytics.tsx | 23 - .../gdpr-cookie-consent/app/routes/index.tsx | 15 - examples/gdpr-cookie-consent/package.json | 27 - .../public/dummy-analytics-script.js | 1 - .../gdpr-cookie-consent/public/favicon.ico | Bin 16958 -> 0 bytes examples/gdpr-cookie-consent/remix.config.js | 8 - examples/gdpr-cookie-consent/remix.env.d.ts | 2 - .../gdpr-cookie-consent/sandbox.config.json | 6 - examples/gdpr-cookie-consent/tsconfig.json | 22 - examples/google-analytics/.env.example | 1 - examples/google-analytics/.eslintrc.js | 3 - examples/google-analytics/.gitignore | 6 - examples/google-analytics/README.md | 21 - .../google-analytics/app/entry.client.tsx | 4 - .../google-analytics/app/entry.server.tsx | 21 - examples/google-analytics/app/root.tsx | 114 -- .../google-analytics/app/routes/contact.tsx | 43 - .../google-analytics/app/routes/dashboard.tsx | 13 - .../google-analytics/app/routes/index.tsx | 13 - .../google-analytics/app/routes/profile.tsx | 13 - .../app/utils/gtags.client.ts | 48 - examples/google-analytics/package.json | 27 - examples/google-analytics/public/favicon.ico | Bin 16958 -> 0 bytes examples/google-analytics/remix.config.js | 8 - examples/google-analytics/remix.env.d.ts | 2 - examples/google-analytics/tsconfig.json | 22 - examples/graphql-api/.env.example | 1 - examples/graphql-api/.eslintrc.js | 3 - examples/graphql-api/.gitignore | 8 - examples/graphql-api/README.md | 51 - examples/graphql-api/app/components/Code.tsx | 21 - examples/graphql-api/app/entry.client.tsx | 4 - examples/graphql-api/app/entry.server.tsx | 21 - examples/graphql-api/app/root.tsx | 32 - .../graphql-api/app/routes/api/character.tsx | 46 - .../graphql-api/app/routes/api/characters.tsx | 49 - .../graphql-api/app/routes/character/$id.tsx | 73 - .../app/routes/character/error.tsx | 70 - examples/graphql-api/app/routes/index.tsx | 46 - examples/graphql-api/app/utils/index.ts | 26 - examples/graphql-api/codegen.yml | 19 - examples/graphql-api/package.json | 35 - examples/graphql-api/public/favicon.ico | Bin 16958 -> 0 bytes examples/graphql-api/remix.config.js | 8 - examples/graphql-api/remix.env.d.ts | 2 - examples/graphql-api/sandbox.config.json | 6 - examples/graphql-api/tsconfig.json | 22 - examples/image-resize/.eslintrc.js | 3 - examples/image-resize/.gitignore | 6 - examples/image-resize/README.md | 56 - .../image-resize/app/components/image.tsx | 34 - examples/image-resize/app/entry.client.tsx | 4 - examples/image-resize/app/entry.server.tsx | 21 - examples/image-resize/app/root.tsx | 32 - .../app/routes/assets/resize/$.ts | 174 --- examples/image-resize/app/routes/index.tsx | 35 - examples/image-resize/assets/dog-1.jpg | Bin 643637 -> 0 bytes .../image-resize/assets/other-dogs/dog-2.jpg | Bin 38020 -> 0 bytes examples/image-resize/package.json | 29 - examples/image-resize/public/favicon.ico | Bin 16958 -> 0 bytes examples/image-resize/remix.config.js | 8 - examples/image-resize/remix.env.d.ts | 2 - examples/image-resize/sandbox.config.json | 6 - examples/image-resize/tsconfig.json | 22 - examples/infinite-scrolling/.eslintrc.js | 3 - examples/infinite-scrolling/.gitignore | 6 - examples/infinite-scrolling/README.md | 19 - .../infinite-scrolling/app/entry.client.tsx | 4 - .../infinite-scrolling/app/entry.server.tsx | 21 - examples/infinite-scrolling/app/root.tsx | 32 - .../infinite-scrolling/app/routes/index.tsx | 50 - .../app/routes/offset/advanced.tsx | 215 --- .../app/routes/offset/simple.tsx | 141 -- .../app/routes/page/advanced.tsx | 218 --- .../app/routes/page/alternative.tsx | 143 -- .../app/routes/page/simple.tsx | 142 -- .../infinite-scrolling/app/styles/index.css | 20 - .../app/utils/backend.server.ts | 31 - examples/infinite-scrolling/package.json | 28 - .../infinite-scrolling/public/favicon.ico | Bin 16958 -> 0 bytes examples/infinite-scrolling/remix.config.js | 8 - examples/infinite-scrolling/remix.env.d.ts | 2 - examples/infinite-scrolling/tsconfig.json | 22 - examples/io-ts-formdata-decoding/.eslintrc.js | 3 - examples/io-ts-formdata-decoding/.gitignore | 6 - examples/io-ts-formdata-decoding/README.md | 68 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - .../io-ts-formdata-decoding/app/formData.ts | 47 - examples/io-ts-formdata-decoding/app/root.tsx | 32 - .../app/routes/index.tsx | 124 -- examples/io-ts-formdata-decoding/package.json | 29 - .../public/favicon.ico | Bin 16958 -> 0 bytes .../io-ts-formdata-decoding/remix.config.js | 8 - .../io-ts-formdata-decoding/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - .../io-ts-formdata-decoding/tsconfig.json | 22 - examples/ioredis/.env.example | 1 - examples/ioredis/.eslintrc.js | 3 - examples/ioredis/.gitignore | 6 - examples/ioredis/README.md | 25 - examples/ioredis/app/entry.client.tsx | 4 - examples/ioredis/app/entry.server.tsx | 21 - examples/ioredis/app/root.tsx | 32 - examples/ioredis/app/routes/index.tsx | 51 - examples/ioredis/app/utils/redis.server.ts | 22 - examples/ioredis/package.json | 29 - examples/ioredis/public/favicon.ico | Bin 16958 -> 0 bytes examples/ioredis/remix.config.js | 8 - examples/ioredis/remix.env.d.ts | 2 - examples/ioredis/sandbox.config.json | 6 - examples/ioredis/tsconfig.json | 22 - examples/jokes/.dockerignore | 1 - examples/jokes/.env.example | 2 - examples/jokes/.eslintrc.js | 3 - examples/jokes/.gitignore | 8 - examples/jokes/.prettierrc | 1 - examples/jokes/Dockerfile | 57 - examples/jokes/README.md | 67 - examples/jokes/app/components/joke.tsx | 28 - examples/jokes/app/entry.client.tsx | 4 - examples/jokes/app/entry.server.tsx | 21 - examples/jokes/app/root.tsx | 103 -- examples/jokes/app/routes/index.tsx | 39 - examples/jokes/app/routes/jokes.tsx | 103 -- examples/jokes/app/routes/jokes/$jokeId.tsx | 112 -- examples/jokes/app/routes/jokes/index.tsx | 71 - examples/jokes/app/routes/jokes/new.tsx | 177 --- examples/jokes/app/routes/jokes[.]rss.tsx | 55 - examples/jokes/app/routes/login.tsx | 220 --- examples/jokes/app/routes/logout.tsx | 12 - examples/jokes/app/styles/global-large.css | 24 - examples/jokes/app/styles/global-medium.css | 29 - examples/jokes/app/styles/global.css | 354 ----- examples/jokes/app/styles/index.css | 74 - examples/jokes/app/styles/jokes.css | 92 -- examples/jokes/app/styles/login.css | 64 - examples/jokes/app/utils/db.server.ts | 21 - examples/jokes/app/utils/session.server.ts | 105 -- examples/jokes/fly.toml | 46 - examples/jokes/package.json | 35 - .../20211117212928_init/migration.sql | 22 - .../prisma/migrations/migration_lock.toml | 3 - examples/jokes/prisma/schema.prisma | 30 - examples/jokes/prisma/seed.ts | 57 - examples/jokes/public/favicon.ico | Bin 16958 -> 0 bytes .../fonts/baloo/SIL Open Font License.txt | 43 - examples/jokes/public/fonts/baloo/baloo.woff | Bin 21060 -> 0 bytes examples/jokes/public/social.png | Bin 924450 -> 0 bytes examples/jokes/remix.config.js | 8 - examples/jokes/remix.env.d.ts | 2 - examples/jokes/sandbox.config.json | 6 - examples/jokes/start_with_migrations.sh | 5 - examples/jokes/tsconfig.json | 22 - examples/mantine/.eslintrc.js | 3 - examples/mantine/.gitignore | 6 - examples/mantine/README.md | 17 - examples/mantine/app/entry.client.tsx | 4 - examples/mantine/app/entry.server.tsx | 25 - examples/mantine/app/root.tsx | 59 - examples/mantine/app/routes/index.tsx | 14 - examples/mantine/package.json | 30 - examples/mantine/public/favicon.ico | Bin 16958 -> 0 bytes examples/mantine/remix.config.js | 8 - examples/mantine/remix.env.d.ts | 2 - examples/mantine/sandbox.config.json | 6 - examples/mantine/tsconfig.json | 22 - examples/msw/.eslintrc.js | 3 - examples/msw/.gitignore | 6 - examples/msw/README.md | 37 - examples/msw/app/entry.client.tsx | 4 - examples/msw/app/entry.server.tsx | 21 - examples/msw/app/root.tsx | 49 - examples/msw/mocks/handlers.js | 9 - examples/msw/mocks/index.js | 6 - examples/msw/package.json | 28 - examples/msw/public/favicon.ico | Bin 16958 -> 0 bytes examples/msw/remix.config.js | 8 - examples/msw/remix.env.d.ts | 2 - examples/msw/sandbox.config.json | 6 - examples/msw/tsconfig.json | 22 - examples/multiple-forms/.eslintrc.js | 3 - examples/multiple-forms/.gitignore | 6 - examples/multiple-forms/README.md | 17 - examples/multiple-forms/app/data.server.ts | 37 - examples/multiple-forms/app/entry.client.tsx | 4 - examples/multiple-forms/app/entry.server.tsx | 21 - examples/multiple-forms/app/root.tsx | 32 - examples/multiple-forms/app/routes/index.tsx | 4 - .../multiple-forms/app/routes/invitations.tsx | 92 -- examples/multiple-forms/data.json | 24 - examples/multiple-forms/package.json | 27 - examples/multiple-forms/public/favicon.ico | Bin 16958 -> 0 bytes examples/multiple-forms/remix.config.js | 8 - examples/multiple-forms/remix.env.d.ts | 2 - examples/multiple-forms/sandbox.config.json | 6 - examples/multiple-forms/tsconfig.json | 22 - examples/multiple-params/.eslintrc.js | 12 - examples/multiple-params/.gitignore | 6 - examples/multiple-params/README.md | 81 -- examples/multiple-params/app/db.ts | 60 - examples/multiple-params/app/entry.client.tsx | 4 - examples/multiple-params/app/entry.server.tsx | 21 - examples/multiple-params/app/root.tsx | 49 - .../multiple-params/app/routes/clients.tsx | 37 - .../app/routes/clients/$clientId.tsx | 75 -- .../app/routes/clients/$clientId/index.tsx | 56 - .../app/routes/clients/$clientId/invoices.tsx | 50 - .../clients/$clientId/invoices/$invoiceId.tsx | 80 -- .../clients/$clientId/invoices/index.tsx | 3 - .../app/routes/clients/index.tsx | 3 - examples/multiple-params/app/routes/index.tsx | 7 - examples/multiple-params/package.json | 27 - examples/multiple-params/public/favicon.ico | Bin 16958 -> 0 bytes examples/multiple-params/remix.config.js | 8 - examples/multiple-params/remix.env.d.ts | 2 - examples/multiple-params/sandbox.config.json | 6 - examples/multiple-params/tsconfig.json | 22 - examples/newsletter-signup/.eslintrc.js | 3 - examples/newsletter-signup/.gitignore | 6 - examples/newsletter-signup/README.md | 17 - .../newsletter-signup/app/entry.client.tsx | 4 - .../newsletter-signup/app/entry.server.tsx | 21 - examples/newsletter-signup/app/root.tsx | 44 - .../newsletter-signup/app/routes/index.tsx | 32 - .../app/routes/newsletter.tsx | 94 -- examples/newsletter-signup/app/styles.css | 112 -- examples/newsletter-signup/package.json | 27 - examples/newsletter-signup/public/bg.svg | 38 - examples/newsletter-signup/public/favicon.ico | Bin 16958 -> 0 bytes examples/newsletter-signup/remix.config.js | 8 - examples/newsletter-signup/remix.env.d.ts | 2 - .../newsletter-signup/sandbox.config.json | 6 - examples/newsletter-signup/tsconfig.json | 22 - examples/nprogress/.eslintrc.js | 3 - examples/nprogress/.gitignore | 6 - examples/nprogress/README.md | 20 - examples/nprogress/app/entry.client.tsx | 4 - examples/nprogress/app/entry.server.tsx | 21 - examples/nprogress/app/root.tsx | 50 - examples/nprogress/app/routes/index.tsx | 5 - examples/nprogress/app/routes/slow-page.tsx | 12 - examples/nprogress/package.json | 29 - examples/nprogress/public/favicon.ico | Bin 16958 -> 0 bytes examples/nprogress/remix.config.js | 8 - examples/nprogress/remix.env.d.ts | 2 - examples/nprogress/sandbox.config.json | 6 - examples/nprogress/tsconfig.json | 22 - examples/on-demand-hydration/.eslintrc.js | 3 - examples/on-demand-hydration/.gitignore | 6 - examples/on-demand-hydration/README.md | 30 - .../on-demand-hydration/app/entry.client.tsx | 4 - .../on-demand-hydration/app/entry.server.tsx | 21 - examples/on-demand-hydration/app/root.tsx | 34 - .../on-demand-hydration/app/routes/index.tsx | 22 - .../app/routes/on-demand-js.tsx | 46 - .../app/routes/with-js.tsx | 14 - .../app/routes/without-js.tsx | 14 - examples/on-demand-hydration/package.json | 28 - .../on-demand-hydration/public/favicon.ico | Bin 16958 -> 0 bytes examples/on-demand-hydration/remix.config.js | 8 - examples/on-demand-hydration/remix.env.d.ts | 2 - .../on-demand-hydration/sandbox.config.json | 6 - examples/on-demand-hydration/tsconfig.json | 22 - examples/outlet-form-rerender/.eslintrc.js | 3 - examples/outlet-form-rerender/.gitignore | 6 - examples/outlet-form-rerender/README.md | 24 - .../outlet-form-rerender/app/data.server.ts | 58 - .../outlet-form-rerender/app/entry.client.tsx | 4 - .../outlet-form-rerender/app/entry.server.tsx | 21 - examples/outlet-form-rerender/app/root.tsx | 99 -- .../outlet-form-rerender/app/routes/index.tsx | 4 - .../outlet-form-rerender/app/routes/users.tsx | 35 - .../app/routes/users/$userId.tsx | 82 -- examples/outlet-form-rerender/package.json | 27 - .../outlet-form-rerender/public/favicon.ico | Bin 16958 -> 0 bytes examples/outlet-form-rerender/remix.config.js | 8 - examples/outlet-form-rerender/remix.env.d.ts | 2 - .../outlet-form-rerender/sandbox.config.json | 6 - examples/outlet-form-rerender/tsconfig.json | 22 - examples/pathless-routes/.eslintrc.js | 3 - examples/pathless-routes/.gitignore | 6 - examples/pathless-routes/README.md | 47 - examples/pathless-routes/app/entry.client.tsx | 4 - examples/pathless-routes/app/entry.server.tsx | 21 - examples/pathless-routes/app/root.tsx | 47 - .../pathless-routes/app/routes/articles.tsx | 20 - .../app/routes/articles/__layout.tsx | 9 - .../app/routes/articles/__layout/hello.md | 7 - examples/pathless-routes/app/routes/index.tsx | 9 - examples/pathless-routes/package.json | 27 - examples/pathless-routes/public/favicon.ico | Bin 16958 -> 0 bytes examples/pathless-routes/remix.config.js | 8 - examples/pathless-routes/remix.env.d.ts | 2 - examples/pathless-routes/sandbox.config.json | 6 - examples/pathless-routes/tsconfig.json | 22 - examples/pm-app/.env.example | 4 - examples/pm-app/.eslintrc.js | 3 - examples/pm-app/.gitignore | 14 - examples/pm-app/.nvmrc | 1 - examples/pm-app/README.md | 70 - examples/pm-app/app/auth.server.ts | 97 -- examples/pm-app/app/db.server.tsx | 588 -------- examples/pm-app/app/entry.client.tsx | 4 - examples/pm-app/app/entry.server.tsx | 21 - examples/pm-app/app/models.ts | 31 - examples/pm-app/app/root.tsx | 124 -- examples/pm-app/app/routes/dashboard.tsx | 126 -- .../pm-app/app/routes/dashboard/index.tsx | 196 --- .../routes/dashboard/projects/$projectId.tsx | 509 ------- .../dashboard/projects/$projectId/delete.tsx | 20 - .../projects/$projectId/list/$listId.tsx | 305 ----- .../app/routes/dashboard/projects/new.tsx | 262 ---- .../dashboard/todo-lists/$listId/delete.tsx | 27 - .../dashboard/todo-lists/$listId/index.tsx | 309 ----- .../app/routes/dashboard/todo-lists/index.tsx | 55 - .../app/routes/dashboard/todo-lists/new.tsx | 459 ------- .../routes/dashboard/todos/$todoId/delete.tsx | 35 - .../routes/dashboard/todos/$todoId/edit.tsx | 63 - .../routes/dashboard/todos/$todoId/index.tsx | 65 - .../routes/dashboard/todos/$todoId/set.tsx | 40 - .../app/routes/dashboard/todos/index.tsx | 84 -- .../pm-app/app/routes/dashboard/todos/new.tsx | 63 - .../app/routes/dashboard/todos/toggle.tsx | 25 - examples/pm-app/app/routes/index.tsx | 12 - examples/pm-app/app/routes/register.tsx | 253 ---- examples/pm-app/app/routes/sign-in.tsx | 206 --- examples/pm-app/app/routes/sign-out.tsx | 11 - examples/pm-app/app/session.server.ts | 129 -- examples/pm-app/app/styles/_defs.css | 6 - examples/pm-app/app/styles/_normalize.css | 287 ---- examples/pm-app/app/styles/_resets.css | 102 -- examples/pm-app/app/styles/_root.css | 450 ------- examples/pm-app/app/styles/_utils.css | 1189 ----------------- examples/pm-app/app/styles/global.css | 24 - .../pm-app/app/styles/routes/dashboard.css | 80 -- .../app/styles/routes/dashboard/index.css | 125 -- .../dashboard/projects/$projectId/index.css | 186 --- .../styles/routes/dashboard/projects/new.css | 14 - .../dashboard/todo-lists/$listId/index.css | 5 - .../routes/dashboard/todo-lists/new.css | 60 - examples/pm-app/app/styles/routes/index.css | 4 - .../pm-app/app/styles/routes/register.css | 61 - examples/pm-app/app/styles/routes/sign-in.css | 62 - examples/pm-app/app/styles/ui/_avatar.css | 76 -- examples/pm-app/app/styles/ui/_button.css | 128 -- examples/pm-app/app/styles/ui/_combobox.css | 65 - examples/pm-app/app/styles/ui/_dialog.css | 43 - .../pm-app/app/styles/ui/_dropdown-menu.css | 129 -- examples/pm-app/app/styles/ui/_flex.css | 259 ---- examples/pm-app/app/styles/ui/_form.css | 101 -- .../pm-app/app/styles/ui/_max-container.css | 20 - .../pm-app/app/styles/ui/_member-search.css | 6 - .../pm-app/app/styles/ui/_menu-button.css | 2 - examples/pm-app/app/styles/ui/_note.css | 7 - examples/pm-app/app/styles/ui/_shadow-box.css | 53 - examples/pm-app/app/styles/ui/_stack.css | 218 --- examples/pm-app/app/styles/ui/_todo-list.css | 9 - examples/pm-app/app/styles/ui/_token.css | 46 - examples/pm-app/app/ui/auth-header.tsx | 26 - examples/pm-app/app/ui/avatar.tsx | 63 - examples/pm-app/app/ui/button.tsx | 139 -- examples/pm-app/app/ui/combobox.tsx | 168 --- examples/pm-app/app/ui/dialog.tsx | 115 -- examples/pm-app/app/ui/dropdown-menu.tsx | 201 --- examples/pm-app/app/ui/flex.tsx | 121 -- examples/pm-app/app/ui/form.tsx | 277 ---- examples/pm-app/app/ui/icon-box.tsx | 31 - examples/pm-app/app/ui/icons.tsx | 340 ----- examples/pm-app/app/ui/link.tsx | 74 - examples/pm-app/app/ui/max-container.tsx | 26 - examples/pm-app/app/ui/member-search.tsx | 284 ---- examples/pm-app/app/ui/note.tsx | 7 - examples/pm-app/app/ui/section-heading.tsx | 64 - examples/pm-app/app/ui/shadow-box.tsx | 25 - examples/pm-app/app/ui/stack.tsx | 56 - examples/pm-app/app/ui/todo-list.tsx | 74 - examples/pm-app/app/ui/token.tsx | 33 - examples/pm-app/app/utils/index.ts | 117 -- examples/pm-app/app/utils/react.tsx | 60 - examples/pm-app/app/utils/sanitizer.ts | 152 --- examples/pm-app/app/utils/types.ts | 34 - examples/pm-app/app/utils/validation.ts | 22 - examples/pm-app/docker-compose.example.yml | 14 - examples/pm-app/package.json | 61 - examples/pm-app/pm2.config.js | 34 - examples/pm-app/postcss.config.js | 10 - .../migrations/20211207143433_/migration.sql | 83 -- .../migrations/20211207153717_/migration.sql | 5 - .../migrations/20211207231727_/migration.sql | 5 - .../migrations/20211208222216_/migration.sql | 5 - .../prisma/migrations/migration_lock.toml | 3 - examples/pm-app/prisma/schema.prisma | 73 - examples/pm-app/public/favicon.ico | Bin 16958 -> 0 bytes examples/pm-app/remix.config.js | 15 - examples/pm-app/remix.env.d.ts | 2 - examples/pm-app/sandbox.config.json | 6 - examples/pm-app/server/index.js | 19 - examples/pm-app/server/tsconfig.json | 8 - examples/pm-app/server/utils.js | 37 - examples/pm-app/tsconfig.json | 22 - examples/pm-app/typings/global.d.ts | 22 - examples/quirrel/.eslintrc.js | 3 - examples/quirrel/.gitignore | 6 - examples/quirrel/README.md | 25 - examples/quirrel/app/entry.client.tsx | 4 - examples/quirrel/app/entry.server.tsx | 21 - .../quirrel/app/queues/greetings.server.ts | 5 - examples/quirrel/app/root.tsx | 32 - examples/quirrel/app/routes/index.tsx | 13 - .../quirrel/app/routes/queues/greetings.ts | 3 - examples/quirrel/package.json | 31 - examples/quirrel/public/favicon.ico | Bin 16958 -> 0 bytes examples/quirrel/remix.config.js | 8 - examples/quirrel/remix.env.d.ts | 2 - examples/quirrel/sandbox.config.json | 6 - examples/quirrel/tsconfig.json | 22 - examples/react-spring/.eslintrc.js | 3 - examples/react-spring/.gitignore | 6 - examples/react-spring/README.md | 25 - examples/react-spring/app/entry.client.tsx | 4 - examples/react-spring/app/entry.server.tsx | 21 - examples/react-spring/app/no-script.css | 4 - examples/react-spring/app/root.tsx | 40 - examples/react-spring/app/routes/index.tsx | 36 - examples/react-spring/app/styles.css | 10 - examples/react-spring/package.json | 28 - examples/react-spring/public/favicon.ico | Bin 16958 -> 0 bytes examples/react-spring/remix.config.js | 8 - examples/react-spring/remix.env.d.ts | 2 - examples/react-spring/sandbox.config.json | 6 - examples/react-spring/tsconfig.json | 22 - examples/redis-upstash-session/.env.example | 2 - examples/redis-upstash-session/.eslintrc.js | 3 - examples/redis-upstash-session/.gitignore | 6 - examples/redis-upstash-session/README.md | 38 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/redis-upstash-session/app/root.tsx | 32 - .../app/routes/index.tsx | 34 - .../app/sessions.server.ts | 18 - .../app/sessions/upstash.server.ts | 70 - examples/redis-upstash-session/package.json | 27 - .../redis-upstash-session/public/favicon.ico | Bin 16958 -> 0 bytes .../redis-upstash-session/remix.config.js | 8 - examples/redis-upstash-session/remix.env.d.ts | 2 - .../redis-upstash-session/sandbox.config.json | 6 - examples/redis-upstash-session/tsconfig.json | 22 - examples/remix-auth-auth0/.env.example | 7 - examples/remix-auth-auth0/.eslintrc.js | 3 - examples/remix-auth-auth0/.gitignore | 6 - examples/remix-auth-auth0/README.md | 23 - .../app/constants/index.server.ts | 7 - .../remix-auth-auth0/app/entry.client.tsx | 4 - .../remix-auth-auth0/app/entry.server.tsx | 21 - examples/remix-auth-auth0/app/root.tsx | 32 - .../remix-auth-auth0/app/routes/auth0.tsx | 10 - .../remix-auth-auth0/app/routes/callback.tsx | 10 - .../remix-auth-auth0/app/routes/index.tsx | 27 - .../remix-auth-auth0/app/routes/logout.tsx | 23 - .../remix-auth-auth0/app/routes/private.tsx | 33 - .../remix-auth-auth0/app/utils/auth.server.ts | 44 - examples/remix-auth-auth0/package.json | 29 - examples/remix-auth-auth0/public/favicon.ico | Bin 16958 -> 0 bytes examples/remix-auth-auth0/remix.config.js | 8 - examples/remix-auth-auth0/remix.env.d.ts | 2 - examples/remix-auth-auth0/sandbox.config.json | 6 - examples/remix-auth-auth0/tsconfig.json | 22 - examples/remix-auth-form/.eslintrc.js | 3 - examples/remix-auth-form/.gitignore | 6 - examples/remix-auth-form/README.md | 22 - examples/remix-auth-form/app/auth.server.ts | 32 - examples/remix-auth-form/app/entry.client.tsx | 4 - examples/remix-auth-form/app/entry.server.tsx | 21 - examples/remix-auth-form/app/root.tsx | 32 - examples/remix-auth-form/app/routes/login.tsx | 56 - .../remix-auth-form/app/routes/private.tsx | 32 - examples/remix-auth-form/package.json | 29 - examples/remix-auth-form/public/favicon.ico | Bin 16958 -> 0 bytes examples/remix-auth-form/remix.config.js | 8 - examples/remix-auth-form/remix.env.d.ts | 2 - examples/remix-auth-form/sandbox.config.json | 6 - examples/remix-auth-form/tsconfig.json | 22 - examples/remix-auth-github/.env.example | 3 - examples/remix-auth-github/.eslintrc.js | 3 - examples/remix-auth-github/.gitignore | 6 - examples/remix-auth-github/README.md | 22 - examples/remix-auth-github/app/auth.server.ts | 48 - .../remix-auth-github/app/entry.client.tsx | 4 - .../remix-auth-github/app/entry.server.tsx | 21 - examples/remix-auth-github/app/root.tsx | 32 - .../app/routes/auth.github.callback.tsx | 10 - .../app/routes/auth.github.tsx | 10 - .../remix-auth-github/app/routes/index.tsx | 29 - .../remix-auth-github/app/routes/private.tsx | 37 - examples/remix-auth-github/package.json | 29 - examples/remix-auth-github/public/favicon.ico | Bin 16958 -> 0 bytes examples/remix-auth-github/remix.config.js | 8 - examples/remix-auth-github/remix.env.d.ts | 2 - .../remix-auth-github/sandbox.config.json | 6 - examples/remix-auth-github/tsconfig.json | 22 - .../remix-auth-supabase-github/.env.example | 3 - .../remix-auth-supabase-github/.eslintrc.js | 3 - .../remix-auth-supabase-github/.gitignore | 6 - examples/remix-auth-supabase-github/README.md | 55 - .../app/auth.server.ts | 77 -- .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - .../remix-auth-supabase-github/app/root.tsx | 50 - .../app/routes/index.tsx | 17 - .../app/routes/login.tsx | 59 - .../app/routes/oauth.callback.tsx | 36 - .../app/routes/private.tsx | 32 - .../app/supabase.client.ts | 45 - .../app/supabase.server.ts | 38 - .../remix-auth-supabase-github/package.json | 30 - .../public/favicon.ico | Bin 16958 -> 0 bytes .../remix.config.js | 8 - .../remix-auth-supabase-github/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - .../remix-auth-supabase-github/tsconfig.json | 22 - examples/remix-auth-supabase/.env.example | 2 - examples/remix-auth-supabase/.eslintrc.js | 3 - examples/remix-auth-supabase/.gitignore | 6 - examples/remix-auth-supabase/README.md | 55 - .../remix-auth-supabase/app/auth.server.ts | 58 - .../remix-auth-supabase/app/entry.client.tsx | 4 - .../remix-auth-supabase/app/entry.server.tsx | 21 - examples/remix-auth-supabase/app/root.tsx | 32 - .../remix-auth-supabase/app/routes/index.tsx | 17 - .../remix-auth-supabase/app/routes/login.tsx | 53 - .../app/routes/private.tsx | 32 - examples/remix-auth-supabase/app/supabase.ts | 42 - examples/remix-auth-supabase/package.json | 31 - .../remix-auth-supabase/public/favicon.ico | Bin 16958 -> 0 bytes examples/remix-auth-supabase/remix.config.js | 8 - examples/remix-auth-supabase/remix.env.d.ts | 2 - .../remix-auth-supabase/sandbox.config.json | 6 - examples/remix-auth-supabase/tsconfig.json | 22 - examples/route-modal/.eslintrc.js | 3 - examples/route-modal/.gitignore | 6 - examples/route-modal/README.md | 24 - examples/route-modal/app/entry.client.tsx | 4 - examples/route-modal/app/entry.server.tsx | 21 - examples/route-modal/app/root.tsx | 35 - examples/route-modal/app/routes/invoices.tsx | 60 - .../app/routes/invoices/$id/edit.tsx | 125 -- .../route-modal/app/routes/invoices/add.tsx | 94 -- examples/route-modal/package.json | 28 - examples/route-modal/public/favicon.ico | Bin 16958 -> 0 bytes examples/route-modal/remix.config.js | 8 - examples/route-modal/remix.env.d.ts | 2 - examples/route-modal/sandbox.config.json | 6 - examples/route-modal/tsconfig.json | 22 - examples/routes-gen/.eslintrc.js | 3 - examples/routes-gen/.gitignore | 8 - examples/routes-gen/README.md | 31 - examples/routes-gen/app/entry.client.tsx | 4 - examples/routes-gen/app/entry.server.tsx | 21 - examples/routes-gen/app/root.tsx | 32 - examples/routes-gen/app/routes/index.tsx | 15 - .../app/routes/products/$productId.tsx | 12 - .../routes-gen/app/routes/products/index.tsx | 48 - examples/routes-gen/package.json | 30 - examples/routes-gen/public/favicon.ico | Bin 16958 -> 0 bytes examples/routes-gen/remix.config.js | 8 - examples/routes-gen/remix.env.d.ts | 2 - examples/routes-gen/sandbox.config.json | 6 - examples/routes-gen/tsconfig.json | 22 - examples/rust/.eslintrc.js | 3 - examples/rust/.gitignore | 6 - examples/rust/README.md | 69 - examples/rust/app/entry.client.tsx | 4 - examples/rust/app/entry.server.tsx | 21 - examples/rust/app/root.tsx | 38 - examples/rust/app/routes/index.tsx | 65 - examples/rust/app/rust.server.ts | 1 - examples/rust/app/styles/global.css | 80 -- examples/rust/app/styles/index.css | 82 -- examples/rust/package.json | 29 - examples/rust/public/favicon.ico | Bin 16958 -> 0 bytes examples/rust/remix.config.js | 8 - examples/rust/remix.env.d.ts | 2 - examples/rust/rust-functions/.gitignore | 14 - examples/rust/rust-functions/Cargo.toml | 11 - examples/rust/rust-functions/src/lib.rs | 6 - examples/rust/sandbox.config.json | 6 - examples/rust/tsconfig.json | 22 - examples/sanity/.env.example | 2 - examples/sanity/.eslintrc.js | 3 - examples/sanity/.gitignore | 6 - examples/sanity/README.md | 52 - examples/sanity/app/components/Preview.tsx | 26 - examples/sanity/app/components/index.ts | 1 - examples/sanity/app/entry.client.tsx | 4 - examples/sanity/app/entry.server.tsx | 21 - examples/sanity/app/lib/sanity/config.ts | 7 - .../app/lib/sanity/filterDataToSingleItem.ts | 15 - examples/sanity/app/lib/sanity/getClient.ts | 17 - examples/sanity/app/lib/sanity/helpers.tsx | 15 - examples/sanity/app/lib/sanity/index.ts | 5 - .../app/lib/sanity/usePreviewSubscription.ts | 65 - examples/sanity/app/root.tsx | 87 -- examples/sanity/app/routes/$slug.tsx | 84 -- examples/sanity/app/routes/index.tsx | 39 - examples/sanity/app/styles/global.css | 18 - examples/sanity/package.json | 31 - examples/sanity/public/favicon.ico | Bin 16958 -> 0 bytes examples/sanity/remix.config.js | 8 - examples/sanity/remix.env.d.ts | 2 - examples/sanity/sandbox.config.json | 6 - examples/sanity/studio/.npmignore | 12 - examples/sanity/studio/README.md | 10 - examples/sanity/studio/config/.checksums | 8 - .../studio/config/@sanity/data-aspects.json | 3 - .../studio/config/@sanity/default-layout.json | 6 - .../studio/config/@sanity/default-login.json | 7 - .../studio/config/@sanity/form-builder.json | 5 - .../config/@sanity/google-maps-input.json | 9 - examples/sanity/studio/package.json | 22 - examples/sanity/studio/plugins/.gitkeep | 1 - examples/sanity/studio/sanity.json | 28 - .../sanity/studio/schemas/blockContent.js | 65 - examples/sanity/studio/schemas/castMember.js | 35 - examples/sanity/studio/schemas/crewMember.js | 49 - examples/sanity/studio/schemas/movie.js | 86 -- examples/sanity/studio/schemas/person.js | 36 - .../sanity/studio/schemas/plotSummaries.js | 18 - examples/sanity/studio/schemas/plotSummary.js | 22 - examples/sanity/studio/schemas/schema.js | 36 - examples/sanity/studio/schemas/screening.js | 80 -- examples/sanity/studio/static/favicon.ico | Bin 1150 -> 0 bytes examples/sanity/studio/tsconfig.json | 10 - examples/sanity/tsconfig.json | 22 - examples/sass/.eslintrc.js | 3 - examples/sass/.gitignore | 8 - examples/sass/README.md | 18 - examples/sass/app/entry.client.tsx | 4 - examples/sass/app/entry.server.tsx | 21 - examples/sass/app/root.tsx | 38 - examples/sass/package.json | 33 - examples/sass/public/favicon.ico | Bin 16958 -> 0 bytes examples/sass/remix.config.js | 8 - examples/sass/remix.env.d.ts | 2 - examples/sass/sandbox.config.json | 6 - examples/sass/styles/global.scss | 9 - examples/sass/tsconfig.json | 22 - examples/search-input/.eslintrc.js | 3 - examples/search-input/.gitignore | 6 - examples/search-input/README.md | 36 - examples/search-input/app/entry.client.tsx | 4 - examples/search-input/app/entry.server.tsx | 21 - examples/search-input/app/root.tsx | 128 -- examples/search-input/app/routes/index.tsx | 151 --- examples/search-input/app/styles/global.css | 90 -- examples/search-input/app/styles/index.css | 77 -- examples/search-input/package.json | 27 - examples/search-input/public/favicon.ico | Bin 16958 -> 0 bytes examples/search-input/remix.config.js | 8 - examples/search-input/remix.env.d.ts | 2 - examples/search-input/sandbox.config.json | 6 - examples/search-input/tsconfig.json | 22 - examples/session-flash/.eslintrc.js | 3 - examples/session-flash/.gitignore | 6 - examples/session-flash/README.md | 39 - examples/session-flash/app/entry.client.tsx | 4 - examples/session-flash/app/entry.server.tsx | 21 - examples/session-flash/app/root.tsx | 24 - examples/session-flash/app/routes/index.tsx | 151 --- .../session-flash/app/utils/session.server.ts | 36 - examples/session-flash/package.json | 30 - examples/session-flash/public/favicon.ico | Bin 16958 -> 0 bytes examples/session-flash/remix.config.js | 8 - examples/session-flash/remix.env.d.ts | 2 - examples/session-flash/sandbox.config.json | 6 - examples/session-flash/tsconfig.json | 20 - examples/sharing-loader-data/.eslintrc.js | 3 - examples/sharing-loader-data/.gitignore | 6 - examples/sharing-loader-data/README.md | 28 - .../sharing-loader-data/app/data.server.ts | 25 - .../sharing-loader-data/app/entry.client.tsx | 4 - .../sharing-loader-data/app/entry.server.tsx | 21 - examples/sharing-loader-data/app/root.tsx | 42 - .../sharing-loader-data/app/routes/index.tsx | 14 - .../app/routes/workshops.tsx | 33 - .../app/routes/workshops/$workshopId.tsx | 50 - .../app/routes/workshops/index.tsx | 3 - examples/sharing-loader-data/package.json | 27 - .../sharing-loader-data/public/favicon.ico | Bin 16958 -> 0 bytes examples/sharing-loader-data/remix.config.js | 8 - examples/sharing-loader-data/remix.env.d.ts | 2 - .../sharing-loader-data/sandbox.config.json | 6 - examples/sharing-loader-data/tsconfig.json | 22 - examples/socket.io/.eslintrc.js | 3 - examples/socket.io/.gitignore | 6 - examples/socket.io/README.md | 33 - examples/socket.io/app/context.tsx | 18 - examples/socket.io/app/entry.client.tsx | 4 - examples/socket.io/app/entry.server.tsx | 21 - examples/socket.io/app/root.tsx | 55 - examples/socket.io/app/routes/index.tsx | 28 - examples/socket.io/package.json | 34 - examples/socket.io/public/favicon.ico | Bin 16958 -> 0 bytes examples/socket.io/remix.config.js | 9 - examples/socket.io/remix.env.d.ts | 2 - examples/socket.io/sandbox.config.json | 6 - examples/socket.io/server/index.js | 80 -- examples/socket.io/tsconfig.json | 22 - examples/stitches/.eslintrc.js | 3 - examples/stitches/.gitignore | 6 - examples/stitches/README.md | 54 - examples/stitches/app/entry.client.tsx | 30 - examples/stitches/app/entry.server.tsx | 28 - examples/stitches/app/root.tsx | 93 -- examples/stitches/app/routes/index.tsx | 25 - examples/stitches/app/routes/jokes.tsx | 17 - .../stitches/app/routes/jokes/jokes-error.tsx | 3 - .../stitches/app/styles/client.context.ts | 13 - .../stitches/app/styles/stitches.config.ts | 22 - examples/stitches/package.json | 28 - examples/stitches/public/favicon.ico | Bin 16958 -> 0 bytes examples/stitches/remix.config.js | 8 - examples/stitches/remix.env.d.ts | 2 - examples/stitches/sandbox.config.json | 6 - examples/stitches/tsconfig.json | 22 - examples/strapi/.eslintrc.js | 3 - examples/strapi/.gitignore | 6 - examples/strapi/README.md | 49 - examples/strapi/app/entry.client.tsx | 4 - examples/strapi/app/entry.server.tsx | 21 - examples/strapi/app/root.tsx | 25 - examples/strapi/app/routes/index.tsx | 72 - examples/strapi/package.json | 32 - examples/strapi/public/favicon.ico | Bin 16958 -> 0 bytes examples/strapi/remix.config.js | 8 - examples/strapi/remix.env.d.ts | 2 - examples/strapi/sandbox.config.json | 6 - examples/strapi/strapi/.env.example | 2 - examples/strapi/strapi/.gitignore | 113 -- examples/strapi/strapi/.tmp/data.db | Bin 352256 -> 0 bytes examples/strapi/strapi/README.md | 57 - examples/strapi/strapi/config/admin.js | 5 - examples/strapi/strapi/config/api.js | 7 - examples/strapi/strapi/config/database.js | 15 - examples/strapi/strapi/config/middlewares.js | 11 - examples/strapi/strapi/config/server.js | 4 - examples/strapi/strapi/favicon.ico | Bin 3688 -> 0 bytes examples/strapi/strapi/package.json | 25 - examples/strapi/strapi/public/robots.txt | 3 - .../strapi/strapi/public/uploads/.gitkeep | 0 .../strapi/strapi/src/admin/app.example.js | 35 - .../src/admin/webpack.config.example.js | 9 - examples/strapi/strapi/src/api/.gitkeep | 0 .../api/post/content-types/post/schema.json | 21 - .../strapi/src/api/post/controllers/post.js | 9 - .../strapi/strapi/src/api/post/routes/post.js | 9 - .../strapi/src/api/post/services/post.js | 9 - .../strapi/strapi/src/extensions/.gitkeep | 0 .../content-types/user/schema.json | 67 - examples/strapi/strapi/src/index.js | 20 - examples/strapi/tsconfig.json | 22 - examples/stripe-integration/.env.example | 4 - examples/stripe-integration/.eslintrc.js | 3 - examples/stripe-integration/.gitignore | 6 - examples/stripe-integration/README.md | 41 - .../stripe-integration/app/entry.client.tsx | 4 - .../stripe-integration/app/entry.server.tsx | 21 - examples/stripe-integration/app/root.tsx | 32 - .../app/routes/api/stripe-web-hook.tsx | 22 - .../stripe-integration/app/routes/buy.tsx | 21 - .../app/routes/payment/cancelled.tsx | 3 - .../app/routes/payment/success.tsx | 3 - .../app/utils/stripe.server.tsx | 33 - examples/stripe-integration/package.json | 28 - .../stripe-integration/public/favicon.ico | Bin 16958 -> 0 bytes examples/stripe-integration/remix.config.js | 8 - examples/stripe-integration/remix.env.d.ts | 2 - examples/stripe-integration/tsconfig.json | 22 - examples/styled-components/.eslintrc.js | 3 - examples/styled-components/.gitignore | 6 - examples/styled-components/README.md | 21 - .../styled-components/app/entry.client.tsx | 4 - .../styled-components/app/entry.server.tsx | 29 - examples/styled-components/app/root.tsx | 33 - .../styled-components/app/routes/index.tsx | 14 - .../styled-components/app/styles-context.tsx | 4 - examples/styled-components/package.json | 29 - examples/styled-components/public/favicon.ico | Bin 16958 -> 0 bytes examples/styled-components/remix.config.js | 8 - examples/styled-components/remix.env.d.ts | 2 - .../styled-components/sandbox.config.json | 6 - examples/styled-components/tsconfig.json | 22 - examples/styletron/.eslintrc.js | 3 - examples/styletron/.gitignore | 6 - examples/styletron/README.md | 25 - examples/styletron/app/entry.client.tsx | 4 - examples/styletron/app/entry.server.tsx | 27 - examples/styletron/app/root.tsx | 39 - examples/styletron/app/routes/index.tsx | 15 - examples/styletron/app/styletron.ts | 33 - examples/styletron/package.json | 33 - examples/styletron/public/favicon.ico | Bin 16958 -> 0 bytes examples/styletron/remix.config.js | 8 - examples/styletron/remix.env.d.ts | 2 - examples/styletron/sandbox.config.json | 6 - examples/styletron/tsconfig.json | 22 - examples/supabase-subscription/.env.example | 2 - examples/supabase-subscription/.eslintrc.js | 3 - examples/supabase-subscription/.gitignore | 6 - examples/supabase-subscription/README.md | 53 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/supabase-subscription/app/root.tsx | 61 - .../app/routes/realtime.tsx | 42 - .../app/utils/supabaseClient.server.tsx | 6 - examples/supabase-subscription/package.json | 29 - .../supabase-subscription/public/favicon.ico | Bin 16958 -> 0 bytes .../supabase-subscription/remix.config.js | 8 - examples/supabase-subscription/remix.env.d.ts | 2 - .../supabase-subscription/sandbox.config.json | 6 - examples/supabase-subscription/tsconfig.json | 22 - examples/tailwindcss/.eslintrc.js | 3 - examples/tailwindcss/.gitignore | 8 - examples/tailwindcss/README.md | 24 - examples/tailwindcss/app/entry.client.tsx | 4 - examples/tailwindcss/app/entry.server.tsx | 21 - examples/tailwindcss/app/root.tsx | 38 - examples/tailwindcss/app/routes/index.tsx | 3 - examples/tailwindcss/package.json | 35 - examples/tailwindcss/public/favicon.ico | Bin 16958 -> 0 bytes examples/tailwindcss/remix.config.js | 8 - examples/tailwindcss/remix.env.d.ts | 2 - examples/tailwindcss/sandbox.config.json | 6 - examples/tailwindcss/tailwind.config.js | 8 - examples/tailwindcss/tsconfig.json | 22 - examples/template/.eslintrc.js | 3 - examples/template/.gitignore | 6 - examples/template/README.md | 19 - examples/template/app/entry.client.tsx | 4 - examples/template/app/entry.server.tsx | 21 - examples/template/app/root.tsx | 32 - examples/template/package.json | 27 - examples/template/public/favicon.ico | Bin 16958 -> 0 bytes examples/template/remix.config.js | 8 - examples/template/remix.env.d.ts | 2 - examples/template/sandbox.config.json | 6 - examples/template/tsconfig.json | 22 - examples/theme-ui/.eslintrc.js | 3 - examples/theme-ui/.gitignore | 6 - examples/theme-ui/README.md | 50 - examples/theme-ui/app/entry.client.tsx | 29 - examples/theme-ui/app/entry.server.tsx | 43 - examples/theme-ui/app/root.tsx | 78 -- examples/theme-ui/app/routes/index.tsx | 17 - examples/theme-ui/app/routes/jokes-error.tsx | 3 - examples/theme-ui/app/routes/jokes.tsx | 11 - examples/theme-ui/app/styles/context.tsx | 19 - .../app/styles/createEmotionCache.tsx | 3 - examples/theme-ui/package.json | 31 - examples/theme-ui/public/favicon.ico | Bin 16958 -> 0 bytes examples/theme-ui/remix.config.js | 8 - examples/theme-ui/remix.env.d.ts | 2 - examples/theme-ui/sandbox.config.json | 6 - examples/theme-ui/tsconfig.json | 23 - examples/tiptap-collab-editing/.eslintrc.js | 3 - examples/tiptap-collab-editing/.gitignore | 6 - examples/tiptap-collab-editing/README.md | 24 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/tiptap-collab-editing/app/root.tsx | 32 - .../app/routes/editor.tsx | 32 - .../app/utils/webrtc.client.tsx | 6 - examples/tiptap-collab-editing/package.json | 32 - .../tiptap-collab-editing/public/favicon.ico | Bin 16958 -> 0 bytes .../tiptap-collab-editing/remix.config.js | 8 - examples/tiptap-collab-editing/remix.env.d.ts | 2 - .../tiptap-collab-editing/sandbox.config.json | 6 - examples/tiptap-collab-editing/tsconfig.json | 22 - examples/toast-message/.eslintrc.js | 3 - examples/toast-message/.gitignore | 6 - examples/toast-message/README.md | 31 - examples/toast-message/app/entry.client.tsx | 4 - examples/toast-message/app/entry.server.tsx | 21 - examples/toast-message/app/message.server.ts | 26 - examples/toast-message/app/root.tsx | 83 -- examples/toast-message/app/routes/index.tsx | 73 - .../toast-message/app/routes/submit-secret.ts | 44 - examples/toast-message/package.json | 28 - examples/toast-message/public/favicon.ico | Bin 16958 -> 0 bytes examples/toast-message/remix.config.js | 8 - examples/toast-message/remix.env.d.ts | 2 - examples/toast-message/sandbox.config.json | 6 - examples/toast-message/tsconfig.json | 22 - examples/turborepo-vercel/.gitignore | 4 - examples/turborepo-vercel/README.md | 25 - .../apps/remix-app/.eslintrc.js | 3 - .../apps/remix-app/.gitignore | 10 - .../apps/remix-app/api/api.js | 5 - .../apps/remix-app/app/entry.client.tsx | 4 - .../apps/remix-app/app/entry.server.tsx | 21 - .../apps/remix-app/app/root.tsx | 32 - .../apps/remix-app/app/routes/index.tsx | 10 - .../apps/remix-app/package.json | 31 - .../apps/remix-app/public/favicon.ico | Bin 16958 -> 0 bytes .../apps/remix-app/remix.config.js | 8 - .../apps/remix-app/remix.env.d.ts | 2 - .../apps/remix-app/rollup.config.js | 18 - .../apps/remix-app/tsconfig.json | 22 - .../apps/remix-app/vercel.json | 7 - examples/turborepo-vercel/package.json | 40 - .../turborepo-vercel/packages/ui/package.json | 22 - .../packages/ui/src/Button.tsx | 5 - .../packages/ui/src/index.tsx | 1 - .../packages/ui/tsconfig.json | 10 - .../vercel-project-config-example.png | Bin 92710 -> 0 bytes examples/twind/.eslintrc.js | 3 - examples/twind/.gitignore | 6 - examples/twind/README.md | 25 - examples/twind/app/entry.client.tsx | 4 - examples/twind/app/entry.server.tsx | 25 - examples/twind/app/root.tsx | 37 - examples/twind/app/routes/anything.tsx | 15 - examples/twind/app/routes/index.tsx | 52 - examples/twind/package.json | 32 - examples/twind/public/favicon.ico | Bin 16958 -> 0 bytes examples/twind/remix.config.js | 14 - examples/twind/remix.env.d.ts | 2 - examples/twind/sandbox.config.json | 6 - examples/twind/tsconfig.json | 20 - examples/twind/twind.config.ts | 8 - examples/usematches-loader-data/.eslintrc.js | 3 - examples/usematches-loader-data/.gitignore | 6 - examples/usematches-loader-data/README.md | 31 - .../usematches-loader-data/app/db.server.ts | 13 - .../app/entry.client.tsx | 4 - .../app/entry.server.tsx | 21 - examples/usematches-loader-data/app/root.tsx | 45 - .../app/routes/index.tsx | 12 - .../app/useMatchesData.ts | 19 - .../usematches-loader-data/app/useUser.ts | 43 - examples/usematches-loader-data/package.json | 27 - .../usematches-loader-data/public/favicon.ico | Bin 16958 -> 0 bytes .../usematches-loader-data/remix.config.js | 8 - .../usematches-loader-data/remix.env.d.ts | 2 - .../sandbox.config.json | 6 - examples/usematches-loader-data/tsconfig.json | 22 - examples/yarn-pnp/.eslintrc.js | 3 - examples/yarn-pnp/.gitignore | 19 - examples/yarn-pnp/README.md | 54 - examples/yarn-pnp/app/entry.client.tsx | 4 - examples/yarn-pnp/app/entry.server.tsx | 21 - examples/yarn-pnp/app/root.tsx | 32 - examples/yarn-pnp/app/routes/index.tsx | 18 - examples/yarn-pnp/package.json | 27 - examples/yarn-pnp/public/favicon.ico | Bin 16958 -> 0 bytes examples/yarn-pnp/remix.config.js | 10 - examples/yarn-pnp/remix.env.d.ts | 2 - examples/yarn-pnp/sandbox.config.json | 6 - examples/yarn-pnp/tsconfig.json | 19 - 1314 files changed, 1 insertion(+), 39221 deletions(-) delete mode 100644 examples/.gitignore delete mode 100644 examples/basic/.eslintrc.js delete mode 100644 examples/basic/.gitignore delete mode 100644 examples/basic/README.md delete mode 100644 examples/basic/app/entry.client.tsx delete mode 100644 examples/basic/app/entry.server.tsx delete mode 100644 examples/basic/app/root.tsx delete mode 100644 examples/basic/app/routes/demos/about.tsx delete mode 100644 examples/basic/app/routes/demos/about/index.tsx delete mode 100644 examples/basic/app/routes/demos/about/whoa.tsx delete mode 100644 examples/basic/app/routes/demos/actions.tsx delete mode 100644 examples/basic/app/routes/demos/correct.tsx delete mode 100644 examples/basic/app/routes/demos/params.tsx delete mode 100644 examples/basic/app/routes/demos/params/$id.tsx delete mode 100644 examples/basic/app/routes/demos/params/index.tsx delete mode 100644 examples/basic/app/routes/index.tsx delete mode 100644 examples/basic/app/styles/dark.css delete mode 100644 examples/basic/app/styles/demos/about.css delete mode 100644 examples/basic/app/styles/demos/remix.css delete mode 100644 examples/basic/app/styles/global.css delete mode 100644 examples/basic/package.json delete mode 100644 examples/basic/public/favicon.ico delete mode 100644 examples/basic/remix.config.js delete mode 100644 examples/basic/remix.env.d.ts delete mode 100644 examples/basic/sandbox.config.json delete mode 100644 examples/basic/tsconfig.json delete mode 100644 examples/blog-tutorial/.dockerignore delete mode 100644 examples/blog-tutorial/.env.example delete mode 100644 examples/blog-tutorial/.eslintrc.js delete mode 100644 examples/blog-tutorial/.github/workflows/deploy.yml delete mode 100644 examples/blog-tutorial/.gitignore delete mode 100644 examples/blog-tutorial/.gitpod.Dockerfile delete mode 100644 examples/blog-tutorial/.gitpod.yml delete mode 100644 examples/blog-tutorial/.prettierignore delete mode 100644 examples/blog-tutorial/Dockerfile delete mode 100644 examples/blog-tutorial/README.md delete mode 100644 examples/blog-tutorial/app/db.server.ts delete mode 100644 examples/blog-tutorial/app/entry.client.tsx delete mode 100644 examples/blog-tutorial/app/entry.server.tsx delete mode 100644 examples/blog-tutorial/app/models/note.server.ts delete mode 100644 examples/blog-tutorial/app/models/post.server.ts delete mode 100644 examples/blog-tutorial/app/models/user.server.ts delete mode 100644 examples/blog-tutorial/app/root.tsx delete mode 100644 examples/blog-tutorial/app/routes/healthcheck.tsx delete mode 100644 examples/blog-tutorial/app/routes/index.tsx delete mode 100644 examples/blog-tutorial/app/routes/join.tsx delete mode 100644 examples/blog-tutorial/app/routes/login.tsx delete mode 100644 examples/blog-tutorial/app/routes/logout.tsx delete mode 100644 examples/blog-tutorial/app/routes/notes.tsx delete mode 100644 examples/blog-tutorial/app/routes/notes/$noteId.tsx delete mode 100644 examples/blog-tutorial/app/routes/notes/index.tsx delete mode 100644 examples/blog-tutorial/app/routes/notes/new.tsx delete mode 100644 examples/blog-tutorial/app/routes/posts/$slug.tsx delete mode 100644 examples/blog-tutorial/app/routes/posts/admin.tsx delete mode 100644 examples/blog-tutorial/app/routes/posts/admin/index.tsx delete mode 100644 examples/blog-tutorial/app/routes/posts/admin/new.tsx delete mode 100644 examples/blog-tutorial/app/routes/posts/index.tsx delete mode 100644 examples/blog-tutorial/app/session.server.ts delete mode 100644 examples/blog-tutorial/app/utils.test.ts delete mode 100644 examples/blog-tutorial/app/utils.ts delete mode 100644 examples/blog-tutorial/cypress.json delete mode 100644 examples/blog-tutorial/cypress/.eslintrc.js delete mode 100644 examples/blog-tutorial/cypress/e2e/smoke.ts delete mode 100644 examples/blog-tutorial/cypress/fixtures/example.json delete mode 100644 examples/blog-tutorial/cypress/plugins/index.ts delete mode 100644 examples/blog-tutorial/cypress/support/commands.ts delete mode 100644 examples/blog-tutorial/cypress/support/create-user.ts delete mode 100644 examples/blog-tutorial/cypress/support/delete-user.ts delete mode 100644 examples/blog-tutorial/cypress/support/index.ts delete mode 100644 examples/blog-tutorial/cypress/tsconfig.json delete mode 100644 examples/blog-tutorial/fly.toml delete mode 100644 examples/blog-tutorial/mocks/README.md delete mode 100644 examples/blog-tutorial/mocks/index.js delete mode 100644 examples/blog-tutorial/mocks/start.ts delete mode 100644 examples/blog-tutorial/package.json delete mode 100644 examples/blog-tutorial/prisma/migrations/20220307190657_init/migration.sql delete mode 100644 examples/blog-tutorial/prisma/migrations/migration_lock.toml delete mode 100644 examples/blog-tutorial/prisma/schema.prisma delete mode 100644 examples/blog-tutorial/prisma/seed.ts delete mode 100644 examples/blog-tutorial/public/favicon.ico delete mode 100644 examples/blog-tutorial/remix.config.js delete mode 100644 examples/blog-tutorial/remix.env.d.ts delete mode 100644 examples/blog-tutorial/sandbox.config.json delete mode 100644 examples/blog-tutorial/start.sh delete mode 100644 examples/blog-tutorial/tailwind.config.js delete mode 100644 examples/blog-tutorial/test/setup-test-env.ts delete mode 100644 examples/blog-tutorial/tsconfig.json delete mode 100644 examples/blog-tutorial/vitest.config.ts delete mode 100644 examples/bullmq-task-queue/.env.example delete mode 100644 examples/bullmq-task-queue/.eslintrc.js delete mode 100644 examples/bullmq-task-queue/.gitignore delete mode 100644 examples/bullmq-task-queue/README.md delete mode 100644 examples/bullmq-task-queue/app/entry.client.tsx delete mode 100644 examples/bullmq-task-queue/app/entry.server.tsx delete mode 100644 examples/bullmq-task-queue/app/queues/notifier.server.ts delete mode 100644 examples/bullmq-task-queue/app/root.tsx delete mode 100644 examples/bullmq-task-queue/app/routes/index.tsx delete mode 100644 examples/bullmq-task-queue/app/utils/queue.server.ts delete mode 100644 examples/bullmq-task-queue/app/utils/redis.server.ts delete mode 100644 examples/bullmq-task-queue/package.json delete mode 100644 examples/bullmq-task-queue/public/favicon.ico delete mode 100644 examples/bullmq-task-queue/remix.config.js delete mode 100644 examples/bullmq-task-queue/remix.env.d.ts delete mode 100644 examples/bullmq-task-queue/sandbox.config.json delete mode 100644 examples/bullmq-task-queue/tsconfig.json delete mode 100644 examples/catch-boundary/.eslintrc.js delete mode 100644 examples/catch-boundary/.gitignore delete mode 100644 examples/catch-boundary/README.md delete mode 100644 examples/catch-boundary/app/data.server.ts delete mode 100644 examples/catch-boundary/app/entry.client.tsx delete mode 100644 examples/catch-boundary/app/entry.server.tsx delete mode 100644 examples/catch-boundary/app/root.tsx delete mode 100644 examples/catch-boundary/app/routes/index.tsx delete mode 100644 examples/catch-boundary/app/routes/users.tsx delete mode 100644 examples/catch-boundary/app/routes/users/$userId.tsx delete mode 100644 examples/catch-boundary/package.json delete mode 100644 examples/catch-boundary/public/favicon.ico delete mode 100644 examples/catch-boundary/remix.config.js delete mode 100644 examples/catch-boundary/remix.env.d.ts delete mode 100644 examples/catch-boundary/sandbox.config.json delete mode 100644 examples/catch-boundary/tsconfig.json delete mode 100644 examples/chakra-ui/.eslintrc.js delete mode 100644 examples/chakra-ui/.gitignore delete mode 100644 examples/chakra-ui/README.md delete mode 100644 examples/chakra-ui/app/entry.client.tsx delete mode 100644 examples/chakra-ui/app/entry.server.tsx delete mode 100644 examples/chakra-ui/app/root.tsx delete mode 100644 examples/chakra-ui/app/routes/index.tsx delete mode 100644 examples/chakra-ui/package.json delete mode 100644 examples/chakra-ui/public/favicon.ico delete mode 100644 examples/chakra-ui/remix.config.js delete mode 100644 examples/chakra-ui/remix.env.d.ts delete mode 100644 examples/chakra-ui/sandbox.config.json delete mode 100644 examples/chakra-ui/tsconfig.json delete mode 100644 examples/client-only-components/.eslintrc.js delete mode 100644 examples/client-only-components/.gitignore delete mode 100644 examples/client-only-components/README.md delete mode 100644 examples/client-only-components/app/components/broken-on-the-server.client.tsx delete mode 100644 examples/client-only-components/app/components/complex-component.tsx delete mode 100644 examples/client-only-components/app/entry.client.tsx delete mode 100644 examples/client-only-components/app/entry.server.tsx delete mode 100644 examples/client-only-components/app/root.tsx delete mode 100644 examples/client-only-components/app/routes/index.tsx delete mode 100644 examples/client-only-components/package.json delete mode 100644 examples/client-only-components/public/favicon.ico delete mode 100644 examples/client-only-components/remix.config.js delete mode 100644 examples/client-only-components/remix.env.d.ts delete mode 100644 examples/client-only-components/sandbox.config.json delete mode 100644 examples/client-only-components/tsconfig.json delete mode 100644 examples/client-side-validation/.eslintrc.js delete mode 100644 examples/client-side-validation/.gitignore delete mode 100644 examples/client-side-validation/README.md delete mode 100644 examples/client-side-validation/app/entry.client.tsx delete mode 100644 examples/client-side-validation/app/entry.server.tsx delete mode 100644 examples/client-side-validation/app/index.css delete mode 100644 examples/client-side-validation/app/root.tsx delete mode 100644 examples/client-side-validation/package.json delete mode 100644 examples/client-side-validation/public/favicon.ico delete mode 100644 examples/client-side-validation/remix.config.js delete mode 100644 examples/client-side-validation/remix.env.d.ts delete mode 100644 examples/client-side-validation/sandbox.config.json delete mode 100644 examples/client-side-validation/tsconfig.json delete mode 100644 examples/collected-notes/.env.example delete mode 100644 examples/collected-notes/.eslintrc.js delete mode 100644 examples/collected-notes/.gitignore delete mode 100644 examples/collected-notes/README.md delete mode 100644 examples/collected-notes/app/cn.server.ts delete mode 100644 examples/collected-notes/app/entry.client.tsx delete mode 100644 examples/collected-notes/app/entry.server.tsx delete mode 100644 examples/collected-notes/app/root.tsx delete mode 100644 examples/collected-notes/app/routes/$slug.tsx delete mode 100644 examples/collected-notes/app/routes/index.tsx delete mode 100644 examples/collected-notes/package.json delete mode 100644 examples/collected-notes/public/favicon.ico delete mode 100644 examples/collected-notes/remix.config.js delete mode 100644 examples/collected-notes/remix.env.d.ts delete mode 100644 examples/collected-notes/sandbox.config.json delete mode 100644 examples/collected-notes/tsconfig.json delete mode 100644 examples/combobox-resource-route/.eslintrc.js delete mode 100644 examples/combobox-resource-route/.gitignore delete mode 100644 examples/combobox-resource-route/README.md delete mode 100644 examples/combobox-resource-route/app/app.css delete mode 100644 examples/combobox-resource-route/app/entry.client.tsx delete mode 100644 examples/combobox-resource-route/app/entry.server.tsx delete mode 100644 examples/combobox-resource-route/app/models/langs.ts delete mode 100644 examples/combobox-resource-route/app/root.tsx delete mode 100644 examples/combobox-resource-route/app/routes/index.tsx delete mode 100644 examples/combobox-resource-route/app/routes/lang-search.tsx delete mode 100644 examples/combobox-resource-route/package.json delete mode 100644 examples/combobox-resource-route/public/favicon.ico delete mode 100644 examples/combobox-resource-route/remix.config.js delete mode 100644 examples/combobox-resource-route/remix.env.d.ts delete mode 100644 examples/combobox-resource-route/sandbox.config.json delete mode 100644 examples/combobox-resource-route/tsconfig.json delete mode 100644 examples/dark-mode/.eslintrc.js delete mode 100644 examples/dark-mode/.gitignore delete mode 100644 examples/dark-mode/README.md delete mode 100644 examples/dark-mode/app/entry.client.tsx delete mode 100644 examples/dark-mode/app/entry.server.tsx delete mode 100644 examples/dark-mode/app/root.tsx delete mode 100644 examples/dark-mode/app/routes/action/set-theme.tsx delete mode 100644 examples/dark-mode/app/routes/index.tsx delete mode 100644 examples/dark-mode/app/styles/styles.css delete mode 100644 examples/dark-mode/app/utils/theme-provider.tsx delete mode 100644 examples/dark-mode/app/utils/theme.server.ts delete mode 100644 examples/dark-mode/package.json delete mode 100644 examples/dark-mode/public/favicon.ico delete mode 100644 examples/dark-mode/remix.config.js delete mode 100644 examples/dark-mode/remix.env.d.ts delete mode 100644 examples/dark-mode/sandbox.config.json delete mode 100644 examples/dark-mode/tsconfig.json delete mode 100644 examples/dataloader/.eslintrc.js delete mode 100644 examples/dataloader/.gitignore delete mode 100644 examples/dataloader/README.md delete mode 100644 examples/dataloader/app/data.server.ts delete mode 100644 examples/dataloader/app/entry.client.tsx delete mode 100644 examples/dataloader/app/entry.server.tsx delete mode 100644 examples/dataloader/app/loaders/userLoader.ts delete mode 100644 examples/dataloader/app/root.tsx delete mode 100644 examples/dataloader/app/routes/index.tsx delete mode 100644 examples/dataloader/app/routes/users.tsx delete mode 100644 examples/dataloader/app/routes/users/index.tsx delete mode 100644 examples/dataloader/package.json delete mode 100644 examples/dataloader/public/favicon.ico delete mode 100644 examples/dataloader/remix.config.js delete mode 100644 examples/dataloader/remix.env.d.ts delete mode 100644 examples/dataloader/sandbox.config.json delete mode 100644 examples/dataloader/server/index.ts delete mode 100644 examples/dataloader/tsconfig.json delete mode 100644 examples/emotion/.eslintrc.js delete mode 100644 examples/emotion/.gitignore delete mode 100644 examples/emotion/README.md delete mode 100644 examples/emotion/app/entry.client.tsx delete mode 100644 examples/emotion/app/entry.server.tsx delete mode 100644 examples/emotion/app/root.tsx delete mode 100644 examples/emotion/app/routes/index.tsx delete mode 100644 examples/emotion/app/routes/jokes-error.tsx delete mode 100644 examples/emotion/app/routes/jokes.tsx delete mode 100644 examples/emotion/app/styles/client.context.tsx delete mode 100644 examples/emotion/app/styles/createEmotionCache.ts delete mode 100644 examples/emotion/app/styles/server.context.tsx delete mode 100644 examples/emotion/package.json delete mode 100644 examples/emotion/public/favicon.ico delete mode 100644 examples/emotion/remix.config.js delete mode 100644 examples/emotion/remix.env.d.ts delete mode 100644 examples/emotion/sandbox.config.json delete mode 100644 examples/emotion/tsconfig.json delete mode 100644 examples/file-and-cloudinary-upload/.env.sample delete mode 100644 examples/file-and-cloudinary-upload/.eslintrc.js delete mode 100644 examples/file-and-cloudinary-upload/.gitignore delete mode 100644 examples/file-and-cloudinary-upload/README.md delete mode 100644 examples/file-and-cloudinary-upload/app/entry.client.tsx delete mode 100644 examples/file-and-cloudinary-upload/app/entry.server.tsx delete mode 100644 examples/file-and-cloudinary-upload/app/root.tsx delete mode 100644 examples/file-and-cloudinary-upload/app/routes/cloudinary-upload.tsx delete mode 100644 examples/file-and-cloudinary-upload/app/routes/local-upload.tsx delete mode 100644 examples/file-and-cloudinary-upload/app/utils/utils.server.ts delete mode 100644 examples/file-and-cloudinary-upload/package.json delete mode 100644 examples/file-and-cloudinary-upload/public/favicon.ico delete mode 100644 examples/file-and-cloudinary-upload/remix.config.js delete mode 100644 examples/file-and-cloudinary-upload/remix.env.d.ts delete mode 100644 examples/file-and-cloudinary-upload/sandbox.config.json delete mode 100644 examples/file-and-cloudinary-upload/tsconfig.json delete mode 100644 examples/file-and-s3-upload/.env.sample delete mode 100644 examples/file-and-s3-upload/.eslintrc.js delete mode 100644 examples/file-and-s3-upload/.gitignore delete mode 100644 examples/file-and-s3-upload/README.md delete mode 100644 examples/file-and-s3-upload/app/entry.client.tsx delete mode 100644 examples/file-and-s3-upload/app/entry.server.tsx delete mode 100644 examples/file-and-s3-upload/app/root.tsx delete mode 100644 examples/file-and-s3-upload/app/routes/s3-upload.tsx delete mode 100644 examples/file-and-s3-upload/app/utils/s3.server.ts delete mode 100644 examples/file-and-s3-upload/package.json delete mode 100644 examples/file-and-s3-upload/public/favicon.ico delete mode 100644 examples/file-and-s3-upload/remix.config.js delete mode 100644 examples/file-and-s3-upload/remix.env.d.ts delete mode 100644 examples/file-and-s3-upload/sandbox.config.json delete mode 100644 examples/file-and-s3-upload/tsconfig.json delete mode 100644 examples/firebase-auth-firestore/.env.example delete mode 100644 examples/firebase-auth-firestore/.eslintrc.js delete mode 100644 examples/firebase-auth-firestore/.gitignore delete mode 100644 examples/firebase-auth-firestore/README.md delete mode 100644 examples/firebase-auth-firestore/app/entry.client.tsx delete mode 100644 examples/firebase-auth-firestore/app/entry.server.tsx delete mode 100644 examples/firebase-auth-firestore/app/firebase-rest.ts delete mode 100644 examples/firebase-auth-firestore/app/root.tsx delete mode 100644 examples/firebase-auth-firestore/app/routes/index.tsx delete mode 100644 examples/firebase-auth-firestore/app/routes/join.tsx delete mode 100644 examples/firebase-auth-firestore/app/routes/login.tsx delete mode 100644 examples/firebase-auth-firestore/app/routes/logout.tsx delete mode 100644 examples/firebase-auth-firestore/app/server/auth.server.ts delete mode 100644 examples/firebase-auth-firestore/app/server/db.server.ts delete mode 100644 examples/firebase-auth-firestore/app/server/firebase.server.ts delete mode 100644 examples/firebase-auth-firestore/app/sessions.ts delete mode 100644 examples/firebase-auth-firestore/firebase-fixtures/auth/accounts.json delete mode 100644 examples/firebase-auth-firestore/firebase-fixtures/auth/config.json delete mode 100644 examples/firebase-auth-firestore/firebase-fixtures/firebase-export-metadata.json delete mode 100644 examples/firebase-auth-firestore/firebase-fixtures/firestore.rules delete mode 100644 examples/firebase-auth-firestore/firebase.json delete mode 100644 examples/firebase-auth-firestore/package.json delete mode 100644 examples/firebase-auth-firestore/public/favicon.ico delete mode 100644 examples/firebase-auth-firestore/remix.config.js delete mode 100644 examples/firebase-auth-firestore/remix.env.d.ts delete mode 100644 examples/firebase-auth-firestore/sandbox.config.json delete mode 100644 examples/firebase-auth-firestore/screen_recording.gif delete mode 100644 examples/firebase-auth-firestore/tsconfig.json delete mode 100644 examples/form-to-notion-db/.env.example delete mode 100644 examples/form-to-notion-db/.eslintrc.js delete mode 100644 examples/form-to-notion-db/.gitignore delete mode 100644 examples/form-to-notion-db/README.md delete mode 100644 examples/form-to-notion-db/app/entry.client.tsx delete mode 100644 examples/form-to-notion-db/app/entry.server.tsx delete mode 100644 examples/form-to-notion-db/app/notion.server.tsx delete mode 100644 examples/form-to-notion-db/app/root.tsx delete mode 100644 examples/form-to-notion-db/package.json delete mode 100644 examples/form-to-notion-db/public/favicon.ico delete mode 100644 examples/form-to-notion-db/remix.config.js delete mode 100644 examples/form-to-notion-db/remix.env.d.ts delete mode 100644 examples/form-to-notion-db/sandbox.config.json delete mode 100644 examples/form-to-notion-db/tsconfig.json delete mode 100644 examples/framer-motion/.eslintrc.js delete mode 100644 examples/framer-motion/.gitignore delete mode 100644 examples/framer-motion/README.md delete mode 100644 examples/framer-motion/app/entry.client.tsx delete mode 100644 examples/framer-motion/app/entry.server.tsx delete mode 100644 examples/framer-motion/app/root.tsx delete mode 100644 examples/framer-motion/app/routes/index.tsx delete mode 100644 examples/framer-motion/package.json delete mode 100644 examples/framer-motion/public/favicon.ico delete mode 100644 examples/framer-motion/remix.config.js delete mode 100644 examples/framer-motion/sandbox.config.json delete mode 100644 examples/framer-motion/tsconfig.json delete mode 100644 examples/framer-route-animation/.eslintrc.js delete mode 100644 examples/framer-route-animation/.gitignore delete mode 100644 examples/framer-route-animation/README.md delete mode 100644 examples/framer-route-animation/app/entry.client.tsx delete mode 100644 examples/framer-route-animation/app/entry.server.tsx delete mode 100644 examples/framer-route-animation/app/root.tsx delete mode 100644 examples/framer-route-animation/app/routes/about.tsx delete mode 100644 examples/framer-route-animation/app/routes/blogs.tsx delete mode 100644 examples/framer-route-animation/app/routes/index.tsx delete mode 100644 examples/framer-route-animation/package.json delete mode 100644 examples/framer-route-animation/public/favicon.ico delete mode 100644 examples/framer-route-animation/remix.config.js delete mode 100644 examples/framer-route-animation/remix.env.d.ts delete mode 100644 examples/framer-route-animation/sandbox.config.json delete mode 100644 examples/framer-route-animation/tsconfig.json delete mode 100644 examples/gdpr-cookie-consent/.eslintrc.js delete mode 100644 examples/gdpr-cookie-consent/.gitignore delete mode 100644 examples/gdpr-cookie-consent/README.md delete mode 100644 examples/gdpr-cookie-consent/app/cookies.ts delete mode 100644 examples/gdpr-cookie-consent/app/entry.client.tsx delete mode 100644 examples/gdpr-cookie-consent/app/entry.server.tsx delete mode 100644 examples/gdpr-cookie-consent/app/root.tsx delete mode 100644 examples/gdpr-cookie-consent/app/routes/enable-analytics.tsx delete mode 100644 examples/gdpr-cookie-consent/app/routes/index.tsx delete mode 100644 examples/gdpr-cookie-consent/package.json delete mode 100644 examples/gdpr-cookie-consent/public/dummy-analytics-script.js delete mode 100644 examples/gdpr-cookie-consent/public/favicon.ico delete mode 100644 examples/gdpr-cookie-consent/remix.config.js delete mode 100644 examples/gdpr-cookie-consent/remix.env.d.ts delete mode 100644 examples/gdpr-cookie-consent/sandbox.config.json delete mode 100644 examples/gdpr-cookie-consent/tsconfig.json delete mode 100644 examples/google-analytics/.env.example delete mode 100644 examples/google-analytics/.eslintrc.js delete mode 100644 examples/google-analytics/.gitignore delete mode 100644 examples/google-analytics/README.md delete mode 100644 examples/google-analytics/app/entry.client.tsx delete mode 100644 examples/google-analytics/app/entry.server.tsx delete mode 100644 examples/google-analytics/app/root.tsx delete mode 100644 examples/google-analytics/app/routes/contact.tsx delete mode 100644 examples/google-analytics/app/routes/dashboard.tsx delete mode 100644 examples/google-analytics/app/routes/index.tsx delete mode 100644 examples/google-analytics/app/routes/profile.tsx delete mode 100644 examples/google-analytics/app/utils/gtags.client.ts delete mode 100644 examples/google-analytics/package.json delete mode 100644 examples/google-analytics/public/favicon.ico delete mode 100644 examples/google-analytics/remix.config.js delete mode 100644 examples/google-analytics/remix.env.d.ts delete mode 100644 examples/google-analytics/tsconfig.json delete mode 100644 examples/graphql-api/.env.example delete mode 100644 examples/graphql-api/.eslintrc.js delete mode 100644 examples/graphql-api/.gitignore delete mode 100644 examples/graphql-api/README.md delete mode 100644 examples/graphql-api/app/components/Code.tsx delete mode 100644 examples/graphql-api/app/entry.client.tsx delete mode 100644 examples/graphql-api/app/entry.server.tsx delete mode 100644 examples/graphql-api/app/root.tsx delete mode 100644 examples/graphql-api/app/routes/api/character.tsx delete mode 100644 examples/graphql-api/app/routes/api/characters.tsx delete mode 100644 examples/graphql-api/app/routes/character/$id.tsx delete mode 100644 examples/graphql-api/app/routes/character/error.tsx delete mode 100644 examples/graphql-api/app/routes/index.tsx delete mode 100644 examples/graphql-api/app/utils/index.ts delete mode 100644 examples/graphql-api/codegen.yml delete mode 100644 examples/graphql-api/package.json delete mode 100644 examples/graphql-api/public/favicon.ico delete mode 100644 examples/graphql-api/remix.config.js delete mode 100644 examples/graphql-api/remix.env.d.ts delete mode 100644 examples/graphql-api/sandbox.config.json delete mode 100644 examples/graphql-api/tsconfig.json delete mode 100644 examples/image-resize/.eslintrc.js delete mode 100644 examples/image-resize/.gitignore delete mode 100644 examples/image-resize/README.md delete mode 100644 examples/image-resize/app/components/image.tsx delete mode 100644 examples/image-resize/app/entry.client.tsx delete mode 100644 examples/image-resize/app/entry.server.tsx delete mode 100644 examples/image-resize/app/root.tsx delete mode 100644 examples/image-resize/app/routes/assets/resize/$.ts delete mode 100644 examples/image-resize/app/routes/index.tsx delete mode 100644 examples/image-resize/assets/dog-1.jpg delete mode 100644 examples/image-resize/assets/other-dogs/dog-2.jpg delete mode 100644 examples/image-resize/package.json delete mode 100644 examples/image-resize/public/favicon.ico delete mode 100644 examples/image-resize/remix.config.js delete mode 100644 examples/image-resize/remix.env.d.ts delete mode 100644 examples/image-resize/sandbox.config.json delete mode 100644 examples/image-resize/tsconfig.json delete mode 100644 examples/infinite-scrolling/.eslintrc.js delete mode 100644 examples/infinite-scrolling/.gitignore delete mode 100644 examples/infinite-scrolling/README.md delete mode 100644 examples/infinite-scrolling/app/entry.client.tsx delete mode 100644 examples/infinite-scrolling/app/entry.server.tsx delete mode 100644 examples/infinite-scrolling/app/root.tsx delete mode 100644 examples/infinite-scrolling/app/routes/index.tsx delete mode 100644 examples/infinite-scrolling/app/routes/offset/advanced.tsx delete mode 100644 examples/infinite-scrolling/app/routes/offset/simple.tsx delete mode 100644 examples/infinite-scrolling/app/routes/page/advanced.tsx delete mode 100644 examples/infinite-scrolling/app/routes/page/alternative.tsx delete mode 100644 examples/infinite-scrolling/app/routes/page/simple.tsx delete mode 100644 examples/infinite-scrolling/app/styles/index.css delete mode 100644 examples/infinite-scrolling/app/utils/backend.server.ts delete mode 100644 examples/infinite-scrolling/package.json delete mode 100644 examples/infinite-scrolling/public/favicon.ico delete mode 100644 examples/infinite-scrolling/remix.config.js delete mode 100644 examples/infinite-scrolling/remix.env.d.ts delete mode 100644 examples/infinite-scrolling/tsconfig.json delete mode 100644 examples/io-ts-formdata-decoding/.eslintrc.js delete mode 100644 examples/io-ts-formdata-decoding/.gitignore delete mode 100644 examples/io-ts-formdata-decoding/README.md delete mode 100644 examples/io-ts-formdata-decoding/app/entry.client.tsx delete mode 100644 examples/io-ts-formdata-decoding/app/entry.server.tsx delete mode 100644 examples/io-ts-formdata-decoding/app/formData.ts delete mode 100644 examples/io-ts-formdata-decoding/app/root.tsx delete mode 100644 examples/io-ts-formdata-decoding/app/routes/index.tsx delete mode 100644 examples/io-ts-formdata-decoding/package.json delete mode 100644 examples/io-ts-formdata-decoding/public/favicon.ico delete mode 100644 examples/io-ts-formdata-decoding/remix.config.js delete mode 100644 examples/io-ts-formdata-decoding/remix.env.d.ts delete mode 100644 examples/io-ts-formdata-decoding/sandbox.config.json delete mode 100644 examples/io-ts-formdata-decoding/tsconfig.json delete mode 100644 examples/ioredis/.env.example delete mode 100644 examples/ioredis/.eslintrc.js delete mode 100644 examples/ioredis/.gitignore delete mode 100644 examples/ioredis/README.md delete mode 100644 examples/ioredis/app/entry.client.tsx delete mode 100644 examples/ioredis/app/entry.server.tsx delete mode 100644 examples/ioredis/app/root.tsx delete mode 100644 examples/ioredis/app/routes/index.tsx delete mode 100644 examples/ioredis/app/utils/redis.server.ts delete mode 100644 examples/ioredis/package.json delete mode 100644 examples/ioredis/public/favicon.ico delete mode 100644 examples/ioredis/remix.config.js delete mode 100644 examples/ioredis/remix.env.d.ts delete mode 100644 examples/ioredis/sandbox.config.json delete mode 100644 examples/ioredis/tsconfig.json delete mode 100644 examples/jokes/.dockerignore delete mode 100644 examples/jokes/.env.example delete mode 100644 examples/jokes/.eslintrc.js delete mode 100644 examples/jokes/.gitignore delete mode 100644 examples/jokes/.prettierrc delete mode 100644 examples/jokes/Dockerfile delete mode 100644 examples/jokes/README.md delete mode 100644 examples/jokes/app/components/joke.tsx delete mode 100644 examples/jokes/app/entry.client.tsx delete mode 100644 examples/jokes/app/entry.server.tsx delete mode 100644 examples/jokes/app/root.tsx delete mode 100644 examples/jokes/app/routes/index.tsx delete mode 100644 examples/jokes/app/routes/jokes.tsx delete mode 100644 examples/jokes/app/routes/jokes/$jokeId.tsx delete mode 100644 examples/jokes/app/routes/jokes/index.tsx delete mode 100644 examples/jokes/app/routes/jokes/new.tsx delete mode 100644 examples/jokes/app/routes/jokes[.]rss.tsx delete mode 100644 examples/jokes/app/routes/login.tsx delete mode 100644 examples/jokes/app/routes/logout.tsx delete mode 100644 examples/jokes/app/styles/global-large.css delete mode 100644 examples/jokes/app/styles/global-medium.css delete mode 100644 examples/jokes/app/styles/global.css delete mode 100644 examples/jokes/app/styles/index.css delete mode 100644 examples/jokes/app/styles/jokes.css delete mode 100644 examples/jokes/app/styles/login.css delete mode 100644 examples/jokes/app/utils/db.server.ts delete mode 100644 examples/jokes/app/utils/session.server.ts delete mode 100644 examples/jokes/fly.toml delete mode 100644 examples/jokes/package.json delete mode 100644 examples/jokes/prisma/migrations/20211117212928_init/migration.sql delete mode 100644 examples/jokes/prisma/migrations/migration_lock.toml delete mode 100644 examples/jokes/prisma/schema.prisma delete mode 100644 examples/jokes/prisma/seed.ts delete mode 100644 examples/jokes/public/favicon.ico delete mode 100644 examples/jokes/public/fonts/baloo/SIL Open Font License.txt delete mode 100644 examples/jokes/public/fonts/baloo/baloo.woff delete mode 100644 examples/jokes/public/social.png delete mode 100644 examples/jokes/remix.config.js delete mode 100644 examples/jokes/remix.env.d.ts delete mode 100644 examples/jokes/sandbox.config.json delete mode 100644 examples/jokes/start_with_migrations.sh delete mode 100644 examples/jokes/tsconfig.json delete mode 100644 examples/mantine/.eslintrc.js delete mode 100644 examples/mantine/.gitignore delete mode 100644 examples/mantine/README.md delete mode 100644 examples/mantine/app/entry.client.tsx delete mode 100644 examples/mantine/app/entry.server.tsx delete mode 100644 examples/mantine/app/root.tsx delete mode 100644 examples/mantine/app/routes/index.tsx delete mode 100644 examples/mantine/package.json delete mode 100644 examples/mantine/public/favicon.ico delete mode 100644 examples/mantine/remix.config.js delete mode 100644 examples/mantine/remix.env.d.ts delete mode 100644 examples/mantine/sandbox.config.json delete mode 100644 examples/mantine/tsconfig.json delete mode 100644 examples/msw/.eslintrc.js delete mode 100644 examples/msw/.gitignore delete mode 100644 examples/msw/README.md delete mode 100644 examples/msw/app/entry.client.tsx delete mode 100644 examples/msw/app/entry.server.tsx delete mode 100644 examples/msw/app/root.tsx delete mode 100644 examples/msw/mocks/handlers.js delete mode 100644 examples/msw/mocks/index.js delete mode 100644 examples/msw/package.json delete mode 100644 examples/msw/public/favicon.ico delete mode 100644 examples/msw/remix.config.js delete mode 100644 examples/msw/remix.env.d.ts delete mode 100644 examples/msw/sandbox.config.json delete mode 100644 examples/msw/tsconfig.json delete mode 100644 examples/multiple-forms/.eslintrc.js delete mode 100644 examples/multiple-forms/.gitignore delete mode 100644 examples/multiple-forms/README.md delete mode 100644 examples/multiple-forms/app/data.server.ts delete mode 100644 examples/multiple-forms/app/entry.client.tsx delete mode 100644 examples/multiple-forms/app/entry.server.tsx delete mode 100644 examples/multiple-forms/app/root.tsx delete mode 100644 examples/multiple-forms/app/routes/index.tsx delete mode 100644 examples/multiple-forms/app/routes/invitations.tsx delete mode 100644 examples/multiple-forms/data.json delete mode 100644 examples/multiple-forms/package.json delete mode 100644 examples/multiple-forms/public/favicon.ico delete mode 100644 examples/multiple-forms/remix.config.js delete mode 100644 examples/multiple-forms/remix.env.d.ts delete mode 100644 examples/multiple-forms/sandbox.config.json delete mode 100644 examples/multiple-forms/tsconfig.json delete mode 100644 examples/multiple-params/.eslintrc.js delete mode 100644 examples/multiple-params/.gitignore delete mode 100644 examples/multiple-params/README.md delete mode 100644 examples/multiple-params/app/db.ts delete mode 100644 examples/multiple-params/app/entry.client.tsx delete mode 100644 examples/multiple-params/app/entry.server.tsx delete mode 100644 examples/multiple-params/app/root.tsx delete mode 100644 examples/multiple-params/app/routes/clients.tsx delete mode 100644 examples/multiple-params/app/routes/clients/$clientId.tsx delete mode 100644 examples/multiple-params/app/routes/clients/$clientId/index.tsx delete mode 100644 examples/multiple-params/app/routes/clients/$clientId/invoices.tsx delete mode 100644 examples/multiple-params/app/routes/clients/$clientId/invoices/$invoiceId.tsx delete mode 100644 examples/multiple-params/app/routes/clients/$clientId/invoices/index.tsx delete mode 100644 examples/multiple-params/app/routes/clients/index.tsx delete mode 100644 examples/multiple-params/app/routes/index.tsx delete mode 100644 examples/multiple-params/package.json delete mode 100644 examples/multiple-params/public/favicon.ico delete mode 100644 examples/multiple-params/remix.config.js delete mode 100644 examples/multiple-params/remix.env.d.ts delete mode 100644 examples/multiple-params/sandbox.config.json delete mode 100644 examples/multiple-params/tsconfig.json delete mode 100644 examples/newsletter-signup/.eslintrc.js delete mode 100644 examples/newsletter-signup/.gitignore delete mode 100644 examples/newsletter-signup/README.md delete mode 100644 examples/newsletter-signup/app/entry.client.tsx delete mode 100644 examples/newsletter-signup/app/entry.server.tsx delete mode 100644 examples/newsletter-signup/app/root.tsx delete mode 100644 examples/newsletter-signup/app/routes/index.tsx delete mode 100644 examples/newsletter-signup/app/routes/newsletter.tsx delete mode 100644 examples/newsletter-signup/app/styles.css delete mode 100644 examples/newsletter-signup/package.json delete mode 100644 examples/newsletter-signup/public/bg.svg delete mode 100644 examples/newsletter-signup/public/favicon.ico delete mode 100644 examples/newsletter-signup/remix.config.js delete mode 100644 examples/newsletter-signup/remix.env.d.ts delete mode 100644 examples/newsletter-signup/sandbox.config.json delete mode 100644 examples/newsletter-signup/tsconfig.json delete mode 100644 examples/nprogress/.eslintrc.js delete mode 100644 examples/nprogress/.gitignore delete mode 100644 examples/nprogress/README.md delete mode 100644 examples/nprogress/app/entry.client.tsx delete mode 100644 examples/nprogress/app/entry.server.tsx delete mode 100644 examples/nprogress/app/root.tsx delete mode 100644 examples/nprogress/app/routes/index.tsx delete mode 100644 examples/nprogress/app/routes/slow-page.tsx delete mode 100644 examples/nprogress/package.json delete mode 100644 examples/nprogress/public/favicon.ico delete mode 100644 examples/nprogress/remix.config.js delete mode 100644 examples/nprogress/remix.env.d.ts delete mode 100644 examples/nprogress/sandbox.config.json delete mode 100644 examples/nprogress/tsconfig.json delete mode 100644 examples/on-demand-hydration/.eslintrc.js delete mode 100644 examples/on-demand-hydration/.gitignore delete mode 100644 examples/on-demand-hydration/README.md delete mode 100644 examples/on-demand-hydration/app/entry.client.tsx delete mode 100644 examples/on-demand-hydration/app/entry.server.tsx delete mode 100644 examples/on-demand-hydration/app/root.tsx delete mode 100644 examples/on-demand-hydration/app/routes/index.tsx delete mode 100644 examples/on-demand-hydration/app/routes/on-demand-js.tsx delete mode 100644 examples/on-demand-hydration/app/routes/with-js.tsx delete mode 100644 examples/on-demand-hydration/app/routes/without-js.tsx delete mode 100644 examples/on-demand-hydration/package.json delete mode 100644 examples/on-demand-hydration/public/favicon.ico delete mode 100644 examples/on-demand-hydration/remix.config.js delete mode 100644 examples/on-demand-hydration/remix.env.d.ts delete mode 100644 examples/on-demand-hydration/sandbox.config.json delete mode 100644 examples/on-demand-hydration/tsconfig.json delete mode 100644 examples/outlet-form-rerender/.eslintrc.js delete mode 100644 examples/outlet-form-rerender/.gitignore delete mode 100644 examples/outlet-form-rerender/README.md delete mode 100644 examples/outlet-form-rerender/app/data.server.ts delete mode 100644 examples/outlet-form-rerender/app/entry.client.tsx delete mode 100644 examples/outlet-form-rerender/app/entry.server.tsx delete mode 100644 examples/outlet-form-rerender/app/root.tsx delete mode 100644 examples/outlet-form-rerender/app/routes/index.tsx delete mode 100644 examples/outlet-form-rerender/app/routes/users.tsx delete mode 100644 examples/outlet-form-rerender/app/routes/users/$userId.tsx delete mode 100644 examples/outlet-form-rerender/package.json delete mode 100644 examples/outlet-form-rerender/public/favicon.ico delete mode 100644 examples/outlet-form-rerender/remix.config.js delete mode 100644 examples/outlet-form-rerender/remix.env.d.ts delete mode 100644 examples/outlet-form-rerender/sandbox.config.json delete mode 100644 examples/outlet-form-rerender/tsconfig.json delete mode 100644 examples/pathless-routes/.eslintrc.js delete mode 100644 examples/pathless-routes/.gitignore delete mode 100644 examples/pathless-routes/README.md delete mode 100644 examples/pathless-routes/app/entry.client.tsx delete mode 100644 examples/pathless-routes/app/entry.server.tsx delete mode 100644 examples/pathless-routes/app/root.tsx delete mode 100644 examples/pathless-routes/app/routes/articles.tsx delete mode 100644 examples/pathless-routes/app/routes/articles/__layout.tsx delete mode 100644 examples/pathless-routes/app/routes/articles/__layout/hello.md delete mode 100644 examples/pathless-routes/app/routes/index.tsx delete mode 100644 examples/pathless-routes/package.json delete mode 100644 examples/pathless-routes/public/favicon.ico delete mode 100644 examples/pathless-routes/remix.config.js delete mode 100644 examples/pathless-routes/remix.env.d.ts delete mode 100644 examples/pathless-routes/sandbox.config.json delete mode 100644 examples/pathless-routes/tsconfig.json delete mode 100644 examples/pm-app/.env.example delete mode 100644 examples/pm-app/.eslintrc.js delete mode 100644 examples/pm-app/.gitignore delete mode 100644 examples/pm-app/.nvmrc delete mode 100644 examples/pm-app/README.md delete mode 100644 examples/pm-app/app/auth.server.ts delete mode 100644 examples/pm-app/app/db.server.tsx delete mode 100644 examples/pm-app/app/entry.client.tsx delete mode 100644 examples/pm-app/app/entry.server.tsx delete mode 100644 examples/pm-app/app/models.ts delete mode 100644 examples/pm-app/app/root.tsx delete mode 100644 examples/pm-app/app/routes/dashboard.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/index.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/projects/$projectId.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/projects/$projectId/delete.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/projects/$projectId/list/$listId.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/projects/new.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todo-lists/$listId/delete.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todo-lists/$listId/index.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todo-lists/index.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todo-lists/new.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/$todoId/delete.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/$todoId/edit.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/$todoId/index.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/$todoId/set.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/index.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/new.tsx delete mode 100644 examples/pm-app/app/routes/dashboard/todos/toggle.tsx delete mode 100644 examples/pm-app/app/routes/index.tsx delete mode 100644 examples/pm-app/app/routes/register.tsx delete mode 100644 examples/pm-app/app/routes/sign-in.tsx delete mode 100644 examples/pm-app/app/routes/sign-out.tsx delete mode 100644 examples/pm-app/app/session.server.ts delete mode 100644 examples/pm-app/app/styles/_defs.css delete mode 100644 examples/pm-app/app/styles/_normalize.css delete mode 100644 examples/pm-app/app/styles/_resets.css delete mode 100644 examples/pm-app/app/styles/_root.css delete mode 100644 examples/pm-app/app/styles/_utils.css delete mode 100644 examples/pm-app/app/styles/global.css delete mode 100644 examples/pm-app/app/styles/routes/dashboard.css delete mode 100644 examples/pm-app/app/styles/routes/dashboard/index.css delete mode 100644 examples/pm-app/app/styles/routes/dashboard/projects/$projectId/index.css delete mode 100644 examples/pm-app/app/styles/routes/dashboard/projects/new.css delete mode 100644 examples/pm-app/app/styles/routes/dashboard/todo-lists/$listId/index.css delete mode 100644 examples/pm-app/app/styles/routes/dashboard/todo-lists/new.css delete mode 100644 examples/pm-app/app/styles/routes/index.css delete mode 100644 examples/pm-app/app/styles/routes/register.css delete mode 100644 examples/pm-app/app/styles/routes/sign-in.css delete mode 100644 examples/pm-app/app/styles/ui/_avatar.css delete mode 100644 examples/pm-app/app/styles/ui/_button.css delete mode 100644 examples/pm-app/app/styles/ui/_combobox.css delete mode 100644 examples/pm-app/app/styles/ui/_dialog.css delete mode 100644 examples/pm-app/app/styles/ui/_dropdown-menu.css delete mode 100644 examples/pm-app/app/styles/ui/_flex.css delete mode 100644 examples/pm-app/app/styles/ui/_form.css delete mode 100644 examples/pm-app/app/styles/ui/_max-container.css delete mode 100644 examples/pm-app/app/styles/ui/_member-search.css delete mode 100644 examples/pm-app/app/styles/ui/_menu-button.css delete mode 100644 examples/pm-app/app/styles/ui/_note.css delete mode 100644 examples/pm-app/app/styles/ui/_shadow-box.css delete mode 100644 examples/pm-app/app/styles/ui/_stack.css delete mode 100644 examples/pm-app/app/styles/ui/_todo-list.css delete mode 100644 examples/pm-app/app/styles/ui/_token.css delete mode 100644 examples/pm-app/app/ui/auth-header.tsx delete mode 100644 examples/pm-app/app/ui/avatar.tsx delete mode 100644 examples/pm-app/app/ui/button.tsx delete mode 100644 examples/pm-app/app/ui/combobox.tsx delete mode 100644 examples/pm-app/app/ui/dialog.tsx delete mode 100644 examples/pm-app/app/ui/dropdown-menu.tsx delete mode 100644 examples/pm-app/app/ui/flex.tsx delete mode 100644 examples/pm-app/app/ui/form.tsx delete mode 100644 examples/pm-app/app/ui/icon-box.tsx delete mode 100644 examples/pm-app/app/ui/icons.tsx delete mode 100644 examples/pm-app/app/ui/link.tsx delete mode 100644 examples/pm-app/app/ui/max-container.tsx delete mode 100644 examples/pm-app/app/ui/member-search.tsx delete mode 100644 examples/pm-app/app/ui/note.tsx delete mode 100644 examples/pm-app/app/ui/section-heading.tsx delete mode 100644 examples/pm-app/app/ui/shadow-box.tsx delete mode 100644 examples/pm-app/app/ui/stack.tsx delete mode 100644 examples/pm-app/app/ui/todo-list.tsx delete mode 100644 examples/pm-app/app/ui/token.tsx delete mode 100644 examples/pm-app/app/utils/index.ts delete mode 100644 examples/pm-app/app/utils/react.tsx delete mode 100644 examples/pm-app/app/utils/sanitizer.ts delete mode 100644 examples/pm-app/app/utils/types.ts delete mode 100644 examples/pm-app/app/utils/validation.ts delete mode 100644 examples/pm-app/docker-compose.example.yml delete mode 100644 examples/pm-app/package.json delete mode 100644 examples/pm-app/pm2.config.js delete mode 100644 examples/pm-app/postcss.config.js delete mode 100644 examples/pm-app/prisma/migrations/20211207143433_/migration.sql delete mode 100644 examples/pm-app/prisma/migrations/20211207153717_/migration.sql delete mode 100644 examples/pm-app/prisma/migrations/20211207231727_/migration.sql delete mode 100644 examples/pm-app/prisma/migrations/20211208222216_/migration.sql delete mode 100644 examples/pm-app/prisma/migrations/migration_lock.toml delete mode 100644 examples/pm-app/prisma/schema.prisma delete mode 100644 examples/pm-app/public/favicon.ico delete mode 100644 examples/pm-app/remix.config.js delete mode 100644 examples/pm-app/remix.env.d.ts delete mode 100644 examples/pm-app/sandbox.config.json delete mode 100644 examples/pm-app/server/index.js delete mode 100644 examples/pm-app/server/tsconfig.json delete mode 100644 examples/pm-app/server/utils.js delete mode 100644 examples/pm-app/tsconfig.json delete mode 100644 examples/pm-app/typings/global.d.ts delete mode 100644 examples/quirrel/.eslintrc.js delete mode 100644 examples/quirrel/.gitignore delete mode 100644 examples/quirrel/README.md delete mode 100644 examples/quirrel/app/entry.client.tsx delete mode 100644 examples/quirrel/app/entry.server.tsx delete mode 100644 examples/quirrel/app/queues/greetings.server.ts delete mode 100644 examples/quirrel/app/root.tsx delete mode 100644 examples/quirrel/app/routes/index.tsx delete mode 100644 examples/quirrel/app/routes/queues/greetings.ts delete mode 100644 examples/quirrel/package.json delete mode 100644 examples/quirrel/public/favicon.ico delete mode 100644 examples/quirrel/remix.config.js delete mode 100644 examples/quirrel/remix.env.d.ts delete mode 100644 examples/quirrel/sandbox.config.json delete mode 100644 examples/quirrel/tsconfig.json delete mode 100644 examples/react-spring/.eslintrc.js delete mode 100644 examples/react-spring/.gitignore delete mode 100644 examples/react-spring/README.md delete mode 100644 examples/react-spring/app/entry.client.tsx delete mode 100644 examples/react-spring/app/entry.server.tsx delete mode 100644 examples/react-spring/app/no-script.css delete mode 100644 examples/react-spring/app/root.tsx delete mode 100644 examples/react-spring/app/routes/index.tsx delete mode 100644 examples/react-spring/app/styles.css delete mode 100644 examples/react-spring/package.json delete mode 100644 examples/react-spring/public/favicon.ico delete mode 100644 examples/react-spring/remix.config.js delete mode 100644 examples/react-spring/remix.env.d.ts delete mode 100644 examples/react-spring/sandbox.config.json delete mode 100644 examples/react-spring/tsconfig.json delete mode 100644 examples/redis-upstash-session/.env.example delete mode 100644 examples/redis-upstash-session/.eslintrc.js delete mode 100644 examples/redis-upstash-session/.gitignore delete mode 100644 examples/redis-upstash-session/README.md delete mode 100644 examples/redis-upstash-session/app/entry.client.tsx delete mode 100644 examples/redis-upstash-session/app/entry.server.tsx delete mode 100644 examples/redis-upstash-session/app/root.tsx delete mode 100644 examples/redis-upstash-session/app/routes/index.tsx delete mode 100644 examples/redis-upstash-session/app/sessions.server.ts delete mode 100644 examples/redis-upstash-session/app/sessions/upstash.server.ts delete mode 100644 examples/redis-upstash-session/package.json delete mode 100644 examples/redis-upstash-session/public/favicon.ico delete mode 100644 examples/redis-upstash-session/remix.config.js delete mode 100644 examples/redis-upstash-session/remix.env.d.ts delete mode 100644 examples/redis-upstash-session/sandbox.config.json delete mode 100644 examples/redis-upstash-session/tsconfig.json delete mode 100644 examples/remix-auth-auth0/.env.example delete mode 100644 examples/remix-auth-auth0/.eslintrc.js delete mode 100644 examples/remix-auth-auth0/.gitignore delete mode 100644 examples/remix-auth-auth0/README.md delete mode 100644 examples/remix-auth-auth0/app/constants/index.server.ts delete mode 100644 examples/remix-auth-auth0/app/entry.client.tsx delete mode 100644 examples/remix-auth-auth0/app/entry.server.tsx delete mode 100644 examples/remix-auth-auth0/app/root.tsx delete mode 100644 examples/remix-auth-auth0/app/routes/auth0.tsx delete mode 100644 examples/remix-auth-auth0/app/routes/callback.tsx delete mode 100644 examples/remix-auth-auth0/app/routes/index.tsx delete mode 100644 examples/remix-auth-auth0/app/routes/logout.tsx delete mode 100644 examples/remix-auth-auth0/app/routes/private.tsx delete mode 100644 examples/remix-auth-auth0/app/utils/auth.server.ts delete mode 100644 examples/remix-auth-auth0/package.json delete mode 100644 examples/remix-auth-auth0/public/favicon.ico delete mode 100644 examples/remix-auth-auth0/remix.config.js delete mode 100644 examples/remix-auth-auth0/remix.env.d.ts delete mode 100644 examples/remix-auth-auth0/sandbox.config.json delete mode 100644 examples/remix-auth-auth0/tsconfig.json delete mode 100644 examples/remix-auth-form/.eslintrc.js delete mode 100644 examples/remix-auth-form/.gitignore delete mode 100644 examples/remix-auth-form/README.md delete mode 100644 examples/remix-auth-form/app/auth.server.ts delete mode 100644 examples/remix-auth-form/app/entry.client.tsx delete mode 100644 examples/remix-auth-form/app/entry.server.tsx delete mode 100644 examples/remix-auth-form/app/root.tsx delete mode 100644 examples/remix-auth-form/app/routes/login.tsx delete mode 100644 examples/remix-auth-form/app/routes/private.tsx delete mode 100644 examples/remix-auth-form/package.json delete mode 100644 examples/remix-auth-form/public/favicon.ico delete mode 100644 examples/remix-auth-form/remix.config.js delete mode 100644 examples/remix-auth-form/remix.env.d.ts delete mode 100644 examples/remix-auth-form/sandbox.config.json delete mode 100644 examples/remix-auth-form/tsconfig.json delete mode 100644 examples/remix-auth-github/.env.example delete mode 100644 examples/remix-auth-github/.eslintrc.js delete mode 100644 examples/remix-auth-github/.gitignore delete mode 100644 examples/remix-auth-github/README.md delete mode 100644 examples/remix-auth-github/app/auth.server.ts delete mode 100644 examples/remix-auth-github/app/entry.client.tsx delete mode 100644 examples/remix-auth-github/app/entry.server.tsx delete mode 100644 examples/remix-auth-github/app/root.tsx delete mode 100644 examples/remix-auth-github/app/routes/auth.github.callback.tsx delete mode 100644 examples/remix-auth-github/app/routes/auth.github.tsx delete mode 100644 examples/remix-auth-github/app/routes/index.tsx delete mode 100644 examples/remix-auth-github/app/routes/private.tsx delete mode 100644 examples/remix-auth-github/package.json delete mode 100644 examples/remix-auth-github/public/favicon.ico delete mode 100644 examples/remix-auth-github/remix.config.js delete mode 100644 examples/remix-auth-github/remix.env.d.ts delete mode 100644 examples/remix-auth-github/sandbox.config.json delete mode 100644 examples/remix-auth-github/tsconfig.json delete mode 100644 examples/remix-auth-supabase-github/.env.example delete mode 100644 examples/remix-auth-supabase-github/.eslintrc.js delete mode 100644 examples/remix-auth-supabase-github/.gitignore delete mode 100644 examples/remix-auth-supabase-github/README.md delete mode 100644 examples/remix-auth-supabase-github/app/auth.server.ts delete mode 100644 examples/remix-auth-supabase-github/app/entry.client.tsx delete mode 100644 examples/remix-auth-supabase-github/app/entry.server.tsx delete mode 100644 examples/remix-auth-supabase-github/app/root.tsx delete mode 100644 examples/remix-auth-supabase-github/app/routes/index.tsx delete mode 100644 examples/remix-auth-supabase-github/app/routes/login.tsx delete mode 100644 examples/remix-auth-supabase-github/app/routes/oauth.callback.tsx delete mode 100644 examples/remix-auth-supabase-github/app/routes/private.tsx delete mode 100644 examples/remix-auth-supabase-github/app/supabase.client.ts delete mode 100644 examples/remix-auth-supabase-github/app/supabase.server.ts delete mode 100644 examples/remix-auth-supabase-github/package.json delete mode 100644 examples/remix-auth-supabase-github/public/favicon.ico delete mode 100644 examples/remix-auth-supabase-github/remix.config.js delete mode 100644 examples/remix-auth-supabase-github/remix.env.d.ts delete mode 100644 examples/remix-auth-supabase-github/sandbox.config.json delete mode 100644 examples/remix-auth-supabase-github/tsconfig.json delete mode 100644 examples/remix-auth-supabase/.env.example delete mode 100644 examples/remix-auth-supabase/.eslintrc.js delete mode 100644 examples/remix-auth-supabase/.gitignore delete mode 100644 examples/remix-auth-supabase/README.md delete mode 100644 examples/remix-auth-supabase/app/auth.server.ts delete mode 100644 examples/remix-auth-supabase/app/entry.client.tsx delete mode 100644 examples/remix-auth-supabase/app/entry.server.tsx delete mode 100644 examples/remix-auth-supabase/app/root.tsx delete mode 100644 examples/remix-auth-supabase/app/routes/index.tsx delete mode 100644 examples/remix-auth-supabase/app/routes/login.tsx delete mode 100644 examples/remix-auth-supabase/app/routes/private.tsx delete mode 100644 examples/remix-auth-supabase/app/supabase.ts delete mode 100644 examples/remix-auth-supabase/package.json delete mode 100644 examples/remix-auth-supabase/public/favicon.ico delete mode 100644 examples/remix-auth-supabase/remix.config.js delete mode 100644 examples/remix-auth-supabase/remix.env.d.ts delete mode 100644 examples/remix-auth-supabase/sandbox.config.json delete mode 100644 examples/remix-auth-supabase/tsconfig.json delete mode 100644 examples/route-modal/.eslintrc.js delete mode 100644 examples/route-modal/.gitignore delete mode 100644 examples/route-modal/README.md delete mode 100644 examples/route-modal/app/entry.client.tsx delete mode 100644 examples/route-modal/app/entry.server.tsx delete mode 100644 examples/route-modal/app/root.tsx delete mode 100644 examples/route-modal/app/routes/invoices.tsx delete mode 100644 examples/route-modal/app/routes/invoices/$id/edit.tsx delete mode 100644 examples/route-modal/app/routes/invoices/add.tsx delete mode 100644 examples/route-modal/package.json delete mode 100644 examples/route-modal/public/favicon.ico delete mode 100644 examples/route-modal/remix.config.js delete mode 100644 examples/route-modal/remix.env.d.ts delete mode 100644 examples/route-modal/sandbox.config.json delete mode 100644 examples/route-modal/tsconfig.json delete mode 100644 examples/routes-gen/.eslintrc.js delete mode 100644 examples/routes-gen/.gitignore delete mode 100644 examples/routes-gen/README.md delete mode 100644 examples/routes-gen/app/entry.client.tsx delete mode 100644 examples/routes-gen/app/entry.server.tsx delete mode 100644 examples/routes-gen/app/root.tsx delete mode 100644 examples/routes-gen/app/routes/index.tsx delete mode 100644 examples/routes-gen/app/routes/products/$productId.tsx delete mode 100644 examples/routes-gen/app/routes/products/index.tsx delete mode 100644 examples/routes-gen/package.json delete mode 100644 examples/routes-gen/public/favicon.ico delete mode 100644 examples/routes-gen/remix.config.js delete mode 100644 examples/routes-gen/remix.env.d.ts delete mode 100644 examples/routes-gen/sandbox.config.json delete mode 100644 examples/routes-gen/tsconfig.json delete mode 100644 examples/rust/.eslintrc.js delete mode 100644 examples/rust/.gitignore delete mode 100644 examples/rust/README.md delete mode 100644 examples/rust/app/entry.client.tsx delete mode 100644 examples/rust/app/entry.server.tsx delete mode 100644 examples/rust/app/root.tsx delete mode 100644 examples/rust/app/routes/index.tsx delete mode 100644 examples/rust/app/rust.server.ts delete mode 100644 examples/rust/app/styles/global.css delete mode 100644 examples/rust/app/styles/index.css delete mode 100644 examples/rust/package.json delete mode 100644 examples/rust/public/favicon.ico delete mode 100644 examples/rust/remix.config.js delete mode 100644 examples/rust/remix.env.d.ts delete mode 100644 examples/rust/rust-functions/.gitignore delete mode 100644 examples/rust/rust-functions/Cargo.toml delete mode 100644 examples/rust/rust-functions/src/lib.rs delete mode 100644 examples/rust/sandbox.config.json delete mode 100644 examples/rust/tsconfig.json delete mode 100644 examples/sanity/.env.example delete mode 100644 examples/sanity/.eslintrc.js delete mode 100644 examples/sanity/.gitignore delete mode 100644 examples/sanity/README.md delete mode 100644 examples/sanity/app/components/Preview.tsx delete mode 100644 examples/sanity/app/components/index.ts delete mode 100644 examples/sanity/app/entry.client.tsx delete mode 100644 examples/sanity/app/entry.server.tsx delete mode 100644 examples/sanity/app/lib/sanity/config.ts delete mode 100644 examples/sanity/app/lib/sanity/filterDataToSingleItem.ts delete mode 100644 examples/sanity/app/lib/sanity/getClient.ts delete mode 100644 examples/sanity/app/lib/sanity/helpers.tsx delete mode 100644 examples/sanity/app/lib/sanity/index.ts delete mode 100644 examples/sanity/app/lib/sanity/usePreviewSubscription.ts delete mode 100644 examples/sanity/app/root.tsx delete mode 100644 examples/sanity/app/routes/$slug.tsx delete mode 100644 examples/sanity/app/routes/index.tsx delete mode 100644 examples/sanity/app/styles/global.css delete mode 100644 examples/sanity/package.json delete mode 100644 examples/sanity/public/favicon.ico delete mode 100644 examples/sanity/remix.config.js delete mode 100644 examples/sanity/remix.env.d.ts delete mode 100644 examples/sanity/sandbox.config.json delete mode 100644 examples/sanity/studio/.npmignore delete mode 100644 examples/sanity/studio/README.md delete mode 100644 examples/sanity/studio/config/.checksums delete mode 100644 examples/sanity/studio/config/@sanity/data-aspects.json delete mode 100644 examples/sanity/studio/config/@sanity/default-layout.json delete mode 100644 examples/sanity/studio/config/@sanity/default-login.json delete mode 100644 examples/sanity/studio/config/@sanity/form-builder.json delete mode 100644 examples/sanity/studio/config/@sanity/google-maps-input.json delete mode 100644 examples/sanity/studio/package.json delete mode 100644 examples/sanity/studio/plugins/.gitkeep delete mode 100644 examples/sanity/studio/sanity.json delete mode 100644 examples/sanity/studio/schemas/blockContent.js delete mode 100644 examples/sanity/studio/schemas/castMember.js delete mode 100644 examples/sanity/studio/schemas/crewMember.js delete mode 100644 examples/sanity/studio/schemas/movie.js delete mode 100644 examples/sanity/studio/schemas/person.js delete mode 100644 examples/sanity/studio/schemas/plotSummaries.js delete mode 100644 examples/sanity/studio/schemas/plotSummary.js delete mode 100644 examples/sanity/studio/schemas/schema.js delete mode 100644 examples/sanity/studio/schemas/screening.js delete mode 100644 examples/sanity/studio/static/favicon.ico delete mode 100644 examples/sanity/studio/tsconfig.json delete mode 100644 examples/sanity/tsconfig.json delete mode 100644 examples/sass/.eslintrc.js delete mode 100644 examples/sass/.gitignore delete mode 100644 examples/sass/README.md delete mode 100644 examples/sass/app/entry.client.tsx delete mode 100644 examples/sass/app/entry.server.tsx delete mode 100644 examples/sass/app/root.tsx delete mode 100644 examples/sass/package.json delete mode 100644 examples/sass/public/favicon.ico delete mode 100644 examples/sass/remix.config.js delete mode 100644 examples/sass/remix.env.d.ts delete mode 100644 examples/sass/sandbox.config.json delete mode 100644 examples/sass/styles/global.scss delete mode 100644 examples/sass/tsconfig.json delete mode 100644 examples/search-input/.eslintrc.js delete mode 100644 examples/search-input/.gitignore delete mode 100644 examples/search-input/README.md delete mode 100644 examples/search-input/app/entry.client.tsx delete mode 100644 examples/search-input/app/entry.server.tsx delete mode 100644 examples/search-input/app/root.tsx delete mode 100644 examples/search-input/app/routes/index.tsx delete mode 100644 examples/search-input/app/styles/global.css delete mode 100644 examples/search-input/app/styles/index.css delete mode 100644 examples/search-input/package.json delete mode 100644 examples/search-input/public/favicon.ico delete mode 100644 examples/search-input/remix.config.js delete mode 100644 examples/search-input/remix.env.d.ts delete mode 100644 examples/search-input/sandbox.config.json delete mode 100644 examples/search-input/tsconfig.json delete mode 100644 examples/session-flash/.eslintrc.js delete mode 100644 examples/session-flash/.gitignore delete mode 100644 examples/session-flash/README.md delete mode 100644 examples/session-flash/app/entry.client.tsx delete mode 100644 examples/session-flash/app/entry.server.tsx delete mode 100644 examples/session-flash/app/root.tsx delete mode 100644 examples/session-flash/app/routes/index.tsx delete mode 100644 examples/session-flash/app/utils/session.server.ts delete mode 100644 examples/session-flash/package.json delete mode 100644 examples/session-flash/public/favicon.ico delete mode 100644 examples/session-flash/remix.config.js delete mode 100644 examples/session-flash/remix.env.d.ts delete mode 100644 examples/session-flash/sandbox.config.json delete mode 100644 examples/session-flash/tsconfig.json delete mode 100644 examples/sharing-loader-data/.eslintrc.js delete mode 100644 examples/sharing-loader-data/.gitignore delete mode 100644 examples/sharing-loader-data/README.md delete mode 100644 examples/sharing-loader-data/app/data.server.ts delete mode 100644 examples/sharing-loader-data/app/entry.client.tsx delete mode 100644 examples/sharing-loader-data/app/entry.server.tsx delete mode 100644 examples/sharing-loader-data/app/root.tsx delete mode 100644 examples/sharing-loader-data/app/routes/index.tsx delete mode 100644 examples/sharing-loader-data/app/routes/workshops.tsx delete mode 100644 examples/sharing-loader-data/app/routes/workshops/$workshopId.tsx delete mode 100644 examples/sharing-loader-data/app/routes/workshops/index.tsx delete mode 100644 examples/sharing-loader-data/package.json delete mode 100644 examples/sharing-loader-data/public/favicon.ico delete mode 100644 examples/sharing-loader-data/remix.config.js delete mode 100644 examples/sharing-loader-data/remix.env.d.ts delete mode 100644 examples/sharing-loader-data/sandbox.config.json delete mode 100644 examples/sharing-loader-data/tsconfig.json delete mode 100644 examples/socket.io/.eslintrc.js delete mode 100644 examples/socket.io/.gitignore delete mode 100644 examples/socket.io/README.md delete mode 100644 examples/socket.io/app/context.tsx delete mode 100644 examples/socket.io/app/entry.client.tsx delete mode 100644 examples/socket.io/app/entry.server.tsx delete mode 100644 examples/socket.io/app/root.tsx delete mode 100644 examples/socket.io/app/routes/index.tsx delete mode 100644 examples/socket.io/package.json delete mode 100644 examples/socket.io/public/favicon.ico delete mode 100644 examples/socket.io/remix.config.js delete mode 100644 examples/socket.io/remix.env.d.ts delete mode 100644 examples/socket.io/sandbox.config.json delete mode 100644 examples/socket.io/server/index.js delete mode 100644 examples/socket.io/tsconfig.json delete mode 100644 examples/stitches/.eslintrc.js delete mode 100644 examples/stitches/.gitignore delete mode 100644 examples/stitches/README.md delete mode 100644 examples/stitches/app/entry.client.tsx delete mode 100644 examples/stitches/app/entry.server.tsx delete mode 100644 examples/stitches/app/root.tsx delete mode 100644 examples/stitches/app/routes/index.tsx delete mode 100644 examples/stitches/app/routes/jokes.tsx delete mode 100644 examples/stitches/app/routes/jokes/jokes-error.tsx delete mode 100644 examples/stitches/app/styles/client.context.ts delete mode 100644 examples/stitches/app/styles/stitches.config.ts delete mode 100644 examples/stitches/package.json delete mode 100644 examples/stitches/public/favicon.ico delete mode 100644 examples/stitches/remix.config.js delete mode 100644 examples/stitches/remix.env.d.ts delete mode 100644 examples/stitches/sandbox.config.json delete mode 100644 examples/stitches/tsconfig.json delete mode 100644 examples/strapi/.eslintrc.js delete mode 100755 examples/strapi/.gitignore delete mode 100755 examples/strapi/README.md delete mode 100755 examples/strapi/app/entry.client.tsx delete mode 100755 examples/strapi/app/entry.server.tsx delete mode 100755 examples/strapi/app/root.tsx delete mode 100755 examples/strapi/app/routes/index.tsx delete mode 100755 examples/strapi/package.json delete mode 100755 examples/strapi/public/favicon.ico delete mode 100755 examples/strapi/remix.config.js delete mode 100755 examples/strapi/remix.env.d.ts delete mode 100644 examples/strapi/sandbox.config.json delete mode 100755 examples/strapi/strapi/.env.example delete mode 100755 examples/strapi/strapi/.gitignore delete mode 100755 examples/strapi/strapi/.tmp/data.db delete mode 100755 examples/strapi/strapi/README.md delete mode 100755 examples/strapi/strapi/config/admin.js delete mode 100755 examples/strapi/strapi/config/api.js delete mode 100755 examples/strapi/strapi/config/database.js delete mode 100755 examples/strapi/strapi/config/middlewares.js delete mode 100755 examples/strapi/strapi/config/server.js delete mode 100755 examples/strapi/strapi/favicon.ico delete mode 100755 examples/strapi/strapi/package.json delete mode 100755 examples/strapi/strapi/public/robots.txt delete mode 100755 examples/strapi/strapi/public/uploads/.gitkeep delete mode 100755 examples/strapi/strapi/src/admin/app.example.js delete mode 100755 examples/strapi/strapi/src/admin/webpack.config.example.js delete mode 100755 examples/strapi/strapi/src/api/.gitkeep delete mode 100755 examples/strapi/strapi/src/api/post/content-types/post/schema.json delete mode 100755 examples/strapi/strapi/src/api/post/controllers/post.js delete mode 100755 examples/strapi/strapi/src/api/post/routes/post.js delete mode 100755 examples/strapi/strapi/src/api/post/services/post.js delete mode 100755 examples/strapi/strapi/src/extensions/.gitkeep delete mode 100755 examples/strapi/strapi/src/extensions/users-permissions/content-types/user/schema.json delete mode 100755 examples/strapi/strapi/src/index.js delete mode 100755 examples/strapi/tsconfig.json delete mode 100644 examples/stripe-integration/.env.example delete mode 100644 examples/stripe-integration/.eslintrc.js delete mode 100644 examples/stripe-integration/.gitignore delete mode 100644 examples/stripe-integration/README.md delete mode 100644 examples/stripe-integration/app/entry.client.tsx delete mode 100644 examples/stripe-integration/app/entry.server.tsx delete mode 100644 examples/stripe-integration/app/root.tsx delete mode 100644 examples/stripe-integration/app/routes/api/stripe-web-hook.tsx delete mode 100644 examples/stripe-integration/app/routes/buy.tsx delete mode 100644 examples/stripe-integration/app/routes/payment/cancelled.tsx delete mode 100644 examples/stripe-integration/app/routes/payment/success.tsx delete mode 100644 examples/stripe-integration/app/utils/stripe.server.tsx delete mode 100644 examples/stripe-integration/package.json delete mode 100644 examples/stripe-integration/public/favicon.ico delete mode 100644 examples/stripe-integration/remix.config.js delete mode 100644 examples/stripe-integration/remix.env.d.ts delete mode 100644 examples/stripe-integration/tsconfig.json delete mode 100644 examples/styled-components/.eslintrc.js delete mode 100644 examples/styled-components/.gitignore delete mode 100644 examples/styled-components/README.md delete mode 100644 examples/styled-components/app/entry.client.tsx delete mode 100644 examples/styled-components/app/entry.server.tsx delete mode 100644 examples/styled-components/app/root.tsx delete mode 100644 examples/styled-components/app/routes/index.tsx delete mode 100644 examples/styled-components/app/styles-context.tsx delete mode 100644 examples/styled-components/package.json delete mode 100644 examples/styled-components/public/favicon.ico delete mode 100644 examples/styled-components/remix.config.js delete mode 100644 examples/styled-components/remix.env.d.ts delete mode 100644 examples/styled-components/sandbox.config.json delete mode 100644 examples/styled-components/tsconfig.json delete mode 100644 examples/styletron/.eslintrc.js delete mode 100644 examples/styletron/.gitignore delete mode 100644 examples/styletron/README.md delete mode 100644 examples/styletron/app/entry.client.tsx delete mode 100644 examples/styletron/app/entry.server.tsx delete mode 100644 examples/styletron/app/root.tsx delete mode 100644 examples/styletron/app/routes/index.tsx delete mode 100644 examples/styletron/app/styletron.ts delete mode 100644 examples/styletron/package.json delete mode 100644 examples/styletron/public/favicon.ico delete mode 100644 examples/styletron/remix.config.js delete mode 100644 examples/styletron/remix.env.d.ts delete mode 100644 examples/styletron/sandbox.config.json delete mode 100644 examples/styletron/tsconfig.json delete mode 100644 examples/supabase-subscription/.env.example delete mode 100644 examples/supabase-subscription/.eslintrc.js delete mode 100644 examples/supabase-subscription/.gitignore delete mode 100644 examples/supabase-subscription/README.md delete mode 100644 examples/supabase-subscription/app/entry.client.tsx delete mode 100644 examples/supabase-subscription/app/entry.server.tsx delete mode 100644 examples/supabase-subscription/app/root.tsx delete mode 100644 examples/supabase-subscription/app/routes/realtime.tsx delete mode 100644 examples/supabase-subscription/app/utils/supabaseClient.server.tsx delete mode 100644 examples/supabase-subscription/package.json delete mode 100644 examples/supabase-subscription/public/favicon.ico delete mode 100644 examples/supabase-subscription/remix.config.js delete mode 100644 examples/supabase-subscription/remix.env.d.ts delete mode 100644 examples/supabase-subscription/sandbox.config.json delete mode 100644 examples/supabase-subscription/tsconfig.json delete mode 100644 examples/tailwindcss/.eslintrc.js delete mode 100644 examples/tailwindcss/.gitignore delete mode 100644 examples/tailwindcss/README.md delete mode 100644 examples/tailwindcss/app/entry.client.tsx delete mode 100644 examples/tailwindcss/app/entry.server.tsx delete mode 100644 examples/tailwindcss/app/root.tsx delete mode 100644 examples/tailwindcss/app/routes/index.tsx delete mode 100644 examples/tailwindcss/package.json delete mode 100644 examples/tailwindcss/public/favicon.ico delete mode 100644 examples/tailwindcss/remix.config.js delete mode 100644 examples/tailwindcss/remix.env.d.ts delete mode 100644 examples/tailwindcss/sandbox.config.json delete mode 100644 examples/tailwindcss/tailwind.config.js delete mode 100644 examples/tailwindcss/tsconfig.json delete mode 100644 examples/template/.eslintrc.js delete mode 100644 examples/template/.gitignore delete mode 100644 examples/template/README.md delete mode 100644 examples/template/app/entry.client.tsx delete mode 100644 examples/template/app/entry.server.tsx delete mode 100644 examples/template/app/root.tsx delete mode 100644 examples/template/package.json delete mode 100644 examples/template/public/favicon.ico delete mode 100644 examples/template/remix.config.js delete mode 100644 examples/template/remix.env.d.ts delete mode 100644 examples/template/sandbox.config.json delete mode 100644 examples/template/tsconfig.json delete mode 100644 examples/theme-ui/.eslintrc.js delete mode 100644 examples/theme-ui/.gitignore delete mode 100644 examples/theme-ui/README.md delete mode 100644 examples/theme-ui/app/entry.client.tsx delete mode 100644 examples/theme-ui/app/entry.server.tsx delete mode 100644 examples/theme-ui/app/root.tsx delete mode 100644 examples/theme-ui/app/routes/index.tsx delete mode 100644 examples/theme-ui/app/routes/jokes-error.tsx delete mode 100644 examples/theme-ui/app/routes/jokes.tsx delete mode 100644 examples/theme-ui/app/styles/context.tsx delete mode 100644 examples/theme-ui/app/styles/createEmotionCache.tsx delete mode 100644 examples/theme-ui/package.json delete mode 100644 examples/theme-ui/public/favicon.ico delete mode 100644 examples/theme-ui/remix.config.js delete mode 100644 examples/theme-ui/remix.env.d.ts delete mode 100644 examples/theme-ui/sandbox.config.json delete mode 100644 examples/theme-ui/tsconfig.json delete mode 100644 examples/tiptap-collab-editing/.eslintrc.js delete mode 100644 examples/tiptap-collab-editing/.gitignore delete mode 100644 examples/tiptap-collab-editing/README.md delete mode 100644 examples/tiptap-collab-editing/app/entry.client.tsx delete mode 100644 examples/tiptap-collab-editing/app/entry.server.tsx delete mode 100644 examples/tiptap-collab-editing/app/root.tsx delete mode 100644 examples/tiptap-collab-editing/app/routes/editor.tsx delete mode 100644 examples/tiptap-collab-editing/app/utils/webrtc.client.tsx delete mode 100644 examples/tiptap-collab-editing/package.json delete mode 100644 examples/tiptap-collab-editing/public/favicon.ico delete mode 100644 examples/tiptap-collab-editing/remix.config.js delete mode 100644 examples/tiptap-collab-editing/remix.env.d.ts delete mode 100644 examples/tiptap-collab-editing/sandbox.config.json delete mode 100644 examples/tiptap-collab-editing/tsconfig.json delete mode 100644 examples/toast-message/.eslintrc.js delete mode 100644 examples/toast-message/.gitignore delete mode 100644 examples/toast-message/README.md delete mode 100644 examples/toast-message/app/entry.client.tsx delete mode 100644 examples/toast-message/app/entry.server.tsx delete mode 100644 examples/toast-message/app/message.server.ts delete mode 100644 examples/toast-message/app/root.tsx delete mode 100644 examples/toast-message/app/routes/index.tsx delete mode 100644 examples/toast-message/app/routes/submit-secret.ts delete mode 100644 examples/toast-message/package.json delete mode 100644 examples/toast-message/public/favicon.ico delete mode 100644 examples/toast-message/remix.config.js delete mode 100644 examples/toast-message/remix.env.d.ts delete mode 100644 examples/toast-message/sandbox.config.json delete mode 100644 examples/toast-message/tsconfig.json delete mode 100644 examples/turborepo-vercel/.gitignore delete mode 100644 examples/turborepo-vercel/README.md delete mode 100644 examples/turborepo-vercel/apps/remix-app/.eslintrc.js delete mode 100644 examples/turborepo-vercel/apps/remix-app/.gitignore delete mode 100644 examples/turborepo-vercel/apps/remix-app/api/api.js delete mode 100644 examples/turborepo-vercel/apps/remix-app/app/entry.client.tsx delete mode 100644 examples/turborepo-vercel/apps/remix-app/app/entry.server.tsx delete mode 100644 examples/turborepo-vercel/apps/remix-app/app/root.tsx delete mode 100644 examples/turborepo-vercel/apps/remix-app/app/routes/index.tsx delete mode 100644 examples/turborepo-vercel/apps/remix-app/package.json delete mode 100644 examples/turborepo-vercel/apps/remix-app/public/favicon.ico delete mode 100644 examples/turborepo-vercel/apps/remix-app/remix.config.js delete mode 100644 examples/turborepo-vercel/apps/remix-app/remix.env.d.ts delete mode 100644 examples/turborepo-vercel/apps/remix-app/rollup.config.js delete mode 100644 examples/turborepo-vercel/apps/remix-app/tsconfig.json delete mode 100644 examples/turborepo-vercel/apps/remix-app/vercel.json delete mode 100644 examples/turborepo-vercel/package.json delete mode 100644 examples/turborepo-vercel/packages/ui/package.json delete mode 100644 examples/turborepo-vercel/packages/ui/src/Button.tsx delete mode 100644 examples/turborepo-vercel/packages/ui/src/index.tsx delete mode 100644 examples/turborepo-vercel/packages/ui/tsconfig.json delete mode 100644 examples/turborepo-vercel/vercel-project-config-example.png delete mode 100644 examples/twind/.eslintrc.js delete mode 100644 examples/twind/.gitignore delete mode 100644 examples/twind/README.md delete mode 100644 examples/twind/app/entry.client.tsx delete mode 100644 examples/twind/app/entry.server.tsx delete mode 100644 examples/twind/app/root.tsx delete mode 100644 examples/twind/app/routes/anything.tsx delete mode 100644 examples/twind/app/routes/index.tsx delete mode 100644 examples/twind/package.json delete mode 100644 examples/twind/public/favicon.ico delete mode 100644 examples/twind/remix.config.js delete mode 100644 examples/twind/remix.env.d.ts delete mode 100644 examples/twind/sandbox.config.json delete mode 100644 examples/twind/tsconfig.json delete mode 100644 examples/twind/twind.config.ts delete mode 100644 examples/usematches-loader-data/.eslintrc.js delete mode 100644 examples/usematches-loader-data/.gitignore delete mode 100644 examples/usematches-loader-data/README.md delete mode 100644 examples/usematches-loader-data/app/db.server.ts delete mode 100644 examples/usematches-loader-data/app/entry.client.tsx delete mode 100644 examples/usematches-loader-data/app/entry.server.tsx delete mode 100644 examples/usematches-loader-data/app/root.tsx delete mode 100644 examples/usematches-loader-data/app/routes/index.tsx delete mode 100644 examples/usematches-loader-data/app/useMatchesData.ts delete mode 100644 examples/usematches-loader-data/app/useUser.ts delete mode 100644 examples/usematches-loader-data/package.json delete mode 100644 examples/usematches-loader-data/public/favicon.ico delete mode 100644 examples/usematches-loader-data/remix.config.js delete mode 100644 examples/usematches-loader-data/remix.env.d.ts delete mode 100644 examples/usematches-loader-data/sandbox.config.json delete mode 100644 examples/usematches-loader-data/tsconfig.json delete mode 100644 examples/yarn-pnp/.eslintrc.js delete mode 100644 examples/yarn-pnp/.gitignore delete mode 100644 examples/yarn-pnp/README.md delete mode 100644 examples/yarn-pnp/app/entry.client.tsx delete mode 100644 examples/yarn-pnp/app/entry.server.tsx delete mode 100644 examples/yarn-pnp/app/root.tsx delete mode 100644 examples/yarn-pnp/app/routes/index.tsx delete mode 100644 examples/yarn-pnp/package.json delete mode 100644 examples/yarn-pnp/public/favicon.ico delete mode 100644 examples/yarn-pnp/remix.config.js delete mode 100644 examples/yarn-pnp/remix.env.d.ts delete mode 100644 examples/yarn-pnp/sandbox.config.json delete mode 100644 examples/yarn-pnp/tsconfig.json diff --git a/examples/.gitignore b/examples/.gitignore deleted file mode 100644 index 00da837c3fc..00000000000 --- a/examples/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -package-lock.json -yarn.lock -pnpm-lock.yaml -pnpm-lock.yml diff --git a/examples/README.md b/examples/README.md index 5bb8c55a8d7..48593ce1f70 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,38 +1 @@ -# Remix Examples - -Welcome to the examples for Remix. - -Here you'll find various examples of using Remix to accomplish certain tasks. Each example is a complete application including a build and even a button to preview a live instance of the app so you can play with it. - -Also, remember to check out the README! - -You can also initialize a new project with any of these examples using the `--template` flag of the `create-remix` CLI. For example: - -``` -npx create-remix --template https://github.com/remix-run/remix/tree/main/examples/tailwindcss -``` - -Enjoy! - -## Contributing - -▢️ [Watch Kent show you how to create examples](https://www.youtube.com/watch?v=10AhByQA6Q0). - -Thanks for your willingness to contribute an example to Remix. Examples are incredibly helpful to people like you who are trying to figure out how to use Remix to solve certain problems and integrate with other tools. - -What makes a good example is focus. There's certainly room for examples that show off a whole app experience and we do have some examples like that. But the vast majority of useful examples are focused on a specific use-case. Otherwise it's hard for people to know what to look for in the code. - -This means you should avoid adding stuff that isn't absolutely necessary for the example. Start with bare bones and add only what you need. - -Most examples should: - -- Not use a database -- Have no more than one or two routes (some may not even need any routes) -- Have only necessary deps -- Not use complex validation -- Use TypeScript -- Be as practical as reasonable (balanced with the focus). Just, no `foo`/`bar` please. - -To create an example, simply copy/paste the [`template`](template) directory into a new one with a sensible name, make the changes you need for your example, update the `README.md` and open a PR! - -Thanks! +Remix examples have moved into a dedicated repository. [See `remix-run/examples`](https://github.com/remix-run/examples) to browse or contribute new example projects! diff --git a/examples/basic/.eslintrc.js b/examples/basic/.eslintrc.js deleted file mode 100644 index ced78085f86..00000000000 --- a/examples/basic/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], -}; diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore deleted file mode 100644 index 3f7bf98da3e..00000000000 --- a/examples/basic/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules - -/.cache -/build -/public/build -.env diff --git a/examples/basic/README.md b/examples/basic/README.md deleted file mode 100644 index d6b0cc9d2c9..00000000000 --- a/examples/basic/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Welcome to Remix! - -This is a very basic example of a simple Remix app using the Remix App Server. - -- [Remix Docs](https://remix.run/docs) - -## Development - -From your terminal: - -```sh -npm install -npm run dev -``` - -This starts your app in development mode, rebuilding assets on file changes. - -## Deployment - -First, build your app for production: - -```sh -npm run build -``` - -Then run the app in production mode: - -```sh -npm start -``` - -## Preview - -Open this example on [CodeSandbox](https://codesandbox.com): - -[![Open in CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/remix-run/remix/tree/main/examples/basic) diff --git a/examples/basic/app/entry.client.tsx b/examples/basic/app/entry.client.tsx deleted file mode 100644 index 3eec1fd0a02..00000000000 --- a/examples/basic/app/entry.client.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { RemixBrowser } from "@remix-run/react"; -import { hydrate } from "react-dom"; - -hydrate(, document); diff --git a/examples/basic/app/entry.server.tsx b/examples/basic/app/entry.server.tsx deleted file mode 100644 index 5afa18235cc..00000000000 --- a/examples/basic/app/entry.server.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { EntryContext } from "@remix-run/node"; -import { RemixServer } from "@remix-run/react"; -import { renderToString } from "react-dom/server"; - -export default function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - const markup = renderToString( - - ); - - responseHeaders.set("Content-Type", "text/html"); - - return new Response("" + markup, { - status: responseStatusCode, - headers: responseHeaders, - }); -} diff --git a/examples/basic/app/root.tsx b/examples/basic/app/root.tsx deleted file mode 100644 index 599eb76f51c..00000000000 --- a/examples/basic/app/root.tsx +++ /dev/null @@ -1,252 +0,0 @@ -import type { LinksFunction, MetaFunction } from "@remix-run/node"; -import { - Link, - Links, - LiveReload, - Meta, - Outlet, - Scripts, - ScrollRestoration, - useCatch, - useLocation, -} from "@remix-run/react"; -import * as React from "react"; - -import deleteMeRemixStyles from "~/styles/demos/remix.css"; -import globalStylesUrl from "~/styles/global.css"; -import darkStylesUrl from "~/styles/dark.css"; - -/** - * The `links` export is a function that returns an array of objects that map to - * the attributes for an HTML `` element. These will load `` tags on - * every route in the app, but individual routes can include their own links - * that are automatically unloaded when a user navigates away from the route. - * - * https://remix.run/api/app#links - */ -export const links: LinksFunction = () => { - return [ - { rel: "stylesheet", href: globalStylesUrl }, - { - rel: "stylesheet", - href: darkStylesUrl, - media: "(prefers-color-scheme: dark)", - }, - { rel: "stylesheet", href: deleteMeRemixStyles }, - ]; -}; - -export const meta: MetaFunction = () => ({ - charset: "utf-8", - viewport: "width=device-width,initial-scale=1", -}); - -/** - * The root module's default export is a component that renders the current - * route via the `` component. Think of this as the global layout - * component for your app. - */ -export default function App() { - return ( - - - - - - ); -} - -function Document({ - children, - title, -}: { - children: React.ReactNode; - title?: string; -}) { - return ( - - - {title ? {title} : null} - - - - - {children} - - - - - - - ); -} - -function Layout({ children }: React.PropsWithChildren<{}>) { - return ( -
-
-
- - - - -
-
-
-
{children}
-
-
-
-

© You!

-
-
-
- ); -} - -export function CatchBoundary() { - const caught = useCatch(); - - let message; - switch (caught.status) { - case 401: - message = ( -

- Oops! Looks like you tried to visit a page that you do not have access - to. -

- ); - break; - case 404: - message = ( -

Oops! Looks like you tried to visit a page that does not exist.

- ); - break; - - default: - throw new Error(caught.data || caught.statusText); - } - - return ( - - -

- {caught.status}: {caught.statusText} -

- {message} -
-
- ); -} - -export function ErrorBoundary({ error }: { error: Error }) { - console.error(error); - return ( - - -
-

There was an error

-

{error.message}

-
-

- Hey, developer, you should replace this with what you want your - users to see. -

-
-
-
- ); -} - -function RemixLogo(props: React.ComponentPropsWithoutRef<"svg">) { - return ( - - Remix Logo - - - - - - - ); -} - -/** - * Provides an alert for screen reader users when the route changes. - */ -const RouteChangeAnnouncement = React.memo(() => { - const [hydrated, setHydrated] = React.useState(false); - const [innerHtml, setInnerHtml] = React.useState(""); - const location = useLocation(); - - React.useEffect(() => { - setHydrated(true); - }, []); - - const firstRenderRef = React.useRef(true); - React.useEffect(() => { - // Skip the first render because we don't want an announcement on the - // initial page load. - if (firstRenderRef.current) { - firstRenderRef.current = false; - return; - } - - const pageTitle = - location.pathname === "/" ? "Remix demo home page" : document.title; - setInnerHtml(`Navigated to ${pageTitle}`); - }, [location.pathname]); - - // Render nothing on the server. The live region provides no value unless - // scripts are loaded and the browser takes over normal routing. - if (!hydrated) { - return null; - } - - return ( -
- {innerHtml} -
- ); -}); -RouteChangeAnnouncement.displayName = "RouteChangeAnnouncement"; diff --git a/examples/basic/app/routes/demos/about.tsx b/examples/basic/app/routes/demos/about.tsx deleted file mode 100644 index 436dcebfe1d..00000000000 --- a/examples/basic/app/routes/demos/about.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { LinksFunction, MetaFunction } from "@remix-run/node"; -import { Outlet } from "@remix-run/react"; - -import stylesUrl from "~/styles/demos/about.css"; - -export const meta: MetaFunction = () => { - return { - title: "About Remix", - }; -}; - -export const links: LinksFunction = () => { - return [{ rel: "stylesheet", href: stylesUrl }]; -}; - -export default function Index() { - return ( -
-
-

About Us

-

- Ok, so this page isn't really about us, but we did want to - show you a few more things Remix can do. -

-

- Did you notice that things look a little different on this page? The - CSS that we import in the route file and include in its{" "} - links export is only included on this route and its - children. -

-

- Wait a sec...its children? To understand what we mean by - this,{" "} - - read all about nested routes in the docs - - . -

-
- -
-
- ); -} diff --git a/examples/basic/app/routes/demos/about/index.tsx b/examples/basic/app/routes/demos/about/index.tsx deleted file mode 100644 index 184186a0e40..00000000000 --- a/examples/basic/app/routes/demos/about/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Link } from "@remix-run/react"; - -export default function AboutIndex() { - return ( -
-

- You are looking at the index route for the /about URL - segment, but there are nested routes as well! -

-

- - Check out one of them here. - -

-
- ); -} diff --git a/examples/basic/app/routes/demos/about/whoa.tsx b/examples/basic/app/routes/demos/about/whoa.tsx deleted file mode 100644 index 79c09128781..00000000000 --- a/examples/basic/app/routes/demos/about/whoa.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Link } from "@remix-run/react"; - -export default function Whoa() { - return ( -
-

- Whoa, this is a nested route! We render the /about layout - route component, and its Outlet renders our route - component. 🀯 -

-

- - - Go back to the /about index. - - -

-
- ); -} diff --git a/examples/basic/app/routes/demos/actions.tsx b/examples/basic/app/routes/demos/actions.tsx deleted file mode 100644 index bc5117e6938..00000000000 --- a/examples/basic/app/routes/demos/actions.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import type { ActionFunction, MetaFunction } from "@remix-run/node"; -import { json, redirect } from "@remix-run/node"; -import { Form, useActionData } from "@remix-run/react"; -import { useEffect, useRef } from "react"; - -export const meta: MetaFunction = () => ({ - title: "Actions Demo", -}); - -// When your form sends a POST, the action is called on the server. -// - https://remix.run/api/conventions#action -// - https://remix.run/guides/data-updates -export const action: ActionFunction = async ({ request }) => { - const formData = await request.formData(); - const answer = formData.get("answer"); - - // Typical action workflows start with validating the form data that just came - // over the network. Clientside validation is fine, but you definitely need it - // server side. If there's a problem, return the data and the component can - // render it. - if (!answer || typeof answer !== "string") { - return json("Come on, at least try!", { status: 400 }); - } - - if (answer !== "egg") { - return json(`Sorry, ${answer} is not right.`, { status: 400 }); - } - - // Finally, if the data is valid, you'll typically write to a database or send or - // email or log the user in, etc. It's recommended to redirect after a - // successful action, even if it's to the same place so that non-JavaScript workflows - // from the browser doesn't repost the data if the user clicks back. - return redirect("/demos/correct"); -}; - -export default function ActionsDemo() { - // https://remix.run/api/remix#useactiondata - const actionMessage = useActionData(); - const answerRef = useRef(null); - - // This form works without JavaScript, but when we have JavaScript we can make - // the experience better by selecting the input on wrong answers! Go ahead, disable - // JavaScript in your browser and see what happens. - useEffect(() => { - if (actionMessage && answerRef.current) { - answerRef.current.select(); - } - }, [actionMessage]); - - return ( -
-
-

Actions!

-

- This form submission will send a post request that we handle in our - `action` export. Any route can export an action to handle data - mutations. -

-
-

Post an Action

-

- What is more useful when it is broken? -

- -
- -
- {actionMessage ? ( -

- {actionMessage} -

- ) : null} -
-
- - -
- ); -} diff --git a/examples/basic/app/routes/demos/correct.tsx b/examples/basic/app/routes/demos/correct.tsx deleted file mode 100644 index 162ebeb7873..00000000000 --- a/examples/basic/app/routes/demos/correct.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function NiceWork() { - return

You got it right!

; -} diff --git a/examples/basic/app/routes/demos/params.tsx b/examples/basic/app/routes/demos/params.tsx deleted file mode 100644 index 1910b3de5b4..00000000000 --- a/examples/basic/app/routes/demos/params.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { MetaFunction } from "@remix-run/node"; -import { Link, Outlet } from "@remix-run/react"; - -export const meta: MetaFunction = () => ({ - title: "Boundaries Demo", -}); - -export default function Boundaries() { - return ( -
-
- -
- - -
- ); -} diff --git a/examples/basic/app/routes/demos/params/$id.tsx b/examples/basic/app/routes/demos/params/$id.tsx deleted file mode 100644 index 10b09e448ee..00000000000 --- a/examples/basic/app/routes/demos/params/$id.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import type { LoaderFunction, MetaFunction } from "@remix-run/node"; -import { json } from "@remix-run/node"; -import { useCatch, useLoaderData } from "@remix-run/react"; - -// The `$` in route filenames becomes a pattern that's parsed from the URL and -// passed to your loaders so you can look up data. -// - https://remix.run/api/conventions#loader-params -export const loader: LoaderFunction = async ({ params }) => { - // pretend like we're using params.id to look something up in the db - - if (params.id === "this-record-does-not-exist") { - // If the record doesn't exist we can't render the route normally, so - // instead we throw a 404 response to stop running code here and show the - // user the catch boundary. - throw new Response("Not Found", { status: 404 }); - } - - // now pretend like the record exists but the user just isn't authorized to - // see it. - if (params.id === "shh-its-a-secret") { - // Again, we can't render the component if the user isn't authorized. You - // can even put data in the response that might help the user rectify the - // issue! Like emailing the webmaster for access to the page. (Oh, right, - // `json` is just a Response helper that makes it easier to send JSON - // responses). - throw json({ webmasterEmail: "hello@remix.run" }, { status: 401 }); - } - - // Sometimes your code just blows up and you never anticipated it. Remix will - // automatically catch it and send the UI to the error boundary. - if (params.id === "kaboom") { - lol(); - } - - // but otherwise the record was found, user has access, so we can do whatever - // else we needed to in the loader and return the data. (This is boring, we're - // just gonna return the params.id). - return json({ param: params.id }); -}; - -export default function ParamDemo() { - const data = useLoaderData(); - return ( -

- The param is {data.param} -

- ); -} - -// https://remix.run/api/conventions#catchboundary -// https://remix.run/api/remix#usecatch -// https://remix.run/api/guides/not-found -export function CatchBoundary() { - const caught = useCatch(); - - let message: React.ReactNode; - switch (caught.status) { - case 401: - message = ( -

- Looks like you tried to visit a page that you do not have access to. - Maybe ask the webmaster ({caught.data.webmasterEmail}) for access. -

- ); - break; - case 404: - message = ( -

Looks like you tried to visit a page that does not exist.

- ); - break; - default: - message = ( -

- There was a problem with your request! -
- {caught.status} {caught.statusText} -

- ); - break; - } - - return ( - <> -

Oops!

-

{message}

-

- (Isn't it cool that the user gets to stay in context and try a different - link in the parts of the UI that didn't blow up?) -

- - ); -} - -// https://remix.run/api/conventions#errorboundary -// https://remix.run/api/guides/not-found -export function ErrorBoundary({ error }: { error: Error }) { - console.error(error); - return ( - <> -

Error!

-

{error.message}

-

- (Isn't it cool that the user gets to stay in context and try a different - link in the parts of the UI that didn't blow up?) -

- - ); -} - -export const meta: MetaFunction = ({ data }) => { - return { - title: data ? `Param: ${data.param}` : "Oops...", - }; -}; diff --git a/examples/basic/app/routes/demos/params/index.tsx b/examples/basic/app/routes/demos/params/index.tsx deleted file mode 100644 index 264dd5f6ddc..00000000000 --- a/examples/basic/app/routes/demos/params/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -export default function Boundaries() { - return ( - <> -

Params

-

- When you name a route segment with $ like{" "} - routes/users/$userId.js, the $ segment will be parsed from - the URL and sent to your loaders and actions by the same name. -

-

Errors

-

- When a route throws an error in it's action, loader, or component, Remix - automatically catches it, won't even try to render the component, but it - will render the route's ErrorBoundary instead. If the route doesn't have - one, it will bubble up to the routes above it until it hits the root. -

-

So be as granular as you want with your error handling.

-

Not Found

-

- (and other{" "} - - client errors - - ) -

-

- Loaders and Actions can throw a Response instead of an - error and Remix will render the CatchBoundary instead of the component. - This is great when loading data from a database isn't found. As soon as - you know you can't render the component normally, throw a 404 response - and send your app into the catch boundary. Just like error boundaries, - catch boundaries bubble, too. -

- - ); -} diff --git a/examples/basic/app/routes/index.tsx b/examples/basic/app/routes/index.tsx deleted file mode 100644 index 7f7043afcd9..00000000000 --- a/examples/basic/app/routes/index.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import type { LoaderFunction, MetaFunction } from "@remix-run/node"; -import { json } from "@remix-run/node"; -import { Link, useLoaderData } from "@remix-run/react"; - -type IndexData = { - resources: Array<{ name: string; url: string }>; - demos: Array<{ name: string; to: string }>; -}; - -// Loaders provide data to components and are only ever called on the server, so -// you can connect to a database or run any server side code you want right next -// to the component that renders it. -// https://remix.run/api/conventions#loader -export const loader: LoaderFunction = async () => { - const data: IndexData = { - resources: [ - { - name: "Remix Docs", - url: "https://remix.run/docs", - }, - { - name: "React Router Docs", - url: "https://reactrouter.com/docs", - }, - { - name: "Remix Discord", - url: "https://discord.gg/VBePs6d", - }, - ], - demos: [ - { - to: "demos/actions", - name: "Actions", - }, - { - to: "demos/about", - name: "Nested Routes, CSS loading/unloading", - }, - { - to: "demos/params", - name: "URL Params and Error Boundaries", - }, - ], - }; - - // https://remix.run/api/remix#json - return json(data); -}; - -// https://remix.run/api/conventions#meta -export const meta: MetaFunction = () => { - return { - title: "Remix Starter", - description: "Welcome to remix!", - }; -}; - -// https://remix.run/guides/routing#index-routes -export default function Index() { - const data = useLoaderData(); - - return ( -
-
-

Welcome to Remix!

-

We're stoked that you're here. πŸ₯³

-

- Feel free to take a look around the code to see how Remix does things, - it might be a bit different than what you’re used to. When you're - ready to dive deeper, we've got plenty of resources to get you - up-and-running quickly. -

-

- Check out all the demos in this starter, and then just delete the{" "} - app/routes/demos and app/styles/demos{" "} - folders when you're ready to turn this into your next project. -

-
- -
- ); -} diff --git a/examples/basic/app/styles/dark.css b/examples/basic/app/styles/dark.css deleted file mode 100644 index 81b5196761c..00000000000 --- a/examples/basic/app/styles/dark.css +++ /dev/null @@ -1,7 +0,0 @@ -:root { - --color-foreground: hsl(0, 0%, 100%); - --color-background: hsl(0, 0%, 7%); - --color-links: hsl(213, 100%, 73%); - --color-links-hover: hsl(213, 100%, 80%); - --color-border: hsl(0, 0%, 25%); -} diff --git a/examples/basic/app/styles/demos/about.css b/examples/basic/app/styles/demos/about.css deleted file mode 100644 index 35fc3b90b6e..00000000000 --- a/examples/basic/app/styles/demos/about.css +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Whoa whoa whoa, wait a sec...why are we overriding global CSS selectors? - * Isn't that kind of scary? How do we know this won't have side effects? - * - * In Remix, CSS that is included in a route file will *only* show up on that - * route (and for nested routes, its children). When the user navigates away - * from that route the CSS files linked from those routes will be automatically - * unloaded, making your styles much easier to predict and control. - * - * Read more about styling routes in the docs: - * https://remix.run/guides/styling - */ - -:root { - --color-foreground: hsl(0, 0%, 7%); - --color-background: hsl(56, 100%, 50%); - --color-links: hsl(345, 56%, 39%); - --color-links-hover: hsl(345, 51%, 49%); - --color-border: rgb(184, 173, 20); - --font-body: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - Liberation Mono, Courier New, monospace; -} - -.about__intro { - max-width: 500px; -} diff --git a/examples/basic/app/styles/demos/remix.css b/examples/basic/app/styles/demos/remix.css deleted file mode 100644 index 3131afdef96..00000000000 --- a/examples/basic/app/styles/demos/remix.css +++ /dev/null @@ -1,120 +0,0 @@ -/* - * You probably want to just delete this file; it's just for the demo pages. - */ -.remix-app { - display: flex; - flex-direction: column; - min-height: 100vh; - min-height: calc(100vh - env(safe-area-inset-bottom)); -} - -.remix-app > * { - width: 100%; -} - -.remix-app__header { - padding-top: 1rem; - padding-bottom: 1rem; - border-bottom: 1px solid var(--color-border); -} - -.remix-app__header-content { - display: flex; - justify-content: space-between; - align-items: center; -} - -.remix-app__header-home-link { - width: 106px; - height: 30px; - color: var(--color-foreground); -} - -.remix-app__header-nav ul { - list-style: none; - margin: 0; - display: flex; - align-items: center; - gap: 1.5em; -} - -.remix-app__header-nav li { - font-weight: bold; -} - -.remix-app__main { - flex: 1 1 100%; -} - -.remix-app__footer { - padding-top: 1rem; - padding-bottom: 1rem; - border-top: 1px solid var(--color-border); -} - -.remix-app__footer-content { - display: flex; - justify-content: center; - align-items: center; -} - -.remix__page { - --gap: 1rem; - --space: 2rem; - display: grid; - grid-auto-rows: min-content; - gap: var(--gap); - padding-top: var(--space); - padding-bottom: var(--space); -} - -@media print, screen and (min-width: 640px) { - .remix__page { - --gap: 2rem; - grid-auto-rows: unset; - grid-template-columns: repeat(2, 1fr); - } -} - -@media screen and (min-width: 1024px) { - .remix__page { - --gap: 4rem; - } -} - -.remix__page > main > :first-child { - margin-top: 0; -} - -.remix__page > main > :last-child { - margin-bottom: 0; -} - -.remix__page > aside { - margin: 0; - padding: 1.5ch 2ch; - border: solid 1px var(--color-border); - border-radius: 0.5rem; -} - -.remix__page > aside > :first-child { - margin-top: 0; -} - -.remix__page > aside > :last-child { - margin-bottom: 0; -} - -.remix__form { - display: flex; - flex-direction: column; - gap: 1rem; - padding: 1rem; - border: 1px solid var(--color-border); - border-radius: 0.5rem; -} - -.remix__form > * { - margin-top: 0; - margin-bottom: 0; -} diff --git a/examples/basic/app/styles/global.css b/examples/basic/app/styles/global.css deleted file mode 100644 index 2709c78a555..00000000000 --- a/examples/basic/app/styles/global.css +++ /dev/null @@ -1,98 +0,0 @@ -/* - * You can just delete everything here or keep whatever you like, it's just a - * quick baseline! - */ -:root { - --color-foreground: hsl(0, 0%, 7%); - --color-background: hsl(0, 0%, 100%); - --color-links: hsl(213, 100%, 52%); - --color-links-hover: hsl(213, 100%, 43%); - --color-border: hsl(0, 0%, 82%); - --font-body: -apple-system, "Segoe UI", Helvetica Neue, Helvetica, Roboto, - Arial, sans-serif, system-ui, "Apple Color Emoji", "Segoe UI Emoji"; -} - -html { - box-sizing: border-box; -} - -*, -*::before, -*::after { - box-sizing: inherit; -} - -:-moz-focusring { - outline: auto; -} - -:focus { - outline: var(--color-links) solid 2px; - outline-offset: 2px; -} - -html, -body { - padding: 0; - margin: 0; - background-color: var(--color-background); - color: var(--color-foreground); -} - -body { - font-family: var(--font-body); - line-height: 1.5; -} - -a { - color: var(--color-links); - text-decoration: none; -} - -a:hover { - color: var(--color-links-hover); - text-decoration: underline; -} - -hr { - display: block; - height: 1px; - border: 0; - background-color: var(--color-border); - margin-top: 2rem; - margin-bottom: 2rem; -} - -input:where([type="text"]), -input:where([type="search"]) { - display: block; - border: 1px solid var(--color-border); - width: 100%; - font: inherit; - line-height: 1; - height: calc(1ch + 1.5em); - padding-right: 0.5em; - padding-left: 0.5em; - background-color: hsl(0 0% 100% / 20%); - color: var(--color-foreground); -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.container { - --gutter: 16px; - width: 1024px; - max-width: calc(100% - var(--gutter) * 2); - margin-right: auto; - margin-left: auto; -} diff --git a/examples/basic/package.json b/examples/basic/package.json deleted file mode 100644 index e4efeed7ccb..00000000000 --- a/examples/basic/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "private": true, - "sideEffects": false, - "scripts": { - "build": "remix build", - "dev": "remix dev", - "start": "remix-serve build" - }, - "dependencies": { - "@remix-run/node": "1.6.4", - "@remix-run/react": "1.6.4", - "@remix-run/serve": "1.6.4", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@remix-run/dev": "1.6.4", - "@remix-run/eslint-config": "1.6.4", - "@types/react": "^17.0.39", - "@types/react-dom": "^17.0.13", - "eslint": "^8.10.0", - "typescript": "^4.7.4" - }, - "engines": { - "node": ">=14" - } -} diff --git a/examples/basic/public/favicon.ico b/examples/basic/public/favicon.ico deleted file mode 100644 index 8830cf6821b354114848e6354889b8ecf6d2bc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 EKbET!0{{R3 diff --git a/examples/basic/remix.config.js b/examples/basic/remix.config.js deleted file mode 100644 index adf2a0b5d3e..00000000000 --- a/examples/basic/remix.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@remix-run/dev').AppConfig} */ -module.exports = { - ignoredRouteFiles: ["**/.*"], - // appDirectory: "app", - // assetsBuildDirectory: "public/build", - // serverBuildPath: "build/index.js", - // publicPath: "/build/", -}; diff --git a/examples/basic/remix.env.d.ts b/examples/basic/remix.env.d.ts deleted file mode 100644 index 72e2affe311..00000000000 --- a/examples/basic/remix.env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/examples/basic/sandbox.config.json b/examples/basic/sandbox.config.json deleted file mode 100644 index 4363d87a30d..00000000000 --- a/examples/basic/sandbox.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "hardReloadOnChange": true, - "container": { - "port": 3000 - } -} diff --git a/examples/basic/tsconfig.json b/examples/basic/tsconfig.json deleted file mode 100644 index 20f8a386a6c..00000000000 --- a/examples/basic/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], - "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2019"], - "isolatedModules": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "moduleResolution": "node", - "resolveJsonModule": true, - "target": "ES2019", - "strict": true, - "allowJs": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", - "paths": { - "~/*": ["./app/*"] - }, - - // Remix takes care of building everything in `remix build`. - "noEmit": true - } -} diff --git a/examples/blog-tutorial/.dockerignore b/examples/blog-tutorial/.dockerignore deleted file mode 100644 index 91077d0621d..00000000000 --- a/examples/blog-tutorial/.dockerignore +++ /dev/null @@ -1,7 +0,0 @@ -/node_modules -*.log -.DS_Store -.env -/.cache -/public/build -/build diff --git a/examples/blog-tutorial/.env.example b/examples/blog-tutorial/.env.example deleted file mode 100644 index 0d0e0d65e4b..00000000000 --- a/examples/blog-tutorial/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -DATABASE_URL="file:./data.db?connection_limit=1" -SESSION_SECRET="super-duper-s3cret" diff --git a/examples/blog-tutorial/.eslintrc.js b/examples/blog-tutorial/.eslintrc.js deleted file mode 100644 index ced78085f86..00000000000 --- a/examples/blog-tutorial/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], -}; diff --git a/examples/blog-tutorial/.github/workflows/deploy.yml b/examples/blog-tutorial/.github/workflows/deploy.yml deleted file mode 100644 index f3de6b6e03c..00000000000 --- a/examples/blog-tutorial/.github/workflows/deploy.yml +++ /dev/null @@ -1,202 +0,0 @@ -name: πŸš€ Deploy -on: - push: - branches: - - main - - dev - pull_request: {} - -jobs: - lint: - name: ⬣ ESLint - runs-on: ubuntu-latest - steps: - - name: πŸ›‘ Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - - name: ⬇️ Checkout repo - uses: actions/checkout@v3 - - - name: βŽ” Setup node - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: πŸ“₯ Download deps - uses: bahmutov/npm-install@v1 - - - name: πŸ”¬ Lint - run: npm run lint - - typecheck: - name: Κ¦ TypeScript - runs-on: ubuntu-latest - steps: - - name: πŸ›‘ Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - - name: ⬇️ Checkout repo - uses: actions/checkout@v3 - - - name: βŽ” Setup node - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: πŸ“₯ Download deps - uses: bahmutov/npm-install@v1 - - - name: πŸ”Ž Type check - run: npm run typecheck --if-present - - vitest: - name: ⚑ Vitest - runs-on: ubuntu-latest - steps: - - name: πŸ›‘ Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - - name: ⬇️ Checkout repo - uses: actions/checkout@v3 - - - name: βŽ” Setup node - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: πŸ“₯ Download deps - uses: bahmutov/npm-install@v1 - - - name: ⚑ Run vitest - run: npm run test -- --coverage - - cypress: - name: ⚫️ Cypress - runs-on: ubuntu-latest - steps: - - name: πŸ›‘ Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - - name: ⬇️ Checkout repo - uses: actions/checkout@v3 - - - name: πŸ„ Copy test env vars - run: cp .env.example .env - - - name: βŽ” Setup node - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: πŸ“₯ Download deps - uses: bahmutov/npm-install@v1 - - - name: πŸ›  Setup Database - run: npx prisma migrate reset --force - - - name: βš™οΈ Build - run: npm run build - - - name: 🌳 Cypress run - uses: cypress-io/github-action@v3 - with: - start: npm run start:mocks - wait-on: "http://localhost:8811" - env: - PORT: "8811" - - build: - name: 🐳 Build - # only build/deploy main branch on pushes - if: ${{ (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push' }} - runs-on: ubuntu-latest - steps: - - name: πŸ›‘ Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - - name: ⬇️ Checkout repo - uses: actions/checkout@v3 - - - name: πŸ‘€ Read app name - uses: SebRollen/toml-action@v1.0.0 - id: app_name - with: - file: "fly.toml" - field: "app" - - - name: 🐳 Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - # Setup cache - - name: ⚑️ Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - - name: πŸ”‘ Fly Registry Auth - uses: docker/login-action@v1 - with: - registry: registry.fly.io - username: x - password: ${{ secrets.FLY_API_TOKEN }} - - - name: 🐳 Docker build - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.ref_name }}-${{ github.sha }} - build-args: | - COMMIT_SHA=${{ github.sha }} - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new - - # This ugly bit is necessary if you don't want your cache to grow forever - # till it hits GitHub's limit of 5GB. - # Temp fix - # https://github.com/docker/build-push-action/issues/252 - # https://github.com/moby/buildkit/issues/1896 - - name: 🚚 Move cache - run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache - - deploy: - name: πŸš€ Deploy - runs-on: ubuntu-latest - needs: [lint, typecheck, vitest, cypress, build] - # only build/deploy main branch on pushes - if: ${{ (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push' }} - - steps: - - name: πŸ›‘ Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - - name: ⬇️ Checkout repo - uses: actions/checkout@v3 - - - name: πŸ‘€ Read app name - uses: SebRollen/toml-action@v1.0.0 - id: app_name - with: - file: "fly.toml" - field: "app" - - - name: πŸš€ Deploy Staging - if: ${{ github.ref == 'refs/heads/dev' }} - uses: superfly/flyctl-actions@1.3 - with: - args: "deploy --app ${{ steps.app_name.outputs.value }}-staging --image registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.ref_name }}-${{ github.sha }}" - env: - FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} - - - name: πŸš€ Deploy Production - if: ${{ github.ref == 'refs/heads/main' }} - uses: superfly/flyctl-actions@1.3 - with: - args: "deploy --image registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.ref_name }}-${{ github.sha }}" - env: - FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} diff --git a/examples/blog-tutorial/.gitignore b/examples/blog-tutorial/.gitignore deleted file mode 100644 index 05f0cbc1e34..00000000000 --- a/examples/blog-tutorial/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -node_modules - -/build -/public/build -.env - -/cypress/screenshots -/cypress/videos -/prisma/data.db -/prisma/data.db-journal - -/app/styles/tailwind.css diff --git a/examples/blog-tutorial/.gitpod.Dockerfile b/examples/blog-tutorial/.gitpod.Dockerfile deleted file mode 100644 index e52ca2d64b6..00000000000 --- a/examples/blog-tutorial/.gitpod.Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM gitpod/workspace-full - -# Install Fly -RUN curl -L https://fly.io/install.sh | sh -ENV FLYCTL_INSTALL="/home/gitpod/.fly" -ENV PATH="$FLYCTL_INSTALL/bin:$PATH" - -# Install GitHub CLI -RUN brew install gh diff --git a/examples/blog-tutorial/.gitpod.yml b/examples/blog-tutorial/.gitpod.yml deleted file mode 100644 index f07c56287f4..00000000000 --- a/examples/blog-tutorial/.gitpod.yml +++ /dev/null @@ -1,48 +0,0 @@ -# https://www.gitpod.io/docs/config-gitpod-file - -image: - file: .gitpod.Dockerfile - -ports: - - port: 3000 - onOpen: notify - -tasks: - - name: Restore .env file - command: | - if [ -f .env ]; then - # If this workspace already has a .env, don't override it - # Local changes survive a workspace being opened and closed - # but they will not persist between separate workspaces for the same repo - - echo "Found .env in workspace" - else - # There is no .env - if [ ! -n "${ENV}" ]; then - # There is no $ENV from a previous workspace - # Default to the example .env - echo "Setting example .env" - - cp .env.example .env - else - # After making changes to .env, run this line to persist it to $ENV - # eval $(gp env -e ENV="$(base64 .env | tr -d '\n')") - # - # Environment variables set this way are shared between all your workspaces for this repo - # The lines below will read $ENV and print a .env file - - echo "Restoring .env from Gitpod" - - echo "${ENV}" | base64 -d | tee .env > /dev/null - fi - fi - - - init: npm install - command: npm run setup && npm run dev - -vscode: - extensions: - - ms-azuretools.vscode-docker - - esbenp.prettier-vscode - - dbaeumer.vscode-eslint - - bradlc.vscode-tailwindcss diff --git a/examples/blog-tutorial/.prettierignore b/examples/blog-tutorial/.prettierignore deleted file mode 100644 index 8cb6bcbdbb0..00000000000 --- a/examples/blog-tutorial/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules - -/build -/public/build -.env - -/app/styles/tailwind.css diff --git a/examples/blog-tutorial/Dockerfile b/examples/blog-tutorial/Dockerfile deleted file mode 100644 index 0f278029f8b..00000000000 --- a/examples/blog-tutorial/Dockerfile +++ /dev/null @@ -1,59 +0,0 @@ -# base node image -FROM node:16-bullseye-slim as base - -# set for base and all layer that inherit from it -ENV NODE_ENV production - -# Install openssl for Prisma -RUN apt-get update && apt-get install -y openssl sqlite3 - -# Install all node_modules, including dev dependencies -FROM base as deps - -WORKDIR /myapp - -ADD package.json package-lock.json ./ -RUN npm install --production=false - -# Setup production node_modules -FROM base as production-deps - -WORKDIR /myapp - -COPY --from=deps /myapp/node_modules /myapp/node_modules -ADD package.json package-lock.json ./ -RUN npm prune --production - -# Build the app -FROM base as build - -WORKDIR /myapp - -COPY --from=deps /myapp/node_modules /myapp/node_modules - -ADD prisma . -RUN npx prisma generate - -ADD . . -RUN npm run build - -# Finally, build the production image with minimal footprint -FROM base - -ENV DATABASE_URL=file:/data/sqlite.db -ENV PORT="8080" -ENV NODE_ENV="production" - -# add shortcut for connecting to database CLI -RUN echo "#!/bin/sh\nset -x\nsqlite3 \$DATABASE_URL" > /usr/local/bin/database-cli && chmod +x /usr/local/bin/database-cli - -WORKDIR /myapp - -COPY --from=production-deps /myapp/node_modules /myapp/node_modules -COPY --from=build /myapp/node_modules/.prisma /myapp/node_modules/.prisma - -COPY --from=build /myapp/build /myapp/build -COPY --from=build /myapp/public /myapp/public -ADD . . - -CMD ["npm", "start"] diff --git a/examples/blog-tutorial/README.md b/examples/blog-tutorial/README.md deleted file mode 100644 index 83d9e9a5c0b..00000000000 --- a/examples/blog-tutorial/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# Remix Indie Stack - -![The Remix Indie Stack](https://repository-images.githubusercontent.com/465928257/a241fa49-bd4d-485a-a2a5-5cb8e4ee0abf) - -Learn more about [Remix Stacks](https://remix.run/stacks). - -```sh -npx create-remix --template remix-run/indie-stack -``` - -## What's in the stack - -- [Fly app deployment](https://fly.io) with [Docker](https://www.docker.com/) -- Production-ready [SQLite Database](https://sqlite.org) -- Healthcheck endpoint for [Fly backups region fallbacks](https://fly.io/docs/reference/configuration/#services-http_checks) -- [GitHub Actions](https://github.com/features/actions) for deploy on merge to production and staging environments -- Email/Password Authentication with [cookie-based sessions](https://remix.run/docs/en/v1/api/remix#createcookiesessionstorage) -- Database ORM with [Prisma](https://prisma.io) -- Styling with [Tailwind](https://tailwindcss.com/) -- End-to-end testing with [Cypress](https://cypress.io) -- Local third party request mocking with [MSW](https://mswjs.io) -- Unit testing with [Vitest](https://vitest.dev) and [Testing Library](https://testing-library.com) -- Code formatting with [Prettier](https://prettier.io) -- Linting with [ESLint](https://eslint.org) -- Static Types with [TypeScript](https://typescriptlang.org) - -Not a fan of bits of the stack? Fork it, change it, and use `npx create-remix --template your/repo`! Make it your own. - -## Quickstart - -Click this button to create a [Gitpod](https://gitpod.io) workspace with the project set up and Fly pre-installed - -[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) - -## Development - -- Initial setup: _If you just generated this project, this step has been done for you._ - - ```sh - npm run setup - ``` - -- Validate the app has been set up properly (optional): - - ```sh - npm run validate - ``` - -- Start dev server: - - ```sh - npm run dev - ``` - -This starts your app in development mode, rebuilding assets on file changes. - -The database seed script creates a new user with some data you can use to get started: - -- Email: `rachel@remix.run` -- Password: `rachelrox` - -### Relevant code: - -This is a pretty simple note-taking app, but it's a good example of how you can build a full stack app with Prisma and Remix. The main functionality is creating users, logging in and out, and creating and deleting notes. - -- creating users, and logging in and out [./app/models/user.server.ts](./app/models/user.server.ts) -- user sessions, and verifying them [./app/session.server.ts](./app/session.server.ts) -- creating, and deleting notes [./app/models/note.server.ts](./app/models/note.server.ts) - -## Deployment - -This Remix Stack comes with two GitHub Actions that handle automatically deploying your app to production and staging environments. - -Prior to your first deployment, you'll need to do a few things: - -- [Install Fly](https://fly.io/docs/getting-started/installing-flyctl/) - -- Sign up and log in to Fly - - ```sh - fly auth signup - ``` - -- Create two apps on Fly, one for staging and one for production: - - ```sh - fly create blog-tutorial-ffb5 - fly create blog-tutorial-ffb5-staging - ``` - -- Create a new [GitHub Repository](https://repo.new) - -- Add a `FLY_API_TOKEN` to your GitHub repo. To do this, go to your user settings on Fly and create a new [token](https://web.fly.io/user/personal_access_tokens/new), then add it to [your repo secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets) with the name `FLY_API_TOKEN`. - -- Add a `SESSION_SECRET` to your fly app secrets, to do this you can run the following commands: - - ```sh - fly secrets set SESSION_SECRET=$(openssl rand -hex 32) --app blog-tutorial-ffb5 - fly secrets set SESSION_SECRET=$(openssl rand -hex 32) --app blog-tutorial-ffb5-staging - ``` - - If you don't have openssl installed, you can also use [1password](https://1password.com/password-generator) to generate a random secret, just replace `$(openssl rand -hex 32)` with the generated secret. - -- Create a persistent volume for the sqlite database for both your staging and production environments. Run the following: - - ```sh - fly volumes create data --size 1 --app blog-tutorial-ffb5 - fly volumes create data --size 1 --app blog-tutorial-ffb5-staging - ``` - -Now that everything is set up, you can commit and push your changes to your repo. Every commit to your `main` branch will trigger a deployment to your production environment, and every commit to your `dev` branch will trigger a deployment to your staging environment. - -## GitHub Actions - -We use GitHub Actions for continuous integration and deployment. Anything that gets into the `main` branch will be deployed to production after running tests/build/etc. Anything in the `dev` branch will be deployed to staging. - -## Testing - -### Cypress - -We use Cypress for our End-to-End tests in this project. You'll find those in the `cypress` directory. As you make changes, add to an existing file or create a new file in the `cypress/e2e` directory to test your changes. - -We use [`@testing-library/cypress`](https://testing-library.com/cypress) for selecting elements on the page semantically. - -To run these tests in development, run `npm run test:e2e:dev` which will start the dev server for the app as well as the Cypress client. Make sure the database is running in docker as described above. - -We have a utility for testing authenticated features without having to go through the login flow: - -```ts -cy.login(); -// you are now logged in as a new user -``` - -We also have a utility to auto-delete the user at the end of your test. Just make sure to add this in each test file: - -```ts -afterEach(() => { - cy.cleanupUser(); -}); -``` - -That way, we can keep your local db clean and keep your tests isolated from one another. - -### Vitest - -For lower level tests of utilities and individual components, we use `vitest`. We have DOM-specific assertion helpers via [`@testing-library/jest-dom`](https://testing-library.com/jest-dom). - -### Type Checking - -This project uses TypeScript. It's recommended to get TypeScript set up for your editor to get a really great in-editor experience with type checking and auto-complete. To run type checking across the whole project, run `npm run typecheck`. - -### Linting - -This project uses ESLint for linting. That is configured in `.eslintrc.js`. - -### Formatting - -We use [Prettier](https://prettier.io/) for auto-formatting in this project. It's recommended to install an editor plugin (like the [VSCode Prettier plugin](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)) to get auto-formatting on save. There's also a `npm run format` script you can run to format all files in the project. diff --git a/examples/blog-tutorial/app/db.server.ts b/examples/blog-tutorial/app/db.server.ts deleted file mode 100644 index 9a34a275c83..00000000000 --- a/examples/blog-tutorial/app/db.server.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { PrismaClient } from "@prisma/client"; - -let prisma: PrismaClient; - -declare global { - var __db__: PrismaClient; -} - -// this is needed because in development we don't want to restart -// the server with every change, but we want to make sure we don't -// create a new connection to the DB with every change either. -// in production we'll have a single connection to the DB. -if (process.env.NODE_ENV === "production") { - prisma = new PrismaClient(); -} else { - if (!global.__db__) { - global.__db__ = new PrismaClient(); - } - prisma = global.__db__; -} - -export { prisma }; diff --git a/examples/blog-tutorial/app/entry.client.tsx b/examples/blog-tutorial/app/entry.client.tsx deleted file mode 100644 index 3eec1fd0a02..00000000000 --- a/examples/blog-tutorial/app/entry.client.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { RemixBrowser } from "@remix-run/react"; -import { hydrate } from "react-dom"; - -hydrate(, document); diff --git a/examples/blog-tutorial/app/entry.server.tsx b/examples/blog-tutorial/app/entry.server.tsx deleted file mode 100644 index 5afa18235cc..00000000000 --- a/examples/blog-tutorial/app/entry.server.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { EntryContext } from "@remix-run/node"; -import { RemixServer } from "@remix-run/react"; -import { renderToString } from "react-dom/server"; - -export default function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - const markup = renderToString( - - ); - - responseHeaders.set("Content-Type", "text/html"); - - return new Response("" + markup, { - status: responseStatusCode, - headers: responseHeaders, - }); -} diff --git a/examples/blog-tutorial/app/models/note.server.ts b/examples/blog-tutorial/app/models/note.server.ts deleted file mode 100644 index ba56b532eb1..00000000000 --- a/examples/blog-tutorial/app/models/note.server.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { User, Note } from "@prisma/client"; - -import { prisma } from "~/db.server"; - -export type { Note } from "@prisma/client"; - -export function getNote({ - id, - userId, -}: Pick & { - userId: User["id"]; -}) { - return prisma.note.findFirst({ - where: { id, userId }, - }); -} - -export function getNoteListItems({ userId }: { userId: User["id"] }) { - return prisma.note.findMany({ - where: { userId }, - select: { id: true, title: true }, - orderBy: { updatedAt: "desc" }, - }); -} - -export function createNote({ - body, - title, - userId, -}: Pick & { - userId: User["id"]; -}) { - return prisma.note.create({ - data: { - title, - body, - user: { - connect: { - id: userId, - }, - }, - }, - }); -} - -export function deleteNote({ - id, - userId, -}: Pick & { userId: User["id"] }) { - return prisma.note.deleteMany({ - where: { id, userId }, - }); -} diff --git a/examples/blog-tutorial/app/models/post.server.ts b/examples/blog-tutorial/app/models/post.server.ts deleted file mode 100644 index 66dc324f29b..00000000000 --- a/examples/blog-tutorial/app/models/post.server.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { prisma } from "~/db.server"; -import type { Post } from "@prisma/client"; -export type { Post }; - -export async function getPosts() { - return prisma.post.findMany(); -} - -export async function getPost(slug: string) { - return prisma.post.findUnique({ where: { slug } }); -} - -export async function createPost( - post: Pick -) { - return prisma.post.create({ data: post }); -} diff --git a/examples/blog-tutorial/app/models/user.server.ts b/examples/blog-tutorial/app/models/user.server.ts deleted file mode 100644 index 645da047587..00000000000 --- a/examples/blog-tutorial/app/models/user.server.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { Password, User } from "@prisma/client"; -import bcrypt from "@node-rs/bcrypt"; - -import { prisma } from "~/db.server"; - -export type { User } from "@prisma/client"; - -export async function getUserById(id: User["id"]) { - return prisma.user.findUnique({ where: { id } }); -} - -export async function getUserByEmail(email: User["email"]) { - return prisma.user.findUnique({ where: { email } }); -} - -export async function createUser(email: User["email"], password: string) { - const hashedPassword = await bcrypt.hash(password, 10); - - return prisma.user.create({ - data: { - email, - password: { - create: { - hash: hashedPassword, - }, - }, - }, - }); -} - -export async function deleteUserByEmail(email: User["email"]) { - return prisma.user.delete({ where: { email } }); -} - -export async function verifyLogin( - email: User["email"], - password: Password["hash"] -) { - const userWithPassword = await prisma.user.findUnique({ - where: { email }, - include: { - password: true, - }, - }); - - if (!userWithPassword || !userWithPassword.password) { - return null; - } - - const isValid = await bcrypt.verify(password, userWithPassword.password.hash); - - if (!isValid) { - return null; - } - - const { password: _password, ...userWithoutPassword } = userWithPassword; - - return userWithoutPassword; -} diff --git a/examples/blog-tutorial/app/root.tsx b/examples/blog-tutorial/app/root.tsx deleted file mode 100644 index 90204ff8aa2..00000000000 --- a/examples/blog-tutorial/app/root.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { - LinksFunction, - LoaderFunction, - MetaFunction, -} from "@remix-run/node"; -import { json } from "@remix-run/node"; -import { - Links, - LiveReload, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "@remix-run/react"; - -import tailwindStylesheetUrl from "./styles/tailwind.css"; -import { getUser } from "./session.server"; - -export const links: LinksFunction = () => { - return [{ rel: "stylesheet", href: tailwindStylesheetUrl }]; -}; - -export const meta: MetaFunction = () => ({ - charset: "utf-8", - title: "Remix Notes", - viewport: "width=device-width,initial-scale=1", -}); - -type LoaderData = { - user: Awaited>; -}; - -export const loader: LoaderFunction = async ({ request }) => { - return json({ - user: await getUser(request), - }); -}; - -export default function App() { - return ( - - - - - - - - - - - - - ); -} diff --git a/examples/blog-tutorial/app/routes/healthcheck.tsx b/examples/blog-tutorial/app/routes/healthcheck.tsx deleted file mode 100644 index 01a8ef089a1..00000000000 --- a/examples/blog-tutorial/app/routes/healthcheck.tsx +++ /dev/null @@ -1,25 +0,0 @@ -// learn more: https://fly.io/docs/reference/configuration/#services-http_checks -import type { LoaderFunction } from "@remix-run/node"; - -import { prisma } from "~/db.server"; - -export const loader: LoaderFunction = async ({ request }) => { - const host = - request.headers.get("X-Forwarded-Host") ?? request.headers.get("host"); - - try { - const url = new URL("/", `http://${host}`); - // if we can connect to the database and make a simple query - // and make a HEAD request to ourselves, then we're good. - await Promise.all([ - prisma.user.count(), - fetch(url.toString(), { method: "HEAD" }).then((r) => { - if (!r.ok) return Promise.reject(r); - }), - ]); - return new Response("OK"); - } catch (error: unknown) { - console.log("healthcheck ❌", { error }); - return new Response("ERROR", { status: 500 }); - } -}; diff --git a/examples/blog-tutorial/app/routes/index.tsx b/examples/blog-tutorial/app/routes/index.tsx deleted file mode 100644 index e044792ad09..00000000000 --- a/examples/blog-tutorial/app/routes/index.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { Link } from "@remix-run/react"; - -import { useOptionalUser } from "~/utils"; - -export default function Index() { - const user = useOptionalUser(); - return ( -
-
-
-
-
- Sonic Youth On Stage -
-
-
-

- - Indie Stack - -

-

- Check the README.md file for instructions on how to get this - project deployed. -

-
- {user ? ( - - View Notes for {user.email} - - ) : ( -
- - Sign up - - - Log In - -
- )} -
- - Remix - -
-
-
- -
- - Blog Posts - -
- -
-
- {[ - { - src: "https://user-images.githubusercontent.com/1500684/157764397-ccd8ea10-b8aa-4772-a99b-35de937319e1.svg", - alt: "Fly.io", - href: "https://fly.io", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157764395-137ec949-382c-43bd-a3c0-0cb8cb22e22d.svg", - alt: "SQLite", - href: "https://sqlite.org", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157764484-ad64a21a-d7fb-47e3-8669-ec046da20c1f.svg", - alt: "Prisma", - href: "https://prisma.io", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157764276-a516a239-e377-4a20-b44a-0ac7b65c8c14.svg", - alt: "Tailwind", - href: "https://tailwindcss.com", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157764454-48ac8c71-a2a9-4b5e-b19c-edef8b8953d6.svg", - alt: "Cypress", - href: "https://www.cypress.io", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157772386-75444196-0604-4340-af28-53b236faa182.svg", - alt: "MSW", - href: "https://mswjs.io", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157772447-00fccdce-9d12-46a3-8bb4-fac612cdc949.svg", - alt: "Vitest", - href: "https://vitest.dev", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157772662-92b0dd3a-453f-4d18-b8be-9fa6efde52cf.png", - alt: "Testing Library", - href: "https://testing-library.com", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157772934-ce0a943d-e9d0-40f8-97f3-f464c0811643.svg", - alt: "Prettier", - href: "https://prettier.io", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157772990-3968ff7c-b551-4c55-a25c-046a32709a8e.svg", - alt: "ESLint", - href: "https://eslint.org", - }, - { - src: "https://user-images.githubusercontent.com/1500684/157773063-20a0ed64-b9f8-4e0b-9d1e-0b65a3d4a6db.svg", - alt: "TypeScript", - href: "https://typescriptlang.org", - }, - ].map((img) => ( - - {img.alt} - - ))} -
-
-
-
- ); -} diff --git a/examples/blog-tutorial/app/routes/join.tsx b/examples/blog-tutorial/app/routes/join.tsx deleted file mode 100644 index cd186ad0184..00000000000 --- a/examples/blog-tutorial/app/routes/join.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import type { - ActionFunction, - LoaderFunction, - MetaFunction, -} from "@remix-run/node"; -import { json, redirect } from "@remix-run/node"; -import { Form, Link, useActionData, useSearchParams } from "@remix-run/react"; -import * as React from "react"; - -import { createUser, getUserByEmail } from "~/models/user.server"; -import { getUserId, createUserSession } from "~/session.server"; -import { safeRedirect, validateEmail } from "~/utils"; - -export const loader: LoaderFunction = async ({ request }) => { - const userId = await getUserId(request); - if (userId) return redirect("/"); - return json({}); -}; - -interface ActionData { - errors: { - email?: string; - password?: string; - }; -} - -export const action: ActionFunction = async ({ request }) => { - const formData = await request.formData(); - const email = formData.get("email"); - const password = formData.get("password"); - const redirectTo = safeRedirect(formData.get("redirectTo"), "/"); - - if (!validateEmail(email)) { - return json( - { errors: { email: "Email is invalid" } }, - { status: 400 } - ); - } - - if (typeof password !== "string") { - return json( - { errors: { password: "Password is required" } }, - { status: 400 } - ); - } - - if (password.length < 8) { - return json( - { errors: { password: "Password is too short" } }, - { status: 400 } - ); - } - - const existingUser = await getUserByEmail(email); - if (existingUser) { - return json( - { errors: { email: "A user already exists with this email" } }, - { status: 400 } - ); - } - - const user = await createUser(email, password); - - return createUserSession({ - request, - userId: user.id, - remember: false, - redirectTo, - }); -}; - -export const meta: MetaFunction = () => { - return { - title: "Sign Up", - }; -}; - -export default function Join() { - const [searchParams] = useSearchParams(); - const redirectTo = searchParams.get("redirectTo") ?? undefined; - const actionData = useActionData() as ActionData; - const emailRef = React.useRef(null); - const passwordRef = React.useRef(null); - - React.useEffect(() => { - if (actionData?.errors?.email) { - emailRef.current?.focus(); - } else if (actionData?.errors?.password) { - passwordRef.current?.focus(); - } - }, [actionData]); - - return ( -
-
-
-
- -
- - {actionData?.errors?.email && ( -
- {actionData.errors.email} -
- )} -
-
- -
- -
- - {actionData?.errors?.password && ( -
- {actionData.errors.password} -
- )} -
-
- - - -
-
- Already have an account?{" "} - - Log in - -
-
-
-
-
- ); -} diff --git a/examples/blog-tutorial/app/routes/login.tsx b/examples/blog-tutorial/app/routes/login.tsx deleted file mode 100644 index 341216553ea..00000000000 --- a/examples/blog-tutorial/app/routes/login.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import type { - ActionFunction, - LoaderFunction, - MetaFunction, -} from "@remix-run/node"; -import { json, redirect } from "@remix-run/node"; -import { Form, Link, useActionData, useSearchParams } from "@remix-run/react"; -import * as React from "react"; - -import { createUserSession, getUserId } from "~/session.server"; -import { verifyLogin } from "~/models/user.server"; -import { safeRedirect, validateEmail } from "~/utils"; - -export const loader: LoaderFunction = async ({ request }) => { - const userId = await getUserId(request); - if (userId) return redirect("/"); - return json({}); -}; - -interface ActionData { - errors?: { - email?: string; - password?: string; - }; -} - -export const action: ActionFunction = async ({ request }) => { - const formData = await request.formData(); - const email = formData.get("email"); - const password = formData.get("password"); - const redirectTo = safeRedirect(formData.get("redirectTo"), "/notes"); - const remember = formData.get("remember"); - - if (!validateEmail(email)) { - return json( - { errors: { email: "Email is invalid" } }, - { status: 400 } - ); - } - - if (typeof password !== "string") { - return json( - { errors: { password: "Password is required" } }, - { status: 400 } - ); - } - - if (password.length < 8) { - return json( - { errors: { password: "Password is too short" } }, - { status: 400 } - ); - } - - const user = await verifyLogin(email, password); - - if (!user) { - return json( - { errors: { email: "Invalid email or password" } }, - { status: 400 } - ); - } - - return createUserSession({ - request, - userId: user.id, - remember: remember === "on" ? true : false, - redirectTo, - }); -}; - -export const meta: MetaFunction = () => { - return { - title: "Login", - }; -}; - -export default function LoginPage() { - const [searchParams] = useSearchParams(); - const redirectTo = searchParams.get("redirectTo") || "/notes"; - const actionData = useActionData() as ActionData; - const emailRef = React.useRef(null); - const passwordRef = React.useRef(null); - - React.useEffect(() => { - if (actionData?.errors?.email) { - emailRef.current?.focus(); - } else if (actionData?.errors?.password) { - passwordRef.current?.focus(); - } - }, [actionData]); - - return ( -
-
-
-
- -
- - {actionData?.errors?.email && ( -
- {actionData.errors.email} -
- )} -
-
- -
- -
- - {actionData?.errors?.password && ( -
- {actionData.errors.password} -
- )} -
-
- - - -
-
- - -
-
- Don't have an account?{" "} - - Sign up - -
-
-
-
-
- ); -} diff --git a/examples/blog-tutorial/app/routes/logout.tsx b/examples/blog-tutorial/app/routes/logout.tsx deleted file mode 100644 index 04ceac2b97c..00000000000 --- a/examples/blog-tutorial/app/routes/logout.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import type { ActionFunction, LoaderFunction } from "@remix-run/node"; -import { redirect } from "@remix-run/node"; - -import { logout } from "~/session.server"; - -export const action: ActionFunction = async ({ request }) => { - return logout(request); -}; - -export const loader: LoaderFunction = async () => { - return redirect("/"); -}; diff --git a/examples/blog-tutorial/app/routes/notes.tsx b/examples/blog-tutorial/app/routes/notes.tsx deleted file mode 100644 index 0860147a405..00000000000 --- a/examples/blog-tutorial/app/routes/notes.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import type { LoaderFunction } from "@remix-run/node"; -import { json } from "@remix-run/node"; -import { Form, Link, NavLink, Outlet, useLoaderData } from "@remix-run/react"; - -import { requireUserId } from "~/session.server"; -import { useUser } from "~/utils"; -import { getNoteListItems } from "~/models/note.server"; - -type LoaderData = { - noteListItems: Awaited>; -}; - -export const loader: LoaderFunction = async ({ request }) => { - const userId = await requireUserId(request); - const noteListItems = await getNoteListItems({ userId }); - return json({ noteListItems }); -}; - -export default function NotesPage() { - const data = useLoaderData() as LoaderData; - const user = useUser(); - - return ( -
-
-

- Notes -

-

{user.email}

-
- -
-
- -
-
- - + New Note - - -
- - {data.noteListItems.length === 0 ? ( -

No notes yet

- ) : ( -
    - {data.noteListItems.map((note) => ( -
  1. - - `block border-b p-4 text-xl ${isActive ? "bg-white" : ""}` - } - to={note.id} - > - πŸ“ {note.title} - -
  2. - ))} -
- )} -
- -
- -
-
-
- ); -} diff --git a/examples/blog-tutorial/app/routes/notes/$noteId.tsx b/examples/blog-tutorial/app/routes/notes/$noteId.tsx deleted file mode 100644 index fe5ee262e99..00000000000 --- a/examples/blog-tutorial/app/routes/notes/$noteId.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import type { ActionFunction, LoaderFunction } from "@remix-run/node"; -import { json, redirect } from "@remix-run/node"; -import { Form, useCatch, useLoaderData } from "@remix-run/react"; -import invariant from "tiny-invariant"; - -import type { Note } from "~/models/note.server"; -import { deleteNote } from "~/models/note.server"; -import { getNote } from "~/models/note.server"; -import { requireUserId } from "~/session.server"; - -type LoaderData = { - note: Note; -}; - -export const loader: LoaderFunction = async ({ request, params }) => { - const userId = await requireUserId(request); - invariant(params.noteId, "noteId not found"); - - const note = await getNote({ userId, id: params.noteId }); - if (!note) { - throw new Response("Not Found", { status: 404 }); - } - return json({ note }); -}; - -export const action: ActionFunction = async ({ request, params }) => { - const userId = await requireUserId(request); - invariant(params.noteId, "noteId not found"); - - await deleteNote({ userId, id: params.noteId }); - - return redirect("/notes"); -}; - -export default function NoteDetailsPage() { - const data = useLoaderData() as LoaderData; - - return ( -
-

{data.note.title}

-

{data.note.body}

-
-
- -
-
- ); -} - -export function ErrorBoundary({ error }: { error: Error }) { - console.error(error); - - return
An unexpected error occurred: {error.message}
; -} - -export function CatchBoundary() { - const caught = useCatch(); - - if (caught.status === 404) { - return
Note not found
; - } - - throw new Error(`Unexpected caught response with status: ${caught.status}`); -} diff --git a/examples/blog-tutorial/app/routes/notes/index.tsx b/examples/blog-tutorial/app/routes/notes/index.tsx deleted file mode 100644 index aa858a994d7..00000000000 --- a/examples/blog-tutorial/app/routes/notes/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Link } from "@remix-run/react"; - -export default function NoteIndexPage() { - return ( -

- No note selected. Select a note on the left, or{" "} - - create a new note. - -

- ); -} diff --git a/examples/blog-tutorial/app/routes/notes/new.tsx b/examples/blog-tutorial/app/routes/notes/new.tsx deleted file mode 100644 index ca10cdcf849..00000000000 --- a/examples/blog-tutorial/app/routes/notes/new.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import Alert from "@reach/alert"; -import type { ActionFunction } from "@remix-run/node"; -import { json, redirect } from "@remix-run/node"; -import { Form, useActionData } from "@remix-run/react"; -import * as React from "react"; - -import { createNote } from "~/models/note.server"; -import { requireUserId } from "~/session.server"; - -type ActionData = { - errors?: { - title?: string; - body?: string; - }; -}; - -export const action: ActionFunction = async ({ request }) => { - const userId = await requireUserId(request); - - const formData = await request.formData(); - const title = formData.get("title"); - const body = formData.get("body"); - - if (typeof title !== "string" || title.length === 0) { - return json( - { errors: { title: "Title is required" } }, - { status: 400 } - ); - } - - if (typeof body !== "string" || body.length === 0) { - return json( - { errors: { body: "Body is required" } }, - { status: 400 } - ); - } - - const note = await createNote({ title, body, userId }); - - return redirect(`/notes/${note.id}`); -}; - -export default function NewNotePage() { - const actionData = useActionData() as ActionData; - const titleRef = React.useRef(null); - const bodyRef = React.useRef(null); - - React.useEffect(() => { - if (actionData?.errors?.title) { - titleRef.current?.focus(); - } else if (actionData?.errors?.body) { - bodyRef.current?.focus(); - } - }, [actionData]); - - return ( -
-
- - {actionData?.errors?.title && ( - - {actionData.errors.title} - - )} -
- -
-
-
- - -
-
- -
-
- {actionData?.message && ( -
{actionData.message}
- )} - - - - - - - ); -} diff --git a/examples/client-side-validation/package.json b/examples/client-side-validation/package.json deleted file mode 100644 index e4efeed7ccb..00000000000 --- a/examples/client-side-validation/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "private": true, - "sideEffects": false, - "scripts": { - "build": "remix build", - "dev": "remix dev", - "start": "remix-serve build" - }, - "dependencies": { - "@remix-run/node": "1.6.4", - "@remix-run/react": "1.6.4", - "@remix-run/serve": "1.6.4", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@remix-run/dev": "1.6.4", - "@remix-run/eslint-config": "1.6.4", - "@types/react": "^17.0.39", - "@types/react-dom": "^17.0.13", - "eslint": "^8.10.0", - "typescript": "^4.7.4" - }, - "engines": { - "node": ">=14" - } -} diff --git a/examples/client-side-validation/public/favicon.ico b/examples/client-side-validation/public/favicon.ico deleted file mode 100644 index 8830cf6821b354114848e6354889b8ecf6d2bc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 EKbET!0{{R3 diff --git a/examples/client-side-validation/remix.config.js b/examples/client-side-validation/remix.config.js deleted file mode 100644 index adf2a0b5d3e..00000000000 --- a/examples/client-side-validation/remix.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@remix-run/dev').AppConfig} */ -module.exports = { - ignoredRouteFiles: ["**/.*"], - // appDirectory: "app", - // assetsBuildDirectory: "public/build", - // serverBuildPath: "build/index.js", - // publicPath: "/build/", -}; diff --git a/examples/client-side-validation/remix.env.d.ts b/examples/client-side-validation/remix.env.d.ts deleted file mode 100644 index 72e2affe311..00000000000 --- a/examples/client-side-validation/remix.env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/examples/client-side-validation/sandbox.config.json b/examples/client-side-validation/sandbox.config.json deleted file mode 100644 index 4363d87a30d..00000000000 --- a/examples/client-side-validation/sandbox.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "hardReloadOnChange": true, - "container": { - "port": 3000 - } -} diff --git a/examples/client-side-validation/tsconfig.json b/examples/client-side-validation/tsconfig.json deleted file mode 100644 index 20f8a386a6c..00000000000 --- a/examples/client-side-validation/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], - "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2019"], - "isolatedModules": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "moduleResolution": "node", - "resolveJsonModule": true, - "target": "ES2019", - "strict": true, - "allowJs": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", - "paths": { - "~/*": ["./app/*"] - }, - - // Remix takes care of building everything in `remix build`. - "noEmit": true - } -} diff --git a/examples/collected-notes/.env.example b/examples/collected-notes/.env.example deleted file mode 100644 index 5b59b808d83..00000000000 --- a/examples/collected-notes/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -CN_EMAIL= -CN_TOKEN= -CN_SITE_PATH= \ No newline at end of file diff --git a/examples/collected-notes/.eslintrc.js b/examples/collected-notes/.eslintrc.js deleted file mode 100644 index ced78085f86..00000000000 --- a/examples/collected-notes/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], -}; diff --git a/examples/collected-notes/.gitignore b/examples/collected-notes/.gitignore deleted file mode 100644 index 3f7bf98da3e..00000000000 --- a/examples/collected-notes/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules - -/.cache -/build -/public/build -.env diff --git a/examples/collected-notes/README.md b/examples/collected-notes/README.md deleted file mode 100644 index 07cb8e71d82..00000000000 --- a/examples/collected-notes/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# CMS Collected Notes - -Shows how to use the Collected Notes CMS as a Headless CMS to provide content of a Remix app. - -## Preview - -Open this example on [CodeSandbox](https://codesandbox.com): - -[![Open in CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/remix-run/remix/tree/main/examples/collected-notes) - -## Example - -The example creates a `cn.server.ts` file to create the Collected notes API client instance. - -The route `/` shows the Collected Notes site and list of notes, a search form to use the Collected Notes search API and basic next/prev pagination at the end of the list. - -There's then a `/:slug` URL to show the note content. - -## Related Links - -- [Collected Notes](https://collectednotes.com) -- [API Docs](https://collectednotes.com/blog/api) -- [TS API Client](https://github.com/sergiodxa/collected-notes) diff --git a/examples/collected-notes/app/cn.server.ts b/examples/collected-notes/app/cn.server.ts deleted file mode 100644 index a67a64ed9e0..00000000000 --- a/examples/collected-notes/app/cn.server.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { collectedNotes } from "collected-notes"; - -const email = process.env.CN_EMAIL; -const token = process.env.CN_TOKEN; - -if (!email || !token) { - throw new Error( - "Missing environment variables CN_EMAIL and CN_TOKEN and CN_SITE" - ); -} - -if (!process.env.CN_SITE_PATH) { - throw new Error("Missing environment variable CN_SITE_PATH"); -} - -export const cn = collectedNotes(email, token); - -export const sitePath = process.env.CN_SITE_PATH!; diff --git a/examples/collected-notes/app/entry.client.tsx b/examples/collected-notes/app/entry.client.tsx deleted file mode 100644 index 3eec1fd0a02..00000000000 --- a/examples/collected-notes/app/entry.client.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { RemixBrowser } from "@remix-run/react"; -import { hydrate } from "react-dom"; - -hydrate(, document); diff --git a/examples/collected-notes/app/entry.server.tsx b/examples/collected-notes/app/entry.server.tsx deleted file mode 100644 index 5afa18235cc..00000000000 --- a/examples/collected-notes/app/entry.server.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { EntryContext } from "@remix-run/node"; -import { RemixServer } from "@remix-run/react"; -import { renderToString } from "react-dom/server"; - -export default function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - const markup = renderToString( - - ); - - responseHeaders.set("Content-Type", "text/html"); - - return new Response("" + markup, { - status: responseStatusCode, - headers: responseHeaders, - }); -} diff --git a/examples/collected-notes/app/root.tsx b/examples/collected-notes/app/root.tsx deleted file mode 100644 index 927a0f745df..00000000000 --- a/examples/collected-notes/app/root.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { MetaFunction } from "@remix-run/node"; -import { - Links, - LiveReload, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "@remix-run/react"; - -export const meta: MetaFunction = () => ({ - charset: "utf-8", - title: "New Remix App", - viewport: "width=device-width,initial-scale=1", -}); - -export default function App() { - return ( - - - - - - - - - - - - - ); -} diff --git a/examples/collected-notes/app/routes/$slug.tsx b/examples/collected-notes/app/routes/$slug.tsx deleted file mode 100644 index 8e5f7068c99..00000000000 --- a/examples/collected-notes/app/routes/$slug.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import type { LoaderFunction } from "@remix-run/node"; -import { json } from "@remix-run/node"; -import { useLoaderData } from "@remix-run/react"; -import type { HTML } from "collected-notes"; - -import { cn, sitePath } from "~/cn.server"; - -type LoaderData = { - body: HTML; -}; - -export const loader: LoaderFunction = async ({ params }) => { - const slug = params.slug; - if (typeof slug !== "string") throw new Error("Missing slug"); - const { body } = await cn.body(sitePath, slug); - return json({ body }); -}; - -export default function Screen() { - const { body } = useLoaderData(); - return ( -
-
-
- ); -} diff --git a/examples/collected-notes/app/routes/index.tsx b/examples/collected-notes/app/routes/index.tsx deleted file mode 100644 index 087871e1dea..00000000000 --- a/examples/collected-notes/app/routes/index.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import type { LoaderFunction } from "@remix-run/node"; -import { json } from "@remix-run/node"; -import { Form, Link, useLoaderData, useSearchParams } from "@remix-run/react"; -import type { Note, Site } from "collected-notes"; - -import { cn, sitePath } from "~/cn.server"; - -type LoaderData = { - site: Site; - notes: Note[]; -}; - -export const loader: LoaderFunction = async ({ request }) => { - const url = new URL(request.url); - const term = url.searchParams.get("term") || ""; - const page = Number(url.searchParams.get("page") || "1"); - - const hasSearch = term.trim().length > 0; - - const [notes = [], { site }] = await Promise.all([ - hasSearch - ? cn.search(sitePath, term, page, "public_site") - : cn.latestNotes(sitePath, page, "public_site"), - cn.site(sitePath), - ]); - - return json({ notes, site }); -}; - -export default function Screen() { - const { site, notes } = useLoaderData(); - const [params] = useSearchParams(); - const term = params.get("term") || ""; - const page = Number(params.get("page") || "1"); - console.log(notes); - return ( -
-
-

{site.name}

-

{site.headline}

-
- -
- - - -
- -
    - {notes.map((note) => { - return ( -
  • - {note.title} -

    {note.headline}

    - -
  • - ); - })} -
- - {page > 1 ? ( - Previous Page - ) : null} - - {notes.length === 40 ? ( - Next Page - ) : null} -
- ); -} diff --git a/examples/collected-notes/package.json b/examples/collected-notes/package.json deleted file mode 100644 index f1e258366a3..00000000000 --- a/examples/collected-notes/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "private": true, - "sideEffects": false, - "scripts": { - "build": "remix build", - "dev": "remix dev", - "start": "remix-serve build" - }, - "dependencies": { - "@remix-run/node": "1.6.4", - "@remix-run/react": "1.6.4", - "@remix-run/serve": "1.6.4", - "collected-notes": "^2.3.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@remix-run/dev": "1.6.4", - "@remix-run/eslint-config": "1.6.4", - "@types/react": "^17.0.39", - "@types/react-dom": "^17.0.13", - "eslint": "^8.10.0", - "typescript": "^4.7.4" - }, - "engines": { - "node": ">=14" - } -} diff --git a/examples/collected-notes/public/favicon.ico b/examples/collected-notes/public/favicon.ico deleted file mode 100644 index 8830cf6821b354114848e6354889b8ecf6d2bc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 EKbET!0{{R3 diff --git a/examples/collected-notes/remix.config.js b/examples/collected-notes/remix.config.js deleted file mode 100644 index adf2a0b5d3e..00000000000 --- a/examples/collected-notes/remix.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@remix-run/dev').AppConfig} */ -module.exports = { - ignoredRouteFiles: ["**/.*"], - // appDirectory: "app", - // assetsBuildDirectory: "public/build", - // serverBuildPath: "build/index.js", - // publicPath: "/build/", -}; diff --git a/examples/collected-notes/remix.env.d.ts b/examples/collected-notes/remix.env.d.ts deleted file mode 100644 index 72e2affe311..00000000000 --- a/examples/collected-notes/remix.env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/examples/collected-notes/sandbox.config.json b/examples/collected-notes/sandbox.config.json deleted file mode 100644 index 4363d87a30d..00000000000 --- a/examples/collected-notes/sandbox.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "hardReloadOnChange": true, - "container": { - "port": 3000 - } -} diff --git a/examples/collected-notes/tsconfig.json b/examples/collected-notes/tsconfig.json deleted file mode 100644 index 20f8a386a6c..00000000000 --- a/examples/collected-notes/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], - "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2019"], - "isolatedModules": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "moduleResolution": "node", - "resolveJsonModule": true, - "target": "ES2019", - "strict": true, - "allowJs": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", - "paths": { - "~/*": ["./app/*"] - }, - - // Remix takes care of building everything in `remix build`. - "noEmit": true - } -} diff --git a/examples/combobox-resource-route/.eslintrc.js b/examples/combobox-resource-route/.eslintrc.js deleted file mode 100644 index ced78085f86..00000000000 --- a/examples/combobox-resource-route/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], -}; diff --git a/examples/combobox-resource-route/.gitignore b/examples/combobox-resource-route/.gitignore deleted file mode 100644 index 3f7bf98da3e..00000000000 --- a/examples/combobox-resource-route/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules - -/.cache -/build -/public/build -.env diff --git a/examples/combobox-resource-route/README.md b/examples/combobox-resource-route/README.md deleted file mode 100644 index b4092be4be8..00000000000 --- a/examples/combobox-resource-route/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Reach UI Combobox + Remix demo. - -This demo illustrates how to integrate Reach UI Combobox with Remix. - -## Preview - -Open this example on [CodeSandbox](https://codesandbox.com): - -[![Open in CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/remix-run/remix/tree/main/examples/combobox-resource-route) - -## Example - -As the user types into the input field, a fetcher loads suggestions from the server. - -The relevant files are: - -- app/routes/index.tsx - The UI route with the combobox. -- app/routes/lang-search.tsx - The Resource Route that searches languages. -- app/models/langs.ts - The "model" that holds the languages data and knows how to search it. - -## Related Links - -- [useFetcher](https://remix.run/api/remix#usefetcher) -- [Resource Routes](https://remix.run/guides/resource-routes) -- [Reach UI Combobox](https://reach.tech/combobox) diff --git a/examples/combobox-resource-route/app/app.css b/examples/combobox-resource-route/app/app.css deleted file mode 100644 index 0afa3007758..00000000000 --- a/examples/combobox-resource-route/app/app.css +++ /dev/null @@ -1,34 +0,0 @@ -body { - font-family: system-ui, sans-serif; - line-height: 1.4; -} - -.combobox-wrapper { - position: relative; - width: 20rem; -} - -.spinner { - height: 1rem; - width: 1rem; - animation: spin 1s infinite linear; - position: absolute; - top: 0.5rem; - right: 0.5rem; -} - -[data-reach-combobox-input] { - font-size: inherit; - padding: 0.25rem 2rem 0.25rem 0.5rem; - width: 100%; - box-sizing: border-box; -} - -@keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/examples/combobox-resource-route/app/entry.client.tsx b/examples/combobox-resource-route/app/entry.client.tsx deleted file mode 100644 index 3eec1fd0a02..00000000000 --- a/examples/combobox-resource-route/app/entry.client.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { RemixBrowser } from "@remix-run/react"; -import { hydrate } from "react-dom"; - -hydrate(, document); diff --git a/examples/combobox-resource-route/app/entry.server.tsx b/examples/combobox-resource-route/app/entry.server.tsx deleted file mode 100644 index 5afa18235cc..00000000000 --- a/examples/combobox-resource-route/app/entry.server.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { EntryContext } from "@remix-run/node"; -import { RemixServer } from "@remix-run/react"; -import { renderToString } from "react-dom/server"; - -export default function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - const markup = renderToString( - - ); - - responseHeaders.set("Content-Type", "text/html"); - - return new Response("" + markup, { - status: responseStatusCode, - headers: responseHeaders, - }); -} diff --git a/examples/combobox-resource-route/app/models/langs.ts b/examples/combobox-resource-route/app/models/langs.ts deleted file mode 100644 index 12e26775010..00000000000 --- a/examples/combobox-resource-route/app/models/langs.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { matchSorter } from "match-sorter"; - -/** - * This is just matching a hard-coded list of values, but often you'd be - * querying your database for a set of records. If you're using prisma with - * postgres, you can use "fulltext" to let the database make it really fast for - * you: - * https://www.prisma.io/docs/concepts/components/prisma-client/full-text-search - */ -export async function searchLangs(query: string) { - // artificially slowed down and chaotic where some requests start earlier but - // land later, this is a condition many apps don't consider but Remix handles - // for you automatically. Open the network tab and watch as Remix - // automatically cancels the requests as they're interrupted. - await new Promise((res) => setTimeout(res, Math.random() * 1000)); - return matchSorter(langs, query, { keys: ["alpha2", "name"] }); -} - -const langs = [ - { name: "Afar", alpha2: "aa" }, - { name: "Abkhazian", alpha2: "ab" }, - { name: "Avestan", alpha2: "ae" }, - { name: "Afrikaans", alpha2: "af" }, - { name: "Akan", alpha2: "ak" }, - { name: "Amharic", alpha2: "am" }, - { name: "Aragonese", alpha2: "an" }, - { name: "Arabic", alpha2: "ar" }, - { name: "Assamese", alpha2: "as" }, - { name: "Avaric", alpha2: "av" }, - { name: "Aymara", alpha2: "ay" }, - { name: "Azerbaijani", alpha2: "az" }, - { name: "Bashkir", alpha2: "ba" }, - { name: "Belarusian", alpha2: "be" }, - { name: "Bulgarian", alpha2: "bg" }, - { name: "Bihari languages", alpha2: "bh" }, - { name: "Bislama", alpha2: "bi" }, - { name: "Bambara", alpha2: "bm" }, - { name: "Bengali", alpha2: "bn" }, - { name: "Tibetan", alpha2: "bo" }, - { name: "Breton", alpha2: "br" }, - { name: "Bosnian", alpha2: "bs" }, - { name: "Catalan; Valencian", alpha2: "ca" }, - { name: "Chechen", alpha2: "ce" }, - { name: "Chamorro", alpha2: "ch" }, - { name: "Corsican", alpha2: "co" }, - { name: "Cree", alpha2: "cr" }, - { name: "Czech", alpha2: "cs" }, - { - name: "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic", - alpha2: "cu", - }, - { name: "Chuvash", alpha2: "cv" }, - { name: "Welsh", alpha2: "cy" }, - { name: "Danish", alpha2: "da" }, - { name: "German", alpha2: "de" }, - { name: "Divehi; Dhivehi; Maldivian", alpha2: "dv" }, - { name: "Dzongkha", alpha2: "dz" }, - { name: "Ewe", alpha2: "ee" }, - { name: "Greek, Modern (1453-)", alpha2: "el" }, - { name: "English", alpha2: "en" }, - { name: "Esperanto", alpha2: "eo" }, - { name: "Spanish; Castilian", alpha2: "es" }, - { name: "Estonian", alpha2: "et" }, - { name: "Basque", alpha2: "eu" }, - { name: "Persian", alpha2: "fa" }, - { name: "Fulah", alpha2: "ff" }, - { name: "Finnish", alpha2: "fi" }, - { name: "Fijian", alpha2: "fj" }, - { name: "Faroese", alpha2: "fo" }, - { name: "French", alpha2: "fr" }, - { name: "Western Frisian", alpha2: "fy" }, - { name: "Irish", alpha2: "ga" }, - { name: "Gaelic; Scottish Gaelic", alpha2: "gd" }, - { name: "Galician", alpha2: "gl" }, - { name: "Guarani", alpha2: "gn" }, - { name: "Gujarati", alpha2: "gu" }, - { name: "Manx", alpha2: "gv" }, - { name: "Hausa", alpha2: "ha" }, - { name: "Hebrew", alpha2: "he" }, - { name: "Hindi", alpha2: "hi" }, - { name: "Hiri Motu", alpha2: "ho" }, - { name: "Croatian", alpha2: "hr" }, - { name: "Haitian; Haitian Creole", alpha2: "ht" }, - { name: "Hungarian", alpha2: "hu" }, - { name: "Armenian", alpha2: "hy" }, - { name: "Herero", alpha2: "hz" }, - { - name: "Interlingua (International Auxiliary Language Association)", - alpha2: "ia", - }, - { name: "Indonesian", alpha2: "id" }, - { name: "Interlingue; Occidental", alpha2: "ie" }, - { name: "Igbo", alpha2: "ig" }, - { name: "Sichuan Yi; Nuosu", alpha2: "ii" }, - { name: "Inupiaq", alpha2: "ik" }, - { name: "Ido", alpha2: "io" }, - { name: "Icelandic", alpha2: "is" }, - { name: "Italian", alpha2: "it" }, - { name: "Inuktitut", alpha2: "iu" }, - { name: "Japanese", alpha2: "ja" }, - { name: "Javanese", alpha2: "jv" }, - { name: "Georgian", alpha2: "ka" }, - { name: "Kongo", alpha2: "kg" }, - { name: "Kikuyu; Gikuyu", alpha2: "ki" }, - { name: "Kuanyama; Kwanyama", alpha2: "kj" }, - { name: "Kazakh", alpha2: "kk" }, - { name: "Kalaallisut; Greenlandic", alpha2: "kl" }, - { name: "Central Khmer", alpha2: "km" }, - { name: "Kannada", alpha2: "kn" }, - { name: "Korean", alpha2: "ko" }, - { name: "Kanuri", alpha2: "kr" }, - { name: "Kashmiri", alpha2: "ks" }, - { name: "Kurdish", alpha2: "ku" }, - { name: "Komi", alpha2: "kv" }, - { name: "Cornish", alpha2: "kw" }, - { name: "Kirghiz; Kyrgyz", alpha2: "ky" }, - { name: "Latin", alpha2: "la" }, - { name: "Luxembourgish; Letzeburgesch", alpha2: "lb" }, - { name: "Ganda", alpha2: "lg" }, - { name: "Limburgan; Limburger; Limburgish", alpha2: "li" }, - { name: "Lingala", alpha2: "ln" }, - { name: "Lao", alpha2: "lo" }, - { name: "Lithuanian", alpha2: "lt" }, - { name: "Luba-Katanga", alpha2: "lu" }, - { name: "Latvian", alpha2: "lv" }, - { name: "Malagasy", alpha2: "mg" }, - { name: "Marshallese", alpha2: "mh" }, - { name: "Maori", alpha2: "mi" }, - { name: "Macedonian", alpha2: "mk" }, - { name: "Malayalam", alpha2: "ml" }, - { name: "Mongolian", alpha2: "mn" }, - { name: "Marathi", alpha2: "mr" }, - { name: "Malay", alpha2: "ms" }, - { name: "Maltese", alpha2: "mt" }, - { name: "Burmese", alpha2: "my" }, - { name: "Nauru", alpha2: "na" }, - { name: "Bokm\u00e5l, Norwegian; Norwegian Bokm\u00e5l", alpha2: "nb" }, - { name: "Ndebele, North; North Ndebele", alpha2: "nd" }, - { name: "Nepali", alpha2: "ne" }, - { name: "Ndonga", alpha2: "ng" }, - { name: "Dutch; Flemish", alpha2: "nl" }, - { name: "Norwegian Nynorsk; Nynorsk, Norwegian", alpha2: "nn" }, - { name: "Norwegian", alpha2: "no" }, - { name: "Ndebele, South; South Ndebele", alpha2: "nr" }, - { name: "Navajo; Navaho", alpha2: "nv" }, - { name: "Chichewa; Chewa; Nyanja", alpha2: "ny" }, - { name: "Occitan (post 1500)", alpha2: "oc" }, - { name: "Ojibwa", alpha2: "oj" }, - { name: "Oromo", alpha2: "om" }, - { name: "Oriya", alpha2: "or" }, - { name: "Ossetian; Ossetic", alpha2: "os" }, - { name: "Panjabi; Punjabi", alpha2: "pa" }, - { name: "Pali", alpha2: "pi" }, - { name: "Polish", alpha2: "pl" }, - { name: "Pushto; Pashto", alpha2: "ps" }, - { name: "Portuguese", alpha2: "pt" }, - { name: "Quechua", alpha2: "qu" }, - { name: "Romansh", alpha2: "rm" }, - { name: "Rundi", alpha2: "rn" }, - { name: "Romanian; Moldavian; Moldovan", alpha2: "ro" }, - { name: "Russian", alpha2: "ru" }, - { name: "Kinyarwanda", alpha2: "rw" }, - { name: "Sanskrit", alpha2: "sa" }, - { name: "Sardinian", alpha2: "sc" }, - { name: "Sindhi", alpha2: "sd" }, - { name: "Northern Sami", alpha2: "se" }, - { name: "Sango", alpha2: "sg" }, - { name: "Sinhala; Sinhalese", alpha2: "si" }, - { name: "Slovak", alpha2: "sk" }, - { name: "Slovenian", alpha2: "sl" }, - { name: "Samoan", alpha2: "sm" }, - { name: "Shona", alpha2: "sn" }, - { name: "Somali", alpha2: "so" }, - { name: "Albanian", alpha2: "sq" }, - { name: "Serbian", alpha2: "sr" }, - { name: "Swati", alpha2: "ss" }, - { name: "Sotho, Southern", alpha2: "st" }, - { name: "Sundanese", alpha2: "su" }, - { name: "Swedish", alpha2: "sv" }, - { name: "Swahili", alpha2: "sw" }, - { name: "Tamil", alpha2: "ta" }, - { name: "Telugu", alpha2: "te" }, - { name: "Tajik", alpha2: "tg" }, - { name: "Thai", alpha2: "th" }, - { name: "Tigrinya", alpha2: "ti" }, - { name: "Turkmen", alpha2: "tk" }, - { name: "Tagalog", alpha2: "tl" }, - { name: "Tswana", alpha2: "tn" }, - { name: "Tonga (Tonga Islands)", alpha2: "to" }, - { name: "Turkish", alpha2: "tr" }, - { name: "Tsonga", alpha2: "ts" }, - { name: "Tatar", alpha2: "tt" }, - { name: "Twi", alpha2: "tw" }, - { name: "Tahitian", alpha2: "ty" }, - { name: "Uighur; Uyghur", alpha2: "ug" }, - { name: "Ukrainian", alpha2: "uk" }, - { name: "Urdu", alpha2: "ur" }, - { name: "Uzbek", alpha2: "uz" }, - { name: "Venda", alpha2: "ve" }, - { name: "Vietnamese", alpha2: "vi" }, - { name: "Volap\u00fck", alpha2: "vo" }, - { name: "Walloon", alpha2: "wa" }, - { name: "Wolof", alpha2: "wo" }, - { name: "Xhosa", alpha2: "xh" }, - { name: "Yiddish", alpha2: "yi" }, - { name: "Yoruba", alpha2: "yo" }, - { name: "Zhuang; Chuang", alpha2: "za" }, - { name: "Chinese", alpha2: "zh" }, - { name: "Zulu", alpha2: "zu" }, -]; - -export type Lang = { name: string; alpha2: string }; diff --git a/examples/combobox-resource-route/app/root.tsx b/examples/combobox-resource-route/app/root.tsx deleted file mode 100644 index 065bbc3e5af..00000000000 --- a/examples/combobox-resource-route/app/root.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import type { MetaFunction } from "@remix-run/node"; -import { - Links, - LiveReload, - Meta, - Outlet, - Scripts, - ScrollRestoration, -} from "@remix-run/react"; - -import styles from "./app.css"; - -export const meta: MetaFunction = () => ({ - charset: "utf-8", - title: "Reach UI Combobox + Resource Route", - viewport: "width=device-width,initial-scale=1", -}); - -export function links() { - return [{ rel: "stylesheet", href: styles }]; -} - -export default function App() { - return ( - - - - - - - - - - - - - ); -} diff --git a/examples/combobox-resource-route/app/routes/index.tsx b/examples/combobox-resource-route/app/routes/index.tsx deleted file mode 100644 index 45f719e1069..00000000000 --- a/examples/combobox-resource-route/app/routes/index.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { - Combobox, - ComboboxInput, - ComboboxList, - ComboboxOption, - ComboboxPopover, -} from "@reach/combobox"; -import { Form, useFetcher, useSearchParams } from "@remix-run/react"; - -import type { Lang } from "~/models/langs"; - -// Import the Reach UI styles -import comboboxStyles from "@reach/combobox/styles.css"; - -export function links() { - // Add them to the page when this route is active: - // https://remix.run/api/conventions#links - return [{ rel: "stylesheet", href: comboboxStyles }]; -} - -export default function Index() { - // Set up a fetcher to fetch languages as the user types - const langs = useFetcher(); - - // ComboboxInput is just an in the end, so we can read the submitted - // value from teh search params when we submit the form (because it's a "get" - // form instead of "post", it will be in the URL as a search param). - const [searchParams] = useSearchParams(); - - return ( -
- -
- -
- { - // When the input changes, load the languages - langs.load(`/lang-search?q=${e.target.value}`); - }} - /> - - {/* Add a nice spinner when the fetcher is loading */} - {langs.state === "loading" && } -
- - {/* Only show the popover if we have results */} - {langs.data && langs.data.length > 0 && ( - - - {langs.data.map((lang, index) => ( - - {lang.name} ({lang.alpha2}) - - ))} - - - )} -
-

- {" "} - {searchParams.has("lang") && ( - You submitted: {searchParams.get("lang")} - )} -

-
- ); -} - -function Spinner() { - return ( - - - - ); -} diff --git a/examples/combobox-resource-route/app/routes/lang-search.tsx b/examples/combobox-resource-route/app/routes/lang-search.tsx deleted file mode 100644 index 3d1932a6c8d..00000000000 --- a/examples/combobox-resource-route/app/routes/lang-search.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import type { LoaderFunction } from "@remix-run/node"; -import { json } from "@remix-run/node"; - -import { searchLangs } from "~/models/langs"; - -/** - * This route is called via `useFetcher` from the Combobox input. It returns a - * set of languages as the user types. It's called a Resource Route because it - * doesn't export a component. You might think of it as an "API Route". - */ -export const loader: LoaderFunction = async ({ request }) => { - // First get what the user is searching for by creating a URL: - // https://developer.mozilla.org/en-US/docs/Web/API/URL - // https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams - const url = new URL(request.url); - const query = url.searchParams.get("q"); - - // Search the languages, you can go look at `app/langs.ts` to see what it's - // doing, but this part will obviously be different for your app. - const langs = (await searchLangs(query || "")).slice(0, 20); - - return json(langs, { - // Add a little bit of caching so when the user backspaces a value in the - // Combobox, the browser has a local copy of the data and doesn't make a - // request to the server for it. No need to send a client side data fetching - // library that caches results in memory, the browser has this ability - // built-in. - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control - headers: { "Cache-Control": "max-age=60" }, - }); -}; - -/** - * You shouldn't have to export this, we have a bug. - * TODO: add github issue link (or just fix it) - */ -export default function Bug() { - return null; -} diff --git a/examples/combobox-resource-route/package.json b/examples/combobox-resource-route/package.json deleted file mode 100644 index 941d6aa47fb..00000000000 --- a/examples/combobox-resource-route/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "private": true, - "sideEffects": false, - "scripts": { - "build": "remix build", - "dev": "remix dev", - "start": "remix-serve build" - }, - "dependencies": { - "@reach/combobox": "^0.16.5", - "@remix-run/node": "1.6.4", - "@remix-run/react": "1.6.4", - "@remix-run/serve": "1.6.4", - "match-sorter": "^6.3.1", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@remix-run/dev": "1.6.4", - "@remix-run/eslint-config": "1.6.4", - "@types/react": "^17.0.39", - "@types/react-dom": "^17.0.13", - "eslint": "^8.10.0", - "typescript": "^4.7.4" - }, - "engines": { - "node": ">=14" - } -} diff --git a/examples/combobox-resource-route/public/favicon.ico b/examples/combobox-resource-route/public/favicon.ico deleted file mode 100644 index 8830cf6821b354114848e6354889b8ecf6d2bc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 EKbET!0{{R3 diff --git a/examples/combobox-resource-route/remix.config.js b/examples/combobox-resource-route/remix.config.js deleted file mode 100644 index adf2a0b5d3e..00000000000 --- a/examples/combobox-resource-route/remix.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@remix-run/dev').AppConfig} */ -module.exports = { - ignoredRouteFiles: ["**/.*"], - // appDirectory: "app", - // assetsBuildDirectory: "public/build", - // serverBuildPath: "build/index.js", - // publicPath: "/build/", -}; diff --git a/examples/combobox-resource-route/remix.env.d.ts b/examples/combobox-resource-route/remix.env.d.ts deleted file mode 100644 index 72e2affe311..00000000000 --- a/examples/combobox-resource-route/remix.env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/examples/combobox-resource-route/sandbox.config.json b/examples/combobox-resource-route/sandbox.config.json deleted file mode 100644 index 4363d87a30d..00000000000 --- a/examples/combobox-resource-route/sandbox.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "hardReloadOnChange": true, - "container": { - "port": 3000 - } -} diff --git a/examples/combobox-resource-route/tsconfig.json b/examples/combobox-resource-route/tsconfig.json deleted file mode 100644 index 20f8a386a6c..00000000000 --- a/examples/combobox-resource-route/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], - "compilerOptions": { - "lib": ["DOM", "DOM.Iterable", "ES2019"], - "isolatedModules": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "moduleResolution": "node", - "resolveJsonModule": true, - "target": "ES2019", - "strict": true, - "allowJs": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", - "paths": { - "~/*": ["./app/*"] - }, - - // Remix takes care of building everything in `remix build`. - "noEmit": true - } -} diff --git a/examples/dark-mode/.eslintrc.js b/examples/dark-mode/.eslintrc.js deleted file mode 100644 index ced78085f86..00000000000 --- a/examples/dark-mode/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], -}; diff --git a/examples/dark-mode/.gitignore b/examples/dark-mode/.gitignore deleted file mode 100644 index 3f7bf98da3e..00000000000 --- a/examples/dark-mode/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules - -/.cache -/build -/public/build -.env diff --git a/examples/dark-mode/README.md b/examples/dark-mode/README.md deleted file mode 100644 index b8b600d4784..00000000000 --- a/examples/dark-mode/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Dark Mode Example - -This example shows how you can add dark mode theming to your app - -## Preview - -Open this example on [CodeSandbox](https://codesandbox.com): - -[![Open in CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/github/remix-run/remix/tree/main/examples/dark-mode) - -## Example - -In this example, we have a button that toggles the current theme (light / dark). The current value is stored in React context and is used as the className of `` (see [app/root.tsx](app/root.tsx)). Clicking the button toggles the theme, which updates the className, which updates the CSS variables, resulting in the background colour updating (see [app/styles/styles.css](app/styles/styles.css)). - -When the theme value updates, we update a cookie value so that the server can persist the theme value in the future (e.g. when the page is refreshed). - -When the page is initially rendered, the server first checks whether a cookie from a previous session has been set. If so, we use the cookie value as the initial theme value. If not, we leave it to the client to figure out the initial value. The client uses `prefers-color-scheme` to use any system preferences the user have. If they don't have any preferences, we default to LIGHT mode. - -While not essential, the cookie uses a secret to sign the value (see [app/utils/theme.server.ts](app/utils/theme.server.ts)). This value comes from the environment variable `SESSION_SECRET` (make sure to set it before running the app or an error will be thrown). - -The Themed component is used to conditionally render two components depending on current theme. If a theme preference hasn't been set, the server renders both components and the client uses `ThemeBody` in [theme-provider.tsx](app/utils/theme-provider.tsx) to remove the component that is not associated with the user's theme preferences. - -## Related Links - -- [Creating cookie sessions in the Remix docs](https://remix.run/docs/en/v1/api/remix#createcookiesessionstorage) -- [useFetcher in the Remix docs](https://remix.run/docs/en/v1/api/remix#usefetcher) (used to tell the server to update the cookie value when the theme changes) -- [Blog post with complete explanation of each part of the code](https://www.mattstobbs.com/remix-dark-mode/) diff --git a/examples/dark-mode/app/entry.client.tsx b/examples/dark-mode/app/entry.client.tsx deleted file mode 100644 index 3eec1fd0a02..00000000000 --- a/examples/dark-mode/app/entry.client.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { RemixBrowser } from "@remix-run/react"; -import { hydrate } from "react-dom"; - -hydrate(, document); diff --git a/examples/dark-mode/app/entry.server.tsx b/examples/dark-mode/app/entry.server.tsx deleted file mode 100644 index 5afa18235cc..00000000000 --- a/examples/dark-mode/app/entry.server.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { EntryContext } from "@remix-run/node"; -import { RemixServer } from "@remix-run/react"; -import { renderToString } from "react-dom/server"; - -export default function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - const markup = renderToString( - - ); - - responseHeaders.set("Content-Type", "text/html"); - - return new Response("" + markup, { - status: responseStatusCode, - headers: responseHeaders, - }); -} diff --git a/examples/dark-mode/app/root.tsx b/examples/dark-mode/app/root.tsx deleted file mode 100644 index b278513074a..00000000000 --- a/examples/dark-mode/app/root.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import type { LoaderFunction, MetaFunction } from "@remix-run/node"; -import { - Links, - LiveReload, - Meta, - Outlet, - Scripts, - ScrollRestoration, - useLoaderData, -} from "@remix-run/react"; - -import { - ThemeBody, - ThemeHead, - ThemeProvider, - useTheme, -} from "~/utils/theme-provider"; -import type { Theme } from "~/utils/theme-provider"; -import { getThemeSession } from "~/utils/theme.server"; - -export type LoaderData = { - theme: Theme | null; -}; - -export const loader: LoaderFunction = async ({ request }) => { - const themeSession = await getThemeSession(request); - - const data: LoaderData = { - theme: themeSession.getTheme(), - }; - - return data; -}; - -export const meta: MetaFunction = () => ({ - charset: "utf-8", - title: "New Remix App", - viewport: "width=device-width,initial-scale=1", -}); - -function App() { - const data = useLoaderData(); - const [theme] = useTheme(); - - return ( - - - - - - - - - - - - - - - ); -} - -export default function AppWithProviders() { - const data = useLoaderData(); - - return ( - - - - ); -} diff --git a/examples/dark-mode/app/routes/action/set-theme.tsx b/examples/dark-mode/app/routes/action/set-theme.tsx deleted file mode 100644 index bd747fff0bb..00000000000 --- a/examples/dark-mode/app/routes/action/set-theme.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import type { ActionFunction, LoaderFunction } from "@remix-run/node"; -import { json, redirect } from "@remix-run/node"; - -import { getThemeSession } from "~/utils/theme.server"; -import { isTheme } from "~/utils/theme-provider"; - -export const action: ActionFunction = async ({ request }) => { - const themeSession = await getThemeSession(request); - const requestText = await request.text(); - const form = new URLSearchParams(requestText); - const theme = form.get("theme"); - - if (!isTheme(theme)) { - return json({ - success: false, - message: `theme value of ${theme} is not a valid theme`, - }); - } - - themeSession.setTheme(theme); - return json( - { success: true }, - { headers: { "Set-Cookie": await themeSession.commit() } } - ); -}; - -export const loader: LoaderFunction = () => redirect("/", { status: 404 }); diff --git a/examples/dark-mode/app/routes/index.tsx b/examples/dark-mode/app/routes/index.tsx deleted file mode 100644 index af3e76ee672..00000000000 --- a/examples/dark-mode/app/routes/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import type { LinksFunction } from "@remix-run/node"; - -import styles from "~/styles/styles.css"; -import { Theme, Themed, useTheme } from "~/utils/theme-provider"; - -export const links: LinksFunction = () => [{ rel: "stylesheet", href: styles }]; - -export default function IndexRoute() { - const [, setTheme] = useTheme(); - - const toggleTheme = () => { - setTheme((prevTheme) => - prevTheme === Theme.LIGHT ? Theme.DARK : Theme.LIGHT - ); - }; - - return ( - <> - - I'm only seen in dark mode} - light={

I'm only seen in light mode

} - /> - - ); -} diff --git a/examples/dark-mode/app/styles/styles.css b/examples/dark-mode/app/styles/styles.css deleted file mode 100644 index d3a212ef905..00000000000 --- a/examples/dark-mode/app/styles/styles.css +++ /dev/null @@ -1,17 +0,0 @@ -html { - --background-colour: white; - - background-color: var(--background-colour); -} - -html.dark { - --background-colour: black; -} - -.dark-component { - color: white; -} - -.light-component { - color: black; -} diff --git a/examples/dark-mode/app/utils/theme-provider.tsx b/examples/dark-mode/app/utils/theme-provider.tsx deleted file mode 100644 index fd3f7782ff0..00000000000 --- a/examples/dark-mode/app/utils/theme-provider.tsx +++ /dev/null @@ -1,282 +0,0 @@ -import { useFetcher } from "@remix-run/react"; -import type { Dispatch, ReactNode, SetStateAction } from "react"; -import { - createContext, - createElement, - useContext, - useEffect, - useRef, - useState, -} from "react"; - -enum Theme { - DARK = "dark", - LIGHT = "light", -} -const themes: Array = Object.values(Theme); - -type ThemeContextType = [Theme | null, Dispatch>]; - -const ThemeContext = createContext(undefined); - -const prefersDarkMQ = "(prefers-color-scheme: dark)"; -const getPreferredTheme = () => - window.matchMedia(prefersDarkMQ).matches ? Theme.DARK : Theme.LIGHT; - -function ThemeProvider({ - children, - specifiedTheme, -}: { - children: ReactNode; - specifiedTheme: Theme | null; -}) { - const [theme, setTheme] = useState(() => { - // On the server, if we don't have a specified theme then we should - // return null and the clientThemeCode will set the theme for us - // before hydration. Then (during hydration), this code will get the same - // value that clientThemeCode got so hydration is happy. - if (specifiedTheme) { - if (themes.includes(specifiedTheme)) { - return specifiedTheme; - } else { - return null; - } - } - - // there's no way for us to know what the theme should be in this context - // the client will have to figure it out before hydration. - if (typeof document === "undefined") { - return null; - } - - return getPreferredTheme(); - }); - - const persistTheme = useFetcher(); - // TODO: remove this when persistTheme is memoized properly - const persistThemeRef = useRef(persistTheme); - useEffect(() => { - persistThemeRef.current = persistTheme; - }, [persistTheme]); - - const mountRun = useRef(false); - - useEffect(() => { - if (!mountRun.current) { - mountRun.current = true; - return; - } - if (!theme) { - return; - } - - persistThemeRef.current.submit( - { theme }, - { action: "action/set-theme", method: "post" } - ); - }, [theme]); - - useEffect(() => { - const mediaQuery = window.matchMedia(prefersDarkMQ); - const handleChange = () => { - setTheme(mediaQuery.matches ? Theme.DARK : Theme.LIGHT); - }; - mediaQuery.addEventListener("change", handleChange); - return () => mediaQuery.removeEventListener("change", handleChange); - }, []); - - return ( - - {children} - - ); -} - -const clientThemeCode = ` -// hi there dear reader πŸ‘‹ -// this is how I make certain we avoid a flash of the wrong theme. If you select -// a theme, then I'll know what you want in the future and you'll not see this -// script anymore. -;(() => { - const theme = window.matchMedia(${JSON.stringify(prefersDarkMQ)}).matches - ? 'dark' - : 'light'; - const cl = document.documentElement.classList; - const themeAlreadyApplied = cl.contains('light') || cl.contains('dark'); - if (themeAlreadyApplied) { - // this script shouldn't exist if the theme is already applied! - console.warn( - "Hi there, could you let me know you're seeing this message? Thanks!", - ); - } else { - cl.add(theme); - } - const meta = document.querySelector('meta[name=color-scheme]'); - if (meta) { - if (theme === 'dark') { - meta.content = 'dark light'; - } else if (theme === 'light') { - meta.content = 'light dark'; - } - } else { - console.warn( - "Hey, could you let me know you're seeing this message? Thanks!", - ); - } -})(); -`; - -const themeStylesCode = ` - /* default light, but app-preference is "dark" */ - html.dark { - light-mode { - display: none; - } - } - - /* default light, and no app-preference */ - html:not(.dark) { - dark-mode { - display: none; - } - } - - @media (prefers-color-scheme: dark) { - /* prefers dark, but app-preference is "light" */ - html.light { - dark-mode { - display: none; - } - } - - /* prefers dark, and app-preference is "dark" */ - html.dark, - /* prefers dark and no app-preference */ - html:not(.light) { - light-mode { - display: none; - } - } - } -`; - -function ThemeHead({ ssrTheme }: { ssrTheme: boolean }) { - const [theme] = useTheme(); - - return ( - <> - {/* - On the server, "theme" might be `null`, so clientThemeCode ensures that - this is correct before hydration. - */} - - {/* - If we know what the theme is from the server then we don't need - to do fancy tricks prior to hydration to make things match. - */} - {ssrTheme ? null : ( - <> -