├── README.md ├── app ├── styles.css ├── routes │ ├── about │ │ └── route.tsx │ ├── board.$id │ │ ├── route.tsx │ │ ├── types.ts │ │ ├── new-card.tsx │ │ ├── new-column.tsx │ │ ├── components.tsx │ │ ├── board.tsx │ │ ├── card.tsx │ │ └── column.tsx │ ├── logout.ts │ ├── login │ │ ├── validate.ts │ │ ├── queries.ts │ │ └── route.tsx │ ├── replicache.$op │ │ ├── route.tsx │ │ ├── pull.ts │ │ └── push.ts │ ├── signup │ │ ├── validate.tsx │ │ ├── queries.ts │ │ └── route.tsx │ ├── _index.tsx │ └── home │ │ └── route.tsx ├── replicache │ ├── undo.ts │ ├── data.ts │ ├── provider.tsx │ └── mutators.ts ├── http │ └── bad-request.ts ├── db │ └── prisma.ts ├── components │ ├── button.tsx │ └── input.tsx ├── auth │ ├── provider.tsx │ └── auth.ts ├── icons │ ├── icons.tsx │ └── icons.svg └── root.tsx ├── public ├── r.png ├── favicon.ico ├── remix-logo@dark.png ├── github-mark-white.png ├── yt_icon_mono_dark.png └── remix-logo-new@dark.png ├── .gitignore ├── remix.env.d.ts ├── postcss.config.js ├── prisma ├── migrations │ ├── migration_lock.toml │ ├── 20240312172239_initial_migration │ │ └── migration.sql │ └── 20240312171147_initial_migration │ │ └── migration.sql └── schema.prisma ├── .eslintrc.cjs ├── vite.config.mjs ├── tsconfig.json ├── tailwind.config.ts └── package.json /README.md: -------------------------------------------------------------------------------- 1 | ```sh 2 | npm i 3 | npx prisma migrate dev 4 | npm run dev 5 | ``` 6 | -------------------------------------------------------------------------------- /app/styles.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /public/r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vimtor/trellix-replicache/HEAD/public/r.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vimtor/trellix-replicache/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /app/routes/about/route.tsx: -------------------------------------------------------------------------------- 1 | export default function About() { 2 | return
About Page
3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | /.cache 4 | /build 5 | /public/build 6 | .env 7 | /prisma/dev.db 8 | .idea -------------------------------------------------------------------------------- /app/routes/board.$id/route.tsx: -------------------------------------------------------------------------------- 1 | import { Board } from "./board"; 2 | 3 | export { Board as default }; 4 | -------------------------------------------------------------------------------- /remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /public/remix-logo@dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vimtor/trellix-replicache/HEAD/public/remix-logo@dark.png -------------------------------------------------------------------------------- /public/github-mark-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vimtor/trellix-replicache/HEAD/public/github-mark-white.png -------------------------------------------------------------------------------- /public/yt_icon_mono_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vimtor/trellix-replicache/HEAD/public/yt_icon_mono_dark.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/remix-logo-new@dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vimtor/trellix-replicache/HEAD/public/remix-logo-new@dark.png -------------------------------------------------------------------------------- /app/replicache/undo.ts: -------------------------------------------------------------------------------- 1 | import { UndoManager } from "@rocicorp/undo"; 2 | 3 | export const undoManager = new UndoManager(); 4 | -------------------------------------------------------------------------------- /app/routes/board.$id/types.ts: -------------------------------------------------------------------------------- 1 | export const CONTENT_TYPES = { 2 | card: "application/remix-card", 3 | column: "application/remix-column", 4 | }; 5 | -------------------------------------------------------------------------------- /app/routes/logout.ts: -------------------------------------------------------------------------------- 1 | import { redirectWithClearedCookie } from "~/auth/auth"; 2 | 3 | export function action() { 4 | return redirectWithClearedCookie(); 5 | } 6 | -------------------------------------------------------------------------------- /prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "postgresql" -------------------------------------------------------------------------------- /app/http/bad-request.ts: -------------------------------------------------------------------------------- 1 | export function notFound() { 2 | return new Response("Not Found", { status: 404, statusText: "Not Found" }); 3 | } 4 | 5 | export function badRequest(body: string) { 6 | return new Response(body, { 7 | status: 400, 8 | statusText: "Bad Request", 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /prisma/migrations/20240312172239_initial_migration/migration.sql: -------------------------------------------------------------------------------- 1 | -- DropForeignKey 2 | ALTER TABLE "Item" DROP CONSTRAINT "Item_boardId_fkey"; 3 | 4 | -- AddForeignKey 5 | ALTER TABLE "Item" ADD CONSTRAINT "Item_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "Board"("id") ON DELETE CASCADE ON UPDATE CASCADE; 6 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('eslint').Linter.Config} */ 2 | module.exports = { 3 | extends: ["@remix-run/eslint-config", "@remix-run/eslint-config/node"], 4 | "overrides": [ 5 | { 6 | "rules": { 7 | "no-unused-vars": "warn", 8 | "@typescript-eslint/no-unused-vars": "warn" 9 | } 10 | } 11 | ] 12 | }; 13 | -------------------------------------------------------------------------------- /vite.config.mjs: -------------------------------------------------------------------------------- 1 | import { vitePlugin as remix } from "@remix-run/dev"; 2 | import tsconfigPaths from "vite-tsconfig-paths"; 3 | import { defineConfig } from "vite"; 4 | import { vercelPreset } from "@vercel/remix/vite"; 5 | 6 | export default defineConfig({ 7 | plugins: [ 8 | remix({ 9 | presets: [vercelPreset()] 10 | }), 11 | tsconfigPaths() 12 | ] 13 | }); 14 | -------------------------------------------------------------------------------- /app/replicache/data.ts: -------------------------------------------------------------------------------- 1 | export type BoardData = { 2 | id: string; 3 | name: string; 4 | color: string; 5 | createdAt: string; 6 | }; 7 | 8 | export type ColumnData = { 9 | id: string; 10 | name: string; 11 | order: number; 12 | boardId: string; 13 | }; 14 | 15 | export type ItemData = { 16 | id: string; 17 | title: string; 18 | content?: string; 19 | order: number; 20 | columnId: string; 21 | boardId: string; 22 | }; 23 | -------------------------------------------------------------------------------- /app/db/prisma.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from "@prisma/client"; 2 | 3 | const prismaClientSingleton = () => { 4 | return new PrismaClient(); 5 | }; 6 | 7 | declare global { 8 | var prismaGlobal: undefined | ReturnType; 9 | } 10 | 11 | const prisma = globalThis.prismaGlobal ?? prismaClientSingleton(); 12 | 13 | if (process.env.NODE_ENV !== "production") globalThis.prismaGlobal = prisma; 14 | 15 | export { prisma }; 16 | -------------------------------------------------------------------------------- /app/components/button.tsx: -------------------------------------------------------------------------------- 1 | import { forwardRef } from "react"; 2 | 3 | export let Button = forwardRef< 4 | HTMLButtonElement, 5 | React.ButtonHTMLAttributes 6 | >((props, ref) => { 7 | return ( 8 |