├── public
├── favicon.ico
└── images
│ ├── item1.jpg
│ ├── item2.jpg
│ ├── item3.jpg
│ ├── item4.jpg
│ └── logo.svg
├── docs
├── images
│ ├── sample.png
│ ├── vscode.png
│ ├── vite-app.png
│ ├── favicon-32.png
│ ├── v_for_result1.png
│ └── v_for_result2.png
├── .gitignore
├── public
│ └── vue3-lab-handson-images.zip
├── .vitepress
│ ├── theme
│ │ └── index.ts
│ ├── components
│ │ └── PlusOne.vue
│ └── config.ts
├── package.json
├── overview.md
├── index.md
├── setup.md
├── create.md
├── v-if.md
├── rendering.md
├── v-for.md
├── methods.md
├── event.md
├── component.md
├── slot.md
└── package-lock.json
├── .prettierrc.js
├── src
├── main.js
├── components
│ └── Card.vue
└── App.vue
├── examples
├── event
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── slot
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ ├── components
│ │ │ └── Card.vue
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── v-for
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── v-if
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── methods
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── component
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ ├── components
│ │ │ └── Card.vue
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── overview
│ ├── public
│ │ ├── favicon.ico
│ │ └── images
│ │ │ ├── item1.jpg
│ │ │ ├── item2.jpg
│ │ │ ├── item3.jpg
│ │ │ ├── item4.jpg
│ │ │ └── logo.svg
│ ├── src
│ │ ├── main.js
│ │ ├── assets
│ │ │ ├── logo.svg
│ │ │ ├── main.css
│ │ │ └── base.css
│ │ ├── components
│ │ │ ├── icons
│ │ │ │ ├── IconSupport.vue
│ │ │ │ ├── IconTooling.vue
│ │ │ │ ├── IconCommunity.vue
│ │ │ │ ├── IconDocumentation.vue
│ │ │ │ └── IconEcosystem.vue
│ │ │ ├── HelloWorld.vue
│ │ │ ├── WelcomeItem.vue
│ │ │ └── TheWelcome.vue
│ │ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ ├── style.css
│ └── index.html
└── rendering
│ ├── public
│ ├── favicon.ico
│ └── images
│ │ ├── item1.jpg
│ │ ├── item2.jpg
│ │ ├── item3.jpg
│ │ ├── item4.jpg
│ │ └── logo.svg
│ ├── src
│ ├── main.js
│ └── App.vue
│ ├── vite.config.js
│ ├── package.json
│ └── index.html
├── .vscode
├── extensions.json
└── settings.json
├── .editorconfig
├── .gitignore
├── .textlintrc
├── vite.config.js
├── index.html
├── .github
└── workflows
│ ├── textlint.yaml
│ └── vitepress.yml
├── .eslintrc.cjs
├── LICENSE
├── package.json
├── README.md
└── GUIDE.md
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/docs/images/sample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/images/sample.png
--------------------------------------------------------------------------------
/docs/images/vscode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/images/vscode.png
--------------------------------------------------------------------------------
/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/public/images/item1.jpg
--------------------------------------------------------------------------------
/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/public/images/item2.jpg
--------------------------------------------------------------------------------
/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/public/images/item3.jpg
--------------------------------------------------------------------------------
/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/public/images/item4.jpg
--------------------------------------------------------------------------------
/docs/images/vite-app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/images/vite-app.png
--------------------------------------------------------------------------------
/docs/images/favicon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/images/favicon-32.png
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | singleQuote: true,
3 | semi: false,
4 | trailingComma: 'none'
5 | }
6 |
--------------------------------------------------------------------------------
/docs/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | dist/
3 |
4 | # vitepress build output
5 | .vitepress/dist
6 | .vitepress/cache
7 |
--------------------------------------------------------------------------------
/docs/images/v_for_result1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/images/v_for_result1.png
--------------------------------------------------------------------------------
/docs/images/v_for_result2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/images/v_for_result2.png
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/event/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/event/public/favicon.ico
--------------------------------------------------------------------------------
/examples/slot/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/slot/public/favicon.ico
--------------------------------------------------------------------------------
/examples/v-for/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-for/public/favicon.ico
--------------------------------------------------------------------------------
/examples/v-if/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-if/public/favicon.ico
--------------------------------------------------------------------------------
/examples/methods/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/methods/public/favicon.ico
--------------------------------------------------------------------------------
/examples/component/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/component/public/favicon.ico
--------------------------------------------------------------------------------
/examples/event/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/event/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/event/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/event/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/event/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/event/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/event/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/event/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/event/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/overview/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/overview/public/favicon.ico
--------------------------------------------------------------------------------
/examples/rendering/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/rendering/public/favicon.ico
--------------------------------------------------------------------------------
/examples/slot/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/slot/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/slot/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/slot/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/slot/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/slot/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/slot/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/slot/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/slot/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/v-for/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-for/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/v-for/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-for/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/v-for/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-for/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/v-for/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-for/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/v-for/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/v-if/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-if/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/v-if/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-if/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/v-if/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-if/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/v-if/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/v-if/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/v-if/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/docs/public/vue3-lab-handson-images.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/docs/public/vue3-lab-handson-images.zip
--------------------------------------------------------------------------------
/examples/component/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/methods/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/methods/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/methods/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/methods/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/methods/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/methods/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/methods/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/methods/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/methods/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/rendering/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/examples/component/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/component/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/component/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/component/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/component/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/component/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/component/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/component/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/overview/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/overview/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/overview/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/overview/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/overview/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/overview/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/overview/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/overview/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/rendering/public/images/item1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/rendering/public/images/item1.jpg
--------------------------------------------------------------------------------
/examples/rendering/public/images/item2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/rendering/public/images/item2.jpg
--------------------------------------------------------------------------------
/examples/rendering/public/images/item3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/rendering/public/images/item3.jpg
--------------------------------------------------------------------------------
/examples/rendering/public/images/item4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vuejs-jp/handson-vue3/HEAD/examples/rendering/public/images/item4.jpg
--------------------------------------------------------------------------------
/examples/overview/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | import './assets/main.css'
5 |
6 | createApp(App).mount('#app')
7 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "editorconfig.editorconfig",
4 | "dbaeumer.vscode-eslint",
5 | "esbenp.prettier-vscode",
6 | "vue.vscode-typescript-vue-plugin",
7 | "vue.volar"
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.codeActionsOnSave": {
3 | "source.fixAll.eslint": true
4 | },
5 | "editor.defaultFormatter": "esbenp.prettier-vscode",
6 | "editor.formatOnSave": true,
7 | "editor.formatOnSaveMode": "modifications"
8 | }
9 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/index.ts:
--------------------------------------------------------------------------------
1 | import Theme from 'vitepress/theme'
2 | import PlusOne from '../components/PlusOne.vue'
3 |
4 | export default {
5 | ...Theme,
6 |
7 | enhanceApp({ app }) {
8 | app.component('PlusOne', PlusOne)
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_size = 2
6 | indent_style = space
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
--------------------------------------------------------------------------------
/examples/overview/src/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 | /docs/dist
5 |
6 |
7 | # local env files
8 | .env.local
9 | .env.*.local
10 |
11 | # Log files
12 | npm-debug.log*
13 | yarn-debug.log*
14 | yarn-error.log*
15 | pnpm-debug.log*
16 |
17 | # Editor directories and files
18 | .idea
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
--------------------------------------------------------------------------------
/examples/overview/src/components/icons/IconSupport.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.textlintrc:
--------------------------------------------------------------------------------
1 | {
2 | "filters": {
3 | "allowlist": {
4 | "allow": [
5 | "/<<"
6 | ]
7 | }
8 | },
9 | "rules": {
10 | "preset-vuejs-jp": {
11 | "no-mix-dearu-desumasu": {
12 | "strict": false
13 | },
14 | "ja-no-space-between-full-width": false,
15 | "4.3.1.丸かっこ()": true
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'node:url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/event/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/methods/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/slot/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/v-for/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/v-if/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/component/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/overview/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'node:url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/rendering/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'node:url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/examples/slot/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "slot",
3 | "private": true,
4 | "version": "0.0.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/v-if/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "v-if",
3 | "private": true,
4 | "version": "0.0.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/event/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "event",
3 | "private": true,
4 | "version": "0.0.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/v-for/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "v-for",
3 | "private": true,
4 | "version": "0.0.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/component/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "component",
3 | "private": true,
4 | "version": "0.0.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/methods/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "methods",
3 | "private": true,
4 | "version": "0.0.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/overview/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "overview",
3 | "private": true,
4 | "version": "0.1.1",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/examples/rendering/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "rendering",
3 | "private": true,
4 | "version": "0.1.0",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview --port 4173"
9 | },
10 | "dependencies": {
11 | "vue": "^3.2.37"
12 | },
13 | "devDependencies": {
14 | "@vitejs/plugin-vue": "^3.0.1",
15 | "vite": "^3.0.1"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | handson-vue3-examples
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/examples/rendering/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | handson-vue3-examples
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/docs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "handson-vue3-examples-docs",
3 | "version": "2.1.0",
4 | "description": "",
5 | "main": "index.ts",
6 | "scripts": {
7 | "dev": "vitepress dev .",
8 | "build": "vitepress build .",
9 | "preview": "vitepress preview ."
10 | },
11 | "author": "Vue.js 日本ユーザーグループ",
12 | "license": "MIT",
13 | "devDependencies": {
14 | "vitepress": "^1.0.0-beta.5",
15 | "vue": "^3.3.4"
16 | },
17 | "volta": {
18 | "node": "18.16.1"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/.github/workflows/textlint.yaml:
--------------------------------------------------------------------------------
1 | name: textlint
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | pull_request:
8 | branches:
9 | - main
10 |
11 | env:
12 | NODE_VERSION: '16.x'
13 |
14 | jobs:
15 | textlint:
16 | runs-on: ubuntu-latest
17 |
18 | steps:
19 | - uses: actions/checkout@v2
20 | - uses: actions/setup-node@v2
21 | with:
22 | node-version: ${{ env.NODE_VERSION }}
23 | cache: npm
24 | - name: Restore Packages
25 | run: npm ci
26 | - name: Run textlint
27 | run: npm run textlint:docs
28 |
--------------------------------------------------------------------------------
/examples/slot/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | handson-vue3-examples
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/v-if/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | handson-vue3-examples
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/component/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | handson-vue3-examples
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/event/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | handson-vue3-examples
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/methods/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | handson-vue3-examples
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/v-for/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | handson-vue3-examples
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/overview/src/assets/main.css:
--------------------------------------------------------------------------------
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 | }
36 |
--------------------------------------------------------------------------------
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | require('@rushstack/eslint-patch/modern-module-resolution')
2 |
3 | module.exports = {
4 | root: true,
5 | env: {
6 | node: true,
7 | 'vue/setup-compiler-macros': true
8 | },
9 | extends: [
10 | 'plugin:vue/vue3-recommended',
11 | 'eslint:recommended',
12 | '@vue/eslint-config-prettier'
13 | ],
14 | rules: {
15 | 'vue/html-closing-bracket-newline': [
16 | 'error',
17 | {
18 | singleline: 'never',
19 | multiline: 'never'
20 | }
21 | ],
22 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
23 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
24 | 'prettier/prettier': 'off' // eslint-plugin-prettierの部分だけoffにする
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/examples/overview/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
{{ msg }}
13 |
14 | You’ve successfully created a project with
15 | Vite +
16 | Vue 3 .
17 |
18 |
19 |
20 |
21 |
44 |
--------------------------------------------------------------------------------
/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/event/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/slot/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/v-for/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/v-if/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/component/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/methods/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/overview/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/rendering/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/overview/src/components/icons/IconTooling.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/examples/overview/src/components/icons/IconCommunity.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/overview/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
6 | // endregion script
7 |
8 | // region template
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | // endregion template
23 |
24 | // region style
25 |
53 | // endregion style
54 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Vue.js Japan User Group
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/docs/.vitepress/components/PlusOne.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
{{ name }}
19 |
{{ content }}
20 |
21 |
22 |
23 |
56 |
--------------------------------------------------------------------------------
/examples/overview/src/components/icons/IconDocumentation.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/components/Card.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
{{ name }}
9 |
10 | ¥{{ pricePrefix(price) }}
11 |
12 |
13 |
14 |
41 |
42 |
72 |
--------------------------------------------------------------------------------
/examples/slot/src/components/Card.vue:
--------------------------------------------------------------------------------
1 |
28 |
29 |
30 |
31 |
34 |
35 |
36 |
{{ name }}
37 |
38 | ¥{{ pricePrefix(price) }}
39 |
40 |
41 |
42 |
72 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "handson-vue3-examples",
3 | "version": "1.1.1",
4 | "scripts": {
5 | "dev": "vite",
6 | "dev:methods": "npm run dev -w=methods",
7 | "dev:rendering": "npm run dev -w=rendering",
8 | "dev:event": "npm run dev -w=event",
9 | "dev:overview": "npm run dev -w=overview",
10 | "dev:v-for": "npm run dev -w=v-for",
11 | "dev:v-if": "npm run dev -w=v-if",
12 | "dev:component": "npm run dev -w=component",
13 | "dev:slot": "npm run dev -w=slot",
14 | "build": "vite build",
15 | "preview": "vite preview --port 4173",
16 | "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
17 | "textlint": "textlint --format pretty-error",
18 | "textlint:docs": "textlint --format pretty-error docs/**"
19 | },
20 | "dependencies": {
21 | "vue": "^3.2.37"
22 | },
23 | "devDependencies": {
24 | "@rushstack/eslint-patch": "1.1.0",
25 | "@vitejs/plugin-vue": "^3.0.1",
26 | "@vue/eslint-config-prettier": "7.0.0",
27 | "eslint": "8.5.0",
28 | "eslint-plugin-vue": "8.4.1",
29 | "prettier": "2.5.1",
30 | "textlint": "12.1.0",
31 | "textlint-filter-rule-allowlist": "4.0.0",
32 | "textlint-rule-preset-vuejs-jp": "github:vuejs-jp/textlint-rule-preset-vuejs-jp",
33 | "vite": "^3.0.1"
34 | },
35 | "workspaces": [
36 | "examples/*"
37 | ],
38 | "browserslist": [
39 | "> 1%",
40 | "last 2 versions",
41 | "not dead",
42 | "not ie 11"
43 | ],
44 | "volta": {
45 | "node": "18.6.0"
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/examples/component/src/components/Card.vue:
--------------------------------------------------------------------------------
1 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
{{ name }}
42 |
{{ description }}
43 |
¥{{ pricePrefix(price) }}
44 |
45 |
46 |
47 |
77 |
--------------------------------------------------------------------------------
/docs/.vitepress/config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitepress'
2 |
3 | export default defineConfig({
4 | lang: 'ja-JP',
5 | title: 'Vue3 Hands-on',
6 | description: 'Vue.js-jp Vue3 Hands-on',
7 | head: [['link', { rel: 'icon', href: '/images/favicon-32.png' }]],
8 | themeConfig: {
9 | siteTitle: 'Vue3 ハンズオン',
10 | sidebar: [
11 | {
12 | text: '準備編',
13 | items: [
14 | {
15 | text: '環境構築',
16 | link: '/setup'
17 | },
18 | {
19 | text: 'プロジェクトの作成',
20 | link: '/create'
21 | }
22 | ]
23 | },
24 | {
25 | text: '本編',
26 | items: [
27 | {
28 | text: 'ハンズオンの概要',
29 | link: '/overview'
30 | },
31 | {
32 | text: 'data を定義し、商品をレンダリングする',
33 | link: '/rendering'
34 | },
35 | {
36 | text: 'v-for で商品を複数表示する',
37 | link: '/v-for'
38 | },
39 | {
40 | text: 'v-if で表示・非表示を切り替える',
41 | link: '/v-if'
42 | },
43 | {
44 | text: '関数で価格にカンマを入れる',
45 | link: '/methods'
46 | },
47 | {
48 | text: '@click で商品を選択する',
49 | link: '/event'
50 | },
51 | {
52 | text: '商品をコンポーネント化する',
53 | link: '/component'
54 | },
55 | {
56 | text: 'コンポーネントにスロットを使用する',
57 | link: '/slot'
58 | }
59 | ]
60 | }
61 | ]
62 | }
63 | })
64 |
--------------------------------------------------------------------------------
/examples/overview/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: sans-serif;
3 | margin: 0;
4 | -webkit-font-smoothing: antialiased;
5 | -moz-osx-font-smoothing: grayscale;
6 | }
7 |
8 | #app {
9 | width: 90%;
10 | margin: 0 5%;
11 | text-align: center;
12 | color: #242424;
13 | }
14 |
15 | .header {
16 | display: flex;
17 | align-content: center;
18 | align-items: center;
19 | margin-top: 40px;
20 | margin-bottom: 40px;
21 | }
22 |
23 | .header > img {
24 | width: 100px;
25 | height: 100px;
26 | margin-right: 20px;
27 | }
28 |
29 | .header > h1 {
30 | font-size: 80px;
31 | font-weight: bold;
32 | line-height: 80px;
33 | margin-top: 0;
34 | margin-bottom: 0;
35 | }
36 |
37 | .main {
38 | display: grid;
39 | grid-template-columns: 3fr 3fr 3fr 3fr;
40 | column-gap: 24px;
41 | row-gap: 24px;
42 | }
43 |
44 | .item {
45 | padding: 10px;
46 | cursor: pointer;
47 | }
48 |
49 | .item:hover {
50 | transition: 0.2s transform ease-out;
51 | transform: scale(1.05);
52 | }
53 |
54 | .item > div.thumbnail > img {
55 | width: 100%;
56 | height: calc(100%);
57 | object-fit: cover;
58 | }
59 |
60 | .item > div.description {
61 | text-align: left;
62 | margin-top: 20px;
63 | }
64 |
65 | .item > div.description > p {
66 | margin-top: 0px;
67 | margin-bottom: 0px;
68 | font-size: 18px;
69 | line-height: 25px;
70 | }
71 |
72 | .item > div.description > span {
73 | display: block;
74 | margin-top: 10px;
75 | font-size: 20px;
76 | }
77 |
78 | .item > div.description > span > .price {
79 | font-size: 28px;
80 | font-weight: bold;
81 | }
82 |
83 | .selected-item {
84 | background: #e3f2fd;
85 | }
86 |
--------------------------------------------------------------------------------
/examples/overview/src/components/WelcomeItem.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
87 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vue.js 3 ハンズオン
2 |
3 | [](https://github.com/tterb/atomic-design-ui/blob/master/LICENSEs)
4 |
5 | Vue.js 3 ハンズオンへようこそ😀 このハンズオンは、初めて Vue.js に触れる人がスムーズに学習できるように作られた学習用教材です。この教材は、以下の2通りの方法でご利用いただけます。
6 |
7 | ## ✏利用方法
8 | ### 1. Vue.js 日本ユーザーグループの公式ハンズオンに参加する
9 | 本ハンズオンを作成した [Vue.js 日本ユーザーグループ](https://vuejs-jp.org/) では、定期的にこの教材を使ったハンズオンイベントの開催を予定しています。ハンズオンイベントは誰でも自由に参加できます。イベントの予定は [connpass](https://vuejs-meetup.connpass.com/event/) に掲載していますので、ぜひチェックしてください。
10 |
11 | ### 2. 自由に利用する
12 | 本ハンズオンの文章、ソースコードを含むあらゆる内容は、自由にご利用いただけます。個人の学習や、グループ・会社での勉強会、もくもく会、セミナーなど、あらゆる用途にご活用ください。
13 |
14 | ## 💪コントリビューター
15 | 誤りやよりよい改善を見つけた方は、[Issues](https://github.com/vuejs-jp/handson-vue3-examples/issues) または [Pull requests](https://github.com/vuejs-jp/handson-vue3-examples/pulls) を作成してください。
16 |
17 | - [MIYAKE Kazuyuki](https://github.com/k-miyake)
18 | - [NAKATA Kazuhiro](https://github.com/nalpan)
19 | - [ISHIBASHI Yuuki](https://github.com/YuukiIshibashi)
20 | - [happylifetaka](https://github.com/happylifetaka)
21 | - [OKI Yoshiya](https://github.com/448jp)
22 | - [KAWAGUCHI Kazuya](https://github.com/kazupon)
23 | - Photo by Tyler Nix , matthew reyes , Amy Flak , Elena Rabkina on Unsplash
24 |
25 | ## ©ライセンス
26 | [MIT](https://opensource.org/licenses/MIT)
27 |
--------------------------------------------------------------------------------
/.github/workflows/vitepress.yml:
--------------------------------------------------------------------------------
1 | name: VitePress CI/CD
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | paths:
8 | - '.github/workflows/vitepress.yml'
9 | - 'docs/**'
10 | pull_request:
11 | branches:
12 | - main
13 | paths:
14 | - '.github/workflows/vitepress.yml'
15 | - 'docs/**'
16 | workflow_dispatch:
17 |
18 | permissions:
19 | pages: write
20 | id-token: write
21 |
22 | concurrency:
23 | group: "pages"
24 | cancel-in-progress: false
25 |
26 | jobs:
27 | build:
28 | if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
29 | runs-on: ubuntu-latest
30 | defaults:
31 | run:
32 | working-directory: docs
33 | steps:
34 | - uses: actions/checkout@v3
35 | - name: Use Node.js
36 | uses: actions/setup-node@v3
37 | with:
38 | node-version: '18.x'
39 | cache: 'npm'
40 | cache-dependency-path: docs/package-lock.json
41 | - run: npm ci
42 | - run: npm run build --if-present
43 | - run: echo 'handson.vuejs-jp.org' > CNAME
44 | working-directory: docs/.vitepress/dist
45 | - uses: actions/upload-artifact@v3
46 | with:
47 | name: dist
48 | path: docs/.vitepress/dist
49 |
50 | deploy:
51 | if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' # PR 時はデプロイを実行しない
52 | runs-on: ubuntu-latest
53 | needs: build
54 |
55 | environment:
56 | name: github-pages
57 | url: ${{ steps.deployment.outputs.page_url }}
58 |
59 | steps:
60 | - uses: actions/download-artifact@v3
61 | with:
62 | name: dist
63 | - uses: actions/upload-pages-artifact@v1
64 | with:
65 | path: .
66 | - name: Deploy to GitHub Pages
67 | id: deployment
68 | uses: actions/deploy-pages@v1
69 |
--------------------------------------------------------------------------------
/examples/overview/src/components/icons/IconEcosystem.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/docs/overview.md:
--------------------------------------------------------------------------------
1 | # ハンズオンの概要
2 |
3 | ## 本章の概要とゴール
4 | 本章では、Vue.js を使用する場合と使用しない場合を比較して、このハンズオンの全体像を把握します。
5 | 本章を実践すると、このハンズオンを通してどんなものを実装し学んでいくのかイメージができ、実践の準備が整います。
6 |
7 | ## 作成するもの
8 |
9 | このハンズオンでは、簡単な商品の一覧を表示し、購入する商品を選択できるプログラムを作成します。プログラムを作成する過程で Vue.js の基本を学べます。
10 |
11 | 
12 |
13 | > このハンズオンを完了した場合の完成イメージは [こちら](https://handson-example.vuejs-jp.org/) で確認できます。
14 |
15 | ## Vue.js を使わない場合
16 |
17 | Vue.js でのハンズオンに入る前に Vue.js を使わないで実装した場合のプログラムを見てみましょう。
18 |
19 | index.html
20 |
21 | <<< @/../examples/overview/index.html
22 |
23 | style.css
24 |
25 | <<< @/../examples/overview/style.css
26 |
27 | ## 商品表示部分の説明
28 |
29 | 簡単ですが、商品表示部分を説明します。
30 |
31 | - `~
` の部分では商品のサムネイル画像を表示しています。
32 | - `~
` の部分では商品の名前と説明を表示しています。
33 | - `~ ` の部分では商品の値段を表示しています。
34 |
35 |
36 | ```html
37 |
38 |
39 |
40 |
41 |
42 |
アボカドディップバケット
43 |
44 | 刻んだ野菜をアボカドと混ぜてディップに。こんがり焼いたバゲットとお召し上がりください。
45 |
46 |
¥480
47 |
48 |
49 | ```
50 |
51 | ## Vue.js を使わない場合の問題点
52 |
53 | Vue.js を使わない場合、例えば次のような問題が発生します。
54 |
55 | - 商品の情報と HTML のタグが混ざっていて見通しが悪い
56 | - 複数の商品を記述するとき、同じ構造のタグを繰り返す必要がある
57 | - 商品を増減するとき、タグを追加・削除する手間がかかる
58 | - 商品の状態(売り切れや金額表記など)によって情報やタグを書き分ける必要がある
59 | - インタラクションを実装するとき、HTML と JavaScript が依存関係になる
60 |
61 | ## Vue.js を使った場合のプログラム
62 |
63 | 記述の意味はハンズオンで順を追って説明していきますが、 Vue.js に変更後のコードをみてみましょう。
64 |
65 | App.vue
66 |
67 | <<< @/../src/App.vue
68 |
69 | `~ ` 部分は見た目の表示が記述されています。冗長な記述が減っていて Vue.js を使わない場合に比べてとても短いですね。
70 |
71 | `` 部分は商品の情報や動作等が記述されています。特に `items` では商品の情報や状態だけのデータで HTML のタグがなくなっています。「見た目、処理、商品のデータ」がスマートに分かれており、見通しがよくなっているのが、既に感じられるかと思います。
72 |
73 | 他にも Vue.js の便利な機能はありますが、実際にハンズオンを進めていく中で体験していきましょう!
74 |
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | # Vue.js 3 ハンズオン
2 |
3 | Vue.js 3 ハンズオンへようこそ😀 このハンズオンは、初めて Vue.js に触れる人がスムーズに学習できるように作られた学習用教材です。
4 |
5 | ## 利用方法
6 | 本ハンズオンの文章、ソースコードを含むあらゆる内容は、自由にご利用いただけます。個人の学習や、グループ・会社での勉強会、もくもく会、セミナーなど、あらゆる用途にご活用ください。
7 |
8 | 現在は、Vue.js のプロジェクト作成から基本的な実装方法を解説した「Vue.js をはじめよう!」を公開しています。その他のハンズオンは鋭意制作中です。
9 |
10 | ## Vue.js をはじめよう!
11 |
12 | ### 準備編
13 |
14 | - [開発環境の構築](./setup.md '開発環境の構築')
15 | - [プロジェクトの作成](./create.md 'プロジェクトの作成')
16 |
17 | ### 本編
18 |
19 | 1. [ハンズオンの概要](./overview.md 'ハンズオンの概要')
20 | 1. [data を定義し、商品をレンダリングする](./rendering.md 'data を定義し、商品をレンダリングする')
21 | 1. [v-for で商品を複数表示する](./v-for.md 'v-for で商品を複数表示する')
22 | 1. [v-if で表示・非表示を切り替える](./v-if.md 'v-if で表示・非表示を切り替える')
23 | 1. [methods で価格にカンマを入れる](./methods.md 'methods で価格にカンマを入れる')
24 | 1. [@click で商品を選択する](./event.md '@click で商品を選択する')
25 | 1. [商品をコンポーネント化する](./component.md '商品をコンポーネント化する')
26 | 1. [コンポーネントにスロットを使用する](./slot.md 'コンポーネントにスロットを使用する')
27 |
28 | ## コントリビューター
29 | 誤りやよりよい改善を見つけた方は、[Issues](https://github.com/vuejs-jp/handson-vue3-examples/issues) または [Pull requests](https://github.com/vuejs-jp/handson-vue3-examples/pulls) を作成してください。
30 |
31 | - [MIYAKE Kazuyuki](https://github.com/k-miyake)
32 | - [nalpan](https://github.com/nalpan)
33 | - [ISHIBASHI Yuuki](https://github.com/YuukiIshibashi)
34 | - [happylifetaka](https://github.com/happylifetaka)
35 | - [OKI Yoshiya](https://github.com/448jp)
36 | - [KAWAGUCHI Kazuya](https://github.com/kazupon)
37 | - [KAMENOUE Takao](https://github.com/totocalcio)
38 | - [HIROTAKA Ishiwata](https://github.com/watasan1012)
39 | - [shiyuu](https://github.com/shiyuu33)
40 | - Photo by Tyler Nix , matthew reyes , Amy Flak , Elena Rabkina on Unsplash
41 |
42 | ## ライセンス
43 | [MIT](https://opensource.org/licenses/MIT)
44 |
--------------------------------------------------------------------------------
/GUIDE.md:
--------------------------------------------------------------------------------
1 | # Vue3.x ハンズオン執筆ガイド
2 |
3 | 本ドキュメントは、本ハンズオンを執筆する人(コントリビューター)のためのガイドです。どう書いたらいいか迷った時に参考にしてください。また、ガイドにないことで悩んだら [新規 Issue を作成](https://github.com/vuejs-jp/handson-vue3-examples/issues/new) してご相談ください。
4 |
5 | ## 主題と関係が薄い話題について
6 | JavaScript のビルトインクラスや正規表現など、主題と関係が薄い話題を書く時は、本文と区別が付きやすいように対応します。
7 |
8 | - 文章で説明したいとき
9 | - 適切なレベルで見出しを付け、冒頭に「参考:」を記載します。
10 | ```md
11 | ### 本文用の見出し1
12 | 本文があります。本文があります。本文があります。
13 |
14 | ### 参考:正規表現について
15 | 正規表現とは、正規な表現のことです。説明つらつら。
16 |
17 | ### 本文用の見出し2
18 | 本文があります。本文があります。本文があります。
19 | ```
20 | - 外部リンクを表示したいとき
21 | - 引用 `> ` でリンクを表現します。
22 | ```md
23 | 本文があります。
24 |
25 | > [String() に関する詳細](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/String)
26 |
27 | 本文があります。
28 | ```
29 |
30 | ## 外部リンク先について
31 | - 原則として、リンク先は公式ドキュメントとします
32 | - 例えば、Vue.js 本体に関しては Vue.js 公式ドキュメント([V3](https://v3.ja.vuejs.org/guide/introduction.html) 、 [V2](https://jp.vuejs.org/v2/guide/))にリンクします
33 | - HTML、CSS、JavaScript の仕様に関しては [MDN Web Docs](https://developer.mozilla.org/ja/docs/Web) にリンクします
34 |
35 | ## 改行について
36 | マークダウンでは、原則では改行されないためひとつの文章内では改行させない。改行したい場合は明示的に空行を入れて改行させるようにする
37 |
38 | ## 文章の校正( textlint )について
39 |
40 | ドキュメントは、 [textlint](https://github.com/textlint/textlint) を使って校正を行います。校正のチェックルールは、Vue.js 日本ユーザーグループが翻訳プロジェクト等で利用している [プリセット](https://github.com/vuejs-jp/textlint-rule-preset-vuejs-jp) を参照しています。
41 |
42 | ### Pull Request 時の自動チェック
43 |
44 | Pull Request を発行すると、GitHub Actions によって自動的に textlint によるルール評価が行われます。ルールに合わない問題が見つかった場合は、Pull Request のステータスチェックがエラー表示になるので、対応する PR の `Checks` タブで GitHub Actions のログから `Run textlint` の詳細を展開してエラー内容を確認してください。
45 |
46 | ### ローカルでのチェック方法
47 |
48 | Pull Request で textlint のエラーが出た場合や、PR 前に事前にチェックをしたい場合は、ローカルで以下のコマンドを実行して確認することができます。
49 |
50 | ```bash
51 | npm run textlint {チェックしたいファイル名}
52 | ```
53 |
54 | エラーが無い場合は何も表示されませんが、エラーが見つかった場合はログに問題の箇所と内容が表示されるので、ログに従って修正してください。
55 |
56 | ```bash
57 | ✓ vuejs-jp/ja-space-between-half-and-full-width: 原則として、全角文字と半角文字の間にスペースを入れます。
58 | /Users/miyake/repos/handson-vue3-examples/GUIDE.md:45:22
59 | v
60 | 44.
61 | 45. Pull Request でtextlintのエラーが出た場合や、PR 前に事前にチェックをしたい場合は、ローカルで以下のコマンドを実行して確認することができます。
62 | 46.
63 | ```
64 |
--------------------------------------------------------------------------------
/examples/overview/src/assets/base.css:
--------------------------------------------------------------------------------
1 | /* color palette from */
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 | position: relative;
59 | font-weight: normal;
60 | }
61 |
62 | body {
63 | min-height: 100vh;
64 | color: var(--color-text);
65 | background: var(--color-background);
66 | transition: color 0.5s, background-color 0.5s;
67 | line-height: 1.6;
68 | font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
69 | Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
70 | font-size: 15px;
71 | text-rendering: optimizeLegibility;
72 | -webkit-font-smoothing: antialiased;
73 | -moz-osx-font-smoothing: grayscale;
74 | }
75 |
--------------------------------------------------------------------------------
/examples/overview/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | handson-vue3-examples
8 |
9 |
10 |
11 |
12 | We're sorry but handson-vue3-examples doesn't work properly without JavaScript enabled. Please enable it to continue.
13 |
14 |
15 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
アボカドディップバケット
26 |
27 | 刻んだ野菜をアボカドと混ぜてディップに。こんがり焼いたバゲットとお召し上がりください。
28 |
29 |
¥480
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
あの日夢見たホットケーキ
38 |
39 | 子供のころに食べたかった、あのホットケーキを再現しました。素朴でどこか懐かしい味をどうぞ。
40 |
41 |
¥1,180
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
HOP WTR
50 |
51 | ロサンゼルス生まれのスパークリングウォーター。ノンカロリー、ノンアルコールの新感覚飲料です。
52 |
53 |
¥320
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
チーズフレンチフライ
62 |
63 | イタリア産チーズをたっぷりかけたアツアツのフレンチフライ。みんな大好きな一品です。
64 |
65 |
¥670
66 |
67 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/examples/rendering/src/App.vue:
--------------------------------------------------------------------------------
1 | // #region script
2 |
13 | // #endregion script
14 |
15 | // region template
16 |
17 |
23 |
24 |
25 |
26 |
29 |
30 |
31 |
{{ item.name }}
32 |
{{ item.description }}
33 |
¥{{ item.price }}
34 |
35 |
36 |
37 |
38 | // endregion template
39 |
40 | // region style
41 |
123 | // endregion style
--------------------------------------------------------------------------------
/docs/setup.md:
--------------------------------------------------------------------------------
1 | # 開発環境の構築
2 |
3 | ## 前提とする環境
4 |
5 | - エディタ: Visual Studio Code(以下、VS Code)
6 | - VS Code の拡張機能:Vue Language Features (Volar)
7 | - 開発言語: JavaScript
8 | - 利用するツール: Node.js
9 |
10 | ## ターミナルの準備
11 |
12 | このハンズオンでは、主にターミナルを使ってコマンドを実行していきます。
13 |
14 | ::: tip ヒント
15 | ターミナルとは、コマンドと呼ばれる命令文を用いて OS やアプリケーションの操作や設定を行うツールです。
16 | :::
17 |
18 | ### Mac でのターミナル利用方法
19 |
20 | - `アプリケーション - ユーティリティ` 内に標準でインストールされている `ターミナル.app` を起動します
21 | - 利用方法の詳細は Google 検索で "Mac ターミナル 使い方" 等で検索してください
22 |
23 | ### Windows でのターミナル利用方法
24 |
25 | - スタートメニューから `Windows Terminal` を選択して起動します
26 | - なければ、Microsoft Store からインストールします
27 | - 利用方法の詳細は [公式ドキュメント](https://docs.microsoft.com/ja-jp/windows/terminal/) を参照してください
28 |
29 | ## Node.js のインストール
30 |
31 | ### 既にインストールされているかどうかの確認
32 |
33 | ターミナルに以下のコマンドを入力し、return キーで実行します。
34 |
35 | ```sh
36 | node -v
37 | ```
38 |
39 | バージョン番号が表示されたら、Node.js はインストールされていますので、セットアップの手順は飛ばして構いません。
40 |
41 | ```sh
42 | v20.9.0
43 | ```
44 |
45 | ::: warning 注意
46 | 表示されるバージョンはインストールするタイミングによって異なります。
47 |
48 | [Vue アプリケーションの作成 - 前提条件](https://ja.vuejs.org/guide/quick-start.html#creating-a-vue-application)より、Node.js のバージョンは 16.0 より最新バージョンをインストールする必要があります。
49 | :::
50 |
51 | ### セットアップ
52 |
53 | Node.js がインストールされていない場合は、 以下のページから各 OS 用のインストーラーをダウンロードして、セットアップしてください。
54 |
55 | - [Node.js 公式サイトのダウンロードページ](https://nodejs.org/en/download)
56 |
57 | なお、ダウンロードページでは `LTS` と `最新版` が選択できるようになっていますが、このハンズオンでは安定版である `LTS` を使うことを推奨します。
58 |
59 | ::: tip ヒント
60 | LTS は、Long-term Support の略で、長期間サポートされる安定バージョンです。
61 | :::
62 |
63 | もし、Node.js のバージョンを切り替えて使いたい場合は、バージョンマネージャーの利用を検討してください。以下は主要なバージョンマネージャーへのリンクです。セットアップについては、それぞれのドキュメントを参照してください。
64 |
65 | #### Mac でよく使われるバージョンマネージャー
66 |
67 | - [Volta](https://volta.sh/)
68 | - [nodenv](https://github.com/nodenv/nodenv)
69 |
70 | #### Windows でよく使われるバージョンマネージャー
71 |
72 | - [Volta](https://volta.sh/)
73 | - [nvm-windows](https://github.com/coreybutler/nvm-windows)
74 |
75 | ## VS Code のセットアップ
76 |
77 | このハンズオンでは、VS Code を使って開発していきます。
78 |
79 | ::: tip ヒント
80 | VS Code を既にお使いの場合はこのセクションは飛ばしてください。
81 | :::
82 |
83 | ### VS Code のインストール
84 |
85 | 1. [VS Code 公式ダウンロードページ](https://code.visualstudio.com/download) からお使いの OS に合わせたインストーラーをダウンロードします
86 | 1. インストーラーの指示に従ってインストールします
87 | - インストールの詳細は [公式ドキュメント](https://code.visualstudio.com/docs/setup/setup-overview) を確認してください
88 |
89 | ### Vue Language Features (Volar) 拡張機能のインストール
90 |
91 | `Vue Language Features (Volar)` は Vue.js の開発をサポートする VS Code の拡張機能です。`.vue` ファイルのシンタックスハイライトやインテリセンスによる補完ができるようになります。詳細は、[language-tools の GitHub リポジトリ](https://github.com/vuejs/language-tools) を参照してください。
92 |
93 | Volar をインストールするには、VS Code が入っているマシンで、 [Vue Language Features (Volar) - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=Vue.volar) にアクセスし Install ボタンをクリックします。
94 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
49 |
50 |
51 |
57 |
58 |
61 |
66 |
72 |
73 | {{ item.description }}
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
139 |
--------------------------------------------------------------------------------
/examples/component/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
50 | // endregion script
51 |
52 | // region template
53 |
54 |
60 |
61 |
64 |
69 |
75 |
76 |
77 |
78 |
79 | // endregion template
80 |
81 | // region style
82 |
140 | // endregion style
141 |
--------------------------------------------------------------------------------
/docs/create.md:
--------------------------------------------------------------------------------
1 | # プロジェクトの作成
2 |
3 | ## create-vue でのプロジェクト新規作成
4 |
5 | [create-vue](https://github.com/vuejs/create-vue) を使って生成されるアプリケーションをプロジェクトと呼びます。ここではプロジェクトを新しく作成してみましょう。
6 |
7 | 1. アプリケーションを作成するディレクトリを決めておきます(この例では `vue3-lab` としています)。`create-vue` でプロジェクトを作成すると、決めたディレクトリの配下にファイル群が生成されます。
8 |
9 | 2. ターミナルで、プロジェクトのディレクトリを作成する親ディレクトリに移動します。もし、ホームディレクトリの直下にプロジェクトを作成するのであれば、ターミナルで以下のコマンドを使って移動しておきます。
10 |
11 | ```sh
12 | cd ~
13 | ```
14 |
15 | ::: tip ヒント
16 | ホームディレクトリとは、ユーザー固有のファイルやフォルダを保存できる領域であり、通常ユーザー名でディレクトリが作成されています。
17 | :::
18 |
19 | 3. `create-vue` でプロジェクトを新規作成します。ターミナルで以下のコマンドを実行します(コマンド実行後はそのまま待機しておいてください)。プロジェクトのディレクトリは `create-vue` によって自動的に作成されます。
20 |
21 | ```sh
22 | npm create vue@latest vue3-lab
23 | ```
24 |
25 | 4. コマンドを実行すると、ターミナルにいくつかの質問が表示されます。このハンズオンでは以下のように選択します。
26 |
27 | 下記のメッセージが表示された場合は `y` と入力して `enter / return` キーを押します。
28 | ```
29 | Need to install the following packages:
30 | create-vue@latest
31 | Ok to proceed? (y) -> y
32 | ```
33 |
34 | 以降の質問には、基本的に `No` を選択して進めます。
35 |
36 | ::: tip ヒント
37 | 矢印キーでアンダースコアを移動させることで項目を選択します。
38 | enter / return キーで項目を確定できます。
39 | :::
40 |
41 | ```
42 | Vue.js - The Progressive JavaScript Framework
43 | ? Add TypeScript? › No / Yes -> No
44 | ? Add JSX Support? › No / Yes -> No
45 | ? Add Vue Router for Single Page Application development? › No / Yes -> No
46 | ? Add Pinia for state management? › No / Yes -> No
47 | ? Add Vitest for Unit Testing? › No / Yes -> No
48 | ? Add an End-to-End Testing Solution? › - Use arrow-keys. Return to submit.
49 | ❯ No
50 | Cypress
51 | Nightwatch
52 | Playwright
53 | -> No
54 | ? Add ESLint for code quality? › No / Yes -> No
55 | ```
56 |
57 | ## プロジェクトの起動
58 |
59 | 作成したプロジェクトを起動してみましょう。プロジェクトの起動には外部パッケージをインストールしてから起動コマンドを実行します。
60 |
61 | 1. 作成したプロジェクトのディレクトリに移動し(この例では `vue3-lab`)、`npm install` で外部パッケージをインストールします。
62 |
63 | ```sh
64 | cd vue3-lab
65 | npm install
66 | ```
67 |
68 | 2. `npm install` の処理が完了したら `npm run dev` でプロジェクトを起動します。
69 |
70 | ```sh
71 | npm run dev
72 | ```
73 |
74 | 3. `npm run dev` の実行が完了したら、ブラウザで `http://localhost:5173/` にアクセスします。
75 |
76 | 4. ブラウザに「You did it!」等と表示されていれば、無事にプロジェクトの作成が成功しています。
77 |
78 | ## プロジェクトの確認
79 |
80 | プロジェクト新規作成後、以下のようなディレクトリ構造になります。
81 |
82 | ```
83 | vue3-lab
84 | ├── README.md
85 | ├── index.html
86 | ├── node_modules
87 | ├── package-lock.json
88 | ├── package.json
89 | ├── public
90 | │ └── favicon.ico
91 | ├── src
92 | │ ├── App.vue
93 | │ ├── assets
94 | │ │ ├── base.css
95 | │ │ ├── logo.svg
96 | │ │ └── main.css
97 | │ ├── components
98 | │ │ ├── HelloWorld.vue
99 | │ │ ├── TheWelcome.vue
100 | │ │ ├── WelcomeItem.vue
101 | │ │ └── icons
102 | │ │ ├── IconCommunity.vue
103 | │ │ ├── IconDocumentation.vue
104 | │ │ ├── IconEcosystem.vue
105 | │ │ ├── IconSupport.vue
106 | │ │ └── IconTooling.vue
107 | │ └── main.js
108 | └── vite.config.js
109 |
110 | 6 directories, 19 files
111 | ```
112 |
113 | これらのファイルが `create-vue` で作成されます。
114 |
115 | 
116 |
--------------------------------------------------------------------------------
/examples/slot/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
50 | // endregion script
51 |
52 | // region template
53 |
54 |
60 |
61 |
64 |
69 |
74 |
75 | {{ item.description }}
76 |
77 |
78 |
79 |
80 |
81 |
82 | // endregion template
83 |
84 | // region style
85 |
143 | // endregion style
144 |
--------------------------------------------------------------------------------
/docs/v-if.md:
--------------------------------------------------------------------------------
1 | # v-if で表示・非表示を切り替える
2 |
3 | ## 本章の概要とゴール
4 | 購入しようと思った商品が売り切れで購入できないと、せっかく購入しようとしたユーザーをがっかりさせてしまいます。
5 | 本章では、`v-if` ディレクティブを使って売り切れの商品は非表示にするようプログラムを改修していきます。
6 | 本章を実践すると、特定の条件の時だけ HTML を表示させることができるようになり、`v-if` の使い方が理解できます。
7 |
8 | ## v-if の書き方
9 |
10 | Vue.js では特定の条件の時だけ DOM を生成し表示できる、`v-if` というディレクティブが用意されています。以下のように、表示・非表示を制御したい DOM 要素に `v-if` を追加します。`v-if` の値が `true` の場合は表示され、 `false` の場合は表示されません。
11 |
12 | ```html
13 |
14 | something
15 |
16 |
17 | something
18 | ```
19 |
20 | ## プロパティの追加
21 |
22 | それでは、`v-if` を使用して、売り切れの商品を非表示にしましょう。
23 |
24 | まず、"売り切れかどうか"という情報を、`items` の商品情報に `soldOut` というプロパティで持たせてみましょう。今回は `id` が `3` の商品を売り切れ状態にしてみます。`id` が `3` の商品に `soldOut` というプロパティを追加し、 `true` を設定します。
25 |
26 | <<< @/../examples/v-if/src/App.vue#script{30-30}
27 |
28 | ## DOM 要素に v-if を追加
29 |
30 | 次に、DOM 要素に `v-if` を追加して、非表示にします。1 つ 1 つの商品を表示している要素は以下でハイライトしている部分です。
31 |
32 | 変更前
33 |
34 | <<< @/../examples/v-for/src/App.vue#template{12-23}
35 |
36 | この `` 要素に `v-if` を記述していきます。`item.soldOut` が `true` の場合は、売り切れであることを示しています。
37 |
38 | 売り切れではない時、つまり `item.soldOut` が `false` の時だけ表示をさせたいため、ひと工夫必要です。`v-if="item.soldOut"` としてしまうと、売り切れの場合のみ表示させることになってしまうため、`!` を使用して真偽値を逆転させて使用しましょう。
39 |
40 | 変更後
41 |
42 | <<< @/../examples/v-if/src/App.vue#template{12-25}
43 |
44 | これで `id` が `3` の商品は非表示になりました。
45 |
46 | ::: tip ヒント
47 | ここでは省略していますが、売り切れの状態を明示するため、`id` が `3` 以外の商品は `soldOut` プロパティを `false` にしておくとよいでしょう。
48 | :::
49 |
50 | ## v-else や v-else-if の使い方
51 |
52 | JavaScript の条件分岐の構文に `else` があるように、Vue.js にも同様のディレクティブが用意されています。`else` と同様の働きをするのが `v-else` です。
53 |
54 | 例えば、売り切れの場合は非表示にするのではなく"売り切れです"というメッセージを表示させたい場合は以下のように使用できます。
55 |
56 | ```html
57 |
58 |
59 |
60 |
売り切れです
61 | ```
62 |
63 | また、JavaScript の `else if` と同様の働きをする `v-else-if` も用意されています。`v-if` の評価が `false` の時に、さらに条件を指定したい時に使用できます。
64 |
65 |
66 |
67 | ## v-showとの違い
68 | `v-if` に似た `v-show` というディレクティブが用意されています。以下のように、表示・非表示を制御したい DOM 要素に `v-show` を追加します。`v-show` の値が `true` の場合は表示され、 `false` の場合は表示されません。
69 |
70 | ```html
71 |
72 |
something
73 |
74 |
75 |
something
76 | ```
77 |
78 | 一見 `v-if` と同じように思えますが、`v-if` が DOM 要素ごと削除しているのに対して、`v-show` は style 属性の値に `display:none;` を付与して非表示にしています。
79 |
80 | ブラウザ上での描画
81 | ```html
82 |
83 |
something
84 | ```
85 |
86 | ::: tip ヒント
87 | `v-if` は表示を切り替えるコストが高く、 `v-show` は初期描画のコストが高いです。そのため、頻繁に表示を切り替えるのであれば `v-show` を使い、それ以外では `v-if` を使うとよいでしょう。
88 | :::
89 |
90 | ::: warning 注意
91 | `v-show` は `
` 要素に使えないことに気をつけましょう。また、 `v-else` や `v-else-if` も使えません。
92 | :::
93 |
94 | ## v-for との併用について
95 |
96 | `v-if` と `v-for` を同時に使うことは推奨されていません。なぜなら、同じ要素において `v-for` は `v-if` より優先度が高く `v-if` の評価に関わらず `v-for` の表示処理が行われるためです。以下の例のように、別の要素に分けることを推奨します。
97 |
98 | ```html
99 |
100 |
103 |
104 |
105 |
106 |
107 |
108 | 売り切れです
109 | ```
110 |
--------------------------------------------------------------------------------
/examples/overview/src/components/TheWelcome.vue:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | Documentation
16 |
17 | Vue’s
18 | official documentation
19 | provides you with all information you need to get started.
20 |
21 |
22 |
23 |
24 |
25 |
26 | Tooling
27 |
28 | This project is served and bundled with
29 | Vite . The recommended IDE
30 | setup is VSCode +
31 | Volar . If you need to test
32 | your components and web pages, check out
33 | Cypress and
34 | Cypress Component Testing .
37 |
38 |
39 |
40 | More instructions are available in README.md.
41 |
42 |
43 |
44 |
45 |
46 |
47 | Ecosystem
48 |
49 | Get official tools and libraries for your project:
50 | Pinia ,
51 | Vue Router ,
52 | Vue Test Utils , and
53 | Vue Dev Tools . If you need more
54 | resources, we suggest paying
55 | Awesome Vue
56 | a visit.
57 |
58 |
59 |
60 |
61 |
62 |
63 | Community
64 |
65 | Got stuck? Ask your question on
66 | Vue Land , our official Discord server, or
67 | StackOverflow .
68 | You should also subscribe to
69 | our mailing list and follow the official
70 | @vuejs
71 | twitter account for latest news in the Vue world.
72 |
73 |
74 |
75 |
76 |
77 |
78 | Support Vue
79 |
80 | As an independent project, Vue relies on community backing for its sustainability. You can help
81 | us by
82 | becoming a sponsor .
83 |
84 |
85 |
--------------------------------------------------------------------------------
/docs/rendering.md:
--------------------------------------------------------------------------------
1 | # data を定義し、商品をレンダリングする
2 |
3 | ## 本章の概要とゴール
4 | 本章では、作成したアプリケーションに JavaScript、HTML、CSS を追加して商品を表示するページを作っていきます。
5 | 本章を実践すると、1 つの商品を表示するページが作成でき、Vue.js ではどのようにページがレンダリングされるのかが理解できます。
6 |
7 | ## VS Code の起動
8 |
9 | まず、VS Code で先ほど作成したプロジェクトを開きましょう。プロジェクトの開き方は 2 通りありますので、使いやすい方で起動して下さい。
10 |
11 | #### コマンドから起動する方法
12 |
13 | カレントディレクトリ(プロジェクトのディレクトリ、今回の例では `vue3-lab`)で以下のコマンドを実行します
14 |
15 | ```bash
16 | code .
17 | ```
18 |
19 | #### GUI で起動する方法
20 |
21 | アプリケーションのメニューで Visual Studio Code を起動し、「ファイル」-「フォルダーを開く」で自分の環境のプロジェクトディレクトリを選択します。
22 |
23 | 
24 |
25 |
26 | ## 画像ファイルの配置
27 |
28 | 次に、ハンズオンで使う商品の画像を用意しましょう。ハンズオン用の画像ファイル([vue3-lab-handson-images.zip](./vue3-lab-handson-images.zip 'vue3-lab-handson.zip'))をダウンロードおよび解凍します。
29 |
30 | あらかじめ作成しておいた Vue.js プロジェクトを開き、 `public` ディレクトリの下に `images` ディレクトリを新しく作成します。作成した `images` ディレクトリの中に、先ほど解凍した画像ファイルをすべてコピーします。
31 |
32 | ## コード変更の準備
33 |
34 | ここからは、デフォルトで生成された Vue のプロジェクトを独自のコードに置き換えていきます。まず、今後のステップで利用しない不要なコードやファイルを削除していきましょう。
35 |
36 | まず、`src/main.js` から今回は利用しない不要な css ファイルの import 削除します。
37 |
38 | 変更前(`src/main.js`)
39 |
40 | <<< @/../examples/overview/src/main.js
41 |
42 | 変更後(`src/main.js`)
43 |
44 | <<< @/../examples/rendering/src/main.js
45 |
46 | 次に、今後のステップで利用しないファイルをディレクトリごと削除します。削除する対象は以下のディレクトリです。
47 |
48 | - `src/assets/` 以下すべて
49 | - `src/components/` 以下すべて
50 |
51 | ## Mustache 構文
52 |
53 | ::: v-pre
54 | Vue.js では、`{{ }}` のような `Mustache` 構文を使ってテキストをレンダリングできます。以下の例では script 部分の message を表示しています。message の内容が変更されると、それに応じて表示も更新されます。
55 | :::
56 |
57 | ```vue
58 |
62 |
63 |
64 | {{ message }}
65 |
66 | ```
67 |
68 | ```js
69 | import { createApp } from 'vue'
70 | import App from './App.vue'
71 |
72 | createApp(App).mount('#app')
73 | ```
74 |
75 | 出力例
76 |
77 | ```
78 | Welcome to Vue Handson!
79 | ```
80 |
81 | ::: tip ヒント
82 | ::: v-pre
83 | mustache とは口髭を指す英語で、二重中括弧 `{{ }}` が口髭のように見えることから命名されました。
84 | :::
85 |
86 | ## 商品をレンダリング
87 |
88 | プロジェクトのファイルを書き換えて、商品をレンダリングしていきましょう。まず、`src/App.vue` ファイルの template を次のように変更します。
89 |
90 | 変更前(template)
91 |
92 | <<< @/../examples/overview/src/App.vue#template
93 |
94 | 変更後(template)
95 |
96 | <<< @/../examples/rendering/src/App.vue#template
97 |
98 | 次に、`src/App.vue` ファイルの script を次のように変更します。
99 |
100 | 変更前(script)
101 |
102 | <<< @/../examples/overview/src/App.vue#script
103 |
104 | 変更後(script)
105 |
106 | <<< @/../examples/rendering/src/App.vue#script
107 |
108 | 見た目を設定するために style タグの中身を以下のように置き換えます。
109 |
110 | <<< @/../examples/rendering/src/App.vue#style
111 |
112 | これで、商品を 1 つレンダリングできました。
113 |
114 |
115 |
116 | ## 商品の内容を変更
117 | 商品の内容を変更し、表示に反映されることを確認してみましょう。商品名 `name`、概要文 `description`、価格 `price` をそれぞれ適当に変更します。
118 |
119 | 変更前(script)
120 |
121 | <<< @/../examples/rendering/src/App.vue#script
122 |
123 | 変更後(script)
124 |
125 | ```vue
126 |
137 | ```
138 |
139 | このようにデータを更新したとき、自動的に表示が更新される状態のことを、「リアクティブ」と言います。
140 |
--------------------------------------------------------------------------------
/examples/v-for/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
40 | // endregion script
41 |
42 | // region template
43 |
44 |
50 |
51 |
54 |
55 |
56 |
59 |
60 |
61 |
{{ item.name }}
62 |
{{ item.description }}
63 |
¥{{ item.price }}
64 |
65 |
66 |
67 |
68 |
69 | // endregion template
70 |
71 |
153 |
--------------------------------------------------------------------------------
/examples/v-if/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
44 | // endregion script
45 |
46 | // region template
47 |
48 |
54 |
55 |
58 |
61 |
62 |
65 |
66 |
67 |
{{ item.name }}
68 |
{{ item.description }}
69 |
¥{{ item.price }}
70 |
71 |
72 |
73 |
74 |
75 | // endregion template
76 |
77 |
159 |
--------------------------------------------------------------------------------
/docs/v-for.md:
--------------------------------------------------------------------------------
1 | # v-for で商品を複数表示する
2 |
3 | ## 本章の概要とゴール
4 | 新しい商品が入荷したので、複数の商品を販売することになりました。
5 | 本章では、`v-for` ディレクティブを使って繰り返し表示することで、複数の商品を表示できるようにプログラムを改修していきます。
6 | 本章を実践すると、HTML の要素を増やさずに商品を複数表示することができるようになり、`v-for` の使い方を理解できます。
7 |
8 | ## v-for の書き方
9 |
10 | Vue.js では、配列からデータを取り出し、繰り返しで表示する、`v-for` というディレクティブが用意されています。
11 |
12 | `v-for` ディレクティブは、 `task in tasks` のような構文で書きます。 `tasks` はデータを取り出す元の配列で、あらかじめ用意した配列の名前を指定します。 `task` は配列から取り出した 1 つ 1 つの値にアクセスするエイリアスで、任意の名前を指定します。
13 |
14 | ::: v-pre
15 | 以下の例では script 内の `tasks` からデータを取り出し `{{ task }}` で表示しています。
16 | :::
17 |
18 | ```html
19 |
24 | ```
25 |
26 | ```js
27 | const tasks = ref([
28 | 'タスクA',
29 | 'タスクB',
30 | 'タスクC',
31 | ])
32 | ```
33 |
34 | 出力例
35 | ```
36 | ・タスクA
37 | ・タスクB
38 | ・タスクC
39 | ```
40 |
41 | 
42 |
43 | ## 複数の商品をレンダリング
44 | プロジェクトのファイルを書き換えて、複数の商品をレンダリングしていきましょう。`src/App.vue` ファイルを次のように変更します。
45 |
46 | まずは、 script に表示したい商品を設定します。 `item` から `items` に変更し商品のオブジェクトを持つ配列にします。
47 |
48 | 変更前
49 |
50 | <<< @/../examples/rendering/src/App.vue#script{3-10}
51 |
52 | 変更後
53 |
54 | <<< @/../examples/v-for/src/App.vue#script{4-37}
55 |
56 | 次に、 `v-for` を用いて、各商品の「名前(name)」、「説明(description)」、「価格(price)」、「画像(image)」を繰り返し表示します。
57 |
58 | 変更前
59 |
60 | <<< @/../examples/rendering/src/App.vue#template{9-20}
61 |
62 | 変更後
63 |
64 | <<< @/../examples/v-for/src/App.vue#template{9-24}
65 |
66 | 同時に指定している `key` 属性は、 `v-for` で取り出した各要素を一意(ユニーク)にするために推奨されているものです。一意にすることで、 Vue.js が要素の再利用や並び替えをする手助けになります。 詳細は [Vue.jsドキュメントガイド key による状態管理](https://ja.vuejs.org/guide/essentials/list.html#maintaining-state-with-key "Vue.jsドキュメントガイド key による状態管理")を参照してください。
67 |
68 | ::: tip ヒント
69 | v-for を使った template タグは DOM 要素としてレンダリングされません。
70 | :::
71 |
72 | このように `v-for` を使うことで、以下のように商品を複数レンダリングできるようになりました。
73 |
74 | 
75 |
76 |
77 |
78 | ## v-for の index と注意点
79 | 以下のように、 `v-for` で配列のインデックスを取り出せます。
80 |
81 | ```html
82 |
83 |
84 | {{index}} , {{ task }}
85 |
86 |
87 | ```
88 |
89 | ```js
90 | const tasks = ref([
91 | 'タスクA',
92 | 'タスクB',
93 | 'タスクC',
94 | ])
95 | ```
96 |
97 | 出力例
98 | ```
99 | ・ 0 , タスクA
100 | ・ 1 , タスクB
101 | ・ 2 , タスクC
102 | ```
103 |
104 | ::: danger 注意
105 | `v-for` の `key` に `v-for` の `index` を使うことはできますが、要素の再利用や並び替え時に問題が発生するため非推奨です。
106 | :::
107 |
108 | ## オブジェクトの v-for
109 | データの取り出し元に、オブジェクトを使うことも可能です。以下の例では、オブジェクトの `key` と `value` を順番に取り出して表示しています。
110 |
111 | ```html
112 |
113 |
114 | {{ key }} , {{ value }}
115 |
116 |
117 | ```
118 |
119 | ```js
120 | const tasks = ref({
121 | taskA: 'タスクA',
122 | taskB: 'タスクB',
123 | taskC: 'タスクC',
124 | })
125 | ```
126 |
127 | 出力例
128 | ```
129 | ・ taskA , タスクA
130 | ・ taskB , タスクB
131 | ・ taskC , タスクC
132 | ```
133 |
134 | オブジェクトの `key` と `value` に加えて `index` を表示することもできます。
135 |
136 | ```html
137 |
138 |
139 | {{index}} , {{key}} , {{ value }}
140 |
141 |
142 | ```
143 |
144 | ```js
145 | const tasks = ref({
146 | taskA: 'タスクA',
147 | taskB: 'タスクB',
148 | taskC: 'タスクC',
149 | })
150 | ```
151 |
152 | 出力例
153 | ```
154 | ・ 0 , taskA , タスクA
155 | ・ 1 , taskB , タスクB
156 | ・ 2 , taskC , タスクC
157 | ```
158 |
--------------------------------------------------------------------------------
/examples/methods/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
52 | // endregion script
53 |
54 | // region template
55 |
56 |
62 |
63 |
66 |
69 |
70 |
73 |
74 |
75 |
{{ item.name }}
76 |
{{ item.description }}
77 |
¥{{ pricePrefix(item.price) }}
78 |
79 |
80 |
81 |
82 |
83 | // endregion template
84 |
85 |
167 |
--------------------------------------------------------------------------------
/examples/event/src/App.vue:
--------------------------------------------------------------------------------
1 | // region script
2 |
56 | // endregion script
57 |
58 | // region template
59 |
60 |
66 |
67 |
70 |
75 |
76 |
79 |
80 |
81 |
{{ item.name }}
82 |
{{ item.description }}
83 |
¥{{ pricePrefix(item.price) }}
84 |
85 |
86 |
87 |
88 |
89 | // endregion template
90 |
91 | // region style
92 |
178 | // endregion style
179 |
--------------------------------------------------------------------------------
/docs/methods.md:
--------------------------------------------------------------------------------
1 | # 関数で価格にカンマを入れる
2 |
3 | ## 本章の概要とゴール
4 | 本章では、データに格納した価格の数値は変更せず、関数を使って価格をカンマ付きの表示にするようプログラムを改修していきます。
5 | 本章を実践すると、関数を使ってデータを操作・加工することができるようになります。
6 |
7 | ## Vue.js でデータを操作する
8 |
9 | 今度は、商品価格の表示を変更してみましょう。価格の表示は、例えば `1,180円` のように 3 桁ごとにカンマを入れた表示が一般的です。しかし、`items` の `price` にはカンマのない価格が格納されています。
10 |
11 | このようなとき、`price` に格納する値を数値から文字列に変更し、カンマを追加するのも 1 つの手です。しかし価格のデータを文字列にしてしまうと、今度は足したり引いたりといった数値計算ができなくなってしまいます。
12 |
13 | そこで、`items` の中身は変更せず、データを加工して表示のみを変更してみましょう。
14 |
15 | ### 前回までのコードの確認
16 |
17 | 現在の `` 内のコードは以下のようになっています。
18 |
19 | <<< @/../examples/v-if/src/App.vue#template
20 |
21 | 価格の表示を行なっている部分は、下記のコード部分です。
22 |
23 | ```html
24 | ¥{{ item.price }}
25 | ```
26 |
27 | この部分のコードを改修して、`item.price` を 3 桁ごとにカンマを入れた表示に変えてみましょう。
28 |
29 | ### Mustache 構文の中で直接表示を操作する
30 |
31 | ::: v-pre
32 | `{{ }}` の中には、値だけではなく処理を記述できます。
33 | :::
34 |
35 | ```html
36 | ¥{{ item.price.toLocaleString() }}
37 | ```
38 |
39 | JavaScript がもともと持っている `toLocaleString()` 関数を用いて、3 桁ごとにカンマを入れた表示にできました。
40 |
41 | - [ `toLocaleString()` に関する詳細](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)
42 |
43 | ## 独自の関数を定義
44 |
45 | ::: v-pre
46 | このように、`{{ }}` の中に直接実行したい処理を記述できますが、処理が長くなると可読性が下がってしまいます。そこで、実行したい処理を関数にして登録し、`{{ }}` にはその関数を記述するとよりスマートです。
47 | :::
48 |
49 | 通常の JavaScript のように関数宣言で定義することで、関数を追加することができます。
50 |
51 | `item.price` を引数として渡し、`toLocaleString()` の結果を返す関数を作成してみましょう。
52 |
53 | ### 関数を定義する
54 |
55 | `
114 | ```
115 |
116 | 新たな関数として `stockQuantity()` を定義し、`template` 内で使用しています。`stockQuantity()` では `filter()` 関数によって在庫がある商品を抽出し、`length` プロパティによって抽出した数を取得しています。
117 |
118 | ここに[v-else や v-else-if の使い方](https://handson.vuejs-jp.org/v-if.html#v-else-%E3%82%84-v-else-if-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)のコードを参考に、入荷のボタンを追加してみます。
119 |
120 | ```html
121 |
122 |
123 |
124 |
125 | 売り切れです入荷
126 |
127 | ```
128 | ```html
129 |
146 | ```
147 |
148 | 入荷ボタンをクリックすると `stockItem()` によって `items` 配列の中身が変更されます。`items` 配列が変更されたことにより `template` が更新されるので、`stockQuantity()` が実行され、商品数が 3 から 4 に更新されます。
149 |
150 | #### 算出プロパティで商品数を表示する
151 |
152 | 関数で商品数を表示しましたが、算出プロパティでも `computed` を使って商品数を表示することができます。
153 |
154 | ```html
155 |
162 | ```
163 |
164 | 処理の内容は 関数で商品数を取得した `stockQuantity()` と同じです。それでは作成した `stockQuantityComputed` を `template` で使用してみましょう。
165 |
166 | ```html
167 |
168 |
172 | 商品数:{{ stockQuantityComputed }}
173 |
174 |
175 | ```
176 |
177 | 商品数には 3 が表示され、入荷ボタンをクリックすると 4 に更新されます。
178 |
179 | ::: tip ヒント
180 | 関数で定義したものは JavaScript のまさに関数ですが、`computed` を使うことで、JavaScript のオブジェクトで定義したプロパティと同じように扱うことができる算出プロパティとして定義されます。そのため、`computed` で定義された算出プロパティを `template` で使う際には `()` は不要です。
181 | :::
182 |
183 | #### 関数と算出プロパティの違い
184 |
185 | 関数でも算出プロパティでも最終的に同じ値を取得することが可能ですが、2 つの違いはどこにあるのでしょうか。
186 |
187 | #### キャッシュの違いについて
188 | 大きな違いとして 算出プロパティにはキャッシュ機能があるため、値の更新タイミングが異なります。
189 |
190 | - 関数 : `template` が更新された時
191 | - 算出プロパティ : `items` が更新された時
192 |
193 | 実際に値の更新タイミングを確認するために、現在時刻を表示する処理を追加していきます。
194 |
195 | ```html
196 |
197 | 商品数:{{ stockQuantity() }}
198 | 現在時刻:{{ getDate() }}
199 | ```
200 | ```html
201 |
214 | ```
215 |
216 | 入荷ボタンをクリックすると商品数だけでなく、現在時刻も更新されます。関数を更新すると `template` の更新処理が実行されるため、定義されている他の関数も更新されるからです。
217 |
218 | 次に算出プロパティに現在時刻を取得する処理を追加してみましょう。
219 |
220 | ```html
221 |
222 | 現在時刻:{{ getDate() }}
223 | 現在時刻(computed):{{ getDateComputed }}
224 | ```
225 | ```html
226 |
232 | ```
233 |
234 | 関数で定義されていた `getDate()` では、入荷ボタンをクリックすると更新されましたが、`computed` を使って定義された算出プロパティ `getDateComputed` は更新されません。この算出プロパティの値の更新タイミングは `items` が更新された場合であり、`items` を扱っていないと自動的に値が更新されないことが理由です。
235 |
236 | 以上のように、関数と算出プロパティでは更新のタイミングが違うので注意が必要です。
237 |
238 | ::: tip ヒント
239 | 毎回自動的に更新がされるため、関数の方が便利そうです。しかし、これには注意が必要です。例えば、巨大な配列をループして多くの計算が必要な処理があったとします。関数で定義した場合 `template` が更新される度に、このループ処理が実行されてしまいます。しかし、算出プロパティで定義していた場合はキャッシュが効いているので実行されません。
240 | :::
241 |
--------------------------------------------------------------------------------
/docs/event.md:
--------------------------------------------------------------------------------
1 | # @click で商品を選択する
2 |
3 | ## 本章の概要とゴール
4 | 本章では、クリックイベントを定義して購入する商品をクリックで選択できるようにプログラムを改修していきます。商品をクリックすると選択中となり、選択中の商品は背景の色は変わるようにします。
5 | 本章を実践すると、`v-on` ディレクティブを使ってイベントリスナーの登録ができるようになります。
6 | また、`v-bind` ディレクティブを使って選択中かそうでないかを判断して、動的に style を変化させることができるようになります。
7 |
8 | ### 実装の考え方
9 |
10 | どのように実装していけば良いか 1 つずつ分解して考えてみると、以下のようになります。
11 |
12 | 1. 選択状態を表す style を用意する
13 | 2. クリックすると商品を"選択状態"にする
14 | 3. "選択状態"の時にだけ、1 の style を適用する
15 |
16 | 1 つ 1 つの処理は難しくありません。順番に実装してみましょう。
17 |
18 | ### 前回までのコードの確認
19 |
20 | 現在のコードは以下のようになっています。
21 |
22 | template
23 |
24 | <<< @/../examples/methods/src/App.vue#template
25 |
26 | script
27 |
28 | <<< @/../examples/methods/src/App.vue#script
29 |
30 | ## 1. 選択状態を表す style を用意する
31 |
32 | まず、選択中の商品に適用する style を用意しましょう。`
118 | ```
119 |
120 | ## Card コンポーネントを使用する
121 | 切り出しができたので、作成したコンポーネントを `App.vue` で使えるようにしましょう。
122 |
123 | #### App.vue / template
124 |
125 | ```vue{14}
126 |
127 |
128 |
129 |
130 |
131 |
134 |
139 |
140 |
141 |
142 |
143 |
144 | ```
145 |
146 | #### App.vue / script
147 |
148 | ```vue{3}
149 |
156 | ```
157 |
158 | `Card` コンポーネントを `import` して、`template` 内で呼び出しています。しかし現状エラーがでて動きません。作成した `Card` コンポーネントは `item` のデータを持っていないためです。そのため、`Card` コンポーネントでも `item` のデータを使えるように、親のコンポーネント(`App.vue`)から `props` として渡す必要があります。
159 |
160 | ### 親のコンポーネント( App.vue )から値を受け取る準備をする
161 |
162 | まず必要なデータを受け取るために準備をします。
163 |
164 | 現在 `item` オブジェクト内のデータを参照していますが、 シンプルに必要な値のみを受け取り、表示するようにするために、コードを書き換えます。
165 |
166 | #### Card.vue / template
167 |
168 | ```vue{4,8-10}
169 |
170 |
171 |
174 |
175 |
176 |
{{ name }}
177 |
{{ description }}
178 |
¥{{ pricePrefix(price) }}
179 |
180 |
181 | ```
182 |
183 | 次に親のコンポーネントから `props` を受け取る設定を記述します。
184 |
185 | #### Card.vue / script
186 |
187 | ```vue{2-23}
188 |
215 | ```
216 |
217 | `defineProps` の中に受け取る `props` を書いていきます。`type` は型、`default` は初期値、`required` は必須要素を表しています。
218 |
219 | ::: tip ヒント
220 | `defineProps` とこのあと紹介する `defineEmits` は `
301 | ```
302 |
303 | `
316 | ```
317 |
318 | 次に `template` に売り切れのボタンを作成します。
319 |
320 | ```vue{5}
321 |
322 |
323 |
324 |
325 | emit('sold-out',id)">売り切れ
326 |
327 | ```
328 |
329 | 売り切れのボタンをクリックすると `defineEmits` を実行します。
330 |
331 | ### App.vue で実行する関数を定義
332 |
333 | `Card` コンポーネントからの `emits` を受け取り、実行される関数を定義していきます。
334 |
335 | ```vue{7}
336 |
343 | ```
344 |
345 | `Card` コンポーネントには `sold-out` の `emits` を受け取った場合に `changeSoldOut` が実行されるように設定しました。次に、実行される `changeSoldOut` を定義します。
346 |
347 | ```vue{5-8}
348 |
357 | ```
358 |
359 | 子のコンポーネントの売り切れのボタンをクリックすると、該当の `soldOut` プロパティを変更し、商品を非表示にすることができました。
360 |
--------------------------------------------------------------------------------
/docs/slot.md:
--------------------------------------------------------------------------------
1 | # コンポーネントにスロットを使用する
2 |
3 | 商品をコンポーネント化したことで、`Card` コンポーネントに必要な情報を `props` で渡すだけとなり、コードが見やすくなりました。
4 |
5 | ```vue
6 |
7 |
13 |
14 |
17 |
22 |
28 |
29 |
30 |
31 |
32 | ```
33 |
34 | ここで、商品ページを充実するために、`drink` や `sidemenu` といった「タグ情報」であったり、商品詳細やアレルギー表示などの「リンク情報」といった機能を追加しようとした時はどうすればよいでしょうか。現在のコードでは、`props` に定義されておらず、情報を渡すことができないため、その度に `props` の修正を行う必要があります。そこで、`Card` コンポーネントを汎用的に利用できるように、スロットを使用してみましょう。
35 |
36 | ## スロットについて
37 |
38 | ### スロットとは
39 |
40 | Vue.js のスロットでは、親コンポーネントから子コンポーネントにコンテンツを渡してレンダリングすることが可能です。スロットを使用すると、コンポーネントの `props` の修正に手を入れることなく、表示するコンテンツを変更できるため、コンポーネントの再利用性と柔軟性が高まります。スロットには、**スロットコンテンツ**と**スロットアウトレット**という仕組みがあるので、説明していきます。
41 |
42 | #### スロットコンテンツ
43 | スロットコンテンツとは、子コンポーネントへ渡すコンテンツのことを指します。
44 |
45 | コンテンツを渡す方法は、親コンポーネントで子コンポーネントを呼び出し、子コンポーネントの要素へレンダリングしたいコンテンツを定義します。スロットコンテンツとして、プレーンテキスト、HTML 要素、他のコンポーネントなど、さまざまな種類を渡すことができます。
46 |
47 | #### 親コンポーネント
48 |
49 | ```vue
50 |
51 | スロットコンテンツ
52 |
53 | ```
54 |
55 | #### スロットアウトレット
56 |
57 | 親コンポーネントでスロットコンテンツを定義しましたが、子コンポーネント側では、スロットコンテンツを受け取るためのスロットアウトレットを用意する必要があります。
58 |
59 | コンテンツを受け取る方法は、スロットコンテンツをレンダリングしたい場所に `slot` 要素を定義します。
60 |
61 | #### 子コンポーネント
62 |
63 | ```vue
64 |
65 |
66 |
67 |
68 | ```
69 |
70 | スロットコンテンツで紹介した親コンポーネントのコードと、スロットアウトレットの子コンポーネントを組み合わせると、最終的に表示されるコードは以下のようになります。
71 |
72 | ```vue
73 |
74 |
75 | スロットコンテンツ
76 |
77 | ```
78 |
79 | ### 名前付きスロット
80 |
81 | コンポーネントに複数のスロットを渡したい場合や、コンテンツを識別しやすいように特定の名前を付けたい場合があります。このような場合、名前付きスロットを使用することができます。
82 |
83 | 名前付きスロットを定義するには、`name` 属性を指定する必要があります。
84 |
85 | #### 子コンポーネント
86 |
87 | ```vue
88 |
89 |
90 |
Child Component
91 |
92 |
93 |
94 |
95 | ```
96 |
97 | 上の例では、コンポーネントのテンプレートに、コンテンツ用とフッター用の 2 つの名前付きスロットを定義しています。親コンポーネント側では、スロットアウトレットの `name` 属性で定義した名前を、`v-slot` ディレクティブを使用して、スロットコンテンツに指定します。
98 |
99 | #### 親コンポーネント
100 |
101 | ```vue
102 |
103 |
104 |
105 |
106 | コンテンツ
107 |
108 |
109 | フッター
110 |
111 |
112 |
113 |
114 | ```
115 |
116 | スロットコンテンツには、`DOM` をそのまま記述することが可能なので、テキストを `p` 要素で囲って渡していることにも注目です。
117 |
118 | また、`v-slot` には専用の省略表記があり、`` は `
122 |
123 |
124 |
125 | コンテンツ
126 |
127 |
128 | フッター
129 |
130 |
131 |
132 |
133 | ```
134 |
135 | ::: tip ヒント
136 | `name` 属性がない ` ` は暗黙的に `default` という `name` が設定されています。
137 | つまり、 ` ` と同じ意味になります。もちろん親コンポーネントでも `` と記述することが可能です。
138 | :::
139 |
140 |
141 | ## Cardコンポーネントでスロットを利用する
142 |
143 | 実際に `Card` コンポーネントにスロットを実装していきましょう。
144 |
145 | ### `description` をスロットに置き換える
146 |
147 | 現在、`Card` コンポーネントは、`id`、`image`、`name`、`description`、`price`、 5 つの `props` を受け付けています。今回は、`props` から `description` を削除し、汎用的に使用可能な `body` という名前付きスロットに置き換えていきます。まずは、親コンポーネントである `App.vue` を修正していきます。
148 |
149 | #### App.vue / template
150 |
151 | ```vue{17-25}
152 |
153 |
159 |
160 |
163 |
168 |
173 |
174 | {{ item.description }}
175 |
176 |
177 |
178 |
179 |
180 |
181 | ```
182 |
183 | ## スロットを利用し、コンテンツを表示する
184 |
185 | `App.vue` の修正が終わったら、次は `Card` コンポーネントを修正します。
186 |
187 | ### スロットを利用し、テキストを挿入する
188 |
189 | `Card` コンポーネントでは、`name` 属性に `body` を指定したスロットアウトレットを定義します。同時に、`props` から `description` を削除しておきます。
190 |
191 | #### Card.vue / template
192 |
193 | ```vue{9}
194 |
195 |
196 |
199 |
200 |
201 |
{{ name }}
202 |
203 | ¥{{ pricePrefix(price) }}
204 |
205 |
206 | ```
207 |
208 | #### Card.vue / script
209 |
210 | ```vue
211 |
231 | ```
232 |
233 | 以上で、スロットの置き換えが完了です。見た目上の変化はありませんが、`body` のスロットコンテンツが表示されているかと思います。
234 |
235 |
236 |
237 | ## スロットにコンポーネントを定義する
238 |
239 | ### スロットに複数要素を定義する
240 |
241 | カードに表示する内容で、商品詳細ページのリンクを追加したいと考えたとします。`slot` には複数の HTML 要素を定義することもできるので、`a` 要素を追加してリンクを設定してみましょう。
242 |
243 | 商品ごとにリンクが異なっていたり、そもそも商品詳細ページがない商品もあるかもしれません。そのような時でも、`slot` を使用して柔軟に対応が可能です。まず、商品リストの定義に詳細ページのリンクを追加します。
244 |
245 | #### App.vue / script
246 |
247 | ```vue{15}
248 |
267 | ```
268 |
269 | 今回はダミーでハンズオンのリンクを設定しています。次に、スロットコンテンツの修正をします。
270 |
271 | #### App.vue / template
272 |
273 | ```vue{10}
274 |
275 |
276 |
281 |
282 | {{ item.description }}
283 | リンク
284 |
285 |
286 |
287 |
288 | ```
289 |
290 | `a` 要素へ商品詳細ページのリンクを設定していますが、`v-if` を使用して、詳細ページのリンク情報が設定されていない場合は表示されないようにしています。
291 |
292 | ### スロットコンテンツをコンポーネント化する
293 |
294 | スロットコンテンツへは、HTML 要素だけでなく、コンポーネントも定義することが可能です。スロットコンテンツをコンポーネント化して、表示されるか確認してみましょう。
295 |
296 | まずは `components` 配下に `CardBody.vue` を新規で作成して、`props` の定義も行います。`props` では `description` と `link` を受け付けます。
297 |
298 | #### CardBody.vue
299 |
300 | ```vue
301 |
315 |
316 |
317 | {{ description }}
318 | リンク
319 |
320 | ```
321 |
322 | コンポーネントの作成ができたので、スロットコンテンツを置き換えます。また、`CardBody` コンポーネントを `import` することを忘れないようにしましょう。
323 |
324 | #### App.vue
325 |
326 | ```vue{4,18-20}
327 |
334 |
335 |
336 |
337 |
343 |
344 |
347 |
348 |
349 |
350 |
351 | ```
352 |
353 | 以上で、スロットコンテンツへのコンポーネントの定義が完了です。
354 |
355 | +1 チャレンジでは、スロットコンテンツへの複数要素の定義と、コンポーネントの定義を行い、レンダリングされることが確認できたと思います。
356 |
--------------------------------------------------------------------------------
/docs/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "handson-vue3-examples-docs",
3 | "version": "2.1.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "handson-vue3-examples-docs",
9 | "version": "2.1.0",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "vitepress": "^1.0.0-beta.5",
13 | "vue": "^3.3.4"
14 | }
15 | },
16 | "node_modules/@algolia/autocomplete-core": {
17 | "version": "1.9.3",
18 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz",
19 | "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==",
20 | "dev": true,
21 | "dependencies": {
22 | "@algolia/autocomplete-plugin-algolia-insights": "1.9.3",
23 | "@algolia/autocomplete-shared": "1.9.3"
24 | }
25 | },
26 | "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
27 | "version": "1.9.3",
28 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz",
29 | "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==",
30 | "dev": true,
31 | "dependencies": {
32 | "@algolia/autocomplete-shared": "1.9.3"
33 | },
34 | "peerDependencies": {
35 | "search-insights": ">= 1 < 3"
36 | }
37 | },
38 | "node_modules/@algolia/autocomplete-preset-algolia": {
39 | "version": "1.9.3",
40 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz",
41 | "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==",
42 | "dev": true,
43 | "dependencies": {
44 | "@algolia/autocomplete-shared": "1.9.3"
45 | },
46 | "peerDependencies": {
47 | "@algolia/client-search": ">= 4.9.1 < 6",
48 | "algoliasearch": ">= 4.9.1 < 6"
49 | }
50 | },
51 | "node_modules/@algolia/autocomplete-shared": {
52 | "version": "1.9.3",
53 | "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz",
54 | "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==",
55 | "dev": true,
56 | "peerDependencies": {
57 | "@algolia/client-search": ">= 4.9.1 < 6",
58 | "algoliasearch": ">= 4.9.1 < 6"
59 | }
60 | },
61 | "node_modules/@algolia/cache-browser-local-storage": {
62 | "version": "4.18.0",
63 | "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz",
64 | "integrity": "sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==",
65 | "dev": true,
66 | "dependencies": {
67 | "@algolia/cache-common": "4.18.0"
68 | }
69 | },
70 | "node_modules/@algolia/cache-common": {
71 | "version": "4.18.0",
72 | "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz",
73 | "integrity": "sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==",
74 | "dev": true
75 | },
76 | "node_modules/@algolia/cache-in-memory": {
77 | "version": "4.18.0",
78 | "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz",
79 | "integrity": "sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==",
80 | "dev": true,
81 | "dependencies": {
82 | "@algolia/cache-common": "4.18.0"
83 | }
84 | },
85 | "node_modules/@algolia/client-account": {
86 | "version": "4.18.0",
87 | "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz",
88 | "integrity": "sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==",
89 | "dev": true,
90 | "dependencies": {
91 | "@algolia/client-common": "4.18.0",
92 | "@algolia/client-search": "4.18.0",
93 | "@algolia/transporter": "4.18.0"
94 | }
95 | },
96 | "node_modules/@algolia/client-analytics": {
97 | "version": "4.18.0",
98 | "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz",
99 | "integrity": "sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==",
100 | "dev": true,
101 | "dependencies": {
102 | "@algolia/client-common": "4.18.0",
103 | "@algolia/client-search": "4.18.0",
104 | "@algolia/requester-common": "4.18.0",
105 | "@algolia/transporter": "4.18.0"
106 | }
107 | },
108 | "node_modules/@algolia/client-common": {
109 | "version": "4.18.0",
110 | "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz",
111 | "integrity": "sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==",
112 | "dev": true,
113 | "dependencies": {
114 | "@algolia/requester-common": "4.18.0",
115 | "@algolia/transporter": "4.18.0"
116 | }
117 | },
118 | "node_modules/@algolia/client-personalization": {
119 | "version": "4.18.0",
120 | "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz",
121 | "integrity": "sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==",
122 | "dev": true,
123 | "dependencies": {
124 | "@algolia/client-common": "4.18.0",
125 | "@algolia/requester-common": "4.18.0",
126 | "@algolia/transporter": "4.18.0"
127 | }
128 | },
129 | "node_modules/@algolia/client-search": {
130 | "version": "4.18.0",
131 | "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz",
132 | "integrity": "sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==",
133 | "dev": true,
134 | "dependencies": {
135 | "@algolia/client-common": "4.18.0",
136 | "@algolia/requester-common": "4.18.0",
137 | "@algolia/transporter": "4.18.0"
138 | }
139 | },
140 | "node_modules/@algolia/logger-common": {
141 | "version": "4.18.0",
142 | "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz",
143 | "integrity": "sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==",
144 | "dev": true
145 | },
146 | "node_modules/@algolia/logger-console": {
147 | "version": "4.18.0",
148 | "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz",
149 | "integrity": "sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==",
150 | "dev": true,
151 | "dependencies": {
152 | "@algolia/logger-common": "4.18.0"
153 | }
154 | },
155 | "node_modules/@algolia/requester-browser-xhr": {
156 | "version": "4.18.0",
157 | "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz",
158 | "integrity": "sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==",
159 | "dev": true,
160 | "dependencies": {
161 | "@algolia/requester-common": "4.18.0"
162 | }
163 | },
164 | "node_modules/@algolia/requester-common": {
165 | "version": "4.18.0",
166 | "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz",
167 | "integrity": "sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==",
168 | "dev": true
169 | },
170 | "node_modules/@algolia/requester-node-http": {
171 | "version": "4.18.0",
172 | "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz",
173 | "integrity": "sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==",
174 | "dev": true,
175 | "dependencies": {
176 | "@algolia/requester-common": "4.18.0"
177 | }
178 | },
179 | "node_modules/@algolia/transporter": {
180 | "version": "4.18.0",
181 | "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz",
182 | "integrity": "sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==",
183 | "dev": true,
184 | "dependencies": {
185 | "@algolia/cache-common": "4.18.0",
186 | "@algolia/logger-common": "4.18.0",
187 | "@algolia/requester-common": "4.18.0"
188 | }
189 | },
190 | "node_modules/@babel/parser": {
191 | "version": "7.22.6",
192 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.6.tgz",
193 | "integrity": "sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw==",
194 | "dev": true,
195 | "bin": {
196 | "parser": "bin/babel-parser.js"
197 | },
198 | "engines": {
199 | "node": ">=6.0.0"
200 | }
201 | },
202 | "node_modules/@docsearch/css": {
203 | "version": "3.5.1",
204 | "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz",
205 | "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==",
206 | "dev": true
207 | },
208 | "node_modules/@docsearch/js": {
209 | "version": "3.5.1",
210 | "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.1.tgz",
211 | "integrity": "sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==",
212 | "dev": true,
213 | "dependencies": {
214 | "@docsearch/react": "3.5.1",
215 | "preact": "^10.0.0"
216 | }
217 | },
218 | "node_modules/@docsearch/react": {
219 | "version": "3.5.1",
220 | "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz",
221 | "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==",
222 | "dev": true,
223 | "dependencies": {
224 | "@algolia/autocomplete-core": "1.9.3",
225 | "@algolia/autocomplete-preset-algolia": "1.9.3",
226 | "@docsearch/css": "3.5.1",
227 | "algoliasearch": "^4.0.0"
228 | },
229 | "peerDependencies": {
230 | "@types/react": ">= 16.8.0 < 19.0.0",
231 | "react": ">= 16.8.0 < 19.0.0",
232 | "react-dom": ">= 16.8.0 < 19.0.0"
233 | },
234 | "peerDependenciesMeta": {
235 | "@types/react": {
236 | "optional": true
237 | },
238 | "react": {
239 | "optional": true
240 | },
241 | "react-dom": {
242 | "optional": true
243 | }
244 | }
245 | },
246 | "node_modules/@esbuild/android-arm": {
247 | "version": "0.17.19",
248 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
249 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
250 | "cpu": [
251 | "arm"
252 | ],
253 | "dev": true,
254 | "optional": true,
255 | "os": [
256 | "android"
257 | ],
258 | "peer": true,
259 | "engines": {
260 | "node": ">=12"
261 | }
262 | },
263 | "node_modules/@esbuild/android-arm64": {
264 | "version": "0.17.19",
265 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
266 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
267 | "cpu": [
268 | "arm64"
269 | ],
270 | "dev": true,
271 | "optional": true,
272 | "os": [
273 | "android"
274 | ],
275 | "peer": true,
276 | "engines": {
277 | "node": ">=12"
278 | }
279 | },
280 | "node_modules/@esbuild/android-x64": {
281 | "version": "0.17.19",
282 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
283 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
284 | "cpu": [
285 | "x64"
286 | ],
287 | "dev": true,
288 | "optional": true,
289 | "os": [
290 | "android"
291 | ],
292 | "peer": true,
293 | "engines": {
294 | "node": ">=12"
295 | }
296 | },
297 | "node_modules/@esbuild/darwin-arm64": {
298 | "version": "0.17.19",
299 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
300 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
301 | "cpu": [
302 | "arm64"
303 | ],
304 | "dev": true,
305 | "optional": true,
306 | "os": [
307 | "darwin"
308 | ],
309 | "peer": true,
310 | "engines": {
311 | "node": ">=12"
312 | }
313 | },
314 | "node_modules/@esbuild/darwin-x64": {
315 | "version": "0.17.19",
316 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
317 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
318 | "cpu": [
319 | "x64"
320 | ],
321 | "dev": true,
322 | "optional": true,
323 | "os": [
324 | "darwin"
325 | ],
326 | "peer": true,
327 | "engines": {
328 | "node": ">=12"
329 | }
330 | },
331 | "node_modules/@esbuild/freebsd-arm64": {
332 | "version": "0.17.19",
333 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
334 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
335 | "cpu": [
336 | "arm64"
337 | ],
338 | "dev": true,
339 | "optional": true,
340 | "os": [
341 | "freebsd"
342 | ],
343 | "peer": true,
344 | "engines": {
345 | "node": ">=12"
346 | }
347 | },
348 | "node_modules/@esbuild/freebsd-x64": {
349 | "version": "0.17.19",
350 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
351 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
352 | "cpu": [
353 | "x64"
354 | ],
355 | "dev": true,
356 | "optional": true,
357 | "os": [
358 | "freebsd"
359 | ],
360 | "peer": true,
361 | "engines": {
362 | "node": ">=12"
363 | }
364 | },
365 | "node_modules/@esbuild/linux-arm": {
366 | "version": "0.17.19",
367 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
368 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
369 | "cpu": [
370 | "arm"
371 | ],
372 | "dev": true,
373 | "optional": true,
374 | "os": [
375 | "linux"
376 | ],
377 | "peer": true,
378 | "engines": {
379 | "node": ">=12"
380 | }
381 | },
382 | "node_modules/@esbuild/linux-arm64": {
383 | "version": "0.17.19",
384 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
385 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
386 | "cpu": [
387 | "arm64"
388 | ],
389 | "dev": true,
390 | "optional": true,
391 | "os": [
392 | "linux"
393 | ],
394 | "peer": true,
395 | "engines": {
396 | "node": ">=12"
397 | }
398 | },
399 | "node_modules/@esbuild/linux-ia32": {
400 | "version": "0.17.19",
401 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
402 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
403 | "cpu": [
404 | "ia32"
405 | ],
406 | "dev": true,
407 | "optional": true,
408 | "os": [
409 | "linux"
410 | ],
411 | "peer": true,
412 | "engines": {
413 | "node": ">=12"
414 | }
415 | },
416 | "node_modules/@esbuild/linux-loong64": {
417 | "version": "0.17.19",
418 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
419 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
420 | "cpu": [
421 | "loong64"
422 | ],
423 | "dev": true,
424 | "optional": true,
425 | "os": [
426 | "linux"
427 | ],
428 | "peer": true,
429 | "engines": {
430 | "node": ">=12"
431 | }
432 | },
433 | "node_modules/@esbuild/linux-mips64el": {
434 | "version": "0.17.19",
435 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
436 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
437 | "cpu": [
438 | "mips64el"
439 | ],
440 | "dev": true,
441 | "optional": true,
442 | "os": [
443 | "linux"
444 | ],
445 | "peer": true,
446 | "engines": {
447 | "node": ">=12"
448 | }
449 | },
450 | "node_modules/@esbuild/linux-ppc64": {
451 | "version": "0.17.19",
452 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
453 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
454 | "cpu": [
455 | "ppc64"
456 | ],
457 | "dev": true,
458 | "optional": true,
459 | "os": [
460 | "linux"
461 | ],
462 | "peer": true,
463 | "engines": {
464 | "node": ">=12"
465 | }
466 | },
467 | "node_modules/@esbuild/linux-riscv64": {
468 | "version": "0.17.19",
469 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
470 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
471 | "cpu": [
472 | "riscv64"
473 | ],
474 | "dev": true,
475 | "optional": true,
476 | "os": [
477 | "linux"
478 | ],
479 | "peer": true,
480 | "engines": {
481 | "node": ">=12"
482 | }
483 | },
484 | "node_modules/@esbuild/linux-s390x": {
485 | "version": "0.17.19",
486 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
487 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
488 | "cpu": [
489 | "s390x"
490 | ],
491 | "dev": true,
492 | "optional": true,
493 | "os": [
494 | "linux"
495 | ],
496 | "peer": true,
497 | "engines": {
498 | "node": ">=12"
499 | }
500 | },
501 | "node_modules/@esbuild/linux-x64": {
502 | "version": "0.17.19",
503 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
504 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
505 | "cpu": [
506 | "x64"
507 | ],
508 | "dev": true,
509 | "optional": true,
510 | "os": [
511 | "linux"
512 | ],
513 | "peer": true,
514 | "engines": {
515 | "node": ">=12"
516 | }
517 | },
518 | "node_modules/@esbuild/netbsd-x64": {
519 | "version": "0.17.19",
520 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
521 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
522 | "cpu": [
523 | "x64"
524 | ],
525 | "dev": true,
526 | "optional": true,
527 | "os": [
528 | "netbsd"
529 | ],
530 | "peer": true,
531 | "engines": {
532 | "node": ">=12"
533 | }
534 | },
535 | "node_modules/@esbuild/openbsd-x64": {
536 | "version": "0.17.19",
537 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
538 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
539 | "cpu": [
540 | "x64"
541 | ],
542 | "dev": true,
543 | "optional": true,
544 | "os": [
545 | "openbsd"
546 | ],
547 | "peer": true,
548 | "engines": {
549 | "node": ">=12"
550 | }
551 | },
552 | "node_modules/@esbuild/sunos-x64": {
553 | "version": "0.17.19",
554 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
555 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
556 | "cpu": [
557 | "x64"
558 | ],
559 | "dev": true,
560 | "optional": true,
561 | "os": [
562 | "sunos"
563 | ],
564 | "peer": true,
565 | "engines": {
566 | "node": ">=12"
567 | }
568 | },
569 | "node_modules/@esbuild/win32-arm64": {
570 | "version": "0.17.19",
571 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
572 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
573 | "cpu": [
574 | "arm64"
575 | ],
576 | "dev": true,
577 | "optional": true,
578 | "os": [
579 | "win32"
580 | ],
581 | "peer": true,
582 | "engines": {
583 | "node": ">=12"
584 | }
585 | },
586 | "node_modules/@esbuild/win32-ia32": {
587 | "version": "0.17.19",
588 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
589 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
590 | "cpu": [
591 | "ia32"
592 | ],
593 | "dev": true,
594 | "optional": true,
595 | "os": [
596 | "win32"
597 | ],
598 | "peer": true,
599 | "engines": {
600 | "node": ">=12"
601 | }
602 | },
603 | "node_modules/@esbuild/win32-x64": {
604 | "version": "0.17.19",
605 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
606 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
607 | "cpu": [
608 | "x64"
609 | ],
610 | "dev": true,
611 | "optional": true,
612 | "os": [
613 | "win32"
614 | ],
615 | "peer": true,
616 | "engines": {
617 | "node": ">=12"
618 | }
619 | },
620 | "node_modules/@jridgewell/sourcemap-codec": {
621 | "version": "1.4.15",
622 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
623 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
624 | "dev": true
625 | },
626 | "node_modules/@types/web-bluetooth": {
627 | "version": "0.0.17",
628 | "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz",
629 | "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==",
630 | "dev": true
631 | },
632 | "node_modules/@vitejs/plugin-vue": {
633 | "version": "4.2.3",
634 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz",
635 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==",
636 | "dev": true,
637 | "engines": {
638 | "node": "^14.18.0 || >=16.0.0"
639 | },
640 | "peerDependencies": {
641 | "vite": "^4.0.0",
642 | "vue": "^3.2.25"
643 | }
644 | },
645 | "node_modules/@vue/compiler-core": {
646 | "version": "3.3.4",
647 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz",
648 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==",
649 | "dev": true,
650 | "dependencies": {
651 | "@babel/parser": "^7.21.3",
652 | "@vue/shared": "3.3.4",
653 | "estree-walker": "^2.0.2",
654 | "source-map-js": "^1.0.2"
655 | }
656 | },
657 | "node_modules/@vue/compiler-dom": {
658 | "version": "3.3.4",
659 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz",
660 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==",
661 | "dev": true,
662 | "dependencies": {
663 | "@vue/compiler-core": "3.3.4",
664 | "@vue/shared": "3.3.4"
665 | }
666 | },
667 | "node_modules/@vue/compiler-sfc": {
668 | "version": "3.3.4",
669 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz",
670 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==",
671 | "dev": true,
672 | "dependencies": {
673 | "@babel/parser": "^7.20.15",
674 | "@vue/compiler-core": "3.3.4",
675 | "@vue/compiler-dom": "3.3.4",
676 | "@vue/compiler-ssr": "3.3.4",
677 | "@vue/reactivity-transform": "3.3.4",
678 | "@vue/shared": "3.3.4",
679 | "estree-walker": "^2.0.2",
680 | "magic-string": "^0.30.0",
681 | "postcss": "^8.1.10",
682 | "source-map-js": "^1.0.2"
683 | }
684 | },
685 | "node_modules/@vue/compiler-ssr": {
686 | "version": "3.3.4",
687 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz",
688 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==",
689 | "dev": true,
690 | "dependencies": {
691 | "@vue/compiler-dom": "3.3.4",
692 | "@vue/shared": "3.3.4"
693 | }
694 | },
695 | "node_modules/@vue/devtools-api": {
696 | "version": "6.5.0",
697 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
698 | "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==",
699 | "dev": true
700 | },
701 | "node_modules/@vue/reactivity": {
702 | "version": "3.3.4",
703 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz",
704 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==",
705 | "dev": true,
706 | "dependencies": {
707 | "@vue/shared": "3.3.4"
708 | }
709 | },
710 | "node_modules/@vue/reactivity-transform": {
711 | "version": "3.3.4",
712 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz",
713 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==",
714 | "dev": true,
715 | "dependencies": {
716 | "@babel/parser": "^7.20.15",
717 | "@vue/compiler-core": "3.3.4",
718 | "@vue/shared": "3.3.4",
719 | "estree-walker": "^2.0.2",
720 | "magic-string": "^0.30.0"
721 | }
722 | },
723 | "node_modules/@vue/runtime-core": {
724 | "version": "3.3.4",
725 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz",
726 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==",
727 | "dev": true,
728 | "dependencies": {
729 | "@vue/reactivity": "3.3.4",
730 | "@vue/shared": "3.3.4"
731 | }
732 | },
733 | "node_modules/@vue/runtime-dom": {
734 | "version": "3.3.4",
735 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz",
736 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==",
737 | "dev": true,
738 | "dependencies": {
739 | "@vue/runtime-core": "3.3.4",
740 | "@vue/shared": "3.3.4",
741 | "csstype": "^3.1.1"
742 | }
743 | },
744 | "node_modules/@vue/server-renderer": {
745 | "version": "3.3.4",
746 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz",
747 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==",
748 | "dev": true,
749 | "dependencies": {
750 | "@vue/compiler-ssr": "3.3.4",
751 | "@vue/shared": "3.3.4"
752 | },
753 | "peerDependencies": {
754 | "vue": "3.3.4"
755 | }
756 | },
757 | "node_modules/@vue/shared": {
758 | "version": "3.3.4",
759 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz",
760 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==",
761 | "dev": true
762 | },
763 | "node_modules/@vueuse/core": {
764 | "version": "10.2.1",
765 | "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.1.tgz",
766 | "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==",
767 | "dev": true,
768 | "dependencies": {
769 | "@types/web-bluetooth": "^0.0.17",
770 | "@vueuse/metadata": "10.2.1",
771 | "@vueuse/shared": "10.2.1",
772 | "vue-demi": ">=0.14.5"
773 | },
774 | "funding": {
775 | "url": "https://github.com/sponsors/antfu"
776 | }
777 | },
778 | "node_modules/@vueuse/core/node_modules/vue-demi": {
779 | "version": "0.14.5",
780 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz",
781 | "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
782 | "dev": true,
783 | "hasInstallScript": true,
784 | "bin": {
785 | "vue-demi-fix": "bin/vue-demi-fix.js",
786 | "vue-demi-switch": "bin/vue-demi-switch.js"
787 | },
788 | "engines": {
789 | "node": ">=12"
790 | },
791 | "funding": {
792 | "url": "https://github.com/sponsors/antfu"
793 | },
794 | "peerDependencies": {
795 | "@vue/composition-api": "^1.0.0-rc.1",
796 | "vue": "^3.0.0-0 || ^2.6.0"
797 | },
798 | "peerDependenciesMeta": {
799 | "@vue/composition-api": {
800 | "optional": true
801 | }
802 | }
803 | },
804 | "node_modules/@vueuse/integrations": {
805 | "version": "10.2.1",
806 | "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.2.1.tgz",
807 | "integrity": "sha512-FDP5lni+z9FjHE9H3xuvwSjoRV9U8jmDvJpmHPCBjUgPGYRynwb60eHWXCFJXLUtb4gSIHy0e+iaEbrKdalCkQ==",
808 | "dev": true,
809 | "dependencies": {
810 | "@vueuse/core": "10.2.1",
811 | "@vueuse/shared": "10.2.1",
812 | "vue-demi": ">=0.14.5"
813 | },
814 | "funding": {
815 | "url": "https://github.com/sponsors/antfu"
816 | },
817 | "peerDependencies": {
818 | "async-validator": "*",
819 | "axios": "*",
820 | "change-case": "*",
821 | "drauu": "*",
822 | "focus-trap": "*",
823 | "fuse.js": "*",
824 | "idb-keyval": "*",
825 | "jwt-decode": "*",
826 | "nprogress": "*",
827 | "qrcode": "*",
828 | "sortablejs": "*",
829 | "universal-cookie": "*"
830 | },
831 | "peerDependenciesMeta": {
832 | "async-validator": {
833 | "optional": true
834 | },
835 | "axios": {
836 | "optional": true
837 | },
838 | "change-case": {
839 | "optional": true
840 | },
841 | "drauu": {
842 | "optional": true
843 | },
844 | "focus-trap": {
845 | "optional": true
846 | },
847 | "fuse.js": {
848 | "optional": true
849 | },
850 | "idb-keyval": {
851 | "optional": true
852 | },
853 | "jwt-decode": {
854 | "optional": true
855 | },
856 | "nprogress": {
857 | "optional": true
858 | },
859 | "qrcode": {
860 | "optional": true
861 | },
862 | "sortablejs": {
863 | "optional": true
864 | },
865 | "universal-cookie": {
866 | "optional": true
867 | }
868 | }
869 | },
870 | "node_modules/@vueuse/integrations/node_modules/vue-demi": {
871 | "version": "0.14.5",
872 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz",
873 | "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
874 | "dev": true,
875 | "hasInstallScript": true,
876 | "bin": {
877 | "vue-demi-fix": "bin/vue-demi-fix.js",
878 | "vue-demi-switch": "bin/vue-demi-switch.js"
879 | },
880 | "engines": {
881 | "node": ">=12"
882 | },
883 | "funding": {
884 | "url": "https://github.com/sponsors/antfu"
885 | },
886 | "peerDependencies": {
887 | "@vue/composition-api": "^1.0.0-rc.1",
888 | "vue": "^3.0.0-0 || ^2.6.0"
889 | },
890 | "peerDependenciesMeta": {
891 | "@vue/composition-api": {
892 | "optional": true
893 | }
894 | }
895 | },
896 | "node_modules/@vueuse/metadata": {
897 | "version": "10.2.1",
898 | "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.1.tgz",
899 | "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==",
900 | "dev": true,
901 | "funding": {
902 | "url": "https://github.com/sponsors/antfu"
903 | }
904 | },
905 | "node_modules/@vueuse/shared": {
906 | "version": "10.2.1",
907 | "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.1.tgz",
908 | "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==",
909 | "dev": true,
910 | "dependencies": {
911 | "vue-demi": ">=0.14.5"
912 | },
913 | "funding": {
914 | "url": "https://github.com/sponsors/antfu"
915 | }
916 | },
917 | "node_modules/@vueuse/shared/node_modules/vue-demi": {
918 | "version": "0.14.5",
919 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz",
920 | "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==",
921 | "dev": true,
922 | "hasInstallScript": true,
923 | "bin": {
924 | "vue-demi-fix": "bin/vue-demi-fix.js",
925 | "vue-demi-switch": "bin/vue-demi-switch.js"
926 | },
927 | "engines": {
928 | "node": ">=12"
929 | },
930 | "funding": {
931 | "url": "https://github.com/sponsors/antfu"
932 | },
933 | "peerDependencies": {
934 | "@vue/composition-api": "^1.0.0-rc.1",
935 | "vue": "^3.0.0-0 || ^2.6.0"
936 | },
937 | "peerDependenciesMeta": {
938 | "@vue/composition-api": {
939 | "optional": true
940 | }
941 | }
942 | },
943 | "node_modules/algoliasearch": {
944 | "version": "4.18.0",
945 | "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.18.0.tgz",
946 | "integrity": "sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==",
947 | "dev": true,
948 | "dependencies": {
949 | "@algolia/cache-browser-local-storage": "4.18.0",
950 | "@algolia/cache-common": "4.18.0",
951 | "@algolia/cache-in-memory": "4.18.0",
952 | "@algolia/client-account": "4.18.0",
953 | "@algolia/client-analytics": "4.18.0",
954 | "@algolia/client-common": "4.18.0",
955 | "@algolia/client-personalization": "4.18.0",
956 | "@algolia/client-search": "4.18.0",
957 | "@algolia/logger-common": "4.18.0",
958 | "@algolia/logger-console": "4.18.0",
959 | "@algolia/requester-browser-xhr": "4.18.0",
960 | "@algolia/requester-common": "4.18.0",
961 | "@algolia/requester-node-http": "4.18.0",
962 | "@algolia/transporter": "4.18.0"
963 | }
964 | },
965 | "node_modules/ansi-sequence-parser": {
966 | "version": "1.1.0",
967 | "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz",
968 | "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==",
969 | "dev": true
970 | },
971 | "node_modules/body-scroll-lock": {
972 | "version": "4.0.0-beta.0",
973 | "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz",
974 | "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==",
975 | "dev": true
976 | },
977 | "node_modules/csstype": {
978 | "version": "3.1.2",
979 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
980 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
981 | "dev": true
982 | },
983 | "node_modules/esbuild": {
984 | "version": "0.17.19",
985 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
986 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
987 | "dev": true,
988 | "hasInstallScript": true,
989 | "peer": true,
990 | "bin": {
991 | "esbuild": "bin/esbuild"
992 | },
993 | "engines": {
994 | "node": ">=12"
995 | },
996 | "optionalDependencies": {
997 | "@esbuild/android-arm": "0.17.19",
998 | "@esbuild/android-arm64": "0.17.19",
999 | "@esbuild/android-x64": "0.17.19",
1000 | "@esbuild/darwin-arm64": "0.17.19",
1001 | "@esbuild/darwin-x64": "0.17.19",
1002 | "@esbuild/freebsd-arm64": "0.17.19",
1003 | "@esbuild/freebsd-x64": "0.17.19",
1004 | "@esbuild/linux-arm": "0.17.19",
1005 | "@esbuild/linux-arm64": "0.17.19",
1006 | "@esbuild/linux-ia32": "0.17.19",
1007 | "@esbuild/linux-loong64": "0.17.19",
1008 | "@esbuild/linux-mips64el": "0.17.19",
1009 | "@esbuild/linux-ppc64": "0.17.19",
1010 | "@esbuild/linux-riscv64": "0.17.19",
1011 | "@esbuild/linux-s390x": "0.17.19",
1012 | "@esbuild/linux-x64": "0.17.19",
1013 | "@esbuild/netbsd-x64": "0.17.19",
1014 | "@esbuild/openbsd-x64": "0.17.19",
1015 | "@esbuild/sunos-x64": "0.17.19",
1016 | "@esbuild/win32-arm64": "0.17.19",
1017 | "@esbuild/win32-ia32": "0.17.19",
1018 | "@esbuild/win32-x64": "0.17.19"
1019 | }
1020 | },
1021 | "node_modules/estree-walker": {
1022 | "version": "2.0.2",
1023 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1024 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1025 | "dev": true
1026 | },
1027 | "node_modules/focus-trap": {
1028 | "version": "7.5.2",
1029 | "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz",
1030 | "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==",
1031 | "dev": true,
1032 | "dependencies": {
1033 | "tabbable": "^6.2.0"
1034 | }
1035 | },
1036 | "node_modules/fsevents": {
1037 | "version": "2.3.2",
1038 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1039 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1040 | "dev": true,
1041 | "hasInstallScript": true,
1042 | "optional": true,
1043 | "os": [
1044 | "darwin"
1045 | ],
1046 | "engines": {
1047 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1048 | }
1049 | },
1050 | "node_modules/jsonc-parser": {
1051 | "version": "3.2.0",
1052 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
1053 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
1054 | "dev": true
1055 | },
1056 | "node_modules/magic-string": {
1057 | "version": "0.30.1",
1058 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz",
1059 | "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==",
1060 | "dev": true,
1061 | "dependencies": {
1062 | "@jridgewell/sourcemap-codec": "^1.4.15"
1063 | },
1064 | "engines": {
1065 | "node": ">=12"
1066 | }
1067 | },
1068 | "node_modules/mark.js": {
1069 | "version": "8.11.1",
1070 | "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
1071 | "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
1072 | "dev": true
1073 | },
1074 | "node_modules/minisearch": {
1075 | "version": "6.1.0",
1076 | "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz",
1077 | "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==",
1078 | "dev": true
1079 | },
1080 | "node_modules/nanoid": {
1081 | "version": "3.3.6",
1082 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
1083 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
1084 | "dev": true,
1085 | "funding": [
1086 | {
1087 | "type": "github",
1088 | "url": "https://github.com/sponsors/ai"
1089 | }
1090 | ],
1091 | "bin": {
1092 | "nanoid": "bin/nanoid.cjs"
1093 | },
1094 | "engines": {
1095 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1096 | }
1097 | },
1098 | "node_modules/picocolors": {
1099 | "version": "1.0.0",
1100 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1101 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
1102 | "dev": true
1103 | },
1104 | "node_modules/postcss": {
1105 | "version": "8.4.24",
1106 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz",
1107 | "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
1108 | "dev": true,
1109 | "funding": [
1110 | {
1111 | "type": "opencollective",
1112 | "url": "https://opencollective.com/postcss/"
1113 | },
1114 | {
1115 | "type": "tidelift",
1116 | "url": "https://tidelift.com/funding/github/npm/postcss"
1117 | },
1118 | {
1119 | "type": "github",
1120 | "url": "https://github.com/sponsors/ai"
1121 | }
1122 | ],
1123 | "dependencies": {
1124 | "nanoid": "^3.3.6",
1125 | "picocolors": "^1.0.0",
1126 | "source-map-js": "^1.0.2"
1127 | },
1128 | "engines": {
1129 | "node": "^10 || ^12 || >=14"
1130 | }
1131 | },
1132 | "node_modules/preact": {
1133 | "version": "10.15.1",
1134 | "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz",
1135 | "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==",
1136 | "dev": true,
1137 | "funding": {
1138 | "type": "opencollective",
1139 | "url": "https://opencollective.com/preact"
1140 | }
1141 | },
1142 | "node_modules/rollup": {
1143 | "version": "3.26.1",
1144 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.1.tgz",
1145 | "integrity": "sha512-I5gJCSpSMr3U9wv4D5YA8g7w7cj3eaSDeo7t+JcaFQOmoOUBgu4K9iMp8k3EZnwbJrjQxUMSKxMyB8qEQzzaSg==",
1146 | "dev": true,
1147 | "bin": {
1148 | "rollup": "dist/bin/rollup"
1149 | },
1150 | "engines": {
1151 | "node": ">=14.18.0",
1152 | "npm": ">=8.0.0"
1153 | },
1154 | "optionalDependencies": {
1155 | "fsevents": "~2.3.2"
1156 | }
1157 | },
1158 | "node_modules/search-insights": {
1159 | "version": "2.6.0",
1160 | "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.6.0.tgz",
1161 | "integrity": "sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==",
1162 | "dev": true,
1163 | "peer": true,
1164 | "engines": {
1165 | "node": ">=8.16.0"
1166 | }
1167 | },
1168 | "node_modules/shiki": {
1169 | "version": "0.14.3",
1170 | "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz",
1171 | "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==",
1172 | "dev": true,
1173 | "dependencies": {
1174 | "ansi-sequence-parser": "^1.1.0",
1175 | "jsonc-parser": "^3.2.0",
1176 | "vscode-oniguruma": "^1.7.0",
1177 | "vscode-textmate": "^8.0.0"
1178 | }
1179 | },
1180 | "node_modules/source-map-js": {
1181 | "version": "1.0.2",
1182 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1183 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1184 | "dev": true,
1185 | "engines": {
1186 | "node": ">=0.10.0"
1187 | }
1188 | },
1189 | "node_modules/tabbable": {
1190 | "version": "6.2.0",
1191 | "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
1192 | "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
1193 | "dev": true
1194 | },
1195 | "node_modules/vite": {
1196 | "version": "4.3.9",
1197 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz",
1198 | "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==",
1199 | "dev": true,
1200 | "peer": true,
1201 | "dependencies": {
1202 | "esbuild": "^0.17.5",
1203 | "postcss": "^8.4.23",
1204 | "rollup": "^3.21.0"
1205 | },
1206 | "bin": {
1207 | "vite": "bin/vite.js"
1208 | },
1209 | "engines": {
1210 | "node": "^14.18.0 || >=16.0.0"
1211 | },
1212 | "optionalDependencies": {
1213 | "fsevents": "~2.3.2"
1214 | },
1215 | "peerDependencies": {
1216 | "@types/node": ">= 14",
1217 | "less": "*",
1218 | "sass": "*",
1219 | "stylus": "*",
1220 | "sugarss": "*",
1221 | "terser": "^5.4.0"
1222 | },
1223 | "peerDependenciesMeta": {
1224 | "@types/node": {
1225 | "optional": true
1226 | },
1227 | "less": {
1228 | "optional": true
1229 | },
1230 | "sass": {
1231 | "optional": true
1232 | },
1233 | "stylus": {
1234 | "optional": true
1235 | },
1236 | "sugarss": {
1237 | "optional": true
1238 | },
1239 | "terser": {
1240 | "optional": true
1241 | }
1242 | }
1243 | },
1244 | "node_modules/vitepress": {
1245 | "version": "1.0.0-beta.5",
1246 | "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-beta.5.tgz",
1247 | "integrity": "sha512-/RjqqRsSEKkzF6HhK5e5Ij+bZ7ETb9jNCRRgIMm10gJ+ZLC3D1OqkE465lEqCeJUgt2HZ6jmWjDqIBfrJSpv7w==",
1248 | "dev": true,
1249 | "dependencies": {
1250 | "@docsearch/css": "^3.5.1",
1251 | "@docsearch/js": "^3.5.1",
1252 | "@vitejs/plugin-vue": "^4.2.3",
1253 | "@vue/devtools-api": "^6.5.0",
1254 | "@vueuse/core": "^10.2.1",
1255 | "@vueuse/integrations": "^10.2.1",
1256 | "body-scroll-lock": "4.0.0-beta.0",
1257 | "focus-trap": "^7.4.3",
1258 | "mark.js": "8.11.1",
1259 | "minisearch": "^6.1.0",
1260 | "shiki": "^0.14.3",
1261 | "vite": "4.4.0-beta.3",
1262 | "vue": "^3.3.4"
1263 | },
1264 | "bin": {
1265 | "vitepress": "bin/vitepress.js"
1266 | }
1267 | },
1268 | "node_modules/vitepress/node_modules/@esbuild/android-arm": {
1269 | "version": "0.18.11",
1270 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz",
1271 | "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==",
1272 | "cpu": [
1273 | "arm"
1274 | ],
1275 | "dev": true,
1276 | "optional": true,
1277 | "os": [
1278 | "android"
1279 | ],
1280 | "engines": {
1281 | "node": ">=12"
1282 | }
1283 | },
1284 | "node_modules/vitepress/node_modules/@esbuild/android-arm64": {
1285 | "version": "0.18.11",
1286 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz",
1287 | "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==",
1288 | "cpu": [
1289 | "arm64"
1290 | ],
1291 | "dev": true,
1292 | "optional": true,
1293 | "os": [
1294 | "android"
1295 | ],
1296 | "engines": {
1297 | "node": ">=12"
1298 | }
1299 | },
1300 | "node_modules/vitepress/node_modules/@esbuild/android-x64": {
1301 | "version": "0.18.11",
1302 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz",
1303 | "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==",
1304 | "cpu": [
1305 | "x64"
1306 | ],
1307 | "dev": true,
1308 | "optional": true,
1309 | "os": [
1310 | "android"
1311 | ],
1312 | "engines": {
1313 | "node": ">=12"
1314 | }
1315 | },
1316 | "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": {
1317 | "version": "0.18.11",
1318 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz",
1319 | "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==",
1320 | "cpu": [
1321 | "arm64"
1322 | ],
1323 | "dev": true,
1324 | "optional": true,
1325 | "os": [
1326 | "darwin"
1327 | ],
1328 | "engines": {
1329 | "node": ">=12"
1330 | }
1331 | },
1332 | "node_modules/vitepress/node_modules/@esbuild/darwin-x64": {
1333 | "version": "0.18.11",
1334 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz",
1335 | "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==",
1336 | "cpu": [
1337 | "x64"
1338 | ],
1339 | "dev": true,
1340 | "optional": true,
1341 | "os": [
1342 | "darwin"
1343 | ],
1344 | "engines": {
1345 | "node": ">=12"
1346 | }
1347 | },
1348 | "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": {
1349 | "version": "0.18.11",
1350 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz",
1351 | "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==",
1352 | "cpu": [
1353 | "arm64"
1354 | ],
1355 | "dev": true,
1356 | "optional": true,
1357 | "os": [
1358 | "freebsd"
1359 | ],
1360 | "engines": {
1361 | "node": ">=12"
1362 | }
1363 | },
1364 | "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": {
1365 | "version": "0.18.11",
1366 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz",
1367 | "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==",
1368 | "cpu": [
1369 | "x64"
1370 | ],
1371 | "dev": true,
1372 | "optional": true,
1373 | "os": [
1374 | "freebsd"
1375 | ],
1376 | "engines": {
1377 | "node": ">=12"
1378 | }
1379 | },
1380 | "node_modules/vitepress/node_modules/@esbuild/linux-arm": {
1381 | "version": "0.18.11",
1382 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz",
1383 | "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==",
1384 | "cpu": [
1385 | "arm"
1386 | ],
1387 | "dev": true,
1388 | "optional": true,
1389 | "os": [
1390 | "linux"
1391 | ],
1392 | "engines": {
1393 | "node": ">=12"
1394 | }
1395 | },
1396 | "node_modules/vitepress/node_modules/@esbuild/linux-arm64": {
1397 | "version": "0.18.11",
1398 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz",
1399 | "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==",
1400 | "cpu": [
1401 | "arm64"
1402 | ],
1403 | "dev": true,
1404 | "optional": true,
1405 | "os": [
1406 | "linux"
1407 | ],
1408 | "engines": {
1409 | "node": ">=12"
1410 | }
1411 | },
1412 | "node_modules/vitepress/node_modules/@esbuild/linux-ia32": {
1413 | "version": "0.18.11",
1414 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz",
1415 | "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==",
1416 | "cpu": [
1417 | "ia32"
1418 | ],
1419 | "dev": true,
1420 | "optional": true,
1421 | "os": [
1422 | "linux"
1423 | ],
1424 | "engines": {
1425 | "node": ">=12"
1426 | }
1427 | },
1428 | "node_modules/vitepress/node_modules/@esbuild/linux-loong64": {
1429 | "version": "0.18.11",
1430 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz",
1431 | "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==",
1432 | "cpu": [
1433 | "loong64"
1434 | ],
1435 | "dev": true,
1436 | "optional": true,
1437 | "os": [
1438 | "linux"
1439 | ],
1440 | "engines": {
1441 | "node": ">=12"
1442 | }
1443 | },
1444 | "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": {
1445 | "version": "0.18.11",
1446 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz",
1447 | "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==",
1448 | "cpu": [
1449 | "mips64el"
1450 | ],
1451 | "dev": true,
1452 | "optional": true,
1453 | "os": [
1454 | "linux"
1455 | ],
1456 | "engines": {
1457 | "node": ">=12"
1458 | }
1459 | },
1460 | "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": {
1461 | "version": "0.18.11",
1462 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz",
1463 | "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==",
1464 | "cpu": [
1465 | "ppc64"
1466 | ],
1467 | "dev": true,
1468 | "optional": true,
1469 | "os": [
1470 | "linux"
1471 | ],
1472 | "engines": {
1473 | "node": ">=12"
1474 | }
1475 | },
1476 | "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": {
1477 | "version": "0.18.11",
1478 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz",
1479 | "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==",
1480 | "cpu": [
1481 | "riscv64"
1482 | ],
1483 | "dev": true,
1484 | "optional": true,
1485 | "os": [
1486 | "linux"
1487 | ],
1488 | "engines": {
1489 | "node": ">=12"
1490 | }
1491 | },
1492 | "node_modules/vitepress/node_modules/@esbuild/linux-s390x": {
1493 | "version": "0.18.11",
1494 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz",
1495 | "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==",
1496 | "cpu": [
1497 | "s390x"
1498 | ],
1499 | "dev": true,
1500 | "optional": true,
1501 | "os": [
1502 | "linux"
1503 | ],
1504 | "engines": {
1505 | "node": ">=12"
1506 | }
1507 | },
1508 | "node_modules/vitepress/node_modules/@esbuild/linux-x64": {
1509 | "version": "0.18.11",
1510 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz",
1511 | "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==",
1512 | "cpu": [
1513 | "x64"
1514 | ],
1515 | "dev": true,
1516 | "optional": true,
1517 | "os": [
1518 | "linux"
1519 | ],
1520 | "engines": {
1521 | "node": ">=12"
1522 | }
1523 | },
1524 | "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": {
1525 | "version": "0.18.11",
1526 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz",
1527 | "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==",
1528 | "cpu": [
1529 | "x64"
1530 | ],
1531 | "dev": true,
1532 | "optional": true,
1533 | "os": [
1534 | "netbsd"
1535 | ],
1536 | "engines": {
1537 | "node": ">=12"
1538 | }
1539 | },
1540 | "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": {
1541 | "version": "0.18.11",
1542 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz",
1543 | "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==",
1544 | "cpu": [
1545 | "x64"
1546 | ],
1547 | "dev": true,
1548 | "optional": true,
1549 | "os": [
1550 | "openbsd"
1551 | ],
1552 | "engines": {
1553 | "node": ">=12"
1554 | }
1555 | },
1556 | "node_modules/vitepress/node_modules/@esbuild/sunos-x64": {
1557 | "version": "0.18.11",
1558 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz",
1559 | "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==",
1560 | "cpu": [
1561 | "x64"
1562 | ],
1563 | "dev": true,
1564 | "optional": true,
1565 | "os": [
1566 | "sunos"
1567 | ],
1568 | "engines": {
1569 | "node": ">=12"
1570 | }
1571 | },
1572 | "node_modules/vitepress/node_modules/@esbuild/win32-arm64": {
1573 | "version": "0.18.11",
1574 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz",
1575 | "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==",
1576 | "cpu": [
1577 | "arm64"
1578 | ],
1579 | "dev": true,
1580 | "optional": true,
1581 | "os": [
1582 | "win32"
1583 | ],
1584 | "engines": {
1585 | "node": ">=12"
1586 | }
1587 | },
1588 | "node_modules/vitepress/node_modules/@esbuild/win32-ia32": {
1589 | "version": "0.18.11",
1590 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz",
1591 | "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==",
1592 | "cpu": [
1593 | "ia32"
1594 | ],
1595 | "dev": true,
1596 | "optional": true,
1597 | "os": [
1598 | "win32"
1599 | ],
1600 | "engines": {
1601 | "node": ">=12"
1602 | }
1603 | },
1604 | "node_modules/vitepress/node_modules/@esbuild/win32-x64": {
1605 | "version": "0.18.11",
1606 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz",
1607 | "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==",
1608 | "cpu": [
1609 | "x64"
1610 | ],
1611 | "dev": true,
1612 | "optional": true,
1613 | "os": [
1614 | "win32"
1615 | ],
1616 | "engines": {
1617 | "node": ">=12"
1618 | }
1619 | },
1620 | "node_modules/vitepress/node_modules/esbuild": {
1621 | "version": "0.18.11",
1622 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz",
1623 | "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==",
1624 | "dev": true,
1625 | "hasInstallScript": true,
1626 | "bin": {
1627 | "esbuild": "bin/esbuild"
1628 | },
1629 | "engines": {
1630 | "node": ">=12"
1631 | },
1632 | "optionalDependencies": {
1633 | "@esbuild/android-arm": "0.18.11",
1634 | "@esbuild/android-arm64": "0.18.11",
1635 | "@esbuild/android-x64": "0.18.11",
1636 | "@esbuild/darwin-arm64": "0.18.11",
1637 | "@esbuild/darwin-x64": "0.18.11",
1638 | "@esbuild/freebsd-arm64": "0.18.11",
1639 | "@esbuild/freebsd-x64": "0.18.11",
1640 | "@esbuild/linux-arm": "0.18.11",
1641 | "@esbuild/linux-arm64": "0.18.11",
1642 | "@esbuild/linux-ia32": "0.18.11",
1643 | "@esbuild/linux-loong64": "0.18.11",
1644 | "@esbuild/linux-mips64el": "0.18.11",
1645 | "@esbuild/linux-ppc64": "0.18.11",
1646 | "@esbuild/linux-riscv64": "0.18.11",
1647 | "@esbuild/linux-s390x": "0.18.11",
1648 | "@esbuild/linux-x64": "0.18.11",
1649 | "@esbuild/netbsd-x64": "0.18.11",
1650 | "@esbuild/openbsd-x64": "0.18.11",
1651 | "@esbuild/sunos-x64": "0.18.11",
1652 | "@esbuild/win32-arm64": "0.18.11",
1653 | "@esbuild/win32-ia32": "0.18.11",
1654 | "@esbuild/win32-x64": "0.18.11"
1655 | }
1656 | },
1657 | "node_modules/vitepress/node_modules/vite": {
1658 | "version": "4.4.0-beta.3",
1659 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.0-beta.3.tgz",
1660 | "integrity": "sha512-IC/thYTvArOFRJ4qvvudnu4KKZOVc+gduS3I9OfC5SbP/Rf4kkP7z6Of2QpKeOSVqwIK24khW6VOUmVD/0yzSQ==",
1661 | "dev": true,
1662 | "dependencies": {
1663 | "esbuild": "^0.18.6",
1664 | "postcss": "^8.4.24",
1665 | "rollup": "^3.25.2"
1666 | },
1667 | "bin": {
1668 | "vite": "bin/vite.js"
1669 | },
1670 | "engines": {
1671 | "node": "^14.18.0 || >=16.0.0"
1672 | },
1673 | "funding": {
1674 | "url": "https://github.com/vitejs/vite?sponsor=1"
1675 | },
1676 | "optionalDependencies": {
1677 | "fsevents": "~2.3.2"
1678 | },
1679 | "peerDependencies": {
1680 | "@types/node": ">= 14",
1681 | "less": "*",
1682 | "lightningcss": "^1.21.0",
1683 | "sass": "*",
1684 | "stylus": "*",
1685 | "sugarss": "*",
1686 | "terser": "^5.4.0"
1687 | },
1688 | "peerDependenciesMeta": {
1689 | "@types/node": {
1690 | "optional": true
1691 | },
1692 | "less": {
1693 | "optional": true
1694 | },
1695 | "lightningcss": {
1696 | "optional": true
1697 | },
1698 | "sass": {
1699 | "optional": true
1700 | },
1701 | "stylus": {
1702 | "optional": true
1703 | },
1704 | "sugarss": {
1705 | "optional": true
1706 | },
1707 | "terser": {
1708 | "optional": true
1709 | }
1710 | }
1711 | },
1712 | "node_modules/vscode-oniguruma": {
1713 | "version": "1.7.0",
1714 | "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
1715 | "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
1716 | "dev": true
1717 | },
1718 | "node_modules/vscode-textmate": {
1719 | "version": "8.0.0",
1720 | "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
1721 | "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
1722 | "dev": true
1723 | },
1724 | "node_modules/vue": {
1725 | "version": "3.3.4",
1726 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz",
1727 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==",
1728 | "dev": true,
1729 | "dependencies": {
1730 | "@vue/compiler-dom": "3.3.4",
1731 | "@vue/compiler-sfc": "3.3.4",
1732 | "@vue/runtime-dom": "3.3.4",
1733 | "@vue/server-renderer": "3.3.4",
1734 | "@vue/shared": "3.3.4"
1735 | }
1736 | }
1737 | }
1738 | }
1739 |
--------------------------------------------------------------------------------