Skip to content

Commit

Adjust repo structure and update to vue 3 with vite

john-peterson-g17committed Parent6af24a2Browse files
49 files+6851−122000/49 viewed
+2−0
1+*/node_modules
2+*/.vscode
+29−0
1+# Logs
2+logs
3+*.log
4+npm-debug.log*
5+yarn-debug.log*
6+yarn-error.log*
7+pnpm-debug.log*
8+lerna-debug.log*
9+
10+node_modules
11+.DS_Store
12+dist
13+dist-ssr
14+coverage
15+*.local
16+
17+/cypress/videos/
18+/cypress/screenshots/
19+
20+# Editor directories and files
21+.vscode/*
22+!.vscode/extensions.json
23+.idea
24+*.suo
25+*.ntvs*
26+*.njsproj
27+*.sln
28+*.sw?
29+*/.vscode
+11−0
1+FROM node:16-alpine
2+
3+WORKDIR /app
4+
5+COPY ./src /app
6+
7+RUN npm install
8+
9+EXPOSE 8080
10+
11+CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "8080"]
+24−0
1+# frontend
2+
3+## Project setup
4+```
5+npm install
6+```
7+
8+### Compiles and hot-reloads for development
9+```
10+npm run serve
11+```
12+
13+### Compiles and minifies for production
14+```
15+npm run build
16+```
17+
18+### Lints and fixes files
19+```
20+npm run lint
21+```
22+
23+### Customize configuration
24+See [Configuration Reference](https://cli.vuejs.org/config/).
+9−4
11 version: '3'
2+
3+volumes:
4+ node_modules:
5+
26 services:
37 # nodejs-server:
48 # build:
1317
1418 vue-frontend:
1519 build:
16− context: ./frontend
20+ context: .
1721 dockerfile: Dockerfile
1822 ports:
19− - "8080:8080"
20− working_dir: "/src/app"
23+ - 8080:8080
24+ working_dir: /app
2125 container_name: vue-frontend
2226 volumes:
23− - ./frontend:/src/app
27+ - ./src:/app
28+ - node_modules:/app/node_modules
+0−1
1−node_modules
+0−23
1−.DS_Store
2−node_modules
3−/dist
4−
5−
6−# local env files
7−.env.local
8−.env.*.local
9−
10−# Log files
11−npm-debug.log*
12−yarn-debug.log*
13−yarn-error.log*
14−pnpm-debug.log*
15−
16−# Editor directories and files
17−.idea
18−.vscode
19−*.suo
20−*.ntvs*
21−*.njsproj
22−*.sln
23−*.sw?
+0−13
1−FROM node:14-alpine
2−
3−WORKDIR /src/app
4−
5−COPY package*.json /src/app
6−
7−COPY . /src/app/
8−
9−RUN npm install
10−
11−EXPOSE 8080
12−
13−CMD ["npm", "run", "serve"]
+0−24
1−# frontend
2−
3−## Project setup
4−```
5−npm install
6−```
7−
8−### Compiles and hot-reloads for development
9−```
10−npm run serve
11−```
12−
13−### Compiles and minifies for production
14−```
15−npm run build
16−```
17−
18−### Lints and fixes files
19−```
20−npm run lint
21−```
22−
23−### Customize configuration
24−See [Configuration Reference](https://cli.vuejs.org/config/).
+0−5
1−module.exports = {
2− presets: [
3− '@vue/cli-plugin-babel/preset'
4− ]
5−}
+0−12028
A large diff (12,028 lines) is not shown until you ask for it.
+0−42
1−{
2− "name": "frontend",
3− "version": "0.1.0",
4− "private": true,
5− "scripts": {
6− "serve": "vue-cli-service serve",
7− "build": "vue-cli-service build",
8− "lint": "vue-cli-service lint"
9− },
10− "dependencies": {
11− "core-js": "^3.6.5",
12− "vue": "^2.6.11"
13− },
14− "devDependencies": {
15− "@vue/cli-plugin-babel": "~4.5.0",
16− "@vue/cli-plugin-eslint": "~4.5.0",
17− "@vue/cli-service": "~4.5.0",
18− "babel-eslint": "^10.1.0",
19− "eslint": "^6.7.2",
20− "eslint-plugin-vue": "^6.2.2",
21− "vue-template-compiler": "^2.6.11"
22− },
23− "eslintConfig": {
24− "root": true,
25− "env": {
26− "node": true
27− },
28− "extends": [
29− "plugin:vue/essential",
30− "eslint:recommended"
31− ],
32− "parserOptions": {
33− "parser": "babel-eslint"
34− },
35− "rules": {}
36− },
37− "browserslist": [
38− "> 1%",
39− "last 2 versions",
40− "not dead"
41− ]
42−}
+0−0

Binary or large file; its contents are not shown.

+0−17
1−<!DOCTYPE html>
2−<html lang="">
3− <head>
4− <meta charset="utf-8">
5− <meta http-equiv="X-UA-Compatible" content="IE=edge">
6− <meta name="viewport" content="width=device-width,initial-scale=1.0">
7− <link rel="icon" href="<%= BASE_URL %>favicon.ico">
8− <title><%= htmlWebpackPlugin.options.title %></title>
9− </head>
10− <body>
11− <noscript>
12− <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
13− </noscript>
14− <div id="app"></div>
15− <!-- built files will be auto injected -->
16− </body>
17−</html>
+0−21
1−<template>
2− <div id="app">
3− <img alt="Vue logo" src="./assets/logo.png">
4− <Nav/>
5− </div>
6−</template>
7−
8−<script>
9−import Nav from './components/Nav.vue'
10−
11−export default {
12− name: 'App',
13− components: {
14− Nav
15− }
16−}
17−</script>
18−
19−<style>
20−
21−</style>
+0−0

Binary or large file; its contents are not shown.

+0−14
1−<template>
2− <nav>
3− <p>some nav component</p>
4− </nav>
5−</template>
6−
7−<script>
8−export default {}
9−</script>
10−
11−<!-- Add "scoped" attribute to limit CSS to this component only -->
12−<style scoped>
13−
14−</style>
+0−8
1−import Vue from 'vue'
2−import App from './App.vue'
3−
4−Vue.config.productionTip = false
5−
6−new Vue({
7− render: h => h(App),
8−}).$mount('#app')
+15−0
1+/* eslint-env node */
2+require('@rushstack/eslint-patch/modern-module-resolution')
3+
4+module.exports = {
5+ root: true,
6+ 'extends': [
7+ 'plugin:vue/vue3-essential',
8+ 'eslint:recommended',
9+ '@vue/eslint-config-typescript',
10+ '@vue/eslint-config-prettier/skip-formatting'
11+ ],
12+ parserOptions: {
13+ ecmaVersion: 'latest'
14+ }
15+}
+8−0
1+{
2+ "$schema": "https://json.schemastore.org/prettierrc",
3+ "semi": false,
4+ "tabWidth": 2,
5+ "singleQuote": true,
6+ "printWidth": 100,
7+ "trailingComma": "none"
8+}
+52−0
1+# .
2+
3+This template should help get you started developing with Vue 3 in Vite.
4+
5+## Recommended IDE Setup
6+
7+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
8+
9+## Type Support for `.vue` Imports in TS
10+
11+TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
12+
13+If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
14+
15+1. Disable the built-in TypeScript Extension
16+ 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
17+ 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
18+2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
19+
20+## Customize configuration
21+
22+See [Vite Configuration Reference](https://vitejs.dev/config/).
23+
24+## Project Setup
25+
26+```sh
27+npm install
28+```
29+
30+### Compile and Hot-Reload for Development
31+
32+```sh
33+npm run dev
34+```
35+
36+### Type-Check, Compile and Minify for Production
37+
38+```sh
39+npm run build
40+```
41+
42+### Run Unit Tests with [Vitest](https://vitest.dev/)
43+
44+```sh
45+npm run test:unit
46+```
47+
48+### Lint with [ESLint](https://eslint.org/)
49+
50+```sh
51+npm run lint
52+```
+1−0
1+/// <reference types="vite/client" />
+13−0
1+<!DOCTYPE html>
2+<html lang="en">
3+ <head>
4+ <meta charset="UTF-8">
5+ <link rel="icon" href="/favicon.ico">
6+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7+ <title>Vite App</title>
8+ </head>
9+ <body>
10+ <div id="app"></div>
11+ <script type="module" src="/src/main.ts"></script>
12+ </body>
13+</html>
+6037−0
A large diff (6,037 lines) is not shown until you ask for it.
+40−0
1+{
2+ "name": "todo-app",
3+ "version": "0.0.0",
4+ "private": true,
5+ "scripts": {
6+ "dev": "vite",
7+ "build": "run-p type-check build-only",
8+ "preview": "vite preview",
9+ "test:unit": "vitest",
10+ "build-only": "vite build",
11+ "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
12+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
13+ "format": "prettier --write src/"
14+ },
15+ "dependencies": {
16+ "vue": "^3.3.4",
17+ "vue-router": "^4.2.2"
18+ },
19+ "devDependencies": {
20+ "@rushstack/eslint-patch": "^1.2.0",
21+ "@tsconfig/node18": "^2.0.1",
22+ "@types/jsdom": "^21.1.1",
23+ "@types/node": "^18.16.17",
24+ "@vitejs/plugin-vue": "^4.2.3",
25+ "@vitejs/plugin-vue-jsx": "^3.0.1",
26+ "@vue/eslint-config-prettier": "^7.1.0",
27+ "@vue/eslint-config-typescript": "^11.0.3",
28+ "@vue/test-utils": "^2.3.2",
29+ "@vue/tsconfig": "^0.4.0",
30+ "eslint": "^8.39.0",
31+ "eslint-plugin-vue": "^9.11.0",
32+ "jsdom": "^22.1.0",
33+ "npm-run-all": "^4.1.5",
34+ "prettier": "^2.8.8",
35+ "typescript": "~5.0.4",
36+ "vite": "^4.3.9",
37+ "vitest": "^0.32.0",
38+ "vue-tsc": "^1.6.5"
39+ }
40+}
+0−0

Binary or large file; its contents are not shown.

+85−0
1+<script setup lang="ts">
2+import { RouterLink, RouterView } from 'vue-router'
3+import HelloWorld from './components/HelloWorld.vue'
4+</script>
5+
6+<template>
7+ <header>
8+ <img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" />
9+
10+ <div class="wrapper">
11+ <HelloWorld msg="You did it!" />
12+
13+ <nav>
14+ <RouterLink to="/">Home</RouterLink>
15+ <RouterLink to="/about">About</RouterLink>
16+ </nav>
17+ </div>
18+ </header>
19+
20+ <RouterView />
21+</template>
22+
23+<style scoped>
24+header {
25+ line-height: 1.5;
26+ max-height: 100vh;
27+}
28+
29+.logo {
30+ display: block;
31+ margin: 0 auto 2rem;
32+}
33+
34+nav {
35+ width: 100%;
36+ font-size: 12px;
37+ text-align: center;
38+ margin-top: 2rem;
39+}
40+
41+nav a.router-link-exact-active {
42+ color: var(--color-text);
43+}
44+
45+nav a.router-link-exact-active:hover {
46+ background-color: transparent;
47+}
48+
49+nav a {
50+ display: inline-block;
51+ padding: 0 1rem;
52+ border-left: 1px solid var(--color-border);
53+}
54+
55+nav a:first-of-type {
56+ border: 0;
57+}
58+
59+@media (min-width: 1024px) {
60+ header {
61+ display: flex;
62+ place-items: center;
63+ padding-right: calc(var(--section-gap) / 2);
64+ }
65+
66+ .logo {
67+ margin: 0 2rem 0 0;
68+ }
69+
70+ header .wrapper {
71+ display: flex;
72+ place-items: flex-start;
73+ flex-wrap: wrap;
74+ }
75+
76+ nav {
77+ text-align: left;
78+ margin-left: -1rem;
79+ font-size: 1rem;
80+
81+ padding: 1rem 0;
82+ margin-top: 1rem;
83+ }
84+}
85+</style>
+73−0
1+/* color palette from <https://github.com/vuejs/theme> */
2+:root {
3+ --vt-c-white: #ffffff;
4+ --vt-c-white-soft: #f8f8f8;
5+ --vt-c-white-mute: #f2f2f2;
6+
7+ --vt-c-black: #181818;
8+ --vt-c-black-soft: #222222;
9+ --vt-c-black-mute: #282828;
10+
11+ --vt-c-indigo: #2c3e50;
12+
13+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
14+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
15+ --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
16+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
17+
18+ --vt-c-text-light-1: var(--vt-c-indigo);
19+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
20+ --vt-c-text-dark-1: var(--vt-c-white);
21+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
22+}
23+
24+/* semantic color variables for this project */
25+:root {
26+ --color-background: var(--vt-c-white);
27+ --color-background-soft: var(--vt-c-white-soft);
28+ --color-background-mute: var(--vt-c-white-mute);
29+
30+ --color-border: var(--vt-c-divider-light-2);
31+ --color-border-hover: var(--vt-c-divider-light-1);
32+
33+ --color-heading: var(--vt-c-text-light-1);
34+ --color-text: var(--vt-c-text-light-1);
35+
36+ --section-gap: 160px;
37+}
38+
39+@media (prefers-color-scheme: dark) {
40+ :root {
41+ --color-background: var(--vt-c-black);
42+ --color-background-soft: var(--vt-c-black-soft);
43+ --color-background-mute: var(--vt-c-black-mute);
44+
45+ --color-border: var(--vt-c-divider-dark-2);
46+ --color-border-hover: var(--vt-c-divider-dark-1);
47+
48+ --color-heading: var(--vt-c-text-dark-1);
49+ --color-text: var(--vt-c-text-dark-2);
50+ }
51+}
52+
53+*,
54+*::before,
55+*::after {
56+ box-sizing: border-box;
57+ margin: 0;
58+ font-weight: normal;
59+}
60+
61+body {
62+ min-height: 100vh;
63+ color: var(--color-text);
64+ background: var(--color-background);
65+ transition: color 0.5s, background-color 0.5s;
66+ line-height: 1.6;
67+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
68+ Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
69+ font-size: 15px;
70+ text-rendering: optimizeLegibility;
71+ -webkit-font-smoothing: antialiased;
72+ -moz-osx-font-smoothing: grayscale;
73+}
+1−0
1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
+35−0
1+@import './base.css';
2+
3+#app {
4+ max-width: 1280px;
5+ margin: 0 auto;
6+ padding: 2rem;
7+
8+ font-weight: normal;
9+}
10+
11+a,
12+.green {
13+ text-decoration: none;
14+ color: hsla(160, 100%, 37%, 1);
15+ transition: 0.4s;
16+}
17+
18+@media (hover: hover) {
19+ a:hover {
20+ background-color: hsla(160, 100%, 37%, 0.2);
21+ }
22+}
23+
24+@media (min-width: 1024px) {
25+ body {
26+ display: flex;
27+ place-items: center;
28+ }
29+
30+ #app {
31+ display: grid;
32+ grid-template-columns: 1fr 1fr;
33+ padding: 0 2rem;
34+ }
35+}
+41−0
1+<script setup lang="ts">
2+defineProps<{
3+ msg: string
4+}>()
5+</script>
6+
7+<template>
8+ <div class="greetings">
9+ <h1 class="green">{{ msg }}</h1>
10+ <h3>
11+ You’ve successfully created a project with
12+ <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
13+ <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>. What's next?
14+ </h3>
15+ </div>
16+</template>
17+
18+<style scoped>
19+h1 {
20+ font-weight: 500;
21+ font-size: 2.6rem;
22+ position: relative;
23+ top: -10px;
24+}
25+
26+h3 {
27+ font-size: 1.2rem;
28+}
29+
30+.greetings h1,
31+.greetings h3 {
32+ text-align: center;
33+}
34+
35+@media (min-width: 1024px) {
36+ .greetings h1,
37+ .greetings h3 {
38+ text-align: left;
39+ }
40+}
41+</style>
+86−0
1+<script setup lang="ts">
2+import WelcomeItem from './WelcomeItem.vue'
3+import DocumentationIcon from './icons/IconDocumentation.vue'
4+import ToolingIcon from './icons/IconTooling.vue'
5+import EcosystemIcon from './icons/IconEcosystem.vue'
6+import CommunityIcon from './icons/IconCommunity.vue'
7+import SupportIcon from './icons/IconSupport.vue'
8+</script>
9+
10+<template>
11+ <WelcomeItem>
12+ <template #icon>
13+ <DocumentationIcon />
14+ </template>
15+ <template #heading>Documentation</template>
16+
17+ Vue’s
18+ <a href="https://vuejs.org/" target="_blank" rel="noopener">official documentation</a>
19+ provides you with all information you need to get started.
20+ </WelcomeItem>
21+
22+ <WelcomeItem>
23+ <template #icon>
24+ <ToolingIcon />
25+ </template>
26+ <template #heading>Tooling</template>
27+
28+ This project is served and bundled with
29+ <a href="https://vitejs.dev/guide/features.html" target="_blank" rel="noopener">Vite</a>. The
30+ recommended IDE setup is
31+ <a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VSCode</a> +
32+ <a href="https://github.com/johnsoncodehk/volar" target="_blank" rel="noopener">Volar</a>. If
33+ you need to test your components and web pages, check out
34+ <a href="https://www.cypress.io/" target="_blank" rel="noopener">Cypress</a> and
35+ <a href="https://on.cypress.io/component" target="_blank">Cypress Component Testing</a>.
36+
37+ <br />
38+
39+ More instructions are available in <code>README.md</code>.
40+ </WelcomeItem>
41+
42+ <WelcomeItem>
43+ <template #icon>
44+ <EcosystemIcon />
45+ </template>
46+ <template #heading>Ecosystem</template>
47+
48+ Get official tools and libraries for your project:
49+ <a href="https://pinia.vuejs.org/" target="_blank" rel="noopener">Pinia</a>,
50+ <a href="https://router.vuejs.org/" target="_blank" rel="noopener">Vue Router</a>,
51+ <a href="https://test-utils.vuejs.org/" target="_blank" rel="noopener">Vue Test Utils</a>, and
52+ <a href="https://github.com/vuejs/devtools" target="_blank" rel="noopener">Vue Dev Tools</a>. If
53+ you need more resources, we suggest paying
54+ <a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">Awesome Vue</a>
55+ a visit.
56+ </WelcomeItem>
57+
58+ <WelcomeItem>
59+ <template #icon>
60+ <CommunityIcon />
61+ </template>
62+ <template #heading>Community</template>
63+
64+ Got stuck? Ask your question on
65+ <a href="https://chat.vuejs.org" target="_blank" rel="noopener">Vue Land</a>, our official
66+ Discord server, or
67+ <a href="https://stackoverflow.com/questions/tagged/vue.js" target="_blank" rel="noopener"
68+ >StackOverflow</a
69+ >. You should also subscribe to
70+ <a href="https://news.vuejs.org" target="_blank" rel="noopener">our mailing list</a> and follow
71+ the official
72+ <a href="https://twitter.com/vuejs" target="_blank" rel="noopener">@vuejs</a>
73+ twitter account for latest news in the Vue world.
74+ </WelcomeItem>
75+
76+ <WelcomeItem>
77+ <template #icon>
78+ <SupportIcon />
79+ </template>
80+ <template #heading>Support Vue</template>
81+
82+ As an independent project, Vue relies on community backing for its sustainability. You can help
83+ us by
84+ <a href="https://vuejs.org/sponsor/" target="_blank" rel="noopener">becoming a sponsor</a>.
85+ </WelcomeItem>
86+</template>
+87−0
1+<template>
2+ <div class="item">
3+ <i>
4+ <slot name="icon"></slot>
5+ </i>
6+ <div class="details">
7+ <h3>
8+ <slot name="heading"></slot>
9+ </h3>
10+ <slot></slot>
11+ </div>
12+ </div>
13+</template>
14+
15+<style scoped>
16+.item {
17+ margin-top: 2rem;
18+ display: flex;
19+ position: relative;
20+}
21+
22+.details {
23+ flex: 1;
24+ margin-left: 1rem;
25+}
26+
27+i {
28+ display: flex;
29+ place-items: center;
30+ place-content: center;
31+ width: 32px;
32+ height: 32px;
33+
34+ color: var(--color-text);
35+}
36+
37+h3 {
38+ font-size: 1.2rem;
39+ font-weight: 500;
40+ margin-bottom: 0.4rem;
41+ color: var(--color-heading);
42+}
43+
44+@media (min-width: 1024px) {
45+ .item {
46+ margin-top: 0;
47+ padding: 0.4rem 0 1rem calc(var(--section-gap) / 2);
48+ }
49+
50+ i {
51+ top: calc(50% - 25px);
52+ left: -26px;
53+ position: absolute;
54+ border: 1px solid var(--color-border);
55+ background: var(--color-background);
56+ border-radius: 8px;
57+ width: 50px;
58+ height: 50px;
59+ }
60+
61+ .item:before {
62+ content: ' ';
63+ border-left: 1px solid var(--color-border);
64+ position: absolute;
65+ left: 0;
66+ bottom: calc(50% + 25px);
67+ height: calc(50% - 25px);
68+ }
69+
70+ .item:after {
71+ content: ' ';
72+ border-left: 1px solid var(--color-border);
73+ position: absolute;
74+ left: 0;
75+ top: calc(50% + 25px);
76+ height: calc(50% - 25px);
77+ }
78+
79+ .item:first-of-type:before {
80+ display: none;
81+ }
82+
83+ .item:last-of-type:after {
84+ display: none;
85+ }
86+}
87+</style>
+11−0
1+import { describe, it, expect } from 'vitest'
2+
3+import { mount } from '@vue/test-utils'
4+import HelloWorld from '../HelloWorld.vue'
5+
6+describe('HelloWorld', () => {
7+ it('renders properly', () => {
8+ const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } })
9+ expect(wrapper.text()).toContain('Hello Vitest')
10+ })
11+})
+7−0
1+<template>
2+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor">
3+ <path
4+ d="M15 4a1 1 0 1 0 0 2V4zm0 11v-1a1 1 0 0 0-1 1h1zm0 4l-.707.707A1 1 0 0 0 16 19h-1zm-4-4l.707-.707A1 1 0 0 0 11 14v1zm-4.707-1.293a1 1 0 0 0-1.414 1.414l1.414-1.414zm-.707.707l-.707-.707.707.707zM9 11v-1a1 1 0 0 0-.707.293L9 11zm-4 0h1a1 1 0 0 0-1-1v1zm0 4H4a1 1 0 0 0 1.707.707L5 15zm10-9h2V4h-2v2zm2 0a1 1 0 0 1 1 1h2a3 3 0 0 0-3-3v2zm1 1v6h2V7h-2zm0 6a1 1 0 0 1-1 1v2a3 3 0 0 0 3-3h-2zm-1 1h-2v2h2v-2zm-3 1v4h2v-4h-2zm1.707 3.293l-4-4-1.414 1.414 4 4 1.414-1.414zM11 14H7v2h4v-2zm-4 0c-.276 0-.525-.111-.707-.293l-1.414 1.414C5.42 15.663 6.172 16 7 16v-2zm-.707 1.121l3.414-3.414-1.414-1.414-3.414 3.414 1.414 1.414zM9 12h4v-2H9v2zm4 0a3 3 0 0 0 3-3h-2a1 1 0 0 1-1 1v2zm3-3V3h-2v6h2zm0-6a3 3 0 0 0-3-3v2a1 1 0 0 1 1 1h2zm-3-3H3v2h10V0zM3 0a3 3 0 0 0-3 3h2a1 1 0 0 1 1-1V0zM0 3v6h2V3H0zm0 6a3 3 0 0 0 3 3v-2a1 1 0 0 1-1-1H0zm3 3h2v-2H3v2zm1-1v4h2v-4H4zm1.707 4.707l.586-.586-1.414-1.414-.586.586 1.414 1.414z"
5+ />
6+ </svg>
7+</template>
+7−0
1+<template>
2+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" fill="currentColor">
3+ <path
4+ d="M11 2.253a1 1 0 1 0-2 0h2zm-2 13a1 1 0 1 0 2 0H9zm.447-12.167a1 1 0 1 0 1.107-1.666L9.447 3.086zM1 2.253L.447 1.42A1 1 0 0 0 0 2.253h1zm0 13H0a1 1 0 0 0 1.553.833L1 15.253zm8.447.833a1 1 0 1 0 1.107-1.666l-1.107 1.666zm0-14.666a1 1 0 1 0 1.107 1.666L9.447 1.42zM19 2.253h1a1 1 0 0 0-.447-.833L19 2.253zm0 13l-.553.833A1 1 0 0 0 20 15.253h-1zm-9.553-.833a1 1 0 1 0 1.107 1.666L9.447 14.42zM9 2.253v13h2v-13H9zm1.553-.833C9.203.523 7.42 0 5.5 0v2c1.572 0 2.961.431 3.947 1.086l1.107-1.666zM5.5 0C3.58 0 1.797.523.447 1.42l1.107 1.666C2.539 2.431 3.928 2 5.5 2V0zM0 2.253v13h2v-13H0zm1.553 13.833C2.539 15.431 3.928 15 5.5 15v-2c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM5.5 15c1.572 0 2.961.431 3.947 1.086l1.107-1.666C9.203 13.523 7.42 13 5.5 13v2zm5.053-11.914C11.539 2.431 12.928 2 14.5 2V0c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM14.5 2c1.573 0 2.961.431 3.947 1.086l1.107-1.666C18.203.523 16.421 0 14.5 0v2zm3.5.253v13h2v-13h-2zm1.553 12.167C18.203 13.523 16.421 13 14.5 13v2c1.573 0 2.961.431 3.947 1.086l1.107-1.666zM14.5 13c-1.92 0-3.703.523-5.053 1.42l1.107 1.666C11.539 15.431 12.928 15 14.5 15v-2z"
5+ />
6+ </svg>
7+</template>
+7−0
1+<template>
2+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="20" fill="currentColor">
3+ <path
4+ d="M11.447 8.894a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm0 1.789a1 1 0 1 0 .894-1.789l-.894 1.789zM7.447 7.106a1 1 0 1 0-.894 1.789l.894-1.789zM10 9a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0H8zm9.447-5.606a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm2 .789a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zM18 5a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0h-2zm-5.447-4.606a1 1 0 1 0 .894-1.789l-.894 1.789zM9 1l.447-.894a1 1 0 0 0-.894 0L9 1zm-2.447.106a1 1 0 1 0 .894 1.789l-.894-1.789zm-6 3a1 1 0 1 0 .894 1.789L.553 4.106zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zm-2-.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 2.789a1 1 0 1 0 .894-1.789l-.894 1.789zM2 5a1 1 0 1 0-2 0h2zM0 7.5a1 1 0 1 0 2 0H0zm8.553 12.394a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 1a1 1 0 1 0 .894 1.789l-.894-1.789zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zM8 19a1 1 0 1 0 2 0H8zm2-2.5a1 1 0 1 0-2 0h2zm-7.447.394a1 1 0 1 0 .894-1.789l-.894 1.789zM1 15H0a1 1 0 0 0 .553.894L1 15zm1-2.5a1 1 0 1 0-2 0h2zm12.553 2.606a1 1 0 1 0 .894 1.789l-.894-1.789zM17 15l.447.894A1 1 0 0 0 18 15h-1zm1-2.5a1 1 0 1 0-2 0h2zm-7.447-5.394l-2 1 .894 1.789 2-1-.894-1.789zm-1.106 1l-2-1-.894 1.789 2 1 .894-1.789zM8 9v2.5h2V9H8zm8.553-4.894l-2 1 .894 1.789 2-1-.894-1.789zm.894 0l-2-1-.894 1.789 2 1 .894-1.789zM16 5v2.5h2V5h-2zm-4.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zm-2.894-1l-2 1 .894 1.789 2-1L8.553.106zM1.447 5.894l2-1-.894-1.789-2 1 .894 1.789zm-.894 0l2 1 .894-1.789-2-1-.894 1.789zM0 5v2.5h2V5H0zm9.447 13.106l-2-1-.894 1.789 2 1 .894-1.789zm0 1.789l2-1-.894-1.789-2 1 .894 1.789zM10 19v-2.5H8V19h2zm-6.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zM2 15v-2.5H0V15h2zm13.447 1.894l2-1-.894-1.789-2 1 .894 1.789zM18 15v-2.5h-2V15h2z"
5+ />
6+ </svg>
7+</template>
+7−0
1+<template>
2+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor">
3+ <path
4+ d="M10 3.22l-.61-.6a5.5 5.5 0 0 0-7.666.105 5.5 5.5 0 0 0-.114 7.665L10 18.78l8.39-8.4a5.5 5.5 0 0 0-.114-7.665 5.5 5.5 0 0 0-7.666-.105l-.61.61z"
5+ />
6+ </svg>
7+</template>
+19−0
1+<!-- This icon is from <https://github.com/Templarian/MaterialDesign>, distributed under Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) license-->
2+<template>
3+ <svg
4+ xmlns="http://www.w3.org/2000/svg"
5+ xmlns:xlink="http://www.w3.org/1999/xlink"
6+ aria-hidden="true"
7+ role="img"
8+ class="iconify iconify--mdi"
9+ width="24"
10+ height="24"
11+ preserveAspectRatio="xMidYMid meet"
12+ viewBox="0 0 24 24"
13+ >
14+ <path
15+ d="M20 18v-4h-3v1h-2v-1H9v1H7v-1H4v4h16M6.33 8l-1.74 4H7v-1h2v1h6v-1h2v1h2.41l-1.74-4H6.33M9 5v1h6V5H9m12.84 7.61c.1.22.16.48.16.8V18c0 .53-.21 1-.6 1.41c-.4.4-.85.59-1.4.59H4c-.55 0-1-.19-1.4-.59C2.21 19 2 18.53 2 18v-4.59c0-.32.06-.58.16-.8L4.5 7.22C4.84 6.41 5.45 6 6.33 6H7V5c0-.55.18-1 .57-1.41C7.96 3.2 8.44 3 9 3h6c.56 0 1.04.2 1.43.59c.39.41.57.86.57 1.41v1h.67c.88 0 1.49.41 1.83 1.22l2.34 5.39z"
16+ fill="currentColor"
17+ ></path>
18+ </svg>
19+</template>
+11−0
1+import './assets/main.css'
2+
3+import { createApp } from 'vue'
4+import App from './App.vue'
5+import router from './router'
6+
7+const app = createApp(App)
8+
9+app.use(router)
10+
11+app.mount('#app')
+23−0
1+import { createRouter, createWebHistory } from 'vue-router'
2+import HomeView from '../views/HomeView.vue'
3+
4+const router = createRouter({
5+ history: createWebHistory(import.meta.env.BASE_URL),
6+ routes: [
7+ {
8+ path: '/',
9+ name: 'home',
10+ component: HomeView
11+ },
12+ {
13+ path: '/about',
14+ name: 'about',
15+ // route level code-splitting
16+ // this generates a separate chunk (About.[hash].js) for this route
17+ // which is lazy-loaded when the route is visited.
18+ component: () => import('../views/AboutView.vue')
19+ }
20+ ]
21+})
22+
23+export default router
+15−0
1+<template>
2+ <div class="about">
3+ <h1>This is an about page</h1>
4+ </div>
5+</template>
6+
7+<style>
8+@media (min-width: 1024px) {
9+ .about {
10+ min-height: 100vh;
11+ display: flex;
12+ align-items: center;
13+ }
14+}
15+</style>
+9−0
1+<script setup lang="ts">
2+import TheWelcome from '../components/TheWelcome.vue'
3+</script>
4+
5+<template>
6+ <main>
7+ <TheWelcome />
8+ </main>
9+</template>
+12−0
1+{
2+ "extends": "@vue/tsconfig/tsconfig.dom.json",
3+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4+ "exclude": ["src/**/__tests__/*"],
5+ "compilerOptions": {
6+ "composite": true,
7+ "baseUrl": ".",
8+ "paths": {
9+ "@/*": ["./src/*"]
10+ }
11+ }
12+}
+14−0
1+{
2+ "files": [],
3+ "references": [
4+ {
5+ "path": "./tsconfig.node.json"
6+ },
7+ {
8+ "path": "./tsconfig.app.json"
9+ },
10+ {
11+ "path": "./tsconfig.vitest.json"
12+ }
13+ ]
14+}
+15−0
1+{
2+ "extends": "@tsconfig/node18/tsconfig.json",
3+ "include": [
4+ "vite.config.*",
5+ "vitest.config.*",
6+ "cypress.config.*",
7+ "nightwatch.conf.*",
8+ "playwright.config.*"
9+ ],
10+ "compilerOptions": {
11+ "composite": true,
12+ "module": "ESNext",
13+ "types": ["node"]
14+ }
15+}
+9−0
1+{
2+ "extends": "./tsconfig.app.json",
3+ "exclude": [],
4+ "compilerOptions": {
5+ "composite": true,
6+ "lib": [],
7+ "types": ["node", "jsdom"]
8+ }
9+}
+18−0
1+import { fileURLToPath, URL } from 'node:url'
2+
3+import { defineConfig } from 'vite'
4+import vue from '@vitejs/plugin-vue'
5+import vueJsx from '@vitejs/plugin-vue-jsx'
6+
7+// https://vitejs.dev/config/
8+export default defineConfig({
9+ plugins: [
10+ vue(),
11+ vueJsx(),
12+ ],
13+ resolve: {
14+ alias: {
15+ '@': fileURLToPath(new URL('./src', import.meta.url))
16+ }
17+ }
18+})
+18−0
1+import { fileURLToPath } from 'node:url'
2+import { mergeConfig } from 'vite'
3+import { configDefaults, defineConfig } from 'vitest/config'
4+import viteConfig from './vite.config'
5+
6+export default mergeConfig(
7+ viteConfig,
8+ defineConfig({
9+ test: {
10+ environment: 'jsdom',
11+ exclude: [...configDefaults.exclude, 'e2e/*'],
12+ root: fileURLToPath(new URL('./', import.meta.url)),
13+ transformMode: {
14+ web: [/\.[jt]sx$/]
15+ }
16+ }
17+ })
18+)