├── .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
--------------------------------------------------------------------------------