From df8753bd927c2b57b9188fb292c1429e9c3c8ab6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 12 Mar 2024 23:29:29 +0800 Subject: [PATCH 01/50] docs: tweak hero action buttons --- docs/index.md | 9 ++++++--- docs/pt/index.md | 7 +++++-- docs/zh/index.md | 5 ++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/index.md b/docs/index.md index 9bdd428b..9be32c3e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,13 +7,16 @@ titleTemplate: Vite & Vue Powered Static Site Generator hero: name: VitePress text: Vite & Vue Powered Static Site Generator - tagline: Simple, powerful, and fast. Meet the modern SSG framework you've always wanted. + tagline: Markdown to Beautiful Docs in Minutes actions: - theme: brand - text: Get Started + text: What is VitePress? + link: /guide/what-is-vitepress + - theme: alt + text: Quickstart link: /guide/getting-started - theme: alt - text: View on GitHub + text: GitHub link: https://github.com/vuejs/vitepress image: src: /vitepress-logo-large.webp diff --git a/docs/pt/index.md b/docs/pt/index.md index 41c72d54..3f979dca 100644 --- a/docs/pt/index.md +++ b/docs/pt/index.md @@ -7,13 +7,16 @@ titleTemplate: Gerador de Site Estático desenvolvido com Vite & Vue hero: name: VitePress text: Gerador de Site Estático Vite & Vue - tagline: Simples, poderoso e rápido. Conheça o moderno framework SSG que você sempre quis. + tagline: Markdown para Lindos Documentos em Minutos actions: - theme: brand + text: O que é VitePress? + link: /pt/guide/what-is-vitepress + - theme: alt text: Iniciar link: /pt/guide/getting-started - theme: alt - text: Ver no GitHub + text: GitHub link: https://github.com/vuejs/vitepress image: src: /vitepress-logo-large.webp diff --git a/docs/zh/index.md b/docs/zh/index.md index 3f7c2207..23299c1f 100644 --- a/docs/zh/index.md +++ b/docs/zh/index.md @@ -7,9 +7,12 @@ titleTemplate: 由 Vite 和 Vue 驱动的静态站点生成器 hero: name: VitePress text: 由 Vite 和 Vue 驱动的静态站点生成器 - tagline: 简单、强大、快速。就是你想要的现代 SSG 框架! + tagline: 将 Markdown 变成优雅的文档,只需几分钟 actions: - theme: brand + text: 什么是 VitePress? + link: /zh/guide/what-is-vitepress + - theme: alt text: 快速开始 link: /zh/guide/getting-started - theme: alt From b50a8a132577693817a15ab43fc4cc22670a8a65 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Sun, 17 Mar 2024 10:38:57 +0100 Subject: [PATCH 02/50] fix(theme): ignore inner-page items in next/prev link (#3663) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- src/client/theme-default/composables/prev-next.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/client/theme-default/composables/prev-next.ts b/src/client/theme-default/composables/prev-next.ts index 5bc39eca..7deb00f2 100644 --- a/src/client/theme-default/composables/prev-next.ts +++ b/src/client/theme-default/composables/prev-next.ts @@ -8,7 +8,10 @@ export function usePrevNext() { return computed(() => { const sidebar = getSidebar(theme.value.sidebar, page.value.relativePath) - const candidates = getFlatSideBarLinks(sidebar) + const links = getFlatSideBarLinks(sidebar) + + // ignore inner-page links with hashes + const candidates = uniqBy(links, (link) => link.link.replace(/[?#].*$/, '')) const index = candidates.findIndex((link) => { return isActive(page.value.relativePath, link.link) @@ -61,3 +64,11 @@ export function usePrevNext() { } }) } + +function uniqBy(array: T[], keyFn: (item: T) => any): T[] { + const seen = new Set() + return array.filter((item) => { + const k = keyFn(item) + return seen.has(k) ? false : seen.add(k) + }) +} From e13f93292ce1a2b1d5ba161fddfe947a1824a2b0 Mon Sep 17 00:00:00 2001 From: Andrew Courtice Date: Mon, 18 Mar 2024 13:25:43 +1000 Subject: [PATCH 03/50] fix(theme): fixed sidebar expand caret showing when no children are present (#3657) --- src/client/theme-default/components/VPSidebarItem.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/theme-default/components/VPSidebarItem.vue b/src/client/theme-default/components/VPSidebarItem.vue index f6c1c316..59782e0d 100644 --- a/src/client/theme-default/components/VPSidebarItem.vue +++ b/src/client/theme-default/components/VPSidebarItem.vue @@ -82,7 +82,7 @@ function onCaretClick() {
Date: Mon, 18 Mar 2024 11:28:38 +0800 Subject: [PATCH 04/50] fix(localSearch): remove empty titles that may appear in search results (#3665) --- src/node/plugins/localSearchPlugin.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/node/plugins/localSearchPlugin.ts b/src/node/plugins/localSearchPlugin.ts index e94eafb7..c223c326 100644 --- a/src/node/plugins/localSearchPlugin.ts +++ b/src/node/plugins/localSearchPlugin.ts @@ -235,8 +235,9 @@ function* splitPageIntoSections(html: string) { const anchor = headingResult?.[2] ?? '' const content = result[i + 2] if (!title || !content) continue - const titles = parentTitles.slice(0, level) + let titles = parentTitles.slice(0, level) titles[level] = title + titles = titles.filter(Boolean) yield { anchor, titles, text: getSearchableText(content) } if (level === 0) { parentTitles = [title] From 38ac579d17bdadfae0250271e52801b4189b6e11 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 21 Mar 2024 22:13:11 +0800 Subject: [PATCH 05/50] chore: bump vite version --- package.json | 2 +- pnpm-lock.yaml | 401 +++++++++++++++++++------------------------------ 2 files changed, 152 insertions(+), 251 deletions(-) diff --git a/package.json b/package.json index 51d5bd14..e47f5695 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "mark.js": "8.11.1", "minisearch": "^6.3.0", "shiki": "^1.1.7", - "vite": "^5.1.5", + "vite": "^5.2.2", "vue": "^3.4.21" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bd77169..8f80aba9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: version: 13.0.7 '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.1.5)(vue@3.4.21) + version: 5.0.4(vite@5.2.2)(vue@3.4.21) '@vue/devtools-api': specifier: ^7.0.16 version: 7.0.16(vue@3.4.21) @@ -51,8 +51,8 @@ importers: specifier: ^1.1.7 version: 1.1.7 vite: - specifier: ^5.1.5 - version: 5.1.5(@types/node@20.11.25) + specifier: ^5.2.2 + version: 5.2.2(@types/node@20.11.25) vue: specifier: ^3.4.21 version: 3.4.21(typescript@5.4.2) @@ -558,29 +558,12 @@ packages: - '@algolia/client-search' dev: false - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - optional: true - /@esbuild/aix-ppc64@0.20.1: resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true optional: true /@esbuild/android-arm64@0.20.1: @@ -589,15 +572,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true optional: true /@esbuild/android-arm@0.20.1: @@ -606,15 +580,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true optional: true /@esbuild/android-x64@0.20.1: @@ -623,15 +588,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true optional: true /@esbuild/darwin-arm64@0.20.1: @@ -640,15 +596,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true optional: true /@esbuild/darwin-x64@0.20.1: @@ -657,15 +604,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true optional: true /@esbuild/freebsd-arm64@0.20.1: @@ -674,15 +612,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true optional: true /@esbuild/freebsd-x64@0.20.1: @@ -691,15 +620,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-arm64@0.20.1: @@ -708,15 +628,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-arm@0.20.1: @@ -725,15 +636,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-ia32@0.20.1: @@ -742,15 +644,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-loong64@0.20.1: @@ -759,15 +652,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-mips64el@0.20.1: @@ -776,15 +660,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-ppc64@0.20.1: @@ -793,15 +668,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-riscv64@0.20.1: @@ -810,15 +676,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-s390x@0.20.1: @@ -827,15 +684,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-x64@0.20.1: @@ -844,15 +692,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true optional: true /@esbuild/netbsd-x64@0.20.1: @@ -861,15 +700,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true optional: true /@esbuild/openbsd-x64@0.20.1: @@ -878,15 +708,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true optional: true /@esbuild/sunos-x64@0.20.1: @@ -895,15 +716,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true optional: true /@esbuild/win32-arm64@0.20.1: @@ -912,15 +724,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true optional: true /@esbuild/win32-ia32@0.20.1: @@ -929,15 +732,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true optional: true /@esbuild/win32-x64@0.20.1: @@ -946,7 +740,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@hapi/hoek@9.3.0: @@ -1213,6 +1006,14 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + requiresBuild: true optional: true /@rollup/rollup-android-arm64@4.12.1: @@ -1220,6 +1021,14 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + requiresBuild: true optional: true /@rollup/rollup-darwin-arm64@4.12.1: @@ -1227,6 +1036,14 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true optional: true /@rollup/rollup-darwin-x64@4.12.1: @@ -1234,6 +1051,14 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + requiresBuild: true optional: true /@rollup/rollup-linux-arm-gnueabihf@4.12.1: @@ -1241,6 +1066,14 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + requiresBuild: true optional: true /@rollup/rollup-linux-arm64-gnu@4.12.1: @@ -1248,6 +1081,14 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + requiresBuild: true optional: true /@rollup/rollup-linux-arm64-musl@4.12.1: @@ -1255,6 +1096,14 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + requiresBuild: true optional: true /@rollup/rollup-linux-riscv64-gnu@4.12.1: @@ -1262,6 +1111,14 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true optional: true /@rollup/rollup-linux-x64-gnu@4.12.1: @@ -1269,6 +1126,14 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + requiresBuild: true optional: true /@rollup/rollup-linux-x64-musl@4.12.1: @@ -1276,6 +1141,14 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + requiresBuild: true optional: true /@rollup/rollup-win32-arm64-msvc@4.12.1: @@ -1283,6 +1156,14 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + requiresBuild: true optional: true /@rollup/rollup-win32-ia32-msvc@4.12.1: @@ -1290,6 +1171,14 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + requiresBuild: true optional: true /@rollup/rollup-win32-x64-msvc@4.12.1: @@ -1297,6 +1186,14 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + requiresBuild: true optional: true /@shikijs/core@1.1.7: @@ -1477,14 +1374,14 @@ packages: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: false - /@vitejs/plugin-vue@5.0.4(vite@5.1.5)(vue@3.4.21): + /@vitejs/plugin-vue@5.0.4(vite@5.2.2)(vue@3.4.21): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.1.5(@types/node@20.11.25) + vite: 5.2.2(@types/node@20.11.25) vue: 3.4.21(typescript@5.4.2) dev: false @@ -2522,36 +2419,6 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - /esbuild@0.20.1: resolution: {integrity: sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==} engines: {node: '>=12'} @@ -2581,7 +2448,6 @@ packages: '@esbuild/win32-arm64': 0.20.1 '@esbuild/win32-ia32': 0.20.1 '@esbuild/win32-x64': 0.20.1 - dev: true /escape-goat@3.0.0: resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} @@ -4021,6 +3887,14 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + /preact@10.19.6: resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} dev: false @@ -4225,6 +4099,29 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.12.1 '@rollup/rollup-win32-x64-msvc': 4.12.1 fsevents: 2.3.3 + dev: true + + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 + fsevents: 2.3.3 /run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} @@ -4439,6 +4336,10 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -4865,7 +4766,7 @@ packages: debug: 4.3.4(supports-color@9.4.0) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.11.25) + vite: 5.2.2(@types/node@20.11.25) transitivePeerDependencies: - '@types/node' - less @@ -4877,8 +4778,8 @@ packages: - terser dev: true - /vite@5.1.5(@types/node@20.11.25): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + /vite@5.2.2(@types/node@20.11.25): + resolution: {integrity: sha512-FWZbz0oSdLq5snUI0b6sULbz58iXFXdvkZfZWR/F0ZJuKTSPO7v72QPXt6KqYeMFb0yytNp6kZosxJ96Nr/wDQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4906,9 +4807,9 @@ packages: optional: true dependencies: '@types/node': 20.11.25 - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.12.1 + esbuild: 0.20.1 + postcss: 8.4.38 + rollup: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -4955,7 +4856,7 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.5(@types/node@20.11.25) + vite: 5.2.2(@types/node@20.11.25) vite-node: 1.3.1(@types/node@20.11.25)(supports-color@9.4.0) why-is-node-running: 2.2.2 transitivePeerDependencies: From 0b68382121b60dc934d9b82c4d159638c3c74c55 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 21 Mar 2024 23:16:15 +0800 Subject: [PATCH 06/50] docs: document metaChunk --- docs/reference/site-config.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/reference/site-config.md b/docs/reference/site-config.md index ec853063..e11f42b9 100644 --- a/docs/reference/site-config.md +++ b/docs/reference/site-config.md @@ -471,6 +471,13 @@ export default { } ``` +### metaChunk + +- Type: `boolean` +- Default: `false` + +When set to `true`, extract pages metadata to a separate JavaScript chunk instead of inlining it in the initial HTML. This makes each page's HTML payload smaller and makes the pages metadata cacheable, thus reducing server bandwidth when you have many pages in the site. + ### mpa - Type: `boolean` From 88a4284f3a6cbec2145b38496f733eb711fa3024 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 21 Mar 2024 23:17:07 +0800 Subject: [PATCH 07/50] docs: tweak intro perf section --- docs/guide/what-is-vitepress.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/what-is-vitepress.md b/docs/guide/what-is-vitepress.md index 22ca0316..a498d17e 100644 --- a/docs/guide/what-is-vitepress.md +++ b/docs/guide/what-is-vitepress.md @@ -34,11 +34,11 @@ VitePress aims to provide a great Developer Experience (DX) when working with Ma ## Performance -Unlike many traditional SSGs, a website generated by VitePress is in fact a [Single Page Application](https://en.wikipedia.org/wiki/Single-page_application) (SPA). +Unlike many traditional SSGs where each navigation results in a full page reload, a website generated by VitePress serves static HTML on the initial visit, but becomes a [Single Page Application](https://en.wikipedia.org/wiki/Single-page_application) (SPA) for subsequent navigation within the site. This model, in our opinion, provides an optimal balance for performance: - **Fast Initial Load** - The initial visit to any page will be served the static, pre-rendered HTML for blazing fast loading speed and optimal SEO. The page then loads a JavaScript bundle that turns the page into a Vue SPA ("hydration"). The hydration process is extremely fast: on [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F), typical VitePress sites achieve near-perfect performance scores even on low-end mobile devices with a slow network. + The initial visit to any page will be served the static, pre-rendered HTML for fast loading speed and optimal SEO. The page then loads a JavaScript bundle that turns the page into a Vue SPA ("hydration"). Contrary to common assumptions of SPA hydration being slow, this process is actually extremely fast thanks to Vue 3's raw performance and compiler optimizations. On [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F), typical VitePress sites achieve near-perfect performance scores even on low-end mobile devices with a slow network. - **Fast Post-load Navigation** From 05061bd3d25173d581b3b93bd60fd046bf4a4347 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 21 Mar 2024 23:18:55 +0800 Subject: [PATCH 08/50] release: v1.0.0 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4207b2d3..f45a3d48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# [1.0.0](https://github.com/vuejs/vitepress/compare/v1.0.0-rc.45...v1.0.0) (2024-03-21) + +### Bug Fixes + +- **build:** resolve pattern relative to srcDir instead of root in createContentLoader ([#3638](https://github.com/vuejs/vitepress/issues/3638)) ([59183e9](https://github.com/vuejs/vitepress/commit/59183e9cef112a004c8a8e2b365478af657858b0)) +- **localSearch:** remove empty titles that may appear in search results ([#3665](https://github.com/vuejs/vitepress/issues/3665)) ([f7aef3c](https://github.com/vuejs/vitepress/commit/f7aef3ca23dae39e226c85d7bb2579dbf7c758f3)) +- **theme:** fixed sidebar expand caret showing when no children are present ([#3657](https://github.com/vuejs/vitepress/issues/3657)) ([e13f932](https://github.com/vuejs/vitepress/commit/e13f93292ce1a2b1d5ba161fddfe947a1824a2b0)) +- **theme:** ignore inner-page items in next/prev link ([#3663](https://github.com/vuejs/vitepress/issues/3663)) ([b50a8a1](https://github.com/vuejs/vitepress/commit/b50a8a132577693817a15ab43fc4cc22670a8a65)) +- **theme:** local nav separator not visible on pages having no outline ([1909041](https://github.com/vuejs/vitepress/commit/190904171500ad22998c8666080fd58c867a59b5)) + +### Features + +- **theme:** allow selectively disabling external link icon on navbar items ([#3607](https://github.com/vuejs/vitepress/issues/3607)) ([5f6297c](https://github.com/vuejs/vitepress/commit/5f6297cb3df98926154235f31570e75820d4ea16)) + # [1.0.0-rc.45](https://github.com/vuejs/vitepress/compare/v1.0.0-rc.44...v1.0.0-rc.45) (2024-03-06) ### Bug Fixes diff --git a/package.json b/package.json index e47f5695..0cba07de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "1.0.0-rc.45", + "version": "1.0.0", "description": "Vite & Vue powered static site generator", "type": "module", "packageManager": "pnpm@8.15.4", From 5d3cb96ac364413aa9eb494bc91744bd8f4a2c79 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 22 Mar 2024 11:17:53 +0530 Subject: [PATCH 09/50] fix(build): ship built-in vue-demi to avoid resolution issues (#3680) --- lib/vue-demi.mjs | 34 ++++++++++++++++++++++++++++++++++ package.json | 6 +++++- src/node/alias.ts | 4 ++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 lib/vue-demi.mjs diff --git a/lib/vue-demi.mjs b/lib/vue-demi.mjs new file mode 100644 index 00000000..fd8ead4f --- /dev/null +++ b/lib/vue-demi.mjs @@ -0,0 +1,34 @@ +/** + * vue-demi v0.14.7 + * Copyright (c) 2020-present, Anthony Fu + * @license MIT + */ + +import * as Vue from 'vue' + +var isVue2 = false +var isVue3 = true +var Vue2 = undefined + +function install() {} + +export function set(target, key, val) { + if (Array.isArray(target)) { + target.length = Math.max(target.length, key) + target.splice(key, 1, val) + return val + } + target[key] = val + return val +} + +export function del(target, key) { + if (Array.isArray(target)) { + target.splice(key, 1) + return + } + delete target[key] +} + +export * from 'vue' +export { Vue, Vue2, isVue2, isVue3, install } diff --git a/package.json b/package.json index 0cba07de..47c01c7f 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "./theme-without-fonts": { "types": "./theme-without-fonts.d.ts", "default": "./dist/client/theme-default/without-fonts.js" + }, + "./vue-demi": { + "default": "./lib/vue-demi.mjs" } }, "bin": { @@ -36,7 +39,8 @@ "template", "client.d.ts", "theme.d.ts", - "theme-without-fonts.d.ts" + "theme-without-fonts.d.ts", + "lib" ], "repository": { "type": "git", diff --git a/src/node/alias.ts b/src/node/alias.ts index aeefcbe1..66320adc 100644 --- a/src/node/alias.ts +++ b/src/node/alias.ts @@ -41,6 +41,10 @@ export function resolveAliases( { find: /^vitepress\/theme$/, replacement: join(DIST_CLIENT_PATH, '/theme-default/index.js') + }, + { + find: /^vue-demi$/, + replacement: require.resolve('vitepress/vue-demi') } ] From 66bae6bff71af30161cdb4136d8e075a670c15dc Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 22 Mar 2024 11:31:25 +0530 Subject: [PATCH 10/50] chore: bump deps --- package.json | 30 +- pnpm-lock.yaml | 825 ++++++++++++++++++++++--------------------------- 2 files changed, 383 insertions(+), 472 deletions(-) diff --git a/package.json b/package.json index 47c01c7f..563034fb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "Vite & Vue powered static site generator", "type": "module", - "packageManager": "pnpm@8.15.4", + "packageManager": "pnpm@8.15.5", "main": "dist/node/index.js", "types": "types/index.d.ts", "exports": { @@ -98,8 +98,8 @@ "dependencies": { "@docsearch/css": "^3.6.0", "@docsearch/js": "^3.6.0", - "@shikijs/core": "^1.1.7", - "@shikijs/transformers": "^1.1.7", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", "@types/markdown-it": "^13.0.7", "@vitejs/plugin-vue": "^5.0.4", "@vue/devtools-api": "^7.0.16", @@ -108,13 +108,13 @@ "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^6.3.0", - "shiki": "^1.1.7", + "shiki": "^1.2.0", "vite": "^5.2.2", "vue": "^3.4.21" }, "peerDependencies": { - "markdown-it-mathjax3": "^4.3.2", - "postcss": "^8.4.35" + "markdown-it-mathjax3": "^4", + "postcss": "^8" }, "peerDependenciesMeta": { "markdown-it-mathjax3": { @@ -150,7 +150,7 @@ "@types/markdown-it-emoji": "^2.0.4", "@types/micromatch": "^4.0.6", "@types/minimist": "^1.2.5", - "@types/node": "^20.11.25", + "@types/node": "^20.11.30", "@types/postcss-prefix-selector": "^1.16.3", "@types/prompts": "^2.4.9", "@vue/shared": "^3.4.21", @@ -158,17 +158,17 @@ "conventional-changelog-cli": "^4.1.0", "cross-spawn": "^7.0.3", "debug": "^4.3.4", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "escape-html": "^1.0.3", "execa": "^8.0.1", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", - "get-port": "^7.0.0", + "get-port": "^7.1.0", "gray-matter": "^4.0.3", "lint-staged": "^15.2.2", "lodash.template": "^4.5.0", "lru-cache": "^10.2.0", - "markdown-it": "^14.0.0", + "markdown-it": "^14.1.0", "markdown-it-anchor": "^8.6.7", "markdown-it-attrs": "^4.1.6", "markdown-it-container": "^4.0.0", @@ -190,17 +190,17 @@ "prompts": "^2.4.2", "punycode": "^2.3.1", "rimraf": "^5.0.5", - "rollup": "^4.12.1", + "rollup": "^4.13.0", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "^6.1.1", "semver": "^7.6.0", - "simple-git-hooks": "^2.10.0", + "simple-git-hooks": "^2.11.0", "sirv": "^2.0.4", "sitemap": "^7.1.1", "supports-color": "^9.4.0", - "typescript": "^5.4.2", - "vitest": "^1.3.1", - "vue-tsc": "^2.0.6", + "typescript": "^5.4.3", + "vitest": "^1.4.0", + "vue-tsc": "^2.0.7", "wait-on": "^7.2.0" }, "simple-git-hooks": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f80aba9..597c5473 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,11 +18,11 @@ importers: specifier: ^3.6.0 version: 3.6.0 '@shikijs/core': - specifier: ^1.1.7 - version: 1.1.7 + specifier: ^1.2.0 + version: 1.2.0 '@shikijs/transformers': - specifier: ^1.1.7 - version: 1.1.7 + specifier: ^1.2.0 + version: 1.2.0 '@types/markdown-it': specifier: ^13.0.7 version: 13.0.7 @@ -31,7 +31,7 @@ importers: version: 5.0.4(vite@5.2.2)(vue@3.4.21) '@vue/devtools-api': specifier: ^7.0.16 - version: 7.0.16(vue@3.4.21) + version: 7.0.20(vue@3.4.21) '@vueuse/core': specifier: ^10.9.0 version: 10.9.0(vue@3.4.21) @@ -48,14 +48,14 @@ importers: specifier: ^6.3.0 version: 6.3.0 shiki: - specifier: ^1.1.7 - version: 1.1.7 + specifier: ^1.2.0 + version: 1.2.0 vite: specifier: ^5.2.2 - version: 5.2.2(@types/node@20.11.25) + version: 5.2.2(@types/node@20.11.30) vue: specifier: ^3.4.21 - version: 3.4.21(typescript@5.4.2) + version: 3.4.21(typescript@5.4.3) devDependencies: '@clack/prompts': specifier: ^0.7.0 @@ -86,19 +86,19 @@ importers: version: 1.0.0-next.25 '@rollup/plugin-alias': specifier: ^5.1.0 - version: 5.1.0(rollup@4.12.1) + version: 5.1.0(rollup@4.13.0) '@rollup/plugin-commonjs': specifier: ^25.0.7 - version: 25.0.7(rollup@4.12.1) + version: 25.0.7(rollup@4.13.0) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.12.1) + version: 6.1.0(rollup@4.13.0) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.12.1) + version: 15.2.3(rollup@4.13.0) '@rollup/plugin-replace': specifier: ^5.0.5 - version: 5.0.5(rollup@4.12.1) + version: 5.0.5(rollup@4.13.0) '@types/cross-spawn': specifier: ^6.0.6 version: 6.0.6 @@ -133,8 +133,8 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^20.11.25 - version: 20.11.25 + specifier: ^20.11.30 + version: 20.11.30 '@types/postcss-prefix-selector': specifier: ^1.16.3 version: 1.16.3 @@ -157,8 +157,8 @@ importers: specifier: ^4.3.4 version: 4.3.4(supports-color@9.4.0) esbuild: - specifier: ^0.20.1 - version: 0.20.1 + specifier: ^0.20.2 + version: 0.20.2 escape-html: specifier: ^1.0.3 version: 1.0.3 @@ -172,8 +172,8 @@ importers: specifier: ^11.2.0 version: 11.2.0 get-port: - specifier: ^7.0.0 - version: 7.0.0 + specifier: ^7.1.0 + version: 7.1.0 gray-matter: specifier: ^4.0.3 version: 4.0.3 @@ -187,14 +187,14 @@ importers: specifier: ^10.2.0 version: 10.2.0 markdown-it: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.1.0 + version: 14.1.0 markdown-it-anchor: specifier: ^8.6.7 - version: 8.6.7(@types/markdown-it@13.0.7)(markdown-it@14.0.0) + version: 8.6.7(@types/markdown-it@13.0.7)(markdown-it@14.1.0) markdown-it-attrs: specifier: ^4.1.6 - version: 4.1.6(markdown-it@14.0.0) + version: 4.1.6(markdown-it@14.1.0) markdown-it-container: specifier: ^4.0.0 version: 4.0.0 @@ -253,20 +253,20 @@ importers: specifier: ^5.0.5 version: 5.0.5 rollup: - specifier: ^4.12.1 - version: 4.12.1 + specifier: ^4.13.0 + version: 4.13.0 rollup-plugin-dts: specifier: ^6.1.0 - version: 6.1.0(rollup@4.12.1)(typescript@5.4.2) + version: 6.1.0(rollup@4.13.0)(typescript@5.4.3) rollup-plugin-esbuild: specifier: ^6.1.1 - version: 6.1.1(esbuild@0.20.1)(rollup@4.12.1)(supports-color@9.4.0) + version: 6.1.1(esbuild@0.20.2)(rollup@4.13.0)(supports-color@9.4.0) semver: specifier: ^7.6.0 version: 7.6.0 simple-git-hooks: - specifier: ^2.10.0 - version: 2.10.0 + specifier: ^2.11.0 + version: 2.11.0 sirv: specifier: ^2.0.4 version: 2.0.4 @@ -277,14 +277,14 @@ importers: specifier: ^9.4.0 version: 9.4.0 typescript: - specifier: ^5.4.2 - version: 5.4.2 + specifier: ^5.4.3 + version: 5.4.3 vitest: - specifier: ^1.3.1 - version: 1.3.1(@types/node@20.11.25)(supports-color@9.4.0) + specifier: ^1.4.0 + version: 1.4.0(@types/node@20.11.30)(supports-color@9.4.0) vue-tsc: - specifier: ^2.0.6 - version: 2.0.6(typescript@5.4.2) + specifier: ^2.0.7 + version: 2.0.7(typescript@5.4.3) wait-on: specifier: ^7.2.0 version: 7.2.0(debug@4.3.4) @@ -458,34 +458,35 @@ packages: '@algolia/requester-common': 4.22.1 dev: false - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 dev: true - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} requiresBuild: true dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 dev: true - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -495,7 +496,7 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -524,7 +525,7 @@ packages: resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} dependencies: '@docsearch/react': 3.6.0 - preact: 10.19.6 + preact: 10.20.0 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -558,184 +559,184 @@ packages: - '@algolia/client-search' dev: false - /@esbuild/aix-ppc64@0.20.1: - resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] requiresBuild: true optional: true - /@esbuild/android-arm64@0.20.1: - resolution: {integrity: sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==} + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@esbuild/android-arm@0.20.1: - resolution: {integrity: sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==} + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true optional: true - /@esbuild/android-x64@0.20.1: - resolution: {integrity: sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==} + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.20.1: - resolution: {integrity: sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==} + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@esbuild/darwin-x64@0.20.1: - resolution: {integrity: sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==} + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.20.1: - resolution: {integrity: sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==} + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.20.1: - resolution: {integrity: sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==} + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/linux-arm64@0.20.1: - resolution: {integrity: sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==} + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-arm@0.20.1: - resolution: {integrity: sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==} + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ia32@0.20.1: - resolution: {integrity: sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-loong64@0.20.1: - resolution: {integrity: sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==} + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.20.1: - resolution: {integrity: sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==} + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.20.1: - resolution: {integrity: sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==} + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.20.1: - resolution: {integrity: sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==} + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-s390x@0.20.1: - resolution: {integrity: sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==} + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-x64@0.20.1: - resolution: {integrity: sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==} + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.20.1: - resolution: {integrity: sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==} + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.20.1: - resolution: {integrity: sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==} + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true optional: true - /@esbuild/sunos-x64@0.20.1: - resolution: {integrity: sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==} + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true optional: true - /@esbuild/win32-arm64@0.20.1: - resolution: {integrity: sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==} + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-ia32@0.20.1: - resolution: {integrity: sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==} + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-x64@0.20.1: - resolution: {integrity: sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==} + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -798,12 +799,12 @@ packages: dependencies: '@clack/core': 0.3.4 fast-glob: 3.3.2 - get-port: 7.0.0 + get-port: 7.1.0 jiti: 1.21.0 micromatch: 4.0.5 path-to-regexp: 6.2.1 picocolors: 1.0.0 - simple-git: 3.22.0(supports-color@9.4.0) + simple-git: 3.23.0(supports-color@9.4.0) ultramatter: 0.0.4 zod: 3.22.4 transitivePeerDependencies: @@ -814,7 +815,7 @@ packages: resolution: {integrity: sha512-cTRxlocav/+mfgDcp0P2z/gWuWBez+iNuN4D+b74LpX4AR6UAx2ZvWtCrUZ8VXrO4eCt1/G0YC/Af7mpIb3aoQ==} dependencies: '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/plugin-frontmatter@2.0.0: @@ -823,7 +824,7 @@ packages: '@mdit-vue/types': 2.0.0 '@types/markdown-it': 13.0.7 gray-matter: 4.0.3 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/plugin-headers@2.0.0: @@ -832,7 +833,7 @@ packages: '@mdit-vue/shared': 2.0.0 '@mdit-vue/types': 2.0.0 '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/plugin-sfc@2.0.0: @@ -840,7 +841,7 @@ packages: dependencies: '@mdit-vue/types': 2.0.0 '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/plugin-title@2.0.0: @@ -849,7 +850,7 @@ packages: '@mdit-vue/shared': 2.0.0 '@mdit-vue/types': 2.0.0 '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/plugin-toc@2.0.0: @@ -858,7 +859,7 @@ packages: '@mdit-vue/shared': 2.0.0 '@mdit-vue/types': 2.0.0 '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/shared@2.0.0: @@ -866,7 +867,7 @@ packages: dependencies: '@mdit-vue/types': 2.0.0 '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /@mdit-vue/types@2.0.0: @@ -910,7 +911,7 @@ packages: resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} dev: true - /@rollup/plugin-alias@5.1.0(rollup@4.12.1): + /@rollup/plugin-alias@5.1.0(rollup@4.13.0): resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -919,11 +920,11 @@ packages: rollup: optional: true dependencies: - rollup: 4.12.1 + rollup: 4.13.0 slash: 4.0.0 dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@4.12.1): + /@rollup/plugin-commonjs@25.0.7(rollup@4.13.0): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -932,16 +933,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.8 - rollup: 4.12.1 + rollup: 4.13.0 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.12.1): + /@rollup/plugin-json@6.1.0(rollup@4.13.0): resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -950,11 +951,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) - rollup: 4.12.1 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + rollup: 4.13.0 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.12.1): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.13.0): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -963,16 +964,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 - rollup: 4.12.1 + rollup: 4.13.0 dev: true - /@rollup/plugin-replace@5.0.5(rollup@4.12.1): + /@rollup/plugin-replace@5.0.5(rollup@4.13.0): resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -981,12 +982,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) magic-string: 0.30.8 - rollup: 4.12.1 + rollup: 4.13.0 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.12.1): + /@rollup/pluginutils@5.1.0(rollup@4.13.0): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -998,16 +999,8 @@ packages: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.12.1 - dev: true - - /@rollup/rollup-android-arm-eabi@4.12.1: - resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} - cpu: [arm] - os: [android] - requiresBuild: true + rollup: 4.13.0 dev: true - optional: true /@rollup/rollup-android-arm-eabi@4.13.0: resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} @@ -1016,14 +1009,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.12.1: - resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.13.0: resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} cpu: [arm64] @@ -1031,14 +1016,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.12.1: - resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.13.0: resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} cpu: [arm64] @@ -1046,14 +1023,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.12.1: - resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.13.0: resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} cpu: [x64] @@ -1061,14 +1030,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.1: - resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} cpu: [arm] @@ -1076,14 +1037,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.1: - resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} cpu: [arm64] @@ -1091,14 +1044,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.1: - resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} cpu: [arm64] @@ -1106,14 +1051,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.1: - resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} cpu: [riscv64] @@ -1121,14 +1058,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.1: - resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} cpu: [x64] @@ -1136,14 +1065,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.1: - resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} cpu: [x64] @@ -1151,14 +1072,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.1: - resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} cpu: [arm64] @@ -1166,14 +1079,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.1: - resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} cpu: [ia32] @@ -1181,14 +1086,6 @@ packages: requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.1: - resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} cpu: [x64] @@ -1196,14 +1093,14 @@ packages: requiresBuild: true optional: true - /@shikijs/core@1.1.7: - resolution: {integrity: sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==} + /@shikijs/core@1.2.0: + resolution: {integrity: sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==} dev: false - /@shikijs/transformers@1.1.7: - resolution: {integrity: sha512-lXz011ao4+rvweps/9h3CchBfzb1U5OtP5D51Tqc9lQYdLblWMIxQxH6Ybe1GeGINcEVM4goMyPrI0JvlIp4UQ==} + /@shikijs/transformers@1.2.0: + resolution: {integrity: sha512-xKn7DtA65DQV4FOfYsrvqM80xOy2xuXnxWWKsZmHv1VII/IOuDUDsWDu3KnpeLH6wqNJWp1GRoNUsHR1aw/VhQ==} dependencies: - shiki: 1.1.7 + shiki: 1.2.0 dev: false /@sideway/address@4.1.5: @@ -1235,7 +1132,7 @@ packages: /@types/cross-spawn@6.0.6: resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.30 dev: true /@types/debug@4.1.12: @@ -1255,7 +1152,7 @@ packages: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.11.25 + '@types/node': 20.11.30 dev: true /@types/jquery@3.5.29: @@ -1267,7 +1164,7 @@ packages: /@types/jsonfile@6.1.4: resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.30 dev: true /@types/linkify-it@3.0.5: @@ -1276,11 +1173,11 @@ packages: /@types/lodash.template@4.5.3: resolution: {integrity: sha512-Mo0UYKLu1oXgkV9TVoXZLlXXjyIXlW7ZQRxi/4gQJmzJr63dmicE8gG0OkPjYTKBrBic852q0JzqrtNUWLBIyA==} dependencies: - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 dev: true - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} dev: true /@types/mark.js@8.11.12: @@ -1334,8 +1231,8 @@ packages: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: true - /@types/node@20.11.25: - resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} dependencies: undici-types: 5.26.5 @@ -1346,13 +1243,13 @@ packages: /@types/postcss-prefix-selector@1.16.3: resolution: {integrity: sha512-YZLPWRkJIrYjwaqojVDXzaRCAEYslRAm8Shznwwn+ZFA4iKQR4LZlS3d+ZMVteFz4iyQnngZZG7k/GIzV1f3mQ==} dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /@types/prompts@2.4.9: resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.30 kleur: 3.0.3 dev: true @@ -1363,7 +1260,7 @@ packages: /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.30 dev: true /@types/sizzle@2.3.8: @@ -1381,42 +1278,42 @@ packages: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.2.2(@types/node@20.11.25) - vue: 3.4.21(typescript@5.4.2) + vite: 5.2.2(@types/node@20.11.30) + vue: 3.4.21(typescript@5.4.3) dev: false - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + /@vitest/expect@1.4.0: + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 chai: 4.4.1 dev: true - /@vitest/runner@1.3.1: - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + /@vitest/runner@1.4.0: + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} dependencies: - '@vitest/utils': 1.3.1 + '@vitest/utils': 1.4.0 p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + /@vitest/snapshot@1.4.0: + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} dependencies: magic-string: 0.30.8 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.3.1: - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + /@vitest/spy@1.4.0: + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + /@vitest/utils@1.4.0: + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -1424,33 +1321,33 @@ packages: pretty-format: 29.7.0 dev: true - /@volar/language-core@2.1.2: - resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} + /@volar/language-core@2.1.4: + resolution: {integrity: sha512-ROfPepDxZ5Eq+Unbx3M9QcHT7MoE9tYdbkuzLTtxG5rfkEi5RwsDPncjANMOq/gHhIIDlWgqWwS2nXWMGsuj4w==} dependencies: - '@volar/source-map': 2.1.2 + '@volar/source-map': 2.1.4 dev: true - /@volar/source-map@2.1.2: - resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} + /@volar/source-map@2.1.4: + resolution: {integrity: sha512-mCg8IiPZmHZVzqL4Owg+BzQ5ZTG1cVwATxrkrFPZpcAin97Xa3MbchxVhHtHTWTT8ER8bJh5xVjeVxsSN++FUA==} dependencies: muggle-string: 0.4.1 dev: true - /@volar/typescript@2.1.2: - resolution: {integrity: sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==} + /@volar/typescript@2.1.4: + resolution: {integrity: sha512-Mt7wOLPkomFnUfVpb5IHlPhSpD7FJAn+FHSsovePmqFNQzFLz16wrpHjAkorPiAnP0847w71NL5fIJyWbAsR8Q==} dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.4 path-browserify: 1.0.1 dev: true /@vue/compiler-core@3.4.21: resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@vue/shared': 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /@vue/compiler-dom@3.4.21: resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} @@ -1461,15 +1358,15 @@ packages: /@vue/compiler-sfc@3.4.21: resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@vue/compiler-core': 3.4.21 '@vue/compiler-dom': 3.4.21 '@vue/compiler-ssr': 3.4.21 '@vue/shared': 3.4.21 estree-walker: 2.0.2 magic-string: 0.30.8 - postcss: 8.4.35 - source-map-js: 1.0.2 + postcss: 8.4.38 + source-map-js: 1.2.0 dev: false /@vue/compiler-ssr@3.4.21: @@ -1479,48 +1376,48 @@ packages: '@vue/shared': 3.4.21 dev: false - /@vue/devtools-api@7.0.16(vue@3.4.21): - resolution: {integrity: sha512-fZG2CG8624qphMf4aj59zNHckMx1G3lxODUuyM9USKuLznXCh66TP+tEbPOCcml16hA0GizJ4D8w6F34hrfbcw==} + /@vue/devtools-api@7.0.20(vue@3.4.21): + resolution: {integrity: sha512-DGEIdotTQFll4187YGc/0awcag7UGJu9M6rE1Pxcs8AX/sGm0Ikk7UqQELmqYsyPzTT9s6OZzSPuBc4OatOXKA==} dependencies: - '@vue/devtools-kit': 7.0.16(vue@3.4.21) + '@vue/devtools-kit': 7.0.20(vue@3.4.21) transitivePeerDependencies: - vue dev: false - /@vue/devtools-kit@7.0.16(vue@3.4.21): - resolution: {integrity: sha512-IA8SSGiZbNgOi4wLT3mRvd71Q9KE0KvMfGk6haa2GZ6bL2K/xMA8Fvvj3o1maspfUXrGcCXutaqbLqbGx/espQ==} + /@vue/devtools-kit@7.0.20(vue@3.4.21): + resolution: {integrity: sha512-FgFuPuqrhQ51rR/sVi52FnGgrxJ3X1bvNra/SkBzPhxJVhfyL5w2YUJZI1FgCvtLAyPSomJNdvlG415ZbJsr6w==} peerDependencies: vue: ^3.0.0 dependencies: - '@vue/devtools-shared': 7.0.16 + '@vue/devtools-shared': 7.0.20 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) dev: false - /@vue/devtools-shared@7.0.16: - resolution: {integrity: sha512-Lew4FrGjDjmanaUWSueNE1Rre83k7jQpttc17MaoVw0eARWU5DgZ1F/g9GNUMZXVjbP9rwE+LL3gd9XfXCfkvA==} + /@vue/devtools-shared@7.0.20: + resolution: {integrity: sha512-E6CiCaYr6ZWOCYJgWodXcPCXxB12vgbUA1X1sG0F1tK5Bo5I35GJuTR8LBJLFHV0VpwLWvyrIi9drT1ZbuJxlg==} dependencies: rfdc: 1.3.1 dev: false - /@vue/language-core@2.0.6(typescript@5.4.2): - resolution: {integrity: sha512-UzqU12tzf9XLqRO3TiWPwRNpP4fyUzE6MAfOQWQNZ4jy6a30ARRUpmODDKq6O8C4goMc2AlPqTmjOHPjHkilSg==} + /@vue/language-core@2.0.7(typescript@5.4.3): + resolution: {integrity: sha512-Vh1yZX3XmYjn9yYLkjU8DN6L0ceBtEcapqiyclHne8guG84IaTzqtvizZB1Yfxm3h6m7EIvjerLO5fvOZO6IIQ==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.4 '@vue/compiler-dom': 3.4.21 '@vue/shared': 3.4.21 computeds: 0.0.1 minimatch: 9.0.3 path-browserify: 1.0.1 - typescript: 5.4.2 + typescript: 5.4.3 vue-template-compiler: 2.7.16 dev: true @@ -1552,7 +1449,7 @@ packages: dependencies: '@vue/compiler-ssr': 3.4.21 '@vue/shared': 3.4.21 - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) dev: false /@vue/shared@3.4.21: @@ -1762,7 +1659,7 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -1784,10 +1681,10 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /axios@1.6.7(debug@4.3.4): - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + /axios@1.6.8(debug@4.3.4): + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -1798,8 +1695,8 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} dev: true @@ -1852,7 +1749,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 dev: true /chai@4.4.1: @@ -2192,6 +2089,33 @@ packages: engines: {node: '>=12'} dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true @@ -2338,16 +2262,20 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + /es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 @@ -2358,10 +2286,11 @@ packages: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 + is-data-view: 1.0.1 is-negative-zero: 2.0.3 is-regex: 1.1.4 is-shared-array-buffer: 1.0.3 @@ -2372,17 +2301,17 @@ packages: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: true /es-define-property@1.0.0: @@ -2397,8 +2326,15 @@ packages: engines: {node: '>= 0.4'} dev: true - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /es-module-lexer@1.4.2: + resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} + dev: true + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 dev: true /es-set-tostringtag@2.0.3: @@ -2407,7 +2343,7 @@ packages: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 dev: true /es-to-primitive@1.2.1: @@ -2419,35 +2355,35 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.20.1: - resolution: {integrity: sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==} + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.20.1 - '@esbuild/android-arm': 0.20.1 - '@esbuild/android-arm64': 0.20.1 - '@esbuild/android-x64': 0.20.1 - '@esbuild/darwin-arm64': 0.20.1 - '@esbuild/darwin-x64': 0.20.1 - '@esbuild/freebsd-arm64': 0.20.1 - '@esbuild/freebsd-x64': 0.20.1 - '@esbuild/linux-arm': 0.20.1 - '@esbuild/linux-arm64': 0.20.1 - '@esbuild/linux-ia32': 0.20.1 - '@esbuild/linux-loong64': 0.20.1 - '@esbuild/linux-mips64el': 0.20.1 - '@esbuild/linux-ppc64': 0.20.1 - '@esbuild/linux-riscv64': 0.20.1 - '@esbuild/linux-s390x': 0.20.1 - '@esbuild/linux-x64': 0.20.1 - '@esbuild/netbsd-x64': 0.20.1 - '@esbuild/openbsd-x64': 0.20.1 - '@esbuild/sunos-x64': 0.20.1 - '@esbuild/win32-arm64': 0.20.1 - '@esbuild/win32-ia32': 0.20.1 - '@esbuild/win32-x64': 0.20.1 + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 /escape-goat@3.0.0: resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} @@ -2561,8 +2497,8 @@ packages: tabbable: 6.2.0 dev: false - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6(debug@4.3.4): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2626,7 +2562,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 functions-have-names: 1.2.3 dev: true @@ -2651,11 +2587,11 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 dev: true - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + /get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} dev: true @@ -2805,8 +2741,8 @@ packages: has-symbols: 1.0.3 dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -2875,7 +2811,7 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - hasown: 2.0.1 + hasown: 2.0.2 side-channel: 1.0.6 dev: true @@ -2901,7 +2837,7 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 dev: true /is-boolean-object@1.1.2: @@ -2927,7 +2863,14 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 dev: true /is-date-object@1.0.5: @@ -3067,7 +3010,7 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: true /is-unicode-supported@1.3.0: @@ -3336,23 +3279,23 @@ packages: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} dev: false - /markdown-it-anchor@8.6.7(@types/markdown-it@13.0.7)(markdown-it@14.0.0): + /markdown-it-anchor@8.6.7(@types/markdown-it@13.0.7)(markdown-it@14.1.0): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: '@types/markdown-it': '*' markdown-it: '*' dependencies: '@types/markdown-it': 13.0.7 - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true - /markdown-it-attrs@4.1.6(markdown-it@14.0.0): + /markdown-it-attrs@4.1.6(markdown-it@14.1.0): resolution: {integrity: sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==} engines: {node: '>=6'} peerDependencies: markdown-it: '>= 9.0.0' dependencies: - markdown-it: 14.0.0 + markdown-it: 14.1.0 dev: true /markdown-it-container@4.0.0: @@ -3372,8 +3315,8 @@ packages: - encoding dev: true - /markdown-it@14.0.0: - resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true dependencies: argparse: 2.0.1 @@ -3507,7 +3450,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.4.0 + ufo: 1.5.3 dev: true /mrmime@2.0.0: @@ -3591,7 +3534,7 @@ packages: pidtree: 0.3.1 read-pkg: 3.0.0 shell-quote: 1.8.1 - string.prototype.padend: 3.1.5 + string.prototype.padend: 3.1.6 dev: true /npm-run-path@5.3.0: @@ -3654,12 +3597,12 @@ packages: file-type: 18.7.0 get-stdin: 9.0.0 meow: 12.1.1 - open: 10.0.4 + open: 10.1.0 tempy: 3.1.0 dev: true - /open@10.0.4: - resolution: {integrity: sha512-oujJ/FFr7ra6/7gJuQ4ZJJ8Gf2VHM0J3J/W7IvH++zaqEzacWVxzK++NiVY5NLHTTj7u/jNH5H3Ei9biL31Lng==} + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} dependencies: default-browser: 5.2.1 @@ -3721,7 +3664,7 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 3.0.1 lines-and-columns: 2.0.4 @@ -3879,14 +3822,6 @@ packages: optional: true dev: true - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - /postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} @@ -3895,8 +3830,8 @@ packages: picocolors: 1.0.0 source-map-js: 1.2.0 - /preact@10.19.6: - resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} + /preact@10.20.0: + resolution: {integrity: sha512-wU7iZw2BjsaKDal3pDRDy/HpPB6cuFOnVUCcw9aIPKG98+ZrXx3F+szkos8BVME5bquyKDKvRlOJFG8kMkcAbg==} dev: false /prettier@3.2.5: @@ -3950,7 +3885,7 @@ packages: dependencies: find-up: 6.3.0 read-pkg: 8.1.0 - type-fest: 4.11.1 + type-fest: 4.13.1 dev: true /read-pkg@3.0.0: @@ -3969,7 +3904,7 @@ packages: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.0 parse-json: 7.1.1 - type-fest: 4.11.1 + type-fest: 4.13.1 dev: true /readable-stream@3.6.2: @@ -4047,7 +3982,7 @@ packages: glob: 10.3.10 dev: true - /rollup-plugin-dts@6.1.0(rollup@4.12.1)(typescript@5.4.2): + /rollup-plugin-dts@6.1.0(rollup@4.13.0)(typescript@5.4.3): resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} engines: {node: '>=16'} peerDependencies: @@ -4055,52 +3990,29 @@ packages: typescript: ^4.5 || ^5.0 dependencies: magic-string: 0.30.8 - rollup: 4.12.1 - typescript: 5.4.2 + rollup: 4.13.0 + typescript: 5.4.3 optionalDependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 dev: true - /rollup-plugin-esbuild@6.1.1(esbuild@0.20.1)(rollup@4.12.1)(supports-color@9.4.0): + /rollup-plugin-esbuild@6.1.1(esbuild@0.20.2)(rollup@4.13.0)(supports-color@9.4.0): resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} engines: {node: '>=14.18.0'} peerDependencies: esbuild: '>=0.18.0' rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) debug: 4.3.4(supports-color@9.4.0) - es-module-lexer: 1.4.1 - esbuild: 0.20.1 + es-module-lexer: 1.4.2 + esbuild: 0.20.2 get-tsconfig: 4.7.3 - rollup: 4.12.1 + rollup: 4.13.0 transitivePeerDependencies: - supports-color dev: true - /rollup@4.12.1: - resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.1 - '@rollup/rollup-android-arm64': 4.12.1 - '@rollup/rollup-darwin-arm64': 4.12.1 - '@rollup/rollup-darwin-x64': 4.12.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 - '@rollup/rollup-linux-arm64-gnu': 4.12.1 - '@rollup/rollup-linux-arm64-musl': 4.12.1 - '@rollup/rollup-linux-riscv64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-musl': 4.12.1 - '@rollup/rollup-win32-arm64-msvc': 4.12.1 - '@rollup/rollup-win32-ia32-msvc': 4.12.1 - '@rollup/rollup-win32-x64-msvc': 4.12.1 - fsevents: 2.3.3 - dev: true - /rollup@4.13.0: resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4140,8 +4052,8 @@ packages: tslib: 2.6.2 dev: true - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 @@ -4188,8 +4100,8 @@ packages: lru-cache: 6.0.0 dev: true - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -4238,10 +4150,10 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true - /shiki@1.1.7: - resolution: {integrity: sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==} + /shiki@1.2.0: + resolution: {integrity: sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==} dependencies: - '@shikijs/core': 1.1.7 + '@shikijs/core': 1.2.0 dev: false /side-channel@1.0.6: @@ -4267,14 +4179,14 @@ packages: engines: {node: '>=14'} dev: true - /simple-git-hooks@2.10.0: - resolution: {integrity: sha512-TtCytVYfV77pILCkzVxpOSgYKHQyaO7fBI/iwG5bLGb0dIo/v/K1Y1IZ5DN40RQu6WNNJiN0gkuRvSYjxOhFog==} + /simple-git-hooks@2.11.0: + resolution: {integrity: sha512-Wab2uzjGJEL8Kx+2UY8waUSfkiolt2RbaAJWvPCjaAEXrrKoS7JqPk4STiIVl/yt3asZRUzFoK2ryhwvgh5rYw==} hasBin: true requiresBuild: true dev: true - /simple-git@3.22.0(supports-color@9.4.0): - resolution: {integrity: sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==} + /simple-git@3.23.0(supports-color@9.4.0): + resolution: {integrity: sha512-P9ggTW8vb/21CAL/AmnACAhqBDfnqSSZVpV7WuFtsFR9HLunf5IqQvk+OXAQTfkcZep8pKnt3DV3o7w3TegEkQ==} dependencies: '@kwsites/file-exists': 1.1.1(supports-color@9.4.0) '@kwsites/promise-deferred': 1.1.1 @@ -4332,10 +4244,6 @@ packages: resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -4435,38 +4343,41 @@ packages: strip-ansi: 7.1.0 dev: true - /string.prototype.padend@3.1.5: - resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} + /string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true /string_decoder@1.3.0: @@ -4643,8 +4554,8 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.11.1: - resolution: {integrity: sha512-MFMf6VkEVZAETidGGSYW2B1MjXbGX+sWIywn2QPEaJ3j08V+MwVRHMXtf2noB8ENJaD0LIun9wh5Z6OPNf1QzQ==} + /type-fest@4.13.1: + resolution: {integrity: sha512-ASMgM+Vf2cLwDMt1KXSkMUDSYCxtckDJs8zsaVF/mYteIsiARKCVtyXtcK38mIKbLTctZP8v6GMqdNaeI3fo7g==} engines: {node: '>=16'} dev: true @@ -4680,8 +4591,8 @@ packages: is-typed-array: 1.1.13 dev: true - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -4692,8 +4603,8 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + /typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} engines: {node: '>=14.17'} hasBin: true @@ -4701,8 +4612,8 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: true - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true /uglify-js@3.17.4: @@ -4757,8 +4668,8 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-node@1.3.1(@types/node@20.11.25)(supports-color@9.4.0): - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + /vite-node@1.4.0(@types/node@20.11.30)(supports-color@9.4.0): + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -4766,7 +4677,7 @@ packages: debug: 4.3.4(supports-color@9.4.0) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.2(@types/node@20.11.25) + vite: 5.2.2(@types/node@20.11.30) transitivePeerDependencies: - '@types/node' - less @@ -4778,7 +4689,7 @@ packages: - terser dev: true - /vite@5.2.2(@types/node@20.11.25): + /vite@5.2.2(@types/node@20.11.30): resolution: {integrity: sha512-FWZbz0oSdLq5snUI0b6sULbz58iXFXdvkZfZWR/F0ZJuKTSPO7v72QPXt6KqYeMFb0yytNp6kZosxJ96Nr/wDQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -4806,22 +4717,22 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.25 - esbuild: 0.20.1 + '@types/node': 20.11.30 + esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.0 optionalDependencies: fsevents: 2.3.3 - /vitest@1.3.1(@types/node@20.11.25)(supports-color@9.4.0): - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + /vitest@1.4.0(@types/node@20.11.30)(supports-color@9.4.0): + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -4838,12 +4749,12 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.25 - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@types/node': 20.11.30 + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4(supports-color@9.4.0) @@ -4856,8 +4767,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.2.2(@types/node@20.11.25) - vite-node: 1.3.1(@types/node@20.11.25)(supports-color@9.4.0) + vite: 5.2.2(@types/node@20.11.30) + vite-node: 1.4.0(@types/node@20.11.30)(supports-color@9.4.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -4881,7 +4792,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.4.21(typescript@5.4.2) + vue: 3.4.21(typescript@5.4.3) dev: false /vue-template-compiler@2.7.16: @@ -4891,19 +4802,19 @@ packages: he: 1.2.0 dev: true - /vue-tsc@2.0.6(typescript@5.4.2): - resolution: {integrity: sha512-kK50W4XqQL34vHRkxlRWLicrT6+F9xfgCgJ4KSmCHcytKzc1u3c94XXgI+CjmhOSxyw0krpExF7Obo7y4+0dVQ==} + /vue-tsc@2.0.7(typescript@5.4.3): + resolution: {integrity: sha512-LYa0nInkfcDBB7y8jQ9FQ4riJTRNTdh98zK/hzt4gEpBZQmf30dPhP+odzCa+cedGz6B/guvJEd0BavZaRptjg==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/typescript': 2.1.2 - '@vue/language-core': 2.0.6(typescript@5.4.2) + '@volar/typescript': 2.1.4 + '@vue/language-core': 2.0.7(typescript@5.4.3) semver: 7.6.0 - typescript: 5.4.2 + typescript: 5.4.3 dev: true - /vue@3.4.21(typescript@5.4.2): + /vue@3.4.21(typescript@5.4.3): resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} peerDependencies: typescript: '*' @@ -4916,7 +4827,7 @@ packages: '@vue/runtime-dom': 3.4.21 '@vue/server-renderer': 3.4.21(vue@3.4.21) '@vue/shared': 3.4.21 - typescript: 5.4.2 + typescript: 5.4.3 dev: false /wait-on@7.2.0(debug@4.3.4): @@ -4924,7 +4835,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - axios: 1.6.7(debug@4.3.4) + axios: 1.6.8(debug@4.3.4) joi: 17.12.2 lodash: 4.17.21 minimist: 1.2.8 @@ -4968,8 +4879,8 @@ packages: is-symbol: 1.0.4 dev: true - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 From 0b45abd7dddd845e262a0e57d67cb13e246091af Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 22 Mar 2024 11:40:50 +0530 Subject: [PATCH 11/50] release: v1.0.1 --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f45a3d48..8e88f9d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [1.0.1](https://github.com/vuejs/vitepress/compare/v1.0.0...v1.0.1) (2024-03-22) + +### Bug Fixes + +- **build:** vendor vue-demi to avoid resolution issues with yarn berry ([#3680](https://github.com/vuejs/vitepress/issues/3680)) ([5d3cb96](https://github.com/vuejs/vitepress/commit/5d3cb96ac364413aa9eb494bc91744bd8f4a2c79)) + # [1.0.0](https://github.com/vuejs/vitepress/compare/v1.0.0-rc.45...v1.0.0) (2024-03-21) ### Bug Fixes diff --git a/package.json b/package.json index 563034fb..5a12389c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "1.0.0", + "version": "1.0.1", "description": "Vite & Vue powered static site generator", "type": "module", "packageManager": "pnpm@8.15.5", From 1e8b3679c845cc0d66bc80ea8a5b5b69d7b8520d Mon Sep 17 00:00:00 2001 From: Xavi Lee Date: Fri, 22 Mar 2024 16:39:39 +0800 Subject: [PATCH 12/50] docs(zh): sync and tweak translations (#3684) closes #3682 Co-authored-by: ZHANG PENG --- docs/zh/guide/what-is-vitepress.md | 4 ++-- docs/zh/reference/site-config.md | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/zh/guide/what-is-vitepress.md b/docs/zh/guide/what-is-vitepress.md index 94da4123..cee35162 100644 --- a/docs/zh/guide/what-is-vitepress.md +++ b/docs/zh/guide/what-is-vitepress.md @@ -34,11 +34,11 @@ VitePress 旨在使用 Markdown 生成内容时提供出色的开发体验。 ## 性能 {#performance} -与许多传统的 SSG 不同,VitePress 生成的站点实际上是一个[单页应用程序](https://en.wikipedia.org/wiki/Single-page_application) (SPA)。 +与许多传统的 SSG 不同,每次导航都会导致页面完全重新加载,VitePress 生成的网站在初次访问时提供静态 HTML,但它变成了[单页应用程序](https://en.wikipedia.org/wiki/Single-page_application)(SPA)进行站点内的后续导航。我们认为,这种模式为性能提供了最佳平衡: - **快速的初始加载** - 对任何页面的初次访问都将会是静态的、预呈现的 HTML,以实现极快的加载速度和最佳的 SEO。然后页面加载一个 JavaScript bundle,将页面变成 Vue SPA (这被称为“激活”)。激活是非常快的:在 [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F) 上,典型的 VitePress 站点即使在网络速度较慢的低端移动设备上也能获得近乎完美的性能分数。 + 对任何页面的初次访问都将会是静态的、预呈现的 HTML,以实现极快的加载速度和最佳的 SEO。然后页面加载一个 JavaScript bundle,将页面变成 Vue SPA (这被称为“激活”)。与 SPA 激活缓慢的常见假设不同,由于 Vue 3 良好的原始性能和编译优化,这个过程实际上非常快。在 [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F) 上,典型的 VitePress 站点即使在网络速度较慢的低端移动设备上也能获得近乎完美的性能分数。 - **加载完成后可以快速切换** diff --git a/docs/zh/reference/site-config.md b/docs/zh/reference/site-config.md index 56b46928..5eb29787 100644 --- a/docs/zh/reference/site-config.md +++ b/docs/zh/reference/site-config.md @@ -377,7 +377,7 @@ export default { - 类型:`string` - 默认值: `.` -markdown 页面的目录,相对于项目根目录。另请参阅[根目录和源目录](../guide/routing#root-and-source-directory)。 +相对于项目根目录的 markdown 文件所在的文件夹。另请参阅[根目录和源目录](../guide/routing#root-and-source-directory)。 ```ts export default { @@ -390,7 +390,7 @@ export default { - 类型:`string` - 默认值: `undefined` -用于匹配应作为源内容输出的 markdown 文件的 [全局模式](https://github.com/mrmlnc/fast-glob#pattern-syntax)。 +用于匹配应排除作为源内容输出的 markdown 文件,语法详见 [glob pattern](https://github.com/mrmlnc/fast-glob#pattern-syntax)。 ```ts export default { @@ -471,6 +471,13 @@ export default { } ``` +### metaChunk + +- 类型:`boolean` +- 默认值:`false` + +当设置为 `true` 时,将页面元数据提取到单独的 JavaScript 块中,而不是内联在初始 HTML 中。这使每个页面的 HTML 负载更小,并使页面元数据可缓存,从而当站点中有很多页面时可以减少服务器带宽。 + ### mpa - 类型:`boolean` From a6a7645e942cc63c57ca5d79da4b76dee76d8a96 Mon Sep 17 00:00:00 2001 From: Jason Sims Date: Sat, 23 Mar 2024 08:59:34 -0400 Subject: [PATCH 13/50] docs: typo (#3692) lunaria-ignore --- docs/guide/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index a2541bd4..a5f1c7af 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -199,7 +199,7 @@ The dev server should be running at `http://localhost:5173`. Visit the URL in yo - To better understand how markdown files are mapped to generated HTML, proceed to the [Routing Guide](./routing). -- To discover more about what you can do on the page, such as writing markdown content or using Vue Component, refer to the "Writing" section of the guide. A great place to start would be to learn about [Markdown Extensions](./markdown). +- To discover more about what you can do on the page, such as writing markdown content or using Vue Components, refer to the "Writing" section of the guide. A great place to start would be to learn about [Markdown Extensions](./markdown). - To explore the features provided by the default documentation theme, check out the [Default Theme Config Reference](../reference/default-theme-config). From 3c8b4c706051592dd2cca0ae57e293254cbb51ce Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:38:47 +0530 Subject: [PATCH 14/50] fix(theme): html text not showing properly in mobile nav menu --- src/client/theme-default/components/VPNavScreenMenuLink.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/client/theme-default/components/VPNavScreenMenuLink.vue b/src/client/theme-default/components/VPNavScreenMenuLink.vue index e612361e..e3d54cb1 100644 --- a/src/client/theme-default/components/VPNavScreenMenuLink.vue +++ b/src/client/theme-default/components/VPNavScreenMenuLink.vue @@ -17,9 +17,8 @@ const closeScreen = inject('close-screen') as () => void :target="item.target" :rel="item.rel" @click="closeScreen" - > - {{ item.text }} - + v-html="item.text" + /> diff --git a/docs/ru/guide/asset-handling.md b/docs/ru/guide/asset-handling.md new file mode 100644 index 00000000..c24bfa73 --- /dev/null +++ b/docs/ru/guide/asset-handling.md @@ -0,0 +1,63 @@ +# Обработка ресурсов {#asset-handling} + +## Ссылки на статические ресурсы {#referencing-static-assets} + +Все файлы Markdown компилируются в компоненты Vue и обрабатываются [Vite](https://vitejs.dev/guide/assets.html). Вы можете, **и должны**, ссылаться на любые ресурсы, используя относительные URL: + +```md +![Изображение](./image.png) +``` + +Вы можете ссылаться на статические ресурсы в ваших файлах разметки, компоненты `*.vue` в теме, стили и обычные файлы `.css`, используя абсолютные пути (основанные на корне проекта) или относительные пути (основанные на вашей файловой системе). Последнее похоже на поведение, к которому вы привыкли, если использовали Vite, Vue CLI или `file-loader` в webpack. + +Распространенные типы файлов изображений, мультимедиа и шрифтов определяются и включаются в качестве ресурсов автоматически. + +::: tip Связанные файлы не рассматриваются как ресурсы +PDF-файлы или другие документы, на которые есть ссылки в файлах с разметкой, не рассматриваются автоматически как ресурсы. Чтобы сделать связанные файлы доступными, вы должны вручную поместить их в каталог [`public`](#the-public-directory) вашего проекта. +::: + +Все ссылающиеся ресурсы, включая те, которые используют абсолютные пути, будут скопированы в выходной каталог с хэшированным именем файла в производственной сборке. Ресурсы, на которые никогда не ссылались, не будут скопированы. Изображения размером менее 4 КБ будут вставляться в формате base64 — это можно настроить с помощью опции конфигурации [`vite`](../reference/site-config#vite). + +Все **статические** ссылки на пути, включая абсолютные пути, должны быть основаны на структуре ваших рабочих каталогов. + +## Директория `public` {#the-public-directory} + +Иногда вам может понадобиться предоставить статические ресурсы, на которые нет прямых ссылок ни в одном из компонентов Markdown или темы, или вы можете захотеть предоставить определённые файлы с оригинальным именем. Примерами таких файлов являются `robots.txt`, `favicon.ico` и иконки PWA. + +Вы можете поместить эти файлы в директорию `public` в [директории с исходными файлами](./routing#source-directory). Например, если корень вашего проекта — `./docs`, и вы используете стандартное расположение исходного каталога, то ваш публичный каталог будет `./docs/public`. + +Ресурсы, размещённые в `public`, будут скопированы в корень выходного каталога как есть. + +Обратите внимание, что вы должны ссылаться на файлы, размещённые в `public`, используя корневой абсолютный путь — например, `public/icon.png` всегда должен упоминаться в исходном коде как `/icon.png`. + +## Базовый URL {#base-url} + +Если ваш сайт развёрнут на URL-адресе, не являющемся корневым, вам нужно установить параметр `base` в файле `.vitepress/config.js`. Например, если вы планируете развернуть свой сайт на `https://foo.github.io/bar/`, то параметр `base` следует установить на `'/bar/'` (он всегда должен начинаться и заканчиваться слэшем). + +Все пути к статическим ресурсам автоматически обрабатываются с учётом различных значений конфигурации `base`. Например, если в вашей разметке есть абсолютная ссылка на ресурс в директории `public`: + +```md +![Изображение](/image-inside-public.png) +``` + +В этом случае вам **не** нужно обновлять его при изменении значения конфигурации `base`. + +Однако если вы создаете компонент темы, который динамически ссылается на активы, например, изображение, атрибут `src` которого основан на значении конфигурации темы: + +```vue + +``` + +В этом случае рекомендуется обернуть путь с помощью [хелпера `withBase`](../reference/runtime-api#withbase), предоставляемого VitePress: + +```vue + + + +``` diff --git a/docs/ru/guide/cms.md b/docs/ru/guide/cms.md new file mode 100644 index 00000000..9781e756 --- /dev/null +++ b/docs/ru/guide/cms.md @@ -0,0 +1,58 @@ +--- +outline: deep +--- + +# Подключение к CMS {#connecting-to-a-cms} + +## Общий рабочий процесс {#general-workflow} + +Подключение VitePress к CMS в значительной степени зависит от [динамических маршрутов](./routing#dynamic-routes). Прежде чем приступить к работе, убедитесь, что вы понимаете, как это работает. + +Поскольку каждая CMS работает по-своему, здесь мы можем предоставить лишь общую схему работы, которую вам нужно будет адаптировать под свой конкретный сценарий. + +1. Если ваша CMS требует аутентификации, создайте файл `.env` для хранения токенов API и загрузите его таким образом: + + ```js + // posts/[id].paths.js + import { loadEnv } from 'vitepress' + + const env = loadEnv('', process.cwd()) + ``` + +2. Получите необходимые данные из CMS и преобразуйте их в соответствующие пути: + + ```js + export default { + async paths() { + // при необходимости используйте соответствующую клиентскую библиотеку CMS + const data = await ( + await fetch('https://my-cms-api', { + headers: { + // токен, если необходимо + } + }) + ).json() + + return data.map((entry) => { + return { + params: { id: entry.id /* заголовок, автор, дата и т. д. */ }, + content: entry.content + } + }) + } + } + ``` + +3. Отрисуйте содержимое страницы: + + ```md + # {{ $params.title }} + + - by {{ $params.author }} on {{ $params.date }} + + + ``` + +## Руководства по интеграции {#integration-guides} + +Если вы написали руководство по интеграции VitePress с конкретной CMS, воспользуйтесь ссылкой «Редактировать эту страницу», чтобы отправить его сюда! diff --git a/docs/ru/guide/custom-theme.md b/docs/ru/guide/custom-theme.md new file mode 100644 index 00000000..05ca3b23 --- /dev/null +++ b/docs/ru/guide/custom-theme.md @@ -0,0 +1,222 @@ +# Пользовательская тема {#using-a-custom-theme} + +## Разрешение темы {#theme-resolving} + +Вы можете включить пользовательскую тему, создав файл `.vitepress/theme/index.js` или `.vitepress/theme/index.ts` («файл входа темы»): + +``` +. +├─ docs # корень проекта +│ ├─ .vitepress +│ │ ├─ theme +│ │ │ └─ index.js # файл входа темы +│ │ └─ config.js # файл конфигурации +│ └─ index.md +└─ package.json +``` + +VitePress всегда будет использовать пользовательскую тему вместо темы по умолчанию, если обнаружит наличие входного файла темы. Однако вы можете [расширить тему по умолчанию](./extending-default-theme), чтобы выполнить расширенные настройки поверх нее. + +## Интерфейс темы {#theme-interface} + +Пользовательская тема VitePress определяется как объект со следующим интерфейсом: + +```ts +interface Theme { + /** + * Корневой компонент макета для каждой страницы + * @required + */ + Layout: Component + /** + * Улучшение экземпляра приложения Vue + * @optional + */ + enhanceApp?: (ctx: EnhanceAppContext) => Awaitable + /** + * Расширяем другую тему, вызывая её `enhanceApp` перед нашей + * @optional + */ + extends?: Theme +} + +interface EnhanceAppContext { + app: App // Экземпляр приложения Vue + router: Router // Экземпляр маршрутизатора VitePress + siteData: Ref // Метаданные на уровне сайта +} +``` + +Файл входа темы должен экспортировать тему по умолчанию: + +```js +// .vitepress/theme/index.js + +// Вы можете напрямую импортировать файлы Vue в файле входа темы. +// VitePress предварительно настроен с помощью @vitejs/plugin-vue. +import Layout from './Layout.vue' + +export default { + Layout, + enhanceApp({ app, router, siteData }) { + // ... + } +} +``` + +Экспорт по умолчанию является единственным контрактом для пользовательской темы, и только свойство `Layout` является обязательным. Таким образом, технически тема VitePress может быть простой, как один компонент Vue. + +Внутри компонент макета работает так же, как и обычное приложение Vite + Vue 3. Обратите внимание, что тема также должна быть [SSR-совместимой](./ssr-compat). + +## Создание макета {#building-a-layout} + +Самый базовый компонент макета должен содержать компонент [``](../reference/runtime-api#content): + +```vue + + +``` + +Приведённая выше схема просто отображает разметку каждой страницы в виде HTML. Добавим обработку 404 ошибки в качестве первого улучшения: + +```vue{1-4,9-12} + + + +``` + +Хелпер [`useData()`](../reference/runtime-api#usedata) предоставляет нам все данные во время выполнения, необходимые для условной отрисовки различных макетов. Среди различных данных, к которым мы можем получить доступ, являются метаданные текущей страницы. Мы можем использовать это, чтобы позволить конечному пользователю управлять макетом на каждой странице. Например, пользователь может указать, что страница должна использовать специальный макет главной страницы: + +```md +--- +layout: home +--- +``` + +И мы можем настроить нашу тему, чтобы справиться с этим: + +```vue{3,12-14} + + + +``` + +Конечно, вы можете разделить макет на большее количество компонентов: + +```vue{3-5,12-15} + + + +``` + +Обратитесь к [Справочнику Runtime API](../reference/runtime-api), чтобы узнать обо всём, что доступно в компонентах темы. Кроме того, вы можете использовать [загрузку данных в режиме реального времени](./data-loading) для создания макета, управляемого данными — например, страницы со списком всех записей в блоге текущего проекта. + +## Распространение пользовательской темы {#distributing-a-custom-theme} + +Самый простой способ распространить пользовательскую тему — предоставить её в виде [репозитория шаблонов на GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-template-repository). + +Если вы хотите распространить тему в виде пакета npm, выполните следующие действия: + +1. Экспортируйте объект темы в качестве экспорта по умолчанию в записи пакета. + +2. Если есть возможность, экспортируйте определение типа конфигурации темы как `ThemeConfig`. + +3. Если ваша тема требует настройки конфигурации VitePress, экспортируйте эту конфигурацию в подпапку пакета (например. `my-theme/config`), чтобы пользователь мог расширить её. + +4. Документируйте параметры конфигурации темы (как через файл конфигурации, так и через метаданные). + +5. Предоставьте чёткие инструкции по использованию вашей темы (см. ниже). + +## Использование пользовательской темы {#consuming-a-custom-theme} + +Чтобы использовать внешнюю тему, импортируйте и реэкспортируйте её из элемента пользовательской темы: + +```js +// .vitepress/theme/index.js +import Theme from 'awesome-vitepress-theme' + +export default Theme +``` + +Если тема требует расширения: + +```js +// .vitepress/theme/index.js +import Theme from 'awesome-vitepress-theme' + +export default { + extends: Theme, + enhanceApp(ctx) { + // ... + } +} +``` + +Если тема требует специальных настроек VitePress, вам нужно будет также расширить их в своем собственном конфиге: + +```ts +// .vitepress/config.ts +import baseConfig from 'awesome-vitepress-theme/config' + +export default { + // расширить базовый конфиг темы (если необходимо) + extends: baseConfig +} +``` + +Наконец, если тема предоставляет типы для своего конфига темы: + +```ts +// .vitepress/config.ts +import baseConfig from 'awesome-vitepress-theme/config' +import { defineConfigWithTheme } from 'vitepress' +import type { ThemeConfig } from 'awesome-vitepress-theme' + +export default defineConfigWithTheme({ + extends: baseConfig, + themeConfig: { + // Тип `ThemeConfig` + } +}) +``` diff --git a/docs/ru/guide/data-loading.md b/docs/ru/guide/data-loading.md new file mode 100644 index 00000000..a611dc88 --- /dev/null +++ b/docs/ru/guide/data-loading.md @@ -0,0 +1,258 @@ +# Загрузка данных в режиме реального времени {#build-time-data-loading} + +VitePress предоставляет функцию **загрузчиков данных**, которая позволяет загружать произвольные данные и импортировать их со страниц или компонентов. Загрузка данных выполняется **только во время сборки**: Полученные данные будут сериализованы в виде JSON в финальной сборке JavaScript. + +Загрузчики данных могут использоваться для получения удалённых данных или генерирования метаданных на основе локальных файлов. Например, вы можете использовать загрузчики данных для анализа всех локальных страниц API и автоматического создания индекса всех записей API. + +## Пример использования {#basic-usage} + +Файл загрузчика данных должен заканчиваться либо `.data.js`, либо `.data.ts`. Файл должен предоставлять экспорт объекта по умолчанию с помощью метода `load()`: + +```js +// example.data.js +export default { + load() { + return { + hello: 'мир' + } + } +} +``` + +Модуль загрузчика выполняется только в Node.js, поэтому вы можете импортировать любые API Node и зависимости npm по мере необходимости. + +Затем вы можете импортировать данные из этого файла в страницы `.md` и компоненты `.vue` с помощью экспорта с именем `data`: + +```vue + + +
{{ data }}
+``` + +Результат: + +```json +{ + "hello": "мир" +} +``` + +Вы заметите, что сам загрузчик данных не экспортирует `data`. Это VitePress вызывает метод `load()` за кулисами и неявно раскрывает результат через именованный экспорт `data`. + +Это работает, даже если загрузчик асинхронный: + +```js +export default { + async load() { + // получение удалённых данных + return (await fetch('...')).json() + } +} +``` + +## Данные из локальных файлов {#data-from-local-files} + +Если вам нужно генерировать данные на основе локальных файлов, используйте опцию `watch` в загрузчике данных, чтобы изменения, внесённые в эти файлы, вызывали горячие обновления. + +Опция `watch` удобна ещё и тем, что вы можете использовать [шаблоны glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) для соответствия нескольким файлам. Шаблоны могут быть относительными к самому файлу загрузчика, а функция `load()` будет получать совпадающие файлы в виде абсолютных путей. + +В следующем примере показана загрузка CSV-файлов и их преобразование в JSON с помощью [csv-parse](https://github.com/adaltas/node-csv/tree/master/packages/csv-parse/). Поскольку этот файл выполняется только во время сборки, вы не будете передавать CSV-парсер клиенту! + +```js +import fs from 'node:fs' +import { parse } from 'csv-parse/sync' + +export default { + watch: ['./data/*.csv'], + load(watchedFiles) { + // watchedFiles будет представлять собой массив абсолютных путей к найденным файлам. + // Формируем массив метаданных записи блога, которые можно использовать для визуализации списка в макете темы + return watchedFiles.map((file) => { + return parse(fs.readFileSync(file, 'utf-8'), { + columns: true, + skip_empty_lines: true + }) + }) + } +} +``` + +## `createContentLoader` {#createcontentloader} + +При создании сайта, ориентированного на контент, нам часто приходится создавать страницы типа «архив», или «индекс», на которых мы перечисляем все доступные записи в нашей коллекции контента. Например, записи в блоге или страницы API. Мы **можем** реализовать это напрямую с помощью API загрузчика данных, но поскольку это очень распространённый случай использования, VitePress также предоставляет функцию `createContentLoader`, чтобы упростить эту задачу: + +```js +// posts.data.js +import { createContentLoader } from 'vitepress' + +export default createContentLoader('posts/*.md' /* параметры */) +``` + +Эта функция принимает шаблон glob относительно [исходного каталога](./routing#source-directory) и возвращает объект `{ watch, load }` загрузчика данных, который может быть использован в качестве экспорта по умолчанию в файле загрузчика данных. В нем также реализовано кэширование на основе временных меток изменения файлов для повышения производительности dev. + +Обратите внимание, что загрузчик работает только с файлами Markdown — совпадающие файлы, не относящиеся к Markdown, будут пропущены. + +Загруженные данные будут представлять собой массив с типом `ContentData[]`: + +```ts +interface ContentData { + // отображаемый URL-адрес страницы, например: /posts/hello.html (не включает `base`) + // выполните итерацию вручную или используйте пользовательскую `трансформацию` для нормализации путей + url: string + // метаданные страницы + frontmatter: Record + + // следующие параметры присутствуют только в том случае, если соответствующие опции включены + // мы рассмотрим их ниже + src: string | undefined + html: string | undefined + excerpt: string | undefined +} +``` + +По умолчанию указываются только `url` и `frontmatter`. Это связано с тем, что загруженные данные будут вложены в клиентский пакет в виде JSON, поэтому нам нужно быть осторожными с их размером. Вот пример использования этих данных для создания минимальной индексной страницы блога: + +```vue + + + +``` + +### Параметры {#options} + +Данные по умолчанию могут не соответствовать всем требованиям — вы можете изменить данные с помощью параметров: + +```js +// posts.data.js +import { createContentLoader } from 'vitepress' + +export default createContentLoader('posts/*.md', { + includeSrc: true, // включить исходный текст в формате Markdown? + render: true, // включать в себя полный HTML страницы? + excerpt: true, // включить отрывок? + transform(rawData) { + // составляйте карты, сортируйте или фильтруйте исходные данные по своему усмотрению. + // конечный результат — это то, что будет отправлено клиенту. + return rawData + .sort((a, b) => { + return +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date) + }) + .map((page) => { + page.src // исходный текст в формате Markdown + page.html // отображение полной страницы HTML + page.excerpt // отображаемый отрывок HTML (содержимое выше первого `---`) + return { + /* ... */ + } + }) + } +}) +``` + +Посмотрите, как он используется в [блоге Vue.js](https://github.com/vuejs/blog/blob/main/.vitepress/theme/posts.data.ts). + +API `createContentLoader` также можно использовать внутри [хуков сборки](../reference/site-config#build-hooks): + +```js +// .vitepress/config.js +export default { + async buildEnd() { + const posts = await createContentLoader('posts/*.md').load() + // генерируем файлы на основе метаданных сообщений, например, RSS-канал + } +} +``` + +**Types** + +```ts +interface ContentOptions { + /** + * Включаем src? + * @default false + */ + includeSrc?: boolean + + /** + * Преобразовываем src в HTML и включаем в данные? + * @default false + */ + render?: boolean + + /** + * Если `boolean`, то следует ли разбирать и включать отрывок? (отображается как HTML) + * + * Если `function`, то управляйте тем, как отрывок извлекается из содержимого. + * + * Если `string`, определите пользовательский разделитель, который будет использоваться для извлечения + * отрывка. Разделителем по умолчанию является `---`, если `excerpt` имеет значение `true`. + * + * @see https://github.com/jonschlinkert/gray-matter#optionsexcerpt + * @see https://github.com/jonschlinkert/gray-matter#optionsexcerpt_separator + * + * @default false + */ + excerpt?: + | boolean + | (( + file: { + data: { [key: string]: any } + content: string + excerpt?: string + }, + options?: any + ) => void) + | string + + /** + * Преобразуйте данные. Обратите внимание, что при импорте из компонентов или файлов + * с разметкой данные будут вложены в клиентский пакет в виде JSON. + */ + transform?: (data: ContentData[]) => T | Promise +} +``` + +## Загрузчики типизированных данных {#typed-data-loaders} + +При использовании TypeScript вы можете ввести свой загрузчик и экспортировать `data` следующим образом: + +```ts +import { defineLoader } from 'vitepress' + +export interface Data { + // тип данных +} + +declare const data: Data +export { data } + +export default defineLoader({ + // тип проверенных опций загрузчика + watch: ['...'], + async load(): Promise { + // ... + } +}) +``` + +## Конфигурация {#configuration} + +Чтобы получить информацию о конфигурации внутри загрузчика, вы можете использовать код, подобный этому: + +```ts +import type { SiteConfig } from 'vitepress' + +const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG +``` diff --git a/docs/ru/guide/deploy.md b/docs/ru/guide/deploy.md new file mode 100644 index 00000000..d8ed1c53 --- /dev/null +++ b/docs/ru/guide/deploy.md @@ -0,0 +1,293 @@ +--- +outline: deep +--- + +# Развёртывание вашего сайта VitePress {#deploy-your-vitepress-site} + +Следующие руководства основаны на некоторых общих предположениях: + +- Сайт VitePress находится в директории `docs` вашего проекта. +- Вы используете выходной каталог сборки по умолчанию (`.vitepress/dist`). +- VitePress установлен как локальная зависимость в вашем проекте, и вы установили следующие скрипты в вашем `package.json`: + + ```json + { + "scripts": { + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + } + } + ``` + +## Создание и локальное тестирование {#build-and-test-locally} + +1. Выполните эту команду, чтобы собрать документацию: + + ```sh + $ npm run docs:build + ``` + +2. После сборки просмотрите её локально, запустив команду: + + ```sh + $ npm run docs:preview + ``` + + Команда `preview` загрузит локальный статический веб-сервер, который будет обслуживать выходной каталог `.vitepress/dist` по адресу `http://localhost:4173`. Вы можете использовать это, чтобы убедиться, что всё выглядит хорошо, прежде чем отправлять в производство. + +3. Вы можете настроить порт сервера, передав `--port` в качестве аргумента. + + ```json + { + "scripts": { + "docs:preview": "vitepress preview docs --port 8080" + } + } + ``` + + Теперь метод `docs:preview` запустит сервер по адресу `http://localhost:8080`. + +## Установка публичного базового пути {#setting-a-public-base-path} + +По умолчанию предполагается, что сайт будет развёрнут по корневому пути домена (`/`). Если ваш сайт будет обслуживаться по подпути, например, `https://mywebsite.com/blog/`, то в конфигурации VitePress необходимо установить для опции [`base`](../reference/site-config#base) значение `'/blog/'`. + +**Пример:** Если вы используете Github (или GitLab) Pages и развёртываете на `user.github.io/repo/`, то установите `base` на `/repo/`. + +## Заголовки кэша HTTP {#http-cache-headers} + +Если вы контролируете HTTP-заголовки на своем рабочем сервере, вы можете настроить заголовки `cache-control` для достижения лучшей производительности при повторных посещениях. + +В производственной сборке используются хэшированные имена файлов для статических ресурсов (JavaScript, CSS и другие импортированные ресурсы, не находящиеся в `public`). Если вы просмотрите предварительную версию с помощью сетевой вкладки devtools вашего браузера, вы увидите файлы типа `app.4f283b18.js`. + +Этот хэш `4f283b18` генерируется из содержимого этого файла. Один и тот же хэшированный URL гарантированно обслуживает одно и то же содержимое файла — если содержимое меняется, то и URL тоже. Это означает, что вы можете смело использовать самые сильные заголовки кэша для этих файлов. Все такие файлы будут помещены в каталог `assets/` в выходном каталоге, поэтому вы можете настроить для них следующий заголовок: + +``` +Cache-Control: max-age=31536000,immutable +``` + +::: details Пример файла Netlify `_headers` + +``` +/assets/* + cache-control: max-age=31536000 + cache-control: immutable +``` + +Примечание: файл `_headers` должен быть помещён в [директорию `public`](./asset-handling#the-public-directory) — в нашем случае `docs/public/_headers` — так, чтобы он был скопирован в выходной каталог. + +[Netlify custom headers documentation](https://docs.netlify.com/routing/headers/) + +::: + +::: details Пример конфигурации Vercel в файле `vercel.json` + +```json +{ + "headers": [ + { + "source": "/assets/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "max-age=31536000, immutable" + } + ] + } + ] +} +``` + +Примечание: Файл `vercel.json` должен быть помещен в корень вашего **репозитория**. + +[Документация Vercel по конфигурации заголовков](https://vercel.com/docs/concepts/projects/project-configuration#headers) + +::: + +## Руководства по платформам {#platform-guides} + +### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render} + +Создайте новый проект и измените эти настройки с помощью панели управления: + +- **Build Command:** `npm run docs:build` +- **Output Directory:** `docs/.vitepress/dist` +- **Node Version:** `18` (или выше) + +::: warning ПРЕДУПРЕЖДЕНИЕ +Не включайте такие опции, как _Auto Minify_ для HTML-кода. Он удалит из вывода комментарии, которые имеют значение для Vue. При их удалении могут возникать ошибки несоответствия гидратации. +::: + +### GitHub Pages {#github-pages} + +1. Создайте файл с именем `deploy.yml` в директории `.github/workflows` вашего проекта с примерно таким содержанием: + + ```yaml + # Пример рабочего процесса для создания и развёртывания сайта VitePress на GitHub Pages + # + name: Deploy VitePress site to Pages + + on: + # Выполняется при пушах, направленных в ветку `main`. Измените это значение на `master`, если вы + # используете ветку `master` в качестве ветки по умолчанию. + push: + branches: [main] + + # Позволяет запустить этот рабочий процесс вручную на вкладке «Actions». + workflow_dispatch: + + # Устанавливает разрешения GITHUB_TOKEN, чтобы разрешить развёртывание на страницах GitHub. + permissions: + contents: read + pages: write + id-token: write + + # Разрешите только одно одновременное развёртывание, пропуская запуски, стоящие в очереди. + # Однако НЕ отменяйте текущие запуски, поскольку мы хотим дать возможность завершить производственные развёртывания. + concurrency: + group: pages + cancel-in-progress: false + + jobs: + # Сборка + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Не требуется, если функция lastUpdated не включена + # - uses: pnpm/action-setup@v3 # Раскомментируйте, если вы используете pnpm + # - uses: oven-sh/setup-bun@v1 # Раскомментируйте, если вы используете Bun + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm # или pnpm / yarn + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Install dependencies + run: npm ci # или pnpm install / yarn install / bun install + - name: Build with VitePress + run: npm run docs:build # или pnpm docs:build / yarn docs:build / bun run docs:build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + # Развёртывание + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + ``` + + ::: warning ПРЕДУПРЕЖДЕНИЕ + Убедитесь, что опция `base` в вашем VitePress настроена правильно. Дополнительные сведения см. в секции [Установка публичного базового пути](#setting-a-public-base-path). + ::: + +2. В настройках вашего репозитория в разделе «Pages» выберите пункт меню «GitHub Actions» в секции «Build and deployment > Source». + +3. Внесите свои изменения в ветку `main` и дождитесь завершения процесса GitHub Actions. Вы должны увидеть, что ваш сайт развёрнут по адресу `https://.github.io/[repository]/` или `https:///` в зависимости от ваших настроек. Ваш сайт будет автоматически разворачиваться при каждом внесении изменений в ветке `main`. + +### GitLab Pages {#gitlab-pages} + +1. Установите `outDir` в конфигурации VitePress на `../public`. Настройте опцию `base` на `'/<репозиторий>/'`, если вы хотите развернуть ваш проект по адресу на `https://<имя пользователя>.gitlab.io/<репозиторий>/`. + +2. Создайте файл с именем `.gitlab-ci.yml` в корне вашего проекта с приведённым ниже содержимым. Это позволит создавать и развёртывать ваш сайт каждый раз, когда вы вносите изменения в его содержимое: + + ```yaml + image: node:18 + pages: + cache: + paths: + - node_modules/ + script: + # - apk add git # Отметьте это, если вы используете небольшие докер-образы, такие как alpine, и у вас включен lastUpdated + - npm install + - npm run docs:build + artifacts: + paths: + - public + only: + - main + ``` + +### Статические веб-приложения Azure {#azure-static-web-apps} + +1. Следуйте [официальной документации](https://docs.microsoft.com/ru-ru/azure/static-web-apps/build-configuration). + +2. Установите эти значения в вашем конфигурационном файле (и удалите те, которые вам не нужны, например, `api_location`): + + - **`app_location`**: `/` + - **`output_location`**: `docs/.vitepress/dist` + - **`app_build_command`**: `npm run docs:build` + +### Firebase {#firebase} + +1. Создайте `firebase.json` и `.firebaserc` в корне вашего проекта: + + `firebase.json`: + + ```json + { + "hosting": { + "public": "docs/.vitepress/dist", + "ignore": [] + } + } + ``` + + `.firebaserc`: + + ```json + { + "projects": { + "default": "" + } + } + ``` + +2. После запуска `npm run docs:build` выполните эту команду для развёртывания: + + ```sh + firebase deploy + ``` + +### Surge {#surge} + +1. После запуска `npm run docs:build` выполните эту команду для развёртывания: + + ```sh + npx surge docs/.vitepress/dist + ``` + +### Heroku {#heroku} + +1. Следуйте документации и руководству, приведённому в [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static). + +2. Создайте файл `static.json` в корне вашего проекта со следующим содержимым: + + ```json + { + "root": "docs/.vitepress/dist" + } + ``` + +### Edgio {#edgio} + +См. [Создание и развёртывание приложения VitePress в Edgio](https://docs.edg.io/applications/v6/sites_frameworks/getting_started/vitepress). + +### Хостинг статических файлов Kinsta {#kinsta-static-site-hosting} + +Вы можете развернуть свой сайт Vitepress на [Kinsta](https://kinsta.com/static-site-hosting/), следуя этим [инструкциям](https://kinsta.com/docs/vitepress-static-site-example/). + +### Stormkit + +Вы можете развернуть свой проект VitePress на [Stormkit](https://www.stormkit.io), следуя следующим [инструкциям](https://stormkit.io/blog/how-to-deploy-vitepress). diff --git a/docs/ru/guide/extending-default-theme.md b/docs/ru/guide/extending-default-theme.md new file mode 100644 index 00000000..ef43dd5d --- /dev/null +++ b/docs/ru/guide/extending-default-theme.md @@ -0,0 +1,342 @@ +--- +outline: deep +--- + +# Расширение темы по умолчанию {#extending-the-default-theme} + +Тема VitePress по умолчанию оптимизирована для документации и может быть настроена по своему усмотрению. Полный список опций можно найти в главе [Настройки темы по умолчанию](../reference/default-theme-config). + +Однако есть ряд случаев, когда одной лишь конфигурации будет недостаточно. Например: + +1. Вам нужно изменить стили CSS; +2. Вам нужно изменить экземпляр приложения Vue, например, чтобы зарегистрировать глобальные компоненты; +3. Вам нужно внедрить пользовательский контент в тему через слоты макета. + +Эти расширенные настройки потребуют использования пользовательской темы, которая «расширяет» тема по умолчанию. + +::: tip Совет +Прежде чем приступить к работе, обязательно прочитайте главу [Пользовательская тема](./custom-theme), чтобы понять, как работают пользовательские темы. +::: + +## Настройка CSS {#customizing-css} + +CSS темы по умолчанию можно настроить, переопределив переменные CSS корневого уровня: + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme +``` + +```css +/* .vitepress/theme/custom.css */ +:root { + --vp-c-brand-1: #646cff; + --vp-c-brand-2: #747bff; +} +``` + +См. [переменные CSS темы по умолчанию](https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css), которые можно переопределить. + +## Использование различных шрифтов {#using-different-fonts} + +VitePress использует [Inter](https://rsms.me/inter/) в качестве шрифта по умолчанию, и будет включать шрифты в вывод сборки. Шрифт также автоматически загружается в производство. Однако это может быть нежелательно, если вы хотите использовать другой основной шрифт. + +Чтобы не включать Inter в вывод сборки, импортируйте тему из `vitepress/theme-without-fonts`: + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme-without-fonts' +import './my-fonts.css' + +export default DefaultTheme +``` + +```css +/* .vitepress/theme/custom.css */ +:root { + --vp-font-family-base: /* normal text font */ --vp-font-family-mono: + /* code font */; +} +``` + +::: warning Предупреждение +Если вы используете дополнительные компоненты, такие как [Страница команды](../reference/default-theme-team-page), убедитесь, что они также импортированы из `vitepress/theme-without-fonts`! +::: + +Если ваш шрифт — это локальный файл, на который ссылаются через `@font-face`, он будет обработан как ресурс и включён в каталог `.vitepress/dist/assets` с хэшированным именем файла. Чтобы предварительно загрузить этот файл, используйте хук сборки [transformHead](../reference/site-config#transformhead): + +```js +// .vitepress/config.js +export default { + transformHead({ assets }) { + // настраиваем regex соответствующим образом, чтобы он соответствовал вашему шрифту + const myFontFile = assets.find((file) => /font-name\.\w+\.woff2/) + if (myFontFile) { + return [ + [ + 'link', + { + rel: 'preload', + href: myFontFile, + as: 'font', + type: 'font/woff2', + crossorigin: '' + } + ] + ] + } + } +} +``` + +## Регистрация глобальных компонентов {#registering-global-components} + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme' + +/** @type {import('vitepress').Theme} */ +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // регистрируем пользовательские глобальные компоненты + app.component('MyGlobalComponent' /* ... */) + } +} +``` + +Если вы используете TypeScript: + +```ts +// .vitepress/theme/index.ts +import type { Theme } from 'vitepress' +import DefaultTheme from 'vitepress/theme' + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // регистрируем пользовательские глобальные компоненты + app.component('MyGlobalComponent' /* ... */) + } +} satisfies Theme +``` + +Поскольку мы используем Vite, вы также можете использовать [глобальную функцию импорта](https://vitejs.dev/guide/features.html#glob-import) Vite для автоматической регистрации каталога компонентов. + +## Слоты макета {#layout-slots} + +Компонент `` темы по умолчанию имеет несколько слотов, которые можно использовать для вставки содержимого в определённые места страницы. Вот пример внедрения компонента в структуру before: + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme' +import MyLayout from './MyLayout.vue' + +export default { + extends: DefaultTheme, + // переопределяем макет с помощью компонента-обёртки, который + // вводит слоты + Layout: MyLayout +} +``` + +```vue + + + + +``` + +Также можно использовать функцию рендеринга. + +```js +// .vitepress/theme/index.js +import { h } from 'vue' +import DefaultTheme from 'vitepress/theme' +import MyComponent from './MyComponent.vue' + +export default { + extends: DefaultTheme, + Layout() { + return h(DefaultTheme.Layout, null, { + 'aside-outline-before': () => h(MyComponent) + }) + } +} +``` + +Полный список слотов, доступных в макете темы по умолчанию: + +- Когда `layout: 'doc'` (по умолчанию) включен через метаданные: + - `doc-top` + - `doc-bottom` + - `doc-footer-before` + - `doc-before` + - `doc-after` + - `sidebar-nav-before` + - `sidebar-nav-after` + - `aside-top` + - `aside-bottom` + - `aside-outline-before` + - `aside-outline-after` + - `aside-ads-before` + - `aside-ads-after` +- Когда `layout: 'home'` включен через метаданные: + - `home-hero-before` + - `home-hero-info-before` + - `home-hero-info` + - `home-hero-info-after` + - `home-hero-actions-after` + - `home-hero-image` + - `home-hero-after` + - `home-features-before` + - `home-features-after` +- Когда `layout: 'page'` включен через метаданные: + - `page-top` + - `page-bottom` +- На странице «Не найдено (404)»: + - `not-found` +- Всегда: + - `layout-top` + - `layout-bottom` + - `nav-bar-title-before` + - `nav-bar-title-after` + - `nav-bar-content-before` + - `nav-bar-content-after` + - `nav-screen-content-before` + - `nav-screen-content-after` + +## Использование View Transitions API {#using-view-transitions-api} + +### Переключение внешнего вида {#on-appearance-toggle} + +Вы можете расширить стандартную тему, чтобы обеспечить пользовательский переход при переключении цветового режима. Пример: + +```vue + + + + + + + +``` + +Результат (**предупреждение!**: мигающие цвета, резкие движения, яркий свет): + +
+Демонстрация + +![Демонстрация переходов](/appearance-toggle-transition.webp) + +
+ +Более подробно о переходах между представлениями читайте в [документации Chrome](https://developer.chrome.com/docs/web-platform/view-transitions/). + +### Изменение маршрута {#on-route-change} + +Скоро будет. + +## Переопределение внутренних компонентов {#overriding-internal-components} + +Вы можете использовать [псевдонимы](https://vitejs.dev/config/shared-options.html#resolve-alias) Vite, чтобы заменить стандартные компоненты темы на свои собственные: + +```ts +import { fileURLToPath, URL } from 'node:url' +import { defineConfig } from 'vitepress' + +export default defineConfig({ + vite: { + resolve: { + alias: [ + { + find: /^.*\/VPNavBar\.vue$/, + replacement: fileURLToPath( + new URL('./components/CustomNavBar.vue', import.meta.url) + ) + } + ] + } + } +}) +``` + +Чтобы узнать точное название компонента, обратитесь к [нашему исходному коду](https://github.com/vuejs/vitepress/tree/main/src/client/theme-default/components). Поскольку компоненты являются внутренними, есть небольшая вероятность того, что их название будет обновлено между минорными выпусками. diff --git a/docs/ru/guide/frontmatter.md b/docs/ru/guide/frontmatter.md new file mode 100644 index 00000000..967338f8 --- /dev/null +++ b/docs/ru/guide/frontmatter.md @@ -0,0 +1,48 @@ +# Метаданные {#frontmatter} + +## Использование {#usage} + +VitePress поддерживает метаданные YAML во всех Markdown-файлах, разбирая их с помощью [gray-matter](https://github.com/jonschlinkert/gray-matter). Метаданные должны находиться в верхней части Markdown-файла (перед любыми элементами, включая теги ` + + +``` + +## Поддержка RTL (экспериментально) {#rtl-support-experimental} + +Для поддержки языков с написанием справа налево укажите `dir: 'rtl'` в конфиге и используйте какой-нибудь плагин RTLCSS PostCSS, например , или . Вам нужно настроить плагин PostCSS на использование `:where([dir="ltr"])` и `:where([dir="rtl"])` в качестве префиксов, чтобы избежать проблем со спецификой CSS. diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md new file mode 100644 index 00000000..65bd897f --- /dev/null +++ b/docs/ru/guide/markdown.md @@ -0,0 +1,933 @@ +# Расширения Markdown {#markdown-extensions} + +VitePress поставляется со встроенными расширениями Markdown. + +## Якоря заголовков {#header-anchors} + +К заголовкам автоматически применяются якорные ссылки. Отрисовку якорей можно настроить с помощью опции `markdown.anchor`. + +### Пользовательские якоря {#custom-anchors} + +Чтобы указать пользовательский тег якоря для заголовка, а не использовать автоматически сгенерированный, добавьте суффикс к заголовку: + +``` +# Использование пользовательских якорей {#мой-якорь} +``` + +Это позволит вам ссылаться на заголовок как `#мой-якорь` вместо стандартного `#использование-пользовательских-якорей`. + +## Ссылки {#links} + +Особое внимание уделяется как внутренним, так и внешним ссылкам. + +### Внутренние ссылки {#internal-links} + +Внутренние ссылки преобразуются в ссылки маршрутизатора для навигации SPA. Кроме того, каждый `index.md`, содержащийся в каждом подкаталоге, будет автоматически преобразован в `index.html`, с соответствующим URL `/`. + +Например, при следующей структуре каталогов: + +``` +. +├─ index.md +├─ foo +│ ├─ index.md +│ ├─ one.md +│ └─ two.md +└─ bar + ├─ index.md + ├─ three.md + └─ four.md +``` + +И при условии, что вы находитесь в `foo/one.md`: + +```md +[Home](/) +[foo](/foo/) +[foo heading](./#heading) +[bar - three](../bar/three) +[bar - three](../bar/three.md) +[bar - four](../bar/four.html) +``` + +### Суффикс страницы {#page-suffix} + +Страницы и внутренние ссылки по умолчанию генерируются с суффиксом `.html`. + +### Внешние ссылки {#external-links} + +Исходящие ссылки автоматически получают значение `target="_blank" rel="noreferrer"`: + +- [vuejs.org](https://vuejs.org) +- [VitePress on GitHub](https://github.com/vuejs/vitepress) + +## Метаданные {#frontmatter} + +[Метаданные YAML](https://jekyllrb.com/docs/front-matter/) поддерживаются из коробки: + +```yaml +--- +title: Веду блог как хакер +lang: ru-RU +--- +``` + +Эти данные будут доступны остальной части страницы, а также всем пользовательским и тематическим компонентам. + +Более подробную информацию можно найти в главе [Метаданные](../reference/frontmatter-config). + +## Таблицы в стиле GitHub {#github-style-tables} + +**Разметка** + +```md +| Таблицы | это | круто | +| ---------------- | :----------------------: | ----: | +| столбец 3 | выровнен по правому краю | $1600 | +| столбец 2 | отцентрован | $12 | +| полосатые строки | как полоски у зебры | $1 | +``` + +**Результат** + +| Таблицы | это | круто | +| ---------------- | :----------------------: | -----: | +| столбец 3 | выровнен по правому краю | \$1600 | +| столбец 2 | отцентрован | \$12 | +| полосатые строки | как полоски у зебры | \$1 | + +## Эмодзи :tada: {#emoji} + +**Разметка** + +``` +:tada: :100: +``` + +**Результат** + +:tada: :100: + +[Список всех эмодзи](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs). + +## Оглавление {#table-of-contents} + +**Разметка** + +``` +[[toc]] +``` + +**Результат** + +[[toc]] + +Отрисовка TOC может быть настроена с помощью опции `markdown.toc`. + +## Пользовательские контейнеры {#custom-containers} + +Пользовательские контейнеры можно определить по их типам, заголовкам и содержимому. + +### Заголовок по умолчанию {#default-title} + +**Разметка** + +```md +::: info +Это информация. +::: + +::: tip +Это совет. +::: + +::: warning +Это предупреждение. +::: + +::: danger +Это сигнал об опасности. +::: + +::: details +Это блок-спойлер. +::: +``` + +**Результат** + +::: info +Это информация. +::: + +::: tip +Это совет. +::: + +::: warning +Это предупреждение. +::: + +::: danger +Это сигнал об опасности. +::: + +::: details +Это блок-спойлер. +::: + +### Пользовательский заголовок {#custom-title} + +Вы можете задать собственный заголовок, добавив текст сразу после «типа» контейнера. + +**Разметка** + +````md +::: danger СТОП +Опасная зона, остановитесь +::: + +::: details Нажмите на меня, чтобы просмотреть код + +```js +console.log('Привет, VitePress!') +``` + +::: +```` + +**Результат** + +::: danger СТОП +Опасная зона, остановитесь +::: + +::: details Нажмите на меня, чтобы просмотреть код + +```js +console.log('Привет, VitePress!') +``` + +::: + +Кроме того, вы можете установить пользовательские заголовки глобально, добавив следующее содержимое в конфигурацию сайта, полезное, если вы пишете не на английском языке: + +```ts +// config.ts +export default defineConfig({ + // ... + markdown: { + container: { + tipLabel: 'СОВЕТ', + warningLabel: 'ПРЕДУПРЕЖДЕНИЕ', + dangerLabel: 'ОПАСНОСТЬ', + infoLabel: 'ИНФОРМАЦИЯ', + detailsLabel: 'Подробная информация' + } + } + // ... +}) +``` + +### `raw` {#raw} + +Это специальный контейнер, который можно использовать для предотвращения конфликтов стилей и маршрутизаторов с VitePress. Это особенно полезно при документировании библиотек компонентов. Вы также можете посмотреть [whyframe](https://whyframe.dev/docs/integrations/vitepress) для лучшей изоляции. + +**Syntax** + +```md +::: raw +Заворачивается в
+::: +``` + +Класс `vp-raw` можно использовать и непосредственно на элементах. Изоляция стиля в настоящее время осуществляется по желанию: + +- Установите `postcss` с помощью предпочитаемого менеджера пакетов: + + ```sh + $ npm add -D postcss + ``` + +- Создайте файл с именем `docs/postcss.config.mjs` и добавьте в него следующее: + + ```js + import { postcssIsolateStyles } from 'vitepress' + + export default { + plugins: [postcssIsolateStyles()] + } + ``` + + Он использует [`postcss-prefix-selector`](https://github.com/postcss/postcss-load-config) под капотом. Вы можете передать ему параметры следующим образом: + + ```js + postcssIsolateStyles({ + includeFiles: [/vp-doc\.css/] // по умолчанию /base\.css/ + }) + ``` + +## Оповещения в стиле GitHub {#github-flavored-alerts} + +VitePress также поддерживает [Оповещения в стиле GitHub](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts) для отображения в виде призывов. Они будут отображаться так же, как и [пользовательские контейнеры](#custom-containers). + +```md +> [!NOTE] +> Выделяет информацию, на которую пользователи должны обратить внимание, даже при беглом просмотре. + +> [!TIP] +> Дополнительная информация, которая поможет пользователю добиться большего успеха. + +> [!IMPORTANT] +> Важнейшая информация, необходимая пользователям для достижения успеха. + +> [!WARNING] +> Критический контент, требующий немедленного внимания пользователей из-за потенциальных рисков. + +> [!CAUTION] +> Негативные потенциальные последствия того или иного действия. +``` + +> [!NOTE] +> Выделяет информацию, на которую пользователи должны обратить внимание, даже при беглом просмотре. + +> [!TIP] +> Дополнительная информация, которая поможет пользователю добиться большего успеха. + +> [!IMPORTANT] +> Важнейшая информация, необходимая пользователям для достижения успеха. + +> [!WARNING] +> Критический контент, требующий немедленного внимания пользователей из-за потенциальных рисков. + +> [!CAUTION] +> Негативные потенциальные последствия того или иного действия. + +## Подсветка синтаксиса в блоках кода {#syntax-highlighting-in-code-blocks} + +VitePress использует [Shiki](https://github.com/shikijs/shiki) для выделения синтаксиса языка в блоках кода Markdown с помощью цветного текста. Shiki поддерживает широкий спектр языков программирования. Всё, что вам нужно сделать, это добавить правильный псевдоним языка к начальным значкам блока кода: + +**Разметка** + +```` +```js +export default { + name: 'MyComponent', + // ... +} +``` +```` + +```` +```html +
    +
  • + {{ todo.text }} +
  • +
+``` +```` + +**Результат** + +```js +export default { + name: 'MyComponent' + // ... +} +``` + +```html +
    +
  • {{ todo.text }}
  • +
+``` + +[Список всех поддерживаемых языков](https://shiki.style/languages). + +Вы также можете настроить тему подсветки синтаксиса в конфигурации приложения. Более подробную информацию см. в секции [`markdown`](../reference/site-config#markdown). + +## Выделение строк в блоках кода {#line-highlighting-in-code-blocks} + +**Разметка** + +```` +```js{4} +export default { + data () { + return { + msg: 'Подсвечено!' + } + } +} +``` +```` + +**Результат** + +```js{4} +export default { + data () { + return { + msg: 'Подсвечено!' + } + } +} +``` + +Помимо одной строки, вы можете указать несколько отдельных строк, диапазонов или и то, и другое: + +– Диапазоны строк, например: `{5-8}`, `{3-10}`, `{10-17}` + +- Несколько одиночных строк, например: `{4,7,9}` +- Диапазоны строк и отдельные строки, например: `{4,7-13,16,23-27,40}` + +**Разметка** + +```` +```js{1,4,6-8} +export default { // Подсвечено + data () { + return { + msg: `Подсвечено! + Эта строка не выделена, + но эта и две следующих - да.`, + motd: 'VitePress - это потрясающе', + lorem: 'ipsum' + } + } +} +``` +```` + +**Результат** + +```js{1,4,6-8} +export default { // Подсвечено + data () { + return { + msg: `Подсвечено! + Эта строка не выделена, + но эта и две следующих - да.`, + motd: 'VitePress - это потрясающе', + lorem: 'ipsum', + } + } +} +``` + +Кроме того, можно выделять непосредственно в строке, используя комментарий `// [!code highlight]`. + +**Разметка** + +```` +```js +export default { + data () { + return { + msg: 'Подсвечено!' // [!!code highlight] + } + } +} +``` +```` + +**Результат** + +```js +export default { + data() { + return { + msg: 'Подсвечено!' // [!code highlight] + } + } +} +``` + +## Фокус в блоках кода {#focus-in-code-blocks} + +Добавление комментария `// [!code focus]` к строке сфокусирует её и размоет остальные части кода. + +Кроме того, вы можете задать количество строк для фокусировки с помощью `// [!code focus:]`. + +**Разметка** + +```` +```js +export default { + data () { + return { + msg: 'Фокус!' // [!!code focus] + } + } +} +``` +```` + +**Результат** + +```js +export default { + data() { + return { + msg: 'Фокус!' // [!code focus] + } + } +} +``` + +## Подсветка различий в блоках кода {#colored-diffs-in-code-blocks} + +Добавление в строку комментариев `// [!code --]` или `// [!code ++]` создаст diff этой строки, сохраняя цвета блока кода. + +**Разметка** + +```` +```js +export default { + data () { + return { + msg: 'Удалено' // [!!code --] + msg: 'Добавлено' // [!!code ++] + } + } +} +``` +```` + +**Результат** + +```js +export default { + data () { + return { + msg: 'Удалено' // [!code --] + msg: 'Добавлено' // [!code ++] + } + } +} +``` + +## Ошибки и предупреждения в блоках кода {#errors-and-warnings-in-code-blocks} + +Добавление в строку комментариев `// [!code warning]` или `// [!code error]` окрасит её соответствующим образом. + +**Разметка** + +```` +```js +export default { + data () { + return { + msg: 'Ошибка', // [!!code error] + msg: 'Предупреждение' // [!!code warning] + } + } +} +``` +```` + +**Результат** + +```js +export default { + data() { + return { + msg: 'Ошибка', // [!code error] + msg: 'Предупреждение' // [!code warning] + } + } +} +``` + +## Номера строк {#line-numbers} + +Вы можете включить нумерацию строк для каждого блока кода в конфигурации: + +```js +export default { + markdown: { + lineNumbers: true + } +} +``` + +Более подробную информацию см. в секции [`markdown`](../reference/site-config#markdown). + +Вы можете добавить метки `:line-numbers` / `:no-line-numbers` в ваши ограждённые блоки кода, чтобы переопределить значение, установленное в конфиге. + +Вы также можете настроить номер начальной строки, добавив `=` после `:line-numbers`. Например, `:line-numbers=2` означает, что номера строк в блоках кода будут начинаться с `2`. + +**Разметка** + +````md +```ts {1} +// опция line-numbers по умолчанию отключена +const line2 = 'Строка 2' +const line3 = 'Строка 3' +``` + +```ts:line-numbers {1} +// опция line-numbers включена +const line2 = 'Строка 2' +const line3 = 'Строка 3' +``` + +```ts:line-numbers=2 {1} +// опция line-numbers включена, нумерация начинается с 2 +const line3 = 'Строка 3' +const line4 = 'Строка 4' +``` +```` + +**Результат** + +```ts {1} +// опция line-numbers по умолчанию отключена +const line2 = 'Строка 2' +const line3 = 'Строка 3' +``` + +```ts:line-numbers {1} +// опция line-numbers включена +const line2 = 'Строка 2' +const line3 = 'Строка 3' +``` + +```ts:line-numbers=2 {1} +// опция line-numbers включена, нумерация начинается с 2 +const line3 = 'Строка 3' +const line4 = 'Строка 4' +``` + +## Импорт фрагментов кода {#import-code-snippets} + +Вы можете импортировать фрагменты кода из существующих файлов, используя следующий синтаксис: + +```md +<<< @/filepath +``` + +[Выделение строк](#line-highlighting-in-code-blocks) тоже поддерживается: + +```md +<<< @/filepath{highlightLines} +``` + +**Разметка** + +```md +<<< @/snippets/snippet.js{2} +``` + +**Файл с кодом** + +<<< @/snippets/snippet.js + +**Результат** + +<<< @/snippets/snippet.js{2} + +::: tip СОВЕТ +Значение `@` соответствует корню источника. По умолчанию это корень проекта VitePress, если не настроен `srcDir`. Альтернативно вы также можете импортировать из относительных путей: + +```md +<<< ../snippets/snippet.js +``` + +::: + +Вы также можете использовать [регион VS Code](https://code.visualstudio.com/docs/editor/codebasics#_folding), чтобы включить только соответствующую часть файла кода. Имя пользовательского региона начинается с `#` после пути к файлу: + +**Разметка** + +```md +<<< @/snippets/snippet-with-region.js#snippet{1} +``` + +**Файл с кодом** + +<<< @/snippets/snippet-with-region.js + +**Результат** + +<<< @/snippets/snippet-with-region.js#snippet{1} + +Вы также можете указать язык внутри фигурных скобок (`{}`) следующим образом: + +```md +<<< @/snippets/snippet.cs{c#} + + + +<<< @/snippets/snippet.cs{1,2,4-6 c#} + + + +<<< @/snippets/snippet.cs{1,2,4-6 c#:line-numbers} +``` + +Это полезно, если исходный язык нельзя определить по расширению вашего файла. + +## Группы кодов {#code-groups} + +Вы можете сгруппировать несколько блоков кода следующим образом: + +**Разметка** + +````md +::: code-group + +```js [config.js] +/** + * @type {import('vitepress').UserConfig} + */ +const config = { + // ... +} + +export default config +``` + +```ts [config.ts] +import type { UserConfig } from 'vitepress' + +const config: UserConfig = { + // ... +} + +export default config +``` + +::: +```` + +**Результат** + +::: code-group + +```js [config.js] +/** + * @type {import('vitepress').UserConfig} + */ +const config = { + // ... +} + +export default config +``` + +```ts [config.ts] +import type { UserConfig } from 'vitepress' + +const config: UserConfig = { + // ... +} + +export default config +``` + +::: + +Вы также можете [импортировать фрагменты](#import-code-snippets) в группы кода: + +**Разметка** + +```md +::: code-group + + + +<<< @/snippets/snippet.js + + + +<<< @/snippets/snippet-with-region.js#snippet{1,2 ts:line-numbers} [фрагмент с регионом] + +::: +``` + +**Результат** + +::: code-group + +<<< @/snippets/snippet.js + +<<< @/snippets/snippet-with-region.js#snippet{1,2 ts:line-numbers} [фрагмент с регионом] + +::: + +## Включение файла Markdown {#markdown-file-inclusion} + +Вы можете включить файл Markdown в другой файл Markdown, даже вложенный. + +::: tip +Вы также можете добавить в префикс пути к Markdown `@`, он будет выступать в качестве корня источника. По умолчанию это корень проекта VitePress, если не настроен `srcDir`. +::: + +Например, вы можете включить относительный файл Markdown следующим образом: + +**Разметка** + +```md +# Документация + +## Основы + + +``` + +**Файл части** (`parts/basics.md`) + +```md +Некоторые вещи для начала. + +### Конфигурация + +Может быть создана с помощью `.foorc.json`. +``` + +**Эквивалентный код** + +```md +# Документация + +## Основы + +Некоторые вещи для начала. + +### Конфигурация + +Может быть создана с помощью `.foorc.json`. +``` + +Он также поддерживает выбор диапазона строк: + +**Разметка** + +```md +# Документация + +## Основы + + +``` + +**Файл части** (`parts/basics.md`) + +```md +Некоторые вещи для начала. + +### Конфигурация + +Может быть создана с помощью `.foorc.json`. +``` + +**Эквивалентный код** + +```md +# Документация + +## Основы + +### Конфигурация + +Может быть создана с помощью `.foorc.json`. +``` + +Формат выбранного диапазона строк может быть следующим: `{3,}`, `{,10}`, `{1,10}` + +::: warning ПРЕДУПРЕЖДЕНИЕ +Обратите внимание, что это не приводит к ошибкам, если ваш файл отсутствует. Поэтому при использовании этой функции убедитесь, что содержимое отображается так, как ожидается. +::: + +## Математические уравнения {#math-equations} + +В настоящее время эта фича предоставляется по желанию. Чтобы включить её, вам нужно установить `markdown-it-mathjax3` и установить значение `true` для опции `markdown.math` в вашем файле конфигурации: + +```sh +npm add -D markdown-it-mathjax3 +``` + +```ts +// .vitepress/config.ts +export default { + markdown: { + math: true + } +} +``` + +**Разметка** + +```md +Когда $a \ne 0$, существует два решения $(ax^2 + bx + c = 0)$: +$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ + +**Уравнения Максвелла:** + +| уравнение | описание | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | +| $\nabla \cdot \vec{\mathbf{B}} = 0$ | дивергенция $\vec{\mathbf{B}}$ равна нулю | +| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | искривление $\vec{\mathbf{E}}$ пропорционально скорости изменения $\vec{\mathbf{B}}$ | +| $\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} = 4 \pi \rho$ | _что?_ | +``` + +**Результат** + +Когда $a \ne 0$, существует два решения $(ax^2 + bx + c = 0)$: +$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ + +**Уравнения Максвелла:** + +| уравнение | описание | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | +| $\nabla \cdot \vec{\mathbf{B}} = 0$ | дивергенция $\vec{\mathbf{B}}$ равна нулю | +| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | искривление $\vec{\mathbf{E}}$ пропорционально скорости изменения $\vec{\mathbf{B}}$ | +| $\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} = 4 \pi \rho$ | _что?_ | + +## Ленивая загрузка изображений {#image-lazy-loading} + +Вы можете включить ленивую загрузку для каждого изображения, добавленного через markdown, установив значение `true` для опции `lazyLoading` в вашем файле конфигурации: + +```js +export default { + markdown: { + image: { + // ленивая загрузка изображений отключена по умолчанию + lazyLoading: true + } + } +} +``` + +## Расширенная конфигурация {#advanced-configuration} + +VitePress использует [markdown-it](https://github.com/markdown-it/markdown-it) для отрисовки Markdown. Многие из вышеперечисленных расширений реализованы с помощью пользовательских плагинов. Вы можете дополнительно настроить экземпляр `markdown-it` с помощью опции `markdown` в файле `.vitepress/config.js`: + +```js +import { defineConfig } from 'vitepress' +import markdownItAnchor from 'markdown-it-anchor' +import markdownItFoo from 'markdown-it-foo' + +export default defineConfig({ + markdown: { + // опции для markdown-it-anchor + // https://github.com/valeriangalliat/markdown-it-anchor#usage + anchor: { + permalink: markdownItAnchor.permalink.headerLink() + }, + + // опции для @mdit-vue/plugin-toc + // https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc#options + toc: { level: [1, 2] }, + + config: (md) => { + // используйте любые плагины для markdown-it! + md.use(markdownItFoo) + } + } +}) +``` + +Полный список настраиваемых свойств см. в секции [`markdown`](../reference/site-config#markdown). diff --git a/docs/ru/guide/migration-from-vitepress-0.md b/docs/ru/guide/migration-from-vitepress-0.md new file mode 100644 index 00000000..4d5c7426 --- /dev/null +++ b/docs/ru/guide/migration-from-vitepress-0.md @@ -0,0 +1,23 @@ +# Переход с VitePress 0.x + +Если вы переходите с версии VitePress 0.x, то в ней есть несколько изменений, связанных с новыми функциями и улучшениями. Следуйте этому руководству, чтобы узнать, как перенести ваше приложение на последнюю версию VitePress. + +## Конфигурация приложения + +- Функция интернационализации ещё не реализована. + +## Конфигурация темы + +- Опция `sidebar` изменила свою структуру. + - Ключ `children` теперь называется `items`. + - Элемент верхнего уровня может не содержать `link` в данный момент. Мы планируем вернуть его обратно. +- `repo`, `repoLabel`, `docsDir`, `docsBranch`, `editLinks`, `editLinkText` удалены в пользу более гибкого api. + - Для добавления ссылки GitHub с иконкой в навигацию используйте функцию [Социальные ссылки](../reference/default-theme-nav#navigation-links). + - Для добавления ссылки «Редактировать эту страницу» используйте функцию [Ссылка для редактирования](../reference/default-theme-edit-link). +- Опция `lastUpdated` теперь разделена на `config.lastUpdated` и `themeConfig.lastUpdatedText`. +- Опция `carbonAds.carbon` заменена на `carbonAds.code`. + +## Конфигурация метаданных + +- Опция `home: true` заменена на `layout: home`. Кроме того, многие настройки, связанные с главной страницей, были изменены для обеспечения дополнительных возможностей. Подробности см. в разделе [Главная страница](../reference/default-theme-home-page). +- Опция `footer` перенесена в [`themeConfig.footer`](../reference/default-theme-config#footer). diff --git a/docs/ru/guide/migration-from-vuepress.md b/docs/ru/guide/migration-from-vuepress.md new file mode 100644 index 00000000..d5158220 --- /dev/null +++ b/docs/ru/guide/migration-from-vuepress.md @@ -0,0 +1,30 @@ +# Переход с VuePress + +## Конфигурация + +### Сайдбар + +Боковая панель больше не заполняется автоматически из метаданных. Вы можете [самостоятельно прочитать вступление](https://github.com/vuejs/vitepress/issues/572#issuecomment-1170116225), чтобы научиться динамически заполнять боковую панель. [Дополнительные утилиты для этого](https://github.com/vuejs/vitepress/issues/96) могут быть предоставлены в будущем. + +## Markdown + +### Изображения + +В отличие от VuePress, VitePress автоматически обрабатывает опцию [`base`](./asset-handling#base-url) вашего конфига, когда вы используете статическое изображение. + +Таким образом, теперь вы можете выводить изображения без тега `img`. + +```diff +- foo ++ ![foo](/foo.png) +``` + +::: warning Предупреждение +Для динамических изображений вам всё ещё нужно использовать `withBase`, как показано в [Руководстве по базовому URL](./asset-handling#base-url). +::: + +Используйте регулярное выражение `` для поиска всех изображений с синтаксисом `![](...)` и замены на `![$2]($1)`. + +--- + +продолжение следует... diff --git a/docs/ru/guide/mpa-mode.md b/docs/ru/guide/mpa-mode.md new file mode 100644 index 00000000..81843708 --- /dev/null +++ b/docs/ru/guide/mpa-mode.md @@ -0,0 +1,23 @@ +# Режим MPA {#mpa-mode} + +Режим MPA (Multi-Page Application — «Многостраничное приложение») можно включить через командную строку с помощью команды `vitepress build --mpa`, или через конфигурацию с помощью опции `mpa: true`. + +В режиме MPA все страницы по умолчанию отображаются без включенного JavaScript. В результате производственный сайт, скорее всего, получит более высокую оценку эффективности первых посещений с помощью инструментов аудита. + +Однако из-за отсутствия навигации SPA межстраничные ссылки будут приводить к полной перезагрузке страницы. После загрузки навигация в режиме MPA будет не такой мгновенной, как в режиме SPA. + +Также обратите внимание, что «no-JS-by-default» («без JS по умолчанию») означает, что вы используете Vue исключительно как серверный язык шаблонов. Никаких обработчиков событий в браузере не будет, поэтому интерактивности не будет. Чтобы загрузить JavaScript со стороны клиента, вам нужно использовать специальный тег ` + +# Привет +``` + +` +``` + +### Рендеринг необработанного содержимого {#rendering-raw-content} + +Параметры, передаваемые странице, будут сериализованы в полезной нагрузке клиентского JavaScript, поэтому вам следует избегать передачи в параметрах больших объемов данных, например, необработанного Markdown или HTML-контента, полученного из удаленной CMS. + +Вместо этого вы можете передавать такое содержимое на каждую страницу с помощью свойства `content` каждого объекта path: + +```js +export default { + async paths() { + const posts = await (await fetch('https://my-cms.com/blog-posts')).json() + + return posts.map((post) => { + return { + params: { id: post.id }, + content: post.content // необработанный Markdown или HTML + } + }) + } +} +``` + +Затем используйте следующий специальный синтаксис, чтобы отобразить содержимое как часть самого файла Markdown: + +```md + +``` diff --git a/docs/ru/guide/sitemap-generation.md b/docs/ru/guide/sitemap-generation.md new file mode 100644 index 00000000..da79a5be --- /dev/null +++ b/docs/ru/guide/sitemap-generation.md @@ -0,0 +1,53 @@ +# Генерация карты сайта {#sitemap-generation} + +VitePress поставляется с готовой поддержкой генерации файла `sitemap.xml` для вашего сайта. Чтобы включить её, добавьте следующее в файл `.vitepress/config.js`: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + sitemap: { + hostname: 'https://example.com' + } +}) +``` + +Чтобы теги `` присутствовали в вашем файле `sitemap.xml`, вы можете включить опцию [`lastUpdated`](../reference/default-theme-last-updated). + +## Параметры {#options} + +Поддержка карты сайта осуществляется с помощью модуля [`sitemap`](https://www.npmjs.com/package/sitemap). Вы можете передать любые поддерживаемые им параметры в опцию `sitemap` в вашем конфигурационном файле. Они будут переданы непосредственно в конструктор `SitemapStream`. Более подробную информацию см. в документации [`sitemap`](https://www.npmjs.com/package/sitemap#options-you-can-pass). Пример: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + sitemap: { + hostname: 'https://example.com', + lastmodDateOnly: false + } +}) +``` + +## Хук `transformItems` {#transformitems-hook} + +Вы можете использовать хук `sitemap.transformItems` для изменения элементов карты сайта перед их записью в файл `sitemap.xml`. Этот хук вызывается с массивом элементов sitemap и ожидает возвращения массива элементов sitemap. Пример: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + sitemap: { + hostname: 'https://example.com', + transformItems: (items) => { + // добавляем новые элементы или изменяем/фильтруем существующие + items.push({ + url: '/extra-page', + changefreq: 'monthly', + priority: 0.8 + }) + return items + } + } +}) +``` diff --git a/docs/ru/guide/ssr-compat.md b/docs/ru/guide/ssr-compat.md new file mode 100644 index 00000000..fd8c6ae8 --- /dev/null +++ b/docs/ru/guide/ssr-compat.md @@ -0,0 +1,137 @@ +--- +outline: deep +--- + +# Совместимость с SSR {#ssr-compatibility} + +VitePress предварительно рендерит приложение в Node.js во время производственной сборки, используя возможности Vue по рендерингу на стороне сервера (SSR). Это означает, что весь пользовательский код в компонентах темы подлежит проверке на совместимость с SSR. + +Глава [Рендеринг на стороне сервера](https://ru.vuejs.org/guide/scaling-up/ssr.html) в документации Vue содержит более подробную информацию о том, что такое SSR, взаимосвязь между SSR и SSG, а также общие указания по написанию кода, дружественного к SSR. Правило заключается в том, чтобы обращаться к API браузера / DOM только в хуках `beforeMount` или `mounted` компонентов Vue. + +## `` {#clientonly} + +Если вы используете или демонстрируете компоненты, которые не являются SSR-дружественными (например, содержат пользовательские директивы), вы можете обернуть их внутри встроенного компонента ``: + +```md + + + +``` + +## Библиотеки, обращающиеся к API браузера при импорте {#libraries-that-access-browser-api-on-import} + +Некоторые компоненты или библиотеки получают доступ к API браузера **при импорте**. Чтобы использовать код, предполагающий наличие среды браузера при импорте, необходимо динамически импортировать их. + +### Импорт в хуке `onMounted` {#importing-in-mounted-hook} + +```vue + +``` + +### Условный импорт {#conditional-import} + +Вы также можете условно импортировать зависимость с помощью флага `import.meta.env.SSR` (часть [env-переменных Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)): + +```js +if (!import.meta.env.SSR) { + import('./lib-that-access-window-on-import').then((module) => { + // используем код + }) +} +``` + +Поскольку [`Theme.enhanceApp`](./custom-theme#theme-interface) может быть асинхронным, вы можете условно импортировать и регистрировать плагины Vue, которые получают доступ к API браузера при импорте: + +```js +// .vitepress/theme/index.js +/** @type {import('vitepress').Theme} */ +export default { + // ... + async enhanceApp({ app }) { + if (!import.meta.env.SSR) { + const plugin = await import('plugin-that-access-window-on-import') + app.use(plugin.default) + } + } +} +``` + +Если вы используете TypeScript: + +```ts +// .vitepress/theme/index.ts +import type { Theme } from 'vitepress' + +export default { + // ... + async enhanceApp({ app }) { + if (!import.meta.env.SSR) { + const plugin = await import('plugin-that-access-window-on-import') + app.use(plugin.default) + } + } +} satisfies Theme +``` + +### `defineClientComponent` {#defineclientcomponent} + +VitePress предоставляет удобный помощник для импорта компонентов Vue, которые получают доступ к API браузера при импорте. + +```vue + + + +``` + +Вы также можете передавать параметры/дочерние элементы/слоты целевому компоненту: + +```vue + + + +``` + +Целевой компонент будет импортирован только в смонтированный хук компонента-обёртки. diff --git a/docs/ru/guide/using-vue.md b/docs/ru/guide/using-vue.md new file mode 100644 index 00000000..25467be7 --- /dev/null +++ b/docs/ru/guide/using-vue.md @@ -0,0 +1,253 @@ +# Использование Vue в Markdown {#using-vue-in-markdown} + +В VitePress каждый Markdown-файл компилируется в HTML, а затем обрабатывается как [однофайловый компонент Vue](https://ru.vuejs.org/guide/scaling-up/sfc.html). Это означает, что вы можете использовать любые возможности Vue внутри Markdown, включая динамический шаблонизатор, использование компонентов Vue или произвольную логику компонентов Vue на странице, добавив тег ` + +## Содержание в формате Markdown. Счётчик: {{ count }} + + + + +``` + +::: warning Избегайте ` +``` + +## Использование телепортов {#using-teleports} + +В настоящее время Vitepress поддерживает SSG только для телепортов к элементу `body`. Для других целей вы можете обернуть их внутри встроенного компонента `` или внедрить разметку телепортации в нужное место HTML конечной страницы через [хук `postRender`](../reference/site-config#postrender). + + + +::: details Исходный код +<<< @/ru/components/ModalDemo.vue +::: + +```md + + +
+ // ... +
+
+
+``` + + + + diff --git a/docs/ru/guide/what-is-vitepress.md b/docs/ru/guide/what-is-vitepress.md new file mode 100644 index 00000000..1bcc3e18 --- /dev/null +++ b/docs/ru/guide/what-is-vitepress.md @@ -0,0 +1,57 @@ +# Что такое VitePress? {#what-is-vitepress} + +VitePress — это [Генератор статических сайтов](https://en.wikipedia.org/wiki/Static_site_generator) (ГСС), предназначенный для быстрого создания сайтов, ориентированных на контент. В двух словах, VitePress берёт ваш исходный контент, написанный в [Markdown](https://ru.wikipedia.org/wiki/Markdown), применяет к нему тему и генерирует статические HTML-страницы, которые можно легко развернуть в любом месте. + +
+ +Хотите попробовать прямо сейчас? Перейдите к главе [Первые шаги](./getting-started). + +
+ +## Примеры использования {#use-cases} + +- **Документация** + + VitePress поставляется с темой по умолчанию, предназначенной для технической документации. Она содержит эту страницу, которую вы сейчас читаете, а также документацию по [Vite](https://vitejs.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) и [многое другое](https://www.vuetelescope.com/explore?framework.slug=vitepress). + + [Официальная документация Vue.js](https://vuejs.org/) также основана на VitePress, но использует пользовательскую тему, разделяемую между несколькими переводами. + +- **Блоги, портфолио и маркетинговые сайты** + + VitePress поддерживает [полностью кастомизированные темы](./custom-theme), при этом разработчики могут использовать стандартное приложение Vite + Vue. То, что он построен на базе Vite, также означает, что вы можете напрямую использовать плагины Vite из его богатой экосистемы. Кроме того, VitePress предоставляет гибкие API для [загрузки данных](./data-loading) (локальной или удаленной) и [динамической генерации маршрутов](./routing#dynamic-routes). С его помощью можно построить практически всё, что угодно, если данные могут быть определены во время сборки. + + Официальный [блог Vue.js](https://blog.vuejs.org/) — это простой блог, который генерирует свою индексную страницу на основе локального контента. + +## Опыт разработчика {#developer-experience} + +VitePress стремится обеспечить отличные возможности для разработчиков при работе с содержимым в формате Markdown. + +- **[На базе Vite:](https://vitejs.dev/)** мгновенный запуск сервера, правки всегда отражаются мгновенно (<100 мс) без перезагрузки страницы. + +- **[Встроенные расширения Markdown:](./markdown)** Frontmatter, таблицы, подсветка синтаксиса... называйте как хотите. В частности, VitePress предоставляет множество расширенных возможностей для работы с блоками кода, что делает его идеальным для создания технической документации. + +- **[Markdown с возможностями Vue:](./using-vue)** каждая Markdown-страница также является [однофайловым компонентом](https://ru.vuejs.org/guide/scaling-up/sfc.html) Vue, благодаря 100% синтаксической совместимости шаблона Vue с HTML. Вы можете внедрить интерактивность в статический контент, используя шаблонизаторы Vue или импортированные компоненты Vue. + +## Производительность {#performance} + +В отличие от многих традиционных ГСС, где каждая навигация приводит к полной перезагрузке страницы, сайт, созданный VitePress, обслуживает статический HTML при первом посещении, но становится [Одностраничным приложением](https://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5) (SPA) для последующей навигации по сайту. Эта модель, на наш взгляд, обеспечивает оптимальный баланс производительности: + +- **Быстрая начальная загрузка** + + При первом посещении любой страницы будет использоваться статичный, предварительно отрендеренный HTML для быстрой загрузки и оптимального SEO. Затем на страницу загружается пакет JavaScript, который превращает страницу в Vue SPA («гидратация»). Вопреки распространённому мнению о медленной гидратации SPA, этот процесс на самом деле чрезвычайно быстр благодаря высокой производительности Vue 3 и оптимизациям компилятора. По данным [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F), типичные сайты VitePress достигают почти идеальных показателей производительности даже на мобильных устройствах с низкой скоростью передачи данных. + +- **Быстрая навигация после загрузки** + + Что ещё более важно, модель SPA приводит к улучшению пользовательского опыта **после** первоначальной загрузки. Последующая навигация по сайту больше не будет приводить к полной перезагрузке страницы. Вместо этого содержимое входящей страницы будет получено и динамически обновлено. VitePress также автоматически выполняет предварительную выборку фрагментов страницы для ссылок, которые находятся в пределах области просмотра. В большинстве случаев навигация после загрузки будет ощущаться мгновенно. + +- **Интерактивность без штрафов** + + Для того чтобы динамические части Vue, встроенные в статический Markdown, могли работать в режиме гидратации, каждая страница Markdown обрабатывается как компонент Vue и компилируется в JavaScript. Это может показаться неэффективным, но компилятор Vue достаточно умён, чтобы разделить статическую и динамическую части, минимизируя как стоимость гидратации, так и размер полезной нагрузки. При первоначальной загрузке страницы статические части автоматически исключаются из полезной нагрузки JavaScript и пропускаются во время гидратации. + +## Что насчёт VuePress? {#what-about-vuepress} + +VitePress — это духовный наследник VuePress. Оригинальный VuePress был основан на Vue 2 и webpack. Благодаря Vue 3 и Vite под капотом, VitePress обеспечивает значительно лучший опыт разработки, лучшую производительность, более отточенную тему по умолчанию и более гибкий API для настройки. + +Разница в API между VitePress и VuePress заключается в основном в тематическом оформлении и настройке. Если вы используете VuePress 1 с темой по умолчанию, то переход на VitePress будет относительно простым. + +Также были приложены усилия для создания VuePress 2, который также поддерживает Vue 3 и Vite с большей совместимостью с VuePress 1. Однако поддерживать два генератора параллельно не представляется возможным, поэтому команда Vue решила сосредоточиться на VitePress как основном рекомендуемом генераторе статических сайтов в долгосрочной перспективе. diff --git a/docs/ru/index.md b/docs/ru/index.md new file mode 100644 index 00000000..5d2e52e5 --- /dev/null +++ b/docs/ru/index.md @@ -0,0 +1,60 @@ +--- +layout: home + +title: VitePress +titleTemplate: Генератор статических сайтов на основе Vite и Vue + +hero: + name: VitePress + text: Генератор статических сайтов на основе Vite и Vue + tagline: Из Markdown в красивую документацию за считанные минуты + actions: + - theme: brand + text: Что такое VitePress? + link: /ru/guide/what-is-vitepress + - theme: alt + text: Первые шаги + link: /ru/guide/getting-started + - theme: alt + text: GitHub + link: https://github.com/vuejs/vitepress + image: + src: /vitepress-logo-large.webp + alt: VitePress + +features: + - icon: 📝 + title: Сосредоточьтесь на своем контенте + details: Легко создавайте красивые сайты с документацией, используя только Markdown. + - icon: + title: Наслаждайтесь опытом разработчиков Vite + details: Мгновенный запуск сервера, молниеносные горячие обновления и использование плагинов экосистемы Vite. + - icon: + title: Настройка с помощью Vue + details: Используйте синтаксис Vue и компоненты прямо в Markdown или создавайте собственные темы с помощью Vue. + - icon: 🚀 + title: Быстрый запуск веб-сайтов + details: Быстрая начальная загрузка с помощью статического HTML, быстрая навигация после загрузки с помощью маршрутизации на стороне клиента. +--- + + diff --git a/docs/ru/reference/cli.md b/docs/ru/reference/cli.md new file mode 100644 index 00000000..93954da2 --- /dev/null +++ b/docs/ru/reference/cli.md @@ -0,0 +1,74 @@ +# Интерфейс командной строки {#command-line-interface} + +## `vitepress dev` {#vitepress-dev} + +Запуск сервера разработки VitePress, с использованием указанного каталога в качестве корневого. По умолчанию используется текущий каталог. Команду `dev` также можно опустить при работе в текущем каталоге. + +### Использование {#usage} + +```sh +# запуск в текущем каталоге, опускаем `dev` +vitepress + +# запуск в подкаталоге +vitepress dev [root] +``` + +### Параметры {#options} + +| Параметр | Описание | +| --------------- | ------------------------------------------------------------------------------ | +| `--open [path]` | Открытие браузера при запуске (`boolean \| string`) | +| `--port ` | Номер порта (`number`) | +| `--base ` | Публичный базовый путь (по умолчанию: `/`) (`string`) | +| `--cors` | Включить CORS | +| `--strictPort` | Выйти, если указанный порт уже используется (`boolean`) | +| `--force` | Заставить оптимизатор игнорировать кэш и повторно объединять файлы (`boolean`) | + +## `vitepress build` {#vitepress-build} + +Создание производственной сборки текущего сайта VitePress. + +### Использование {#usage-1} + +```sh +vitepress build [root] +``` + +### Параметры {#options-1} + +| Параметр | Описание | +| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | +| `--mpa` (экспериментально) | Сборка в режиме [MPA](../guide/mpa-mode) без гидратации на стороне клиента (`boolean`) | +| `--base ` | Публичный базовый путь (по умолчанию: `/`) (`string`) | +| `--target ` | Транспилировать цель (по умолчанию: `"modules"`) (`string`) | +| `--outDir ` | Выходной каталог относительно **cwd** (по умолчанию: `/.vitepress/dist`) (`string`) | +| `--minify [minifier]` | Включить/выключить минификацию или задать используемый минификатор (по умолчанию: `"esbuild"`) (`boolean \| "terser" \| "esbuild"`) | +| `--assetsInlineLimit ` | Статический встроенный порог ресурса base64 в байтах (по умолчанию: `4096`) (`number`) | + +## `vitepress preview` {#vitepress-preview} + +Локальный предварительный просмотр производственной сборки. + +### Использование {#usage-2} + +```sh +vitepress preview [root] +``` + +### Параметры {#options-2} + +| Параметр | Описание | +| --------------- | ----------------------------------------------------- | +| `--base ` | Публичный базовый путь (по умолчанию: `/`) (`string`) | +| `--port ` | Номер порта (`number`) | + +## `vitepress init` {#vitepress-init} + +Запуск [Мастера настройки](../guide/getting-started#setup-wizard) в текущем каталоге. + +### Использование {#usage-3} + +```sh +vitepress init +``` diff --git a/docs/ru/reference/default-theme-badge.md b/docs/ru/reference/default-theme-badge.md new file mode 100644 index 00000000..fc546436 --- /dev/null +++ b/docs/ru/reference/default-theme-badge.md @@ -0,0 +1,72 @@ +# Значки {#badge} + +С помощью значков удобно добавлять статус к заголовкам. Например, может быть полезно указать тип раздела или поддерживаемую версию. + +## Использование {#usage} + +Вы можете использовать компонент `Badge`, который доступен глобально. + +```html +### Заголовок ### Заголовок + ### Заголовок + ### Заголовок + +``` + +Приведённый выше код даёт такой результат: + +### Заголовок {#title} + +### Заголовок {#title-1} + +### Заголовок {#title-2} + +### Заголовок {#title-3} + +## Дочерние элементы {#custom-children} + +`` принимает параметр `children`, который будет отображаться внутри значка. + +```html +### Заголовок вложенный элемент +``` + +### Заголовок вложенный элемент + +## Настройка стиля значков {#customize-type-color} + +Вы можете настроить стиль значков, переопределив переменные CSS. Ниже приведены значения по умолчанию: + +```css +:root { + --vp-badge-info-border: transparent; + --vp-badge-info-text: var(--vp-c-text-2); + --vp-badge-info-bg: var(--vp-c-default-soft); + + --vp-badge-tip-border: transparent; + --vp-badge-tip-text: var(--vp-c-brand-1); + --vp-badge-tip-bg: var(--vp-c-brand-soft); + + --vp-badge-warning-border: transparent; + --vp-badge-warning-text: var(--vp-c-warning-1); + --vp-badge-warning-bg: var(--vp-c-warning-soft); + + --vp-badge-danger-border: transparent; + --vp-badge-danger-text: var(--vp-c-danger-1); + --vp-badge-danger-bg: var(--vp-c-danger-soft); +} +``` + +## `` {#badge-1} + +Компонент `` принимает следующие параметры: + +```ts +interface Props { + // Когда передается ``, это значение игнорируется. + text?: string + + // По умолчанию: `tip`. + type?: 'info' | 'tip' | 'warning' | 'danger' +} +``` diff --git a/docs/ru/reference/default-theme-carbon-ads.md b/docs/ru/reference/default-theme-carbon-ads.md new file mode 100644 index 00000000..457b92b1 --- /dev/null +++ b/docs/ru/reference/default-theme-carbon-ads.md @@ -0,0 +1,22 @@ +# Carbon Ads {#carbon-ads} + +В VitePress встроена встроенная поддержка [Carbon Ads](https://www.carbonads.net/). Определив в конфиге учётные данные Carbon Ads, VitePress будет отображать рекламу на странице. + +```js +export default { + themeConfig: { + carbonAds: { + code: 'код-рекламы', + placement: 'место-размещения-рекламы' + } + } +} +``` + +Эти значения используются для вызова сценария carbon CDN, как показано ниже: + +```js +;`//cdn.carbonads.com/carbon.js?serve=${code}&placement=${placement}` +``` + +Чтобы узнать больше о конфигурации Carbon Ads, посетите [веб-сайт Carbon Ads](https://www.carbonads.net/). diff --git a/docs/ru/reference/default-theme-config.md b/docs/ru/reference/default-theme-config.md new file mode 100644 index 00000000..265d17f1 --- /dev/null +++ b/docs/ru/reference/default-theme-config.md @@ -0,0 +1,452 @@ +# Настройка темы по умолчанию {#default-theme-config} + +Конфигурация темы позволяет настроить её под себя. Вы можете настроить тему с помощью опции `themeConfig` в файле конфигурации: + +```ts +export default { + lang: 'ru-RU', + title: 'VitePress', + description: 'Генератор статического сайта на базе Vite и Vue.', + + // Конфигурации, связанные с темой. + themeConfig: { + logo: '/logo.svg', + nav: [...], + sidebar: { ... } + } +} +``` + +**Параметры, описанные на этой странице, применимы только к теме по умолчанию.** Разные темы предполагают разные конфигурации темы. При использовании пользовательской темы объект конфигурации темы будет передан теме, чтобы она могла определить условное поведение на его основе. + +## i18nRouting {#i18nrouting} + +- Тип: `boolean` + +При смене локали на `ru` URL изменится с `/foo` (или `/en/foo/`) на `/ru/foo`. Вы можете отключить это поведение, установив для параметра `themeConfig.i18nRouting` значение `false`. + +## logo {#logo} + +- Тип: `ThemeableImage` + +Файл логотипа для отображения в навигационной панели, прямо перед заголовком сайта. Принимает строку пути или объект, чтобы установить другой логотип для светлого/тёмного режима. + +```ts +export default { + themeConfig: { + logo: '/logo.svg' + } +} +``` + +```ts +type ThemeableImage = + | string + | { src: string; alt?: string } + | { light: string; dark: string; alt?: string } +``` + +## siteTitle {#sitetitle} + +- Тип: `string | false` + +Вы можете настроить этот элемент для замены стандартного заголовка сайта (`title` в конфигурации приложения) в nav. При установке значения `false` заголовок в панели навигации будет отключен. Пригодится, если у вас есть `logo`, который уже содержит текст названия сайта. + +```ts +export default { + themeConfig: { + siteTitle: 'Привет, мир' + } +} +``` + +## nav {#nav} + +- Тип: `NavItem` + +Конфигурация для пункта навигационного меню. Подробнее в главе [Тема по умолчанию: Навигация](./default-theme-nav#navigation-links). + +```ts +export default { + themeConfig: { + nav: [ + { text: 'Руководство', link: '/guide' }, + { + text: 'Выпадающее меню', + items: [ + { text: 'Пункт A', link: '/item-1' }, + { text: 'Пункт B', link: '/item-2' }, + { text: 'Пункт C', link: '/item-3' } + ] + } + ] + } +} +``` + +```ts +type NavItem = NavItemWithLink | NavItemWithChildren + +interface NavItemWithLink { + text: string + link: string + activeMatch?: string + target?: string + rel?: string + noIcon?: boolean +} + +interface NavItemChildren { + text?: string + items: NavItemWithLink[] +} + +interface NavItemWithChildren { + text?: string + items: (NavItemChildren | NavItemWithLink)[] + activeMatch?: string +} +``` + +## sidebar {#sidebar} + +- Тип: `Sidebar` + +Конфигурация для пунктов меню боковой панели. Подробнее в главе [Тема по умолчанию: Сайдбар](./default-theme-sidebar). + +```ts +export default { + themeConfig: { + sidebar: [ + { + text: 'Руководство', + items: [ + { text: 'Введение', link: '/introduction' }, + { text: 'Первые шаги', link: '/getting-started' }, + ... + ] + } + ] + } +} +``` + +```ts +export type Sidebar = SidebarItem[] | SidebarMulti + +export interface SidebarMulti { + [path: string]: SidebarItem[] +} + +export type SidebarItem = { + /** + * Текстовая метка элемента + */ + text?: string + + /** + * Ссылка на элемент + */ + link?: string + + /** + * Потомки элемента + */ + items?: SidebarItem[] + + /** + * Если не указано, группа не будет сворачиваться + * + * Если `true`, то группа будет сворачиваться и разворачиваться по умолчанию + * + * Если `false`, группа сворачивается, но по умолчанию разворачивается + */ + collapsed?: boolean +} +``` + +## aside {#aside} + +- Тип: `boolean | 'left'` +- По умолчанию: `true` +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#aside) + +Установка этого значения в `false` предотвращает отрисовку контейнера сайдбара.\ +Установка этого значения в `true` приведёт к отображению сайдбара справа.\ +Установка этого значения в `left` приведёт к отображению сайдбара слева. + +Если вы хотите отключить его для всех режимов просмотра, используйте `aside: false`. + +## outline {#outline} + +- Тип: `Outline | Outline['level'] | false` +- Уровень можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#outline) + +Установка этого значения в `false` предотвращает отрисовку оглавления. Для получения более подробной информации обратитесь к этому интерфейсу: + +```ts +interface Outline { + /** + * Уровни заголовков, которые будут отображаться в оглавлении. + * Одиночное число означает, что будут отображаться только заголовки этого уровня. + * Если передается кортеж, то первое число — это минимальный уровень, а второе — максимальный. + * `'deep'` то же самое, что `[2, 6]`, что означает, что будут отображены все заголовки от `

` до `

`. + * + * @default 2 + */ + level?: number | [number, number] | 'deep' + + /** + * Заголовок, который будет отображаться в оглавлении. + * + * @default 'На этой странице' + */ + label?: string +} +``` + +## socialLinks {#sociallinks} + +- Тип: `SocialLink[]` + +Вы можете задать эту опцию, чтобы показывать ссылки на ваши социальные аккаунты с помощью иконок в панели навигации. + +```ts +export default { + themeConfig: { + socialLinks: [ + { icon: 'github', link: 'https://github.com/vuejs/vitepress' }, + { icon: 'twitter', link: '...' }, + // Вы также можете добавить пользовательские иконки, передав SVG в виде строки: + { + icon: { + svg: 'Dribbble' + }, + link: '...', + // Вы также можете включить пользовательский ярлык для доступности (необязательно, но рекомендуется): + ariaLabel: 'классная ссылка' + } + ] + } +} +``` + +```ts +interface SocialLink { + icon: SocialLinkIcon + link: string + ariaLabel?: string +} + +type SocialLinkIcon = + | 'discord' + | 'facebook' + | 'github' + | 'instagram' + | 'linkedin' + | 'mastodon' + | 'npm' + | 'slack' + | 'twitter' + | 'x' + | 'youtube' + | { svg: string } +``` + +## footer {#footer} + +- Тип: `Footer` +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#footer) + +Настройка подвала. Вы можете разместить в подвале сообщение или текст об авторских правах, однако он будет отображаться только в том случае, если страница не содержит боковой панели. Это объясняется соображениями дизайна. + +```ts +export default { + themeConfig: { + footer: { + message: 'Опубликовано под лицензией MIT.', + copyright: '© 2019 – настоящее время, Эван Ю' + } + } +} +``` + +```ts +export interface Footer { + message?: string + copyright?: string +} +``` + +## editLink {#editlink} + +- Тип: `EditLink` +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#editlink) + +Ссылка для редактирования позволяет отобразить ссылку для редактирования страницы на сервисах управления Git, таких как GitHub или GitLab. См. секцию [Тема по умолчанию: Ссылка для редактирования](./default-theme-edit-link) для получения более подробной информации. + +```ts +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', + text: 'Редактировать эту страницу на GitHub' + } + } +} +``` + +```ts +export interface EditLink { + pattern: string + text?: string +} +``` + +## lastUpdated {#lastupdated} + +- Тип: `LastUpdatedOptions` + +Позволяет настраивать текст и формат даты последнего обновления. + +```ts +export default { + themeConfig: { + lastUpdated: { + text: 'Обновлено', + formatOptions: { + dateStyle: 'full', + timeStyle: 'medium' + } + } + } +} +``` + +```ts +export interface LastUpdatedOptions { + /** + * @default 'Last updated' + */ + text?: string + + /** + * @default + * { dateStyle: 'short', timeStyle: 'short' } + */ + formatOptions?: Intl.DateTimeFormatOptions & { forceLocale?: boolean } +} +``` + +## algolia {#algolia} + +- Тип: `AlgoliaSearch` + +Опция для поддержки поиска на вашем сайте документации с помощью [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Подробнее в главе [Тема по умолчанию: Поиск](./default-theme-search) + +```ts +export interface AlgoliaSearchOptions extends DocSearchProps { + locales?: Record> +} +``` + +Посмотреть все доступные опции можно [здесь](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts). + +## carbonAds {#carbon-ads} + +- Тип: `CarbonAdsOptions` + +Возможность отображения [Carbon Ads](https://www.carbonads.net/). + +```ts +export default { + themeConfig: { + carbonAds: { + code: 'код-рекламы', + placement: 'место-размещения-рекламы' + } + } +} +``` + +```ts +export interface CarbonAdsOptions { + code: string + placement: string +} +``` + +Подробнее в главе [Тема по умолчанию: Carbon Ads](./default-theme-carbon-ads) + +## docFooter {#docfooter} + +- Тип: `DocFooter` + +Можно использовать для настройки текста, отображаемого над ссылками на предыдущую и следующую страницы. Полезно, если вы не пишете документы только на английском языке. Также можно использовать для глобального отключения подобных ссылок. Если вы хотите выборочно включить/выключить эти ссылки на отдельной странице, воспользуйтесь [метаданными](./default-theme-prev-next-links). + +```ts +export default { + themeConfig: { + docFooter: { + prev: 'Предыдущая страница', + next: 'Следующая страница' + } + } +} +``` + +```ts +export interface DocFooter { + prev?: string | false + next?: string | false +} +``` + +## darkModeSwitchLabel {#darkmodeswitchlabel} + +- Тип: `string` +- По умолчанию: `Appearance` + +Можно использовать для настройки надписи переключателя тёмного режима. Этот ярлык отображается только в мобильном представлении. + +## lightModeSwitchTitle {#lightmodeswitchtitle} + +- Тип: `string` +- По умолчанию: `Switch to light theme` + +Может использоваться для настройки заголовка переключателя светлого режима, который появляется при наведении курсора. + +## darkModeSwitchTitle {#darkmodeswitchtitle} + +- Тип: `string` +- По умолчанию: `Switch to dark theme` + +Можно использовать для настройки заголовка переключателя тёмного режима, который появляется при наведении курсора. + +## sidebarMenuLabel {#sidebarmenulabel} + +- Тип: `string` +- По умолчанию: `Menu` + +Может использоваться для настройки метки бокового меню. Эта метка отображается только в мобильном представлении. + +## returnToTopLabel {#returntotoplabel} + +- Тип: `string` +- По умолчанию: `Return to top` + +Может использоваться для настройки метки кнопки возврата наверх. Эта метка отображается только в мобильном представлении. + +## langMenuLabel {#langmenulabel} + +- Тип: `string` +- По умолчанию: `Change language` + +Можно использовать для настройки aria-метки кнопки переключения языка в панели навигации. Это используется только в том случае, если вы используете [i18n](../guide/i18n). + +## externalLinkIcon {#externallinkicon} + +- Тип: `boolean` +- По умолчанию: `false` + +Отображать ли значок внешней ссылки рядом с внешними ссылками в Markdown. diff --git a/docs/ru/reference/default-theme-edit-link.md b/docs/ru/reference/default-theme-edit-link.md new file mode 100644 index 00000000..a2cd6b00 --- /dev/null +++ b/docs/ru/reference/default-theme-edit-link.md @@ -0,0 +1,60 @@ +# Ссылка для редактирования {#edit-link} + +## Настройка в файле конфигурации {#site-level-config} + +Ссылка на редактирование позволяет отобразить ссылку для редактирования страницы на сервисах управления Git, таких как GitHub или GitLab. Чтобы включить её, добавьте опции `themeConfig.editLink` в свой конфиг: + +```js +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path' + } + } +} +``` + +Параметр `pattern` задает структуру URL для ссылки, а `:path` будет заменён на путь к странице. + +Вы также можете поместить чистую функцию, которая принимает [`PageData`](./runtime-api#usedata) в качестве аргумента и возвращает строку URL. + +```js +export default { + themeConfig: { + editLink: { + pattern: ({ filePath }) => { + if (filePath.startsWith('packages/')) { + return `https://github.com/acme/monorepo/edit/main/${filePath}` + } else { + return `https://github.com/acme/monorepo/edit/main/docs/${filePath}` + } + } + } + } +} +``` + +Она не должна иметь побочных эффектов или доступа к чему-либо за пределами своей области, поскольку будет сериализована и выполнена в браузере. + +По умолчанию это добавит текст ссылки «Редактировать страницу» в нижней части документа. Вы можете настроить этот текст, определив опцию `text`. + +```js +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', + text: 'Редактировать эту страницу на GitHub' + } + } +} +``` + +## Настройка в метаданных {#frontmatter-config} + +Эту ссылку можно отключить на конкретной странице с помощью опции `editLink` в метаданных: + +```yaml +--- +editLink: false +--- +``` diff --git a/docs/ru/reference/default-theme-footer.md b/docs/ru/reference/default-theme-footer.md new file mode 100644 index 00000000..9481996e --- /dev/null +++ b/docs/ru/reference/default-theme-footer.md @@ -0,0 +1,55 @@ +# Подвал {#footer} + +VitePress будет отображать блок подвала внизу страницы, если присутствует объект `themeConfig.footer`. + +```ts +export default { + themeConfig: { + footer: { + message: 'Опубликовано под лицензией MIT.', + copyright: '© 2019 – настоящее время, Эван Ю' + } + } +} +``` + +```ts +export interface Footer { + // Сообщение, отображаемое прямо перед копирайтом. + message?: string + + // Уведомление об авторских правах. + copyright?: string +} +``` + +Приведённая выше конфигурация также поддерживает строки HTML. Так, например, если вы хотите разместить в подвале несколько ссылок, можно настроить конфигурацию следующим образом: + +```ts +export default { + themeConfig: { + footer: { + message: + 'Опубликовано под лицензией MIT.', + copyright: + '© 2019 – настоящее время, Эван Ю' + } + } +} +``` + +::: warning Предупреждение +В `message` и `copyright` можно использовать только встроенные элементы, поскольку они отображаются внутри элемента `

`. Если вы хотите добавить блочные элементы, рассмотрите возможность использования слота [`layout-bottom`](../guide/extending-default-theme#layout-slots). +::: + +Обратите внимание, что подвал не будет отображаться, если виден [Сайдбар](./default-theme-sidebar). + +## Настройка в метаданных {#frontmatter-config} + +Отображение подвала можно отключить на конкретной странице с помощью опции `footer` в метаданных: + +```yaml +--- +footer: false +--- +``` diff --git a/docs/ru/reference/default-theme-home-page.md b/docs/ru/reference/default-theme-home-page.md new file mode 100644 index 00000000..a526496f --- /dev/null +++ b/docs/ru/reference/default-theme-home-page.md @@ -0,0 +1,196 @@ +# Главная страница {#home-page} + +Тема VitePress по умолчанию предоставляет макет главной страницы, который вы также можете увидеть на [главной странице этого сайта](../). Вы можете использовать его на любой из своих страниц, указав `layout: home` в [метаданных](./frontmatter-config) страницы. + +```yaml +--- +layout: home +--- +``` + +Однако сам по себе этот вариант мало что даст. Вы можете добавить несколько различных готовых «секций» на главную страницу, установив дополнительные опции, такие как `hero` и `features`. + +## Секция `hero` {#hero-section} + +Секция `hero` находится в верхней части главной страницы. Вот как можно её настроить: + +```yaml +--- +layout: home + +hero: + name: VitePress + text: Генератор статических сайтов на основе Vite и Vue. + tagline: Lorem ipsum... + image: + src: /logo.png + alt: VitePress + actions: + - theme: brand + text: Начать + link: /guide/what-is-vitepress + - theme: alt + text: Посмотреть на GitHub + link: https://github.com/vuejs/vitepress +--- +``` + +```ts +interface Hero { + // Строка, отображаемая поверх `text`. Поставляется в фирменном цвете и, + // как ожидается, будет короткой — например, название продукта + name?: string + + // Основной текст секции. Будет использоваться внутри тега `h1` + text: string + + // Заголовок, отображаемый под `text` + tagline?: string + + // Изображение отображается рядом с `text` и `tagline` + image?: ThemeableImage + + // Кнопки действий для отображения в секции + actions?: HeroAction[] +} + +type ThemeableImage = + | string + | { src: string; alt?: string } + | { light: string; dark: string; alt?: string } + +interface HeroAction { + // Цветовая тема кнопки. По умолчанию принимает значение `brand`. + theme?: 'brand' | 'alt' + + // Метка кнопки. + text: string + + // Ссылка назначения кнопки. + link: string + + // Атрибут цели ссылки. + target?: string + + // Атрибут rel ссылки. + rel?: string +} +``` + +### Настройка цвета заголовка секции {#customizing-the-name-color} + +VitePress использует фирменный цвет (`--vp-c-brand-1`) для атрибута `name` в секции `hero`. Однако вы можете настроить этот цвет, переопределив переменную `--vp-home-hero-name-color`. + +```css +:root { + --vp-home-hero-name-color: blue; +} +``` + +Также вы можете настроить его ещё больше, комбинируя `--vp-home-hero-name-background`, чтобы придать `name` градиентный цвет. + +```css +:root { + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient( + 120deg, + #bd34fe, + #41d1ff + ); +} +``` + +## Секция `features` {#features-section} + +В секции `features` можно перечислить любое количество функций, которые вы хотели бы показать сразу после секции `hero`. Чтобы настроить её, передайте опцию `features` в метаданных страницы. + +Для каждой функции можно указать иконку, который может быть эмодзи или любым другим изображением. Если настраиваемая иконка представляет собой изображение (svg, png, jpeg...), вы должны предоставить ей соответствующую ширину и высоту. При необходимости можно указать описание, собственный размер, а также варианты для тёмной и светлой темы. + +```yaml +--- +layout: home + +features: + - icon: 🛠️ + title: Просто и минималистично, всегда + details: Lorem ipsum... + - icon: + src: /cool-feature-icon.svg + title: Ещё одна интересная функция + details: Lorem ipsum... + - icon: + dark: /dark-feature-icon.svg + light: /light-feature-icon.svg + title: Ещё одна интересная функция + details: Lorem ipsum... +--- +``` + +```ts +interface Feature { + // Иконка + icon?: FeatureIcon + + // Заголовок фичи + title: string + + // Описание фичи + details: string + + // Ссылка при нажатии на компонент функции. Ссылка может быть как внутренней, так и внешней. + // + // например, `guide/reference/default-theme-home-page` или `https://example.com` + link?: string + + // Текст ссылки, который будет отображаться внутри компонента функции. Лучше всего использовать с опцией `link`. + // + // например, `Узнать подробнее`, `Посетить страницу` и т. д. + linkText?: string + + // Атрибут rel для опции `link` + // + // например, `external` + rel?: string + + // Атрибут target для опции `link` + target?: string +} + +type FeatureIcon = + | string + | { src: string; alt?: string; width?: string; height: string } + | { + light: string + dark: string + alt?: string + width?: string + height: string + } +``` + +## Содержимое Markdown {#markdown-content} + +Вы можете добавить дополнительный контент на главную страницу вашего сайта, просто добавив Markdown под разделителем `---`. + +````md +--- +layout: home + +hero: + name: VitePress + text: Генератор статических сайтов на основе Vite и Vue. +--- + +## Начало работы + +Вы можете начать использовать VitePress прямо сейчас, используя `npx`! + +```sh +npm init +npx vitepress init +``` +```` + +::: info Примечание +VitePress не всегда автоматически стилизовал дополнительный контент страницы с макетом `layout: home`. Чтобы вернуться к старому поведению, добавьте `markdownStyles: false` в метаданных. +::: diff --git a/docs/ru/reference/default-theme-last-updated.md b/docs/ru/reference/default-theme-last-updated.md new file mode 100644 index 00000000..7d926dc5 --- /dev/null +++ b/docs/ru/reference/default-theme-last-updated.md @@ -0,0 +1,27 @@ +# Последнее обновление {#last-updated} + +Время последнего обновления содержимого будет отображаться в правом нижнем углу страницы. Чтобы включить его, добавьте опцию `lastUpdated` в свой конфиг. + +::: tip Совет +Чтобы увидеть обновленное время, необходимо зафиксировать файл Markdown. +::: + +## Настройка в файле конфигурации {#site-level-config} + +```js +export default { + lastUpdated: true +} +``` + +## Настройка в метаданных {#frontmatter-config} + +Эту информацию можно отключить на конкретной странице с помощью опции `lastUpdated` в метаданных: + +```yaml +--- +lastUpdated: false +--- +``` + +Также смотрите [Тема по умолчанию: `lastUpdated`](./default-theme-config#lastupdated) для получения более подробной информации. Любое истинное значение на уровне темы также включит функцию, если только она не будет явно отключена на уровне сайта или страницы. diff --git a/docs/ru/reference/default-theme-layout.md b/docs/ru/reference/default-theme-layout.md new file mode 100644 index 00000000..f02af7d5 --- /dev/null +++ b/docs/ru/reference/default-theme-layout.md @@ -0,0 +1,62 @@ +# Макет {#layout} + +Вы можете выбрать макет страницы, установив опцию `layout` в [метаданных](./frontmatter-config). Изначально есть 3 макета: `doc`, `page` и `home`. Если ничего не указано, то страница будет использовать макет `doc`. + +```yaml +--- +layout: doc +--- +``` + +## Макет `doc` {#doc-layout} + +Вариант `doc` — это макет по умолчанию, который стилизует всё содержимое Markdown в виде «документации». Он работает, оборачивая весь контент в CSS-класс `vp-doc` и применяя стили к вложенным элементам. + +Почти все общие элементы, такие как `p` или `h2`, получают специальную стилизацию. Поэтому имейте в виду, что если вы добавите какой-либо пользовательский HTML внутри Markdown-контента, то он также будет подвержен влиянию этих стилей. + +Кроме того, в нём предусмотрены специальные функции, перечисленные ниже. Эти функции включены только в данном макете. + +- Ссылка «Редактировать» +- Ссылки предыдущая/следующая +- Оглавление +- Реклама [Carbon Ads](./default-theme-carbon-ads) + +## Макет `page` {#page-layout} + +Вариант `page` сгенерирует «пустую страницу». Markdown всё равно будет разобран, и все [расширения Markdown](../guide/markdown) будут работать так же, как и с макетом `doc`, но никаких стилей по умолчанию применено не будет. + +Макет `page` позволит вам оформить всё самостоятельно, без влияния темы VitePress на разметку. Это удобно, когда вы хотите создать свою собственную страницу. + +Обратите внимание, что даже при таком раскладе сайдбар всё равно будет отображаться, если у страницы есть соответствующая конфигурация сайдбара. + +## Макет `home` {#home-layout} + +Вариант `home` сгенерирует шаблонную «домашнюю страницу». В этом макете вы можете установить дополнительные параметры, такие как `hero` и `features`, для дальнейшей настройки контента. Посетите секцию [Тема по умолчанию: Домашняя страница](./default-theme-home-page) для получения более подробной информации. + +## Без макета {#no-layout} + +Если вам не нужен макет, вы можете указать `layout: false` в метаданных. Этот параметр полезен, если вам нужна полностью настраиваемая целевая страница (по умолчанию без сайдбара, панели навигации или подвала). + +## Свой макет {#custom-layout} + +Вы также можете использовать собственный макет: + +```md +--- +layout: foo +--- +``` + +Будет выполнен поиск компонента с именем `foo`, зарегистрированного в контексте. Например, вы можете зарегистрировать свой компонент глобально в `.vitepress/theme/index.ts`: + +```ts +import DefaultTheme from 'vitepress/theme' +import Foo from './Foo.vue' + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + app.component('foo', Foo) + } +} +``` diff --git a/docs/ru/reference/default-theme-nav.md b/docs/ru/reference/default-theme-nav.md new file mode 100644 index 00000000..4448af5b --- /dev/null +++ b/docs/ru/reference/default-theme-nav.md @@ -0,0 +1,162 @@ +# Навигация {#nav} + +Ключ `nav` в конфигурации — это панель навигации, отображаемая в верхней части страницы. Она содержит заголовок сайта, ссылки глобального меню и т. д. + +## Название и логотип сайта {#site-title-and-logo} + +По умолчанию навигация отображает название сайта, ссылаясь на значение [`config.title`](./site-config#title). Если вы хотите изменить то, что отображается в панели навигации, задайте пользовательский текст в опции `themeConfig.siteTitle`. + +```js +export default { + themeConfig: { + siteTitle: 'Мой заголовок' + } +} +``` + +Если у вас есть логотип для вашего сайта, вы можете отобразить его, передав путь к изображению. Вы должны поместить логотип непосредственно в директорию `public` и указать абсолютный путь к нему. + +```js +export default { + themeConfig: { + logo: '/my-logo.svg' + } +} +``` + +При добавлении логотипа он отображается вместе с названием сайта. Если вам нужен только логотип и вы хотите скрыть текст заголовка сайта, установите `false` для параметра `SiteTitle`. + +```js +export default { + themeConfig: { + logo: '/my-logo.svg', + siteTitle: false + } +} +``` + +Вы также можете передать объект в качестве логотипа, если хотите добавить атрибут `alt` или настроить его в зависимости от тёмного/светлого режима. Подробности смотрите в [`themeConfig.logo`](./default-theme-config#logo). + +## Навигационные ссылки {#navigation-links} + +Вы можете определить опцию `themeConfig.nav`, чтобы добавить ссылки в панель навигации: + +```js +export default { + themeConfig: { + nav: [ + { text: 'Руководство', link: '/guide' }, + { text: 'Настройка', link: '/config' }, + { text: 'Изменения', link: 'https://github.com/...' } + ] + } +} +``` + +`text` — это текст, отображаемый в навигации, а `link` — это ссылка, на которую будет осуществлён переход при нажатии на текст. Для ссылки задайте путь к фактическому файлу без префикса `.md` и всегда начинайте с `/`. + +Навигационные ссылки также могут быть выпадающими меню. Для этого установите ключ `items` вместо ключа `link`: + +```js +export default { + themeConfig: { + nav: [ + { text: 'Руководство', link: '/guide' }, + { + text: 'Выпадающее меню', + items: [ + { text: 'Пункт A', link: '/item-1' }, + { text: 'Пункт B', link: '/item-2' }, + { text: 'Пункт C', link: '/item-3' } + ] + } + ] + } +} +``` + +Обратите внимание, что заголовок выпадающего меню (`Выпадающее меню` в примере выше) не может иметь свойство `link`, так как он становится кнопкой для открытия выпадающего диалога. + +Вы можете добавить «секции» в пункты выпадающего меню, передавая больше вложенных элементов: + +```js +export default { + themeConfig: { + nav: [ + { text: 'Руководство', link: '/guide' }, + { + text: 'Выпадающее меню', + items: [ + { + // Заголовок секции + text: 'Секция A', + items: [ + { text: 'Пункт A в секции A', link: '...' }, + { text: 'Пункт B в секции A', link: '...' } + ] + } + ] + }, + { + text: 'Выпадающее меню', + items: [ + { + // Заголовок можно опустить + items: [ + { text: 'Пункт A в секции A', link: '...' }, + { text: 'Пункт B в секции A', link: '...' } + ] + } + ] + } + ] + } +} +``` + +### Настройка «активного» состояния ссылки {#customize-link-s-active-state} + +Пункты меню навигации будут выделены, если текущая страница находится под соответствующим путём. Если вы хотите настроить сопоставление путей, определите свойство `activeMatch` и регулярное выражение в качестве строкового значения. + +```js +export default { + themeConfig: { + nav: [ + // Эта ссылка получает активное состояние, когда пользователь + // переходит по пути `/config/`. + { + text: 'Руководство', + link: '/guide', + activeMatch: '/config/' + } + ] + } +} +``` + +::: warning Предупреждение +Ожидается, что `activeMatch` будет регулярным выражением, но вы должны определить его как строку. Мы не можем использовать здесь реальный объект RegExp, потому что он не сериализуется во время сборки. +::: + +### Настройка атрибутов «target» и «rel» {#customize-link-s-target-and-rel-attributes} + +По умолчанию VitePress автоматически определяет атрибуты `target` и `rel` в зависимости от того, является ли ссылка внешней. Но при желании их можно настроить и вручную. + +```js +export default { + themeConfig: { + nav: [ + { + text: 'Товары', + link: 'https://www.thegithubshop.com/', + target: '_self', + rel: 'sponsored' + } + ] + } +} +``` + +## Социальные ссылки {#social-links} + +См. [`socialLinks`](./default-theme-config#sociallinks). diff --git a/docs/ru/reference/default-theme-prev-next-links.md b/docs/ru/reference/default-theme-prev-next-links.md new file mode 100644 index 00000000..e2da9501 --- /dev/null +++ b/docs/ru/reference/default-theme-prev-next-links.md @@ -0,0 +1,43 @@ +# Предыдущая и следующая страницы {#prev-next-links} + +Вы можете настроить текст и ссылку для предыдущей и следующей страниц (отображаются в нижней части страницы). Это полезно, если вы хотите, чтобы текст отличался от того, что находится в сайдбаре. Кроме того, вы можете счесть полезным отключить подвал или ссылку на страницу, которая не включена в сайдбар. + +## prev {#prev} + +- Тип: `string | false | { text?: string; link?: string }` + +- Подробности: + + Указывает текст/ссылку, который должен отображаться при переходе на предыдущую страницу. Если вы не зададите это в метаданных, текст/ссылка будет определяться из конфигурации сайдбара. + +- Примеры: + + - Для настройки только текста: + + ```yaml + --- + prev: 'Начать | Markdown' + --- + ``` + + - Для настройки текста и ссылки: + + ```yaml + --- + prev: + text: 'Markdown' + link: '/guide/markdown' + --- + ``` + + - Для скрытия предыдущей страницы: + + ```yaml + --- + prev: false + --- + ``` + +## next {#next} + +Аналогично параметру `prev`, но для следующей страницы. diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md new file mode 100644 index 00000000..6bbce96e --- /dev/null +++ b/docs/ru/reference/default-theme-search.md @@ -0,0 +1,382 @@ +--- +outline: deep +--- + +# Поиск {#search} + +## Локальный поиск {#local-search} + +VitePress поддерживает нечёткий полнотекстовый поиск с использованием внутрибраузерного индекса благодаря [MiniSearch](https://github.com/lucaong/minisearch/). Чтобы включить эту функцию, просто установите значение `'local'` для опции `themeConfig.search.provider` в файле `.vitepress/config.ts`: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local' + } + } +}) +``` + +Пример результата: + +![скриншот модального окна поиска](/search.png) + +В качестве альтернативы можно использовать [Algolia DocSearch](#algolia-search) или некоторые плагины сообщества, например или . + +### i18n {#local-search-i18n} + +Вы можете использовать подобную конфигурацию для использования многоязычного поиска: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local', + options: { + locales: { + ru: { + translations: { + button: { + buttonText: 'Поиск', + buttonAriaLabel: 'Поиск' + }, + modal: { + noResultsText: 'Нет результатов для', + resetButtonTitle: 'Сбросить поиск', + footer: { + selectText: 'выбрать', + navigateText: 'перейти' + } + } + } + } + } + } + } + } +}) +``` + +### Параметры MiniSearch {#minisearch-options} + +Вы можете настроить MiniSearch следующим образом: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local', + options: { + miniSearch: { + /** + * @type {Pick} + */ + options: { + /* ... */ + }, + /** + * @type {import('minisearch').SearchOptions} + * @default + * { fuzzy: 0.2, prefix: true, boost: { title: 4, text: 2, titles: 1 } } + */ + searchOptions: { + /* ... */ + } + } + } + } + } +}) +``` + +Подробнее в [документации MiniSearch](https://lucaong.github.io/minisearch/classes/MiniSearch.MiniSearch.html). + +### Пользовательский рендерер содержимого {#custom-content-renderer} + +Вы можете настроить функцию, используемую для отображения содержимого в формате Markdown перед его индексацией: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local', + options: { + /** + * @param {string} src + * @param {import('vitepress').MarkdownEnv} env + * @param {import('markdown-it')} md + */ + _render(src, env, md) { + // возвращаем html + } + } + } + } +}) +``` + +Эта функция будет очищена от данных сайта на стороне клиента, поэтому вы можете использовать в ней API Node.js. + +#### Пример: Исключение страниц из поиска {#example-excluding-pages-from-search} + +Вы можете исключить страницы из поиска, добавив `search: false` в блок метаданных страницы. Альтернативный вариант: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local', + options: { + _render(src, env, md) { + const html = md.render(src, env) + if (env.frontmatter?.search === false) return '' + if (env.relativePath.startsWith('some/path')) return '' + return html + } + } + } + } +}) +``` + +::: warning Примечание +В случае, если предоставляется пользовательская функция `_render`, вам нужно самостоятельно обработать заголовок `search: false`. Кроме того, объект `env` не будет полностью заполнен до вызова `md.render`, поэтому любые проверки необязательных свойств `env`, таких как `frontmatter`, должны быть выполнены после этого. +::: + +#### Пример: Преобразование содержимого - добавление якорей {#example-transforming-content-adding-anchors} + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local', + options: { + _render(src, env, md) { + const html = md.render(src, env) + if (env.frontmatter?.title) + return md.render(`# ${env.frontmatter.title}`) + html + return html + } + } + } + } +}) +``` + +## Поиск Algolia {#algolia-search} + +VitePress поддерживает поиск в вашей документации с помощью [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Обратитесь к руководству по началу работы. В файле `.vitepress/config.ts` вам нужно будет указать, по крайней мере, следующее, чтобы всё работало: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...' + } + } + } +}) +``` + +### i18n {#algolia-search-i18n} + +Вы можете использовать подобную конфигурацию для использования многоязычного поиска: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + locales: { + ru: { + placeholder: 'Поиск в документации', + translations: { + button: { + buttonText: 'Поиск', + buttonAriaLabel: 'Поиск' + }, + modal: { + searchBox: { + resetButtonTitle: 'Сбросить поиск', + resetButtonAriaLabel: 'Сбросить поиск', + cancelButtonText: 'Отменить поиск', + cancelButtonAriaLabel: 'Отменить поиск' + }, + startScreen: { + recentSearchesTitle: 'История поиска', + noRecentSearchesText: 'Нет истории поиска', + saveRecentSearchButtonTitle: 'Сохранить в истории поиска', + removeRecentSearchButtonTitle: 'Удалить из истории поиска', + favoriteSearchesTitle: 'Избранное', + removeFavoriteSearchButtonTitle: 'Удалить из избранного' + }, + errorScreen: { + titleText: 'Невозможно получить результаты', + helpText: + 'Вам может потребоваться проверить подключение к Интернету' + }, + footer: { + selectText: 'выбрать', + navigateText: 'перейти', + closeText: 'закрыть', + searchByText: 'поставщик поиска' + }, + noResultsScreen: { + noResultsText: 'Нет результатов для', + suggestedQueryText: 'Вы можете попытаться узнать', + reportMissingResultsText: + 'Считаете, что поиск даёт ложные результаты?', + reportMissingResultsLinkText: + 'Нажмите на кнопку «Обратная связь»' + } + } + } + } + } + } + } + } +}) +``` + +[Эти параметры](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) можно переопределить. Чтобы узнать о них больше, обратитесь к официальной документации Algolia. + +### Конфигурация поискового робота {#crawler-config} + +Вот пример конфигурации, основанной на той, что используется на этом сайте: + +```ts +new Crawler({ + appId: '...', + apiKey: '...', + rateLimit: 8, + startUrls: ['https://vitepress.dev/'], + renderJavaScript: false, + sitemaps: [], + exclusionPatterns: [], + ignoreCanonicalTo: false, + discoveryPatterns: ['https://vitepress.dev/**'], + schedule: 'at 05:10 on Saturday', + actions: [ + { + indexName: 'vitepress', + pathsToMatch: ['https://vitepress.dev/**'], + recordExtractor: ({ $, helpers }) => { + return helpers.docsearch({ + recordProps: { + lvl1: '.content h1', + content: '.content p, .content li', + lvl0: { + selectors: '', + defaultValue: 'Documentation' + }, + lvl2: '.content h2', + lvl3: '.content h3', + lvl4: '.content h4', + lvl5: '.content h5' + }, + indexHeadings: true + }) + } + } + ], + initialIndexSettings: { + vitepress: { + attributesForFaceting: ['type', 'lang'], + attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'], + attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'], + attributesToSnippet: ['content:10'], + camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'], + searchableAttributes: [ + 'unordered(hierarchy_radio_camel.lvl0)', + 'unordered(hierarchy_radio.lvl0)', + 'unordered(hierarchy_radio_camel.lvl1)', + 'unordered(hierarchy_radio.lvl1)', + 'unordered(hierarchy_radio_camel.lvl2)', + 'unordered(hierarchy_radio.lvl2)', + 'unordered(hierarchy_radio_camel.lvl3)', + 'unordered(hierarchy_radio.lvl3)', + 'unordered(hierarchy_radio_camel.lvl4)', + 'unordered(hierarchy_radio.lvl4)', + 'unordered(hierarchy_radio_camel.lvl5)', + 'unordered(hierarchy_radio.lvl5)', + 'unordered(hierarchy_radio_camel.lvl6)', + 'unordered(hierarchy_radio.lvl6)', + 'unordered(hierarchy_camel.lvl0)', + 'unordered(hierarchy.lvl0)', + 'unordered(hierarchy_camel.lvl1)', + 'unordered(hierarchy.lvl1)', + 'unordered(hierarchy_camel.lvl2)', + 'unordered(hierarchy.lvl2)', + 'unordered(hierarchy_camel.lvl3)', + 'unordered(hierarchy.lvl3)', + 'unordered(hierarchy_camel.lvl4)', + 'unordered(hierarchy.lvl4)', + 'unordered(hierarchy_camel.lvl5)', + 'unordered(hierarchy.lvl5)', + 'unordered(hierarchy_camel.lvl6)', + 'unordered(hierarchy.lvl6)', + 'content' + ], + distinct: true, + attributeForDistinct: 'url', + customRanking: [ + 'desc(weight.pageRank)', + 'desc(weight.level)', + 'asc(weight.position)' + ], + ranking: [ + 'words', + 'filters', + 'typo', + 'attribute', + 'proximity', + 'exact', + 'custom' + ], + highlightPreTag: '', + highlightPostTag: '', + minWordSizefor1Typo: 3, + minWordSizefor2Typos: 7, + allowTyposOnNumericTokens: false, + minProximity: 1, + ignorePlurals: true, + advancedSyntax: true, + attributeCriteriaComputedByMinProximity: true, + removeWordsIfNoResults: 'allOptional' + } + } +}) +``` + + diff --git a/docs/ru/reference/default-theme-sidebar.md b/docs/ru/reference/default-theme-sidebar.md new file mode 100644 index 00000000..92fd89c1 --- /dev/null +++ b/docs/ru/reference/default-theme-sidebar.md @@ -0,0 +1,213 @@ +# Сайдбар {#sidebar} + +Сайдбар (боковая панель) — основной навигационный блок вашей документации. Меню боковой панели можно настроить в секции [`themeConfig.sidebar`](./default-theme-config#sidebar). + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Руководство', + items: [ + { text: 'Введение', link: '/ru/introduction' }, + { text: 'Первые шаги', link: '/ru/getting-started' }, + ... + ] + } + ] + } +} +``` + +## Основы {#the-basics} + +Простейшая форма сайдбара — это передача массива ссылок. Элемент первого уровня определяет «секцию» сайдбара. Он должен содержать `text`, который является заголовком секции, и `items`, которые являются фактическими навигационными ссылками. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Заголовок секции A', + items: [ + { text: 'Пункт A', link: '/item-a' }, + { text: 'Пункт B', link: '/item-b' }, + ... + ] + }, + { + text: 'Заголовок секции B', + items: [ + { text: 'Пункт C', link: '/item-c' }, + { text: 'Пункт D', link: '/item-d' }, + ... + ] + } + ] + } +} +``` + +Каждый элемент `link` должен указывать путь к фактическому файлу, начинающийся с `/`. Если добавить в конец ссылки косую черту, то будет показан `index.md` соответствующего каталога. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Руководство', + items: [ + // Ссылка на страницу `/ru/guide/index.md` + { text: 'Введение', link: '/ru/guide/' } + ] + } + ] + } +} +``` + +Вы можете вложить элементы боковой панели на 6 уровней вглубь, считая от корневого уровня. Обратите внимание, что более 6 уровней вложенных элементов будут игнорироваться и не отображаться на боковой панели. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Уровень 1', + items: [ + { + text: 'Уровень 2', + items: [ + { + text: 'Уровень 3', + items: [ + ... + ] + } + ] + } + ] + } + ] + } +} +``` + +## Несколько сайдбаров {#multiple-sidebars} + +Вы можете показывать разные боковые панели в зависимости от текущего маршрута. Например, как показано на этом сайте, вы можете создать в документации отдельные разделы, например, «Руководство» и «Настройка». + +Для этого сначала организуйте страницы в каталоги для каждого нужного раздела: + +``` +. +├─ guide/ +│ ├─ index.md +│ ├─ one.md +│ └─ two.md +└─ config/ + ├─ index.md + ├─ three.md + └─ four.md +``` + +Затем обновите конфигурацию, чтобы определить боковую панель для каждого раздела. На этот раз вместо массива нужно передать объект. + +```js +export default { + themeConfig: { + sidebar: { + // Эта боковая панель отображается, когда пользователь находится в директории `guide` + '/guide/': [ + { + text: 'Руководство', + items: [ + { text: 'Index', link: '/guide/' }, + { text: 'One', link: '/guide/one' }, + { text: 'Two', link: '/guide/two' } + ] + } + ], + + // Эта боковая панель отображается, когда пользователь находится в директории `config` + '/config/': [ + { + text: 'Настройка', + items: [ + { text: 'Index', link: '/config/' }, + { text: 'Three', link: '/config/three' }, + { text: 'Four', link: '/config/four' } + ] + } + ] + } + } +} +``` + +## Сворачиваемые группы {#collapsible-sidebar-groups} + +Добавив опцию `collapsed` внутри группы `sidebar`, вы увидите кнопку переключения для скрытия/показа каждой секции. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Заголовок секции A', + collapsed: false, + items: [...] + } + ] + } +} +``` + +Все секции «развёрнуты» по умолчанию. Если вы хотите, чтобы они были «свёрнуты» при первоначальной загрузке страницы, установите для опции `collapsed` значение `true`. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Заголовок секции A', + collapsed: true, + items: [...] + } + ] + } +} +``` + +## `useSidebar` {#usesidebar} + +Возвращает данные, связанные с сайдбаром. Возвращаемый объект имеет следующий тип: + +```ts +export interface DocSidebar { + isOpen: Ref + sidebar: ComputedRef + sidebarGroups: ComputedRef + hasSidebar: ComputedRef + hasAside: ComputedRef + leftAside: ComputedRef + isSidebarEnabled: ComputedRef + open: () => void + close: () => void + toggle: () => void +} +``` + +**Пример:** + +```vue + + + +``` diff --git a/docs/ru/reference/default-theme-team-page.md b/docs/ru/reference/default-theme-team-page.md new file mode 100644 index 00000000..0eebaa24 --- /dev/null +++ b/docs/ru/reference/default-theme-team-page.md @@ -0,0 +1,252 @@ + + +# Страница команды {#team-page} + +Если вы хотите представить свою команду, вы можете использовать компоненты Team для создания страницы команды. Есть два варианта использования этих компонентов. Один из вариантов — встроить их в страницу с макетом `doc`, а другой — создать полноценную страницу команды. + +## Отображение членов команды на странице {#show-team-members-in-a-page} + +Вы можете использовать компонент ``, доступный из `vitepress/theme`, для отображения списка членов команды на любой странице. + +```html + + +# Поприветствуйте нашу замечательную команду + + +``` + +Вышеуказанное отобразит члена команды в виде карточки. Должно отобразиться что-то похожее на то, что показано ниже. + + + +Компонент `` поставляется в двух различных размерах, `small` и `medium`. Хотя это зависит от ваших предпочтений, обычно размер `small` лучше подходит для использования на странице с макетом `doc`. Кроме того, вы можете добавить дополнительные свойства для карточки члена команды, например, добавить «описание» или кнопку «спонсировать». Подробнее об этом в секции [``](#vpteammembers). + +Встраивание членов команды в страницу документа хорошо подходит для небольших команд, где наличие полной страницы команды может быть слишком большим, или для представления частичных членов команды в качестве ссылки на контекст документации. + +Если у вас большое количество участников или вы просто хотите иметь больше места для отображения членов команды, подумайте о [создании отдельной страницы команды](#create-a-full-team-page). + +## Создание отдельной страницы команды {#create-a-full-team-page} + +Вместо того чтобы добавлять членов команды на страницу с макетом `doc`, вы можете создать полноценную страницу команды, подобно созданию пользовательской [главной страницы](./default-theme-home-page). + +Чтобы создать страницу команды, сначала создайте новый md-файл. Имя файла не имеет значения, но здесь мы назовем его `team.md`. В этом файле установите в блоке метаданных параметр `layout: page`, а затем вы можете организовать структуру страницы, используя компоненты `TeamPage`. + +```html +--- +layout: page +--- + + + + + + + + + + +``` + +При создании полной страницы команды не забудьте обернуть все компоненты компонентом ``. Этот компонент обеспечит всем вложенным компонентам, связанным с командой, правильную структуру макета, например, расстояние между ними. + +Компонент `` добавляет блок заголовка страницы. Заголовок — это тег `

`. Используйте слоты `#title` и `#lead`, чтобы рассказать о своей команде. + +`` работает так же, как и при использовании в doc-странице. Отобразится список участников. + +### Добавление секций для разделения членов команды {#add-sections-to-divide-team-members} + +Вы можете добавить «секции» на страницу команды. Например, у вас могут быть разные типы членов команды, такие как члены основной команды и партнёры сообщества. Вы можете разделить этих членов на секции, чтобы лучше объяснить роли каждой группы. + +Для этого добавьте компонент `` в файл `team.md`, который мы создали ранее. + +```html +--- +layout: page +--- + + + + + + + + + + + + + + + +``` + +Компонент `` может иметь слоты `#title` и `#lead`, аналогичные компоненту `VPTeamPageTitle`, а также слот `#members` для отображения членов команды. + +Не забудьте поместить компонент `` в слот `#members`. + +## `` {#vpteammembers} + +Компонент `` отображает заданный список членов команды. + +```html + +``` + +```ts +interface Props { + // Размер карточки каждого члена команды. По умолчанию `medium`. + size?: 'small' | 'medium' + + // Список членов команды для отображения. + members: TeamMember[] +} + +interface TeamMember { + // Изображение аватара. + avatar: string + + // Имя члена команды. + name: string + + // Заголовок, отображаемый под именем члена команды. + // например: разработчик, инженер-программист и т. д. + title?: string + + // Организация, в которой состоит текущий член команды. + org?: string + + // URL-адрес сайта организации. + orgLink?: string + + // Описание члена команды. + desc?: string + + // Социальные ссылки: GitHub, Twitter и т. д. + // Могут быть переданы в виде объекта. + // См. https://vitepress.dev/reference/default-theme-config.html#sociallinks + links?: SocialLink[] + + // URL-адрес спонсорской страницы члена команды. + sponsor?: string + + // Текст спонсорской ссылки. По умолчанию 'Sponsor'. + actionText?: string +} +``` + +## `` {#vpteampage} + +Корневой компонент при создании отдельной страницы команды. Принимает только один слот. Он будет стилизовать все передаваемые компоненты, связанные с командой. + +## `` {#vpteampagetitle} + +Добавляет блок «заголовка» страницы. Лучше всего использовать в самом начале внутри ``. Принимает слоты `#title` и `#lead`. + +```html + + + + + + +``` + +## `` {#vpteampagesection} + +Создает «секцию» на странице команды. Принимает слоты `#title`, `#lead` и `#members`. Внутри `` вы можете добавить столько секций, сколько захотите. + +```html + + ... + + + + + + +``` diff --git a/docs/ru/reference/frontmatter-config.md b/docs/ru/reference/frontmatter-config.md new file mode 100644 index 00000000..5c4b3a93 --- /dev/null +++ b/docs/ru/reference/frontmatter-config.md @@ -0,0 +1,221 @@ +--- +outline: deep +--- + +# Конфигурация метаданных {#frontmatter-config} + +Метаданные обеспечивают настройку отдельных страниц. В каждом файле Markdown можно использовать метаданные, чтобы переопределить параметры конфигурации сайта или темы. Кроме того, есть параметры конфигурации, которые можно задать только через метаданные. + +Пример использования: + +```md +--- +title: Документация с VitePress +editLink: true +--- +``` + +Вы можете получить доступ к метаданным через глобальный объект `$frontmatter` в выражениях Vue: + +```md +{{ $frontmatter.title }} +``` + +## title {#title} + +- Тип: `string` + +Заголовок страницы. Это то же самое, что [config.title](./site-config#title), и оно переопределяет конфигурацию сайта. + +```yaml +--- +title: VitePress +--- +``` + +## titleTemplate {#titletemplate} + +- Тип: `string | boolean` + +Суффикс для названия. Это то же самое, что и [config.titleTemplate](./site-config#titletemplate), и оно переопределяет конфигурацию сайта. + +```yaml +--- +title: VitePress +titleTemplate: Генератор статических сайтов на основе Vite и Vue +--- +``` + +## description {#description} + +- Тип: `string` + +Описание для страницы. Это то же самое, что и [config.description](./site-config#description), и оно переопределяет конфигурацию сайта. + +```yaml +--- +description: VitePress +--- +``` + +## head {#head} + +- Тип: `HeadConfig[]` + +Укажите дополнительные теги, которые будут выводиться для текущей страницы. Они будут добавляться после других тегов внутри блока head, введённых в конфигурации сайта. + +```yaml +--- +head: + - - meta + - name: description + content: привет + - - meta + - name: keywords + content: супер-пупер SEO +--- +``` + +```ts +type HeadConfig = + | [string, Record] + | [string, Record, string] +``` + +## Только для темы по умолчанию {#default-theme-only} + +Следующие параметры метаданных применимы только при использовании темы по умолчанию. + +### layout {#layout} + +- Тип: `doc | home | page` +- По умолчанию: `doc` + +Определяет макет страницы. + +- `doc` - Применяет стили документации по умолчанию к содержимому Markdown. +- `home` - Вы можете добавить дополнительные параметры, такие как `hero` и `features`, чтобы быстро создать красивую целевую страницу. +- `page` - Ведет себя аналогично `doc`, но не применяет стили к содержимому. Полезно, если вы хотите создать полностью настраиваемую страницу. + +```yaml +--- +layout: doc +--- +``` + +### hero {#hero} + +Определяет содержимое секции `hero`, когда `layout` имеет значение `home`. Подробнее в главе [Тема по умолчанию: Главная страница](./default-theme-home-page). + +### features {#features} + +Определяет элементы для отображения в секции `features`, когда `layout` имеет значение `home`. Подробнее в главе [Тема по умолчанию: Главная страница](./default-theme-home-page). + +### navbar {#navbar} + +- Тип: `boolean` +- По умолчанию: `true` + +Отображать ли [панель навигации](./default-theme-nav). + +```yaml +--- +navbar: false +--- +``` + +### sidebar {#sidebar} + +- Тип: `boolean` +- По умолчанию: `true` + +Отображать ли [сайдбар](./default-theme-sidebar). + +```yaml +--- +sidebar: false +--- +``` + +### aside {#aside} + +- Тип: `boolean | 'left'` +- По умолчанию: `true` + +Определяет расположение компонента aside в макете `doc`. + +Установка этого значения в `false` предотвращает отрисовку контейнера сайдбара.\ +Установка этого значения в `true` приведёт к отображению сайдбара справа.\ +Установка этого значения в `left` приведёт к отображению сайдбара слева. + +```yaml +--- +aside: false +--- +``` + +### outline {#outline} + +- Тип: `number | [number, number] | 'deep' | false` +- По умолчанию: `2` + +Уровни заголовков в оглавлении для отображения на странице. Это то же самое, что и [config.themeConfig.outline.level](./default-theme-config#outline), и оно переопределяет значение, установленное в конфигурации сайта. + +### lastUpdated {#lastupdated} + +- Тип: `boolean | Date` +- По умолчанию: `true` + +Отображать ли текст [Обновлено](./default-theme-last-updated) в нижнем колонтитуле текущей страницы. Если указано время даты, оно будет отображаться вместо временной метки последнего изменения git. + +```yaml +--- +lastUpdated: false +--- +``` + +### editLink {#editlink} + +- Тип: `boolean` +- По умолчанию: `true` + +Отображать ли [ссылку для редактирования](./default-theme-edit-link) в нижнем колонтитуле текущей страницы. + +```yaml +--- +editLink: false +--- +``` + +### footer {#footer} + +- Тип: `boolean` +- По умолчанию: `true` + +Отображать ли [подвал](./default-theme-footer). + +```yaml +--- +footer: false +--- +``` + +### pageClass {#pageclass} + +- Тип: `string` + +Добавьте дополнительное имя класса на определённую страницу. + +```yaml +--- +pageClass: custom-page-class +--- +``` + +Вы также можете настроить стили этой конкретной страницы в файле `.vitepress/theme/custom.css`: + +```css +.custom-page-class { +  /* стили для конкретной страницы */ +} +``` diff --git a/docs/ru/reference/runtime-api.md b/docs/ru/reference/runtime-api.md new file mode 100644 index 00000000..5d21d29a --- /dev/null +++ b/docs/ru/reference/runtime-api.md @@ -0,0 +1,165 @@ +# Runtime API {#runtime-api} + +VitePress предлагает несколько встроенных API, позволяющих получить доступ к данным приложения. VitePress также поставляется с несколькими встроенными компонентами, которые можно использовать глобально. + +Вспомогательные методы глобально импортируются из `vitepress` и обычно используются в компонентах Vue для пользовательских тем. Однако их можно использовать и внутри страниц `.md`, так как файлы markdown компилируются в [однофайловые компоненты](https://ru.vuejs.org/guide/scaling-up/sfc.html) Vue. + +Методы, начинающиеся с `use*`, указывают на то, что это функция [Vue 3 Composition API](https://ru.vuejs.org/guide/introduction.html#composition-api) («композабл»), которая может быть использована только внутри `setup()` или ` + + +``` + +## `useRoute` {#useroute} + +Возвращает текущий объект маршрута со следующим типом: + +```ts +interface Route { + path: string + data: PageData + component: Component | null +} +``` + +## `useRouter` {#userouter} + +Возвращает экземпляр маршрутизатора VitePress, чтобы вы могли программно перейти на другую страницу. + +```ts +interface Router { + /** + * Текущий маршрут. + */ + route: Route + /** + * Переход к новому URL-адресу. + */ + go: (to?: string) => Promise + /** + * Вызывается перед изменением маршрута. Верните `false`, чтобы отменить навигацию. + */ + onBeforeRouteChange?: (to: string) => Awaitable + /** + * Вызывается перед загрузкой компонента страницы (после того, как состояние истории + * обновлено). Верните `false`, чтобы отменить навигацию. + */ + onBeforePageLoad?: (to: string) => Awaitable + /** + * Вызывается после изменения маршрута. + */ + onAfterRouteChanged?: (to: string) => Awaitable +} +``` + +## `withBase` {#withbase} + +- **Тип**: `(path: string) => string` + +Добавляет настроенный [`base`](./site-config#base) к заданному URL-пути. Также смотрите секцию [Базовый URL](../guide/asset-handling#base-url). + +## `` {#content} + +Компонент `` отображает отрисованное содержимое Markdown. Полезно [при создании собственной темы](../guide/custom-theme). + +```vue + +``` + +## `` {#clientonly} + +Компонент `` отображает свой слот только на стороне клиента. + +Поскольку приложения VitePress при генерации статических сборок рендерятся в Node.js, любое использование Vue должно соответствовать универсальным требованиям к коду. Короче говоря, убедитесь, что доступ к API Browser / DOM осуществляется только в хуках `beforeMount` или `mounted`. + +Если вы используете или демонстрируете компоненты, которые не являются SSR-дружественными (например, содержат пользовательские директивы), вы можете обернуть их внутри компонента `ClientOnly`. + +```vue-html + + + +``` + +- См. также: [Совместимость с SSR](../guide/ssr-compat) + +## `$frontmatter` {#frontmatter} + +Прямой доступ к [метаданным](../guide/frontmatter) текущей страницы в выражениях Vue. + +```md +--- +title: Привет +--- + +# {{ $frontmatter.title }} +``` + +## `$params` {#params} + +Прямой доступ к параметрам [динамических маршрутов](../guide/routing#dynamic-routes) текущей страницы в выражениях Vue. + +```md +- имя пакета: {{ $params.pkg }} +- версия: {{ $params.version }} +``` diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md new file mode 100644 index 00000000..1b1a8483 --- /dev/null +++ b/docs/ru/reference/site-config.md @@ -0,0 +1,720 @@ +--- +outline: deep +--- + +# Конфигурация сайта {#site-config} + +Конфигурация сайта — это место, где вы можете определить глобальные настройки сайта. Параметры конфигурации приложения определяют настройки, которые применяются к каждому сайту VitePress, независимо от того, какая тема на нем используется. Например, базовый каталог или название сайта. + +## Обзор {#overview} + +### Разрешение конфигурации {#config-resolution} + +Файл конфигурации всегда разрешается из `/.vitepress/config.[ext]`, где `` — это корень вашего [проекта](../guide/routing#root-and-source-directory) VitePress, а `[ext]` — одно из поддерживаемых расширений файла. TypeScript поддерживается из коробки. Поддерживаемые расширения включают `.js`, `.ts`, `.mjs` и `.mts`. + +В файлах конфигурации рекомендуется использовать синтаксис ES-модулей. Файл конфигурации должен по умолчанию экспортировать объект: + +```ts +export default { + // параметры конфигурации на уровне приложения + lang: 'ru-RU', + title: 'VitePress', + description: 'Генератор статических сайтов на основе Vite и Vue.', + ... +} +``` + +:::details Динамическая (асинхронная) конфигурация + +Если вам нужно генерировать конфигурацию динамически, вы также можете экспортировать функцию по умолчанию. Например: + +```ts +import { defineConfig } from 'vitepress' + +export default async () => { + const posts = await (await fetch('https://my-cms.com/blog-posts')).json() + + return defineConfig({ + // параметры конфигурации на уровне приложения + lang: 'ru-RU', + title: 'VitePress', + description: 'Генератор статических сайтов на основе Vite и Vue.', + + // параметры конфигурации на уровне темы + themeConfig: { + sidebar: [ + ...posts.map((post) => ({ + text: post.name, + link: `/posts/${post.name}` + })) + ] + } + }) +} +``` + +Вы также можете использовать `await` верхнего уровня. Например: + +```ts +import { defineConfig } from 'vitepress' + +const posts = await (await fetch('https://my-cms.com/blog-posts')).json() + +export default defineConfig({ + // параметры конфигурации на уровне приложения + lang: 'ru-RU', + title: 'VitePress', + description: 'Генератор статических сайтов на основе Vite и Vue.', + + // параметры конфигурации на уровне темы + themeConfig: { + sidebar: [ + ...posts.map((post) => ({ + text: post.name, + link: `/posts/${post.name}` + })) + ] + } +}) +``` + +::: + +### Интеллектуальная настройка {#config-intellisense} + +Использование помощника `defineConfig` обеспечит интеллектуальный анализ опций конфигурации на основе TypeScript. Если ваша IDE поддерживает эту функцию, она должна работать как в JavaScript, так и в TypeScript. + +```js +import { defineConfig } from 'vitepress' + +export default defineConfig({ + // ... +}) +``` + +### Типизированная конфигурация темы {#typed-theme-config} + +По умолчанию помощник `defineConfig` ожидает тип конфигурации темы из темы по умолчанию: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + // Тип `DefaultTheme.Config` + } +}) +``` + +Если вы используете пользовательскую тему и хотите проверять типы для конфигурации темы, вам нужно использовать `defineConfigWithTheme`, и передавать тип конфигурации для вашей пользовательской темы через общий аргумент: + +```ts +import { defineConfigWithTheme } from 'vitepress' +import type { ThemeConfig } from 'your-theme' + +export default defineConfigWithTheme({ + themeConfig: { + // Tип `ThemeConfig` + } +}) +``` + +### Настройка Vite, Vue и Markdown {#vite-vue-markdown-config} + +- **Vite** + + Вы можете настроить базовый экземпляр Vite с помощью опции [vite](#vite) в конфигурации VitePress. Нет необходимости создавать отдельный файл конфигурации Vite. + +- **Vue** + + VitePress уже включает в себя официальный плагин Vue для Vite ([@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue)). Вы можете настроить его параметры с помощью опции [vue](#vue) в конфигурации VitePress. + +- **Markdown** + + Вы можете настроить базовый экземпляр [Markdown-It](https://github.com/markdown-it/markdown-it) с помощью опции [markdown](#markdown) в конфигурации VitePress. + +## Метаданные сайта {#site-metadata} + +### title {#title} + +- Тип: `string` +- По умолчанию: `VitePress` +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#title) + +Название для сайта. При использовании темы по умолчанию оно будет отображаться в панели навигации. + +Оно также будет использоваться в качестве суффикса по умолчанию для всех заголовков отдельных страниц, если не определен [`titleTemplate`](#titletemplate). Окончательный заголовок отдельной страницы будет представлять собой текстовое содержимое её первого заголовка `

`, объединённое с глобальным `title` в качестве суффикса. Например, со следующей конфигурацией и содержимым страницы: + +```ts +export default { + title: 'Мой замечательный сайт' +} +``` + +```md +# Привет +``` + +Заголовок страницы будет таким: `Привет | Мой замечательный сайт`. + +### titleTemplate {##titletemplate} + +- Тип: `string | boolean` +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#titletemplate) + +Позволяет настраивать суффикс заголовка каждой страницы или весь заголовок. Например: + +```ts +export default { + title: 'Мой замечательный сайт', + titleTemplate: 'Пользовательский суффикс' +} +``` + +```md +# Привет +``` + +Заголовок страницы будет таким: `Привет | Пользовательский суффикс`. + +Чтобы полностью настроить отображение заголовка, вы можете использовать символ `:title` в `titleTemplate`: + +```ts +export default { + titleTemplate: ':title - Пользовательский суффикс' +} +``` + +Здесь `:title` будет заменён текстом, выведенным из первого заголовка страницы `

`. Заголовок страницы предыдущего примера будет `Привет - Пользовательский суффикс`. + +Опция может быть установлена в значение `false`, чтобы отключить суффиксы заголовков. + +### description {#description} + +- Тип: `string` +- По умолчанию: `A VitePress site` +- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#description) + +Описание для сайта. Это будет отображаться как тег `` в HTML-странице. + +```ts +export default { + description: 'A VitePress site' +} +``` + +### head {#head} + +- Тип: `HeadConfig[]` +- По умолчанию: `[]` +- Можно добавлять на страницу через [метаданные](./frontmatter-config#head) + +Дополнительные элементы для отображения в теге `` в HTML-странице. Добавленные пользователем теги выводятся перед закрывающим тегом `head`, после тегов VitePress. + +```ts +type HeadConfig = + | [string, Record] + | [string, Record, string] +``` + +#### Пример: Добавление значка сайта {#example-adding-a-favicon} + +```ts +export default { + head: [['link', { rel: 'icon', href: '/favicon.ico' }]] +} // поместите favicon.ico в публичную директорию; если установлен параметр base, используйте /base/favicon.ico + +/* Отрисуется так: + +*/ +``` + +#### Пример: Добавление шрифтов Google {#example-adding-google-fonts} + +```ts +export default { + head: [ + ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], + [ + 'link', + { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' } + ], + [ + 'link', + { + href: 'https://fonts.googleapis.com/css2?family=Roboto&display=swap', + rel: 'stylesheet' + } + ] + ] +} + +/* Отрисуется так: + + + +*/ +``` + +#### Пример: Регистрация сервис-воркера {#example-registering-a-service-worker} + +```ts +export default { + head: [ + [ + 'script', + { id: 'register-sw' }, + `;(() => { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('/sw.js') + } + })()` + ] + ] +} + +/* Отрисуется так: + +*/ +``` + +#### Пример: Использование Google Analytics {#example-using-google-analytics} + +```ts +export default { + head: [ + [ + 'script', + { async: '', src: 'https://www.googletagmanager.com/gtag/js?id=TAG_ID' } + ], + [ + 'script', + {}, + `window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'TAG_ID');` + ] + ] +} + +/* Отрисуется так: + + +*/ +``` + +### lang {#lang} + +- Тип: `string` +- По умолчанию: `en-US` + +Атрибут lang для сайта. Будет выглядеть как тег `` в HTML-странице. + +```ts +export default { + lang: 'en-US' +} +``` + +### base {#base} + +- Тип: `string` +- По умолчанию: `/` + +Базовый URL-адрес, по которому будет развёрнут сайт. Этот параметр необходимо задать, если вы планируете развернуть свой сайт по подпути, например, для страниц GitHub. Если вы планируете развернуть свой сайт на `https://foo.github.io/bar/`, то вам следует установить base на `'/bar/'`. Он всегда должен начинаться и заканчиваться косой чертой. + +Параметр `base` автоматически добавляется ко всем URL, которые начинаются с `/` в других опциях, поэтому вам нужно указать его только один раз. + +```ts +export default { + base: '/base/' +} +``` + +## Маршрутизация {#routing} + +### cleanUrls {#cleanurls} + +- Тип: `boolean` +- По умолчанию: `false` + +Если установить значение `true`, VitePress будет удалять из URL-адресов завершающий `.html`. Также смотрите [Создание чистого URL-адреса](../guide/routing#generating-clean-url). + +::: warning Требуется поддержка сервера +Для включения этой функции может потребоваться дополнительная настройка на вашей хостинговой платформе. Чтобы это сработало, ваш сервер должен быть способен обслуживать `/foo.html` при посещении `/foo` **без редиректа**. +::: + +### rewrites {#rewrites} + +- Тип: `Record` + +Определяет сопоставление пользовательских каталогов с URL-адресами. Дополнительную информацию см. в секции [Маршрутизация: перезапись маршрутов](../guide/routing#route-rewrites). + +```ts +export default { + rewrites: { + 'source/:page': 'destination/:page' + } +} +``` + +## Сборка {#build} + +### srcDir {#srcdir} + +- Тип: `string` +- По умолчанию: `.` + +Каталог, в котором хранятся ваши страницы в формате Markdown, относительно корня проекта. Также смотрите [Корневая директория и директория с исходными файлами](../guide/routing#root-and-source-directory). + +```ts +export default { + srcDir: './src' +} +``` + +### srcExclude {#srcexclude} + +- Тип: `string` +- По умолчанию: `undefined` + +[Шаблон](https://github.com/mrmlnc/fast-glob#pattern-syntax) для поиска файлов, которые должны быть исключены из исходного содержимого. + +```ts +export default { + srcExclude: ['**/README.md', '**/TODO.md'] +} +``` + +### outDir {#outdir} + +- Тип: `string` +- По умолчанию: `./.vitepress/dist` + +Расположение вывода сборки для сайта, относительно [корня проекта](../guide/routing#root-and-source-directory). + +```ts +export default { + outDir: '../public' +} +``` + +### assetsDir {#assetsdir} + +- Тип: `string` +- По умолчанию: `assets` + +Укажите каталог, в котором будут храниться сгенерированные ресурсы. Путь должен находиться внутри [`outDir`](#outdir) и разрешается относительно него. + +```ts +export default { + assetsDir: 'static' +} +``` + +### cacheDir {#cachedir} + +- Тип: `string` +- По умолчанию: `./.vitepress/cache` + +Каталог для файлов кэша, относительно [корня проекта](../guide/routing#root-and-source-directory). См. также: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). + +```ts +export default { + cacheDir: './.vitepress/.vite' +} +``` + +### ignoreDeadLinks {#ignoredeadlinks} + +- Тип: `boolean | 'localhostLinks' | (string | RegExp | ((link: string) => boolean))[]` +- По умолчанию: `false` + +Если установлено значение `true`, VitePress не будет завершать сборку из-за неработающих ссылок. + +Если установить значение `'localhostLinks'`, сборка будет завершаться при наличии неработающих ссылок, но не будет проверять ссылки `localhost`. + +```ts +export default { + ignoreDeadLinks: true +} +``` + +Это также может быть массив точных строк url, шаблонов regex или пользовательских функций фильтрации. + +```ts +export default { + ignoreDeadLinks: [ + // игнорировать url "/playground" + '/playground', + // игнорировать все ссылки на localhost + /^https?:\/\/localhost/, + // игнорировать все ссылки, включающие "/repl/"" + /\/repl\//, + // пользовательская функция, игнорирует все ссылки, включающие "ignore" + (url) => { + return url.toLowerCase().includes('ignore') + } + ] +} +``` + +### metaChunk {#metachunk} + +- Тип: `boolean` +- По умолчанию: `false` + +Если установлено значение `true`, метаданные страницы извлекаются в отдельный фрагмент JavaScript, а не вставляются в исходный HTML. Это уменьшает полезную нагрузку HTML каждой страницы и делает метаданные страниц кэшируемыми, что позволяет снизить пропускную способность сервера при наличии большого количества страниц на сайте. + +### mpa {#mpa} + +- Тип: `boolean` +- По умолчанию: `false` + +Если установлено значение `true`, производственное приложение будет создано в [режиме MPA](../guide/mpa-mode). В режиме MPA по умолчанию используется 0 КБ JavaScript, что приводит к отключению навигации на стороне клиента и требует явного согласия на интерактивность. + +## Тема {#theming} + +### appearance {#appearance} + +- Тип: `boolean | 'dark' | 'force-dark' | import('@vueuse/core').UseDarkOptions` +- По умолчанию: `true` + +Включать ли тёмный режим (путём добавления класса `.dark` к элементу ``). + +- Если опция имеет значение `true`, тема по умолчанию будет определяться цветовой гаммой, предпочитаемой пользователем. +- Если опция имеет значение `dark`, тема по умолчанию будет тёмной, если пользователь не переключит её вручную. +- Если установить значение `false`, пользователи не смогут переключать тему. + +Эта опция вставляет встроенный скрипт, который восстанавливает настройки пользователей из локального хранилища с помощью ключа `vitepress-theme-appearance`. Это гарантирует, что класс `.dark` будет применён до отрисовки страницы, чтобы избежать мерцания. + +`appearance.initialValue` может быть только `'dark' | undefined`. Ссылки или геттеры не поддерживаются. + +### lastUpdated {#lastupdated} + +- Тип: `boolean` +- По умолчанию: `false` + +Получать ли временную метку последнего обновления для каждой страницы с помощью Git. Временная метка будет включена в данные каждой страницы, доступные через [`useData`](./runtime-api#usedata). + +При использовании темы по умолчанию включение этой опции приведёт к отображению времени последнего обновления каждой страницы. Вы можете настроить текст с помощью опции [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext). + +## Кастомизация {#customization} + +### markdown {#markdown} + +- Тип: `MarkdownOption` + +Настройте параметры парсера Markdown. VitePress использует [Markdown-it](https://github.com/markdown-it/markdown-it) в качестве парсера и [Shiki](https://github.com/shikijs/shiki) для подсветки синтаксиса языка. Внутри этой опции вы можете передать различные параметры, связанные с Markdown, в соответствии с вашими потребностями. + +```js +export default { + markdown: {...} +} +``` + +Проверьте [объявление типа и jsdocs](https://github.com/vuejs/vitepress/blob/main/src/node/markdown/markdown.ts) на наличие всех доступных опций. + +### vite {#vite} + +- Тип: `import('vite').UserConfig` + +Передаёт необработанную [конфигурацию Vite](https://vitejs.dev/config/) внутреннему серверу разработки / сборщику Vite. + +```js +export default { + vite: { + // параметры конфигурации Vite + } +} +``` + +### vue {#vue} + +- Тип: `import('@vitejs/plugin-vue').Options` + +Передаёт необработанные [параметры `@vitejs/plugin-vue`](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#options) внутреннему экземпляру плагина. + +```js +export default { + vue: { + // параметры @vitejs/plugin-vue + } +} +``` + +## Хуки сборки {#build-hooks} + +Хуки для сборки VitePress позволяют добавлять на сайт новую функциональность и поведение: + +- Карта сайта +- Поисковая индексация +- PWA +- Телепорты + +### buildEnd {#buildend} + +- Тип: `(siteConfig: SiteConfig) => Awaitable` + +`buildEnd` — это хук CLI сборки, который будет запущен после завершения сборки (SSG), но до выхода из процесса VitePress CLI. + +```ts +export default { + async buildEnd(siteConfig) { + // ... + } +} +``` + +### postRender {#postrender} + +- Тип: `(context: SSGContext) => Awaitable` + +`postRender` — это хук сборки, вызываемый после завершения рендеринга SSG. Это позволит вам обрабатывать содержимое телепортов во время SSG. + +```ts +export default { + async postRender(context) { + // ... + } +} +``` + +```ts +interface SSGContext { + content: string + teleports?: Record + [key: string]: any +} +``` + +### transformHead {#transformhead} + +- Тип: `(context: TransformContext) => Awaitable` + +`transformHead` — это хук сборки для преобразования заголовка перед генерацией каждой страницы. Это позволит вам добавить в конфигурацию VitePress записи, которые не могут быть добавлены статически. Вам нужно только вернуть дополнительные записи, они будут автоматически объединены с существующими. + +::: warning Предупреждение +Не мутируйте ничего внутри `context`. +::: + +```ts +export default { + async transformHead(context) { + // ... + } +} +``` + +```ts +interface TransformContext { + page: string // например, index.md (относительно srcDir) + assets: string[] // все ресурсы, не относящиеся к js/css, в виде полностью разрешённых публичных URL-адресов + siteConfig: SiteConfig + siteData: SiteData + pageData: PageData + title: string + description: string + head: HeadConfig[] + content: string +} +``` + +Обратите внимание, что этот хук вызывается только при статической генерации сайта. Он не вызывается во время разработки. Если вам нужно добавить динамические записи в голову во время разработки, вместо этого вы можете использовать хук [`transformPageData`](#transformpagedata): + +```ts +export default { + transformPageData(pageData) { + pageData.frontmatter.head ??= [] + pageData.frontmatter.head.push([ + 'meta', + { + name: 'og:title', + content: + pageData.frontmatter.layout === 'home' + ? `VitePress` + : `${pageData.title} | VitePress` + } + ]) + } +} +``` + +#### Пример: Добавление канонического URL-адреса `` {#example-adding-a-canonical-url-link} + +```ts +export default { + transformPageData(pageData) { + const canonicalUrl = `https://example.com/${pageData.relativePath}` + .replace(/index\.md$/, '') + .replace(/\.md$/, '.html') + + pageData.frontmatter.head ??= [] + pageData.frontmatter.head.push([ + 'link', + { rel: 'canonical', href: canonicalUrl } + ]) + } +} +``` + +### transformHtml {#transformhtml} + +- Тип: `(code: string, id: string, context: TransformContext) => Awaitable` + +`transformHtml` — это хук сборки для преобразования содержимого каждой страницы перед сохранением на диск. + +::: warning Предупреждение +Не мутируйте ничего внутри `контекста`. Кроме того, изменение html-содержимого может вызвать проблемы с гидратацией во время выполнения. +::: + +```ts +export default { + async transformHtml(code, id, context) { + // ... + } +} +``` + +### transformPageData {#transformpagedata} + +- Тип: `(pageData: PageData, context: TransformPageContext) => Awaitable | { [key: string]: any } | void>` + +`transformPageData` — это хук для преобразования `pageData` каждой страницы. Вы можете напрямую изменять `pageData` или возвращать изменённые значения, которые будут объединены с данными страницы. + +::: warning Предупреждение +Не мутируйте ничего внутри `context` и будьте осторожны, это может повлиять на производительность dev-сервера, особенно если у вас есть некоторые сетевые запросы или тяжёлые вычисления (например, генерация изображений) в хуке. Вы можете проверить `process.env.NODE_ENV === 'production'` для условной логики. +::: + +```ts +export default { + async transformPageData(pageData, { siteConfig }) { + pageData.contributors = await getPageContributors(pageData.relativePath) + } + + // или возвращаем данные для объединения + async transformPageData(pageData, { siteConfig }) { + return { + contributors: await getPageContributors(pageData.relativePath) + } + } +} +``` + +```ts +interface TransformPageContext { + siteConfig: SiteConfig +} +``` From 54c46e7ceb8dd29106ac0d7493fe8da57ac15dc3 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 7 Apr 2024 19:16:22 +0530 Subject: [PATCH 23/50] docs: adjust install and init commands --- docs/guide/getting-started.md | 14 +++++++++++--- docs/pt/guide/getting-started.md | 14 +++++++++++--- docs/ru/guide/getting-started.md | 14 +++++++++++--- docs/zh/guide/getting-started.md | 14 +++++++++++--- src/node/init/init.ts | 7 ++----- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index a5f1c7af..7577709c 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -71,8 +71,12 @@ $ npx vitepress init $ pnpm vitepress init ``` +```sh [yarn] +$ yarn vitepress init +``` + ```sh [bun] -$ bunx vitepress init +$ bun vitepress init ``` ::: @@ -182,11 +186,15 @@ $ npx vitepress dev docs ``` ```sh [pnpm] -$ pnpm exec vitepress dev docs +$ pnpm vitepress dev docs +``` + +```sh [yarn] +$ yarn vitepress dev docs ``` ```sh [bun] -$ bunx vitepress dev docs +$ bun vitepress dev docs ``` ::: diff --git a/docs/pt/guide/getting-started.md b/docs/pt/guide/getting-started.md index 7aeb29d3..00715ecf 100644 --- a/docs/pt/guide/getting-started.md +++ b/docs/pt/guide/getting-started.md @@ -71,8 +71,12 @@ $ npx vitepress init $ pnpm vitepress init ``` +```sh [yarn] +$ yarn vitepress init +``` + ```sh [bun] -$ bunx vitepress init +$ bun vitepress init ``` ::: @@ -182,11 +186,15 @@ $ npx vitepress dev docs ``` ```sh [pnpm] -$ pnpm exec vitepress dev docs +$ pnpm vitepress dev docs +``` + +```sh [yarn] +$ yarn vitepress dev docs ``` ```sh [bun] -$ bunx vitepress dev docs +$ bun vitepress dev docs ``` ::: diff --git a/docs/ru/guide/getting-started.md b/docs/ru/guide/getting-started.md index f4e0e1d1..012ddb42 100644 --- a/docs/ru/guide/getting-started.md +++ b/docs/ru/guide/getting-started.md @@ -71,8 +71,12 @@ $ npx vitepress init $ pnpm vitepress init ``` +```sh [yarn] +$ yarn vitepress init +``` + ```sh [bun] -$ bunx vitepress init +$ bun vitepress init ``` ::: @@ -182,11 +186,15 @@ $ npx vitepress dev docs ``` ```sh [pnpm] -$ pnpm exec vitepress dev docs +$ pnpm vitepress dev docs +``` + +```sh [yarn] +$ yarn vitepress dev docs ``` ```sh [bun] -$ bunx vitepress dev docs +$ bun vitepress dev docs ``` ::: diff --git a/docs/zh/guide/getting-started.md b/docs/zh/guide/getting-started.md index b9b2f268..5c22fb1c 100644 --- a/docs/zh/guide/getting-started.md +++ b/docs/zh/guide/getting-started.md @@ -71,8 +71,12 @@ $ npx vitepress init $ pnpm vitepress init ``` +```sh [yarn] +$ yarn vitepress init +``` + ```sh [bun] -$ bunx vitepress init +$ bun vitepress init ``` ::: @@ -182,11 +186,15 @@ $ npx vitepress dev docs ``` ```sh [pnpm] -$ pnpm exec vitepress dev docs +$ pnpm vitepress dev docs +``` + +```sh [yarn] +$ yarn vitepress dev docs ``` ```sh [bun] -$ bunx vitepress dev docs +$ bun vitepress dev docs ``` ::: diff --git a/src/node/init/init.ts b/src/node/init/init.ts index 774e528b..5b62eeaf 100644 --- a/src/node/init/init.ts +++ b/src/node/init/init.ts @@ -30,9 +30,6 @@ export interface ScaffoldOptions { const getPackageManger = () => { const name = process.env?.npm_config_user_agent || 'npm' - if (name === 'npm') { - return 'npm' - } return name.split('/')[0] } @@ -211,9 +208,9 @@ export function scaffold({ `${getPackageManger()} run docs:dev` )} and start writing.${tip}` } else { - const execCommand = getPackageManger() === 'bun' ? 'bunx' : 'npx' + const pm = getPackageManger() return `You're all set! Now run ${cyan( - `${execCommand} vitepress dev${dir}` + `${pm === 'npm' ? 'npx' : pm} vitepress dev${dir}` )} and start writing.${tip}` } } From c4ae9d3cde4789ca8a1b3660189de419e5ef73f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=8E=A7?= Date: Sun, 7 Apr 2024 23:08:06 +0800 Subject: [PATCH 24/50] docs: update default-theme sidebar type (#3715) --- docs/reference/default-theme-config.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/reference/default-theme-config.md b/docs/reference/default-theme-config.md index b1a4a29a..4a431538 100644 --- a/docs/reference/default-theme-config.md +++ b/docs/reference/default-theme-config.md @@ -135,7 +135,7 @@ export default { export type Sidebar = SidebarItem[] | SidebarMulti export interface SidebarMulti { - [path: string]: SidebarItem[] + [path: string]: SidebarItem[] | { items: SidebarItem[]; base: string } } export type SidebarItem = { @@ -162,6 +162,19 @@ export type SidebarItem = { * 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 } ``` From 229c168a36e7b09309ce42a69399cbc73b5be296 Mon Sep 17 00:00:00 2001 From: Ian Schmitz Date: Sun, 7 Apr 2024 08:10:06 -0700 Subject: [PATCH 25/50] docs: make vue as peer dependency section clearer (#3687) --- docs/guide/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index 7577709c..7d7c577e 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -86,7 +86,7 @@ You will be greeted with a few simple questions: <<< @/snippets/init.ansi ::: tip Vue as Peer Dependency -If you intend to perform customization that uses Vue components or APIs, you should also explicitly install `vue` as a peer dependency. +If you intend to perform customization that uses Vue components or APIs, you should also explicitly install `vue` as a dependency. ::: ## File Structure From b45217c1369d9c6b2f9cf6e9ecb2ecb645d90c05 Mon Sep 17 00:00:00 2001 From: Bugo Date: Mon, 8 Apr 2024 10:29:52 +0500 Subject: [PATCH 26/50] docs(ru): update translations (#3765) --- docs/ru/guide/cms.md | 4 ++-- docs/ru/guide/extending-default-theme.md | 4 ++-- docs/ru/guide/markdown.md | 4 ++-- docs/ru/guide/migration-from-vuepress.md | 2 +- docs/ru/guide/using-vue.md | 2 +- docs/ru/reference/default-theme-footer.md | 2 +- docs/ru/reference/default-theme-home-page.md | 2 +- docs/ru/reference/default-theme-nav.md | 2 +- docs/ru/reference/default-theme-search.md | 2 +- docs/ru/reference/site-config.md | 6 +++--- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/ru/guide/cms.md b/docs/ru/guide/cms.md index 9781e756..81542d2b 100644 --- a/docs/ru/guide/cms.md +++ b/docs/ru/guide/cms.md @@ -48,11 +48,11 @@ outline: deep ```md # {{ $params.title }} - - by {{ $params.author }} on {{ $params.date }} + - Автор: {{ $params.author }}, {{ $params.date }} ``` ## Руководства по интеграции {#integration-guides} -Если вы написали руководство по интеграции VitePress с конкретной CMS, воспользуйтесь ссылкой «Редактировать эту страницу», чтобы отправить его сюда! +Если вы написали руководство по интеграции VitePress с конкретной CMS, воспользуйтесь ссылкой «Редактировать эту страницу», чтобы добавить его сюда! diff --git a/docs/ru/guide/extending-default-theme.md b/docs/ru/guide/extending-default-theme.md index ef43dd5d..818f4399 100644 --- a/docs/ru/guide/extending-default-theme.md +++ b/docs/ru/guide/extending-default-theme.md @@ -14,7 +14,7 @@ outline: deep Эти расширенные настройки потребуют использования пользовательской темы, которая «расширяет» тема по умолчанию. -::: tip Совет +::: tip СОВЕТ Прежде чем приступить к работе, обязательно прочитайте главу [Пользовательская тема](./custom-theme), чтобы понять, как работают пользовательские темы. ::: @@ -62,7 +62,7 @@ export default DefaultTheme } ``` -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ Если вы используете дополнительные компоненты, такие как [Страница команды](../reference/default-theme-team-page), убедитесь, что они также импортированы из `vitepress/theme-without-fonts`! ::: diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md index 65bd897f..05eb4ad3 100644 --- a/docs/ru/guide/markdown.md +++ b/docs/ru/guide/markdown.md @@ -761,8 +761,8 @@ export default config Вы можете включить файл Markdown в другой файл Markdown, даже вложенный. -::: tip -Вы также можете добавить в префикс пути к Markdown `@`, он будет выступать в качестве корня источника. По умолчанию это корень проекта VitePress, если не настроен `srcDir`. +::: tip СОВЕТ +Вы также можете добавить в префикс пути к Markdown символ `@`, он будет выступать в качестве корня источника. По умолчанию это корень проекта VitePress, если не настроена опция `srcDir`. ::: Например, вы можете включить относительный файл Markdown следующим образом: diff --git a/docs/ru/guide/migration-from-vuepress.md b/docs/ru/guide/migration-from-vuepress.md index d5158220..afacc630 100644 --- a/docs/ru/guide/migration-from-vuepress.md +++ b/docs/ru/guide/migration-from-vuepress.md @@ -19,7 +19,7 @@ + ![foo](/foo.png) ``` -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ Для динамических изображений вам всё ещё нужно использовать `withBase`, как показано в [Руководстве по базовому URL](./asset-handling#base-url). ::: diff --git a/docs/ru/guide/using-vue.md b/docs/ru/guide/using-vue.md index 25467be7..4a4c830f 100644 --- a/docs/ru/guide/using-vue.md +++ b/docs/ru/guide/using-vue.md @@ -137,7 +137,7 @@ import CustomComponent from '../components/CustomComponent.vue' HTML, обёрнутый ``, будет отображаться как есть; только тот HTML, который **не** обёрнут, будет разобран Vue. -::: tip Примечание +::: tip ПРИМЕЧАНИЕ Вывод HTML осуществляется с помощью [Markdown-it](https://github.com/Markdown-it/Markdown-it), а парсинг заголовков обрабатывается VitePress (и используется как для боковой панели, так и для заголовка документа). ::: diff --git a/docs/ru/reference/default-theme-footer.md b/docs/ru/reference/default-theme-footer.md index 9481996e..2222f436 100644 --- a/docs/ru/reference/default-theme-footer.md +++ b/docs/ru/reference/default-theme-footer.md @@ -38,7 +38,7 @@ export default { } ``` -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ В `message` и `copyright` можно использовать только встроенные элементы, поскольку они отображаются внутри элемента `

`. Если вы хотите добавить блочные элементы, рассмотрите возможность использования слота [`layout-bottom`](../guide/extending-default-theme#layout-slots). ::: diff --git a/docs/ru/reference/default-theme-home-page.md b/docs/ru/reference/default-theme-home-page.md index a526496f..fedf2b53 100644 --- a/docs/ru/reference/default-theme-home-page.md +++ b/docs/ru/reference/default-theme-home-page.md @@ -191,6 +191,6 @@ npx vitepress init ``` ```` -::: info Примечание +::: info ПРИМЕЧАНИЕ VitePress не всегда автоматически стилизовал дополнительный контент страницы с макетом `layout: home`. Чтобы вернуться к старому поведению, добавьте `markdownStyles: false` в метаданных. ::: diff --git a/docs/ru/reference/default-theme-nav.md b/docs/ru/reference/default-theme-nav.md index 4448af5b..9ff77659 100644 --- a/docs/ru/reference/default-theme-nav.md +++ b/docs/ru/reference/default-theme-nav.md @@ -134,7 +134,7 @@ export default { } ``` -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ Ожидается, что `activeMatch` будет регулярным выражением, но вы должны определить его как строку. Мы не можем использовать здесь реальный объект RegExp, потому что он не сериализуется во время сборки. ::: diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md index 6bbce96e..dae85f47 100644 --- a/docs/ru/reference/default-theme-search.md +++ b/docs/ru/reference/default-theme-search.md @@ -150,7 +150,7 @@ export default defineConfig({ }) ``` -::: warning Примечание +::: warning ПРИМЕЧАНИЕ В случае, если предоставляется пользовательская функция `_render`, вам нужно самостоятельно обработать заголовок `search: false`. Кроме того, объект `env` не будет полностью заполнен до вызова `md.render`, поэтому любые проверки необязательных свойств `env`, таких как `frontmatter`, должны быть выполнены после этого. ::: diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md index 1b1a8483..5068bf84 100644 --- a/docs/ru/reference/site-config.md +++ b/docs/ru/reference/site-config.md @@ -606,7 +606,7 @@ interface SSGContext { `transformHead` — это хук сборки для преобразования заголовка перед генерацией каждой страницы. Это позволит вам добавить в конфигурацию VitePress записи, которые не могут быть добавлены статически. Вам нужно только вернуть дополнительные записи, они будут автоматически объединены с существующими. -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ Не мутируйте ничего внутри `context`. ::: @@ -676,7 +676,7 @@ export default { `transformHtml` — это хук сборки для преобразования содержимого каждой страницы перед сохранением на диск. -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ Не мутируйте ничего внутри `контекста`. Кроме того, изменение html-содержимого может вызвать проблемы с гидратацией во время выполнения. ::: @@ -694,7 +694,7 @@ export default { `transformPageData` — это хук для преобразования `pageData` каждой страницы. Вы можете напрямую изменять `pageData` или возвращать изменённые значения, которые будут объединены с данными страницы. -::: warning Предупреждение +::: warning ПРЕДУПРЕЖДЕНИЕ Не мутируйте ничего внутри `context` и будьте осторожны, это может повлиять на производительность dev-сервера, особенно если у вас есть некоторые сетевые запросы или тяжёлые вычисления (например, генерация изображений) в хуке. Вы можете проверить `process.env.NODE_ENV === 'production'` для условной логики. ::: From 5f28e74abfc984cdc7e0d9d9f7b7e15cb2b46923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20S=C3=A1nchez?= Date: Mon, 8 Apr 2024 17:38:50 +0200 Subject: [PATCH 27/50] fix(theme): remove small layout shift on `On this page` button (#3767) --- .../theme-default/components/VPLocalNavOutlineDropdown.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/theme-default/components/VPLocalNavOutlineDropdown.vue b/src/client/theme-default/components/VPLocalNavOutlineDropdown.vue index eb861d18..013f3b05 100644 --- a/src/client/theme-default/components/VPLocalNavOutlineDropdown.vue +++ b/src/client/theme-default/components/VPLocalNavOutlineDropdown.vue @@ -59,7 +59,7 @@ function scrollToTop() { ref="main" >