├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── .npmrc ├── .vscode ├── extensions.json └── settings.json ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── epicshop ├── .npmrc ├── Dockerfile ├── fix-watch.js ├── fix.js ├── fly.toml ├── package-lock.json ├── package.json ├── setup-custom.js ├── setup.js ├── start.js ├── test.js ├── tsconfig.json └── update-deps.sh ├── exercises ├── 01.form-validation │ ├── 01.problem.form-validation │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.form-validation │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.server-validation │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.server-validation │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.problem.no-validate │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.solution.no-validate │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 02.accessibility │ ├── 01.problem.labels │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.labels │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.aria │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.aria │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.problem.focus │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.solution.focus │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 03.schema-validation │ ├── 01.problem.zod │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.zod │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.conform-action │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.conform-action │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.problem.conform-form │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.solution.conform-form │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ └── healthcheck.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 04.file-upload │ ├── 01.problem.multi-part │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.multi-part │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.file-validation │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.file-validation │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 05.complex-structures │ ├── 01.problem.nested │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.nested │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.lists │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.lists │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.problem.add-remove │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.solution.add-remove │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 06.honeypot │ ├── 01.problem.basic │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.basic │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.util │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.util │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.problem.provider │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 03.solution.provider │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 04.problem.seed │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 04.solution.seed │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 07.csrf │ ├── 01.problem.setup │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.setup │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.verification │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.verification │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── 08.rate-limiting │ ├── 01.problem.basic │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 01.solution.basic │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.problem.tuned │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── 02.solution.tuned │ │ ├── .env │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.cjs │ │ ├── README.mdx │ │ ├── app │ │ │ ├── assets │ │ │ │ └── favicon.svg │ │ │ ├── components │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── floating-toolbar.tsx │ │ │ │ └── ui │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── status-button.tsx │ │ │ │ │ └── textarea.tsx │ │ │ ├── entry.client.tsx │ │ │ ├── entry.server.tsx │ │ │ ├── epicshop.tsx │ │ │ ├── root.tsx │ │ │ ├── routes │ │ │ │ ├── $.tsx │ │ │ │ ├── _auth+ │ │ │ │ │ └── signup.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── resources+ │ │ │ │ │ ├── healthcheck.tsx │ │ │ │ │ └── images.$imageId.tsx │ │ │ │ └── users+ │ │ │ │ │ ├── $username.tsx │ │ │ │ │ └── $username_+ │ │ │ │ │ ├── notes.$noteId.tsx │ │ │ │ │ ├── notes.$noteId_.edit.tsx │ │ │ │ │ ├── notes.index.tsx │ │ │ │ │ └── notes.tsx │ │ │ ├── styles │ │ │ │ ├── font.css │ │ │ │ └── tailwind.css │ │ │ └── utils │ │ │ │ ├── csrf.server.ts │ │ │ │ ├── db.server.ts │ │ │ │ ├── env.server.ts │ │ │ │ ├── honeypot.server.ts │ │ │ │ ├── misc.tsx │ │ │ │ └── singleton.server.ts │ │ ├── index.js │ │ ├── other │ │ │ └── build-server.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── nunito-sans │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-200italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-300italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-600italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-700italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-800italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-900italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-italic.woff2 │ │ │ │ ├── nunito-sans-v12-latin_latin-ext-regular.woff │ │ │ │ └── nunito-sans-v12-latin_latin-ext-regular.woff2 │ │ ├── remix.config.js │ │ ├── server │ │ │ ├── dev-server.js │ │ │ └── index.ts │ │ ├── tailwind.config.ts │ │ ├── tests │ │ │ └── e2e │ │ │ │ └── smoke.test.ts │ │ ├── tsconfig.json │ │ └── types │ │ │ ├── deps.d.ts │ │ │ ├── remix.env.d.ts │ │ │ └── reset.d.ts │ ├── FINISHED.mdx │ └── README.mdx ├── FINISHED.mdx └── README.mdx ├── package-lock.json ├── package.json ├── public └── images │ └── instructor.png └── tsconfig.json /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | registry=https://registry.npmjs.org/ 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "dbaeumer.vscode-eslint", 4 | "esbenp.prettier-vscode", 5 | "bradlc.vscode-tailwindcss", 6 | "neotan.vscode-auto-restart-typescript-eslint-servers" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.preferences.autoImportFileExcludePatterns": [ 3 | "@remix-run/server-runtime", 4 | "@remix-run/router", 5 | "react-router-dom", 6 | "react-router" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | This material is available for private, non-commercial use under the 2 | [GPL version 3](http://www.gnu.org/licenses/gpl-3.0-standalone.html). If you 3 | would like to use this material to conduct your own workshop, please contact us 4 | at team@epicweb.dev 5 | -------------------------------------------------------------------------------- /epicshop/.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | registry=https://registry.npmjs.org/ 3 | -------------------------------------------------------------------------------- /epicshop/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "dependencies": { 4 | "@epic-web/workshop-app": "^5.22.5", 5 | "fs-extra": "^11.2.0", 6 | "execa": "^8.0.1" 7 | } 8 | } -------------------------------------------------------------------------------- /epicshop/start.js: -------------------------------------------------------------------------------- 1 | import './setup-swap.js' 2 | import '@epic-web/workshop-utils/start' 3 | -------------------------------------------------------------------------------- /epicshop/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "NodeNext", 4 | "target": "es2022", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "allowJs": true, 8 | "skipLibCheck": true, 9 | "noEmit": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/01.form-validation/01.problem.form-validation/public/favicon.ico -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.problem.form-validation/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/01.form-validation/01.solution.form-validation/public/favicon.ico -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/01.solution.form-validation/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/01.form-validation/02.problem.server-validation/public/favicon.ico -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.problem.server-validation/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/01.form-validation/02.solution.server-validation/public/favicon.ico -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/02.solution.server-validation/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/01.form-validation/03.problem.no-validate/public/favicon.ico -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.problem.no-validate/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/01.form-validation/03.solution.no-validate/public/favicon.ico -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/03.solution.no-validate/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/01.form-validation/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Form Validation 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/favicon.ico -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.problem.labels/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.problem.labels/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/01.solution.labels/public/favicon.ico -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/01.solution.labels/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/favicon.ico -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.problem.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.problem.aria/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/favicon.ico -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/02.solution.aria/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/02.solution.aria/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/favicon.ico -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.problem.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.problem.focus/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/favicon.ico -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/02.accessibility/03.solution.focus/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/03.solution.focus/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/02.accessibility/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Accessibility 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/03.schema-validation/01.problem.zod/public/favicon.ico -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.problem.zod/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/03.schema-validation/01.solution.zod/public/favicon.ico -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/01.solution.zod/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/03.schema-validation/02.problem.conform-action/public/favicon.ico -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.problem.conform-action/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/03.schema-validation/02.solution.conform-action/public/favicon.ico -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/02.solution.conform-action/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/03.schema-validation/03.problem.conform-form/public/favicon.ico -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.problem.conform-form/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/03.schema-validation/03.solution.conform-form/public/favicon.ico -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/03.solution.conform-form/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/03.schema-validation/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Schema Validation 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/04.file-upload/01.problem.multi-part/public/favicon.ico -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.problem.multi-part/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/04.file-upload/01.solution.multi-part/public/favicon.ico -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/01.solution.multi-part/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/04.file-upload/02.problem.file-validation/public/favicon.ico -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.problem.file-validation/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/04.file-upload/02.solution.file-validation/public/favicon.ico -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/02.solution.file-validation/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/04.file-upload/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # File Upload 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/05.complex-structures/01.problem.nested/public/favicon.ico -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.problem.nested/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/05.complex-structures/01.solution.nested/public/favicon.ico -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/01.solution.nested/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/05.complex-structures/02.problem.lists/public/favicon.ico -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.problem.lists/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/05.complex-structures/02.solution.lists/public/favicon.ico -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/02.solution.lists/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/05.complex-structures/03.problem.add-remove/public/favicon.ico -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.problem.add-remove/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/05.complex-structures/03.solution.add-remove/public/favicon.ico -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/03.solution.add-remove/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/05.complex-structures/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Complex Structures 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.problem.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.problem.basic/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/01.solution.basic/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/01.solution.basic/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.problem.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.problem.util/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/app/utils/honeypot.server.ts: -------------------------------------------------------------------------------- 1 | import { Honeypot } from 'remix-utils/honeypot/server' 2 | 3 | export const honeypot = new Honeypot({ 4 | validFromFieldName: null, 5 | }) 6 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/02.solution.util/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/02.solution.util/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/app/utils/honeypot.server.ts: -------------------------------------------------------------------------------- 1 | import { Honeypot } from 'remix-utils/honeypot/server' 2 | 3 | export const honeypot = new Honeypot({ 4 | // 🐨 set this to process.env.TESTING ? null : undefined so it's disabled during tests 5 | validFromFieldName: null, 6 | }) 7 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.problem.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.problem.provider/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/app/utils/honeypot.server.ts: -------------------------------------------------------------------------------- 1 | import { Honeypot } from 'remix-utils/honeypot/server' 2 | 3 | export const honeypot = new Honeypot({ 4 | validFromFieldName: process.env.TESTING ? null : undefined, 5 | }) 6 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/03.solution.provider/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/03.solution.provider/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.problem.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.problem.seed/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/favicon.ico -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/06.honeypot/04.solution.seed/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/04.solution.seed/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/06.honeypot/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Honeypot 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | # 🐨 add a SESSION_SECRET environment variable here 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/favicon.ico -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.problem.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.problem.setup/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/favicon.ico -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-italic.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/01.solution.setup/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-regular.woff2 -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/01.solution.setup/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/favicon.ico -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-200.woff -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-300.woff -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-600.woff -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-700.woff -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-800.woff -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.problem.verification/public/fonts/nunito-sans/nunito-sans-v12-latin_latin-ext-900.woff -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.problem.verification/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/07.csrf/02.solution.verification/public/favicon.ico -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/02.solution.verification/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/07.csrf/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Cross-Site Request Forgery 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/08.rate-limiting/01.problem.basic/public/favicon.ico -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.problem.basic/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/08.rate-limiting/01.solution.basic/public/favicon.ico -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/01.solution.basic/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/08.rate-limiting/02.problem.tuned/public/favicon.ico -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.problem.tuned/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/.env: -------------------------------------------------------------------------------- 1 | HONEYPOT_SECRET="very-secret" 2 | SESSION_SECRET="super-duper-secret" 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/app/components/floating-toolbar.tsx: -------------------------------------------------------------------------------- 1 | export const floatingToolbarClassName = 2 | 'absolute bottom-3 left-3 right-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-sm md:gap-4 md:pl-7 justify-end' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | import { RemixBrowser } from '@remix-run/react' 2 | import { startTransition } from 'react' 3 | import { hydrateRoot } from 'react-dom/client' 4 | 5 | startTransition(() => { 6 | hydrateRoot(document, ) 7 | }) 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/app/routes/resources+/healthcheck.tsx: -------------------------------------------------------------------------------- 1 | export async function loader() { 2 | return new Response('OK') 3 | } 4 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/exercises/08.rate-limiting/02.solution.tuned/public/favicon.ico -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/types/remix.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/02.solution.tuned/types/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import '@total-typescript/ts-reset' 3 | -------------------------------------------------------------------------------- /exercises/08.rate-limiting/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # Rate Limiting 2 | 3 | 4 | -------------------------------------------------------------------------------- /exercises/FINISHED.mdx: -------------------------------------------------------------------------------- 1 | # 📝 Professional Web Forms 2 | 3 | You've finished! Congratulations 👏👏 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/images/instructor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicweb-dev/web-forms/9fa1d1f488954f1af606c5c62d2b8af021e3a977/public/images/instructor.png --------------------------------------------------------------------------------