From 18e0505db55a88838e1ded066d899f16d760ceea Mon Sep 17 00:00:00 2001 From: cole Date: Tue, 22 Oct 2024 17:57:44 +0800 Subject: [PATCH 001/109] wip: custom vitepress theme --- .eslintignore | 4 - .eslintrc.cjs | 8 - .gitignore | 34 +- .npmrc | 2 - .vitepress/config.ts | 73 + .vitepress/theme/index.ts | 3 + .vscode/extensions.json | 3 + LICENSE | 21 - README.en.md | 56 - README.md | 57 +- app.config.ts | 43 - components/content/AppLoadingBar.vue | 107 - components/content/AppSearch.vue | 90 - components/content/Comment.vue | 44 - components/content/DocsPageLayout.vue | 287 - components/content/DocumentDrivenNotFound.vue | 119 - components/content/Introduction.vue | 36 - components/content/Logo.vue | 10 - components/content/ProseA.vue | 60 - components/content/Shake.vue | 36 - components/custom/CodeHighlight.vue | 64 - components/custom/Collapse.vue | 39 - components/custom/CollectionItem.vue | 46 - .../PlayerBarDemo.vue | 120 - content/0.blog/front-end/_dir.yml | 3 - content/0.blog/front-end/ast-in-js-ts.md | 1323 -- .../0.blog/front-end/controlled-ref-in-vue.md | 24 - .../failed-type-in-unplugin-vue-components.md | 56 - ...ng-styles-of-elements-with-display-none.md | 87 - .../infer-return-type-from-object.md | 106 - .../front-end/regex-lookahead-lookbehind.md | 21 - .../text-overflow-handling-in-display-flex.md | 192 - content/0.blog/others/_dir.yml | 2 - content/0.blog/others/poor-man-package.md | 7 - .../0.blog/others/why-i-like-atomic-css.md | 36 - content/1.stereotyped-writing/_dir.yml | 1 - .../1.stereotyped-writing/browser/_dir.yml | 2 - .../browser/browser-cache.md | 112 - .../browser/repaint-and-reflow.md | 74 - content/1.stereotyped-writing/css/_dir.yml | 2 - .../css/css-box-model.md | 172 - .../1.stereotyped-writing/javascript/_dir.yml | 2 - .../javascript/closure.md | 54 - .../execution-context-stack-and-scope.md | 123 - .../javascript/generator-function.md | 140 - .../javascript/js-data-types.md | 19 - .../javascript/promise-the-microtask.md | 185 - .../javascript/prototype-and-extends-in-js.md | 107 - .../1.stereotyped-writing/modules/_dir.yml | 2 - .../modules/modules-compare.md | 99 - .../modules/require-theory.md | 37 - .../1.stereotyped-writing/network/_dir.yml | 2 - .../differences-between-get-and-post.md | 16 - .../network/from-url-to-page.md | 45 - .../network/http-protocol.md | 94 - .../network/tcp-connect.md | 133 - .../performance/_dir.yml | 2 - .../performance/event-tracking.md | 71 - .../performance/optimization-practices.md | 18 - .../1.stereotyped-writing/security/_dir.yml | 2 - .../security/xss-sql-csrf.md | 32 - .../1.stereotyped-writing/typescript/_dir.yml | 2 - .../typescript/this-pseudo-parameter-in-ts.md | 11 - content/1.stereotyped-writing/vue/_dir.yml | 2 - .../vue/communications-between-components.md | 41 - content/1.stereotyped-writing/vue/vuex.md | 19 - .../1.stereotyped-writing/webpack/_dir.yml | 1 - ...ow-does-webpack-achieve-dynamic-imports.md | 21 - .../webpack/webpack-loader.md | 37 - content/index.md | 25 - eslint.config.js | 7 + index.html | 13 + nuxt.config.ts | 30 - package.json | 58 +- pnpm-lock.yaml | 14286 +++++----------- preset.shadcn.ts | 111 + public/avatar-wink.webp | Bin 108042 -> 0 bytes public/vite.svg | 1 + renovate.json | 8 - {public => src}/avatar.webp | Bin .../blog}/front-end/ts-inferring-type.md | 7 +- .../0.blog/0.tricks.md => src/blog/tricks.md | 96 +- {public => src}/favicon.ico | Bin src/index.md | 27 + {public => src}/logo.webp | Bin styles/gitalk-overwrite.css | 144 - theme/Layout.vue | 25 + theme/components/BButton.vue | 38 + theme/components/BNav.vue | 31 + theme/index.ts | 8 + theme/styles/var.css | 3 + theme/types.ts | 6 + tokens.config.ts | 6 - tsconfig.app.json | 24 + tsconfig.json | 6 +- tsconfig.node.json | 22 + uno.config.ts | 26 +- utils/color.ts | 14 - utils/index.ts | 1 - vercel.json | 14 + vite.config.ts | 7 + 101 files changed, 4869 insertions(+), 15074 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.cjs delete mode 100644 .npmrc create mode 100644 .vitepress/config.ts create mode 100644 .vitepress/theme/index.ts create mode 100644 .vscode/extensions.json delete mode 100644 LICENSE delete mode 100644 README.en.md delete mode 100644 app.config.ts delete mode 100644 components/content/AppLoadingBar.vue delete mode 100644 components/content/AppSearch.vue delete mode 100644 components/content/Comment.vue delete mode 100644 components/content/DocsPageLayout.vue delete mode 100644 components/content/DocumentDrivenNotFound.vue delete mode 100644 components/content/Introduction.vue delete mode 100644 components/content/Logo.vue delete mode 100644 components/content/ProseA.vue delete mode 100644 components/content/Shake.vue delete mode 100644 components/custom/CodeHighlight.vue delete mode 100644 components/custom/Collapse.vue delete mode 100644 components/custom/CollectionItem.vue delete mode 100644 components/demo/text-overflow-handling-in-display-flex/PlayerBarDemo.vue delete mode 100644 content/0.blog/front-end/_dir.yml delete mode 100644 content/0.blog/front-end/ast-in-js-ts.md delete mode 100644 content/0.blog/front-end/controlled-ref-in-vue.md delete mode 100644 content/0.blog/front-end/failed-type-in-unplugin-vue-components.md delete mode 100644 content/0.blog/front-end/getting-styles-of-elements-with-display-none.md delete mode 100644 content/0.blog/front-end/infer-return-type-from-object.md delete mode 100644 content/0.blog/front-end/regex-lookahead-lookbehind.md delete mode 100644 content/0.blog/front-end/text-overflow-handling-in-display-flex.md delete mode 100644 content/0.blog/others/_dir.yml delete mode 100644 content/0.blog/others/poor-man-package.md delete mode 100644 content/0.blog/others/why-i-like-atomic-css.md delete mode 100644 content/1.stereotyped-writing/_dir.yml delete mode 100644 content/1.stereotyped-writing/browser/_dir.yml delete mode 100644 content/1.stereotyped-writing/browser/browser-cache.md delete mode 100644 content/1.stereotyped-writing/browser/repaint-and-reflow.md delete mode 100644 content/1.stereotyped-writing/css/_dir.yml delete mode 100644 content/1.stereotyped-writing/css/css-box-model.md delete mode 100644 content/1.stereotyped-writing/javascript/_dir.yml delete mode 100644 content/1.stereotyped-writing/javascript/closure.md delete mode 100644 content/1.stereotyped-writing/javascript/execution-context-stack-and-scope.md delete mode 100644 content/1.stereotyped-writing/javascript/generator-function.md delete mode 100644 content/1.stereotyped-writing/javascript/js-data-types.md delete mode 100644 content/1.stereotyped-writing/javascript/promise-the-microtask.md delete mode 100644 content/1.stereotyped-writing/javascript/prototype-and-extends-in-js.md delete mode 100644 content/1.stereotyped-writing/modules/_dir.yml delete mode 100644 content/1.stereotyped-writing/modules/modules-compare.md delete mode 100644 content/1.stereotyped-writing/modules/require-theory.md delete mode 100644 content/1.stereotyped-writing/network/_dir.yml delete mode 100644 content/1.stereotyped-writing/network/differences-between-get-and-post.md delete mode 100644 content/1.stereotyped-writing/network/from-url-to-page.md delete mode 100644 content/1.stereotyped-writing/network/http-protocol.md delete mode 100644 content/1.stereotyped-writing/network/tcp-connect.md delete mode 100644 content/1.stereotyped-writing/performance/_dir.yml delete mode 100644 content/1.stereotyped-writing/performance/event-tracking.md delete mode 100644 content/1.stereotyped-writing/performance/optimization-practices.md delete mode 100644 content/1.stereotyped-writing/security/_dir.yml delete mode 100644 content/1.stereotyped-writing/security/xss-sql-csrf.md delete mode 100644 content/1.stereotyped-writing/typescript/_dir.yml delete mode 100644 content/1.stereotyped-writing/typescript/this-pseudo-parameter-in-ts.md delete mode 100644 content/1.stereotyped-writing/vue/_dir.yml delete mode 100644 content/1.stereotyped-writing/vue/communications-between-components.md delete mode 100644 content/1.stereotyped-writing/vue/vuex.md delete mode 100644 content/1.stereotyped-writing/webpack/_dir.yml delete mode 100644 content/1.stereotyped-writing/webpack/how-does-webpack-achieve-dynamic-imports.md delete mode 100644 content/1.stereotyped-writing/webpack/webpack-loader.md delete mode 100644 content/index.md create mode 100644 eslint.config.js create mode 100644 index.html delete mode 100644 nuxt.config.ts create mode 100644 preset.shadcn.ts delete mode 100644 public/avatar-wink.webp create mode 100644 public/vite.svg delete mode 100644 renovate.json rename {public => src}/avatar.webp (100%) rename {content/0.blog => src/blog}/front-end/ts-inferring-type.md (87%) rename content/0.blog/0.tricks.md => src/blog/tricks.md (67%) rename {public => src}/favicon.ico (100%) create mode 100644 src/index.md rename {public => src}/logo.webp (100%) delete mode 100644 styles/gitalk-overwrite.css create mode 100644 theme/Layout.vue create mode 100644 theme/components/BButton.vue create mode 100644 theme/components/BNav.vue create mode 100644 theme/index.ts create mode 100644 theme/styles/var.css create mode 100644 theme/types.ts delete mode 100644 tokens.config.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.node.json delete mode 100644 utils/color.ts delete mode 100644 utils/index.ts create mode 100644 vercel.json create mode 100644 vite.config.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index a1bd0c8..0000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -node_modules -.output -.nuxt \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index eefac9a..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - root: true, - extends: ["@bernankez", "@bernankez/unocss"], - rules: { - "vue/max-attributes-per-line": "off", - "vue/multi-word-component-names": "off", - }, -}; diff --git a/.gitignore b/.gitignore index 69f6b69..e778ca8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + node_modules -*.iml +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json .idea -*.log* -.nuxt -.vscode .DS_Store -coverage -dist -sw.* -.env -.output +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# vitepress +.vitepress/dist +.vitepress/cache \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index cf04042..0000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -shamefully-hoist=true -strict-peer-dependencies=false diff --git a/.vitepress/config.ts b/.vitepress/config.ts new file mode 100644 index 0000000..a2ef7cc --- /dev/null +++ b/.vitepress/config.ts @@ -0,0 +1,73 @@ +import UnoCSS from "unocss/vite"; +import { defineConfig } from "vitepress"; + +// https://vitepress.dev/reference/site-config +export default async () => { + return defineConfig({ + lang: "zh-CN", + title: "科科Cole", + titleTemplate: ":title · 科科Cole", + description: "Cole.blog", + head: [ + ["link", { rel: "icon", href: "/favicon.ico" }], + ], + srcDir: "src", + cleanUrls: true, + lastUpdated: true, + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + logo: "/logo.webp", + editLink: { + text: "在GitHub上编辑", + pattern: "https://github.com/bernankez/blog/edit/master/src/:path", + }, + lastUpdated: { + text: "上次更新于", + formatOptions: { + dateStyle: "full", + timeStyle: "medium", + }, + }, + search: { + provider: "algolia", + options: { + apiKey: "f3c4b78009a6ed7d455512effbadf33a", + appId: "4U4R8B36SX", + indexName: "keke", + }, + }, + docFooter: { + prev: "上一页", + next: "下一页", + }, + darkModeSwitchLabel: "外观", + darkModeSwitchTitle: "切换到深色模式", + lightModeSwitchTitle: "切换到浅色模式", + returnToTopLabel: "回到顶部", + externalLinkIcon: true, + nav: [ + { text: "Blog", link: "/blog/tricks", activeMatch: "/blog/" }, + { text: "八股文", link: "/stereotyped-writing", activeMatch: "/stereotyped-writing/" }, + ], + + sidebar: [ + { + text: "Blog", + items: [ + { text: "小技巧", link: "/blog/tricks" }, + { text: "TS重载类型推断", link: "/blog/front-end/ts-inferring-type" }, + ], + }, + ], + + socialLinks: [ + { icon: "github", link: "https://github.com/Bernankez/blog" }, + ], + }, + vite: { + plugins: [UnoCSS()], + }, + }); +}; + +// function generateRoutes() {} diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts new file mode 100644 index 0000000..e84f87e --- /dev/null +++ b/.vitepress/theme/index.ts @@ -0,0 +1,3 @@ +import theme from "../../theme"; + +export default theme; diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 4e6951d..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 科科 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.en.md b/README.en.md deleted file mode 100644 index ac3264e..0000000 --- a/README.en.md +++ /dev/null @@ -1,56 +0,0 @@ -# 科科Cole's Blog - -**[blog.keke.cc](https://blog.keke.cc/)** - -Powered by Docus - -[中文](./README.md) | English - -## Comments - -The comment has been placed in [blog-comment/issue](https://github.com/Bernankez/blog-comment/issues). - -## License - -Code is licensed under [MIT](./LICENSE). - -Words and images are licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). - -## Document - - -Framework | -Docus · -nuxt/content · -Nuxt - -
- -Search Engine | -crawler · -DocSearch API · -@nuxtjs/algolia · -algolia - -
- -Image Hosting | -smms - -
- -Icons | -Icônes · -Iconify - -
- -Syntax | -MDC Syntax - - -## Contribution - -1. Run `pnpm install` in the root folder. - -2. Run `pnpm dev` to start the development server. diff --git a/README.md b/README.md index 97d9aa3..33895ab 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,5 @@ -# 科科Cole的博客 +# Vue 3 + TypeScript + Vite -**[blog.keke.cc](https://blog.keke.cc/)** +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` - - diff --git a/components/content/AppSearch.vue b/components/content/AppSearch.vue deleted file mode 100644 index d128405..0000000 --- a/components/content/AppSearch.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - diff --git a/components/content/Comment.vue b/components/content/Comment.vue deleted file mode 100644 index 7819bc6..0000000 --- a/components/content/Comment.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - - - diff --git a/components/content/DocsPageLayout.vue b/components/content/DocsPageLayout.vue deleted file mode 100644 index 38948aa..0000000 --- a/components/content/DocsPageLayout.vue +++ /dev/null @@ -1,287 +0,0 @@ - - - - - diff --git a/components/content/DocumentDrivenNotFound.vue b/components/content/DocumentDrivenNotFound.vue deleted file mode 100644 index 83ee82c..0000000 --- a/components/content/DocumentDrivenNotFound.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - diff --git a/components/content/Introduction.vue b/components/content/Introduction.vue deleted file mode 100644 index a84f64c..0000000 --- a/components/content/Introduction.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/components/content/Logo.vue b/components/content/Logo.vue deleted file mode 100644 index a3d8396..0000000 --- a/components/content/Logo.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/components/content/ProseA.vue b/components/content/ProseA.vue deleted file mode 100644 index 353f0c8..0000000 --- a/components/content/ProseA.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - diff --git a/components/content/Shake.vue b/components/content/Shake.vue deleted file mode 100644 index 06a6762..0000000 --- a/components/content/Shake.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/components/custom/CodeHighlight.vue b/components/custom/CodeHighlight.vue deleted file mode 100644 index 51b1214..0000000 --- a/components/custom/CodeHighlight.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - - - diff --git a/components/custom/Collapse.vue b/components/custom/Collapse.vue deleted file mode 100644 index b82beea..0000000 --- a/components/custom/Collapse.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - - - diff --git a/components/custom/CollectionItem.vue b/components/custom/CollectionItem.vue deleted file mode 100644 index 31dba26..0000000 --- a/components/custom/CollectionItem.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - diff --git a/components/demo/text-overflow-handling-in-display-flex/PlayerBarDemo.vue b/components/demo/text-overflow-handling-in-display-flex/PlayerBarDemo.vue deleted file mode 100644 index 2ae440b..0000000 --- a/components/demo/text-overflow-handling-in-display-flex/PlayerBarDemo.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/content/0.blog/front-end/_dir.yml b/content/0.blog/front-end/_dir.yml deleted file mode 100644 index 496f6f5..0000000 --- a/content/0.blog/front-end/_dir.yml +++ /dev/null @@ -1,3 +0,0 @@ -title: 前端 -icon: icon-park-outline:browser -navigation.redirect: /blog/front-end/ts-inferring-type diff --git a/content/0.blog/front-end/ast-in-js-ts.md b/content/0.blog/front-end/ast-in-js-ts.md deleted file mode 100644 index a43e0aa..0000000 --- a/content/0.blog/front-end/ast-in-js-ts.md +++ /dev/null @@ -1,1323 +0,0 @@ ---- -title: JS/TS中的AST节点类型示例 ---- - -# JS/TS中的AST节点类型示例 - -::alert -Reference: -
-[JavaScript抽象语法树AST](https://juejin.cn/post/6844903798347939853) -
-[estree](https://github.com/estree/estree/tree/master) -:: - -::alert{type="warning"} -目前仍然缺少很多ts节点定义 -:: - -之前在写eslint规则的时候,需要去判断AST节点类型,但是有很多AST节点类型的定义我找不到。这里列一些我通过[AST explorer](https://astexplorer.net/)试出来的节点定义([estree](https://github.com/estree/estree/tree/master)中有js节点定义,但是缺少ts节点定义)。 - ---- - -以下例子中高亮的部分为类型对应的节点(Node): - -### ArrayExpression -::CodeHighlight ---- -code: const a = []; -highlight: '[]' ---- -:: - -### ArrayPattern -::CodeHighlight ---- -code: const [ a, b ] = [ 1, 2 ]; -highlight: '[ a, b ]' ---- -:: - -### ArrowFunctionExpression -::CodeHighlight ---- -code: const a = () => {}; -highlight: () => {} ---- -:: - -### AssignmentExpression -::CodeHighlight ---- -code: "let a;\na = 1;" -highlight: 'a = 1' ---- -:: - -### AssignmentPattern -::CodeHighlight ---- -code: const [a, b = 4] = [1, null]; -highlight: b = 4 ---- -:: - -### AwaitExpression -::CodeHighlight ---- -code: "async function a() {\n -  const b = await a();\n -}" -highlight: await a() ---- -:: - -### BigIntLiteral -::CodeHighlight ---- -code: const a = 123123n; -highlight: 123123n ---- -:: - -### BinaryExpression -::CodeHighlight ---- -code: const a = a + 1; -highlight: a + 1 ---- -:: - -### BlockStatement -::CodeHighlight ---- -code: '{}' -highlight: '{}' ---- -:: - -### BreakStatement -::CodeHighlight ---- -code: "switch(a) {\n -  case '1':\n -    break;\n -}" -highlight: break ---- -:: - -### CallExpression -::CodeHighlight ---- -code: a() -highlight: a() ---- -:: - -### CatchClause -::CodeHighlight ---- -code: try{ }catch(e){ } -highlight: catch(e){ } ---- -:: - -### ChainExpression -可选链 -::CodeHighlight ---- -code: a?.a -highlight: a?.a ---- -:: - -### ClassBody -::CodeHighlight ---- -code: class Test {} -highlight: '{}' ---- -:: - -### ClassDeclaration -::CodeHighlight ---- -code: class Test {} -highlight: class Test {} ---- -:: - -### ClassExpression -::CodeHighlight ---- -code: const a = class {}; -highlight: class {} ---- -:: - -### ConditionalExpression -::CodeHighlight ---- -code: 'const a = b ? c : d;' -highlight: 'b ? c : d' ---- -:: - -### ContinueStatement -::CodeHighlight ---- -code: "for(let i = 0; i < 1; i++){\n -  continue;\n -}" -highlight: continue ---- -:: - -### DebuggerStatement -::CodeHighlight ---- -code: debugger; -highlight: debugger ---- -:: - -### Decorator -::CodeHighlight ---- -code: "@component\n -const a = 1;" -highlight: '@component' ---- -:: - -### DoWhileStatement -::CodeHighlight ---- -code: do { } while(1) -highlight: do { } while(1) ---- -:: - -### EmptyStatement -::CodeHighlight ---- -code: ; -highlight: ; ---- -:: - -### ExportAllDeclaration -::CodeHighlight ---- -code: export * from ''; -highlight: export * from '' ---- -:: - -### ExportDefaultDeclaration -::CodeHighlight ---- -code: export default ''; -highlight: export default '' ---- -:: - -### ExportNamedDeclaration -::CodeHighlight ---- -code: export const a = 1; -highlight: export const a = 1 ---- -:: - -### ExportSpecifier -::CodeHighlight ---- -code: export { a } from ''; -highlight: a ---- -:: - -### ExpressionStatement -::CodeHighlight ---- -code: "a = 1;\n -(function () {});" -highlight: ['a = 1','(function () {})'] ---- -:: - -### ForInStatement -::CodeHighlight ---- -code: for(let a in 3) {} -highlight: for(let a in 3) {} ---- -:: - -### ForOfStatement -::CodeHighlight ---- -code: for(let a of []) {} -highlight: for(let a of []) {} ---- -:: - -### ForStatement -::CodeHighlight ---- -code: for(let a = 0; a < 1; a++) {} -highlight: for(let a = 0; a < 1; a++) {} ---- -:: - -### FunctionDeclaration -::CodeHighlight ---- -code: function a() {} -highlight: function a() {} ---- -:: - -### FunctionExpression -::CodeHighlight ---- -code: const a = function() {}; -highlight: function() {} ---- -:: - -### Identifier -任何标识符, 如变量名,属性名,函数名 -::CodeHighlight ---- -code: const a = 1; -highlight: a ---- -:: - -### IfStatement -::CodeHighlight ---- -code: if(a) {} -highlight: if(a) {} ---- -:: - -### ImportDeclaration -::CodeHighlight ---- -code: import a from ''; -highlight: import a from '' ---- -:: - -### ImportDefaultSpecifier -::CodeHighlight ---- -code: import a from ''; -highlight: a ---- -:: - -### ImportExpression -::CodeHighlight ---- -code: import('') -highlight: import('') ---- -:: - -### ImportNamespaceSpecifier -::CodeHighlight ---- -code: "import * as a from '';" -highlight: '* as a' ---- -:: - -### ImportSpecifier -::CodeHighlight ---- -code: import { a } from '' -highlight: a ---- -:: - -### JSXAttribute -::CodeHighlight ---- -code: const a = ; -highlight: name='' ---- -:: - -### JSXClosingElement -::CodeHighlight ---- -code: const a = -highlight: ---- -:: - -### JSXClosingFragment -::CodeHighlight ---- -code: const a = <> -highlight: ---- -:: - -### JSXElement -::CodeHighlight ---- -code: "const a = \n -const a = " -highlight: ["", ""] ---- -:: - -### JSXEmptyExpression -::CodeHighlight ---- -code: const a = { } -highlight: ' ' ---- -:: - -### JSXExpressionContainer -::CodeHighlight ---- -code: const a = { } -highlight: '{ }' ---- -:: - -### JSXFragment -::CodeHighlight ---- -code: const a = <> -highlight: <> ---- -:: - -### JSXIdentifier -::CodeHighlight ---- -code: const b = -highlight: a ---- -:: - -### JSXMemberExpression -::CodeHighlight ---- -code: const a = -highlight: A.a ---- -:: - -### JSXOpeningElement -::CodeHighlight ---- -code: const a = -highlight: ---- -:: - -### JSXOpeningFragment -::CodeHighlight ---- -code: const a = <> -highlight: <> ---- -:: - -### JSXSpreadAttribute -::CodeHighlight ---- -code: const a = -highlight: '{...a}' ---- -:: - -### JSXSpreadChild -::CodeHighlight ---- -code: const a = {...a} -highlight: '{...a}' ---- -:: - -### JSXText -::CodeHighlight ---- -code: const a = text -highlight: text ---- -:: - -### LabeledStatement -::CodeHighlight ---- -code: label:a -highlight: label:a ---- -:: - -### Literal -字面量 -::CodeHighlight ---- -code: '1' -highlight: '1' ---- -:: - -### LogicalExpression -::CodeHighlight ---- -code: "a && b\n -a || b" -highlight: ["a && b", "a || b"] ---- -:: - -### MemberExpression -::CodeHighlight ---- -code: a.a -highlight: a.a ---- -:: - -### MetaProperty -::CodeHighlight ---- -code: "new.target\n -import.meta" -highlight: ["new.target", "import.meta"] ---- -:: - -### MethodDefinition -::CodeHighlight ---- -code: class Test { a(){ } } -highlight: a(){ } ---- -:: - -### NewExpression -::CodeHighlight ---- -code: new Test(); -highlight: new Test() ---- -:: - -### ObjectExpression -::CodeHighlight ---- -code: const a = { }; -highlight: '{ }' ---- -:: - -### ObjectPattern -::CodeHighlight ---- -code: 'const { a, b } = { a: 1, b: 2};' -highlight: '{ a, b }' ---- -:: - -### Program -表示完整源码树 -::CodeHighlight ---- -code: '{ sourceType: "script" || "module", body: [] }' -highlight: '{ sourceType: "script" || "module", body: [] }' ---- -:: - -### Property -::CodeHighlight ---- -code: 'const a = { a: 1 };' -highlight: 'a: 1' ---- -:: - -### PropertyDefinition -::CodeHighlight ---- -code: class Test { a = 1 } -highlight: a = 1 ---- -:: - -### RestElement -::CodeHighlight ---- -code: const [ a, b, ...c ] = [ 1, 2, 3, 4 ]; -highlight: ...c ---- -:: - -### ReturnStatement -::CodeHighlight ---- -code: return -highlight: return ---- -:: - -### SequenceExpression -::CodeHighlight ---- -code: "a, b\n -a = 1, b = 2" -highlight: ["a, b", "a = 1, b = 2"] ---- -:: - -### SpreadElement -::CodeHighlight ---- -code: "const a = [ 1, ...b ]\n -const a = { a: 1, ...b }" -highlight: ...b ---- -:: - -### Super -::CodeHighlight ---- -code: "class bar extends foo {\n -  constructor() {\n -    super();\n -  }\n -}" -highlight: super ---- -:: - -### SwitchCase -::CodeHighlight ---- -code: "switch(a){\n -  case '1':\n -    break;\n -  default:\n -}" -highlight: ["case '1':", "break;", "default:"] ---- -:: - -### SwitchStatement -::CodeHighlight ---- -code: "switch(a){\n -  case '1':\n -    break;\n -  default:\n -}" -highlight: "switch(a){\n -  case '1':\n -    break;\n -  default:\n -}" ---- -:: - -### TaggedTemplateExpression -::CodeHighlight ---- -code: foo`test` -highlight: foo`test` ---- -:: - -### TemplateElement -::CodeHighlight ---- -code: foo`test` -highlight: test ---- -:: - -### TemplateLiteral -::CodeHighlight ---- -code: foo`test` -highlight: "`test`" ---- -:: - -### ThisExpression -::CodeHighlight ---- -code: this -highlight: this ---- -:: - -### ThrowStatement -::CodeHighlight ---- -code: throw new Error -highlight: throw new Error ---- -:: - -### TryStatement -::CodeHighlight ---- -code: try{ }catch(e) { } -highlight: try{ }catch(e) { } ---- -:: - -### TSAbstractKeyword -这个不确定 -::CodeHighlight ---- -code: abstract class Test { } -highlight: abstract ---- -:: - -### TSAbstractMethodDefinition -::CodeHighlight ---- -code: "abstract class Test {\n -  public abstract a(): void\n -}" -highlight: "public abstract a(): void" ---- -:: - -### TSAbstractPropertyDefinition -::CodeHighlight ---- -code: "abstract class Test {\n -  public abstract a: number\n -}" -highlight: "public abstract a: number" ---- -:: - -### TSAnyKeyword -::CodeHighlight ---- -code: 'let a: any;' -highlight: any ---- -:: - -### TSArrayType -::CodeHighlight ---- -code: 'let a: string[];' -highlight: string[] ---- -:: - -### TSAsExpression -::CodeHighlight ---- -code: "let a = '' as number;" -highlight: "'' as number" ---- -:: - -### TSAsyncKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSBigIntKeyword -::CodeHighlight ---- -code: 'let a: bigint;' -highlight: bigint ---- -:: - -### TSBooleanKeyword -::CodeHighlight ---- -code: 'let a: boolean;' -highlight: boolean ---- -:: - -### TSCallSignatureDeclaration -::CodeHighlight ---- -code: 'type Greet = { (name: string): void }' -highlight: '(name: string): void' ---- -:: - -### TSClassImplements -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSConditionalType -::CodeHighlight ---- -code: 'type A = T extends U ? true : false;' -highlight: 'T extends U ? true : false' ---- -:: - -### TSConstructorType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSConstructSignatureDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSDeclareFunction -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSDeclareKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSEmptyBodyFunctionExpression -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSEnumDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSEnumMember -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSExportAssignment -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSExportKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSExternalModuleReference -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSFunctionType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSImportEqualsDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSImportType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSIndexedAccessType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSIndexSignature -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSInferType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSInterfaceBody -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSInterfaceDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSInterfaceHeritage -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSIntersectionType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSLiteralType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSMappedType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSMethodSignature -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSModuleBlock -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSModuleDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSNamespaceExportDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSNeverKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: -### TSNonNullExpression -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSNullKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSNumberKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSObjectKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: -### TSOptionalType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSParameterProperty -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSPrivateKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSPropertySignature -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSProtectedKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSPublicKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSQualifiedName -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSReadonlyKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSRestType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSStaticKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSStringKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSSymbolKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSThisType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTupleType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeAliasDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeAnnotation -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeAssertion -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeLiteral -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeOperator -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeParameter -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeParameterDeclaration -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeParameterInstantiation -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypePredicate -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeQuery -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSTypeReference -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSUndefinedKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSUnionType -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSUnknownKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### TSVoidKeyword -::CodeHighlight ---- -code: -highlight: ---- -:: - -### UnaryExpression -::CodeHighlight ---- -code: "!a\n -typeof\n -delete\n -void 0" -highlight: ["!a", "typeof", "delete", "void 0"] ---- -:: - -### UpdateExpression -::CodeHighlight ---- -code: "a++\n -a--" -highlight: ["a++", "a--"] ---- -:: - -### VariableDeclaration -::CodeHighlight ---- -code: let a = 1; -highlight: let a = 1 ---- -:: - -### VariableDeclarator -::CodeHighlight ---- -code: let a = 1; -highlight: a = 1 ---- -:: - -### WhileStatement -::CodeHighlight ---- -code: while(1){ } -highlight: while(1){ } ---- -:: - -### WithStatement -::CodeHighlight ---- -code: with(a){ } -highlight: with(a){ } ---- -:: - -### YieldExpression -::CodeHighlight ---- -code: "function* gen(x) {\n -  const y = yield x + 2;\n -  return y;\n -}" -highlight: yield x + 2 ---- -:: diff --git a/content/0.blog/front-end/controlled-ref-in-vue.md b/content/0.blog/front-end/controlled-ref-in-vue.md deleted file mode 100644 index 5d28eaf..0000000 --- a/content/0.blog/front-end/controlled-ref-in-vue.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Vue的受控ref ---- - -# Vue的受控ref - -::list{type="info"} -这里的ref指的是作用在attribute上的ref(`
something
`) -:: - -除了我们普通的绑定ref的写法,Vue的ref还支持自定义存储位置 - -::alert -![](https://s2.loli.net/2023/03/28/vzM92iAWfc3ngye.png) - -Reference: [ref - Vue.js](https://cn.vuejs.org/api/built-in-special-attributes.html#ref) -:: - -ref的类型定义: -```ts -export declare type VNodeRef = string | Ref | ((ref: Element | ComponentPublicInstance | null, refs: Record) => void); -``` - -这种受控ref在一些特殊情况下会很有用。比如一般我们在使用组件库的`table`组件时,可能需要通过传`slot`,或`columns`之类的属性来定义列。如果这时我们想对自定义列中的元素绑定ref,由于这里不是直接对列进行`v-for`(`
`),因此我们无法获取到对应的ref数组,只会拿到一个单一的VueInstance。此时我们可以通过定义函数ref对每一个ref单独存储。 \ No newline at end of file diff --git a/content/0.blog/front-end/failed-type-in-unplugin-vue-components.md b/content/0.blog/front-end/failed-type-in-unplugin-vue-components.md deleted file mode 100644 index 0659177..0000000 --- a/content/0.blog/front-end/failed-type-in-unplugin-vue-components.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: unplugin-vue-components自动导入的组件类型失效问题 ---- - -# `unplugin-vue-components`自动导入的组件类型失效问题 - -`unplugin-vue-components`在[`0.25.1`](https://github.com/unplugin/unplugin-vue-components/releases/tag/v0.25.1)版本中恢复了从`vue`而不是`@vue/runtime-core`中导出类型。[`Volar`](https://github.com/vuejs/language-tools/blob/6f850196d6b9cd1bee62104d3d92867cf0b6777e/extensions/vscode/README.md?plain=1#L94C38-L94C38)中目前也是这么推荐的。但是我遇到了[这个issue](https://github.com/vuejs/language-tools/issues/3383)中的问题。也就是当同时使用`unplugin-auto-import`和`unplugin-vue-components`时,并且`unplugin-auto-import`的`vueTemplate`设置为`true`,并且`tsconfig`中`components.d.ts`排在`auto-imports.d.ts`后面时会识别不到`GlobalComponents`类型。解决方法如issue中提到的,将`auto-imports.d.ts`放在`tsconfig`的`include`的最后一项即可。 - -目前仍然困扰的是[`vue-router`](https://github.com/vuejs/router/blob/c396d14b57be0da1e3504856e89d282f0666242f/packages/router/src/globalExtensions.ts#L11-L12)中仍然在通过`@vue/runtime-core`导出类型。不过Vue的[这个PR](https://github.com/vuejs/core/pull/3399)已经有了进展,或许3.4.0会修复这个相关问题? - ---- - -::collapse{title="原文" desc="2023-05-06"} -#content -VSCode中我们使用Volar作为Vue3的extension,这是前提。 - -我们都知道,ts中重复声明的interface会合并,可以实现接口的扩展。Volar就是基于重复声明`GlobalComponents`接口实现全局组件类型提示的。 -当使用Vue3时,unplugin-vue-components自动生成的类型文件长这样: -```typescript -import '@vue/runtime-core' - -export {} - -declare module '@vue/runtime-core' { - export interface GlobalComponents { - // global components - } -} -``` -从`vue/language-tools(volar)`的[源码](https://github.com/vuejs/language-tools/blob/dd1165b2456fcf3ef3f8b85e31172167afd99ed7/packages/vue-language-core/src/utils/directorySharedTypes.ts#LL37C35-L37C35)中我们可以看到,Volar是从`vue` `@vue/runtime-core` `@vue/runtime-dom`模块中导入`GlobalComponents`类型的。同时从Volar的[`README`](https://github.com/vuejs/language-tools/blob/dd1165b2456fcf3ef3f8b85e31172167afd99ed7/packages/vscode-vue/README.md?plain=1#L94)中我们也看到,Volar推荐在Vue3中从`@vue/runtime-core`模块中声明导出`GlobalComponents`。这一点是因为`README`中提到的一个vue的PR:https://github.com/vuejs/vue-next/pull/3399 。从这个PR的[这一行](https://github.com/vuejs/core/pull/3399/files#diff-46d7b958db6ca7a29e38904ab7a843ef8bbee73e3adcc435e2d2979b76c98e92R110)中我们可以看到,`GlobalComponents`是从`runtime-core/src/component.ts`导出的,这也是为什么Volar要我们从`@vue/runtime-core`中导出`GlobalComponents`接口。但是这个PR到目前为止都没有被合并,所以算是Volar为未来做的一个铺垫。 - -因此,回到我们的`unplugin-vue-components`导入的组件没有类型提示上, -我们可以从vue的`package.json`中看到,vue的`dependencies`里目前并没有`@vue/runtime-core`。如果你使用的是pnpm,pnpm为了避免幽灵依赖,默认是不会依赖提升的,这也就导致了`unplugin-vue-components`声明的类型文件中的`import '@vue/runtime-core'`无效。因此我们解决方法有两种: -1. 提升依赖 - -可以通过在`.npmrc`中声明`public-hoist-pattern`或者`shamefully-hoist`提升依赖: -``` -public-hoist-pattern[]=*@vue/runtime-core* -# 或者 -shamefully-hoist=true -``` - -::alert -Reference:
-[public-hoist-pattern](https://pnpm.io/zh/npmrc#public-hoist-pattern)
-[shamefully-hoist](https://pnpm.io/zh/npmrc#shamefully-hoist) -:: - -2. 直接安装`@vue/runtime-core` - -```sh -pnpm add -D @vue/runtime-core -``` -将`@vue/runtime-core`添加到项目的`devDependencies`,上面的导入就生效了。 - -:: \ No newline at end of file diff --git a/content/0.blog/front-end/getting-styles-of-elements-with-display-none.md b/content/0.blog/front-end/getting-styles-of-elements-with-display-none.md deleted file mode 100644 index 478858c..0000000 --- a/content/0.blog/front-end/getting-styles-of-elements-with-display-none.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "获取隐藏元素(display: none)的样式" ---- - -# 获取隐藏元素(`display: none`)的样式 - -隐藏的元素(`display: none`)无法获取到它的样式,因此大致思路是,获取到该元素,将它的`display`设置为可见,设置`visibility`为`hidden`,设置`position`为`absolute`,然后获取样式。之后复原它的`display`、`visibility`和`position`即可。 - -我写了一个简单的Vue3下适用SSR的Composable。 - -`useHiddenElementStyle.ts` -```typescript -import type { Fn, MaybeComputedElementRef, MaybeElement, UnRefElementReturn } from "@vueuse/core"; -import { unrefElement, useEventListener } from "@vueuse/core"; -import { onMounted, onUnmounted, ref, watch } from "vue"; - -export function useHiddenElementStyle(target: MaybeComputedElementRef) { - const style = ref>({} as any); - - function updateStyle(el: UnRefElementReturn) { - if (!el) { return; } - const _style = el.style; - const _computedStyle = window.getComputedStyle(el); - const { getStyle } = createStyleSelector({ style: _style, computedStyle: _computedStyle }); - const display = getStyle("display"); - const visibility = getStyle("visibility"); - const position = getStyle("position"); - if (display === "none") { - el.style.display = "unset"; - el.style.visibility = "hidden"; - el.style.position = "absolute"; - style.value = transformCSSProperties(window.getComputedStyle(el)); - el.style.position = position; - el.style.visibility = visibility; - el.style.display = display; - } else { - style.value = transformCSSProperties(window.getComputedStyle(el)); - } - } - - watch( - () => unrefElement(target), - (el) => { - updateStyle(el); - }); - - let stopListenResize: Fn, stopListenOrientationChange: Fn; - onMounted(() => { - stopListenResize = useEventListener(window, "resize", () => { - updateStyle(unrefElement(target)); - }); - - stopListenOrientationChange = useEventListener(window, "orientationchange", () => { - updateStyle(unrefElement(target)); - }); - }); - - onUnmounted(() => { - stopListenResize(); - stopListenOrientationChange(); - }); - - return { - style, - }; -} - -function transformCSSProperties(styles: CSSStyleDeclaration) { - const style: Record = {}; - const length = styles.length; - for (let i = 0; i < length; i++) { - const prop = styles[i]; - const value = styles.getPropertyValue(prop); - style[prop] = value; - } - return style as Record; -} - -function createStyleSelector(options?: { style?: CSSStyleDeclaration; computedStyle?: CSSStyleDeclaration }) { - const { style = {}, computedStyle = {} } = options || {}; - return { - getStyle(prop: keyof CSSStyleDeclaration) { - return (style as CSSStyleDeclaration)[prop] || (computedStyle as CSSStyleDeclaration)[prop] || ""; - }, - }; -} -``` \ No newline at end of file diff --git a/content/0.blog/front-end/infer-return-type-from-object.md b/content/0.blog/front-end/infer-return-type-from-object.md deleted file mode 100644 index 9900727..0000000 --- a/content/0.blog/front-end/infer-return-type-from-object.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: TS从函数参数对象中推导返回值类型 ---- - -# TS从函数参数对象中推导返回值类型 - -我们在做网络请求的时候经常会用到拦截器,在返回值拦截器中,我们可能会对返回值进行处理,并返回一个新的类型。因此我们会遇上这种需求: -```ts -interface InterceptorOption { - // ignore other props - responseTransformer?: (res: T) => any; -} - -function interceptor(instance: (...args: any[]) => Promise, options?: InterceptorOption) {} - -const api = () => Promise.resolve({ name: "bobo" }); - -const res1 = interceptor(api); // typeof res1 === { name: string } -const res2 = interceptor(api, {}); // typeof res2 === { name: string } -const res3 = interceptor(api, { // typeof res3 === { value: string } - responseTransformer(res) { - return { - value: "bobo" - }; - } -}); -``` -我们希望以上三种函数调用方式都能够推导并返回正确的类型。这里我想讲一讲通过类型体操而不是函数签名重载的方式,来得到我们想要的类型。我们来添加一种`InferResponse`类型: -```ts -type InferResponse = // ... - -function interceptor(instance: (...args: any[]) => Promise, options?: InterceptorOption): InferResponse { - // ... -} -``` -下来开始完善`InferResponse`。 - ---- - -首先我们可以发现,`interceptor`函数的返回值是与`options`的传参相关的,`options`传或不传、`options`中有没有`responseTransformer`会影响我们的返回值类型。所以`options`应该作为类型参数传入,也就是说放到泛型中。 -```ts -interface InterceptorOption { - responseTransformer?: (response: T) => any; -} - -function interceptor>(instance: (...args: any[]) => Promise, options?: O) {} -``` -相同的,`InferResponse`的泛型中也应该传入一项`O`,`InferResponse`应该根据`O`的不同返回不同的类型: -```ts -type InferResponse = // ... -``` -现在我们要根据`O`类型的不同做一些判断,并且我们希望从`O`中取到`responseTransformer`的返回值类型: -```ts -type InferResponse = O extends { responseTransformer: (res: any) => any } ? ReturnType : T; -``` -如果`O`中有`responseTransformer`并且`responseTransformer`为函数时,我们取它的返回值`ReturnType`;否则返回原本的`T`类型。 -完整代码如下: -```ts -interface InterceptorOption { - responseTransformer?: (response: T) => any; -} - -type InferResponse = O extends { responseTransformer: (res: any) => any } ? ReturnType : T; - -function interceptor>(instance: (...args: any[]) => Promise, options?: O) { - return {} as InferResponse; -} -``` -此时我们的`interceptor`便能根据`options`返回正确的类型。 - ---- - -其实一开始我要写的不是这个,一开始想做的是这种类型体操: -```ts -interface InterceptorOption { - // ignore other props - responseTransformer?: (res: T) => any; -} - -type InferResponse = O extends { responseTransformer: (res: any) => any } ? ReturnType : T; - -function interceptor = InterceptorOption>(options?: O) { - return {} as InferResponse; -} - -const res1 = interceptor(); // typeof res1 === string -const res2 = interceptor({}); // typeof res2 === number -const res3 = interceptor({ // typeof res3 === { value: string } - responseTransformer(res) { - return { - value: "bobo", - }; - }, -}); - -// The problem is here -// Expected res4 is `{ value: string }`, but presenting `boolean` -const res4 = interceptor({ // typeof res4 === boolean - responseTransformer(res) { - return { - value: "bobo", - }; - }, -}); -``` -然后翻车了,没跳出来,想了两天也没想出怎么解决。这里有一个[TS Playground](https://www.typescriptlang.org/play?jsx=0#code/JYOwLgpgTgZghgYwgAgJLmkgDmA9lAeR2FxAB4AVAPmQG8AoZZAemeWAHMR8VcwALaMixRcWAM6NkUCOKylxEClDghxMfAFtoAfgBcyABQzxBigEpkAXhqqAngG56AX3r0wdrCnQxoAJVl5NQhKABpkAhorCOQIAA9IEAATcTppQIUlFTUNKG0oA2NZA3tLG2R7ZGdkHWQAsABXKBAKTxCCAG0AIhMgxWVVdS1oLoBdGjMnehgGkAQwEhB2DChsPCgwmPjElLQVtfwiBdJKKL3IVYgcQ+IT6ipDMWO1fQjLBiYZRua6arhUnz+DLBTaRJyuegIBRgdLiACM1mWFwOG3EYCgoA4D3MDhYbA8XlwMFhCKsZOQaIxIA4kOhsIATIjQMirusyCAGpoAEbQB60Zw4vHIAkQIkM6zkjnc6C0tQwkwAZiZ+1Z+EMtCFIrFiol0Q1ADc4AAbBoQAyUzFVKS9TIDHLDKBFcTvKSfCDfJYfJjew0ms3ILpc3BBrqhV1VJxMZxhgVTVjICiCYSiLlGiCadipQQyejxgCicS88wgSVhABZM8gAAYG42m83oy3OKvhLkNGEiWQQcCWqtB3Bp1RV2Vo8vKlnXDb9wcgPmatra2QVsnRacQVTW4H9bJDPLQJ0u73pD10cNMX31gNBkNho-OSNVGM4+hAA),感兴趣的可以试一试。如果有人做出来了也欢迎评论! \ No newline at end of file diff --git a/content/0.blog/front-end/regex-lookahead-lookbehind.md b/content/0.blog/front-end/regex-lookahead-lookbehind.md deleted file mode 100644 index 88546c5..0000000 --- a/content/0.blog/front-end/regex-lookahead-lookbehind.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: 正则表达式中的断言 ---- - -# 正则表达式中的断言 - -::alert -Reference: [你是如何学会正则表达式的?](https://www.zhihu.com/question/48219401/answer/742444326) -:: - -正则表达式中的断言,也即零宽断言。零宽,指的是断言没有宽度。在正则表达式中,断言指的是一个**位置**。在一个普通的正则表达式中,比如```^\d{10,}$```,我们匹配的是一段内容,一个字符串。而在断言中,我们匹配的是一个**位置**。 - -断言分为四种,分别是正向先行断言```(?=pattern)```,负向先行断言```(?!pattern)```,正向后行断言```(?<=pattern)```,负向后行断言```(?这是很长很长很长很长很长很长很长很长很长很长的一句话 - :: - ```html [Code] -
这是很长很长很长很长很长很长很长很长很长很长的一句话
- ``` -:: - ---- - -有时会有一些嵌套之类的复杂情况: - -::code-group - ::code-block{label="Preview" preview} -
-
- 这是很长很长很长很长很长很长很长很长很长很长的一句话 - 这是一句不太长的话 -
-
这只是用来演示占位的
-
- :: - ```html [Code] -
-
- 这是很长很长很长很长很长很长很长很长很长很长的一句话 - 这是一句不太长的话 -
-
这只是用来演示占位的
-
- ``` -:: - -对于上图这种情况,大多数时候我们想要的效果可能是绿色的部分宽度固定,蓝色部分填满红色部分剩余宽度,超出部分显示省略号。由于应用`text-overflow: ellipsis`的元素需要设置一个宽度才会生效,因此为了实现上述效果,我们配合`flex`布局一起使用 - -::code-group - ::code-block{label="Preview" preview} -
-
- 这是很长很长很长很长很长很长很长很长很长很长的一句话 - 这是一句不太长的话 -
-
这只是用来演示占位的
-
- :: - ```html [Code] -
-
- 这是很长很长很长很长很长很长很长很长很长很长的一句话 - 这是一句不太长的话 -
-
这只是用来演示占位的
-
- ``` -:: - ---- - -看起来还不错。然而我们来看这么一种情况: - -::code-group - ::code-block{label="Preview" preview} -
-
这是左侧布局
-
- 这是右侧父布局 -
- 这是右侧嵌套的子布局。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- :: - ```html [Code] -
-
这是左侧布局
-
- 这是右侧父布局 -
- 这是右侧嵌套的子布局。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- ``` -:: - -我们希望蓝色部分可以实现单行超出部分显示省略号,我们分别对红色和蓝色部分设置`text-overflow: ellipsis`以及对红蓝部分同时设置`text-overflow: ellipses`看看效果: - -::code-group - ::code-block{label="Preview" preview} -
-
这是左侧布局
-
- 这是右侧父布局 text-overflow: ellipsis -
- 这是右侧嵌套的子布局。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- :: - ```html [Code] -
-
这是左侧布局
-
- 这是右侧父布局 text-overflow: ellipsis -
- 这是右侧嵌套的子布局。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- ``` -:: - -::code-group - ::code-block{label="Preview" preview} -
-
这是左侧布局
-
- 这是右侧父布局 -
- 这是右侧嵌套的子布局。 text-overflow: ellipsis。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- :: - ```html [Code] -
-
这是左侧布局
-
- 这是右侧父布局 -
- 这是右侧嵌套的子布局。 text-overflow: ellipsis。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- ``` -:: - -::code-group - ::code-block{label="Preview" preview} -
-
这是左侧布局
-
- 这是右侧父布局 text-overflow: ellipsis -
- 这是右侧嵌套的子布局。 text-overflow: ellipsis。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- :: - ```html [Code] -
-
这是左侧布局
-
- 这是右侧父布局 text-overflow: ellipsis -
- 这是右侧嵌套的子布局。 text-overflow: ellipsis。这也是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的一句话 -
-
-
- ``` -:: - -可以发现,只有对红蓝部分同时设置`text-overflow: ellipsis`才能实现我们想要的效果。 - ---- - -再来看一种复杂情况,这是我最近在写一个播放器控制栏时遇到的: - -::PlayerBarDemo -:: diff --git a/content/0.blog/others/_dir.yml b/content/0.blog/others/_dir.yml deleted file mode 100644 index 50fd206..0000000 --- a/content/0.blog/others/_dir.yml +++ /dev/null @@ -1,2 +0,0 @@ -title: 其他 -icon: akar-icons:book diff --git a/content/0.blog/others/poor-man-package.md b/content/0.blog/others/poor-man-package.md deleted file mode 100644 index 9eb0091..0000000 --- a/content/0.blog/others/poor-man-package.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: 穷鬼套餐 ---- - -# 穷鬼套餐 - -![](https://s2.loli.net/2023/09/14/CeE4aYTMiyqDNHu.webp) \ No newline at end of file diff --git a/content/0.blog/others/why-i-like-atomic-css.md b/content/0.blog/others/why-i-like-atomic-css.md deleted file mode 100644 index 42586e9..0000000 --- a/content/0.blog/others/why-i-like-atomic-css.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: 我为什么喜欢原子化CSS ---- - -# 我为什么喜欢原子化CSS - -> 用Unocss已经有几个月了,从使用者的角度来说说我为什么喜欢上了原子化css。 - -类似“原子化css”的概念其实很早之前就有,比如Bootstrap的[css工具类](https://getbootstrap.com/docs/5.1/utilities/api/)已经很接近现在的原子化css框架提供的功能,只不过这些css类一是随UI框架自带,二是覆盖的范围不够全面。现在的“原子化”实际上也并不是只对应单条的css属性,更像是一种功能上的原子化,比如`truncate`实际上包含了三条css属性: -```css -{ - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -``` - -这条规则可以实现单行文本长度超出部分显示成省略号。(当然也有单独的`text-ellipsis`,只包含了`text-overflow: ellipsis`属性)。 - ---- - -目前我感受到的原子化css优点有: - -1. **免去起名烦恼**。用了Unocss后大部分情况下我都不用再去想class名。之前也尝试过各种css命名方法,包括[BEM](https://getbem.com/)。然而当html层级嵌套比较深的情况下,BEM命名法也会有起名难、不直观的缺陷。当使用` ``` + 通过`window.getComputedStyle(document.getElementsByClassName('hidden')[0])`获取到的`width`是`fit-content`。如果想要获取实际宽高,可以参考我写的这篇文章 ➡️ [获取隐藏元素(display: none)的样式](/blog/front-end/getting-styles-of-elements-with-display-none) ## 使用Cloudflare Workers实现域名代理 @@ -116,4 +126,4 @@ Playground: [Prettier your type](https://www.typescriptlang.org/zh/play?#code/C4 type Prettier = { [K in keyof T]: T[K] }; -``` \ No newline at end of file +``` diff --git a/public/favicon.ico b/src/favicon.ico similarity index 100% rename from public/favicon.ico rename to src/favicon.ico diff --git a/src/index.md b/src/index.md new file mode 100644 index 0000000..156e13b --- /dev/null +++ b/src/index.md @@ -0,0 +1,27 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "Hi 👋" + text: "我是科科" + tagline: 什么也不会, 喜欢睡觉 + image: + src: /avatar.webp + alt: Avatar + actions: + - theme: brand + text: Markdown Examples + link: /blog/tricks + - theme: alt + text: API Examples + link: /api-examples + +features: + - title: Feature A + details: Lorem ipsum dolor sit amet, consectetur adipiscing elit + - title: Feature B + details: Lorem ipsum dolor sit amet, consectetur adipiscing elit + - title: Feature C + details: Lorem ipsum dolor sit amet, consectetur adipiscing elit +--- diff --git a/public/logo.webp b/src/logo.webp similarity index 100% rename from public/logo.webp rename to src/logo.webp diff --git a/styles/gitalk-overwrite.css b/styles/gitalk-overwrite.css deleted file mode 100644 index dc6cbd1..0000000 --- a/styles/gitalk-overwrite.css +++ /dev/null @@ -1,144 +0,0 @@ -.gt-container a { - color: var(--color-primary-500); -} - -.gt-container a:hover { - color: var(--color-primary-400); - border-color: var(--color-primary-400); -} - -.gt-container .gt-svg svg { - fill: var(--color-primary-500); -} - -.gt-container .gt-spinner::before { - border-top-color: var(--color-primary-500); -} - -.gt-container .gt-btn { - border-color: var(--color-primary-600); - background-color: var(--color-primary-600); -} - -.gt-container .gt-btn-preview { - background-color: #fff; - color: var(--color-primary-600); -} - -.dark .gt-container .gt-btn-preview { - background-color: var(--color-gray-900); - border-color: var(--color-primary-500); - color: var(--color-primary-500); -} - -.gt-container .gt-btn-preview:hover { - background-color: var(--color-gray-100); - border-color: var(--color-primary-500); -} - -.dark .gt-container .gt-btn-preview:hover { - background-color: var(--color-gray-800); - border-color: var(--color-primary-500); -} - -.gt-container .gt-btn-public:hover, -.gt-container .gt-btn-login:hover { - background-color: var(--color-primary-500); - border-color: var(--color-primary-500); -} - -.gt-container .gt-error { - text-align: center; - margin: 0.625em; - color: var(--color-primary-500); -} - -.gt-container .gt-link { - border-color: var(--color-primary-500); -} - -.gt-container .gt-user .is--poping .gt-ico svg { - fill: var(--color-primary-500); -} - -.gt-container .gt-popup .gt-action.is--active:before { - background: var(--color-primary-500); -} - -.gt-container .gt-header-controls-tip { - color: var(--color-primary-500); -} - -.gt-container .gt-comment-username { - color: var(--color-primary-500); -} - -.gt-container .gt-comment-content { - border-radius: var(--radii-md); -} - -.dark .gt-container .gt-comment-content { - background-color: var(--color-gray-800); -} - -.dark .gt-container .gt-comment-body { - color: var(--color-gray-50) !important; -} - -.gt-container .gt-comment-content:hover { - box-shadow: none; -} - -.gt-container .gt-header-textarea { - color: var(--color-gray-900); -} - -.dark .gt-container .gt-header-textarea { - color: var(--color-gray-50); - border-color: var(--color-gray-700); - background-color: var(--color-gray-800); -} - -.dark .gt-container .gt-header-preview { - color: var(--color-gray-50); - border-color: var(--color-gray-700); - background-color: var(--color-gray-800); -} - -.gt-container .gt-popup { - margin-top: var(--space-2); - border-radius: var(--radii-md); -} - -.dark .gt-container .gt-popup { - border-color: var(--color-gray-700); - background-color: var(--color-gray-800); -} - -.dark a.is--active, -.dark a.is--active:hover { - color: var(--color-gray-50); -} - -.gt-container .gt-ico-github svg { - fill: var(--color-gray-700); -} - -.dark .gt-container .gt-ico-github svg { - fill: var(--color-white); -} - -.dark .gt-container .gt-copyright { - border-color: var(--color-gray-600); -} - -.dark .gt-container .gt-meta { - border-color: var(--color-gray-600); -} - -.gt-no-init { - display: flex; - flex-direction: column; - align-items: center; - gap: var(--space-2); -} \ No newline at end of file diff --git a/theme/Layout.vue b/theme/Layout.vue new file mode 100644 index 0000000..0542efe --- /dev/null +++ b/theme/Layout.vue @@ -0,0 +1,25 @@ + + + diff --git a/theme/components/BButton.vue b/theme/components/BButton.vue new file mode 100644 index 0000000..d5a72cb --- /dev/null +++ b/theme/components/BButton.vue @@ -0,0 +1,38 @@ + + + diff --git a/theme/components/BNav.vue b/theme/components/BNav.vue new file mode 100644 index 0000000..57a8a4a --- /dev/null +++ b/theme/components/BNav.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/theme/index.ts b/theme/index.ts new file mode 100644 index 0000000..95b7b0d --- /dev/null +++ b/theme/index.ts @@ -0,0 +1,8 @@ +import Layout from "./Layout.vue"; +import "virtual:uno.css"; +import "@unocss/reset/tailwind-compat.css"; +import "./styles/var.css"; + +export default { + Layout, +}; diff --git a/theme/styles/var.css b/theme/styles/var.css new file mode 100644 index 0000000..34d8b73 --- /dev/null +++ b/theme/styles/var.css @@ -0,0 +1,3 @@ +:root { + --k-nav-logo-height: 48px; +} diff --git a/theme/types.ts b/theme/types.ts new file mode 100644 index 0000000..f26c4ac --- /dev/null +++ b/theme/types.ts @@ -0,0 +1,6 @@ +export interface ThemeConfig { + logo?: string; + siteTitle?: string | false; +} + +export type Layout = "home" | "doc" | "page" | false; diff --git a/tokens.config.ts b/tokens.config.ts deleted file mode 100644 index 9f08003..0000000 --- a/tokens.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defineTheme } from "pinceau"; -import { color } from "./utils"; - -export default defineTheme({ - color, -}); diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..4101fcc --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "jsx": "preserve", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "moduleDetection": "force", + "useDefineForClassFields": true, + "module": "ESNext", + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + + /* Linting */ + "strict": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noEmit": true, + "isolatedModules": true, + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/**/*.md", "theme/**/*.vue", "theme/**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index 4b34df1..a2efd46 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,7 @@ { - "extends": "./.nuxt/tsconfig.json" + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ], + "files": [] } diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..cab1e47 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "moduleDetection": "force", + "module": "ESNext", + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + + /* Linting */ + "strict": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noEmit": true, + "isolatedModules": true, + "skipLibCheck": true + }, + "include": ["vite.config.ts"] +} diff --git a/uno.config.ts b/uno.config.ts index e820e04..17afd08 100644 --- a/uno.config.ts +++ b/uno.config.ts @@ -1,27 +1,7 @@ -import { defineConfig, presetIcons, presetUno, transformerDirectives } from "unocss"; -import { color } from "./utils"; +import { defineConfig, presetIcons, presetTypography, presetUno, transformerDirectives } from "unocss"; +import presetShadcn from "./preset.shadcn"; export default defineConfig({ - presets: [presetUno(), presetIcons()], + presets: [presetUno(), presetTypography(), presetIcons(), presetShadcn()], transformers: [transformerDirectives()], - // see https://github.com/unocss/unocss/discussions/1947 - extraContent: { - filesystem: ["./content/**/*.md"], - }, - theme: { - colors: { - nuxtGray: { - 50: "var(--color-gray-50)", - 900: "var(--color-gray-900)", - 400: "var(--color-gray-400)", - }, - primary: color.primary, - }, - fontFamily: { - "nuxt-sans": "var(--font-sans)", - }, - fontSize: { - "nuxt-xl": "var(--fontSize-xl)", - }, - }, }); diff --git a/utils/color.ts b/utils/color.ts deleted file mode 100644 index 4c9b290..0000000 --- a/utils/color.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const color = { - primary: { - 50: "#f4dcdd", - 100: "#e7b6b6", - 200: "#da9090", - 300: "#d47d7d", - 400: "#ce696a", - 500: "#c75657", - 600: "#c14344", - 700: "#9d3435", - 800: "#772728", - 900: "#501b1b", - }, -}; diff --git a/utils/index.ts b/utils/index.ts deleted file mode 100644 index 60b7091..0000000 --- a/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./color"; diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..9259761 --- /dev/null +++ b/vercel.json @@ -0,0 +1,14 @@ +{ + "cleanUrls": true, + "headers": [ + { + "source": "/assets/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "max-age=31536000, immutable" + } + ] + } + ] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..34e0971 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import vue from "@vitejs/plugin-vue"; +import { defineConfig } from "vite"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], +}); From 9d21a354a5a7c36bbbac4d49782a9eebebb33970 Mon Sep 17 00:00:00 2001 From: cole Date: Wed, 23 Oct 2024 18:02:31 +0800 Subject: [PATCH 002/109] wip: vitepress theme sidebar --- .vitepress/config.ts | 112 +++++++++---- package.json | 8 +- pnpm-lock.yaml | 85 +++++++--- src/avatar-wink.webp | Bin 0 -> 19828 bytes src/avatar.webp | Bin 109730 -> 20124 bytes src/logo-wink.webp | Bin 0 -> 5630 bytes src/logo.webp | Bin 23940 -> 6398 bytes theme/Layout.vue | 28 ++-- theme/components/BButton.vue | 5 +- theme/components/BCollapse.vue | 56 +++++++ theme/components/BContent.vue | 12 ++ theme/components/BDrawer.vue | 69 ++++++++ theme/components/BFooter.vue | 27 ++++ theme/components/BIcon.vue | 20 +++ theme/components/BLink.vue | 15 ++ theme/components/BNav.vue | 56 +++++-- theme/components/BPopup.vue | 139 ++++++++++++++++ theme/components/BSidebar.vue | 15 ++ theme/components/BSidebarItem.vue | 54 +++++++ theme/components/BTocBar.vue | 16 ++ theme/composables/useMergedState.ts | 27 ++++ theme/composables/usePopup.ts | 61 +++++++ theme/composables/useSidebar.ts | 0 theme/styles/base.css | 3 + theme/styles/var.css | 16 +- theme/types.ts | 106 +++++++++++++ theme/utils/icon.ts | 19 +++ theme/utils/index.ts | 20 +++ theme/utils/toc.ts | 237 ++++++++++++++++++++++++++++ uno.config.ts | 4 +- 30 files changed, 1117 insertions(+), 93 deletions(-) create mode 100644 src/avatar-wink.webp create mode 100644 src/logo-wink.webp create mode 100644 theme/components/BCollapse.vue create mode 100644 theme/components/BContent.vue create mode 100644 theme/components/BDrawer.vue create mode 100644 theme/components/BFooter.vue create mode 100644 theme/components/BIcon.vue create mode 100644 theme/components/BLink.vue create mode 100644 theme/components/BPopup.vue create mode 100644 theme/components/BSidebar.vue create mode 100644 theme/components/BSidebarItem.vue create mode 100644 theme/components/BTocBar.vue create mode 100644 theme/composables/useMergedState.ts create mode 100644 theme/composables/usePopup.ts create mode 100644 theme/composables/useSidebar.ts create mode 100644 theme/styles/base.css create mode 100644 theme/utils/icon.ts create mode 100644 theme/utils/index.ts create mode 100644 theme/utils/toc.ts diff --git a/.vitepress/config.ts b/.vitepress/config.ts index a2ef7cc..657d602 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -1,9 +1,10 @@ import UnoCSS from "unocss/vite"; -import { defineConfig } from "vitepress"; +import { defineConfigWithTheme } from "vitepress"; +import type { ThemeConfig } from "../theme/types"; // https://vitepress.dev/reference/site-config export default async () => { - return defineConfig({ + return defineConfigWithTheme({ lang: "zh-CN", title: "科科Cole", titleTemplate: ":title · 科科Cole", @@ -17,34 +18,35 @@ export default async () => { themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: "/logo.webp", - editLink: { - text: "在GitHub上编辑", - pattern: "https://github.com/bernankez/blog/edit/master/src/:path", - }, - lastUpdated: { - text: "上次更新于", - formatOptions: { - dateStyle: "full", - timeStyle: "medium", - }, - }, - search: { - provider: "algolia", - options: { - apiKey: "f3c4b78009a6ed7d455512effbadf33a", - appId: "4U4R8B36SX", - indexName: "keke", - }, - }, - docFooter: { - prev: "上一页", - next: "下一页", - }, - darkModeSwitchLabel: "外观", - darkModeSwitchTitle: "切换到深色模式", - lightModeSwitchTitle: "切换到浅色模式", - returnToTopLabel: "回到顶部", - externalLinkIcon: true, + logoOnHover: "/logo-wink.webp", + // editLink: { + // text: "在GitHub上编辑", + // pattern: "https://github.com/bernankez/blog/edit/master/src/:path", + // }, + // lastUpdated: { + // text: "上次更新于", + // formatOptions: { + // dateStyle: "full", + // timeStyle: "medium", + // }, + // }, + // search: { + // provider: "algolia", + // options: { + // apiKey: "f3c4b78009a6ed7d455512effbadf33a", + // appId: "4U4R8B36SX", + // indexName: "keke", + // }, + // }, + // docFooter: { + // prev: "上一页", + // next: "下一页", + // }, + // darkModeSwitchLabel: "外观", + // darkModeSwitchTitle: "切换到深色模式", + // lightModeSwitchTitle: "切换到浅色模式", + // returnToTopLabel: "回到顶部", + // externalLinkIcon: true, nav: [ { text: "Blog", link: "/blog/tricks", activeMatch: "/blog/" }, { text: "八股文", link: "/stereotyped-writing", activeMatch: "/stereotyped-writing/" }, @@ -58,10 +60,58 @@ export default async () => { { text: "TS重载类型推断", link: "/blog/front-end/ts-inferring-type" }, ], }, + { + text: "参考", + items: [ + { text: "站点配置", link: "site-config" }, + { text: "frontmatter 配置", link: "frontmatter-config" }, + { text: "运行时 API", link: "runtime-api" }, + { text: "CLI", link: "cli" }, + { + text: "默认主题", + base: "/zh/reference/default-theme-", + items: [ + { text: "概览", link: "config" }, + { text: "导航栏", link: "nav" }, + { text: "侧边栏", link: "sidebar" }, + { text: "主页", link: "home-page" }, + { text: "页脚", link: "footer" }, + { text: "布局", link: "layout" }, + { text: "徽章", link: "badge" }, + { text: "团队页", link: "team-page" }, + { text: "上下页链接", link: "prev-next-links" }, + { text: "编辑链接", link: "edit-link" }, + { text: "最后更新时间戳", link: "last-updated" }, + { text: "搜索", link: "search" }, + { items: [ + { + text: "默认主题", + base: "/zh/reference/default-theme-", + items: [ + { text: "概览", link: "config" }, + { text: "导航栏", link: "nav" }, + { text: "侧边栏", link: "sidebar" }, + { text: "主页", link: "home-page" }, + { text: "页脚", link: "footer" }, + { text: "布局", link: "layout" }, + { text: "徽章", link: "badge" }, + { text: "团队页", link: "team-page" }, + { text: "上下页链接", link: "prev-next-links" }, + { text: "编辑链接", link: "edit-link" }, + { text: "最后更新时间戳", link: "last-updated" }, + { text: "搜索", link: "search" }, + { text: "Carbon Ads", link: "carbon-ads" }, + ], + }, + ] }, + ], + }, + ], + }, ], socialLinks: [ - { icon: "github", link: "https://github.com/Bernankez/blog" }, + { icon: "github", link: "https://github.com/Bernankez/blog", ariaLabel: "GitHub" }, ], }, vite: { diff --git a/package.json b/package.json index 398992f..2e270d9 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,9 @@ "fix": "eslint . -f mo --fix" }, "dependencies": { + "@vueuse/core": "^11.1.0", "cva": "npm:class-variance-authority@^0.7.0", + "tailwind-merge": "^2.5.4", "unocss": "^0.63.6", "vue": "^3.5.10" }, @@ -21,6 +23,8 @@ "@bernankez/eslint-config": "^2.2.0", "@bernankez/theme": "^0.4.1", "@iconify-json/line-md": "^1.2.2", + "@iconify-json/ri": "^1.2.1", + "@types/node": "^22.7.9", "@unocss/eslint-plugin": "^0.63.6", "@unocss/preset-mini": "^0.63.6", "@unocss/reset": "^0.63.6", @@ -39,6 +43,8 @@ "pre-commit": "pnpm lint-staged" }, "lint-staged": { - "*": ["eslint ."] + "*": [ + "eslint ." + ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32f95ec..a3c9e84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,18 @@ importers: .: dependencies: + '@vueuse/core': + specifier: ^11.1.0 + version: 11.1.0(vue@3.5.12(typescript@5.6.3)) cva: specifier: npm:class-variance-authority@^0.7.0 version: class-variance-authority@0.7.0 + tailwind-merge: + specifier: ^2.5.4 + version: 2.5.4 unocss: specifier: ^0.63.6 - version: 0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9) + version: 0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)) vue: specifier: ^3.5.10 version: 3.5.12(typescript@5.6.3) @@ -23,10 +29,16 @@ importers: version: 2.2.0(@typescript-eslint/utils@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(@unocss/eslint-plugin@0.63.6(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint-plugin-format@0.1.2(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) '@bernankez/theme': specifier: ^0.4.1 - version: 0.4.1(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9)) + version: 0.4.1(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9))) '@iconify-json/line-md': specifier: ^1.2.2 version: 1.2.2 + '@iconify-json/ri': + specifier: ^1.2.1 + version: 1.2.1 + '@types/node': + specifier: ^22.7.9 + version: 22.7.9 '@unocss/eslint-plugin': specifier: ^0.63.6 version: 0.63.6(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) @@ -38,7 +50,7 @@ importers: version: 0.63.6 '@vitejs/plugin-vue': specifier: ^5.1.4 - version: 5.1.4(vite@5.4.9)(vue@3.5.12(typescript@5.6.3)) + version: 5.1.4(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3)) eslint: specifier: ^9.13.0 version: 9.13.0(jiti@1.21.6) @@ -59,10 +71,10 @@ importers: version: 5.6.3 vite: specifier: ^5.4.8 - version: 5.4.9 + version: 5.4.9(@types/node@22.7.9) vitepress: specifier: ^1.4.1 - version: 1.4.1(@algolia/client-search@4.24.0)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3) + version: 1.4.1(@algolia/client-search@4.24.0)(@types/node@22.7.9)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3) vue-tsc: specifier: ^2.1.6 version: 2.1.6(typescript@5.6.3) @@ -652,6 +664,9 @@ packages: '@iconify-json/line-md@1.2.2': resolution: {integrity: sha512-UCYTTO5aARoVbOOPCaomOoXDC8maSolIV8KVDmK9VuzfjpqkMg/vJo/nWaoQPIf310SZjdvAqHvIwsbzr6J+sw==} + '@iconify-json/ri@1.2.1': + resolution: {integrity: sha512-xI3+xZHBI+wlhQqd6jRRcLD5K8B8vQNyxcSB43myxNZ/SfXIn7Ny28h0jyPo9e0gT8fGhqx6R5PeLz/UBB8jwQ==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -841,6 +856,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/node@22.7.9': + resolution: {integrity: sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2518,6 +2536,9 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@2.5.4: + resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -2606,6 +2627,9 @@ packages: unconfig@0.5.5: resolution: {integrity: sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -2989,15 +3013,15 @@ snapshots: - typescript - vitest - '@bernankez/theme-generator@0.2.2(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9))': + '@bernankez/theme-generator@0.2.2(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)))': dependencies: cac: 6.7.14 optionalDependencies: - unocss: 0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9) + unocss: 0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)) - '@bernankez/theme@0.4.1(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9))': + '@bernankez/theme@0.4.1(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)))': dependencies: - '@bernankez/theme-generator': 0.2.2(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9)) + '@bernankez/theme-generator': 0.2.2(unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9))) cac: 6.7.14 transitivePeerDependencies: - unocss @@ -3367,6 +3391,10 @@ snapshots: dependencies: '@iconify/types': 2.0.0 + '@iconify-json/ri@1.2.1': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/types@2.0.0': {} '@iconify/utils@2.1.33': @@ -3536,6 +3564,10 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/node@22.7.9': + dependencies: + undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} '@types/tinycolor2@1.4.6': {} @@ -3627,13 +3659,13 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9)': + '@unocss/astro@0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9))': dependencies: '@unocss/core': 0.63.6 '@unocss/reset': 0.63.6 - '@unocss/vite': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9) + '@unocss/vite': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)) optionalDependencies: - vite: 5.4.9 + vite: 5.4.9(@types/node@22.7.9) transitivePeerDependencies: - rollup - supports-color @@ -3774,7 +3806,7 @@ snapshots: dependencies: '@unocss/core': 0.63.6 - '@unocss/vite@0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9)': + '@unocss/vite@0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.2(rollup@4.24.0) @@ -3784,15 +3816,15 @@ snapshots: chokidar: 3.6.0 magic-string: 0.30.12 tinyglobby: 0.2.9 - vite: 5.4.9 + vite: 5.4.9(@types/node@22.7.9) transitivePeerDependencies: - rollup - supports-color - typescript - '@vitejs/plugin-vue@5.1.4(vite@5.4.9)(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3))': dependencies: - vite: 5.4.9 + vite: 5.4.9(@types/node@22.7.9) vue: 3.5.12(typescript@5.6.3) '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': @@ -5466,6 +5498,8 @@ snapshots: tabbable@6.2.0: {} + tailwind-merge@2.5.4: {} + tapable@2.2.1: {} text-table@0.2.0: {} @@ -5540,6 +5574,8 @@ snapshots: transitivePeerDependencies: - supports-color + undici-types@6.19.8: {} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -5563,9 +5599,9 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9): + unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)): dependencies: - '@unocss/astro': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9) + '@unocss/astro': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)) '@unocss/cli': 0.63.6(rollup@4.24.0) '@unocss/core': 0.63.6 '@unocss/postcss': 0.63.6(postcss@8.4.47) @@ -5581,9 +5617,9 @@ snapshots: '@unocss/transformer-compile-class': 0.63.6 '@unocss/transformer-directives': 0.63.6 '@unocss/transformer-variant-group': 0.63.6 - '@unocss/vite': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9) + '@unocss/vite': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)) optionalDependencies: - vite: 5.4.9 + vite: 5.4.9(@types/node@22.7.9) transitivePeerDependencies: - postcss - rollup @@ -5617,15 +5653,16 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.9: + vite@5.4.9(@types/node@22.7.9): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.0 optionalDependencies: + '@types/node': 22.7.9 fsevents: 2.3.3 - vitepress@1.4.1(@algolia/client-search@4.24.0)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3): + vitepress@1.4.1(@algolia/client-search@4.24.0)(@types/node@22.7.9)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3): dependencies: '@docsearch/css': 3.6.2 '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.2) @@ -5633,7 +5670,7 @@ snapshots: '@shikijs/transformers': 1.22.0 '@shikijs/types': 1.22.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.4(vite@5.4.9)(vue@3.5.12(typescript@5.6.3)) + '@vitejs/plugin-vue': 5.1.4(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3)) '@vue/devtools-api': 7.5.2 '@vue/shared': 3.5.12 '@vueuse/core': 11.1.0(vue@3.5.12(typescript@5.6.3)) @@ -5642,7 +5679,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.0 shiki: 1.22.0 - vite: 5.4.9 + vite: 5.4.9(@types/node@22.7.9) vue: 3.5.12(typescript@5.6.3) optionalDependencies: postcss: 8.4.47 diff --git a/src/avatar-wink.webp b/src/avatar-wink.webp new file mode 100644 index 0000000000000000000000000000000000000000..1fe02daa65eb8cb6926a4ddbb450ace40b7cd342 GIT binary patch literal 19828 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 literal 0 HcmV?d00001 diff --git a/src/avatar.webp b/src/avatar.webp index f987151bfc6199f3e0dee55a5e4587d4a70deb00..b7b1573fe6d32dba4aaac763f0de09f02da59704 100644 GIT binary patch literal 20124 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

tQ#4T#W#=5-cn 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 P#l$aTjquvsfB*mh*uOVu literal 109730 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

{BxfD$p;=gZTl)no|{qYjCu{2@AVOM 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

I47OJIs_L=w`r^bIQ628myeVF*PN+Wv{q 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 diff --git a/src/logo-wink.webp b/src/logo-wink.webp new file mode 100644 index 0000000000000000000000000000000000000000..a83bbe1dca18a8972cbd9d879781dce1fedc45aa GIT binary patch literal 5630 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 YmpfB3Hz)}`8R|A*kq&LJZZ<1(w<2N!;Q#y8 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 MRIsTEW-$nW0E8}Uxc~qF literal 23940 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 diff --git a/theme/Layout.vue b/theme/Layout.vue index 0542efe..93edfab 100644 --- a/theme/Layout.vue +++ b/theme/Layout.vue @@ -1,25 +1,17 @@ + + diff --git a/theme/components/BButton.vue b/theme/components/BButton.vue index d5a72cb..432ed50 100644 --- a/theme/components/BButton.vue +++ b/theme/components/BButton.vue @@ -1,5 +1,6 @@ diff --git a/theme/components/BCollapse.vue b/theme/components/BCollapse.vue new file mode 100644 index 0000000..0b8b4a4 --- /dev/null +++ b/theme/components/BCollapse.vue @@ -0,0 +1,56 @@ + + + diff --git a/theme/components/BContent.vue b/theme/components/BContent.vue new file mode 100644 index 0000000..f3f2067 --- /dev/null +++ b/theme/components/BContent.vue @@ -0,0 +1,12 @@ + + + diff --git a/theme/components/BDrawer.vue b/theme/components/BDrawer.vue new file mode 100644 index 0000000..29ccf34 --- /dev/null +++ b/theme/components/BDrawer.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/theme/components/BFooter.vue b/theme/components/BFooter.vue new file mode 100644 index 0000000..378031c --- /dev/null +++ b/theme/components/BFooter.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/theme/components/BIcon.vue b/theme/components/BIcon.vue new file mode 100644 index 0000000..ee284f3 --- /dev/null +++ b/theme/components/BIcon.vue @@ -0,0 +1,20 @@ + + + diff --git a/theme/components/BLink.vue b/theme/components/BLink.vue new file mode 100644 index 0000000..9b67694 --- /dev/null +++ b/theme/components/BLink.vue @@ -0,0 +1,15 @@ + + + diff --git a/theme/components/BNav.vue b/theme/components/BNav.vue index 57a8a4a..27e9cce 100644 --- a/theme/components/BNav.vue +++ b/theme/components/BNav.vue @@ -1,31 +1,57 @@ diff --git a/theme/components/BPopup.vue b/theme/components/BPopup.vue new file mode 100644 index 0000000..2ffddf6 --- /dev/null +++ b/theme/components/BPopup.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/theme/components/BSidebar.vue b/theme/components/BSidebar.vue new file mode 100644 index 0000000..8a3c0a5 --- /dev/null +++ b/theme/components/BSidebar.vue @@ -0,0 +1,15 @@ + + + diff --git a/theme/components/BSidebarItem.vue b/theme/components/BSidebarItem.vue new file mode 100644 index 0000000..41e52ac --- /dev/null +++ b/theme/components/BSidebarItem.vue @@ -0,0 +1,54 @@ + + + diff --git a/theme/components/BTocBar.vue b/theme/components/BTocBar.vue new file mode 100644 index 0000000..548780e --- /dev/null +++ b/theme/components/BTocBar.vue @@ -0,0 +1,16 @@ + + + diff --git a/theme/composables/useMergedState.ts b/theme/composables/useMergedState.ts new file mode 100644 index 0000000..024f506 --- /dev/null +++ b/theme/composables/useMergedState.ts @@ -0,0 +1,27 @@ +import { computed, isRef, type MaybeRefOrGetter, type Ref, toValue, watch } from "vue"; + +export function useMergedState(controlledRef: MaybeRefOrGetter, uncontrolledRef: Ref, onSet?: (value: T) => void) { + watch(() => toValue(controlledRef), (value) => { + if (value !== undefined) { + uncontrolledRef.value = value; + } + }); + + return computed({ + get() { + const value = toValue(controlledRef); + if (value === undefined) { + return uncontrolledRef.value; + } + return value; + }, + set(value) { + if (isRef(controlledRef)) { + // @ts-expect-error don't trigger + controlledRef.value = value; + } + onSet?.(value); + uncontrolledRef.value = value; + }, + }); +} diff --git a/theme/composables/usePopup.ts b/theme/composables/usePopup.ts new file mode 100644 index 0000000..152ec6a --- /dev/null +++ b/theme/composables/usePopup.ts @@ -0,0 +1,61 @@ +import { inBrowser } from "vitepress"; +import { onUnmounted, readonly, type Ref, ref, watch } from "vue"; + +interface UsePopupOptions { + el: Ref; + onFocus?: () => void; + onBlur?: () => void; +} + +export const focusedElement = ref(); + +let active = false; +let listeners = 0; + +export function usePopup(options: UsePopupOptions) { + const focus = ref(false); + + if (inBrowser) { + if (!active) { + activateFocusTracking(); + } + + listeners++; + + const unwatch = watch(focusedElement, (el) => { + if (el === options.el.value || options.el.value?.contains(el!)) { + focus.value = true; + options.onFocus?.(); + } else { + focus.value = false; + options.onBlur?.(); + } + }); + + onUnmounted(() => { + unwatch(); + + listeners--; + + if (!listeners) { + deactivateFocusTracking(); + } + }); + } + + return readonly(focus); +} + +function activateFocusTracking() { + document.addEventListener("focusin", handleFocusIn); + active = true; + focusedElement.value = document.activeElement as HTMLElement; +} + +function deactivateFocusTracking() { + document.removeEventListener("focusin", handleFocusIn); +} + +function handleFocusIn() { + focusedElement.value = document.activeElement as HTMLElement; +} diff --git a/theme/composables/useSidebar.ts b/theme/composables/useSidebar.ts new file mode 100644 index 0000000..e69de29 diff --git a/theme/styles/base.css b/theme/styles/base.css new file mode 100644 index 0000000..a664aa2 --- /dev/null +++ b/theme/styles/base.css @@ -0,0 +1,3 @@ +:root { + /* background-color: var(--background); */ +} diff --git a/theme/styles/var.css b/theme/styles/var.css index 34d8b73..448362b 100644 --- a/theme/styles/var.css +++ b/theme/styles/var.css @@ -1,3 +1,17 @@ :root { - --k-nav-logo-height: 48px; + --b-nav-height: 70px; + --b-nav-logo-height: 48px; + --b-footer-height: 100px; +} + +:root { + --b-max-width: 1280px; + --b-drawer-width: 320px; +} + +:root { + --b-toc-bar-z-index: 20; + --b-nav-z-index: 30; + --b-mask-z-index: 40; + --b-aside-z-index: 50; } diff --git a/theme/types.ts b/theme/types.ts index f26c4ac..5a292a2 100644 --- a/theme/types.ts +++ b/theme/types.ts @@ -1,6 +1,112 @@ export interface ThemeConfig { logo?: string; + logoOnHover?: string; siteTitle?: string | false; + socialLinks?: SocialLink[]; + nav?: NavItem[]; + sidebar?: Sidebar; } export type Layout = "home" | "doc" | "page" | false; + +export interface SocialLink { + icon: SocialLinkIcon; + link: string; + ariaLabel?: string; +} + +export type SocialLinkIcon = "github" + | "twitter" + | "rss" + | "mastodon" + | "home" + | { + svg: string; + }; + +// nav ----------------------------------------------------------------------- + +export type NavItem = NavItemComponent | NavItemWithLink | NavItemWithChildren; + +export interface NavItemComponent { + component: string; + props?: Record; +} + +export interface NavItemWithLink { + text: string; + link: string; + items?: never; + + /** + * `activeMatch` is expected to be a regex string. We can't use actual + * RegExp object here because it isn't serializable + */ + activeMatch?: string; + rel?: string; + target?: string; + noIcon?: boolean; +} + +export interface NavItemChildren { + text?: string; + items: NavItemWithLink[]; +} + +export interface NavItemWithChildren { + text?: string; + items: (NavItemComponent | NavItemChildren | NavItemWithLink)[]; + + /** + * `activeMatch` is expected to be a regex string. We can't use actual + * RegExp object here because it isn't serializable + */ + activeMatch?: string; +} + +// sidebar -------------------------------------------------------------- + +export type Sidebar = SidebarItem[] | SidebarMulti; + +export interface SidebarMulti { + [path: string]: SidebarItem[] | { items: SidebarItem[]; base: string }; +} + +export interface SidebarItem { + /** + * The text label of the item. + */ + text?: string; + + /** + * The link of the item. + */ + link?: string; + + /** + * The children of the item. + */ + items?: SidebarItem[]; + + /** + * If not specified, group is not collapsible. + * + * If `true`, group is collapsible and collapsed by default + * + * If `false`, group is collapsible but expanded by default + */ + collapsed?: boolean; + + /** + * Base path for the children items. + */ + base?: string; + + /** + * Customize text that appears on the footer of previous/next page. + */ + docFooterText?: string; + + rel?: string; + target?: string; +}; diff --git a/theme/utils/icon.ts b/theme/utils/icon.ts new file mode 100644 index 0000000..ac75df9 --- /dev/null +++ b/theme/utils/icon.ts @@ -0,0 +1,19 @@ +import type { SocialLinkIcon } from "../types"; + +// @unocss-include +export function getIcon(icon: SocialLinkIcon) { + switch (icon) { + case "github": + return "i-line-md-github-loop"; + case "rss": + return "i-line-md-rss"; + case "twitter": + return "i-line-md-twitter"; + case "mastodon": + return "i-line-md-mastodon"; + case "home": + return "i-line-md-home"; + default: + return icon; + } +} diff --git a/theme/utils/index.ts b/theme/utils/index.ts new file mode 100644 index 0000000..745758c --- /dev/null +++ b/theme/utils/index.ts @@ -0,0 +1,20 @@ +export function throttleAndDebounce(fn: () => void, delay: number): () => void { + let timeoutId: NodeJS.Timeout; + let called = false; + + return () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + + if (!called) { + fn(); + called = true; + setTimeout(() => { + called = false; + }, delay); + } else { + timeoutId = setTimeout(fn, delay); + } + }; +} diff --git a/theme/utils/toc.ts b/theme/utils/toc.ts new file mode 100644 index 0000000..7de447c --- /dev/null +++ b/theme/utils/toc.ts @@ -0,0 +1,237 @@ +import { getScrollOffset, type Header } from "vitepress"; +import { onMounted, onUnmounted, onUpdated, ref, type Ref } from "vue"; +import type { DefaultTheme } from "vitepress/theme"; +import { throttleAndDebounce } from "."; + +// cached list of anchor elements from resolveHeaders +const resolvedHeaders: { element: HTMLHeadElement; link: string }[] = []; + +export type MenuItem = Omit & { + element: HTMLHeadElement; + children?: MenuItem[]; +}; + +export function resolveTitle(theme: DefaultTheme.Config): string { + return ( + (typeof theme.outline === "object" + && !Array.isArray(theme.outline) + && theme.outline.label) + || theme.outlineTitle + || "On this page" + ); +} + +export function getHeaders(range: DefaultTheme.Config["outline"]): MenuItem[] { + const headers = [ + ...document.querySelectorAll(".b-doc :where(h1,h2,h3,h4,h5,h6)"), + ] + .filter(el => el.id && el.hasChildNodes()) + .map((el) => { + const level = Number(el.tagName[1]); + return { + element: el as HTMLHeadElement, + title: serializeHeader(el), + link: `#${el.id}`, + level, + }; + }); + + return resolveHeaders(headers, range); +} + +function serializeHeader(h: Element): string { + let ret = ""; + for (const node of h.childNodes) { + if (node.nodeType === 1) { + if ( + (node as Element).classList.contains("VPBadge") + || (node as Element).classList.contains("header-anchor") + || (node as Element).classList.contains("ignore-header") + ) { + continue; + } + ret += node.textContent; + } else if (node.nodeType === 3) { + ret += node.textContent; + } + } + return ret.trim(); +} + +export function resolveHeaders( + headers: MenuItem[], + range?: DefaultTheme.Config["outline"], +): MenuItem[] { + if (range === false) { + return []; + } + + const levelsRange + = (typeof range === "object" && !Array.isArray(range) + ? range.level + : range) || 2; + + const [high, low]: [number, number] + = typeof levelsRange === "number" + ? [levelsRange, levelsRange] + : levelsRange === "deep" + ? [2, 6] + : levelsRange; + + return buildTree(headers, high, low); +} + +export function useActiveAnchor( + container: Ref, + marker: Ref, +): void { + // const { isAsideEnabled } = useAside(); + const isAsideEnabled = ref(true); + + const onScroll = throttleAndDebounce(setActiveLink, 100); + + let prevActiveLink: HTMLAnchorElement | null = null; + + onMounted(() => { + requestAnimationFrame(setActiveLink); + window.addEventListener("scroll", onScroll); + }); + + onUpdated(() => { + // sidebar update means a route change + activateLink(location.hash); + }); + + onUnmounted(() => { + window.removeEventListener("scroll", onScroll); + }); + + function setActiveLink() { + if (!isAsideEnabled.value) { + return; + } + + const scrollY = window.scrollY; + const innerHeight = window.innerHeight; + const offsetHeight = document.body.offsetHeight; + const isBottom = Math.abs(scrollY + innerHeight - offsetHeight) < 1; + + // resolvedHeaders may be repositioned, hidden or fix positioned + const headers = resolvedHeaders + .map(({ element, link }) => ({ + link, + top: getAbsoluteTop(element), + })) + .filter(({ top }) => !Number.isNaN(top)) + .sort((a, b) => a.top - b.top); + + // no headers available for active link + if (!headers.length) { + activateLink(null); + return; + } + + // page top + if (scrollY < 1) { + activateLink(null); + return; + } + + // page bottom - highlight last link + if (isBottom) { + activateLink(headers[headers.length - 1].link); + return; + } + + // find the last header above the top of viewport + let activeLink: string | null = null; + for (const { link, top } of headers) { + if (top > scrollY + getScrollOffset() + 4) { + break; + } + activeLink = link; + } + activateLink(activeLink); + } + + function activateLink(hash: string | null) { + if (prevActiveLink) { + prevActiveLink.classList.remove("active"); + } + + if (hash == null) { + prevActiveLink = null; + } else { + prevActiveLink = container.value.querySelector( + `a[href="${decodeURIComponent(hash)}"]`, + ); + } + + const activeLink = prevActiveLink; + + if (activeLink) { + activeLink.classList.add("active"); + marker.value.style.top = `${activeLink.offsetTop + 39}px`; + marker.value.style.opacity = "1"; + } else { + marker.value.style.top = "33px"; + marker.value.style.opacity = "0"; + } + } +} + +function getAbsoluteTop(element: HTMLElement): number { + let offsetTop = 0; + while (element !== document.body) { + if (element === null) { + // child element is: + // - not attached to the DOM (display: none) + // - set to fixed position (not scrollable) + // - body or html element (null offsetParent) + return Number.NaN; + } + offsetTop += element.offsetTop; + element = element.offsetParent as HTMLElement; + } + return offsetTop; +} + +function buildTree(data: MenuItem[], min: number, max: number): MenuItem[] { + resolvedHeaders.length = 0; + + const result: MenuItem[] = []; + const stack: (MenuItem | { level: number; shouldIgnore: true })[] = []; + + data.forEach((item) => { + const node = { ...item, children: [] }; + let parent = stack[stack.length - 1]; + + while (parent && parent.level >= node.level) { + stack.pop(); + parent = stack[stack.length - 1]; + } + + if ( + node.element.classList.contains("ignore-header") + || (parent && "shouldIgnore" in parent) + ) { + stack.push({ level: node.level, shouldIgnore: true }); + return; + } + + if (node.level > max || node.level < min) { + return; + } + resolvedHeaders.push({ element: node.element, link: node.link }); + + if (parent) { + parent.children!.push(node); + } else { + result.push(node); + } + + stack.push(node); + }); + + return result; +} diff --git a/uno.config.ts b/uno.config.ts index 17afd08..75bd478 100644 --- a/uno.config.ts +++ b/uno.config.ts @@ -2,6 +2,8 @@ import { defineConfig, presetIcons, presetTypography, presetUno, transformerDire import presetShadcn from "./preset.shadcn"; export default defineConfig({ - presets: [presetUno(), presetTypography(), presetIcons(), presetShadcn()], + presets: [presetUno(), presetTypography(), presetIcons({ + scale: 1.2, + }), presetShadcn()], transformers: [transformerDirectives()], }); From fefe621aeaeee33501f501ee03fc75d663375c8c Mon Sep 17 00:00:00 2001 From: cole Date: Thu, 24 Oct 2024 18:00:24 +0800 Subject: [PATCH 003/109] feat: sidebar and motion-reduce --- .gitignore | 2 - .vitepress/config.ts | 14 +- .vscode/settings.json | 3 + package.json | 1 + pnpm-lock.yaml | 672 +++++++++++++++++++++++ theme/components/BButton.vue | 2 +- theme/components/BCollapse.vue | 39 +- theme/components/BDrawer.vue | 50 +- theme/components/BIcon.vue | 2 +- theme/components/BMask.vue | 62 +++ theme/components/BNav.vue | 2 +- theme/components/BSidebar.vue | 11 +- theme/components/BSidebarItem.vue | 51 +- theme/composables/useDisplayDirective.ts | 11 + theme/composables/useLockHtmlScroll.ts | 110 ++++ theme/composables/useSidebar.ts | 19 + theme/index.ts | 1 + theme/styles/base.css | 4 +- theme/styles/var.css | 15 + theme/types.ts | 20 +- theme/utils/sidebar.ts | 133 +++++ tsconfig.app.json | 6 +- tsconfig.app.tsbuildinfo | 1 + tsconfig.node.json | 6 +- tsconfig.node.tsbuildinfo | 1 + uno.config.ts | 10 + 26 files changed, 1148 insertions(+), 100 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 theme/components/BMask.vue create mode 100644 theme/composables/useDisplayDirective.ts create mode 100644 theme/composables/useLockHtmlScroll.ts create mode 100644 theme/utils/sidebar.ts create mode 100644 tsconfig.app.tsbuildinfo create mode 100644 tsconfig.node.tsbuildinfo diff --git a/.gitignore b/.gitignore index e778ca8..7e02683 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,6 @@ dist-ssr *.local # Editor directories and files -.vscode/* -!.vscode/extensions.json .idea .DS_Store *.suo diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 657d602..06827eb 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -1,4 +1,5 @@ import UnoCSS from "unocss/vite"; +import DevTools from "vite-plugin-vue-devtools"; import { defineConfigWithTheme } from "vitepress"; import type { ThemeConfig } from "../theme/types"; @@ -15,6 +16,8 @@ export default async () => { srcDir: "src", cleanUrls: true, lastUpdated: true, + // TODO + ignoreDeadLinks: true, themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: "/logo.webp", @@ -63,10 +66,10 @@ export default async () => { { text: "参考", items: [ - { text: "站点配置", link: "site-config" }, - { text: "frontmatter 配置", link: "frontmatter-config" }, - { text: "运行时 API", link: "runtime-api" }, - { text: "CLI", link: "cli" }, + { text: "站点配置", link: "/site-config" }, + { text: "frontmatter 配置", link: "/frontmatter-config" }, + { text: "运行时 API", link: "/runtime-api" }, + { text: "CLI", link: "/cli" }, { text: "默认主题", base: "/zh/reference/default-theme-", @@ -87,6 +90,7 @@ export default async () => { { text: "默认主题", base: "/zh/reference/default-theme-", + collapsed: true, items: [ { text: "概览", link: "config" }, { text: "导航栏", link: "nav" }, @@ -115,7 +119,7 @@ export default async () => { ], }, vite: { - plugins: [UnoCSS()], + plugins: [UnoCSS(), DevTools()], }, }); }; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fda0122 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "eslint.quiet": true +} diff --git a/package.json b/package.json index 2e270d9..3f2e280 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "simple-git-hooks": "^2.11.1", "typescript": "^5.5.3", "vite": "^5.4.8", + "vite-plugin-vue-devtools": "^7.5.3", "vitepress": "^1.4.1", "vue-tsc": "^2.1.6" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3c9e84..36be554 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,6 +72,9 @@ importers: vite: specifier: ^5.4.8 version: 5.4.9(@types/node@22.7.9) + vite-plugin-vue-devtools: + specifier: ^7.5.3 + version: 7.5.3(rollup@4.24.0)(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3)) vitepress: specifier: ^1.4.1 version: 1.4.1(@algolia/client-search@4.24.0)(@types/node@22.7.9)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3) @@ -164,27 +167,171 @@ packages: resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.25.9': + resolution: {integrity: sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.9': + resolution: {integrity: sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.9': + resolution: {integrity: sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.9': + resolution: {integrity: sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.9': + resolution: {integrity: sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.7': resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.9': + resolution: {integrity: sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.7': resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.25.8': resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.9': + resolution: {integrity: sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.25.9': + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.25.9': + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.25.9': + resolution: {integrity: sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.8': resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.9': + resolution: {integrity: sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==} + engines: {node: '>=6.9.0'} + '@bernankez/eslint-config@2.2.0': resolution: {integrity: sha512-IQCRpR7Mjm0QTZkx6a+Vj6XN0clNA1IIakv/76ov4hualUAhle+MYMItay1kQB73DiEHwNFDnmI9EAI1KINOCQ==} hasBin: true @@ -1044,6 +1191,22 @@ packages: '@volar/typescript@2.4.6': resolution: {integrity: sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==} + '@vue/babel-helper-vue-transform-on@1.2.5': + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + + '@vue/babel-plugin-jsx@1.2.5': + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.5': + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@vue/compiler-core@3.5.12': resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} @@ -1062,12 +1225,23 @@ packages: '@vue/devtools-api@7.5.2': resolution: {integrity: sha512-VxPbAQxJrYSIkoGVvQ2oOoKW8u4CMpvRLySTxhoJA38z8bQEGy9GO33eoRY/DulJbSFRfjZFNvH+dh8B4qpesQ==} + '@vue/devtools-core@7.5.3': + resolution: {integrity: sha512-KIzT76GPubhvvQzjQtf7yhaSdVOcq/0CV2QbUw2bf3vzV+biHsgfgQ1XEbPbPKuHr1t0zshj53mBv0bx2OmkJw==} + peerDependencies: + vue: ^3.0.0 + '@vue/devtools-kit@7.5.2': resolution: {integrity: sha512-0leUOE2HBfl8sHf9ePKzxqnCFskkU22tWWqd9OfeSlslAKE30/TViYvWcF4vgQmPlJnAAdHU0WfW5dYlCeOiuw==} + '@vue/devtools-kit@7.5.3': + resolution: {integrity: sha512-XSTXCAHshYniK3gLQfhMRDuDLLj6vHFWKVl1tvtSgZ0iJy5AXoI4U/GKGlyS2uS1hwZCSoNSGdkKtbW/pn/Iuw==} + '@vue/devtools-shared@7.5.2': resolution: {integrity: sha512-+zmcixnD6TAo+zwm30YuwZckhL9iIi4u+gFwbq9C8zpm3SMndTlEYZtNhAHUhOXB+bCkzyunxw80KQ/T0trF4w==} + '@vue/devtools-shared@7.5.3': + resolution: {integrity: sha512-i2tCUtAEQ0S8AmTuy6FSOmVKCB5ajmMaVrrw0ypX75koLSo1mssQ8zezds5IoUZHRiXBsgoGHbJGuGwyrSGhqQ==} + '@vue/language-core@2.1.6': resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: @@ -1229,6 +1403,10 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bundle-require@5.0.0: resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1342,6 +1520,9 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} @@ -1388,6 +1569,18 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -1435,6 +1628,9 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} @@ -1800,6 +1996,10 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1808,6 +2008,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1831,6 +2035,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -1888,6 +2096,10 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -1933,6 +2145,11 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1959,6 +2176,11 @@ packages: eslint: '*' typescript: '>=4.7.4' + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1971,6 +2193,10 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2017,10 +2243,18 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonc-eslint-parser@2.4.0: resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2076,6 +2310,9 @@ packages: lowlight@1.17.0: resolution: {integrity: sha512-vmtBgYKD+QVNy7tIa7ulz5d//Il9R4MooOVh4nkOf9R9Cb/Dk5TXMSTieg/vDulkBkIWj59/BIlyFQxT9X1oAQ==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} @@ -2204,6 +2441,10 @@ packages: oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2386,6 +2627,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2396,6 +2641,10 @@ packages: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -2428,6 +2677,10 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2525,6 +2778,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + synckit@0.6.2: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} @@ -2645,6 +2901,10 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unocss@0.63.6: resolution: {integrity: sha512-OKJJKEFWVz+Lsf3JdOgRiRtL+QOUQRBov89taUcCPFPZtrhP6pPVFCZHD9qMvY4IChMX7dzalQax3ZXJ3hbtkQ==} engines: {node: '>=14'} @@ -2678,6 +2938,32 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-hot-client@0.2.3: + resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + + vite-plugin-inspect@0.8.7: + resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-devtools@7.5.3: + resolution: {integrity: sha512-gpR4S1anwc3rEapcealw0EATfQHO7jLCPqqT2qZAYLyVXsRi+Ysk7Z+kr/iq0sROfcVfSNAqAMB7foZobj2m5Q==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 + + vite-plugin-vue-inspector@5.2.0: + resolution: {integrity: sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + vite@5.4.9: resolution: {integrity: sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2783,6 +3069,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml-eslint-parser@1.2.3: resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} engines: {node: ^14.17.0 || >=16.0.0} @@ -2941,10 +3230,133 @@ snapshots: '@babel/highlight': 7.25.7 picocolors: 1.1.1 + '@babel/code-frame@7.25.9': + dependencies: + '@babel/highlight': 7.25.9 + picocolors: 1.1.1 + + '@babel/compat-data@7.25.9': {} + + '@babel/core@7.25.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.25.9 + '@babel/generator': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.25.9(@babel/core@7.25.9) + '@babel/helpers': 7.25.9 + '@babel/parser': 7.25.9 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.9 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.9': + dependencies: + '@babel/types': 7.25.9 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.25.9 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.25.9 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.25.9 + '@babel/highlight@7.25.7': dependencies: '@babel/helper-validator-identifier': 7.25.7 @@ -2952,16 +3364,95 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/parser@7.25.8': dependencies: '@babel/types': 7.25.8 + '@babel/parser@7.25.9': + dependencies: + '@babel/types': 7.25.9 + + '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.25.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.25.9) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.25.9 + '@babel/parser': 7.25.9 + '@babel/types': 7.25.9 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.25.9 + '@babel/generator': 7.25.9 + '@babel/parser': 7.25.9 + '@babel/template': 7.25.9 + '@babel/types': 7.25.9 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.8': dependencies: '@babel/helper-string-parser': 7.25.7 '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@bernankez/eslint-config@2.2.0(@typescript-eslint/utils@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(@unocss/eslint-plugin@0.63.6(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint-plugin-format@0.1.2(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@antfu/install-pkg': 0.4.1 @@ -3846,6 +4337,36 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.0.8 + '@vue/babel-helper-vue-transform-on@1.2.5': {} + + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.25.9)': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.9) + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.25.8 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.25.9) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.25.9)': + dependencies: + '@babel/code-frame': 7.25.7 + '@babel/core': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/parser': 7.25.8 + '@vue/compiler-sfc': 3.5.12 + transitivePeerDependencies: + - supports-color + '@vue/compiler-core@3.5.12': dependencies: '@babel/parser': 7.25.8 @@ -3885,6 +4406,18 @@ snapshots: dependencies: '@vue/devtools-kit': 7.5.2 + '@vue/devtools-core@7.5.3(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3))': + dependencies: + '@vue/devtools-kit': 7.5.3 + '@vue/devtools-shared': 7.5.3 + mitt: 3.0.1 + nanoid: 3.3.7 + pathe: 1.1.2 + vite-hot-client: 0.2.3(vite@5.4.9(@types/node@22.7.9)) + vue: 3.5.12(typescript@5.6.3) + transitivePeerDependencies: + - vite + '@vue/devtools-kit@7.5.2': dependencies: '@vue/devtools-shared': 7.5.2 @@ -3895,10 +4428,24 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 + '@vue/devtools-kit@7.5.3': + dependencies: + '@vue/devtools-shared': 7.5.3 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.1 + '@vue/devtools-shared@7.5.2': dependencies: rfdc: 1.4.1 + '@vue/devtools-shared@7.5.3': + dependencies: + rfdc: 1.4.1 + '@vue/language-core@2.1.6(typescript@5.6.3)': dependencies: '@volar/language-core': 2.4.6 @@ -4056,6 +4603,10 @@ snapshots: builtin-modules@3.3.0: {} + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + bundle-require@5.0.0(esbuild@0.23.1): dependencies: esbuild: 0.23.1 @@ -4158,6 +4709,8 @@ snapshots: consola@3.2.3: {} + convert-source-map@2.0.0: {} + copy-anything@3.0.5: dependencies: is-what: 4.1.16 @@ -4193,6 +4746,15 @@ snapshots: deep-is@0.1.4: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-lazy-prop@3.0.0: {} + defu@6.1.4: {} dequal@2.0.3: {} @@ -4234,6 +4796,8 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser-es@0.1.5: {} + es-module-lexer@1.5.4: {} esbuild@0.21.5: @@ -4794,11 +5358,19 @@ snapshots: format@0.2.2: {} + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fsevents@2.3.3: optional: true function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-east-asian-width@1.3.0: {} @@ -4817,6 +5389,8 @@ snapshots: dependencies: is-glob: 4.0.3 + globals@11.12.0: {} + globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -4872,6 +5446,8 @@ snapshots: hosted-git-info@2.8.9: {} + html-tags@3.3.1: {} + html-void-elements@3.0.0: {} human-signals@5.0.0: {} @@ -4915,6 +5491,8 @@ snapshots: dependencies: hasown: 2.0.2 + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -4939,12 +5517,20 @@ snapshots: transitivePeerDependencies: - supports-color + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-number@7.0.0: {} is-stream@3.0.0: {} is-what@4.1.16: {} + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isexe@2.0.0: {} jiti@1.21.6: {} @@ -4976,6 +5562,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonc-eslint-parser@2.4.0: dependencies: acorn: 8.13.0 @@ -4983,6 +5571,12 @@ snapshots: espree: 9.6.1 semver: 7.6.3 + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -5054,6 +5648,10 @@ snapshots: fault: 1.0.4 highlight.js: 10.4.1 + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5182,6 +5780,13 @@ snapshots: dependencies: regex: 4.3.3 + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -5358,6 +5963,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 + run-applescript@7.0.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -5366,6 +5973,8 @@ snapshots: semver@5.7.2: {} + semver@6.3.1: {} + semver@7.6.3: {} shebang-command@2.0.0: @@ -5395,6 +6004,12 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + sisteransi@1.0.5: {} slashes@3.0.12: {} @@ -5487,6 +6102,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svg-tags@1.0.0: {} + synckit@0.6.2: dependencies: tslib: 2.8.0 @@ -5599,6 +6216,8 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + universalify@2.0.1: {} + unocss@0.63.6(postcss@8.4.47)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)): dependencies: '@unocss/astro': 0.63.6(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.9)) @@ -5653,6 +6272,57 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite-hot-client@0.2.3(vite@5.4.9(@types/node@22.7.9)): + dependencies: + vite: 5.4.9(@types/node@22.7.9) + + vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.9(@types/node@22.7.9)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + debug: 4.3.7 + error-stack-parser-es: 0.1.5 + fs-extra: 11.2.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.1.1 + sirv: 2.0.4 + vite: 5.4.9(@types/node@22.7.9) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-vue-devtools@7.5.3(rollup@4.24.0)(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3)): + dependencies: + '@vue/devtools-core': 7.5.3(vite@5.4.9(@types/node@22.7.9))(vue@3.5.12(typescript@5.6.3)) + '@vue/devtools-kit': 7.5.3 + '@vue/devtools-shared': 7.5.3 + execa: 8.0.1 + sirv: 3.0.0 + vite: 5.4.9(@types/node@22.7.9) + vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.9(@types/node@22.7.9)) + vite-plugin-vue-inspector: 5.2.0(vite@5.4.9(@types/node@22.7.9)) + transitivePeerDependencies: + - '@nuxt/kit' + - rollup + - supports-color + - vue + + vite-plugin-vue-inspector@5.2.0(vite@5.4.9(@types/node@22.7.9)): + dependencies: + '@babel/core': 7.25.9 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.25.9) + '@babel/plugin-syntax-import-attributes': 7.25.9(@babel/core@7.25.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.9) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.25.9) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.9) + '@vue/compiler-dom': 3.5.12 + kolorist: 1.8.0 + magic-string: 0.30.12 + vite: 5.4.9(@types/node@22.7.9) + transitivePeerDependencies: + - supports-color + vite@5.4.9(@types/node@22.7.9): dependencies: esbuild: 0.21.5 @@ -5775,6 +6445,8 @@ snapshots: y18n@5.0.8: {} + yallist@3.1.1: {} + yaml-eslint-parser@1.2.3: dependencies: eslint-visitor-keys: 3.4.3 diff --git a/theme/components/BButton.vue b/theme/components/BButton.vue index 432ed50..bba3870 100644 --- a/theme/components/BButton.vue +++ b/theme/components/BButton.vue @@ -12,7 +12,7 @@ const emit = defineEmits<{ click: [e: MouseEvent]; }>(); -const buttonVariants = cva("transition hover:bg-opacity-90", { +const buttonVariants = cva("transition motion-reduce:transition-none hover:bg-opacity-90", { variants: { variant: { primary: "bg-primary text-primary-foreground", diff --git a/theme/components/BCollapse.vue b/theme/components/BCollapse.vue index 0b8b4a4..3f82ac0 100644 --- a/theme/components/BCollapse.vue +++ b/theme/components/BCollapse.vue @@ -14,7 +14,7 @@ const { disabled, headerClass, titleClass, title, readonly, defaultCollapsed = f defaultCollapsed?: boolean; }>(); -const collapseVariants = cva("cursor-pointer", { +const collapseVariants = cva("cursor-pointer max-h-fit", { variants: { disabled: { true: "cursor-not-allowed text-muted-foreground", @@ -25,32 +25,55 @@ const collapseVariants = cva("cursor-pointer", { }, }); -const _collapsed = defineModel({ - default: false, +const _collapsed = defineModel({ + default: undefined, }); const uncontrolled = ref(defaultCollapsed); const collapsed = useMergedState(_collapsed, uncontrolled); export type CollapseVariants = VariantProps; + +function onCollapse() { + if (readonly || disabled) { + return; + } + collapsed.value = !collapsed.value; +} + + diff --git a/theme/components/BDrawer.vue b/theme/components/BDrawer.vue index 29ccf34..1ba8c63 100644 --- a/theme/components/BDrawer.vue +++ b/theme/components/BDrawer.vue @@ -1,10 +1,11 @@ diff --git a/theme/components/BNav.vue b/theme/components/BNav.vue index 27e9cce..bb5e3a0 100644 --- a/theme/components/BNav.vue +++ b/theme/components/BNav.vue @@ -40,7 +40,7 @@ const showDrawer = ref(false); - + diff --git a/theme/components/BSidebar.vue b/theme/components/BSidebar.vue index 8a3c0a5..5de87f7 100644 --- a/theme/components/BSidebar.vue +++ b/theme/components/BSidebar.vue @@ -1,15 +1,10 @@ diff --git a/theme/components/BSidebarItem.vue b/theme/components/BSidebarItem.vue index 41e52ac..daba316 100644 --- a/theme/components/BSidebarItem.vue +++ b/theme/components/BSidebarItem.vue @@ -1,54 +1,45 @@