├── .env.example ├── .firebaserc ├── .github └── workflows │ ├── firebase-hosting-merge.yml │ └── firebase-hosting-pull-request.yml ├── .gitignore ├── .prettierignore ├── .vscode └── settings.json ├── README.md ├── app ├── assets │ ├── license.mdx │ └── privacy.mdx ├── components │ ├── AppFooter.tsx │ ├── AppHeadingSection.tsx │ ├── AppUserMenu.tsx │ └── ui │ │ ├── alert-dialog.tsx │ │ ├── alert.tsx │ │ ├── avatar.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── dialog.tsx │ │ ├── dropdown-menu.tsx │ │ ├── index.ts │ │ ├── input.tsx │ │ ├── label.tsx │ │ ├── sonner.tsx │ │ ├── stack.tsx │ │ ├── table.tsx │ │ ├── tabs.tsx │ │ └── textarea.tsx ├── libs │ ├── dayjs.ts │ ├── google-auth.ts │ └── utils.ts ├── middlewares │ ├── auth-context.ts │ ├── on-boarding-auth-middleware.ts │ └── optional-auth-middleware.ts ├── models │ ├── account.ts │ └── posts.ts ├── root.tsx ├── routes.ts ├── routes │ ├── $handle+ │ │ ├── _index │ │ │ └── route.tsx │ │ ├── _layout │ │ │ └── route.tsx │ │ ├── posts.$id._index │ │ │ └── route.tsx │ │ ├── posts.$id.delete │ │ │ └── route.tsx │ │ └── posts.$id.edit │ │ │ └── route.tsx │ ├── _index.tsx │ ├── _public+ │ │ ├── _layout.tsx │ │ ├── license.tsx │ │ └── privacy.tsx │ ├── auth+ │ │ ├── _layout │ │ │ └── route.tsx │ │ ├── google.callback │ │ │ └── route.tsx │ │ ├── sign_in │ │ │ └── route.tsx │ │ └── sign_out │ │ │ └── route.tsx │ └── welcome+ │ │ ├── _index │ │ └── route.tsx │ │ ├── _layout │ │ └── route.ts │ │ └── create_account │ │ └── route.tsx ├── services │ ├── auth.ts │ ├── firebase.ts │ ├── firestore.ts │ └── google-auth.ts └── styles │ └── globals.css ├── biome.json ├── components.json ├── firebase.json ├── firestore.indexes.json ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── prettier.config.js ├── public └── favicon.ico ├── react-router.config.ts ├── tsconfig.json └── vite.config.ts /.env.example: -------------------------------------------------------------------------------- 1 | VITE_GOOGLE_CLIENT_ID=your_google_client_id 2 | 3 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/.firebaserc -------------------------------------------------------------------------------- /.github/workflows/firebase-hosting-merge.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/.github/workflows/firebase-hosting-merge.yml -------------------------------------------------------------------------------- /.github/workflows/firebase-hosting-pull-request.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/.github/workflows/firebase-hosting-pull-request.yml -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/.gitignore -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/.vscode/settings.json -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/README.md -------------------------------------------------------------------------------- /app/assets/license.mdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/assets/license.mdx -------------------------------------------------------------------------------- /app/assets/privacy.mdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/assets/privacy.mdx -------------------------------------------------------------------------------- /app/components/AppFooter.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/AppFooter.tsx -------------------------------------------------------------------------------- /app/components/AppHeadingSection.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/AppHeadingSection.tsx -------------------------------------------------------------------------------- /app/components/AppUserMenu.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/AppUserMenu.tsx -------------------------------------------------------------------------------- /app/components/ui/alert-dialog.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/alert-dialog.tsx -------------------------------------------------------------------------------- /app/components/ui/alert.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/alert.tsx -------------------------------------------------------------------------------- /app/components/ui/avatar.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/avatar.tsx -------------------------------------------------------------------------------- /app/components/ui/button.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/button.tsx -------------------------------------------------------------------------------- /app/components/ui/card.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/card.tsx -------------------------------------------------------------------------------- /app/components/ui/dialog.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/dialog.tsx -------------------------------------------------------------------------------- /app/components/ui/dropdown-menu.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/dropdown-menu.tsx -------------------------------------------------------------------------------- /app/components/ui/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/index.ts -------------------------------------------------------------------------------- /app/components/ui/input.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/input.tsx -------------------------------------------------------------------------------- /app/components/ui/label.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/label.tsx -------------------------------------------------------------------------------- /app/components/ui/sonner.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/sonner.tsx -------------------------------------------------------------------------------- /app/components/ui/stack.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/stack.tsx -------------------------------------------------------------------------------- /app/components/ui/table.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/table.tsx -------------------------------------------------------------------------------- /app/components/ui/tabs.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/tabs.tsx -------------------------------------------------------------------------------- /app/components/ui/textarea.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/components/ui/textarea.tsx -------------------------------------------------------------------------------- /app/libs/dayjs.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/libs/dayjs.ts -------------------------------------------------------------------------------- /app/libs/google-auth.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/libs/google-auth.ts -------------------------------------------------------------------------------- /app/libs/utils.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/libs/utils.ts -------------------------------------------------------------------------------- /app/middlewares/auth-context.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/middlewares/auth-context.ts -------------------------------------------------------------------------------- /app/middlewares/on-boarding-auth-middleware.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/middlewares/on-boarding-auth-middleware.ts -------------------------------------------------------------------------------- /app/middlewares/optional-auth-middleware.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/middlewares/optional-auth-middleware.ts -------------------------------------------------------------------------------- /app/models/account.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/models/account.ts -------------------------------------------------------------------------------- /app/models/posts.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/models/posts.ts -------------------------------------------------------------------------------- /app/root.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/root.tsx -------------------------------------------------------------------------------- /app/routes.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes.ts -------------------------------------------------------------------------------- /app/routes/$handle+/_index/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/$handle+/_index/route.tsx -------------------------------------------------------------------------------- /app/routes/$handle+/_layout/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/$handle+/_layout/route.tsx -------------------------------------------------------------------------------- /app/routes/$handle+/posts.$id._index/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/$handle+/posts.$id._index/route.tsx -------------------------------------------------------------------------------- /app/routes/$handle+/posts.$id.delete/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/$handle+/posts.$id.delete/route.tsx -------------------------------------------------------------------------------- /app/routes/$handle+/posts.$id.edit/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/$handle+/posts.$id.edit/route.tsx -------------------------------------------------------------------------------- /app/routes/_index.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/_index.tsx -------------------------------------------------------------------------------- /app/routes/_public+/_layout.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/_public+/_layout.tsx -------------------------------------------------------------------------------- /app/routes/_public+/license.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/_public+/license.tsx -------------------------------------------------------------------------------- /app/routes/_public+/privacy.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/_public+/privacy.tsx -------------------------------------------------------------------------------- /app/routes/auth+/_layout/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/auth+/_layout/route.tsx -------------------------------------------------------------------------------- /app/routes/auth+/google.callback/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/auth+/google.callback/route.tsx -------------------------------------------------------------------------------- /app/routes/auth+/sign_in/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/auth+/sign_in/route.tsx -------------------------------------------------------------------------------- /app/routes/auth+/sign_out/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/auth+/sign_out/route.tsx -------------------------------------------------------------------------------- /app/routes/welcome+/_index/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/welcome+/_index/route.tsx -------------------------------------------------------------------------------- /app/routes/welcome+/_layout/route.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/welcome+/_layout/route.ts -------------------------------------------------------------------------------- /app/routes/welcome+/create_account/route.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/routes/welcome+/create_account/route.tsx -------------------------------------------------------------------------------- /app/services/auth.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/services/auth.ts -------------------------------------------------------------------------------- /app/services/firebase.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/services/firebase.ts -------------------------------------------------------------------------------- /app/services/firestore.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/services/firestore.ts -------------------------------------------------------------------------------- /app/services/google-auth.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/services/google-auth.ts -------------------------------------------------------------------------------- /app/styles/globals.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/app/styles/globals.css -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/biome.json -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/components.json -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/firebase.json -------------------------------------------------------------------------------- /firestore.indexes.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/firestore.indexes.json -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/package.json -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/pnpm-lock.yaml -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/pnpm-workspace.yaml -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/prettier.config.js -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /react-router.config.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/react-router.config.ts -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/tsconfig.json -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coji/remix-spa-example/HEAD/vite.config.ts --------------------------------------------------------------------------------