From f65875e7171dba59ae8fb59fd3a4ae0fab3c328e Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Wed, 31 Jan 2024 21:18:13 +0000 Subject: [PATCH 01/27] Creates web --- web/.eslintignore | 38 + web/.eslintrc.cjs | 42 + web/.gitignore | 41 + web/.prettierignore | 37 + web/.vscode/launch.json | 24 + web/.vscode/qwik-city.code-snippets | 36 + web/.vscode/qwik.code-snippets | 78 + web/README.md | 65 + web/package.json | 42 + web/public/favicon.svg | 1 + web/public/fonts/poppins-400.woff2 | Bin 0 -> 7884 bytes web/public/fonts/poppins-500.woff2 | Bin 0 -> 7748 bytes web/public/fonts/poppins-700.woff2 | Bin 0 -> 7816 bytes web/public/manifest.json | 9 + web/public/robots.txt | 0 .../components/router-head/router-head.tsx | 37 + .../starter/counter/counter.module.css | 13 + .../components/starter/counter/counter.tsx | 32 + .../starter/footer/footer.module.css | 23 + web/src/components/starter/footer/footer.tsx | 19 + .../components/starter/gauge/gauge.module.css | 27 + web/src/components/starter/gauge/index.tsx | 38 + .../starter/header/header.module.css | 44 + web/src/components/starter/header/header.tsx | 43 + .../components/starter/hero/hero.module.css | 43 + web/src/components/starter/hero/hero.tsx | 82 + web/src/components/starter/icons/qwik.tsx | 44 + .../starter/infobox/infobox.module.css | 23 + .../components/starter/infobox/infobox.tsx | 13 + .../starter/next-steps/next-steps.module.css | 36 + .../starter/next-steps/next-steps.tsx | 81 + web/src/entry.dev.tsx | 17 + web/src/entry.preview.tsx | 20 + web/src/entry.ssr.tsx | 30 + web/src/global.css | 46 + web/src/media/thunder.png | Bin 0 -> 1651031 bytes web/src/root.tsx | 32 + web/src/routes/demo/flower/flower.css | 77 + web/src/routes/demo/flower/index.tsx | 69 + web/src/routes/demo/todolist/index.tsx | 78 + .../routes/demo/todolist/todolist.module.css | 44 + web/src/routes/index.tsx | 112 + web/src/routes/layout.tsx | 38 + web/src/routes/service-worker.ts | 18 + web/src/routes/styles.css | 214 ++ web/tsconfig.json | 26 + web/vite.config.ts | 20 + web/yarn.lock | 3055 +++++++++++++++++ 48 files changed, 4907 insertions(+) create mode 100644 web/.eslintignore create mode 100644 web/.eslintrc.cjs create mode 100644 web/.gitignore create mode 100644 web/.prettierignore create mode 100644 web/.vscode/launch.json create mode 100644 web/.vscode/qwik-city.code-snippets create mode 100644 web/.vscode/qwik.code-snippets create mode 100644 web/README.md create mode 100644 web/package.json create mode 100644 web/public/favicon.svg create mode 100644 web/public/fonts/poppins-400.woff2 create mode 100644 web/public/fonts/poppins-500.woff2 create mode 100644 web/public/fonts/poppins-700.woff2 create mode 100644 web/public/manifest.json create mode 100644 web/public/robots.txt create mode 100644 web/src/components/router-head/router-head.tsx create mode 100644 web/src/components/starter/counter/counter.module.css create mode 100644 web/src/components/starter/counter/counter.tsx create mode 100644 web/src/components/starter/footer/footer.module.css create mode 100644 web/src/components/starter/footer/footer.tsx create mode 100644 web/src/components/starter/gauge/gauge.module.css create mode 100644 web/src/components/starter/gauge/index.tsx create mode 100644 web/src/components/starter/header/header.module.css create mode 100644 web/src/components/starter/header/header.tsx create mode 100644 web/src/components/starter/hero/hero.module.css create mode 100644 web/src/components/starter/hero/hero.tsx create mode 100644 web/src/components/starter/icons/qwik.tsx create mode 100644 web/src/components/starter/infobox/infobox.module.css create mode 100644 web/src/components/starter/infobox/infobox.tsx create mode 100644 web/src/components/starter/next-steps/next-steps.module.css create mode 100644 web/src/components/starter/next-steps/next-steps.tsx create mode 100644 web/src/entry.dev.tsx create mode 100644 web/src/entry.preview.tsx create mode 100644 web/src/entry.ssr.tsx create mode 100644 web/src/global.css create mode 100644 web/src/media/thunder.png create mode 100644 web/src/root.tsx create mode 100644 web/src/routes/demo/flower/flower.css create mode 100644 web/src/routes/demo/flower/index.tsx create mode 100644 web/src/routes/demo/todolist/index.tsx create mode 100644 web/src/routes/demo/todolist/todolist.module.css create mode 100644 web/src/routes/index.tsx create mode 100644 web/src/routes/layout.tsx create mode 100644 web/src/routes/service-worker.ts create mode 100644 web/src/routes/styles.css create mode 100644 web/tsconfig.json create mode 100644 web/vite.config.ts create mode 100644 web/yarn.lock diff --git a/web/.eslintignore b/web/.eslintignore new file mode 100644 index 0000000..1acecc1 --- /dev/null +++ b/web/.eslintignore @@ -0,0 +1,38 @@ +**/*.log +**/.DS_Store +*. +.vscode/settings.json +.history +.yarn +bazel-* +bazel-bin +bazel-out +bazel-qwik +bazel-testlogs +dist +dist-dev +lib +lib-types +etc +external +node_modules +temp +tsc-out +tsdoc-metadata.json +target +output +rollup.config.js +build +.cache +.vscode +.rollup.cache +dist +tsconfig.tsbuildinfo +vite.config.ts +*.spec.tsx +*.spec.ts +.netlify +pnpm-lock.yaml +package-lock.json +yarn.lock +server diff --git a/web/.eslintrc.cjs b/web/.eslintrc.cjs new file mode 100644 index 0000000..70dc5d0 --- /dev/null +++ b/web/.eslintrc.cjs @@ -0,0 +1,42 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:qwik/recommended", + ], + parser: "@typescript-eslint/parser", + parserOptions: { + tsconfigRootDir: __dirname, + project: ["./tsconfig.json"], + ecmaVersion: 2021, + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + plugins: ["@typescript-eslint"], + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/ban-ts-comment": "off", + "prefer-spread": "off", + "no-case-declarations": "off", + "no-console": "off", + "@typescript-eslint/no-unused-vars": ["error"], + "@typescript-eslint/consistent-type-imports": "warn", + "@typescript-eslint/no-unnecessary-condition": "warn", + }, +}; diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..48dce73 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,41 @@ +# Build +/dist +/lib +/lib-types +/server + +# Development +node_modules +*.local + +# Cache +.cache +.mf +.rollup.cache +tsconfig.tsbuildinfo + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Editor +.vscode/* +!.vscode/launch.json +!.vscode/*.code-snippets + +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Yarn +.yarn/* +!.yarn/releases diff --git a/web/.prettierignore b/web/.prettierignore new file mode 100644 index 0000000..b62a968 --- /dev/null +++ b/web/.prettierignore @@ -0,0 +1,37 @@ +**/*.log +**/.DS_Store +*. +.vscode/settings.json +.history +.yarn +bazel-* +bazel-bin +bazel-out +bazel-qwik +bazel-testlogs +dist +dist-dev +lib +lib-types +etc +external +node_modules +temp +tsc-out +tsdoc-metadata.json +target +output +rollup.config.js +build +.cache +.vscode +.rollup.cache +tsconfig.tsbuildinfo +vite.config.ts +*.spec.tsx +*.spec.ts +.netlify +pnpm-lock.yaml +package-lock.json +yarn.lock +server diff --git a/web/.vscode/launch.json b/web/.vscode/launch.json new file mode 100644 index 0000000..e684cc8 --- /dev/null +++ b/web/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Chrome", + "request": "launch", + "type": "chrome", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}" + }, + { + "type": "node", + "name": "dev.debug", + "request": "launch", + "skipFiles": ["/**"], + "cwd": "${workspaceFolder}", + "program": "${workspaceFolder}/node_modules/vite/bin/vite.js", + "args": ["--mode", "ssr", "--force"] + } + ] +} diff --git a/web/.vscode/qwik-city.code-snippets b/web/.vscode/qwik-city.code-snippets new file mode 100644 index 0000000..878fcf6 --- /dev/null +++ b/web/.vscode/qwik-city.code-snippets @@ -0,0 +1,36 @@ +{ + "onRequest": { + "scope": "javascriptreact,typescriptreact", + "prefix": "qonRequest", + "description": "onRequest function for a route index", + "body": [ + "export const onRequest: RequestHandler = (request) => {", + " $0", + "};", + ], + }, + "loader$": { + "scope": "javascriptreact,typescriptreact", + "prefix": "qloader$", + "description": "loader$()", + "body": ["export const $1 = routeLoader$(() => {", " $0", "});"], + }, + "action$": { + "scope": "javascriptreact,typescriptreact", + "prefix": "qaction$", + "description": "action$()", + "body": ["export const $1 = routeAction$((data) => {", " $0", "});"], + }, + "Full Page": { + "scope": "javascriptreact,typescriptreact", + "prefix": "qpage", + "description": "Simple page component", + "body": [ + "import { component$ } from '@builder.io/qwik';", + "", + "export default component$(() => {", + " $0", + "});", + ], + }, +} diff --git a/web/.vscode/qwik.code-snippets b/web/.vscode/qwik.code-snippets new file mode 100644 index 0000000..62edc82 --- /dev/null +++ b/web/.vscode/qwik.code-snippets @@ -0,0 +1,78 @@ +{ + "Qwik component (simple)": { + "scope": "javascriptreact,typescriptreact", + "prefix": "qcomponent$", + "description": "Simple Qwik component", + "body": [ + "export const ${1:${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}} = component$(() => {", + " return <${2:div}>$4", + "});", + ], + }, + "Qwik component (props)": { + "scope": "typescriptreact", + "prefix": "qcomponent$ + props", + "description": "Qwik component w/ props", + "body": [ + "export interface ${1:${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}}Props {", + " $2", + "}", + "", + "export const $1 = component$<$1Props>((props) => {", + " const ${2:count} = useSignal(0);", + " return (", + " <${3:div} on${4:Click}$={(ev) => {$5}}>", + " $6", + " ", + " );", + "});", + ], + }, + "Qwik signal": { + "scope": "javascriptreact,typescriptreact", + "prefix": "quseSignal", + "description": "useSignal() declaration", + "body": ["const ${1:foo} = useSignal($2);", "$0"], + }, + "Qwik store": { + "scope": "javascriptreact,typescriptreact", + "prefix": "quseStore", + "description": "useStore() declaration", + "body": ["const ${1:state} = useStore({", " $2", "});", "$0"], + }, + "$ hook": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q$", + "description": "$() function hook", + "body": ["$(() => {", " $0", "});", ""], + }, + "useVisibleTask": { + "scope": "javascriptreact,typescriptreact", + "prefix": "quseVisibleTask", + "description": "useVisibleTask$() function hook", + "body": ["useVisibleTask$(({ track }) => {", " $0", "});", ""], + }, + "useTask": { + "scope": "javascriptreact,typescriptreact", + "prefix": "quseTask$", + "description": "useTask$() function hook", + "body": [ + "useTask$(({ track }) => {", + " track(() => $1);", + " $0", + "});", + "", + ], + }, + "useResource": { + "scope": "javascriptreact,typescriptreact", + "prefix": "quseResource$", + "description": "useResource$() declaration", + "body": [ + "const $1 = useResource$(({ track, cleanup }) => {", + " $0", + "});", + "", + ], + }, +} diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..7f8f3c7 --- /dev/null +++ b/web/README.md @@ -0,0 +1,65 @@ +# Qwik City App ⚡️ + +- [Qwik Docs](https://qwik.builder.io/) +- [Discord](https://qwik.builder.io/chat) +- [Qwik GitHub](https://github.com/BuilderIO/qwik) +- [@QwikDev](https://twitter.com/QwikDev) +- [Vite](https://vitejs.dev/) + +--- + +## Project Structure + +This project is using Qwik with [QwikCity](https://qwik.builder.io/qwikcity/overview/). QwikCity is just an extra set of tools on top of Qwik to make it easier to build a full site, including directory-based routing, layouts, and more. + +Inside your project, you'll see the following directory structure: + +``` +├── public/ +│ └── ... +└── src/ + ├── components/ + │ └── ... + └── routes/ + └── ... +``` + +- `src/routes`: Provides the directory-based routing, which can include a hierarchy of `layout.tsx` layout files, and an `index.tsx` file as the page. Additionally, `index.ts` files are endpoints. Please see the [routing docs](https://qwik.builder.io/qwikcity/routing/overview/) for more info. + +- `src/components`: Recommended directory for components. + +- `public`: Any static assets, like images, can be placed in the public directory. Please see the [Vite public directory](https://vitejs.dev/guide/assets.html#the-public-directory) for more info. + +## Add Integrations and deployment + +Use the `yarn qwik add` command to add additional integrations. Some examples of integrations includes: Cloudflare, Netlify or Express Server, and the [Static Site Generator (SSG)](https://qwik.builder.io/qwikcity/guides/static-site-generation/). + +```shell +yarn qwik add # or `yarn qwik add` +``` + +## Development + +Development mode uses [Vite's development server](https://vitejs.dev/). The `dev` command will server-side render (SSR) the output during development. + +```shell +npm start # or `yarn start` +``` + +> Note: during dev mode, Vite may request a significant number of `.js` files. This does not represent a Qwik production build. + +## Preview + +The preview command will create a production build of the client modules, a production build of `src/entry.preview.tsx`, and run a local server. The preview server is only for convenience to preview a production build locally and should not be used as a production server. + +```shell +yarn preview # or `yarn preview` +``` + +## Production + +The production build will generate client and server modules by running both client and server build commands. The build command will use Typescript to run a type check on the source code. + +```shell +yarn build # or `yarn build` +``` diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..6a2227a --- /dev/null +++ b/web/package.json @@ -0,0 +1,42 @@ +{ + "name": "my-qwik-basic-starter", + "description": "Demo App with Routing built-in (recommended)", + "engines": { + "node": ">=15.0.0" + }, + "private": true, + "trustedDependencies": [ + "sharp" + ], + "type": "module", + "scripts": { + "build": "qwik build", + "build.client": "vite build", + "build.preview": "vite build --ssr src/entry.preview.tsx", + "build.types": "tsc --incremental --noEmit", + "deploy": "echo 'Run \"npm run qwik add\" to install a server adapter'", + "dev": "vite --mode ssr", + "dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force", + "fmt": "prettier --write .", + "fmt.check": "prettier --check .", + "lint": "eslint \"src/**/*.ts*\"", + "preview": "qwik build preview && vite preview --open", + "start": "vite --open --mode ssr", + "qwik": "qwik" + }, + "devDependencies": { + "@builder.io/qwik": "^1.4.3", + "@builder.io/qwik-city": "^1.4.3", + "@types/eslint": "^8.56.2", + "@types/node": "^20.11.6", + "@typescript-eslint/eslint-plugin": "^6.19.1", + "@typescript-eslint/parser": "^6.19.1", + "eslint": "^8.56.0", + "eslint-plugin-qwik": "^1.4.3", + "prettier": "^3.2.4", + "typescript": "5.3.3", + "undici": "*", + "vite": "^5.0.12", + "vite-tsconfig-paths": "^4.2.1" + } +} diff --git a/web/public/favicon.svg b/web/public/favicon.svg new file mode 100644 index 0000000..0ded7c1 --- /dev/null +++ b/web/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/fonts/poppins-400.woff2 b/web/public/fonts/poppins-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b69e0091c26c46151996a7feec95515567f95ac2 GIT binary patch literal 7884 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 literal 0 HcmV?d00001 diff --git a/web/public/fonts/poppins-500.woff2 b/web/public/fonts/poppins-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c6603368bf147d85b919d0ce9766bff0a73959d0 GIT binary patch literal 7748 zcmV-K9=qXpPew8T0RR9103JjD3;+NC06%a503GoF0RR9100000000000000000000 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 a#rF!vrZP-gD&O<}^};ukMx!zS00029z2{T_ literal 0 HcmV?d00001 diff --git a/web/public/manifest.json b/web/public/manifest.json new file mode 100644 index 0000000..c18e75f --- /dev/null +++ b/web/public/manifest.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/web-manifest-combined.json", + "name": "qwik-project-name", + "short_name": "Welcome to Qwik", + "start_url": ".", + "display": "standalone", + "background_color": "#fff", + "description": "A Qwik project app." +} diff --git a/web/public/robots.txt b/web/public/robots.txt new file mode 100644 index 0000000..e69de29 diff --git a/web/src/components/router-head/router-head.tsx b/web/src/components/router-head/router-head.tsx new file mode 100644 index 0000000..8d6134a --- /dev/null +++ b/web/src/components/router-head/router-head.tsx @@ -0,0 +1,37 @@ +import { useDocumentHead, useLocation } from "@builder.io/qwik-city"; + +import { component$ } from "@builder.io/qwik"; + +/** + * The RouterHead component is placed inside of the document `` element. + */ +export const RouterHead = component$(() => { + const head = useDocumentHead(); + const loc = useLocation(); + + return ( + <> + {head.title} + + + + + + {head.meta.map((m) => ( + + ))} + + {head.links.map((l) => ( + + ))} + + {head.styles.map((s) => ( +