aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/examples/kitchen-sink/apps
diff options
context:
space:
mode:
Diffstat (limited to 'examples/kitchen-sink/apps')
-rw-r--r--examples/kitchen-sink/apps/admin/.eslintrc.js4
-rw-r--r--examples/kitchen-sink/apps/admin/index.html12
-rw-r--r--examples/kitchen-sink/apps/admin/package.json27
-rw-r--r--examples/kitchen-sink/apps/admin/public/favicon.icobin0 -> 372526 bytes
-rw-r--r--examples/kitchen-sink/apps/admin/src/App.css40
-rw-r--r--examples/kitchen-sink/apps/admin/src/App.tsx22
-rw-r--r--examples/kitchen-sink/apps/admin/src/index.css14
-rw-r--r--examples/kitchen-sink/apps/admin/src/main.tsx11
-rw-r--r--examples/kitchen-sink/apps/admin/tsconfig.json9
-rw-r--r--examples/kitchen-sink/apps/admin/vite.config.ts6
-rw-r--r--examples/kitchen-sink/apps/api/.eslintrc.js4
-rw-r--r--examples/kitchen-sink/apps/api/package.json40
-rw-r--r--examples/kitchen-sink/apps/api/src/__tests__/server.test.ts22
-rw-r--r--examples/kitchen-sink/apps/api/src/__tests__/tsconfig.json4
-rw-r--r--examples/kitchen-sink/apps/api/src/index.ts9
-rw-r--r--examples/kitchen-sink/apps/api/src/server.ts22
-rw-r--r--examples/kitchen-sink/apps/api/tsconfig.json11
-rw-r--r--examples/kitchen-sink/apps/blog/.gitignore11
-rw-r--r--examples/kitchen-sink/apps/blog/README.md34
-rw-r--r--examples/kitchen-sink/apps/blog/app/entry.client.tsx22
-rw-r--r--examples/kitchen-sink/apps/blog/app/entry.server.tsx18
-rw-r--r--examples/kitchen-sink/apps/blog/app/root.tsx37
-rw-r--r--examples/kitchen-sink/apps/blog/app/routes/index.tsx18
-rw-r--r--examples/kitchen-sink/apps/blog/app/styles.css55
-rw-r--r--examples/kitchen-sink/apps/blog/package.json32
-rw-r--r--examples/kitchen-sink/apps/blog/public/favicon.icobin0 -> 16958 bytes
-rw-r--r--examples/kitchen-sink/apps/blog/remix.config.js10
-rw-r--r--examples/kitchen-sink/apps/blog/remix.env.d.ts2
-rw-r--r--examples/kitchen-sink/apps/blog/server.js4
-rw-r--r--examples/kitchen-sink/apps/blog/tsconfig.json20
-rw-r--r--examples/kitchen-sink/apps/storefront/.eslintrc.js4
-rw-r--r--examples/kitchen-sink/apps/storefront/next-env.d.ts5
-rw-r--r--examples/kitchen-sink/apps/storefront/next.config.js3
-rw-r--r--examples/kitchen-sink/apps/storefront/package.json28
-rw-r--r--examples/kitchen-sink/apps/storefront/public/favicon.icobin0 -> 15086 bytes
-rw-r--r--examples/kitchen-sink/apps/storefront/src/pages/_app.tsx6
-rw-r--r--examples/kitchen-sink/apps/storefront/src/pages/index.tsx24
-rw-r--r--examples/kitchen-sink/apps/storefront/src/styles.css55
-rw-r--r--examples/kitchen-sink/apps/storefront/tsconfig.json9
39 files changed, 654 insertions, 0 deletions
diff --git a/examples/kitchen-sink/apps/admin/.eslintrc.js b/examples/kitchen-sink/apps/admin/.eslintrc.js
new file mode 100644
index 0000000..c8df607
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/.eslintrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ root: true,
+ extends: ["custom"],
+};
diff --git a/examples/kitchen-sink/apps/admin/index.html b/examples/kitchen-sink/apps/admin/index.html
new file mode 100644
index 0000000..c88938a
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Admin | Kitchen Sink</title>
+ </head>
+ <body>
+ <div id="root"></div>
+ <script type="module" src="/src/main.tsx"></script>
+ </body>
+</html>
diff --git a/examples/kitchen-sink/apps/admin/package.json b/examples/kitchen-sink/apps/admin/package.json
new file mode 100644
index 0000000..727d969
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "admin",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "vite build",
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
+ "deploy": "vercel deploy dist --team=turborepo --confirm",
+ "dev": "vite --host 0.0.0.0 --port 3001 --clearScreen false",
+ "lint": "tsc --noEmit && eslint \"src/**/*.ts*\""
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "ui": "workspace:*"
+ },
+ "devDependencies": {
+ "@types/react": "^17.0.0",
+ "@types/react-dom": "^17.0.0",
+ "@vitejs/plugin-react": "^2.1.0",
+ "eslint": "^7.32.0",
+ "eslint-config-custom": "workspace:*",
+ "tsconfig": "workspace:*",
+ "typescript": "^4.8.3",
+ "vite": "^3.1.0"
+ }
+}
diff --git a/examples/kitchen-sink/apps/admin/public/favicon.ico b/examples/kitchen-sink/apps/admin/public/favicon.ico
new file mode 100644
index 0000000..3a3c34a
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/public/favicon.ico
Binary files differ
diff --git a/examples/kitchen-sink/apps/admin/src/App.css b/examples/kitchen-sink/apps/admin/src/App.css
new file mode 100644
index 0000000..dc5bbf4
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/src/App.css
@@ -0,0 +1,40 @@
+.container {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 1.5rem;
+ max-width: 100%;
+ margin: 0 auto;
+ padding: 0 16px;
+ text-align: center;
+}
+
+.title {
+ font-size: 3rem;
+ font-weight: 700;
+ margin: 0;
+}
+
+.title span {
+ display: inline-block;
+ background-image: linear-gradient(to right, #3b82f6, #ef4444);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+}
+
+.description {
+ color: #9ca3af;
+ font-weight: 500;
+}
+
+.description a {
+ color: #3b82f6;
+ text-decoration: none;
+}
+
+.description a:hover {
+ text-decoration: underline;
+}
diff --git a/examples/kitchen-sink/apps/admin/src/App.tsx b/examples/kitchen-sink/apps/admin/src/App.tsx
new file mode 100644
index 0000000..ed28394
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/src/App.tsx
@@ -0,0 +1,22 @@
+import * as React from "react";
+import "./App.css";
+import { CounterButton, NewTabLink } from "ui";
+
+function App() {
+ return (
+ <div className="container">
+ <h1 className="title">
+ Admin <br />
+ <span>Kitchen Sink</span>
+ </h1>
+ <CounterButton />
+ <p className="description">
+ Built With{" "}
+ <NewTabLink href="https://turbo.build/repo">Turborepo</NewTabLink> +{" "}
+ <NewTabLink href="https://vitejs.dev/">Vite</NewTabLink>
+ </p>
+ </div>
+ );
+}
+
+export default App;
diff --git a/examples/kitchen-sink/apps/admin/src/index.css b/examples/kitchen-sink/apps/admin/src/index.css
new file mode 100644
index 0000000..863ff0b
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/src/index.css
@@ -0,0 +1,14 @@
+html {
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
+ Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-tap-highlight-color: transparent;
+ line-height: 1.5;
+ tab-size: 4;
+}
+
+body {
+ margin: 0;
+}
diff --git a/examples/kitchen-sink/apps/admin/src/main.tsx b/examples/kitchen-sink/apps/admin/src/main.tsx
new file mode 100644
index 0000000..794ecaf
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/src/main.tsx
@@ -0,0 +1,11 @@
+import * as React from "react";
+import * as ReactDOM from "react-dom";
+import "./index.css";
+import App from "./App";
+
+ReactDOM.render(
+ <React.StrictMode>
+ <App />
+ </React.StrictMode>,
+ document.getElementById("root")
+);
diff --git a/examples/kitchen-sink/apps/admin/tsconfig.json b/examples/kitchen-sink/apps/admin/tsconfig.json
new file mode 100644
index 0000000..585415b
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "exclude": ["node_modules"],
+ "extends": "tsconfig/vite.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist"
+ },
+ "include": ["src"]
+}
diff --git a/examples/kitchen-sink/apps/admin/vite.config.ts b/examples/kitchen-sink/apps/admin/vite.config.ts
new file mode 100644
index 0000000..58676f7
--- /dev/null
+++ b/examples/kitchen-sink/apps/admin/vite.config.ts
@@ -0,0 +1,6 @@
+import react from "@vitejs/plugin-react";
+import { defineConfig } from "vite";
+
+export default defineConfig({
+ plugins: [react()],
+});
diff --git a/examples/kitchen-sink/apps/api/.eslintrc.js b/examples/kitchen-sink/apps/api/.eslintrc.js
new file mode 100644
index 0000000..2308ff9
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/.eslintrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ root: true,
+ extends: ["custom-server"],
+};
diff --git a/examples/kitchen-sink/apps/api/package.json b/examples/kitchen-sink/apps/api/package.json
new file mode 100644
index 0000000..0c2a0c0
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "api",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "tsup src/index.ts --format cjs",
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
+ "dev": "tsup src/index.ts --format cjs --watch --onSuccess \"node dist/index.js\"",
+ "lint": "tsc --noEmit && eslint \"src/**/*.ts*\"",
+ "start": "node dist/index.js",
+ "test": "jest --detectOpenHandles"
+ },
+ "jest": {
+ "preset": "jest-presets/jest/node"
+ },
+ "dependencies": {
+ "body-parser": "^1.19.0",
+ "cors": "^2.8.5",
+ "express": "^4.17.1",
+ "logger": "workspace:*",
+ "morgan": "^1.10.0"
+ },
+ "devDependencies": {
+ "@types/body-parser": "^1.19.0",
+ "@types/cors": "^2.8.10",
+ "@types/express": "^4.17.12",
+ "@types/jest": "^26.0.22",
+ "@types/morgan": "^1.9.2",
+ "@types/node": "^15.12.2",
+ "@types/supertest": "^2.0.12",
+ "eslint": "^7.32.0",
+ "eslint-config-custom-server": "workspace:*",
+ "jest": "^26.6.3",
+ "jest-presets": "workspace:*",
+ "supertest": "^6.2.4",
+ "tsconfig": "workspace:*",
+ "tsup": "^6.2.3",
+ "typescript": "^4.8.3"
+ }
+}
diff --git a/examples/kitchen-sink/apps/api/src/__tests__/server.test.ts b/examples/kitchen-sink/apps/api/src/__tests__/server.test.ts
new file mode 100644
index 0000000..c0c9806
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/src/__tests__/server.test.ts
@@ -0,0 +1,22 @@
+import supertest from "supertest";
+import { createServer } from "../server";
+
+describe("server", () => {
+ it("health check returns 200", async () => {
+ await supertest(createServer())
+ .get("/healthz")
+ .expect(200)
+ .then((res) => {
+ expect(res.body.ok).toBe(true);
+ });
+ });
+
+ it("message endpoint says hello", async () => {
+ await supertest(createServer())
+ .get("/message/jared")
+ .expect(200)
+ .then((res) => {
+ expect(res.body).toEqual({ message: "hello jared" });
+ });
+ });
+});
diff --git a/examples/kitchen-sink/apps/api/src/__tests__/tsconfig.json b/examples/kitchen-sink/apps/api/src/__tests__/tsconfig.json
new file mode 100644
index 0000000..bf65be6
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/src/__tests__/tsconfig.json
@@ -0,0 +1,4 @@
+{
+ "extends": "../../tsconfig.json",
+ "include": [".", "../."]
+}
diff --git a/examples/kitchen-sink/apps/api/src/index.ts b/examples/kitchen-sink/apps/api/src/index.ts
new file mode 100644
index 0000000..5f48625
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/src/index.ts
@@ -0,0 +1,9 @@
+import { createServer } from "./server";
+import { log } from "logger";
+
+const port = process.env.PORT || 5001;
+const server = createServer();
+
+server.listen(port, () => {
+ log(`api running on ${port}`);
+});
diff --git a/examples/kitchen-sink/apps/api/src/server.ts b/examples/kitchen-sink/apps/api/src/server.ts
new file mode 100644
index 0000000..70ccf0b
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/src/server.ts
@@ -0,0 +1,22 @@
+import { json, urlencoded } from "body-parser";
+import express from "express";
+import morgan from "morgan";
+import cors from "cors";
+
+export const createServer = () => {
+ const app = express();
+ app
+ .disable("x-powered-by")
+ .use(morgan("dev"))
+ .use(urlencoded({ extended: true }))
+ .use(json())
+ .use(cors())
+ .get("/message/:name", (req, res) => {
+ return res.json({ message: `hello ${req.params.name}` });
+ })
+ .get("/healthz", (req, res) => {
+ return res.json({ ok: true });
+ });
+
+ return app;
+};
diff --git a/examples/kitchen-sink/apps/api/tsconfig.json b/examples/kitchen-sink/apps/api/tsconfig.json
new file mode 100644
index 0000000..74f3de4
--- /dev/null
+++ b/examples/kitchen-sink/apps/api/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "lib": ["ES2015"],
+ "module": "CommonJS",
+ "outDir": "./dist",
+ "rootDir": "./src"
+ },
+ "exclude": ["node_modules"],
+ "extends": "tsconfig/base.json",
+ "include": ["src"]
+}
diff --git a/examples/kitchen-sink/apps/blog/.gitignore b/examples/kitchen-sink/apps/blog/.gitignore
new file mode 100644
index 0000000..42ec5e4
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/.gitignore
@@ -0,0 +1,11 @@
+node_modules
+
+.cache
+.env
+.vercel
+.output
+
+build
+public/build
+api/index.js*
+api/_assets*
diff --git a/examples/kitchen-sink/apps/blog/README.md b/examples/kitchen-sink/apps/blog/README.md
new file mode 100644
index 0000000..944936b
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/README.md
@@ -0,0 +1,34 @@
+# Welcome to Remix!
+
+- [Remix Docs](https://remix.run/docs)
+
+## Deployment
+
+After having run the `create-remix` command and selected "Vercel" as a deployment target, you only need to [import your Git repository](https://vercel.com/new) into Vercel, and it will be deployed.
+
+If you'd like to avoid using a Git repository, you can also deploy the directory by running [Vercel CLI](https://vercel.com/cli):
+
+```sh
+npm i -g vercel
+vercel
+```
+
+It is generally recommended to use a Git repository, because future commits will then automatically be deployed by Vercel, through its [Git Integration](https://vercel.com/docs/concepts/git).
+
+## Development
+
+To run your Remix app locally, make sure your project's local dependencies are installed:
+
+```sh
+npm install
+```
+
+Afterwards, start the Remix development server like so:
+
+```sh
+npm run dev
+```
+
+Open up [http://localhost:3000](http://localhost:3000) and you should be ready to go!
+
+If you're used to using the `vercel dev` command provided by [Vercel CLI](https://vercel.com/cli) instead, you can also use that, but it's not needed.
diff --git a/examples/kitchen-sink/apps/blog/app/entry.client.tsx b/examples/kitchen-sink/apps/blog/app/entry.client.tsx
new file mode 100644
index 0000000..8338545
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/app/entry.client.tsx
@@ -0,0 +1,22 @@
+import { RemixBrowser } from "@remix-run/react";
+import { startTransition, StrictMode } from "react";
+import { hydrateRoot } from "react-dom/client";
+
+function hydrate() {
+ startTransition(() => {
+ hydrateRoot(
+ document,
+ <StrictMode>
+ <RemixBrowser />
+ </StrictMode>
+ );
+ });
+}
+
+if (typeof requestIdleCallback === "function") {
+ requestIdleCallback(hydrate);
+} else {
+ // Safari doesn't support requestIdleCallback
+ // https://caniuse.com/requestidlecallback
+ setTimeout(hydrate, 1);
+}
diff --git a/examples/kitchen-sink/apps/blog/app/entry.server.tsx b/examples/kitchen-sink/apps/blog/app/entry.server.tsx
new file mode 100644
index 0000000..5112e09
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/app/entry.server.tsx
@@ -0,0 +1,18 @@
+import handleRequest from "@vercel/remix-entry-server";
+import { RemixServer } from "@remix-run/react";
+import type { EntryContext } from "@remix-run/server-runtime";
+
+export default function (
+ request: Request,
+ responseStatusCode: number,
+ responseHeaders: Headers,
+ remixContext: EntryContext
+) {
+ const remixServer = <RemixServer context={remixContext} url={request.url} />;
+ return handleRequest(
+ request,
+ responseStatusCode,
+ responseHeaders,
+ remixServer
+ );
+}
diff --git a/examples/kitchen-sink/apps/blog/app/root.tsx b/examples/kitchen-sink/apps/blog/app/root.tsx
new file mode 100644
index 0000000..23a08a8
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/app/root.tsx
@@ -0,0 +1,37 @@
+import type { MetaFunction, LinksFunction } from "@remix-run/node";
+import {
+ Links,
+ LiveReload,
+ Meta,
+ Outlet,
+ Scripts,
+ ScrollRestoration,
+} from "@remix-run/react";
+import styles from "~/styles.css";
+import { Analytics } from "@vercel/analytics/react";
+
+export const meta: MetaFunction = () => ({
+ charset: "utf-8",
+ title: "Blog | Kitchen Sink",
+ viewport: "width=device-width,initial-scale=1",
+});
+
+export const links: LinksFunction = () => [{ rel: "stylesheet", href: styles }];
+
+export default function App() {
+ return (
+ <html lang="en">
+ <head>
+ <Meta />
+ <Links />
+ </head>
+ <body>
+ <Outlet />
+ <ScrollRestoration />
+ <Scripts />
+ <LiveReload />
+ <Analytics />
+ </body>
+ </html>
+ );
+}
diff --git a/examples/kitchen-sink/apps/blog/app/routes/index.tsx b/examples/kitchen-sink/apps/blog/app/routes/index.tsx
new file mode 100644
index 0000000..92dc0cd
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/app/routes/index.tsx
@@ -0,0 +1,18 @@
+import { CounterButton, NewTabLink } from "ui";
+
+export default function Index() {
+ return (
+ <div className="container">
+ <h1 className="title">
+ Blog <br />
+ <span>Kitchen Sink</span>
+ </h1>
+ <CounterButton />
+ <p className="description">
+ Built With{" "}
+ <NewTabLink href="https://turbo.build/repo">Turborepo</NewTabLink> +{" "}
+ <NewTabLink href="https://remix.run/">Remix</NewTabLink>
+ </p>
+ </div>
+ );
+}
diff --git a/examples/kitchen-sink/apps/blog/app/styles.css b/examples/kitchen-sink/apps/blog/app/styles.css
new file mode 100644
index 0000000..d4b766e
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/app/styles.css
@@ -0,0 +1,55 @@
+html {
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
+ Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-tap-highlight-color: transparent;
+ line-height: 1.5;
+ tab-size: 4;
+}
+
+body {
+ margin: 0;
+}
+
+.container {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 1.5rem;
+ max-width: 100%;
+ margin: 0 auto;
+ padding: 0 16px;
+ text-align: center;
+}
+
+.title {
+ font-size: 3rem;
+ font-weight: 700;
+ margin: 0;
+}
+
+.title span {
+ display: inline-block;
+ background-image: linear-gradient(to right, #3b82f6, #ef4444);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+}
+
+.description {
+ color: #9ca3af;
+ font-weight: 500;
+}
+
+.description a {
+ color: #3b82f6;
+ text-decoration: none;
+}
+
+.description a:hover {
+ text-decoration: underline;
+}
diff --git a/examples/kitchen-sink/apps/blog/package.json b/examples/kitchen-sink/apps/blog/package.json
new file mode 100644
index 0000000..c42d201
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "blog",
+ "version": "0.0.0",
+ "private": true,
+ "sideEffects": false,
+ "scripts": {
+ "build": "remix build",
+ "dev": "remix dev"
+ },
+ "dependencies": {
+ "@remix-run/node": "^1.13.0",
+ "@remix-run/react": "^1.13.0",
+ "@remix-run/serve": "^1.13.0",
+ "@remix-run/server-runtime": "^1.13.0",
+ "@vercel/analytics": "^0.1.10",
+ "@vercel/remix-entry-server": "^0.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "ui": "workspace:*"
+ },
+ "devDependencies": {
+ "@remix-run/dev": "^1.13.0",
+ "@types/react": "^18.0.25",
+ "@types/react-dom": "^18.0.11",
+ "eslint": "^8.28.0",
+ "typescript": "^4.9.3",
+ "tsconfig": "workspace:*"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+}
diff --git a/examples/kitchen-sink/apps/blog/public/favicon.ico b/examples/kitchen-sink/apps/blog/public/favicon.ico
new file mode 100644
index 0000000..8830cf6
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/public/favicon.ico
Binary files differ
diff --git a/examples/kitchen-sink/apps/blog/remix.config.js b/examples/kitchen-sink/apps/blog/remix.config.js
new file mode 100644
index 0000000..260b82c
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/remix.config.js
@@ -0,0 +1,10 @@
+/**
+ * @type {import('@remix-run/dev').AppConfig}
+ */
+module.exports = {
+ ignoredRouteFiles: ["**/.*"],
+ // appDirectory: "app",
+ // assetsBuildDirectory: "public/build",
+ // serverBuildPath: "build/index.js",
+ // publicPath: "/build/",
+};
diff --git a/examples/kitchen-sink/apps/blog/remix.env.d.ts b/examples/kitchen-sink/apps/blog/remix.env.d.ts
new file mode 100644
index 0000000..dcf8c45
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/remix.env.d.ts
@@ -0,0 +1,2 @@
+/// <reference types="@remix-run/dev" />
+/// <reference types="@remix-run/node" />
diff --git a/examples/kitchen-sink/apps/blog/server.js b/examples/kitchen-sink/apps/blog/server.js
new file mode 100644
index 0000000..4e2a0e0
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/server.js
@@ -0,0 +1,4 @@
+import { createRequestHandler } from "@remix-run/vercel";
+import * as build from "@remix-run/dev/server-build";
+
+export default createRequestHandler({ build, mode: process.env.NODE_ENV });
diff --git a/examples/kitchen-sink/apps/blog/tsconfig.json b/examples/kitchen-sink/apps/blog/tsconfig.json
new file mode 100644
index 0000000..791822c
--- /dev/null
+++ b/examples/kitchen-sink/apps/blog/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"],
+ "compilerOptions": {
+ "lib": ["dom", "dom.iterable", "ES2019"],
+ "esModuleInterop": true,
+ "jsx": "react-jsx",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "target": "ES2019",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "allowJs": true,
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./app/*"]
+ },
+ "noEmit": true,
+ "isolatedModules": true
+ }
+}
diff --git a/examples/kitchen-sink/apps/storefront/.eslintrc.js b/examples/kitchen-sink/apps/storefront/.eslintrc.js
new file mode 100644
index 0000000..c8df607
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/.eslintrc.js
@@ -0,0 +1,4 @@
+module.exports = {
+ root: true,
+ extends: ["custom"],
+};
diff --git a/examples/kitchen-sink/apps/storefront/next-env.d.ts b/examples/kitchen-sink/apps/storefront/next-env.d.ts
new file mode 100644
index 0000000..4f11a03
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/next-env.d.ts
@@ -0,0 +1,5 @@
+/// <reference types="next" />
+/// <reference types="next/image-types/global" />
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/examples/kitchen-sink/apps/storefront/next.config.js b/examples/kitchen-sink/apps/storefront/next.config.js
new file mode 100644
index 0000000..da1bb77
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/next.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ reactStrictMode: true,
+};
diff --git a/examples/kitchen-sink/apps/storefront/package.json b/examples/kitchen-sink/apps/storefront/package.json
new file mode 100644
index 0000000..08800fd
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "storefront",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "next build",
+ "clean": "rm -rf .next",
+ "dev": "next dev -p 3002",
+ "lint": "next lint",
+ "start": "next start "
+ },
+ "dependencies": {
+ "logger": "workspace:*",
+ "next": "latest",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "ui": "workspace:*"
+ },
+ "devDependencies": {
+ "@types/jest": "^26.0.22",
+ "@types/node": "^17.0.12",
+ "@types/react": "^17.0.13",
+ "@types/react-dom": "^17.0.8",
+ "eslint-config-custom": "workspace:*",
+ "tsconfig": "workspace:*",
+ "typescript": "^4.8.3"
+ }
+}
diff --git a/examples/kitchen-sink/apps/storefront/public/favicon.ico b/examples/kitchen-sink/apps/storefront/public/favicon.ico
new file mode 100644
index 0000000..af98450
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/public/favicon.ico
Binary files differ
diff --git a/examples/kitchen-sink/apps/storefront/src/pages/_app.tsx b/examples/kitchen-sink/apps/storefront/src/pages/_app.tsx
new file mode 100644
index 0000000..7b312a7
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/src/pages/_app.tsx
@@ -0,0 +1,6 @@
+import type { AppProps } from "next/app";
+import "../styles.css";
+
+export default function MyApp({ Component, pageProps }: AppProps) {
+ return <Component {...pageProps} />;
+}
diff --git a/examples/kitchen-sink/apps/storefront/src/pages/index.tsx b/examples/kitchen-sink/apps/storefront/src/pages/index.tsx
new file mode 100644
index 0000000..7adef55
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/src/pages/index.tsx
@@ -0,0 +1,24 @@
+import { log } from "logger";
+import Head from "next/head";
+import { CounterButton, NewTabLink } from "ui";
+
+export default function Store() {
+ log("Hey! This is Home.");
+ return (
+ <div className="container">
+ <Head>
+ <title>Store | Kitchen Sink</title>
+ </Head>
+ <h1 className="title">
+ Store <br />
+ <span>Kitchen Sink</span>
+ </h1>
+ <CounterButton />
+ <p className="description">
+ Built With{" "}
+ <NewTabLink href="https://turbo.build/repo">Turborepo</NewTabLink> +{" "}
+ <NewTabLink href="https://nextjs.org/">Next.js</NewTabLink>
+ </p>
+ </div>
+ );
+}
diff --git a/examples/kitchen-sink/apps/storefront/src/styles.css b/examples/kitchen-sink/apps/storefront/src/styles.css
new file mode 100644
index 0000000..d4b766e
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/src/styles.css
@@ -0,0 +1,55 @@
+html {
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
+ Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-tap-highlight-color: transparent;
+ line-height: 1.5;
+ tab-size: 4;
+}
+
+body {
+ margin: 0;
+}
+
+.container {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 1.5rem;
+ max-width: 100%;
+ margin: 0 auto;
+ padding: 0 16px;
+ text-align: center;
+}
+
+.title {
+ font-size: 3rem;
+ font-weight: 700;
+ margin: 0;
+}
+
+.title span {
+ display: inline-block;
+ background-image: linear-gradient(to right, #3b82f6, #ef4444);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+}
+
+.description {
+ color: #9ca3af;
+ font-weight: 500;
+}
+
+.description a {
+ color: #3b82f6;
+ text-decoration: none;
+}
+
+.description a:hover {
+ text-decoration: underline;
+}
diff --git a/examples/kitchen-sink/apps/storefront/tsconfig.json b/examples/kitchen-sink/apps/storefront/tsconfig.json
new file mode 100644
index 0000000..fcbeaa7
--- /dev/null
+++ b/examples/kitchen-sink/apps/storefront/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "exclude": ["node_modules"],
+ "extends": "tsconfig/nextjs.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist"
+ },
+ "include": ["src", "next-env.d.ts"]
+}