commit 004d027777a1e5092db6ab299ea367e73b647bce Author: ppst Date: Wed Jun 7 10:12:18 2023 +0800 feat: 自定义vitepress主题 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..beffa30 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..beb4693 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/coverage +/node_modules +dist +TODOs.md +.DS_Store +demo/.vitepress/cache +demo/node_modules + +demo/doc/.vitepress/cache +demo/doc/node_modules \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..38d9aa9 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +semi: false +singleQuote: true +printWidth: 80 +trailingComma: none diff --git a/README.md b/README.md new file mode 100644 index 0000000..5b8abfb --- /dev/null +++ b/README.md @@ -0,0 +1,206 @@ +# vitepress 自定义主题 +可以直接克隆,也可以使用下面方法一步步自定义实现 + +克隆地址 + ```shell + git clone http://git.ppst.top/pp/custom-vitepress-theme-demo.git + ``` +## 安装 vitepress +```shell +pnpm install vitepress +``` +## 安装主题 + +```shell +pnpm install custom-vitepress-theme +``` +## 安装读取文档插件 +```shell +pnpm install markdown-from-posts +``` + +## 目录结构 + +```md +.vitepress + theme + index.ts + override.css + config.ts +pages + default.md +posts + 文件夹/.md文件 + .md文件 +public + favicon.ico +index.md +``` + +### .vitepress文件夹 + +config.ts - 配置自定义vitepress导航以及标题等 + +theme/override.css 重置样式 + +theme/index.ts +#### .vitepress/config.ts + +```js +const { getPosts } = require('markdown-from-posts') +async function config() { + return { + extends: { + markdown: { + headers: { + level: [2, 3] + } + }, + }, + themeConfig: { + posts: await getPosts(), + title: 'BBBB', + description: '自定义主题BBBB', + docRoot: '', + hasDarkSwitch: true, + homeConfig: { + headline: 'BBBB大标题',//大标题 + headlineHeight: 'BBBB高亮',//大标题高亮 + subheading: 'BBBB小标题',//小标题 + subheadingHeight: '小标题高亮',//小标题高亮 + description: '自定义主题,简短banner描述',//描述 + }, + + nav: [ + { text: '首页', link: '/', icon: '' }, + { text: '归档', link: '/pages/archives', icon: '' }, + { text: '默认', link: '/pages/default', icon: '' }, + { text: '分类', link: '/pages/category', icon: '' }, + { text: '搜索', link: '/pages/search', icon: '' }, + ], + footer: { + copyright: '湘ICP备aaaaaaaa-1' + } + } + } +} +module.exports = config() + +``` + +#### .vitepress/theme/override.css 样式 + +```css +:root { + --c-main-color:#80adff;/* 主色调 */ +} + +``` + +#### .vitepress/theme/index.ts 【vitepress 引入主题】 + +```js +import { CustomTheme } from 'custom-vitepress-theme' + +import './override.css' + +export default { + ...CustomTheme, +} + +``` +### pages文件夹 + +配置二级目录页面(可自定义布局页面), + +默认有 +- category.md【分类页面】 +- default.md 【默认页面】 +- default.md 【搜索页面】 +- archives.md 【归档页面】 + +如果需要自定义布局请定义组件并在.vitepress/theme/index.ts引用 + +在pages下页面中使用组件即可 + + +### posts 文件夹 【所有文档】 + +文档顶部: +```md +--- +title: default +date: 2018-09-14 13:57:02 +category: default +tags: + - default +--- +``` + +- title 为文档标题 + + +- date 创建时间 + + +- category 分类 + + + +- tags 标签 + + +#### public文件夹 + +- favicon.ico 网站图标 + + +- img文件 公共图片文件夹 + + +#### index.html文件 + +首页配置 + +```html +--- +page: true +date: 2021-06-30 +title: 自定义标题 +sidebar: false +--- + + + + + + + + + +``` +## package.json + +```json +{ + "name": "demo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "vitepress dev --host 0.0.0.0", + "build": "vitepress build " + }, + "dependencies": { + "@types/node": "^18.15.11", + "markdown-from-posts": "^1.0.5", + "vitepress": "1.0.0-alpha.64", + "custom-vitepress-theme": "^0.0.2" + } +} +``` \ No newline at end of file diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 0000000..8a39e24 --- /dev/null +++ b/demo/.gitignore @@ -0,0 +1,6 @@ +/coverage +/node_modules +dist +TODOs.md +.DS_Store +demo/.vitepress/cache diff --git a/demo/.vitepress/config.ts b/demo/.vitepress/config.ts new file mode 100644 index 0000000..1b2d9c5 --- /dev/null +++ b/demo/.vitepress/config.ts @@ -0,0 +1,38 @@ +const { getPosts } = require('markdown-from-posts') +async function config() { + return { + extends: { + markdown: { + headers: { + level: [2, 3] + } + }, + }, + themeConfig: { + posts: await getPosts(), + title: 'BBBB', + description: '自定义主题BBBB', + docRoot: '', + hasDarkSwitch: true, + homeConfig: { + headline: 'BBBB大标题',//大标题 + headlineHeight: 'BBBB高亮',//大标题高亮 + subheading: 'BBBB小标题',//小标题 + subheadingHeight: '小标题高亮',//小标题高亮 + description: '自定义主题,简短banner描述',//描述 + }, + + nav: [ + { text: '首页', link: '/', icon: '' }, + { text: '归档', link: '/pages/archives', icon: '' }, + { text: '默认', link: '/pages/default', icon: '' }, + { text: '分类', link: '/pages/category', icon: '' }, + { text: '搜索', link: '/pages/search', icon: '' }, + ], + footer: { + copyright: '湘ICP备aaaaaaaa-1' + } + } + } +} +module.exports = config() diff --git a/demo/.vitepress/theme/index.ts b/demo/.vitepress/theme/index.ts new file mode 100644 index 0000000..3be2fa4 --- /dev/null +++ b/demo/.vitepress/theme/index.ts @@ -0,0 +1,12 @@ +import { CustomTheme } from 'custom-vitepress-theme' +// import { h } from 'vue' + +import './override.css' + +export default { + ...CustomTheme, + // Layout() { + // return h(CustomTheme.Layout, null, { + // }) + // } +} diff --git a/demo/.vitepress/theme/override.css b/demo/.vitepress/theme/override.css new file mode 100644 index 0000000..d14bdfe --- /dev/null +++ b/demo/.vitepress/theme/override.css @@ -0,0 +1,97 @@ +:root { + --c-main-color:#80adff; +} + + +/* card */ + +.news-box { + display: flex; + align-items: center; + width: 100%; + margin: 0 auto; + padding: 20px 0; +} +.news-box .card-item { + flex-basis: 25%; + padding: 15px; + transition: all 0.3s ease; +} +.news-box .card-item .item-box { + display: flex; + flex-direction: column; + align-items: center; + border-radius: 15px; + padding: 15px; + margin-bottom: 140px; + background: #f8f8fc; + transition: all 0.3s ease; +} +.news-box .card-item .item-box .icon { + font-size: 48px; + color: var(--c-main-color); +} +.news-box .card-item .item-box .title { + font-size: 18px; + line-height: 2; + font-weight: 500; + color: #020312; +} +.news-box .card-item .item-box .desc { + font-size: 16px; + line-height: 2; + color: #717e96; + overflow: hidden; +} +.news-box .card-item .item-box .desc { + font-size: 16px; + line-height: 2; + color: #717e96; +} +.news-box .card-item:hover .item-box { + background: var(--c-main-color); + transition: all 0.3s ease; +} +.news-box .card-item .item-box.active { + background: var(--c-main-color); + margin-bottom: 0; +} + +.news-box .card-item:hover .item-box .icon, +.news-box .card-item:hover .item-box .title, +.news-box .card-item:hover .item-box .desc, +.news-box .card-item .item-box.active .icon, +.news-box .card-item .item-box.active .title, +.news-box .card-item .item-box.active .desc { + color: #fff; +} +@media (max-width: 1200px) { + .banner .banner-left { + font-size: 14px; + } + .banner .banner-left .desc { + font-size: 12px; + } + .note-box { + flex-wrap: wrap; + } + .note-box .note-item { + flex-basis: 100%; + } + .news-box { + flex-wrap: wrap; + } + .news-box .card-item { + flex-basis: 100%; + } + .news-box .card-item .item-box { + margin-bottom: 0; + } + + .news-box .card-item .item-box .title { + font-size: 14px; + } + .news-box .card-item .item-box .desc { + font-size: 12px; + } +} \ No newline at end of file diff --git a/demo/index.md b/demo/index.md new file mode 100644 index 0000000..86129f6 --- /dev/null +++ b/demo/index.md @@ -0,0 +1,95 @@ +--- +page: true +date: 2021-06-30 +title: 自定义标题 +sidebar: false +--- + + + + + + + +
+
手册
+
基础知识手册(学习基础笔记)
+
+
+
+
+
💡CSS手册
+ +
+
+
+
+
💡JS手册
+ +
+
+
+
+
💡博客
+ +
+
+
+ +
+
随笔
+
最常用随笔分类
+
+ +
+
+
+
?
+
JS笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
+
?
+
vue笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
+
?
+
服务器笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
+
?
+
浏览器笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
\ No newline at end of file diff --git a/demo/package.json b/demo/package.json new file mode 100644 index 0000000..0a54ee5 --- /dev/null +++ b/demo/package.json @@ -0,0 +1,19 @@ +{ + "name": "demo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "vitepress dev --host 0.0.0.0", + "build": "vitepress build " + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@types/node": "^18.15.11", + "markdown-from-posts": "^1.0.5", + "vitepress": "1.0.0-alpha.64", + "custom-vitepress-theme": "^0.0.2" + } +} diff --git a/demo/pages/archives.md b/demo/pages/archives.md new file mode 100644 index 0000000..8a7f5c1 --- /dev/null +++ b/demo/pages/archives.md @@ -0,0 +1,13 @@ +--- +page: true +title: Archive +description: Archive +sidebar: false +--- + + + + + \ No newline at end of file diff --git a/demo/pages/category.md b/demo/pages/category.md new file mode 100644 index 0000000..4ae9287 --- /dev/null +++ b/demo/pages/category.md @@ -0,0 +1,13 @@ +--- +page: true +title: 分类 +description: 分类 +sidebar: false +--- + + + + + diff --git a/demo/pages/default.md b/demo/pages/default.md new file mode 100644 index 0000000..7d1e9ec --- /dev/null +++ b/demo/pages/default.md @@ -0,0 +1,13 @@ +--- +page: true +title: 默认 +description: 默认 +sidebar: false +--- + + + + + diff --git a/demo/pages/search.md b/demo/pages/search.md new file mode 100644 index 0000000..6720a0e --- /dev/null +++ b/demo/pages/search.md @@ -0,0 +1,11 @@ +--- +page: true +title: 搜索 +description: 全文检索 +sidebar: false +--- + + + diff --git a/demo/pnpm-lock.yaml b/demo/pnpm-lock.yaml new file mode 100644 index 0000000..81fdf2a --- /dev/null +++ b/demo/pnpm-lock.yaml @@ -0,0 +1,1058 @@ +lockfileVersion: 5.4 + +specifiers: + '@types/node': ^18.15.11 + markdown-from-posts: ^1.0.5 + custom-vitepress-theme: ^0.0.2 + vitepress: 1.0.0-alpha.64 + +dependencies: + '@types/node': 18.15.11 + markdown-from-posts: 1.0.5 + custom-vitepress-theme: 0.0.2_vitepress@1.0.0-alpha.64 + vitepress: 1.0.0-alpha.64_@types+node@18.15.11 + +packages: + + /@algolia/autocomplete-core/1.7.4: + resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} + dependencies: + '@algolia/autocomplete-shared': 1.7.4 + dev: false + + /@algolia/autocomplete-preset-algolia/1.7.4_algoliasearch@4.17.0: + resolution: {integrity: sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.7.4 + algoliasearch: 4.17.0 + dev: false + + /@algolia/autocomplete-shared/1.7.4: + resolution: {integrity: sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==} + dev: false + + /@algolia/cache-browser-local-storage/4.17.0: + resolution: {integrity: sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==} + dependencies: + '@algolia/cache-common': 4.17.0 + dev: false + + /@algolia/cache-common/4.17.0: + resolution: {integrity: sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==} + dev: false + + /@algolia/cache-in-memory/4.17.0: + resolution: {integrity: sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==} + dependencies: + '@algolia/cache-common': 4.17.0 + dev: false + + /@algolia/client-account/4.17.0: + resolution: {integrity: sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==} + dependencies: + '@algolia/client-common': 4.17.0 + '@algolia/client-search': 4.17.0 + '@algolia/transporter': 4.17.0 + dev: false + + /@algolia/client-analytics/4.17.0: + resolution: {integrity: sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==} + dependencies: + '@algolia/client-common': 4.17.0 + '@algolia/client-search': 4.17.0 + '@algolia/requester-common': 4.17.0 + '@algolia/transporter': 4.17.0 + dev: false + + /@algolia/client-common/4.17.0: + resolution: {integrity: sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==} + dependencies: + '@algolia/requester-common': 4.17.0 + '@algolia/transporter': 4.17.0 + dev: false + + /@algolia/client-personalization/4.17.0: + resolution: {integrity: sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==} + dependencies: + '@algolia/client-common': 4.17.0 + '@algolia/requester-common': 4.17.0 + '@algolia/transporter': 4.17.0 + dev: false + + /@algolia/client-search/4.17.0: + resolution: {integrity: sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==} + dependencies: + '@algolia/client-common': 4.17.0 + '@algolia/requester-common': 4.17.0 + '@algolia/transporter': 4.17.0 + dev: false + + /@algolia/logger-common/4.17.0: + resolution: {integrity: sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==} + dev: false + + /@algolia/logger-console/4.17.0: + resolution: {integrity: sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==} + dependencies: + '@algolia/logger-common': 4.17.0 + dev: false + + /@algolia/requester-browser-xhr/4.17.0: + resolution: {integrity: sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==} + dependencies: + '@algolia/requester-common': 4.17.0 + dev: false + + /@algolia/requester-common/4.17.0: + resolution: {integrity: sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==} + dev: false + + /@algolia/requester-node-http/4.17.0: + resolution: {integrity: sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==} + dependencies: + '@algolia/requester-common': 4.17.0 + dev: false + + /@algolia/transporter/4.17.0: + resolution: {integrity: sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==} + dependencies: + '@algolia/cache-common': 4.17.0 + '@algolia/logger-common': 4.17.0 + '@algolia/requester-common': 4.17.0 + dev: false + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/parser/7.21.4: + resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/types/7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: false + + /@docsearch/css/3.3.3: + resolution: {integrity: sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==} + dev: false + + /@docsearch/js/3.3.3: + resolution: {integrity: sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==} + dependencies: + '@docsearch/react': 3.3.3 + preact: 10.13.2 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + dev: false + + /@docsearch/react/3.3.3: + resolution: {integrity: sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.7.4 + '@algolia/autocomplete-preset-algolia': 1.7.4_algoliasearch@4.17.0 + '@docsearch/css': 3.3.3 + algoliasearch: 4.17.0 + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@esbuild/android-arm/0.17.15: + resolution: {integrity: sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64/0.17.15: + resolution: {integrity: sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64/0.17.15: + resolution: {integrity: sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64/0.17.15: + resolution: {integrity: sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64/0.17.15: + resolution: {integrity: sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64/0.17.15: + resolution: {integrity: sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64/0.17.15: + resolution: {integrity: sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm/0.17.15: + resolution: {integrity: sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64/0.17.15: + resolution: {integrity: sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32/0.17.15: + resolution: {integrity: sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64/0.17.15: + resolution: {integrity: sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el/0.17.15: + resolution: {integrity: sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64/0.17.15: + resolution: {integrity: sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64/0.17.15: + resolution: {integrity: sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x/0.17.15: + resolution: {integrity: sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64/0.17.15: + resolution: {integrity: sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64/0.17.15: + resolution: {integrity: sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64/0.17.15: + resolution: {integrity: sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64/0.17.15: + resolution: {integrity: sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64/0.17.15: + resolution: {integrity: sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32/0.17.15: + resolution: {integrity: sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64/0.17.15: + resolution: {integrity: sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@types/node/18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: false + + /@types/web-bluetooth/0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + dev: false + + /@vitejs/plugin-vue/4.1.0_vite@4.2.1+vue@3.2.47: + resolution: {integrity: sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.2.1_@types+node@18.15.11 + vue: 3.2.47 + dev: false + + /@vue/compiler-core/3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: false + + /@vue/compiler-dom/3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/compiler-sfc/3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.21 + source-map: 0.6.1 + dev: false + + /@vue/compiler-ssr/3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/devtools-api/6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + dev: false + + /@vue/reactivity-transform/3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: false + + /@vue/reactivity/3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + dependencies: + '@vue/shared': 3.2.47 + dev: false + + /@vue/runtime-core/3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + dependencies: + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/runtime-dom/3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + dependencies: + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 + csstype: 2.6.21 + dev: false + + /@vue/server-renderer/3.2.47_vue@3.2.47: + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 + dev: false + + /@vue/shared/3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + dev: false + + /@vueuse/core/9.13.0_vue@3.2.47: + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0_vue@3.2.47 + vue-demi: 0.13.11_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata/9.13.0: + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + dev: false + + /@vueuse/shared/9.13.0_vue@3.2.47: + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + dependencies: + vue-demi: 0.13.11_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /algoliasearch/4.17.0: + resolution: {integrity: sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==} + dependencies: + '@algolia/cache-browser-local-storage': 4.17.0 + '@algolia/cache-common': 4.17.0 + '@algolia/cache-in-memory': 4.17.0 + '@algolia/client-account': 4.17.0 + '@algolia/client-analytics': 4.17.0 + '@algolia/client-common': 4.17.0 + '@algolia/client-personalization': 4.17.0 + '@algolia/client-search': 4.17.0 + '@algolia/logger-common': 4.17.0 + '@algolia/logger-console': 4.17.0 + '@algolia/requester-browser-xhr': 4.17.0 + '@algolia/requester-common': 4.17.0 + '@algolia/requester-node-http': 4.17.0 + '@algolia/transporter': 4.17.0 + dev: false + + /ansi-sequence-parser/1.1.0: + resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + dev: false + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /body-scroll-lock/4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + dev: false + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /csstype/2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + dev: false + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /esbuild/0.17.15: + resolution: {integrity: sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.15 + '@esbuild/android-arm64': 0.17.15 + '@esbuild/android-x64': 0.17.15 + '@esbuild/darwin-arm64': 0.17.15 + '@esbuild/darwin-x64': 0.17.15 + '@esbuild/freebsd-arm64': 0.17.15 + '@esbuild/freebsd-x64': 0.17.15 + '@esbuild/linux-arm': 0.17.15 + '@esbuild/linux-arm64': 0.17.15 + '@esbuild/linux-ia32': 0.17.15 + '@esbuild/linux-loong64': 0.17.15 + '@esbuild/linux-mips64el': 0.17.15 + '@esbuild/linux-ppc64': 0.17.15 + '@esbuild/linux-riscv64': 0.17.15 + '@esbuild/linux-s390x': 0.17.15 + '@esbuild/linux-x64': 0.17.15 + '@esbuild/netbsd-x64': 0.17.15 + '@esbuild/openbsd-x64': 0.17.15 + '@esbuild/sunos-x64': 0.17.15 + '@esbuild/win32-arm64': 0.17.15 + '@esbuild/win32-ia32': 0.17.15 + '@esbuild/win32-x64': 0.17.15 + dev: false + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter/4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: false + + /is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /markdown-from-posts/1.0.5: + resolution: {integrity: sha512-uR1ZipqCH/efLPj/rMb2EtPkE3KjB96YakZ1a+ILSYSjbgZROVDuErUzAei3M/r/rM7Q0VEDQ6xb5acCjjYNzw==} + dependencies: + fs-extra: 10.1.0 + globby: 11.1.0 + gray-matter: 4.0.3 + dev: false + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /normalize.css/8.0.1: + resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} + dev: false + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /custom-vitepress-theme/0.0.2_vitepress@1.0.0-alpha.64: + resolution: {integrity: sha512-mTY9DLTCuIxCMqwD2/YXxgEcKh8kUMN/InmRqx4M9B87Jx3e/Csmm32ghBuR3TDES8+SDYAEFJzwteAWVvbD2g==} + peerDependencies: + vitepress: ^1.0.0-alpha.64 + dependencies: + markdown-from-posts: 1.0.5 + normalize.css: 8.0.1 + vitepress: 1.0.0-alpha.64_@types+node@18.15.11 + dev: false + + /preact/10.13.2: + resolution: {integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==} + dev: false + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /resolve/1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup/3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /section-matter/1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /shiki/0.14.1: + resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} + dependencies: + ansi-sequence-parser: 1.1.0 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /strip-bom-string/1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false + + /vite/4.2.1_@types+node@18.15.11: + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.15 + postcss: 8.4.21 + resolve: 1.22.2 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /vitepress/1.0.0-alpha.64_@types+node@18.15.11: + resolution: {integrity: sha512-u12wcDH4VzgxxkQfVQWkXumrL3WRetpenz4VuAtiMWXeZSCayWcJtieWOFxmX/RzS2KEuTJpXGbtJAXORyyJBQ==} + hasBin: true + dependencies: + '@docsearch/css': 3.3.3 + '@docsearch/js': 3.3.3 + '@vitejs/plugin-vue': 4.1.0_vite@4.2.1+vue@3.2.47 + '@vue/devtools-api': 6.5.0 + '@vueuse/core': 9.13.0_vue@3.2.47 + body-scroll-lock: 4.0.0-beta.0 + shiki: 0.14.1 + vite: 4.2.1_@types+node@18.15.11 + vue: 3.2.47 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - less + - react + - react-dom + - sass + - stylus + - sugarss + - terser + dev: false + + /vscode-oniguruma/1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate/8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + + /vue-demi/0.13.11_vue@3.2.47: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.47 + dev: false + + /vue/3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/runtime-dom': 3.2.47 + '@vue/server-renderer': 3.2.47_vue@3.2.47 + '@vue/shared': 3.2.47 + dev: false diff --git a/demo/posts/default/default.md b/demo/posts/default/default.md new file mode 100644 index 0000000..54c51a1 --- /dev/null +++ b/demo/posts/default/default.md @@ -0,0 +1,63 @@ +--- +title: default +date: 2018-09-14 13:57:02 +category: default +tags: + - default +--- +# 主标题AAAA + +## 副标题 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.default{ + color:red; +} +``` + +```shell +npm install default +``` + +### 副标题1 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.default{ + color:red; +} +``` + +```shell +npm install default +``` + + +#### 副标题111 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.default{ + color:red; +} +``` + +```shell +npm install default +``` diff --git a/demo/posts/demo/demo.md b/demo/posts/demo/demo.md new file mode 100644 index 0000000..cfb5d1c --- /dev/null +++ b/demo/posts/demo/demo.md @@ -0,0 +1,63 @@ +--- +title: demo +date: 2018-09-14 13:57:02 +category: demo +tags: + - demo +--- +# 主标题BBBB + +## 副标题 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.demo{ + color:red; +} +``` + +```shell +npm install demo +``` + +### 副标题1 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.demo{ + color:red; +} +``` + +```shell +npm install demo +``` + + +#### 副标题111 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.demo{ + color:red; +} +``` + +```shell +npm install demo +``` diff --git a/demo/public/favicon.ico b/demo/public/favicon.ico new file mode 100644 index 0000000..0b97428 Binary files /dev/null and b/demo/public/favicon.ico differ diff --git a/demo/public/img/banner.png b/demo/public/img/banner.png new file mode 100644 index 0000000..c4aac89 Binary files /dev/null and b/demo/public/img/banner.png differ diff --git a/demo/public/img/page.png b/demo/public/img/page.png new file mode 100644 index 0000000..81ac9d6 Binary files /dev/null and b/demo/public/img/page.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..f6ab244 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "custom-vitepress-theme", + "version": "0.0.1", + "description": "自定义vitepress主题", + "main": "src/index.ts", + "exports": { + ".": "./src/index.ts", + "./config": { + "types": "./src/vitepress/config/baseConfig.d.ts", + "default": "./src/vitepress/config/baseConfig.js" + } + }, + "files": [ + "src", + "types" + ], + "repository": { + "type": "git", + "url": "http://git.ppst.top/pp/custom-vitepress-theme" + }, + "keywords": [ + "vue", + "vitepress" + ], + "author": "pp", + "scripts": { + "lint": "prettier --check --write --parser typescript \"{__tests__,docs,src,types}/**/*.ts\"", + "lint:fail": "prettier --check --parser typescript \"{__tests__,docs,src,types}/**/*.ts\"", + "type": "tsc --noEmit", + "test": "npm run lint && npm run type", + "demo": "cd demo && vitepress dev demo --host 0.0.0.0" + }, + "dependencies": { + "markdown-from-posts": "^1.0.5", + "normalize.css": "^8.0.1", + "vitepress": "1.0.0-alpha.64" + }, + "devDependencies": { + "@types/node": "^18.15.11", + "prettier": "^2.7.1", + "typescript": "^4.9.5", + "vue": "^3.2.47" + }, + "peerDependencies": { + "vitepress": "^1.0.0-alpha.64" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..9e2cf38 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1016 @@ +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + markdown-from-posts: + specifier: ^1.0.5 + version: 1.0.5 + normalize.css: + specifier: ^8.0.1 + version: 8.0.1 + vitepress: + specifier: 1.0.0-alpha.64 + version: 1.0.0-alpha.64(@algolia/client-search@4.17.1)(@types/node@18.15.11) + +devDependencies: + '@types/node': + specifier: ^18.15.11 + version: 18.15.11 + prettier: + specifier: ^2.7.1 + version: 2.7.1 + typescript: + specifier: ^4.9.5 + version: 4.9.5 + vue: + specifier: ^3.2.47 + version: 3.2.47 + +packages: + + /@algolia/autocomplete-core@1.8.2: + resolution: {integrity: sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==} + dependencies: + '@algolia/autocomplete-shared': 1.8.2 + dev: false + + /@algolia/autocomplete-preset-algolia@1.8.2(@algolia/client-search@4.17.1)(algoliasearch@4.17.1): + resolution: {integrity: sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.8.2 + '@algolia/client-search': 4.17.1 + algoliasearch: 4.17.1 + dev: false + + /@algolia/autocomplete-shared@1.8.2: + resolution: {integrity: sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==} + dev: false + + /@algolia/cache-browser-local-storage@4.17.1: + resolution: {integrity: sha512-e91Jpu93X3t3mVdQwF3ZDjSFMFIfzSc+I76G4EX8nl9RYXgqcjframoL05VTjcD2YCsI18RIHAWVCBoCXVZnrw==} + dependencies: + '@algolia/cache-common': 4.17.1 + dev: false + + /@algolia/cache-common@4.17.1: + resolution: {integrity: sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA==} + dev: false + + /@algolia/cache-in-memory@4.17.1: + resolution: {integrity: sha512-NbBt6eBWlsXc5geSpfPRC5dkIB/0Ptthw8r0yM5Z7D3sPlYdnTZSO9y9XWXIptRMwmZe4cM8iBMN8y0tzbcBkA==} + dependencies: + '@algolia/cache-common': 4.17.1 + dev: false + + /@algolia/client-account@4.17.1: + resolution: {integrity: sha512-3rL/6ofJvyL+q8TiWM3qoM9tig+SY4gB1Vbsj+UeJPnJm8Khm+7OS+r+mFraqR6pTehYqN8yGYoE7x4diEn4aA==} + dependencies: + '@algolia/client-common': 4.17.1 + '@algolia/client-search': 4.17.1 + '@algolia/transporter': 4.17.1 + dev: false + + /@algolia/client-analytics@4.17.1: + resolution: {integrity: sha512-Bepr2w249vODqeBtM7i++tPmUsQ9B81aupUGbDWmjA/FX+jzQqOdhW8w1CFO5kWViNKTbz2WBIJ9U3x8hOa4bA==} + dependencies: + '@algolia/client-common': 4.17.1 + '@algolia/client-search': 4.17.1 + '@algolia/requester-common': 4.17.1 + '@algolia/transporter': 4.17.1 + dev: false + + /@algolia/client-common@4.17.1: + resolution: {integrity: sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ==} + dependencies: + '@algolia/requester-common': 4.17.1 + '@algolia/transporter': 4.17.1 + dev: false + + /@algolia/client-personalization@4.17.1: + resolution: {integrity: sha512-gJku9DG/THJpfsSlG/az0a3QIn+VVff9kKh8PG8+7ZfxOHS+C+Y5YSeZVsC+c2cfoKLPo3CuHIiJ/p86erR3bA==} + dependencies: + '@algolia/client-common': 4.17.1 + '@algolia/requester-common': 4.17.1 + '@algolia/transporter': 4.17.1 + dev: false + + /@algolia/client-search@4.17.1: + resolution: {integrity: sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w==} + dependencies: + '@algolia/client-common': 4.17.1 + '@algolia/requester-common': 4.17.1 + '@algolia/transporter': 4.17.1 + dev: false + + /@algolia/logger-common@4.17.1: + resolution: {integrity: sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg==} + dev: false + + /@algolia/logger-console@4.17.1: + resolution: {integrity: sha512-iKGQTpOjHiE64W3JIOu6dmDvn+AfYIElI9jf/Nt6umRPmP/JI9rK+OHUoW4pKrBtdG0DPd62ppeNXzSnLxY6/g==} + dependencies: + '@algolia/logger-common': 4.17.1 + dev: false + + /@algolia/requester-browser-xhr@4.17.1: + resolution: {integrity: sha512-W5mGfGDsyfVR+r4pUFrYLGBEM18gs38+GNt5PE5uPULy4uVTSnnVSkJkWeRkmLBk9zEZ/Nld8m4zavK6dtEuYg==} + dependencies: + '@algolia/requester-common': 4.17.1 + dev: false + + /@algolia/requester-common@4.17.1: + resolution: {integrity: sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ==} + dev: false + + /@algolia/requester-node-http@4.17.1: + resolution: {integrity: sha512-NzFWecXT6d0PPsQY9L+/qoK2deF74OLcpvqCH+Vh3mh+QzPsFafcBExdguAjZsAWDn1R6JEeFW7/fo/p0SE57w==} + dependencies: + '@algolia/requester-common': 4.17.1 + dev: false + + /@algolia/transporter@4.17.1: + resolution: {integrity: sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg==} + dependencies: + '@algolia/cache-common': 4.17.1 + '@algolia/logger-common': 4.17.1 + '@algolia/requester-common': 4.17.1 + dev: false + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/parser@7.22.4: + resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.4 + + /@babel/types@7.22.4: + resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@docsearch/css@3.4.0: + resolution: {integrity: sha512-Hg8Xfma+rFwRi6Y/pfei4FJoQ1hdVURmmNs/XPoMTCPAImU+d5yxj+M+qdLtNjWRpfWziU4dQcqY94xgFBn2dg==} + dev: false + + /@docsearch/js@3.4.0(@algolia/client-search@4.17.1): + resolution: {integrity: sha512-uOtOHZJv+5PQmL68+srVzlGhLejnEBJgZl1bR87Zh/uK5RUI7p6el1R8hGTl2F8K2tCloNRxTMtXyYUNbMV+qw==} + dependencies: + '@docsearch/react': 3.4.0(@algolia/client-search@4.17.1) + preact: 10.15.1 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + dev: false + + /@docsearch/react@3.4.0(@algolia/client-search@4.17.1): + resolution: {integrity: sha512-ufrp5879XYGojgS30ZAp8H4qIMbahRHB9M85VDBP36Xgz5QjYM54i1URKj5e219F7gqTtOivfztFTij6itc0MQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.8.2 + '@algolia/autocomplete-preset-algolia': 1.8.2(@algolia/client-search@4.17.1)(algoliasearch@4.17.1) + '@docsearch/css': 3.4.0 + algoliasearch: 4.17.1 + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@types/node@18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + + /@types/web-bluetooth@0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + dev: false + + /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.2.47): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.3.9(@types/node@18.15.11) + vue: 3.2.47 + dev: false + + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.22.4 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.22.4 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.24 + source-map: 0.6.1 + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/devtools-api@6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + dev: false + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.22.4 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + + /@vue/reactivity@3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + dependencies: + '@vue/shared': 3.2.47 + + /@vue/runtime-core@3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + dependencies: + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/runtime-dom@3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + dependencies: + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 + csstype: 2.6.21 + + /@vue/server-renderer@3.2.47(vue@3.2.47): + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + + /@vueuse/core@9.13.0(vue@3.2.47): + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.2.47) + vue-demi: 0.14.5(vue@3.2.47) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@9.13.0: + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + dev: false + + /@vueuse/shared@9.13.0(vue@3.2.47): + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + dependencies: + vue-demi: 0.14.5(vue@3.2.47) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /algoliasearch@4.17.1: + resolution: {integrity: sha512-4GDQ1RhP2qUR3x8PevFRbEdqZqIARNViZYjgTJmA1T7wRNtFA3W4Aqc/RsODqa1J8IO/QDla5x4tWuUS8NV8wA==} + dependencies: + '@algolia/cache-browser-local-storage': 4.17.1 + '@algolia/cache-common': 4.17.1 + '@algolia/cache-in-memory': 4.17.1 + '@algolia/client-account': 4.17.1 + '@algolia/client-analytics': 4.17.1 + '@algolia/client-common': 4.17.1 + '@algolia/client-personalization': 4.17.1 + '@algolia/client-search': 4.17.1 + '@algolia/logger-common': 4.17.1 + '@algolia/logger-console': 4.17.1 + '@algolia/requester-browser-xhr': 4.17.1 + '@algolia/requester-common': 4.17.1 + '@algolia/requester-node-http': 4.17.1 + '@algolia/transporter': 4.17.1 + dev: false + + /ansi-sequence-parser@1.1.0: + resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /body-scroll-lock@4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /csstype@2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + + /markdown-from-posts@1.0.5: + resolution: {integrity: sha512-uR1ZipqCH/efLPj/rMb2EtPkE3KjB96YakZ1a+ILSYSjbgZROVDuErUzAei3M/r/rM7Q0VEDQ6xb5acCjjYNzw==} + dependencies: + fs-extra: 10.1.0 + globby: 11.1.0 + gray-matter: 4.0.3 + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /normalize.css@8.0.1: + resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /preact@10.15.1: + resolution: {integrity: sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==} + dev: false + + /prettier@2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@3.23.1: + resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /shiki@0.14.2: + resolution: {integrity: sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==} + dependencies: + ansi-sequence-parser: 1.1.0 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false + + /vite@4.3.9(@types/node@18.15.11): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.19 + postcss: 8.4.24 + rollup: 3.23.1 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /vitepress@1.0.0-alpha.64(@algolia/client-search@4.17.1)(@types/node@18.15.11): + resolution: {integrity: sha512-u12wcDH4VzgxxkQfVQWkXumrL3WRetpenz4VuAtiMWXeZSCayWcJtieWOFxmX/RzS2KEuTJpXGbtJAXORyyJBQ==} + hasBin: true + dependencies: + '@docsearch/css': 3.4.0 + '@docsearch/js': 3.4.0(@algolia/client-search@4.17.1) + '@vitejs/plugin-vue': 4.2.3(vite@4.3.9)(vue@3.2.47) + '@vue/devtools-api': 6.5.0 + '@vueuse/core': 9.13.0(vue@3.2.47) + body-scroll-lock: 4.0.0-beta.0 + shiki: 0.14.2 + vite: 4.3.9(@types/node@18.15.11) + vue: 3.2.47 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - less + - react + - react-dom + - sass + - stylus + - sugarss + - terser + dev: false + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + + /vue-demi@0.14.5(vue@3.2.47): + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.47 + dev: false + + /vue@3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/runtime-dom': 3.2.47 + '@vue/server-renderer': 3.2.47(vue@3.2.47) + '@vue/shared': 3.2.47 diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..d8b88e7 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +export * from './vitepress' diff --git a/src/shim.d.ts b/src/shim.d.ts new file mode 100644 index 0000000..2c168c8 --- /dev/null +++ b/src/shim.d.ts @@ -0,0 +1,12 @@ +declare module 'custom-vitepress-theme' { + const CustomTheme: Theme = { + Layout: any + } + + export { CustomTheme } +} +declare module '*.vue' { + import { ComponentOptions } from 'vue' + const componentOptions: ComponentOptions + export default componentOptions +} diff --git a/src/vitepress/components/Archives.vue b/src/vitepress/components/Archives.vue new file mode 100644 index 0000000..a43bdc8 --- /dev/null +++ b/src/vitepress/components/Archives.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/vitepress/components/BackPng.vue b/src/vitepress/components/BackPng.vue new file mode 100644 index 0000000..f17a824 --- /dev/null +++ b/src/vitepress/components/BackPng.vue @@ -0,0 +1,3 @@ + diff --git a/src/vitepress/components/CategoryPage.vue b/src/vitepress/components/CategoryPage.vue new file mode 100644 index 0000000..647b917 --- /dev/null +++ b/src/vitepress/components/CategoryPage.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/vitepress/components/Copyright.vue b/src/vitepress/components/Copyright.vue new file mode 100644 index 0000000..0fc4fd0 --- /dev/null +++ b/src/vitepress/components/Copyright.vue @@ -0,0 +1,62 @@ + + + + diff --git a/src/vitepress/components/DefaultPage.vue b/src/vitepress/components/DefaultPage.vue new file mode 100644 index 0000000..60ab51e --- /dev/null +++ b/src/vitepress/components/DefaultPage.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/vitepress/components/Home.vue b/src/vitepress/components/Home.vue new file mode 100644 index 0000000..06b49bd --- /dev/null +++ b/src/vitepress/components/Home.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/vitepress/components/Layout.vue b/src/vitepress/components/Layout.vue new file mode 100644 index 0000000..135e926 --- /dev/null +++ b/src/vitepress/components/Layout.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/vitepress/components/Search.vue b/src/vitepress/components/Search.vue new file mode 100644 index 0000000..e5f5280 --- /dev/null +++ b/src/vitepress/components/Search.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/src/vitepress/components/SideBarLink.ts b/src/vitepress/components/SideBarLink.ts new file mode 100644 index 0000000..24b74fc --- /dev/null +++ b/src/vitepress/components/SideBarLink.ts @@ -0,0 +1,120 @@ +import { h } from 'vue' +import { useRoute, useData, Header } from 'vitepress' +export const hashRE = /#.*$/ +export const extRE = /(index)?\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^[a-z]+:/i +export function normalize(path: string) { + return decodeURI(path).replace(hashRE, '').replace(extRE, '') +} +export function isActive( + route: { data: { relativePath: string } }, + path: string +) { + if (path === undefined) { + return false + } + const routePath = normalize(`/${route.data.relativePath}`) + const pagePath = normalize(path) + + return routePath === pagePath +} +export function joinUrl(base: string, path: string) { + const baseEndsWithSlash = base.endsWith('/') + const pathStartsWithSlash = path.startsWith('/') + if (baseEndsWithSlash && pathStartsWithSlash) { + return base.slice(0, -1) + path + } + if (!baseEndsWithSlash && !pathStartsWithSlash) { + return `${base}/${path}` + } + + return base + path +} +export const SideBarLink = (props: any) => { + const route = useRoute() + const { site, frontmatter } = useData() + const depth = props.depth || 1 + const maxDepth = frontmatter.value.sidebarDepth || Infinity + const headers = route.data.headers + const text = props.item.text + const link = resolveLink(site.value.base, props.item.link) + const children = props.item.children + const active = isActive(route, props.item.link) + const childItems = + depth < maxDepth + ? createChildren(active, children, headers, depth + 1) + : null + return h('li', { class: 'sidebar-link' }, [ + h( + link ? 'a' : 'p', + { + class: { 'sidebar-link-item': true, active }, + href: link + }, + text + ), + childItems + ]) +} +function resolveLink(base: string, path: string) { + if (path === undefined) { + return path + } + // keep relative hash to the same page + if (path.startsWith('#')) { + return path + } + return joinUrl(base, path) +} +function createChildren( + active: boolean, + children: any, + headers: Array
| undefined, + depth = 1 +) { + if (children && children.length > 0) { + return h( + 'ul', + { class: 'sidebar-links' }, + children.map((c: any) => { + return h(SideBarLink, { item: c, depth }) + }) + ) + } + if (active && headers && Array.isArray(headers)) { + // if(createChildren(false, resolveHeaders(headers), undefined, depth)) return createChildren(false, resolveHeaders(headers), undefined, depth); + } + return null +} +// function resolveHeaders(headers:any) { +// return mapHeaders(groupHeaders(headers)); +// } +// function groupHeaders(headers:Array
) { +// headers = headers.map((h:Header) => Object.assign({}, h)); +// let lastH2:any; +// headers.forEach((h:Header) => { +// if (h.level === 2) { +// lastH2 = h; +// } +// else if (lastH2) { +// ; +// (lastH2.children || (lastH2.children = [])).push(h); +// } +// }); +// return headers.filter((h:any) => h.level === 2); +// } +// function mapHeaders(headers:any) { +// return headers.map((header:any) => { +// let children = []; +// if(header.children ){ +// children = mapHeaders(header.children) +// } +// return { +// text: header.title, +// link: `#${header.slug}`, +// children: children +// } +// }); + +// } diff --git a/src/vitepress/components/Sidebar.vue b/src/vitepress/components/Sidebar.vue new file mode 100644 index 0000000..830d63a --- /dev/null +++ b/src/vitepress/components/Sidebar.vue @@ -0,0 +1,46 @@ + + + + diff --git a/src/vitepress/components/darkSwitch/Index.vue b/src/vitepress/components/darkSwitch/Index.vue new file mode 100644 index 0000000..5c0367d --- /dev/null +++ b/src/vitepress/components/darkSwitch/Index.vue @@ -0,0 +1,55 @@ + + + + diff --git a/src/vitepress/components/darkSwitch/MoonIcon.vue b/src/vitepress/components/darkSwitch/MoonIcon.vue new file mode 100644 index 0000000..a9b205c --- /dev/null +++ b/src/vitepress/components/darkSwitch/MoonIcon.vue @@ -0,0 +1,5 @@ + diff --git a/src/vitepress/components/darkSwitch/SunIcon.vue b/src/vitepress/components/darkSwitch/SunIcon.vue new file mode 100644 index 0000000..8ecb25b --- /dev/null +++ b/src/vitepress/components/darkSwitch/SunIcon.vue @@ -0,0 +1,13 @@ + diff --git a/src/vitepress/components/darkSwitch/SwitchButton.vue b/src/vitepress/components/darkSwitch/SwitchButton.vue new file mode 100644 index 0000000..670726d --- /dev/null +++ b/src/vitepress/components/darkSwitch/SwitchButton.vue @@ -0,0 +1,9 @@ + diff --git a/src/vitepress/components/header/Index.vue b/src/vitepress/components/header/Index.vue new file mode 100644 index 0000000..7f5441b --- /dev/null +++ b/src/vitepress/components/header/Index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/vitepress/components/sidebar/activeSidebarLink.ts b/src/vitepress/components/sidebar/activeSidebarLink.ts new file mode 100644 index 0000000..3341f6a --- /dev/null +++ b/src/vitepress/components/sidebar/activeSidebarLink.ts @@ -0,0 +1,101 @@ +import { onMounted, onUnmounted, onUpdated } from 'vue' +export function useActiveSidebarLinks() { + let rootActiveLink: HTMLAnchorElement | null = null + let activeLink: Element | null = null + const onScroll = throttleAndDebounce(setActiveLink, 300) + function setActiveLink() { + const sidebarLinks = getSidebarLinks() + const anchors = getAnchors(sidebarLinks) + for (let i = 0; i < anchors.length; i++) { + const anchor = anchors[i] + const nextAnchor = anchors[i + 1] + const [isActive, hash] = isAnchorActive(i, anchor, nextAnchor) + if (isActive) { + history.replaceState(null, document.title, '') + activateLink(hash) + return + } + } + } + function activateLink(hash: any) { + deactiveLink(activeLink) + deactiveLink(rootActiveLink) + activeLink = document.querySelector(`.sidebar a[href="${hash}"]`) + if (!activeLink) { + return + } + activeLink.classList.add('active') + // also add active class to parent h2 anchors + const rootLi = activeLink.closest('.sidebar-links > ul > li') + if (rootLi && rootLi !== activeLink.parentElement) { + rootActiveLink = rootLi.querySelector('a') + rootActiveLink && rootActiveLink.classList.add('active') + } else { + rootActiveLink = null + } + } + function deactiveLink(link: any) { + link && link.classList.remove('active') + } + onMounted(() => { + setActiveLink() + window.addEventListener('scroll', onScroll) + }) + onUpdated(() => { + // sidebar update means a route change + activateLink(decodeURIComponent(location.hash)) + }) + onUnmounted(() => { + window.removeEventListener('scroll', onScroll) + }) +} +function getSidebarLinks() { + return [].slice.call( + document.querySelectorAll('.sidebar a.sidebar-link-item') + ) +} +function getAnchors(sidebarLinks: any) { + return [].slice + .call(document.querySelectorAll('.header-anchor')) + .filter((anchor: any) => + sidebarLinks.some((sidebarLink: any) => sidebarLink.hash === anchor.hash) + ) +} +function getPageOffset() { + return (document.querySelector('.nav-bar') as HTMLElement).offsetHeight +} +function getAnchorTop(anchor: any) { + const pageOffset = getPageOffset() + return anchor.parentElement.offsetTop - pageOffset - 15 +} +function isAnchorActive(index: number, anchor: any, nextAnchor: any) { + const scrollTop = window.scrollY + if (index === 0 && scrollTop === 0) { + return [true, null] + } + if (scrollTop < getAnchorTop(anchor)) { + return [false, null] + } + if (!nextAnchor || scrollTop < getAnchorTop(nextAnchor)) { + return [true, decodeURIComponent(anchor.hash)] + } + return [false, null] +} +function throttleAndDebounce(fn: any, delay: any) { + let timeout: any + let called = false + return () => { + if (timeout) { + clearTimeout(timeout) + } + if (!called) { + fn() + called = true + setTimeout(() => { + called = false + }, delay) + } else { + timeout = setTimeout(fn, delay) + } + } +} diff --git a/src/vitepress/components/sidebar/lang.ts b/src/vitepress/components/sidebar/lang.ts new file mode 100644 index 0000000..ff5a45f --- /dev/null +++ b/src/vitepress/components/sidebar/lang.ts @@ -0,0 +1,30 @@ +import { computed } from 'vue' +import { useRoute } from 'vitepress' +export const defaultLang = 'zh-CN' + +export const PREFERRED_LANG_KEY = 'vuetom_lang' + +export const breakpoints = { + sm: 480, + md: 768, + lg: 960, + xlg: 1280, + xxl: 1440 +} +export const useLang = () => { + const route = useRoute() + + return computed(() => { + // the first part of the first slash + const path = route.data?.relativePath + let lang: string | undefined = '' + + if (path && path.includes('/')) { + lang = path.split('/').shift() + } else { + lang = defaultLang + } + + return lang + }) +} diff --git a/src/vitepress/components/sidebar/sideBar.ts b/src/vitepress/components/sidebar/sideBar.ts new file mode 100644 index 0000000..4c24c6b --- /dev/null +++ b/src/vitepress/components/sidebar/sideBar.ts @@ -0,0 +1,67 @@ +import { computed } from 'vue' +import { useRoute, useData } from 'vitepress' +import { useLang } from './lang' +import { useActiveSidebarLinks } from './activeSidebarLink' +import { getSideBarConfig } from './support' +export function useSideBar() { + const route = useRoute() + const { site } = useData() + const lang = useLang() + useActiveSidebarLinks() + return computed(() => { + // at first, we'll check if we can find the sidebar setting in frontmatter. + const headers = route.data.headers + const frontSidebar = route.data.frontmatter.sidebar + const sidebarDepth = route.data.frontmatter.sidebarDepth + // if it's `false`, we'll just return an empty array here. + if (frontSidebar === false) { + return [] + } + // if it's `atuo`, render headers of the current page + if (frontSidebar === 'auto') { + return resolveAutoSidebar(headers, sidebarDepth) + } + // now, there's no sidebar setting at frontmatter; let's see the configs + const themeSidebar = getSideBarConfig( + site.value.themeConfig.sidebar, + route.data.relativePath, + lang.value ? lang.value : '' + ) + if (themeSidebar === false) { + return [] + } + if (themeSidebar === 'auto') { + return resolveAutoSidebar(headers, sidebarDepth) + } + return themeSidebar + }) +} +function resolveAutoSidebar( + headers: Array<{ level: number; title: string; slug: string }>, + depth: number +) { + const ret: Array<{ + text: string + link: string + }> = [] + if (headers === undefined) { + return [] + } + let lastH2: any = undefined + headers.forEach(({ level, title, slug }) => { + if (level - 1 > depth) { + return + } + const item = { + text: title, + link: `#${slug}` + } + if (level === 2) { + lastH2 = item + ret.push(item) + } else if (lastH2) { + ;(lastH2.children || (lastH2.children = [])).push(item) + } + }) + return ret +} diff --git a/src/vitepress/components/sidebar/support.ts b/src/vitepress/components/sidebar/support.ts new file mode 100644 index 0000000..e843dab --- /dev/null +++ b/src/vitepress/components/sidebar/support.ts @@ -0,0 +1,51 @@ +import { isArray, ensureStartingSlash, removeExtention } from './utils' + +export function isSideBarConfig(sidebar: any) { + return sidebar === false || sidebar === 'auto' || isArray(sidebar) +} +export function isSideBarGroup(item: any) { + return item.children !== undefined +} +export function isSideBarEmpty(sidebar: any) { + return isArray(sidebar) ? sidebar.length === 0 : !sidebar +} + +/** + * Get the `SideBarConfig` from sidebar option. This method will ensure to get + * correct sidebar config from `MultiSideBarConfig` with various path + * combinations such as matching `guide/` and `/guide/`. If no matching config + * was found, it will return `auto` as a fallback. + */ +export function getSideBarConfig(sidebar: any, path: string, lang: string) { + if (isSideBarConfig(sidebar)) { + return sidebar + } + path = ensureStartingSlash(path) + for (const dir in sidebar) { + // make sure the multi sidebar key starts with slash too + if (path.startsWith(ensureStartingSlash(`${lang}${dir}`))) { + return sidebar[dir][lang] + } + } + + return 'auto' +} + +/** + * Get flat sidebar links from the sidebar items. This method is useful for + * creating the "next and prev link" feature. It will ignore any items that + * don't have `link` property and removes `.md` or `.html` extension if a + * link contains it. + */ +export function getFlatSideBarLinks(sidebar: any) { + return sidebar.reduce((links: any, item: any) => { + if (item.link) { + links.push({ text: item.text, link: removeExtention(item.link) }) + } + if (isSideBarGroup(item)) { + links = [...links, ...getFlatSideBarLinks(item.children)] + } + + return links + }, []) +} diff --git a/src/vitepress/components/sidebar/utils.ts b/src/vitepress/components/sidebar/utils.ts new file mode 100644 index 0000000..25bdc7a --- /dev/null +++ b/src/vitepress/components/sidebar/utils.ts @@ -0,0 +1,71 @@ +export const hashRE = /#.*$/ +export const extRE = /(index)?\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^[a-z]+:/i +export function isNullish(value: string) { + return value === null || value === undefined +} +export function isArray(value: string) { + return Array.isArray(value) +} +export function isExternal(path: string) { + return outboundRE.test(path) +} +export function isActive( + route: { data: { relativePath: string } }, + path: string +) { + if (path === undefined) { + return false + } + const routePath = normalize(`/${route.data.relativePath}`) + const pagePath = normalize(path) + + return routePath === pagePath +} +export function normalize(path: string) { + return decodeURI(path).replace(hashRE, '').replace(extRE, '') +} +export function joinUrl(base: string, path: string) { + const baseEndsWithSlash = base.endsWith('/') + const pathStartsWithSlash = path.startsWith('/') + if (baseEndsWithSlash && pathStartsWithSlash) { + return base.slice(0, -1) + path + } + if (!baseEndsWithSlash && !pathStartsWithSlash) { + return `${base}/${path}` + } + + return base + path +} + +/** + * get the path without filename (the last segment). for example, if the given + * path is `/guide/getting-started.html`, this method will return `/guide/`. + * Always with a trailing slash. + */ +export function getPathDirName(path: string) { + const segments = path.split('/') + if (segments[segments.length - 1]) { + segments.pop() + } + + return ensureEndingSlash(segments.join('/')) +} +export function ensureSlash(path: string) { + return ensureEndingSlash(ensureStartingSlash(path)) +} +export function ensureStartingSlash(path: string) { + return /^\//.test(path) ? path : `/${path}` +} +export function ensureEndingSlash(path: string) { + return /(\.html|\/)$/.test(path) ? path : `${path}/` +} + +/** + * Remove `.md` or `.html` extention from the given path. It also converts + * `index` to slush. + */ +export function removeExtention(path: string) { + return path.replace(/(index)?(\.(md|html))?$/, '') || '/' +} diff --git a/src/vitepress/composables/config.ts b/src/vitepress/composables/config.ts new file mode 100644 index 0000000..e7a5a22 --- /dev/null +++ b/src/vitepress/composables/config.ts @@ -0,0 +1,29 @@ +import { + Component, + defineComponent, + h, + inject, + InjectionKey, + provide, + Ref +} from 'vue' +import { useData } from 'vitepress' +import { Config } from '../config' + +const configSymbol: InjectionKey> = Symbol('config') +export function withConfigProvider(App: Component) { + return defineComponent({ + name: 'ConfigProvider', + setup(_, { slots }) { + const { theme } = useData() + provide(configSymbol, theme.value) + return () => h(App, null, slots) + } + }) +} + +export function useConfig() { + return { + config: inject(configSymbol)! + } +} diff --git a/src/vitepress/composables/functions.ts b/src/vitepress/composables/functions.ts new file mode 100644 index 0000000..1e0d2b9 --- /dev/null +++ b/src/vitepress/composables/functions.ts @@ -0,0 +1,101 @@ +import { Article, Post } from '../config/baseConfig' +import { useData, withBase } from 'vitepress' +export function getTags(post: Post[]) { + let data: Array = [] + for (let index = 0; index < post.length; index++) { + const element = post[index] + const tags = element.frontMatter.tags + if (tags && tags.length > 0) { + tags.forEach((item) => { + data.push(item) + }) + } + } + // data = [...new Set(data)]; + return data.sort() +} +export function initTags(post: Post[]) { + const data: any = {} + for (let index = 0; index < post.length; index++) { + const element = post[index] + const tags = element.frontMatter.tags + if (tags && tags.length > 0) { + tags.forEach((item) => { + if (data[item]) { + data[item].push(element) + } else { + data[item] = [] + data[item].push(element) + } + }) + } + } + return data +} +export function searchData(post: Post[], keyword: string) { + const data: Array
= [] + for (let index = 0; index < post.length; index++) { + const element = post[index] + let hasArticle = false + if (element.frontMatter.title.includes(keyword)) { + hasArticle = true + } + if (element.frontMatter.category.includes(keyword)) { + hasArticle = true + } + if (element.frontMatter.description.includes(keyword)) { + hasArticle = true + } + const tags = element.frontMatter.tags + if (tags && tags.length > 0) { + tags.forEach((tag) => { + if (tag && tag.includes(keyword)) { + hasArticle = true + } + }) + } + if (hasArticle) { + data.push(element) + } + } + return data +} +export function initLists(post: Post[], category: string) { + const data: Array
= [] + for (let index = 0; index < post.length; index++) { + const element = post[index] + if (element.frontMatter.category == category) { + data.push(element) + } + } + return data +} +export function useYearSort(post: Post[]) { + const data = [] + let year = '0' + let num = -1 + for (let index = 0; index < post.length; index++) { + const element = post[index] + if (element.frontMatter.date) { + const y = element.frontMatter.date.split('-')[0] + if (y === year) { + data[num].push(element) + } else { + num++ + data[num] = [] as any + data[num].push(element) + year = y + } + } + } + return data +} + +export function getWithBase(url: string) { + let baseUrl = url + const { theme } = useData() + if (theme.value.docRoot) { + baseUrl = url.replace('/' + theme.value.docRoot + '/', '') + } + return withBase(baseUrl) +} diff --git a/src/vitepress/config.ts b/src/vitepress/config.ts new file mode 100644 index 0000000..e88d9f6 --- /dev/null +++ b/src/vitepress/config.ts @@ -0,0 +1,96 @@ +import { FooterConfig, HomeConfig, NavItem } from './config/baseConfig' + +export interface Config { + title: string + homeConfig: HomeConfig + hasDarkSwitch: boolean + docRoot: string + nav?: NavItem[] + + footer: FooterConfig + + /** + * Algolia configuration for the site search. + */ + algolia?: AlgoliaSearchOptions + + /** + * CarbonAds configuration + */ + carbonAds?: { + code: string + placement: string + } + + /** + * Translation/Locales links + */ +} + +/** + * The Algolia search options. Partially copied from + * @docsearch/react/dist/esm/DocSearch.d.ts + */ +export interface AlgoliaSearchOptions { + appId?: string + apiKey: string + indexName: string + placeholder?: string + searchParameters?: any + disableUserPersonalization?: boolean + initialQuery?: string + translations?: Partial +} + +export interface DocSearchTranslations { + button?: ButtonTranslations + modal?: ModalTranslations +} + +export interface ButtonTranslations { + buttonText?: string + buttonAriaLabel?: string +} +export interface ModalTranslations extends ScreenStateTranslations { + searchBox?: { + resetButtonTitle?: string + resetButtonAriaLabel?: string + cancelButtonText?: string + cancelButtonAriaLabel?: string + } + footer?: { + selectText?: string + selectKeyAriaLabel?: string + navigateText?: string + navigateUpKeyAriaLabel?: string + navigateDownKeyAriaLabel?: string + closeText?: string + closeKeyAriaLabel?: string + searchByText?: string + } +} +export interface ScreenStateTranslations { + errorScreen?: { + titleText?: string + helpText?: string + } + startScreen?: { + recentSearchesTitle?: string + noRecentSearchesText?: string + saveRecentSearchButtonTitle?: string + removeRecentSearchButtonTitle?: string + favoriteSearchesTitle?: string + removeFavoriteSearchButtonTitle?: string + } + noResultsScreen?: { + noResultsText?: string + suggestedQueryText?: string + reportMissingResultsText?: string + reportMissingResultsLinkText?: string + } +} +export interface MessageWithLink { + before?: string + link?: string + after?: string +} diff --git a/src/vitepress/config/baseConfig.d.ts b/src/vitepress/config/baseConfig.d.ts new file mode 100644 index 0000000..c24d735 --- /dev/null +++ b/src/vitepress/config/baseConfig.d.ts @@ -0,0 +1,39 @@ +import { UserConfig } from 'vitepress' +import { Config } from '../config' +declare const config: UserConfig +export default config +export interface Article { + regularPath: string + frontMatter: { + description: string + date: string + title: string + tags: Array + } +} +export type Post = { + frontMatter: { + date: string + title: string + category: string + tags: string[] + description: string + } + regularPath: string +} +export interface HomeConfig { + headline: string //大标题 + headlineHeight: string //大标题高亮 + subheading: string //小标题 + subheadingHeight: string //小标题高亮 + description: string //描述 +} + +export interface NavItem { + text: string + link: string + icon?: string +} +export interface FooterConfig { + copyright: string +} diff --git a/src/vitepress/config/baseConfig.js b/src/vitepress/config/baseConfig.js new file mode 100644 index 0000000..74911df --- /dev/null +++ b/src/vitepress/config/baseConfig.js @@ -0,0 +1,34 @@ +const { getPosts } = require('markdown-from-posts') +async function config() { + return { + extends: { + markdown: { + headers: { + level: [2, 3] + } + }, + }, + themeConfig: { + posts:await getPosts(), + title: 'AAAAA', + description: '自定义主题AAAA', + docRoot:'demo', + hasDarkSwitch:true, + homeConfig:{ + headline:'AAAA大标题',//大标题 + headlineHeight:'AAAA高亮',//大标题高亮 + subheading:'AAAA小标题',//小标题 + subheadingHeight:'小标题高亮',//小标题高亮 + description:'自定义主题,简短banner描述',//描述 + }, + + nav: [ + { text: '首页', link: '/', icon: '' } + ], + footer: { + copyright: '湘ICP备aaaaaaaa-1' + } + } + } +} +module.exports = config() diff --git a/src/vitepress/index.ts b/src/vitepress/index.ts new file mode 100644 index 0000000..35b4709 --- /dev/null +++ b/src/vitepress/index.ts @@ -0,0 +1,28 @@ +import 'normalize.css/normalize.css' +import './styles/variables.css' +import './styles/switch.css' +import './styles/custom.css' +import './styles/theme.css' +import Layout from './components/Layout.vue' +import Search from './components/Search.vue' +import Archives from './components/Archives.vue' +import Home from './components/Home.vue' +import DefaultPage from './components/DefaultPage.vue' +import CategoryPage from './components/CategoryPage.vue' +import { Theme } from 'vitepress' +import { withConfigProvider } from './composables/config' + +const CustomTheme: Theme = { + Layout: withConfigProvider(Layout), + NotFound: () => 'custom 404', + enhanceApp({ app }) { + app.component('Search', Search) + app.component('Archives', Archives) + app.component('Home', Home) + app.component('DefaultPage', DefaultPage) + app.component('CategoryPage', CategoryPage) + } +} + +export { CustomTheme } +export type { Config } from './config' diff --git a/src/vitepress/styles/custom.css b/src/vitepress/styles/custom.css new file mode 100644 index 0000000..9d0e824 --- /dev/null +++ b/src/vitepress/styles/custom.css @@ -0,0 +1,359 @@ +/*keep the change things*/ +html { + overflow-x: hidden; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: transparent; + font-size: 16px; + color: var(--c-text-color-light) +} +.dark body { + color: var(--c-text-color-dark); +} + +/*theme reset*/ +a,a:link,a:visited,a:hover,a::after{ + color: var(--c-text-color-light) +} +.dark a,.dark a:link,.dark a:visited,.dark a:hover,.dark a::after { + color: var(--c-text-color-dark); +} + +a:link { + text-decoration: none; +} + +h1 { + font-size: 1.7rem; +} + +h2 { + font-size: 1.125rem; + margin-bottom: inherit; +} + +h3 { + font-size: 1rem; +} + +h2+h3+h3+h4+h5 { + margin-top: 1.5rem; +} + +/* 设置滚动条的样式 */ +::-webkit-scrollbar { + width: 1px; +} + +/* 滚动槽 */ +::-webkit-scrollbar-track { + -webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.3); + border-radius: 1px; +} + +/* 滚动条滑块 */ +::-webkit-scrollbar-thumb { + border-radius: 1px; + background: rgba(0, 0, 0, 0.1); + -webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.5); +} + +::-webkit-scrollbar-thumb:window-inactive { + background: #fff; +} + +.return-top{ + position: fixed; + bottom: 80px; + right: 10px; +} + +.max-width { + max-width: 1200px; +} + +.mg-header { + margin-top: 40px; +} + +/* card */ +.card-header { + width: 100%; + margin: 0 auto; +} + +.card-header .title { + color: var(--c-main-color); + font-size: 36px; + text-align: center; + line-height: 2; +} + +.card-header .desc { + color: var(--c-text-color-dark); + font-size: 18px; + text-align: center; + line-height: 2; +} +.dark .card-header .desc { + color: var(--c-text-color-dark); +} +[class*='language-'] pre { + background-color: #000; +} + + +.note-box { + display: flex; + align-items: center; + width: 100%; + margin: 0 auto; + padding: 20px 0; +} + +.note-box .note-item { + flex-basis: 33%; + padding: 15px; + transition: all 0.3s ease; +} + +.note-box .note-item .item-box { + display: flex; + justify-content: center; + align-items: center; + height: 120px; + background-color: rgba(229, 234, 241, 0.6); + border-radius: 15px; + position: relative; +} + +.note-box .note-item .item-box .title { + color: rgba(65, 86, 120, 1); +} +.dark .note-box .note-item .item-box { + background-color: rgb(82 85 89 / 60%); +} + +.dark .note-box .note-item .item-box .title { + color: #fff; +} +.note-box .note-item .item-box .go { + opacity: 0; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: 15px; + background-color: var(--c-main-color); + +} + +.button-box { + color: #fff; + cursor: pointer; +} + +.card-box { + width: 100%; + display: flex; + flex-wrap: wrap; + margin: 0 auto; + padding: 20px 0; +} + +.card-box .card-item { + flex-basis: 25%; + padding: 15px; + transition: all 0.3s ease; +} + +.card-box .card-item .item-box { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + border-radius: 15px; + padding: 15px; + background: #f8f8fc; + transition: all 0.3s ease; +} +.card-box .card-item .item-box { + border-radius: 5px; + background: #fbfafc; + box-shadow: 0 1px 2px 0 #fbfafc; + padding: 40px; +} +.dark .card-box .card-item .item-box{ + background: rgb(0 0 0 / 10%); + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 10%); +} +.card-box .card-item .item-box .title { + font-size: 16px; + line-height: 2; + font-weight: 500; + color: #020312; +} +.dark .card-box .card-item .item-box .title{ + color: #fbfafc; +} +.card-box .card-item .item-box .desc { + font-size: 16px; + line-height: 2; + color: #717e96; + overflow: hidden; +} + + + +.card-box .card-item:hover .item-box .icon, +.card-box .card-item:hover .item-box .title, +.card-box .card-item:hover .item-box .desc, +.card-box .card-item .item-box.active .icon, +.card-box .card-item .item-box.active .title, +.card-box .card-item .item-box.active .desc { + color: var(--c-main-color); +} + +.card-box .item-box .mark-box { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; + transition: all 0.5s ease; + border-radius: 15px; + margin: auto; + opacity: 0; + +} + +.mark-box .mark { + color: #fff; + opacity: 0; +} + + + + +.page-banner-box { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + margin: 0 auto; + padding: 60px 0; +} + +.page-banner-box .banner { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + margin: 0 auto; +} + +.page-banner-box .banner-right { + flex-basis: 50%; + font-size: 28px; + line-height: 2; + padding-left: 8%; + +} + +.page-banner-box .banner-right .title { + color: var(--c-main-color); +} + +.page-banner-box .banner-right .desc { + font-size: 18px; + color: #888296; +} + +.page-banner-box .banner-right .hight { + color: #000; +} + +.page-banner-box .banner-left { + width: 320px; +} + +.page-banner-box .banner-left img { + width: 100%; + height: 100%; +} + + +@media (max-width: 1200px) { + body { + font-size: 12px; + } + + ::-webkit-scrollbar { + display: none; + } + + .logo-box { + display: none; + } + + .card-header .title { + font-size: 16px; + } + + .card-header .desc { + font-size: 14px; + } + + .page-banner-box .banner-right { + font-size: 14px + } + + .page-banner-box .banner-right .desc { + font-size: 12px + } + + .note-box { + flex-wrap: wrap; + } + + .note-box .note-item { + flex-basis: 100%; + } + + .card-box { + flex-wrap: wrap; + } + + .card-box .card-item { + flex-basis: 100%; + } + + .card-box .card-item .item-box { + margin-bottom: 0; + } + + .card-box .item-box .mark-box { + opacity: 1; + font-size: 12px; + } + + .card-box .card-item .item-box .title { + font-size: 14px; + } + + .card-box .card-item .item-box .desc { + font-size: 12px; + } +} \ No newline at end of file diff --git a/src/vitepress/styles/index.css b/src/vitepress/styles/index.css new file mode 100644 index 0000000..c861108 --- /dev/null +++ b/src/vitepress/styles/index.css @@ -0,0 +1,3 @@ +@import 'vitepress/dist/client/theme-default/styles/fonts.css'; +@import '../../core/styles/index.css'; +@import './variables.css'; diff --git a/src/vitepress/styles/switch.css b/src/vitepress/styles/switch.css new file mode 100644 index 0000000..ae856f0 --- /dev/null +++ b/src/vitepress/styles/switch.css @@ -0,0 +1,69 @@ +.vt-switch { + position: relative; + border-radius: 11px; + display: block; + width: 40px; + height: 22px; + flex-shrink: 0; + border: 1px solid var(--c-bg-white); + transition: border-color 0.25s, background-color 0.25s; +} + +.vt-switch:hover { + border-color: var(--c-bg-white); +} + +.vt-switch-check { + position: absolute; + top: 1px; + left: 1px; + width: 18px; + height: 18px; + border-radius: 50%; + box-shadow: var(--vt-shadow-1); + transition: background-color 0.25s, transform 0.25s; +} + + + +.vt-switch-icon { + position: relative; + display: block; + width: 18px; + height: 18px; + border-radius: 50%; + overflow: hidden; +} + +.vt-switch-icon svg { + position: absolute; + top: 3px; + left: 3px; + width: 12px; + height: 12px; + fill: var(--vt-c-text-2); +} + +.dark .vt-switch-icon svg { + fill: var(--vt-c-text-1); + transition: opacity 0.25s; +} + + +.vt-switch-appearance-sun { + opacity: 1; +} +.vt-switch-appearance-moon { + opacity: 0; +} + +.dark .vt-switch-appearance-sun { + opacity: 0; +} +.dark .vt-switch-appearance-moon { + opacity: 1; +} + +.dark .vt-switch-appearance .vt-switch-check { + transform: translateX(18px); +} diff --git a/src/vitepress/styles/theme.css b/src/vitepress/styles/theme.css new file mode 100644 index 0000000..d184408 --- /dev/null +++ b/src/vitepress/styles/theme.css @@ -0,0 +1,613 @@ + + +*,:before,:after { + box-sizing: border-box +} + +html { + line-height: 1.4; + font-size: 16px; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0; + width: 100%; + min-width: 320px; + min-height: 100vh; + line-height: 1.4; + font-family: var(--font-family-base); + font-size: 16px; + font-weight: 400; + color: var(--c-text); + background-color: var(--c-bg); + direction: ltr; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +main { + display: block +} + +h1,h2,h3,h4,h5,h6 { + margin: 0; + line-height: 1.25 +} + +h1,h2,h3,h4,h5,h6,strong,b { + font-weight: 600 +} + +h1:hover .header-anchor,h1:focus .header-anchor,h2:hover .header-anchor,h2:focus .header-anchor,h3:hover .header-anchor,h3:focus .header-anchor,h4:hover .header-anchor,h4:focus .header-anchor,h5:hover .header-anchor,h5:focus .header-anchor,h6:hover .header-anchor,h6:focus .header-anchor { + opacity: 1 +} + +h1 { + margin-top: 1.5rem; + font-size: 1.9rem +} + +@media screen and (min-width: 420px) { + h1 { + font-size:2.2rem + } +} + +h2 { + margin-top: 2.25rem; + margin-bottom: 1.25rem; + border-bottom: 1px solid var(--c-divider); + padding-bottom: .3rem; + line-height: 1.25; + font-size: 1.65rem +} + +h2+h3 { + margin-top: 1.5rem +} + +h3 { + margin-top: 2rem; + font-size: 1.35rem +} + +h4 { + font-size: 1.15rem +} + +p,ol,ul { + margin: 1rem 0; + line-height: 1.7 +} + +a,area,button,[role=button],input,label,select,summary,textarea { + touch-action: manipulation +} + +a { + text-decoration: none; + color: var(--c-brand) +} + +a:hover { + text-decoration: underline +} + +a.header-anchor { + float: left; + margin-top: .125em; + margin-left: -.87em; + padding-right: .23em; + font-size: .85em; + opacity: 0 +} + +a.header-anchor:hover,a.header-anchor:focus { + text-decoration: none +} + +figure { + margin: 0 +} + +img { + max-width: 100% +} + +ul,ol { + padding-left: 1.25em +} + +li>ul,li>ol { + margin: 0 +} + +table { + display: block; + border-collapse: collapse; + margin: 1rem 0; + overflow-x: auto +} + +tr { + border-top: 1px solid #dfe2e5 +} + +tr:nth-child(2n) { + background-color: #f6f8fa +} + +th,td { + border: 1px solid #dfe2e5; + padding: .6em 1em +} + +blockquote { + margin: 1rem 0; + border-left: .2rem solid #dfe2e5; + padding: .25rem 0 .25rem 1rem; + font-size: 1rem; + color: #999 +} + +blockquote>p { + margin: 0 +} + +form { + margin: 0 +} + +.theme.sidebar-open .sidebar-mask { + display: block +} + +.theme.no-navbar>h1,.theme.no-navbar>h2,.theme.no-navbar>h3,.theme.no-navbar>h4,.theme.no-navbar>h5,.theme.no-navbar>h6 { + margin-top: 1.5rem; + padding-top: 0 +} + +.theme.no-navbar aside { + top: 0 +} + +@media screen and (min-width: 720px) { + .theme.no-sidebar aside { + display:none + } + + .theme.no-sidebar main { + margin-left: 0 + } +} + +.sidebar-mask { + position: fixed; + z-index: 2; + display: none; + width: 100vw; + height: 100vh +} + +code { + margin: 0; + border-radius: 3px; + padding: .25rem .5rem; + font-family: var(--code-font-family); + font-size: .85em; + color: var(--c-text-light); + background-color: var(--code-inline-bg-color) +} + +code .token.deleted { + color: #ec5975 +} + +code .token.inserted { + color: var(--c-brand) +} + +div[class*=language-] { + position: relative; + margin: 1rem -1.5rem; + background-color: var(--code-bg-color); + overflow-x: auto +} + +li>div[class*=language-] { + border-radius: 6px 0 0 6px; + margin: 1rem -1.5rem 1rem -1.25rem; + line-height: initial +} + +@media (min-width: 420px) { + div[class*=language-] { + margin:1rem 0; + border-radius: 6px + } + + li>div[class*=language-] { + margin: 1rem 0 1rem 0rem; + border-radius: 6px + } +} + +[class*=language-] pre,[class*=language-] code { + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + background: transparent +} + +[class*=language-] pre { + position: relative; + z-index: 1; + margin: 0; + padding: 1.25rem 1.5rem; + overflow-x: auto +} + +[class*=language-] code { + padding: 0; + line-height: var(--code-line-height); + font-size: var(--code-font-size); + color: #eee +} + +.highlight-lines { + position: absolute; + top: 0; + bottom: 0; + left: 0; + padding: 1.25rem 0; + width: 100%; + line-height: var(--code-line-height); + font-family: var(--code-font-family); + font-size: var(--code-font-size); + user-select: none; + overflow: hidden +} + +.highlight-lines .highlighted { + background-color: #000000a8 +} + +div[class*=language-].line-numbers-mode { + padding-left: 3.5rem +} + +.line-numbers-wrapper { + position: absolute; + top: 0; + bottom: 0; + left: 0; + z-index: 3; + border-right: 1px solid rgba(0,0,0,.5); + padding: 1.25rem 0; + width: 3.5rem; + text-align: center; + line-height: var(--code-line-height); + font-family: var(--code-font-family); + font-size: var(--code-font-size); + color: #888 +} + +div[class*=language-]:before { + position: absolute; + top: .6em; + right: 1em; + z-index: 2; + font-size: .8rem; + color: #888 +} + +div[class~=language-html]:before,div[class~=language-markup]:before { + content: "html" +} + +div[class~=language-md]:before,div[class~=language-markdown]:before { + content: "md" +} + +div[class~=language-css]:before { + content: "css" +} + +div[class~=language-sass]:before { + content: "sass" +} + +div[class~=language-scss]:before { + content: "scss" +} + +div[class~=language-less]:before { + content: "less" +} + +div[class~=language-stylus]:before { + content: "styl" +} + +div[class~=language-js]:before,div[class~=language-javascript]:before { + content: "js" +} + +div[class~=language-ts]:before,div[class~=language-typescript]:before { + content: "ts" +} + +div[class~=language-json]:before { + content: "json" +} + +div[class~=language-rb]:before,div[class~=language-ruby]:before { + content: "rb" +} + +div[class~=language-py]:before,div[class~=language-python]:before { + content: "py" +} + +div[class~=language-sh]:before,div[class~=language-bash]:before { + content: "sh" +} + +div[class~=language-php]:before { + content: "php" +} + +div[class~=language-go]:before { + content: "go" +} + +div[class~=language-rust]:before { + content: "rust" +} + +div[class~=language-java]:before { + content: "java" +} + +div[class~=language-c]:before { + content: "c" +} + +div[class~=language-yaml]:before { + content: "yaml" +} + +div[class~=language-dockerfile]:before { + content: "dockerfile" +} + +div[class~=language-vue]:before { + content: "vue" +} + +.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata { + color: #999 +} + +.token.punctuation { + color: #ccc +} + +.token.tag,.token.attr-name,.token.namespace,.token.deleted { + color: #e2777a +} + +.token.function-name { + color: #6196cc +} + +.token.boolean,.token.number,.token.function { + color: #f08d49 +} + +.token.property,.token.class-name,.token.constant,.token.symbol { + color: #f8c555 +} + +.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin { + color: #cc99cd +} + +.token.string,.token.char,.token.attr-value,.token.regex,.token.variable { + color: #7ec699 +} + +.token.operator,.token.entity,.token.url { + color: #67cdcc +} + +.token.important,.token.bold { + font-weight: 700 +} + +.token.italic { + font-style: italic +} + +.token.entity { + cursor: help +} + +.token.inserted { + color: green +} + +.custom-block.tip,.custom-block.info,.custom-block.warning,.custom-block.danger { + margin: 1rem 0; + border-left: .5rem solid; + padding: .1rem 1.5rem; + overflow-x: auto +} + +.custom-block.tip { + background-color: #f3f5f7; + border-color: var(--c-brand) +} + +.custom-block.info { + background-color: #f3f5f7; + border-color: var(--c-text-light-2) +} + +.custom-block.warning { + border-color: #e7c000; + color: #6b5900; + background-color: #ffe5644d +} + +.custom-block.warning .custom-block-title { + color: #b29400 +} + +.custom-block.warning a { + color: var(--c-text) +} + +.custom-block.danger { + border-color: #c00; + color: #4d0000; + background-color: #ffe6e6 +} + +.custom-block.danger .custom-block-title { + color: #900 +} + +.custom-block.danger a { + color: var(--c-text) +} + +.custom-block.details { + position: relative; + display: block; + border-radius: 2px; + margin: 1.6em 0; + padding: 1.6em; + background-color: #eee +} + +.custom-block.details h4 { + margin-top: 0 +} + +.custom-block.details figure:last-child,.custom-block.details p:last-child { + margin-bottom: 0; + padding-bottom: 0 +} + +.custom-block.details summary { + outline: none; + cursor: pointer +} + +.custom-block-title { + margin-bottom: -.4rem; + font-weight: 600 +} + +.sidebar-links { + margin: 0; + padding: 0; + list-style: none +} + +.sidebar-link-item { + display: block; + margin: 0; + border-left: .25rem solid transparent; + color: var(--c-text) +} + +a.sidebar-link-item:hover { + text-decoration: none; + color: var(--c-brand) +} + +a.sidebar-link-item.active { + color: var(--c-brand) +} + +.sidebar>.sidebar-links { + padding: .75rem 0 5rem +} + +@media (min-width: 720px) { + .sidebar>.sidebar-links { + padding:1.5rem 0 + } +} + +.sidebar>.sidebar-links>.sidebar-link+.sidebar-link { + padding-top: .5rem +} + +@media (min-width: 720px) { + .sidebar>.sidebar-links>.sidebar-link+.sidebar-link { + padding-top:1.25rem + } +} + +.sidebar>.sidebar-links>.sidebar-link>.sidebar-link-item { + padding: .35rem 1.5rem .35rem 1.25rem; + font-size: 1.1rem; + font-weight: 700 +} + +.sidebar>.sidebar-links>.sidebar-link>a.sidebar-link-item.active { + border-left-color: var(--c-brand); + font-weight: 600 +} + +.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-link-item { + display: block; + padding: .35rem 1.5rem .35rem 2rem; + line-height: 1.4; + font-size: 1rem; + font-weight: 400 +} + +.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>a.sidebar-link-item.active { + border-left-color: var(--c-brand); + font-weight: 600 +} + +.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-link-item { + display: block; + padding: .3rem 1.5rem .3rem 3rem; + line-height: 1.4; + font-size: .9rem; + font-weight: 400 +} + +.sidebar>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-links>.sidebar-link>.sidebar-link-item { + display: block; + padding: .3rem 1.5rem .3rem 4rem; + line-height: 1.4; + font-size: .9rem; + font-weight: 400 +} + +.wrap { + background-color: var(--c-bg-white); +} + +.dark .wrap { + background-color: var(--c-bg-black); +} \ No newline at end of file diff --git a/src/vitepress/styles/variables.css b/src/vitepress/styles/variables.css new file mode 100644 index 0000000..f06f2f8 --- /dev/null +++ b/src/vitepress/styles/variables.css @@ -0,0 +1,59 @@ +:root { + --c-bg-white: #ffffff; + --c-bg-black: #1a1a1a; + --c-text-white: #ffffff; + --c-text-black: #1a1a1a; + --c-main-color:#80adff; + --c-text-color-light:#000000; + --c-text-color-dark:#ffffff; + --c-divider-light: #e2e8f0; + --c-divider-dark: rgba(84, 84, 88, 0.48); + --c-brand: #000; + --c-brand-light: #80adff; + + --font-family-base: PingFangSC-regular, 'Microsoft Yahei', sans-serif; + --font-family-mono: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; + + --header-height: 3.6rem; + --code-bg-color: #fff; + + /* pure theme color */ + --li-dot-color: #737373; + --title-color: #334155; + --date-color: #64748b; + --date-font-family: Georgia, sans-serif; + --tag-bg: #eff6ff; + --c-white: #ffffff; + --c-white-dark: #f8f8f8; + --c-black: #000000; + --c-divider-light: rgba(60, 60, 67, .12); + --c-divider-dark: rgba(84, 84, 88, .48); + --c-text-light-1: #2c3e50; + --c-text-light-2: #476582; + --c-text-light-3: #90a4b7; + + --font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + --font-family-mono: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; + --z-index-navbar: 10; + --z-index-sidebar: 6; + --shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06); + --shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07); + --shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08); + --shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12); + --shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16); + --header-height: 3.6rem +} + +:root { + --c-divider: var(--c-divider-light); + --c-text: var(--c-text-light-1); + --c-text-light: var(--c-text-light-2); + --c-text-lighter: var(--c-text-light-3); + --c-bg: var(--c-white); + --c-bg-accent: var(--c-white-dark); + --code-line-height: 24px; + --code-font-family: var(--font-family-mono); + --code-font-size: 14px; + --code-inline-bg-color: rgba(27, 31, 35, .05); + --code-bg-color: #282c34 +} \ No newline at end of file diff --git a/test/.vitepress/config.ts b/test/.vitepress/config.ts new file mode 100644 index 0000000..4cfeb2f --- /dev/null +++ b/test/.vitepress/config.ts @@ -0,0 +1,44 @@ + +import path from 'path' +import baseConfig from '../../src/vitepress/config/baseConfig' + +async function config() { + return { + extends: baseConfig, + vite: { + build: { + minify: false + }, + resolve: { + alias: { + 'custom-vitepress-theme': path.join(__dirname, '../../src') + } + } + }, + themeConfig: { + title: 'AAAAA', + description: '自定义主题AAAA', + docRoot:'test', + hasDarkSwitch:true, + homeConfig:{ + headline:'AAAA大标题',//大标题 + headlineHeight:'AAAA高亮',//大标题高亮 + subheading:'AAAA小标题',//小标题 + subheadingHeight:'小标题高亮',//小标题高亮 + description:'自定义主题,简短banner描述',//描述 + }, + + nav: [ + { text: '首页', link: '/', icon: '' }, + { text: '归档', link: '/pages/archives', icon: '' }, + { text: '默认', link: '/pages/default', icon: '' }, + { text: '分类', link: '/pages/category', icon: '' }, + { text: '搜索', link: '/pages/search', icon: '' }, + ], + footer: { + copyright: '湘ICP备aaaaaaaa-1' + } + } + } +} +module.exports = config() diff --git a/test/.vitepress/theme/index.ts b/test/.vitepress/theme/index.ts new file mode 100644 index 0000000..34092fb --- /dev/null +++ b/test/.vitepress/theme/index.ts @@ -0,0 +1,12 @@ +import { CustomTheme } from 'custom-vitepress-theme' +import { h } from 'vue' + +import './override.css' + +export default { + ...CustomTheme, + Layout() { + return h(CustomTheme.Layout, null, { + }) + } +} diff --git a/test/.vitepress/theme/override.css b/test/.vitepress/theme/override.css new file mode 100644 index 0000000..d14bdfe --- /dev/null +++ b/test/.vitepress/theme/override.css @@ -0,0 +1,97 @@ +:root { + --c-main-color:#80adff; +} + + +/* card */ + +.news-box { + display: flex; + align-items: center; + width: 100%; + margin: 0 auto; + padding: 20px 0; +} +.news-box .card-item { + flex-basis: 25%; + padding: 15px; + transition: all 0.3s ease; +} +.news-box .card-item .item-box { + display: flex; + flex-direction: column; + align-items: center; + border-radius: 15px; + padding: 15px; + margin-bottom: 140px; + background: #f8f8fc; + transition: all 0.3s ease; +} +.news-box .card-item .item-box .icon { + font-size: 48px; + color: var(--c-main-color); +} +.news-box .card-item .item-box .title { + font-size: 18px; + line-height: 2; + font-weight: 500; + color: #020312; +} +.news-box .card-item .item-box .desc { + font-size: 16px; + line-height: 2; + color: #717e96; + overflow: hidden; +} +.news-box .card-item .item-box .desc { + font-size: 16px; + line-height: 2; + color: #717e96; +} +.news-box .card-item:hover .item-box { + background: var(--c-main-color); + transition: all 0.3s ease; +} +.news-box .card-item .item-box.active { + background: var(--c-main-color); + margin-bottom: 0; +} + +.news-box .card-item:hover .item-box .icon, +.news-box .card-item:hover .item-box .title, +.news-box .card-item:hover .item-box .desc, +.news-box .card-item .item-box.active .icon, +.news-box .card-item .item-box.active .title, +.news-box .card-item .item-box.active .desc { + color: #fff; +} +@media (max-width: 1200px) { + .banner .banner-left { + font-size: 14px; + } + .banner .banner-left .desc { + font-size: 12px; + } + .note-box { + flex-wrap: wrap; + } + .note-box .note-item { + flex-basis: 100%; + } + .news-box { + flex-wrap: wrap; + } + .news-box .card-item { + flex-basis: 100%; + } + .news-box .card-item .item-box { + margin-bottom: 0; + } + + .news-box .card-item .item-box .title { + font-size: 14px; + } + .news-box .card-item .item-box .desc { + font-size: 12px; + } +} \ No newline at end of file diff --git a/test/index.md b/test/index.md new file mode 100644 index 0000000..86129f6 --- /dev/null +++ b/test/index.md @@ -0,0 +1,95 @@ +--- +page: true +date: 2021-06-30 +title: 自定义标题 +sidebar: false +--- + + + + + + + +
+
手册
+
基础知识手册(学习基础笔记)
+
+
+
+
+
💡CSS手册
+ +
+
+
+
+
💡JS手册
+ +
+
+
+
+
💡博客
+ +
+
+
+ +
+
随笔
+
最常用随笔分类
+
+ +
+
+
+
?
+
JS笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
+
?
+
vue笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
+
?
+
服务器笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
+
?
+
浏览器笔记
+
+ 我就是记录一些笔记,以及异常处理经验记录,工作中遇到问题记录解决方案 +
+
+
+
+
\ No newline at end of file diff --git a/test/pages/archives.md b/test/pages/archives.md new file mode 100644 index 0000000..8a7f5c1 --- /dev/null +++ b/test/pages/archives.md @@ -0,0 +1,13 @@ +--- +page: true +title: Archive +description: Archive +sidebar: false +--- + + + + + \ No newline at end of file diff --git a/test/pages/category.md b/test/pages/category.md new file mode 100644 index 0000000..4ae9287 --- /dev/null +++ b/test/pages/category.md @@ -0,0 +1,13 @@ +--- +page: true +title: 分类 +description: 分类 +sidebar: false +--- + + + + + diff --git a/test/pages/default.md b/test/pages/default.md new file mode 100644 index 0000000..7d1e9ec --- /dev/null +++ b/test/pages/default.md @@ -0,0 +1,13 @@ +--- +page: true +title: 默认 +description: 默认 +sidebar: false +--- + + + + + diff --git a/test/pages/search.md b/test/pages/search.md new file mode 100644 index 0000000..6720a0e --- /dev/null +++ b/test/pages/search.md @@ -0,0 +1,11 @@ +--- +page: true +title: 搜索 +description: 全文检索 +sidebar: false +--- + + + diff --git a/test/posts/default/default.md b/test/posts/default/default.md new file mode 100644 index 0000000..42b2887 --- /dev/null +++ b/test/posts/default/default.md @@ -0,0 +1,63 @@ +--- +title: default +date: 2018-09-14 13:57:02 +category: default +tags: + - default +--- +# 主标题 + +## 副标题 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.default{ + color:red; +} +``` + +```shell +npm install default +``` + +### 副标题1 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.default{ + color:red; +} +``` + +```shell +npm install default +``` + + +#### 副标题111 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.default{ + color:red; +} +``` + +```shell +npm install default +``` diff --git a/test/posts/demo/demo.md b/test/posts/demo/demo.md new file mode 100644 index 0000000..b3a48ce --- /dev/null +++ b/test/posts/demo/demo.md @@ -0,0 +1,63 @@ +--- +title: demo +date: 2018-09-14 13:57:02 +category: demo +tags: + - demo +--- +# 主标题 + +## 副标题 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.demo{ + color:red; +} +``` + +```shell +npm install demo +``` + +### 副标题1 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.demo{ + color:red; +} +``` + +```shell +npm install demo +``` + + +#### 副标题111 + +我是内容 + +```js +let a = '我是js代码' +``` + +```css +.demo{ + color:red; +} +``` + +```shell +npm install demo +``` diff --git a/test/public/favicon.ico b/test/public/favicon.ico new file mode 100644 index 0000000..0b97428 Binary files /dev/null and b/test/public/favicon.ico differ diff --git a/test/public/img/banner.png b/test/public/img/banner.png new file mode 100644 index 0000000..c4aac89 Binary files /dev/null and b/test/public/img/banner.png differ diff --git a/test/public/img/page.png b/test/public/img/page.png new file mode 100644 index 0000000..81ac9d6 Binary files /dev/null and b/test/public/img/page.png differ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..94cc28e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist", + "allowJs": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "esModuleInterop": true, + "noUnusedLocals": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "paths": { + "custom-vitepress-theme": ["src/index.ts"] + } + }, + "include": ["src", "demo/.vitepress/theme", "test/.vitepress/theme"], + "exclude": ["node_modules"] +}