From c37bedea393b13bb870c2d563a8830bce2fced3b Mon Sep 17 00:00:00 2001 From: Xavi Lee Date: Fri, 9 Feb 2024 02:48:35 +0800 Subject: [PATCH 001/114] docs(zh): tweak and sync translations (#3556) sync with https://github.com/vuejs/vitepress/commit/ab39fd8592c994fbc6feba5ee369ca1205c50f04 --- docs/zh/reference/default-theme-home-page.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/zh/reference/default-theme-home-page.md b/docs/zh/reference/default-theme-home-page.md index 84a9e89f..87fb0377 100644 --- a/docs/zh/reference/default-theme-home-page.md +++ b/docs/zh/reference/default-theme-home-page.md @@ -37,10 +37,12 @@ hero: ```ts interface Hero { - // `text` 上方的字符,带有品牌颜色,预计简短,例如产品名称 + // `text` 上方的字符,带有品牌颜色 + // 预计简短,例如产品名称 name?: string - // hero 部分的主要文字,被定义为 `h1` 标签 + // hero 部分的主要文字, + // 被定义为 `h1` 标签 text: string // `text` 下方的标语 @@ -67,6 +69,12 @@ interface HeroAction { // 按钮的目标链接 link: string + + // 链接的 target 属性 + target?: string + + // 链接的 rel 属性 + rel?: string } ``` From 20511006dba516ca8c06ed1dd3516547af668a0e Mon Sep 17 00:00:00 2001 From: Lin Tianchuan <47070449+1024th@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:49:01 +0800 Subject: [PATCH 002/114] fix(theme): adjust mathjax svg styles (#3567) --- src/client/theme-default/styles/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/theme-default/styles/base.css b/src/client/theme-default/styles/base.css index af2ed98a..da61b764 100644 --- a/src/client/theme-default/styles/base.css +++ b/src/client/theme-default/styles/base.css @@ -247,5 +247,6 @@ mjx-container { } mjx-container > svg { + display: inline-block; margin: auto; } From b63e0a0c57f886f49aa7e073ff623c918164bd0b Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sat, 17 Feb 2024 12:34:58 +0530 Subject: [PATCH 003/114] fix: handle process.env being undefined while process is not closes #3579 --- src/shared/shared.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/shared.ts b/src/shared/shared.ts index 7964f0af..1308840e 100644 --- a/src/shared/shared.ts +++ b/src/shared/shared.ts @@ -184,7 +184,7 @@ const KNOWN_EXTENSIONS = new Set() export function treatAsHtml(filename: string): boolean { if (KNOWN_EXTENSIONS.size === 0) { const extraExts = - (typeof process === 'object' && process.env.VITE_EXTRA_EXTENSIONS) || + (typeof process === 'object' && process.env?.VITE_EXTRA_EXTENSIONS) || (import.meta as any).env?.VITE_EXTRA_EXTENSIONS || '' From 636cca042dfbca006af2d702ddec0a2ff601cb46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20S=C3=A1nchez?= Date: Sat, 17 Feb 2024 14:34:16 +0100 Subject: [PATCH 004/114] perf(theme): move svg icons to css (#3537) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- package.json | 2 +- .../theme-default/components/VPDocFooter.vue | 6 +- .../theme-default/components/VPFeature.vue | 7 +- .../theme-default/components/VPFlyout.vue | 22 +--- .../components/VPHomeSponsors.vue | 13 +- .../theme-default/components/VPLocalNav.vue | 7 +- .../components/VPLocalNavOutlineDropdown.vue | 23 ++-- .../components/VPLocalSearchBox.vue | 123 +++--------------- .../components/VPNavBarSearchButton.vue | 21 +-- .../components/VPNavBarTranslations.vue | 3 +- .../components/VPNavScreenMenuGroup.vue | 8 +- .../components/VPNavScreenTranslations.vue | 10 +- .../components/VPSidebarItem.vue | 7 +- .../theme-default/components/VPSocialLink.vue | 9 +- .../theme-default/components/VPSwitch.vue | 8 +- .../components/VPSwitchAppearance.vue | 6 +- .../components/VPTeamMembersItem.vue | 7 +- src/client/theme-default/styles/icons.css | 123 ++++++++++++++++++ src/client/theme-default/styles/vars.css | 9 -- .../theme-default/support/socialIcons.ts | 23 ---- src/client/theme-default/without-fonts.ts | 1 + theme.d.ts | 25 ++-- 22 files changed, 210 insertions(+), 253 deletions(-) create mode 100644 src/client/theme-default/styles/icons.css delete mode 100644 src/client/theme-default/support/socialIcons.ts diff --git a/package.json b/package.json index f7f16197..ce010ab2 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0-rc.42", "description": "Vite & Vue powered static site generator", "type": "module", - "packageManager": "pnpm@8.15.1", + "packageManager": "pnpm@8.15.3", "main": "dist/node/index.js", "types": "types/index.d.ts", "exports": { diff --git a/src/client/theme-default/components/VPDocFooter.vue b/src/client/theme-default/components/VPDocFooter.vue index 6de55347..53f199ea 100644 --- a/src/client/theme-default/components/VPDocFooter.vue +++ b/src/client/theme-default/components/VPDocFooter.vue @@ -3,7 +3,6 @@ import { computed } from 'vue' import { useData } from '../composables/data' import { useEditLink } from '../composables/edit-link' import { usePrevNext } from '../composables/prev-next' -import VPIconEdit from './icons/VPIconEdit.vue' import VPLink from './VPLink.vue' import VPDocFooterLastUpdated from './VPDocFooterLastUpdated.vue' @@ -30,7 +29,7 @@ const showFooter = computed(() => {
@@ -92,9 +91,6 @@ const showFooter = computed(() => { .edit-link-icon { margin-right: 8px; - width: 14px; - height: 14px; - fill: currentColor; } .prev-next { diff --git a/src/client/theme-default/components/VPFeature.vue b/src/client/theme-default/components/VPFeature.vue index abdade78..e6e05880 100644 --- a/src/client/theme-default/components/VPFeature.vue +++ b/src/client/theme-default/components/VPFeature.vue @@ -2,7 +2,6 @@ import type { DefaultTheme } from 'vitepress/theme' import VPImage from './VPImage.vue' import VPLink from './VPLink.vue' -import VPIconArrowRight from './icons/VPIconArrowRight.vue' defineProps<{ icon?: DefaultTheme.FeatureIcon @@ -46,7 +45,7 @@ defineProps<{ @@ -119,10 +118,6 @@ defineProps<{ } .link-text-icon { - display: inline-block; margin-left: 6px; - width: 14px; - height: 14px; - fill: currentColor; } diff --git a/src/client/theme-default/components/VPFlyout.vue b/src/client/theme-default/components/VPFlyout.vue index 57118fe7..f4c8f205 100644 --- a/src/client/theme-default/components/VPFlyout.vue +++ b/src/client/theme-default/components/VPFlyout.vue @@ -1,12 +1,10 @@ @@ -23,8 +22,7 @@ const svg = computed(() => { target="_blank" rel="noopener" v-html="svg" - > - + > diff --git a/src/client/theme-default/components/VPSwitchAppearance.vue b/src/client/theme-default/components/VPSwitchAppearance.vue index f63d1ce4..7b13355f 100644 --- a/src/client/theme-default/components/VPSwitchAppearance.vue +++ b/src/client/theme-default/components/VPSwitchAppearance.vue @@ -2,8 +2,6 @@ import { inject, computed } from 'vue' import { useData } from '../composables/data' import VPSwitch from './VPSwitch.vue' -import VPIconMoon from './icons/VPIconMoon.vue' -import VPIconSun from './icons/VPIconSun.vue' const { isDark, theme } = useData() @@ -25,8 +23,8 @@ const switchTitle = computed(() => { :aria-checked="isDark" @click="toggleAppearance" > - - + + diff --git a/src/client/theme-default/components/VPTeamMembersItem.vue b/src/client/theme-default/components/VPTeamMembersItem.vue index 5acb21e8..f84bdc03 100644 --- a/src/client/theme-default/components/VPTeamMembersItem.vue +++ b/src/client/theme-default/components/VPTeamMembersItem.vue @@ -1,6 +1,5 @@ diff --git a/src/client/theme-default/components/VPHomeContent.vue b/src/client/theme-default/components/VPHomeContent.vue new file mode 100644 index 00000000..fe689b6e --- /dev/null +++ b/src/client/theme-default/components/VPHomeContent.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/client/theme-default/components/VPHomeSponsors.vue b/src/client/theme-default/components/VPHomeSponsors.vue index 44878a94..1343e776 100644 --- a/src/client/theme-default/components/VPHomeSponsors.vue +++ b/src/client/theme-default/components/VPHomeSponsors.vue @@ -49,8 +49,33 @@ withDefaults(defineProps(), { +``` + +Resultado (**atenção!**: cores piscantes, movimentos súbitos, luzes brilhantes): + +
+Demo + +![Demo de Transição de Alternância de Aparência](/appearance-toggle-transition.webp) + +
+ +Consulte [Chrome Docs](https://developer.chrome.com/docs/web-platform/view-transitions/) para mais detalhes sobre _view transitions_. + +### Na Mudança de Rota {#on-route-change} + +Em breve. + +## Substituindo Componentes Internos {#overriding-internal-components} + +Você pode usar os [aliases](https://vitejs.dev/config/shared-options.html#resolve-alias) Vite para substituir os componentes do tema padrão pelos seus personalizados: + +```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) + ) + } + ] + } + } +}) +``` + +Para saber o nome exato do componente consulte [nosso código fonte](https://github.com/vuejs/vitepress/tree/main/src/client/theme-default/components). Como os componentes são internos, há uma pequena chance de que o nome deles seja atualizado entre lançamentos secundários. \ No newline at end of file diff --git a/docs/pt/guide/frontmatter.md b/docs/pt/guide/frontmatter.md new file mode 100644 index 00000000..0ab4ac51 --- /dev/null +++ b/docs/pt/guide/frontmatter.md @@ -0,0 +1,48 @@ +# Frontmatter + +## Utilização {#usage} + +VitePress suporta frontmatter YAML em todos os arquivos Markdown, processando-os com [gray-matter](https://github.com/jonschlinkert/gray-matter). O frontmatter deve estar no topo do arquivo Markdown (antes de qualquer elemento, incluindo tags ` + + +``` + +## Suporte a RTL (Experimental) {#rtl-support-experimental} + +Para suporte a RTL (Right to Left), especifique `dir: 'rtl'` na configuração e use algum plugin RTLCSS PostCSS como , ou . Você precisará configurar seu plugin PostCSS para usar `:where([dir="ltr"])` e `:where([dir="rtl"])` como prefixos para evitar problemas de especificidade CSS. \ No newline at end of file diff --git a/docs/pt/guide/markdown.md b/docs/pt/guide/markdown.md new file mode 100644 index 00000000..5fba7333 --- /dev/null +++ b/docs/pt/guide/markdown.md @@ -0,0 +1,929 @@ +# Extensões Markdown {#markdown-extensions} + +VitePress vem com Extensões Markdown embutidas. + +## Âncoras de Cabeçalho {#header-anchors} + +Cabeçalhos recebem a aplicação automaticamente de links âncora. A apresentação das âncoras pode ser configurada usando a opção `markdown.anchor`. + +### Âncoras personalizadas {#custom-anchors} + +Para especificar uma _tag_ âncora personalizada para um cabeçalho em vez de usar aquela gerada automaticamente, adicione um sufixo ao cabeçalho: + +``` +# Usando âncoras personalizadas {#minha-ancora} +``` + +Isso permite que você tenha um link do cabeçalho como `#minha-ancora` em vez do padrão `#usando-ancoras-personalizadas`. + +## Links {#links} + +Ambos os links internos e externos recebem tratamento especial. + +### Links Internos {#internal-links} + +Os links internos são convertidos em links de roteador para navegação SPA. Além disso, todo arquivo `index.md` contido em cada subdiretório será automaticamente convertido para `index.html`, com a URL correspondente `/`. + +Por exemplo, dada a seguinte estrutura de diretórios: + +``` +. +├─ index.md +├─ foo +│ ├─ index.md +│ ├─ one.md +│ └─ two.md +└─ bar + ├─ index.md + ├─ three.md + └─ four.md +``` + +E supondo que você esteja em `foo/one.md`: + +```md +[Página Inicial](/) +[foo](/foo/) +[foo heading](./#heading) +[bar - three](../bar/three) +[bar - three](../bar/three.md) +[bar - four](../bar/four.html) +``` + +### Sufixo de Página {#page-suffix} + +Páginas e links internos são gerados com o sufixo `.html` por padrão. + +### Links Externos {#external-links} + +Links externos recebem automaticamente `target="_blank" rel="noreferrer"`: + +- [vuejs.org](https://vuejs.org) +- [VitePress no GitHub](https://github.com/vuejs/vitepress) + +## Frontmatter {#frontmatter} + +[YAML frontmatter](https://jekyllrb.com/docs/front-matter/) é suportado por padrão: + +```yaml +--- +título: Escrevendo como um Hacker +idioma: pt-BR +--- +``` + +Esses dados estarão disponíveis para o restante da página, junto com todos os componentes personalizados e de temas. + +Para mais detalhes, veja [Frontmatter](../reference/frontmatter-config). + +## Tabelas ao Estilo GitHub {#github-style-tables} + +**Entrada** + +```md +| Tabelas | São | Legais | +| ------------- | :-----------: | ----: | +| col 3 está | à direita | $1600 | +| col 2 está | centralizada | $12 | +| listras | são legais | $1 | +``` + +**Saída** + +| Tabelas | São | Legais | +| ------------- | :-----------: | -----: | +| col 3 está | à direita | \$1600 | +| col 2 está | centralizada | \$12 | +| listras | são legais | \$1 | + +## Emoji :tada: + +**Entrada** + +``` +:tada: :100: +``` + +**Saída** + +:tada: :100: + +Uma [lista de todos os emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs) está disponível. + +## Tabela de Conteúdo (TOC) + +**Entrada** + +``` +[[toc]] +``` + +**Saída** + +[[toc]] + +A apresentação de TOC (Table of Contents) pode ser configurada usando a opção `markdown.toc`. + +## Recipientes Personalizados {#custom-containers} + +Recipientes personalizados podem ser definidos por seus tipos, títulos e conteúdos. + +### Título Padrão {#default-title} + +**Entrada** + +```md +::: info +Este é um bloco de informações. +::: + +::: tip +Este é um aviso. +::: + +::: warning +Este é um aviso. +::: + +::: danger +Este é um aviso de perigo. +::: + +::: details +Este é um bloco de detalhes. +::: +``` + +**Saída** + +::: info +Este é um bloco de informações. +::: + +::: tip +Este é um aviso. +::: + +::: warning +Este é um aviso. +::: + +::: danger +Este é um aviso de perigo. +::: + +::: details +Este é um bloco de detalhes. +::: + +### Título Personalizado {#custom-title} + +Você pode definir um título personalizado adicionando o texto imediatamente após o "tipo" do recipiente. + +**Entrada** + +```md +::: danger STOP +Zona de perigo, não prossiga +::: + +::: details Clique para ver o código +```js +console.log('Olá, VitePress!') +``` +::: +``` + +**Saída** + +::: danger STOP +Zona de perigo, não prossiga +::: + +::: details Clique para ver o código +```js +console.log('Olá, VitePress!') +``` +::: + +Além disso, você pode definir títulos personalizados globalmente adicionando o seguinte conteúdo no arquivo de configuração do site, útil se não estiver escrevendo em inglês: + +```ts +// config.ts +export default defineConfig({ + // ... + markdown: { + container: { + tipLabel: '提示', + warningLabel: '警告', + dangerLabel: '危险', + infoLabel: '信息', + detailsLabel: '详细信息' + } + } + // ... +}) +``` + +### `raw` + +Este é um recipiente especial que pode ser usado para evitar conflitos de estilo e roteador com VitePress. Isso é especialmente útil ao documentar bibliotecas de componentes. Você também pode verificar [whyframe](https://whyframe.dev/docs/integrations/vitepress) para melhor isolamento. + +**Sintaxe** + +```md +::: raw +Envolve em um
+::: +``` + +A classe `vp-raw` também pode ser usada diretamente em elementos. O isolamento de estilo é atualmente opcional: + +- Instale o `postcss` com seu gerenciador de pacotes preferido: + + ```sh + $ npm add -D postcss + ``` + +- Crie um arquivo chamado `docs/postcss.config.mjs` e adicione o seguinte: + + ```js + import { postcssIsolateStyles } from 'vitepress' + + export default { + plugins: [postcssIsolateStyles()] + } + ``` + + Ele utiliza [`postcss-prefix-selector`](https://github.com/postcss/postcss-load-config) internamente. Você pode passar opções assim: + + ```js + postcssIsolateStyles({ + includeFiles: [/vp-doc\.css/] // o padrão é /base\.css/ + }) + ``` + +## Alertas no estilo GitHub {#github-flavored-alerts} + +VitePress também suporta [alertas no estilo 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) para apresentar como um bloco de chamada. Eles serão apresentados da mesma forma que [elementos personalizados](#custom-containers). + +```md +> [!NOTE] +> Destaca informações que os usuários devem levar em consideração, mesmo ao ler rapidamente. + +> [!TIP] +> Informações opcionais para ajudar o usuário a ter mais sucesso. + +> [!IMPORTANT] +> Informações cruciais necessárias para que os usuários tenham sucesso. + +> [!WARNING] +> Conteúdo crítico exigindo atenção imediata do usuário devido a riscos potenciais. + +> [!CAUTION] +> Potenciais consequências negativas de uma ação. +``` + +> [!NOTE] +> Destaca informações que os usuários devem levar em consideração, mesmo ao ler rapidamente. + +> [!TIP] +> Informações opcionais para ajudar o usuário a ter mais sucesso. + +> [!IMPORTANT] +> Informações cruciais necessárias para que os usuários tenham sucesso. + +> [!WARNING] +> Conteúdo crítico exigindo atenção imediata do usuário devido a riscos potenciais. + +> [!CAUTION] +> Potenciais consequências negativas de uma ação. + +## Destaque de Sintaxe em Blocos de Código {#syntax-highlighting-in-code-blocks} + +VitePress utiliza [Shiki](https://github.com/shikijs/shiki) para destacar a sintaxe da linguagem em blocos de código Markdown, usando texto colorido. Shiki suporta uma ampla variedade de linguagens de programação. Tudo o que você precisa fazer é adicionar um _alias_ de linguagem válido após os crases iniciais do bloco de código: + +**Entrada** + +```` +```js +export default { + name: 'MyComponent', + // ... +} +``` +```` + +```` +```html +
    +
  • + {{ todo.text }} +
  • +
+``` +```` + +**Saída** + +```js +export default { + name: 'MyComponent' + // ... +} +``` + +```html +
    +
  • + {{ todo.text }} +
  • +
+``` + +Uma [lista de linguagens válidas](https://shiki.style/languages) está disponível no repositório Shiki. + +Você também pode personalizar o tema de destaque de sintaxe na configuração do aplicativo. Consulte as [opções `markdown`](../reference/site-config#markdown) para mais detalhes. + +## Destaque de Linha em Blocos de Código {#line-highlighting-in-code-blocks} + +**Entrada** + +```` +```js{4} +export default { + data () { + return { + msg: 'Destacado!' + } + } +} +``` +```` + +**Saída** + +```js{4} +export default { + data () { + return { + msg: 'Destacado!' + } + } +} +``` + +Além de uma única linha, você também pode especificar múltiplas linhas únicas, intervalos, ou ambos: + +- Intervalos de linha: por exemplo, `{5-8}`, `{3-10}`, `{10-17}` +- Múltiplas linhas únicas: por exemplo, `{4,7,9}` +- Intervalos de linha e linhas únicas: por exemplo, `{4,7-13,16,23-27,40}` + +**Entrada** + +```` +```js{1,4,6-8} +export default { // Destacado + data () { + return { + msg: `Destacado! + Esta linha não está destacada, + mas esta e as próximas 2 estão.`, + motd: 'VitePress é incrível', + lorem: 'ipsum' + } + } +} +``` +```` + +**Saída** + +```js{1,4,6-8} +export default { // Destacado + data () { + return { + msg: `Destacado! + Esta linha não está destacada, + mas esta e as próximas 2 estão.`, + motd: 'VitePress é incrível', + lorem: 'ipsum', + } + } +} +``` + +Alternativamente, é possível destacar diretamente na linha usando o comentário `// [!code highlight]`. + +**Entrada** + +```` +```js +export default { + data () { + return { + msg: 'Destacado!' // [!!code highlight] + } + } +} +``` +```` + +**Saída** + +```js +export default { + data() { + return { + msg: 'Destacado!' // [!code destaque] + } + } +} +``` + +## Foco em Blocos de Código {#focus-in-code-blocks} + +Adicionando o comentário `// [!code focus]` em uma linha irá destacá-la e desfocar as outras partes do código. + +Além disso, você pode definir o número de linhas para focar usando `// [!code focus:]`. + +**Entrada** + +```` +```js +export default { + data () { + return { + msg: 'Focado!' // [!!code focus] + } + } +} +``` +```` + +**Saída** + +```js +export default { + data() { + return { + msg: 'Focado!' // [!code focus] + } + } +} +``` + +## Diferenças Coloridas em Blocos de Código {#colored-diffs-in-code-blocks} + +Adicionar os comentários `// [!code --]` ou `// [!code ++]` em uma linha criará uma diferença nessa linha, mantendo as cores do bloco de código. + +**Entrada** + +```` +```js +export default { + data () { + return { + msg: 'Removido' // [!!code --] + msg: 'Adicionado' // [!!code ++] + } + } +} +``` +```` + +**Saída** + +```js +export default { + data () { + return { + msg: 'Removido' // [!code --] + msg: 'Adicionado' // [!code ++] + } + } +} +``` + +## Erros e Avisos em Blocos de Código {#errors-and-warnings-in-code-blocks} + +Adicionar os comentários `// [!code warning]` ou `// [!code error]` em uma linha colorirá os blocos conforme apropriado. + +**Entrada** + +```` +```js +export default { + data () { + return { + msg: 'Erro', // [!!code error] + msg: 'Aviso' // [!!code warning] + } + } +} +``` +```` + +**Saída** + +```js +export default { + data() { + return { + msg: 'Erro', // [!code error] + msg: 'Aviso' // [!code warning] + } + } +} +``` + +## Números de Linha {#line-numbers} + +Você pode habilitar números de linha para cada bloco de código através do arquivo de configuração: + +```js +export default { + markdown: { + lineNumbers: true + } +} +``` + +Consulte as [opções markdown](../reference/site-config#markdown) para mais detalhes. + +Você pode adicionar a marca `:line-numbers` / `:no-line-numbers` em seus blocos de código para substituir o valor definido na configuração. + +Você também pode personalizar o número inicial da linha adicionando `=` após `:line-numbers`. Por exemplo, `:line-numbers=2` significa que os números das linhas nos blocos de código começarão a partir de `2`. + +**Entrada** + +````md +```ts {1} +// números de linha desativados por padrão +const line2 = 'Esta é a linha 2' +const line3 = 'Esta é a linha 3' +``` + +```ts:line-numbers {1} +// números de linha ativados +const line2 = 'Esta é a linha 2' +const line3 = 'Esta é a linha 3' +``` + +```ts:line-numbers=2 {1} +// números de linha ativados e começam do 2 +const line3 = 'Esta é a linha 3' +const line4 = 'Esta é a linha 4' +``` +```` + +**Saída** + +```ts {1} +// números de linha desativados por padrão +const line2 = 'Esta é a linha 2' +const line3 = 'Esta é a linha 3' +``` + +```ts:line-numbers {1} +// números de linha ativados +const line2 = 'Esta é a linha 2' +const line3 = 'Esta é a linha 3' +``` + +```ts:line-numbers=2 {1} +// números de linha ativados e começam do 2 +const line3 = 'Esta é a linha 3' +const line4 = 'Esta é a linha 4' +``` + +## Importar _Snippets_ de Código {#import-code-snippets} + +Você pode importar trechos de código de arquivos existentes usando a seguinte sintaxe: + +```md +<<< @/filepath +``` + +Também suporta [destaque de linha](#line-highlighting-in-code-blocks): + +```md +<<< @/filepath{highlightLines} +``` + +**Entrada** + +```md +<<< @/snippets/snippet.js{2} +``` + +**Arquivo de Código** + +<<< @/snippets/snippet.js + +**Saída** + +<<< @/snippets/snippet.js{2} + +::: dica +O valor de `@` corresponde à raiz do código fonte. Por padrão, é a raiz do projeto VitePress, a menos que `srcDir` seja configurado. Alternativamente, você também pode importar de caminhos relativos: + +```md +<<< ../snippets/snippet.js +``` + +::: + +Você também pode usar uma [região VS Code](https://code.visualstudio.com/docs/editor/codebasics#_folding) para incluir apenas a parte correspondente do arquivo de código. Você pode fornecer um nome de região personalizado após um `#` seguindo o caminho do arquivo: + +**Entrada** + +```md +<<< @/snippets/snippet-with-region.js#snippet{1} +``` + +**Arquivo de Código** + +<<< @/snippets/snippet-with-region.js + +**Saída** + +<<< @/snippets/snippet-with-region.js#snippet{1} + +Você também pode especificar o idioma dentro das chaves (`{}`), assim: + +```md +<<< @/snippets/snippet.cs{c#} + + + +<<< @/snippets/snippet.cs{1,2,4-6 c#} + + + +<<< @/snippets/snippet.cs{1,2,4-6 c#:line-numbers} +``` + +Isso é útil se a linguagem original não puder ser inferida pela extensão do arquivo. + +## Grupos de Código {#code-groups} + +Você pode agrupar vários blocos de código assim: + +**Entrada** + +````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 +``` + +::: +```` + +**Saída** + +::: 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 +``` + +::: + +Você também pode [importar _snippets_ de código](#import-code-snippets) em grupos de código: + +**Entrada** + +```md +::: code-group + + + +<<< @/snippets/snippet.js + + + +<<< @/snippets/snippet-with-region.js#snippet{1,2 ts:line-numbers} [snippet with region] + +::: +``` + +**Output** + +::: code-group + +<<< @/snippets/snippet.js + +<<< @/snippets/snippet-with-region.js#snippet{1,2 ts:line-numbers} [snippet with region] + +::: + +## Inclusão de Arquivo Markdown {#markdown-file-inclusion} + +Você pode incluir um arquivo markdown em outro arquivo markdown, mesmo aninhado. + +::: dica +Você também pode prefixar o caminho do markdown com `@`, ele atuará como a raiz de origem. Por padrão, é a raiz do projeto VitePress, a menos que `srcDir` seja configurado. +::: + +Por exemplo, você pode incluir um arquivo markdown relativo usando isto: + +**Entrada** + +```md +# Documentação + +## Conceitos Básicos + + +``` + +**Arquivo da Parte** (`parts/basics.md`) + +```md +Algumas coisas básicas. + +### Configuração + +Pode ser criada usando `.foorc.json`. +``` + +**Código Equivalente** + +```md +# Documentação + +## Conceitos Básicos + +Algumas coisas básicas. + +### Configuração + +Pode ser criada usando `.foorc.json`. +``` + +Também suporta a seleção de um intervalo de linhas: + +**Entrada** + +```md +# Documentação + +## Conceitos Básicos + + +``` + +**Arquivo da Parte** (`parts/basics.md`) + +```md +Algumas coisas básicas. + +### Configuração + +Pode ser criada usando `.foorc.json`. +``` + +**Código Equivalente** + +```md +# Documentação + +## Conceitos Básicos + +### Configuração + +Pode ser criada usando `.foorc.json`. +``` + +O formato do intervalo de linhas selecionado pode ser: `{3,}`, `{,10}`, `{1,10}` + +::: aviso +Observe que isso não gera erros se o arquivo não estiver presente. Portanto, ao usar esse recurso, certifique-se de que o conteúdo está sendo mostrado como esperado. +::: + +## Equações Matemáticas {#math-equations} + +Isso é atualmente opcional. Para ativá-lo, você precisa instalar `markdown-it-mathjax3` e definir `markdown.math` como `true` no seu arquivo de configuração: + +```sh +npm add -D markdown-it-mathjax3 +``` + +```ts +// .vitepress/config.ts +export default { + markdown: { + math: true + } +} +``` + +**Entrada** + +```md +Quando $a \ne 0$, existem duas soluções para $(ax^2 + bx + c = 0)$ e elas são +$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ + +**Equações de Maxwell:** + +| equação | descrição | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| $\nabla \cdot \vec{\mathbf{B}} = 0$ | a divergência de $\vec{\mathbf{B}}$ é zero | +| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | a rotacional de $\vec{\mathbf{E}}$ é proporcional à taxa de variação de $\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$ | _hã?_ | + +**Saída** + +Quando $a \ne 0$, existem duas soluções para $(ax^2 + bx + c = 0)$ e são +$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$ + +**Equações de Maxwell:** + +| equação | descrição | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| $\nabla \cdot \vec{\mathbf{B}} = 0$ | a divergência de $\vec{\mathbf{B}}$ é zero | +| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | a rotacional de $\vec{\mathbf{E}}$ é proporcional à taxa de variação de $\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$ | _hã?_ | + +## _Lazy Loading_ de Imagens {#image-lazy-loading} + +Você pode ativar o "carregamento folgado" para cada imagem adicionada via markdown definindo `lazyLoading` como `true` no seu arquivo de configuração: + +```js +export default { + markdown: { + image: { + // o carregamento folgado de imagens está desativado por padrão + lazyLoading: true + } + } +} +``` + +## Configuração Avançada {#advanced-configuration} + +VitePress usa [markdown-it](https://github.com/markdown-it/markdown-it) como interpretador Markdown. Muitas das extensões acima são implementadas por meio de _plugins_ personalizados. Você pode personalizar ainda mais a instância `markdown-it` usando a opção `markdown` em `.vitepress/config.js`: + +```js +import { defineConfig } from 'vitepress' +import markdownItAnchor from 'markdown-it-anchor' +import markdownItFoo from 'markdown-it-foo' + +export default defineConfig({ + markdown: { + // opções para markdown-it-anchor + // https://github.com/valeriangalliat/markdown-it-anchor#usage + anchor: { + permalink: markdownItAnchor.permalink.headerLink() + }, + + // opções para @mdit-vue/plugin-toc + // https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc#options + toc: { level: [1, 2] }, + + config: (md) => { + // use mais plugins markdown-it! + md.use(markdownItFoo) + } + } +}) +``` + +Consulte a lista completa de propriedades configuráveis em [Referência de Configuração: Configuração da Aplicação](../reference/site-config#markdown). \ No newline at end of file diff --git a/docs/pt/guide/mpa-mode.md b/docs/pt/guide/mpa-mode.md new file mode 100644 index 00000000..28aabae1 --- /dev/null +++ b/docs/pt/guide/mpa-mode.md @@ -0,0 +1,23 @@ +# Modo MPA {#mpa-mode} + +O modo MPA (Aplicação Multipáginas) pode ser habilitado pela linha de comando com `vitepress build --mpa`, ou através da configuração pela opção `mpa: true`. + +No modo MPA, todas as páginas são apresentadas por padrão sem qualquer JavaScript incluído. Como resultado, o site em produção provavelmente terá uma nota de desempenho de visita inicial superior com ferramentas de auditoria. + +Entretanto, devido a ausência de navegação SPA, links entre páginas acarretarão em recarregamentos de página completos. Navegações pós-carregamento no modo MPA não parecerão tão instantâneas quanto no modo SPA. + +Também note que não ter JavaScript por padrão significa que você está essencialmente utilizando Vue como modelo de linguagem no lado do servidor. Nenhum manipulador de evento será embutido no navegador, então não haverá interatividade. Para carregar JavaScript no lado do cliente, você precisará usar a tag especial ` + +# Olá +``` + +` +``` + +### Apresentando Conteúdo Cru {#rendering-raw-content} + +Parâmetros passados para a página serão serializados na carga JavaScript do cliente, portanto, evite passar dados pesados nos parâmetros, como Markdown cru ou conteúdo HTML obtido de um CMS remoto. + +Em vez disso, você pode passar tal conteúdo para cada página usando a propriedade `content` em cada objeto de caminho: + +```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 ou HTML cru + } + }) + } +} +``` + +Em seguida, use a seguinte sintaxe especial para apresentar o conteúdo como parte do próprio arquivo Markdown: + +```md + +``` diff --git a/docs/pt/guide/sitemap-generation.md b/docs/pt/guide/sitemap-generation.md new file mode 100644 index 00000000..c6f8d9b8 --- /dev/null +++ b/docs/pt/guide/sitemap-generation.md @@ -0,0 +1,53 @@ +# Geração de Sitemap {#sitemap-generation} + +VitePress vem com suporte embutido para gerar um arquivo `sitemap.xml` para seu site. Para habilitar, adicione o seguinte ao seu `.vitepress/config.js`: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + sitemap: { + hostname: 'https://example.com' + } +}) +``` + +Para ter tags `` em seu `sitemap.xml`, você pode habilitar a opção [`lastUpdated`](../reference/default-theme-last-updated). + +## Opções {#options} + +O suporte de Sietmap é alimentado pelo módulo [`sitemap`](https://www.npmjs.com/package/sitemap). Você pode passar qualquer uma das opções suportadas por ele na opção `sitemap` do seu arquivo de configuração. Esses serão passados diretamente ao construtor `SitemapStream`. Refira-se a [documentação `sitemap`](https://www.npmjs.com/package/sitemap#options-you-can-pass) para mais detalhes. Exemplo: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + sitemap: { + hostname: 'https://example.com', + lastmodDateOnly: false + } +}) +``` + +## Gancho `transformItems` + +Você pode usar o gancho `sitemap.transformItems` para modificar os itens do sitemap antes de eles serem escritos no arquivo `sitemap.xml`. Este gancho é chamado com um _array_ de itens sitemap e espera um _array_ de itens sitemap como retorno. Exemplo: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + sitemap: { + hostname: 'https://example.com', + transformItems: (items) => { + // adiciona novos itens ou modifica/filtra itens existentes + items.push({ + url: '/extra-page', + changefreq: 'monthly', + priority: 0.8 + }) + return items + } + } +}) +``` diff --git a/docs/pt/guide/ssr-compat.md b/docs/pt/guide/ssr-compat.md new file mode 100644 index 00000000..deec9a7b --- /dev/null +++ b/docs/pt/guide/ssr-compat.md @@ -0,0 +1,136 @@ +--- +outline: deep +--- + +# Compatibilidade SSR {#ssr-compatibility} + +VitePress pré-interpreta a aplicação no Node.js durante a compilação de produção, utilizando as capacidades de Interpretação do Lado do Servidor (SSR) do Vue. Isso significa que todo o código personalizado nos componentes do tema está sujeito à Compatibilidade SSR. + +A [seção SSR na documentação Vue oficial](https://vuejs.org/guide/scaling-up/ssr.html) fornece mais contexto sobre o que é SSR, a relação entre SSR / SSG e notas comuns sobre escrever código amigável a SSR. A regra geral é acessar apenas APIs do navegador / DOM nos gatilhos `beforeMount` ou `mounted` dos componentes Vue. + +## `` + +Se você estiver usando ou demonstrando componentes que não são compatíveis com SSR (por exemplo, contêm diretivas personalizadas), você pode envolvê-los no componente embutido ``: + +```md + + + +``` + +## Bibliotecas que Acessam a API do Navegador na Importação {#libraries-that-access-browser-api-on-import} + +Alguns componentes ou bibliotecas acessam APIs do navegador **na importação**. Para usar código que assume um ambiente de navegador na importação, você precisa importá-los dinamicamente. + +### Importando no Gatilho `mounted` {#importing-in-mounted-hook} + +```vue + +``` + +### Importação Condicional {#conditional-import} + +Você também pode importar condicionalmente uma dependência usando o sinalizador `import.meta.env.SSR` (parte das [variáveis de ambiente Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)): + +```js +if (!import.meta.env.SSR) { + import('./lib-que-acessa-window-na-importacao').then((module) => { + // usar código + }) +} +``` + +Como [`Theme.enhanceApp`](./custom-theme#theme-interface) pode ser assíncrono, você pode importar condicionalmente e registrar plugins Vue que acessam APIs do navegador na importação: + +```js +// .vitepress/theme/index.js +/** @type {import('vitepress').Theme} */ +export default { + // ... + async enhanceApp({ app }) { + if (!import.meta.env.SSR) { + const plugin = await import('plugin-que-acessa-window-na-importacao') + app.use(plugin.default) + } + } +} +``` + +Se estiver usando 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-que-acessa-window-na-importacao') + app.use(plugin.default) + } + } +} satisfies Theme +``` + +### `defineClientComponent` + +VitePress fornece um auxiliar de conveniência para importar componentes Vue que acessam APIs do navegador na importação. + +```vue + + + +``` + +Você também pode passar propriedades/filhos/_slots_ para o componente alvo: + +```vue + + + +``` + +O componente alvo só será importado no gatilho `mounted` do componente que o envolve. \ No newline at end of file diff --git a/docs/pt/guide/using-vue.md b/docs/pt/guide/using-vue.md new file mode 100644 index 00000000..6c2002ac --- /dev/null +++ b/docs/pt/guide/using-vue.md @@ -0,0 +1,255 @@ +# Usando Vue em Markdown {#using-vue-in-markdown} + +Em VitePress, cada arquivo Markdown é compilado para HTML e então processado como um [Componente de Arquivo Único Vue](https://vuejs.org/guide/scaling-up/sfc.html). Isso significa que você pode usar qualquer funcionalidade Vue dentro do Markdown, incluindo a interpolação dinâmica, usar componentes Vue ou lógica arbitrária de componentes Vue dentro da página adicionando uma tag ` + +## Conteúdo Markdown + +A contagem é: {{ count }} + + + + +``` + +::: warning Evite ` +``` + +## Usando _Teleports_ {#using-teleports} + +Vitepress atualmente oferece suporte a SSG para _teleports_ apenas para o corpo. Para outros alvos, você pode envolvê-los dentro do componente embutido `` ou injetar a marcação de _teleport_ na localização correta em sua página final HTML por meio do [gancho `postRender`](../reference/site-config#postrender). + + + +::: details +<<< @/components/ModalDemo.vue +::: + +```md + + +
+ // ... +
+
+
+``` + + + + diff --git a/docs/pt/guide/what-is-vitepress.md b/docs/pt/guide/what-is-vitepress.md new file mode 100644 index 00000000..835f5bd3 --- /dev/null +++ b/docs/pt/guide/what-is-vitepress.md @@ -0,0 +1,57 @@ +# O que é VitePress? {#what-is-vitepress} + +O VitePress é um [Gerador de Site Estático](https://en.wikipedia.org/wiki/Static_site_generator) (SSG) projetado para criar sites rápidos e centrados em conteúdo. Em suma, VitePress utiliza seu conteúdo-fonte escrito em [Markdown](https://en.wikipedia.org/wiki/Markdown), aplica um tema a ele e gera páginas HTML estáticas que podem ser facilmente implantadas em qualquer lugar. + +
+ +Quer apenas experimentar? Pule para o [Início Rápido](./getting-started). + +
+ +## Casos de Uso {#use-cases} + +- **Documentação** + + VitePress vem com um tema padrão projetado para documentação técnica. Ele alimenta esta página que você está lendo agora, juntamente com a documentação [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/) e [muitos outros](https://www.vuetelescope.com/explore?framework.slug=vitepress). + + A [documentação oficial Vue.js](https://vuejs.org/) também é baseada em VitePress, mas usa um tema personalizado compartilhado entre várias traduções. + +- **Blogs, Portfólios e Sites de Marketing** + + VitePress suporta [temas totalmente personalizáveis](./custom-theme), com a experiência de desenvolvedor padrão de uma aplicação Vite + Vue. A construção com Vite significa que você pode aproveitar diretamente plugins Vite de seu rico ecossistema. Adicionalmente, VitePress fornece APIs flexíveis para [carregar dados](./data-loading) (locais ou remotos) e [gerar rotas dinamicamente](./routing#dynamic-routes). Você pode usá-lo para construir praticamente qualquer coisa desde que os dados possam ser determinados no momento da construção. + + O [blog oficial Vue.js](https://blog.vuejs.org/) é um blog simples que gera sua página inicial baseada em conteúdo local. + +## Experiência de Desenvolvedor {#developer-experience} + +VitePress visa proporcionar excelente Experiência de Desenvolvedor (DX) ao trabalhar com conteúdo em Markdown. + +- **[Alimentado por Vite:](https://vitejs.dev/)** inicialização instantânea do servidor, com edições sempre refletidas instantaneamente (<100ms) sem recarregamento de página. + +- **[Extensões Markdown Integradas:](./markdown)** Frontmatter, tabelas, destaque de sintaxe... você escolhe. Especificamente, VitePress fornece muitos recursos avançados para trabalhar com blocos de código, tornando-o ideal para documentação altamente técnica. + +- **[Markdown Aprimorado por Vue:](./using-vue)** cada página Markdown é também um [Componente de Arquivo Único Vue](https://pt.vuejs.org/guide/scaling-up/sfc.html), graças à compatibilidade de sintaxe de 100% do template Vue com HTML. Você pode incorporar interatividade em seu conteúdo estático usando recursos de template Vue ou componentes Vue importados. + +## Desempenho {#performance} + +Ao contrário de muitos SSGs tradicionais, um site gerado pelo VitePress é na verdade uma [Aplicação de Página Única](https://en.wikipedia.org/wiki/Single-page_application) (SPA). + +- **Carregamento Inicial Rápido** + + A visita inicial a qualquer página será servida com o HTML estático pré-renderizado para velocidade de carregamento rápida e SEO otimizado. A página então carrega um pacote JavaScript que transforma a página em uma SPA Vue ("hidratação"). O processo de hidratação é extremamente rápido: no [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F), sites típicos VitePress alcançam pontuações de desempenho quase perfeitas, mesmo em dispositivos móveis de baixo desempenho com uma rede lenta. + +- **Navegação Rápida pós-carregamento** + + Mais importante ainda, o modelo SPA leva a uma melhor experiência do usuário **após** o carregamento inicial. A navegação subsequente dentro do site não causará mais uma recarga completa da página. Em vez disso, o conteúdo da página de entrada será buscado e atualizado dinamicamente. VitePress também pré-carrega automaticamente pedaços de página para links que estão dentro do viewport. Na maioria dos casos, a navegação pós-carregamento parecerá instantânea. + +- **Interatividade Sem Penalidades** + + Para ser capaz de hidratar as partes dinâmicas Vue incorporadas dentro do Markdown estático, cada página Markdown é processada como um componente Vue e compilada em JavaScript. Isso pode parecer ineficiente, mas o compilador Vue é inteligente o suficiente para separar as partes estáticas e dinâmicas, minimizando tanto o custo de hidratação quanto o tamanho da carga. Para o carregamento inicial da página, as partes estáticas são automaticamente eliminadas da carga JavaScript e puladas durante a hidratação. + +## E o VuePress? {#what-about-vuepress} + +VitePress é o sucessor espiritual de VuePress. VuePress era orginalmente baseado em Vue 2 e webpack. Com Vue 3 e Vite, VitePress oferece uma experiência de desenvolvedor significativamente melhor, melhor desempenho em produção, um tema padrão mais polido e uma API de personalização mais flexível. + +A diferença da API entre VitePress e VuePress reside principalmente em temas e personalização. Se você estiver usando VuePress 1 com o tema padrão, a migração para VitePress deve ser relativamente simples. + +Também houve esforço investido em VuePress 2, que também suporta Vue 3 e Vite com melhor compatibilidade do que VuePress 1. No entanto, manter dois SSGs em paralelo não é sustentável, então a equipe Vue decidiu focar em VitePress como o principal SSG recomendado a longo prazo. \ No newline at end of file diff --git a/docs/pt/index.md b/docs/pt/index.md new file mode 100644 index 00000000..41c72d54 --- /dev/null +++ b/docs/pt/index.md @@ -0,0 +1,57 @@ +--- +layout: home + +title: VitePress +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. + actions: + - theme: brand + text: Iniciar + link: /pt/guide/getting-started + - theme: alt + text: Ver no GitHub + link: https://github.com/vuejs/vitepress + image: + src: /vitepress-logo-large.webp + alt: VitePress + +features: + - icon: 📝 + title: Foco no seu conteúdo + details: Cria sites de documentação belos e sem esforço apenas com markdown. + - icon: + title: Aproveite a experiência Vite + details: Início de servidor instantâneo, atualizações ultrarrápidas, e plugins do ecossistema Vite. + - icon: + title: Personalize com Vue + details: Use sintaxe e componentes Vue diretamente em markdown, ou construa temas personalizados com Vue. + - icon: 🚀 + title: Entregue Sites Rápidos + details: Carregamento inicial rápido com HTML estático, navegação rápida com roteamento no lado do cliente. +--- + + diff --git a/docs/pt/reference/cli.md b/docs/pt/reference/cli.md new file mode 100644 index 00000000..6d7f0006 --- /dev/null +++ b/docs/pt/reference/cli.md @@ -0,0 +1,74 @@ +# Interface de Linha de Comando {#command-line-interface} + +## `vitepress dev` + +Inicia o servidor de desenvolvimento VitePress com o diretório designado como raiz. Por padrão usa o diretório atual. O comando `dev` pode também ser omitido ao rodar no diretório atual. + +### Uso + +```sh +# inicia no diretório atual, omitindo `dev` +vitepress + +# inicia em um subdiretório +vitepress dev [root] +``` + +### Opções {#options} + +| Opção | Descrição | +| --------------- | ----------------------------------------------------------------- | +| `--open [path]` | Abre o navegador na inicialização (`boolean \| string`) | +| `--port ` | Especifica porta (`number`) | +| `--base ` | Caminho base público (padrão: `/`) (`string`) | +| `--cors` | Habilita CORS | +| `--strictPort` | Interrompe se a porta especificada já está em uso (`boolean`) | +| `--force` | Força o otimizador a ignorar o cache e reempacotar (`boolean`) | + +## `vitepress build` + +Compila o site VitePress para produção. + +### Uso + +```sh +vitepress build [root] +``` + +### Opções + +| Opção | Descrição | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------- | +| `--mpa` (experimental) | Compila no [Modo MPA](../guide/mpa-mode) sem hidratação no lado do cliente (`boolean`) | +| `--base ` | Caminho base público (padrão: `/`) (`string`) | +| `--target ` | Transpila o alvo (padrão: `"modules"`) (`string`) | +| `--outDir ` | Diretório de saída relativo ao **cwd** (padrão: `/.vitepress/dist`) (`string`) | +| `--minify [minifier]` | Habilita/desabilita minificação, ou especifica um minificador para usar (padrão: `"esbuild"`) (`boolean \| "terser" \| "esbuild"`) | +| `--assetsInlineLimit ` | Limite em bytes para alinhar ativos em base64 (padrão: `4096`) (`number`) | + +## `vitepress preview` + +Prevê localmente a compilação de produção. + +### Uso + +```sh +vitepress preview [root] +``` + +### Opções + +| Opção | Descrição | +| --------------- | ------------------------------------------ | +| `--base ` | Caminho base público (padrão: `/`) (`string`) | +| `--port ` | Especifica porta (`number`) | + +## `vitepress init` + +Inicia o [Assistente de Instalação](../guide/getting-started#setup-wizard) no diretório atual. + +### Uso + +```sh +vitepress init +``` diff --git a/docs/pt/reference/default-theme-badge.md b/docs/pt/reference/default-theme-badge.md new file mode 100644 index 00000000..a96955a0 --- /dev/null +++ b/docs/pt/reference/default-theme-badge.md @@ -0,0 +1,69 @@ +# Emblema {#badge} + +O emblema permite adicionar status aos seus cabeçalhos. Por exemplo, pode ser útil especificar o tipo da seção ou a versão suportada. + +## Uso {#usage} + +Você pode usar o componente `Badge` que está disponível globalmente. + +```html +### Title +### Title +### Title +### Title +``` + +O código acima é apresentado como: + +### Title +### Title +### Title +### Title + +## Filiação Personalizada {#custom-children} + +`` aceita `children` (filhos), que serão exibidos no emblema. + +```html +### Title custom element +``` + +### Title custom element + +## Personalize o Tipo de Cor {#customize-type-color} + +Você pode personalizar o estilo dos emblemas sobrepondo variáveis ​​CSS. Os seguintes são os valores padrão: + +```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); +} +``` + +## `` + +O componente `` aceita as seguintes propriedades: + +```ts +interface Props { + // Quando `` é passado, esse valor é ignorado. + text?: string + + // O padrão é `tip`. + type?: 'info' | 'tip' | 'warning' | 'danger' +} +``` diff --git a/docs/pt/reference/default-theme-carbon-ads.md b/docs/pt/reference/default-theme-carbon-ads.md new file mode 100644 index 00000000..1c4d4e60 --- /dev/null +++ b/docs/pt/reference/default-theme-carbon-ads.md @@ -0,0 +1,22 @@ +# Carbon Ads {#carbon-ads} + +VitePress tem suporte embutido para [Carbon Ads](https://www.carbonads.net/). Ao definir as credenciais Carbon Ads na configuração, VitePress mostrará anúncios na página. + +```js +export default { + themeConfig: { + carbonAds: { + code: 'seu-código-carbon', + placement: 'sua-veiculação-carbon' + } + } +} +``` + +Esses valores são usados para chamar o sript em CDN do carbon como mostrado abaixo. + +```js +`//cdn.carbonads.com/carbon.js?serve=${code}&placement=${placement}` +``` + +Para aprender mais sobre a configuração Carbon Ads, por favor visite [Site Carbon Ads](https://www.carbonads.net/). diff --git a/docs/pt/reference/default-theme-config.md b/docs/pt/reference/default-theme-config.md new file mode 100644 index 00000000..361475fc --- /dev/null +++ b/docs/pt/reference/default-theme-config.md @@ -0,0 +1,451 @@ +# Configuração do Tema Padrão {#default-theme-config} + +A configuração do tema permite que você personalize seu tema. Você pode definir a configuração do tema através da opção `themeConfig` no arquivo de configuração: + +```ts +export default { + lang: 'pt-BR', + title: 'VitePress', + description: 'Gerador de site estático Vite & Vue.', + + // Configurações relacionadas ao tema. + themeConfig: { + logo: '/logo.svg', + nav: [...], + sidebar: { ... } + } +} +``` + +**As opções documentadas nesta página se aplicam apenas ao tema padrão.** Temas diferentes esperam configurações de tema diferentes. Ao usar um tema personalizado, o objeto de configuração do tema será passado para o tema para que se possam definir comportamentos condicionais. + +## i18nRouting + +- Tipo: `boolean` + +Alterar o local para, por exemplo, `zh` alterará a URL de `/foo` (ou `/en/foo/`) para `/zh/foo`. Você pode desativar esse comportamento definindo `themeConfig.i18nRouting` como `false`. + +## logo + +- Tipo: `ThemeableImage` + +Arquivo de logo a ser exibido na barra de navegação, logo antes do título do site. Aceita um caminho em string, ou um objeto para definir um logo diferente para os modos claro/escuro. + +```ts +export default { + themeConfig: { + logo: '/logo.svg' + } +} +``` + +```ts +type ThemeableImage = + | string + | { src: string; alt?: string } + | { light: string; dark: string; alt?: string } +``` + +## siteTitle + +- Tipo: `string | false` + +Você pode personalizar este item para substituir o título padrão do site (`title` na configuração da aplicação) na navegação. Quando definido como `false`, o título na navegação será desativado. Útil quando você tem um `logo` que já contém o título do site. + +```ts +export default { + themeConfig: { + siteTitle: 'Olá Mundo' + } +} +``` + +## nav + +- Tipo: `NavItem` + +A configuração para o item do menu de navegação. Mais detalhes em [Tema Padrão: Navegação](./default-theme-nav#navigation-links). + +```ts +export default { + themeConfig: { + nav: [ + { text: 'Guia', link: '/guide' }, + { + text: 'Menu Dropdown', + items: [ + { text: 'Item A', link: '/item-1' }, + { text: 'Item B', link: '/item-2' }, + { text: 'Item C', link: '/item-3' } + ] + } + ] + } +} +``` + +```ts +type NavItem = NavItemWithLink | NavItemWithChildren + +interface NavItemWithLink { + text: string + link: string + activeMatch?: string + target?: string + rel?: string +} + +interface NavItemChildren { + text?: string + items: NavItemWithLink[] +} + +interface NavItemWithChildren { + text?: string + items: (NavItemChildren | NavItemWithLink)[] + activeMatch?: string +} +``` + +## sidebar + +- Tipo: `Sidebar` + +A configuração para o item do menu da barra lateral. Mais detalhes em [Tema Padrão: Barra Lateral](./default-theme-sidebar). + +```ts +export default { + themeConfig: { + sidebar: [ + { + text: 'Guia', + items: [ + { text: 'Introdução', link: '/introduction' }, + { text: 'Começando', link: '/getting-started' }, + ... + ] + } + ] + } +} +``` + +```ts +export type Sidebar = SidebarItem[] | SidebarMulti + +export interface SidebarMulti { + [path: string]: SidebarItem[] +} + +export type SidebarItem = { + /** + * O rótulo de texto do item. + */ + text?: string + + /** + * O link do item. + */ + link?: string + + /** + * Os filhos do item. + */ + items?: SidebarItem[] + + /** + * Se não especificado, o grupo não é retrátil. + * + * Se `true`, o grupo é retrátil e é colapsado por padrão. + * + * Se `false`, o grupo é retrátil, mas expandido por padrão. + */ + collapsed?: boolean +} +``` + +## aside + +- Tipo: `boolean | 'left'` +- Padrão: `true` +- Pode ser anulado por página via [frontmatter](./frontmatter-config#aside) + +Definir este valor como `false` impede a apresentação do elemento aside.\ +Definir este valor como `true` apresenta o aside à direita.\ +Definir este valor como `left` apresenta o aside à esquerda. + +Se você quiser desativá-lo para todas as visualizações, você deve usar `outline: false` em vez disso. + +## outline + +- Tipo: `Outline | Outline['level'] | false` +- O nível pode ser sobreposto por página via [frontmatter](./frontmatter-config#outline) + +Definir este valor como `false` impede a apresentação do elemento _outline_. Consulte a interface para obter mais detalhes: + +```ts +interface Outline { + /** + * Os níveis de títulos a serem exibidos na outline. + * Um único número significa que apenas os títulos desse nível serão exibidos. + * Se uma tupla for passada, o primeiro número é o nível mínimo e o segundo número é o nível máximo. + * `'deep'` é o mesmo que `[2, 6]`, o que significa que todos os títulos de `

` a `

` serão exibidos. + * + * @default 2 + */ + level?: number | [number, number] | 'deep' + + /** + * O título a ser exibido na outline. + * + * @default 'On this page' + */ + label?: string +} +``` + +## socialLinks + +- Tipo: `SocialLink[]` + +Você pode definir esta opção para mostrar os links de redes sociais com ícones na navegação. + +```ts +export default { + themeConfig: { + socialLinks: [ + { icon: 'github', link: 'https://github.com/vuejs/vitepress' }, + { icon: 'twitter', link: '...' }, + // Você também pode adicionar ícones personalizados passando SVG como string: + { + icon: { + svg: 'Dribbble' + }, + link: '...', + // Você também pode incluir um rótulo personalizado para acessibilidade (opcional mas recomendado): + ariaLabel: 'cool link' + } + ] + } +} +``` + +```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 + +- Tipo: `Footer` +- Pode ser sobreposto por página via [frontmatter](./frontmatter-config#footer) + +Configuração do rodapé. Você pode adicionar uma mensagem ou texto de direitos autorais no rodapé, no entanto, ela só será exibida quando a página não contiver uma barra lateral. Isso se deve a preocupações de design. + +```ts +export default { + themeConfig: { + footer: { + message: 'Lançado sob a Licença MIT.', + copyright: 'Direitos autorais © 2019-presente Evan You' + } + } +} +``` + +```ts +export interface Footer { + message?: string + copyright?: string +} +``` + +## editLink + +- Tipo: `EditLink` +- Pode ser sobreposto por página via [frontmatter](./frontmatter-config#editlink) + +O _EditLink_ permite exibir um link para editar a página em serviços de gerenciamento Git, como GitHub ou GitLab. Consulte [Tema Padrão: Editar Link](./default-theme-edit-link) para mais detalhes. + +```ts +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', + text: 'Editar esta página no GitHub' + } + } +} +``` + +```ts +export interface EditLink { + pattern: string + text?: string +} +``` + +## lastUpdated + +- Tipo: `LastUpdatedOptions` + +Permite personalização para o texto de última atualização e o formato de data. + +```ts +export default { + themeConfig: { + lastUpdated: { + text: 'Atualizado em', + 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 + +- Tipo: `AlgoliaSearch` + +Uma opção para dar suporte à pesquisa em seu site de documentação usando [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Saiba mais em [Tema Padrão: Pesquisa](./default-theme-search). + +```ts +export interface AlgoliaSearchOptions extends DocSearchProps { + locales?: Record> +} +``` + +Veja todas as opções [aqui](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts). + +## carbonAds {#carbon-ads} + +- Tipo: `CarbonAdsOptions` + +Uma opção para mostrar [Carbon Ads](https://www.carbonads.net/). + +```ts +export default { + themeConfig: { + carbonAds: { + code: 'seu-código-carbon', + placement: 'sua-veiculação-carbon' + } + } +} +``` + +```ts +export interface CarbonAdsOptions { + code: string + placement: string +} +``` + +Saiba mais em [Tema Padrão: Carbon Ads](./default-theme-carbon-ads). + +## docFooter + +- Tipo: `DocFooter` + +Pode ser usado para personalizar o texto que aparece acima dos links anterior e próximo. Útil se não estiver escrevendo documentação em inglês. Também pode ser usado para desabilitar globalmente os links anterior/próximo. Se você quiser ativar/desativar seletivamente os links anterior/próximo, pode usar [frontmatter](./default-theme-prev-next-links). + +```ts +export default { + themeConfig: { + docFooter: { + prev: 'Página anterior', + next: 'Próxima página' + } + } +} +``` + +```ts +export interface DocFooter { + prev?: string | false + next?: string | false +} +``` + +## darkModeSwitchLabel + +- Tipo: `string` +- Padrão: `Appearance` + +Pode ser usado para personalizar o rótulo do botão de modo escuro. Esse rótulo é exibido apenas na visualização móvel. + +## lightModeSwitchTitle + +- Tipo: `string` +- Padrão: `Switch to light theme` + +Pode ser usado para personalizar o título do botão de modo claro que aparece ao passar o mouse. + +## darkModeSwitchTitle + +- Tipo: `string` +- Padrão: `Switch to dark theme` + +Pode ser usado para personalizar o título do botão de modo escuro que aparece ao passar o mouse. + +## sidebarMenuLabel + +- Tipo: `string` +- Padrão: `Menu` + +Pode ser usado para personalizar o rótulo do menu da barra lateral. Esse rótulo é exibido apenas na visualização móvel. + +## returnToTopLabel + +- Tipo: `string` +- Padrão: `Return to top` + +Pode ser usado para personalizar o rótulo do botão de retorno ao topo. Esse rótulo é exibido apenas na visualização móvel. + +## langMenuLabel + +- Tipo: `string` +- Padrão: `Change language` + +Pode ser usado para personalizar o aria-label do botão de idioma na barra de navegação. Isso é usado apenas se você estiver usando [i18n](../guide/i18n). + +## externalLinkIcon + +- Tipo: `boolean` +- Padrão: `false` + +Se deve mostrar um ícone de link externo ao lado de links externos no markdown. diff --git a/docs/pt/reference/default-theme-edit-link.md b/docs/pt/reference/default-theme-edit-link.md new file mode 100644 index 00000000..6b1e8793 --- /dev/null +++ b/docs/pt/reference/default-theme-edit-link.md @@ -0,0 +1,60 @@ +# Editar Link {#edit-link} + +## Configuração a nível de Site {#site-level-config} + +Editar Link permite que você mostre um link para editar a página com serviços de gerenciamento Git, como GitHub ou GitLab. Para habilitar, adicione a opção `themeConfig.editLink` na sua configuração. + +```js +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path' + } + } +} +``` + +A opção `pattern` define a estrutura da URL para o link, e `:path` será substituído com o mesmo caminho de página. + +Você também pode colocar uma função pura que aceita [`PageData`](./runtime-api#usedata) como argumento e retorna uma URL em string. + +```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}` + } + } + } + } +} +``` + +Isso não deve gerar efeitos colaterais ou acessar qualquer coisa fora do seu escopo, uma vez que será serializado e executado no navegador. + +Por padrão, isso irá adicionar o link com texto "Edite essa página" no final da página de documentação. Você pode personalizar esse texto ao definir a opção `text`. + +```js +export default { + themeConfig: { + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', + text: 'Edite essa página no GitHub' + } + } +} +``` + +## Configuração Frontmatter {#frontmatter-config} + +A funcionalidade pode ser desabilitada por página usando a opção `editLink` no frontmatter: + +```yaml +--- +editLink: false +--- +``` diff --git a/docs/pt/reference/default-theme-footer.md b/docs/pt/reference/default-theme-footer.md new file mode 100644 index 00000000..98b02b2c --- /dev/null +++ b/docs/pt/reference/default-theme-footer.md @@ -0,0 +1,53 @@ +# Rodapé {#footer} + +VitePress irá mostrar o rodapé global na parte inferior da página quando `themeConfig.footer` está presente. + +```ts +export default { + themeConfig: { + footer: { + message: 'Lançado sob Licença MIT.', + copyright: 'Direitos Reservados © 2019-present Evan You' + } + } +} +``` + +```ts +export interface Footer { + // A mensagem mostrada logo antes do copyright. + message?: string + + // O próprio texto de copyright. + copyright?: string +} +``` + +A configuração acima também suporta strings HTML. Então, por exemplo, se você quiser configurar o texto de rodapé para ter alguns links, você pode ajustar a configuração como o seguinte: + +```ts +export default { + themeConfig: { + footer: { + message: 'Lançado sob Licença MIT.', + copyright: 'Direitos Reservados © 2019-present Evan You' + } + } +} +``` + +::: warning +Apenas elementos _inline_ serão usados em `message` e `copyright` conforme eles são apresentados dentro do elemento `

`. Se você quiser adicionar elementos de tipo _block_, considere usar o _slot_ [`layout-bottom`](../guide/extending-default-theme#layout-slots). +::: + +Note que o rodapé não será mostrado quando a [Barra Lateral](./default-theme-sidebar) estiver visível. + +## Configuração Frontmatter {#frontmatter-config} + +Isso pode ser desabilitado por página usando a opção `footer` em frontmatter: + +```yaml +--- +footer: false +--- +``` \ No newline at end of file diff --git a/docs/pt/reference/default-theme-home-page.md b/docs/pt/reference/default-theme-home-page.md new file mode 100644 index 00000000..460c55bf --- /dev/null +++ b/docs/pt/reference/default-theme-home-page.md @@ -0,0 +1,168 @@ +# Página Inicial {#home-page} + +O tema padrão VitePress fornece um layout de página inicial, que você também pode ver em uso [na página inicial deste site](../). Você pode usá-lo em qualquer uma de suas páginas especificando `layout: home` em [frontmatter](./frontmatter-config). + +```yaml +--- +layout: home +--- +``` + +No entanto, essa opção sozinha não faz muito. Você pode adicionar várias "seções" diferentes pré-modeladas à página inicial definindo opções adicionais como `hero` e `features`. + +## Seção Hero {#hero-section} + +A seção _Hero_ fica no topo da página inicial. Aqui segue como você pode configurar a seção _Hero_. + +```yaml +--- +layout: home + +hero: + name: VitePress + text: Gerador de site estático com Vite & Vue. + tagline: Lorem ipsum... + image: + src: /logo.png + alt: VitePress + actions: + - theme: brand + text: Iniciar + link: /guide/what-is-vitepress + - theme: alt + text: Ver no GitHub + link: https://github.com/vuejs/vitepress +--- +``` + +```ts +interface Hero { + // A string mostrada acima de `text`. Vem com a cor da marca + // e espera-se que seja curta, como o nome do produto. + name?: string + + // O texto principal para a seção hero. + // Isso será definido como uma tag `h1`. + text: string + + // Slogan exibido abaixo de `text`. + tagline?: string + + // A imagem é exibida ao lado da área de texto e slogan. + image?: ThemeableImage + + // Botões acionáveis para exibir na seção hero da página inicial. + actions?: HeroAction[] +} + +type ThemeableImage = + | string + | { src: string; alt?: string } + | { light: string; dark: string; alt?: string } + +interface HeroAction { + // Tema de cor do botão. Padrão: `brand`. + theme?: 'brand' | 'alt' + + // Rótulo do botão. + text: string + + // Destino do link do botão. + link: string + + // Atributo target do link. + target?: string + + // Atributo rel do link. + rel?: string +} +``` + +### Personalizando a cor do nome {#customizing-the-name-color} + +VitePress usa a cor da marca (`--vp-c-brand-1`) para `name`. No entanto, você pode personalizar essa cor sobrescrevendo a variável `--vp-home-hero-name-color`. + +```css +:root { + --vp-home-hero-name-color: blue; +} +``` + +Você também pode personalizá-la ainda mais combinando `--vp-home-hero-name-background` para dar ao `name` uma cor degradê. + +```css +:root { + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient(120deg, #bd34fe, #41d1ff); +} +``` + +## Seção de Funcionalidades {#features-section} + +Na seção de funcionalidades, você pode listar qualquer número de funcionalidades que deseja mostrar imediatamente após a seção _Hero_. Para configurá-la, passe a opção `features` para o frontmatter. + +Você pode fornecer um ícone para cada funcionalidade, que pode ser um emoji ou qualquer tipo de imagem. Quando o ícone configurado é uma imagem (svg, png, jpeg...), você deve fornecer o ícone com a largura e altura apropriadas; você também pode fornecer a descrição, seu tamanho intrínseco, bem como suas variantes para temas escuros e claros quando necessário. + +```yaml +--- +layout: home + +features: + - icon: 🛠️ + title: Simples e minimalista, sempre + details: Lorem ipsum... + - icon: + src: /cool-feature-icon.svg + title: Outro recurso legal + details: Lorem ipsum... + - icon: + dark: /dark-feature-icon.svg + light: /light-feature-icon.svg + title: Outro recurso legal + details: Lorem ipsum... +--- +``` + +```ts +interface Feature { + // Mostra ícone em cada bloco de funcionalide. + icon?: FeatureIcon + + // Título da funcionalidade. + title: string + + // Detalhes da funcionalidade. + details: string + + // Link quando clicado no componente de funcionalidade. + // O link pode ser interno ou externo. + // + // ex. `guide/reference/default-theme-home-page` ou `https://example.com` + link?: string + + // Texto do link a ser exibido dentro do componente de funcionalidade. + // Melhor usado com a opção `link`. + // + // ex. `Saiba mais`, `Visitar página`, etc. + linkText?: string + + // Atributo rel do link para a opção `link`. + // + // ex. `external` + rel?: string + + // Atributo target do link para a opção `link`. + target?: string +} + +type FeatureIcon = + | string + | { src: string; alt?: string; width?: string; height: string } + | { + light: string + dark: string + alt?: string + width?: string + height: string + } +``` diff --git a/docs/pt/reference/default-theme-last-updated.md b/docs/pt/reference/default-theme-last-updated.md new file mode 100644 index 00000000..5bc782e1 --- /dev/null +++ b/docs/pt/reference/default-theme-last-updated.md @@ -0,0 +1,27 @@ +# Última Atualização {#last-updated} + +O tempo em que o conteúdo foi atualizado pela última vez será mostrado no canto inferior direito da página. Para habilitar, adicione a opção `lastUpdated` na sua configuração. + +::: tip +Você precisa fazer _commit_ no arquivo markdown para ver o tempo atualizado. +::: + +## Configuração a nível de Site {#site-level-config} + +```js +export default { + lastUpdated: true +} +``` + +## Configuração Frontmatter {#frontmatter-config} + +Isso pode ser desabilitado por página usando a opção `lastUpdated` no frontmatter: + +```yaml +--- +lastUpdated: false +--- +``` + +Refira-se ao [Tema Padrão: Última Atualização](./default-theme-config#lastupdated) para mais detalhes. Qualquer valor positivo a nível de tema também habilitará a funcionalidade a não ser que esteja explicitamente desabilitada a nível de página ou de site. diff --git a/docs/pt/reference/default-theme-layout.md b/docs/pt/reference/default-theme-layout.md new file mode 100644 index 00000000..0e4d0162 --- /dev/null +++ b/docs/pt/reference/default-theme-layout.md @@ -0,0 +1,62 @@ +# Layout {#layout} + +Você pode escolher o layout da página definindo a opção de `layout` para o [frontmatter](./frontmatter-config) da página. Há três opções de layout: `doc`, `page` e `home`. Se nada for especificado, a página será tratada como página `doc`. + +```yaml +--- +layout: doc +--- +``` + +## Layout do documento {#doc-layout} + +A opção `doc` é o layout padrão e estiliza todo o conteúdo Markdown com o visual de "documentação". Ela funciona agrupando todo o conteúdo na classe CSS `vp-doc`, e aplicando os estilos aos elementos abaixo dela. + +Quase todos os elementos genéricos, como `p` ou `h2`, recebem um estilo especial. Portanto, lembre-se de que se você adicionar qualquer HTML personalizado dentro de um conteúdo Markdown, ele também será afetado por esses estilos. + +Ele também fornece recursos específicos de documentação listados abaixo. Esses recursos estão habilitados apenas neste layout. + +- Editar link +- Links Anterior e Próximo +- _Outline_ +- [Carbon Ads](./default-theme-carbon-ads) + +## Layout da Página {#page-layout} + +A opção `page` é tratada como "página em branco". O Markdown ainda será processado e todas as [Extensões Markdown](../guide/markdown) funcionarão da mesma forma que o layout `doc`, mas este não receberá nenhum estilo padrão. + +O layout da página permitirá que você estilize tudo sem que o tema VitePress afete a marcação. Isso é útil quando você deseja criar sua própria página personalizada. + +Observe que mesmo neste layout, a barra lateral ainda aparecerá se a página tiver uma configuração de barra lateral correspondente. + +## Layout da Home {#home-layout} + +A opção `home` gerará um modelo de _"Homepage"_. Nesse layout você pode definir opções extras, como `hero` e `features`, para personalizar ainda mais o conteúdo. Visite [Tema padrão: Página Inicial](./default-theme-home-page) para obter mais detalhes. + +## Sem Layout {#no-layout} + +Se você não quiser nenhum layout, pode passar `layout: false` pelo frontmatter. Esta opção é útil se você deseja uma página de destino totalmente personalizável (sem barra lateral, barra de navegação ou rodapé por padrão). + +## Layout Personalizado {#custom-layout} + +Você também pode usar um layout personalizado: + +```md +--- +layout: foo +--- +``` + +Isto irá procurar um componente chamado `foo` registrado no contexto. Por exemplo, você pode registrar seu componente globalmente em `.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/pt/reference/default-theme-nav.md b/docs/pt/reference/default-theme-nav.md new file mode 100644 index 00000000..5f0d2399 --- /dev/null +++ b/docs/pt/reference/default-theme-nav.md @@ -0,0 +1,162 @@ +# Navegação {#nav} + +Referente a barra de navegação exibida no topo da página. Ela contém o título do site, links do menu global, e etc. + +## Título do Site e Logo {#site-title-and-logo} + +Por padrão, a navegação mostra o título do site referenciando o valor de [`config.title`](./site-config#title). Se desejar alterar o que é exibido na navegação, você pode definir um texto personalizado na opção `themeConfig.siteTitle`. + +```js +export default { + themeConfig: { + siteTitle: 'Meu Título Personalizado' + } +} +``` + +Se você tiver um logo para seu site, pode mostrá-lo passando o caminho para a imagem. Você deve colocar o logo diretamente dentro da pasta `public`, e definir o caminho absoluto para ele. + +```js +export default { + themeConfig: { + logo: '/my-logo.svg' + } +} +``` + +Ao adicionar um logo, ele é mostrado juntamente com o título do site. Se seu logo tem tudo o que você precisa e se você desejar ocultar o texto do título, defina `false` na opção `siteTitle`. + +```js +export default { + themeConfig: { + logo: '/my-logo.svg', + siteTitle: false + } +} +``` + +Você também pode passar um objeto como logo se quiser adicionar um atributo `alt` ou personalizá-lo com base no modo claro/escuro. Consulte [`themeConfig.logo`](./default-theme-config#logo) para obter detalhes. + +## Links de Navegação {#navigation-links} + +Você pode definir a opção `themeConfig.nav` para adicionar links à sua navegação. + +```js +export default { + themeConfig: { + nav: [ + { text: 'Guia', link: '/guide' }, + { text: 'Configuração', link: '/config' }, + { text: 'Registro de Alterações', link: 'https://github.com/...' } + ] + } +} +``` + +`text` é o próprio texto mostrado na navegação, e o `link` é o link para o qual será navegado quando o texto for clicado. Para o link, defina o caminho para o próprio arquivo sem o prefixo `.md` e sempre comece com `/`. + +Links de navegação também podem ser menus _dropdown_. Para fazer isso, defina a chave `items` na opção do link. + +```js +export default { + themeConfig: { + nav: [ + { text: 'Guia', link: '/guide' }, + { + text: 'Menu Dropdown', + items: [ + { text: 'Item A', link: '/item-1' }, + { text: 'Item B', link: '/item-2' }, + { text: 'Item C', link: '/item-3' } + ] + } + ] + } +} +``` + +Note que o título do menu _dropdown_ (`Menu Dropdown` no exemplo acima) não pode ter a propriedade `link`, pois ele se torna um botão para abrir o diálogo dropdown. + +Você também pode adicionar "seções" aos itens do menu _dropdown_ passando mais itens aninhados. + +```js +export default { + themeConfig: { + nav: [ + { text: 'Guia', link: '/guia' }, + { + text: 'Menu Dropdown', + items: [ + { + // Título da seção. + text: 'Título da Seção A', + items: [ + { text: 'Item A da Seção A', link: '...' }, + { text: 'Item B da Seção B', link: '...' } + ] + } + ] + }, + { + text: 'Menu Dropdown', + items: [ + { + // Você também pode omitir o título. + items: [ + { text: 'Item A da Seção A', link: '...' }, + { text: 'Item B da Seção B', link: '...' } + ] + } + ] + } + ] + } +} +``` + +### Personalizar o estado "ativo" do link {#customize-link-s-active-state} + +Os itens do menu de navegação serão destacados quando a página atual estiver no caminho correspondente. Se desejar personalizar o caminho a ser correspondido, defina a propriedade `activeMatch` e regex como um valor em string. + +```js +export default { + themeConfig: { + nav: [ + // Este link fica no estado ativo quando + // o usuário está no caminho `/config/`. + { + text: 'Guia', + link: '/guide', + activeMatch: '/config/' + } + ] + } +} +``` + +::: warning +`activeMatch` deve ser uma string regex, mas você deve defini-la como uma string. Não podemos usar um objeto RegExp real aqui porque ele não é serializável durante o momento de construção. +::: + +### Personalizar os atributos "target" e "rel" de links {#customize-link-s-target-and-rel-attributes} + +Por padrão, VitePress determina automaticamente os atributos `target` e `rel` baseado em um link externo ou não. Mas se você quiser, também pode personalizá-los. + +```js +export default { + themeConfig: { + nav: [ + { + text: 'Merchandise', + link: 'https://www.thegithubshop.com/', + target: '_self', + rel: 'sponsored' + } + ] + } +} +``` + +## Links Sociais {#social-links} + +Consulte [`socialLinks`](./default-theme-config#sociallinks). diff --git a/docs/pt/reference/default-theme-prev-next-links.md b/docs/pt/reference/default-theme-prev-next-links.md new file mode 100644 index 00000000..c9472a24 --- /dev/null +++ b/docs/pt/reference/default-theme-prev-next-links.md @@ -0,0 +1,43 @@ +# Links Anterior e Próximo {#prev-next-links} + +Você pode personalizar o texto e o link para os botões de Anterior e Próximo mostrados ao fim da página. Isso é útil quando você quer mostrar um texto diferente daquele que você tem na barra lateral. Além disso, você pode achar útil desabilitar o rodapé ou link para a página para ela não ser incluída na sua barra lateral. + +## prev + +- Tipo: `string | false | { text?: string; link?: string }` + +- Detalhes: + + Especifica o texto/link para mostrar no link para a página anterior. Se você não ver isso no frontmatter, o texto/link será inferido da configuração da barra lateral. + +- Exemplos: + + - Para personalizar apenas o texto: + + ```yaml + --- + prev: 'Iniciar | Markdown' + --- + ``` + + - Para personalizar ambos texto e link: + + ```yaml + --- + prev: + text: 'Markdown' + link: '/guide/markdown' + --- + ``` + + - Para esconder a página anterior: + + ```yaml + --- + prev: false + --- + ``` + +## next + +O mesmo que `prev` mas para a próxima página. diff --git a/docs/pt/reference/default-theme-search.md b/docs/pt/reference/default-theme-search.md new file mode 100644 index 00000000..35b0d812 --- /dev/null +++ b/docs/pt/reference/default-theme-search.md @@ -0,0 +1,379 @@ +--- +outline: deep +--- + +# Pesquisa {#search} + +## Pesquisa Local {#local-search} + +VitePress oferece suporte à pesquisa de texto completa usando um índice no navegador graças ao [minisearch](https://github.com/lucaong/minisearch/). Para habilitar esse recurso, basta definir a opção `themeConfig.search.provider` como `'local'` no arquivo `.vitepress/config.ts`: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local' + } + } +}) +``` + +Exemplo de resultado: + +![captura de tela do modal de pesquisa](/search.png) + +Alternativamente, você pode usar [Algolia DocSearch](#algolia-search) ou alguns plugins da comunidade como ou . + +### i18n {#local-search-i18n} + +Você pode usar uma configuração como esta para usar a pesquisa multilínguas: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'local', + options: { + locales: { + zh: { + translations: { + button: { + buttonText: '搜索文档', + buttonAriaLabel: '搜索文档' + }, + modal: { + noResultsText: '无法找到相关结果', + resetButtonTitle: '清除查询条件', + footer: { + selectText: '选择', + navigateText: '切换' + } + } + } + } + } + } + } + } +}) +``` + +### Opções MiniSearch {#mini-search-options} + +Você pode configurar o MiniSearch assim: + +```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: { + /* ... */ + } + } + } + } + } +}) +``` + +Saiba mais na [documentação do MiniSearch](https://lucaong.github.io/minisearch/classes/MiniSearch.MiniSearch.html). + +### Apresentador de Conteúdo Personalizado {#custom-content-renderer} + +Você pode personalizar a função usada para apresentar o conteúdo markdown antes de indexá-lo: + +```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) { + // retorne a string HTML + } + } + } + } +}) +``` + +Essa função será removida dos dados do site no lado do cliente, então você pode usar APIs do Node.js nela. + +#### Exemplo: Excluindo páginas da pesquisa {#example-excluding-pages-from-search} + +Você pode excluir páginas da pesquisa adicionando `search: false` ao frontmatter da página. Alternativamente: + +```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('algum/caminho')) return '' + return html + } + } + } + } +}) +``` + +::: warning Nota +No caso uma função `_render` personalizada ser fornecida, você precisa manipular o `search: false` do frontmatter por conta própria. Além disso, o objeto `env` não estará completamente populado antes que `md.render` seja chamado, então verificações em propriedades opcionais `env`, como `frontmatter`, devem ser feitas após isso. +::: + +#### Exemplo: Transformando conteúdo - adicionando âncoras {#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 + } + } + } + } +}) +``` + +## Pesquisa Algolia {#algolia-search} + +VitePress oferece suporte à pesquisa em seu site de documentação usando [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Consulte o guia de início deles. Em seu arquivo `.vitepress/config.ts`, você precisará fornecer pelo menos o seguinte para que funcione: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...' + } + } + } +}) +``` + +### i18n {#algolia-search-i18n} {#algolia-search-i18n} + +Você pode usar uma configuração como esta para usar a pesquisa multilínguas: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + search: { + provider: 'algolia', + options: { + appId: '...', + apiKey: '...', + indexName: '...', + locales: { + zh: { + 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: '点击反馈' + } + } + } + } + } + } + } + } +}) +``` + +[Essas opções](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) podem ser sobrepostas. Consulte a documentação oficial Algolia para obter mais informações sobre elas. + +### Configuração _Crawler_ {#crawler-config} + +Aqui está um exemplo de configuração baseado na qual este site usa: + +```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/pt/reference/default-theme-sidebar.md b/docs/pt/reference/default-theme-sidebar.md new file mode 100644 index 00000000..62c3b3b1 --- /dev/null +++ b/docs/pt/reference/default-theme-sidebar.md @@ -0,0 +1,215 @@ +# Barra Lateral {#sidebar} + +A barra lateral é o bloco principal de navegação da sua documentação. Você pode configurar o menu da barra lateral em [`themeConfig.sidebar`](./default-theme-config#sidebar). + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Guia', + items: [ + { text: 'Introdução', link: '/introduction' }, + { text: 'Iniciando', link: '/getting-started' }, + ... + ] + } + ] + } +} +``` + +## O Básico {#the-basics} + +A forma mais simples do menu da barra lateral é passar um único _array_ de links. O item do primeiro nível define a "seção" da barra lateral. Ele deve conter `text`, que é o título da seção, e `items` que são os próprios links de navegação. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Título da Seção A', + items: [ + { text: 'Item A', link: '/item-a' }, + { text: 'Item B', link: '/item-b' }, + ... + ] + }, + { + text: 'Título da Seção B', + items: [ + { text: 'Item C', link: '/item-c' }, + { text: 'Item D', link: '/item-d' }, + ... + ] + } + ] + } +} +``` + +Cada `link` deve especificar o caminho para o próprio arquivo começando com `/`. Se você adicionar uma barra no final do link, será mostrado o `index.md` do diretório correspondente. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Guia', + items: [ + // Isso mostra a página `/guide/index.md`. + { text: 'Introdução', link: '/guide/' } + ] + } + ] + } +} +``` + +Você pode aninhar ainda mais os itens da barra lateral até 6 níveis de profundidade contando a partir do nível raiz. Note que níveis mais profundos que 6 serão ignorados e não serão exibidos na barra lateral. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Nível 1', + items: [ + { + text: 'Nível 2', + items: [ + { + text: 'Nível 3', + items: [ + ... + ] + } + ] + } + ] + } + ] + } +} +``` + +## Múltiplas Barras Laterais {#multiple-sidebars} + +Você pode mostrar uma barra lateral diferente dependendo do caminho da página. Por exemplo, como mostrado neste site, você pode querer criar seções separadas de conteúdo em sua documentação, como a página "Guia" e a página "Configuração". + +Para fazer isso, primeiro organize suas páginas em diretórios para cada seção desejada: + +``` +. +├─ guide/ +│ ├─ index.md +│ ├─ one.md +│ └─ two.md +└─ config/ + ├─ index.md + ├─ three.md + └─ four.md +``` + +Em seguida, atualize sua configuração para definir sua barra lateral para cada seção. Desta vez, você deve passar um objeto em vez de um array. + +```js +export default { + themeConfig: { + sidebar: { + // Esta barra lateral é exibida quando um usuário + // está no diretório `guide`. + '/guide/': [ + { + text: 'Guia', + items: [ + { text: 'Índice', link: '/guide/' }, + { text: 'Um', link: '/guide/one' }, + { text: 'Dois', link: '/guide/two' } + ] + } + ], + + // Esta barra lateral é exibida quando um usuário + // está no diretório `config`. + '/config/': [ + { + text: 'Configuração', + items: [ + { text: 'Índice', link: '/config/' }, + { text: 'Três', link: '/config/three' }, + { text: 'Quatro', link: '/config/four' } + ] + } + ] + } + } +} +``` + +## Grupos Retráteis na Barra Lateral {#collapsible-sidebar-groups} + +Adicionando a opção `collapsed` ao grupo da barra lateral, ela mostra um botão para ocultar/mostrar cada seção. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Título da Seção A', + collapsed: false, + items: [...] + } + ] + } +} +``` + +Todas as seções são "abertas" por padrão. Se você deseja que elas estejam "fechadas" na carga inicial da página, defina a opção `collapsed` como `true`. + +```js +export default { + themeConfig: { + sidebar: [ + { + text: 'Título da Seção A', + collapsed: true, + items: [...] + } + ] + } +} +``` + +## `useSidebar` + +Retorna dados relacionados à barra lateral. O objeto retornado tem o seguinte tipo: + +```ts +export interface DocSidebar { + isOpen: Ref + sidebar: ComputedRef + sidebarGroups: ComputedRef + hasSidebar: ComputedRef + hasAside: ComputedRef + leftAside: ComputedRef + isSidebarEnabled: ComputedRef + open: () => void + close: () => void + toggle: () => void +} +``` + +**Exemplo:** + +```vue + + + +``` diff --git a/docs/pt/reference/default-theme-team-page.md b/docs/pt/reference/default-theme-team-page.md new file mode 100644 index 00000000..9021b959 --- /dev/null +++ b/docs/pt/reference/default-theme-team-page.md @@ -0,0 +1,258 @@ + + +# Página da Equipe {#team-page} + +Se você quiser apresentar sua equipe, você pode usar componentes de equipe para construir a Página da Equipe. Existem duas maneiras de usar esses componentes. Uma é incorporá-lo na página de documento, e outra é criar uma Página de Equipe completa. + +## Mostrar membros da equipe em uma página {#show-team-members-in-a-page} + +Você pode usar o componente `` exposto em `vitepress/theme` para exibir uma lista de membros da equipe em qualquer página. + +```html + + +# Nosso time + +Diga olá à nossa equipe incrível. + + +``` + +O código acima exibirá um membro da equipe em um elemento tipo cartão. Ele deve exibir algo semelhante ao abaixo. + + + +O componente `` vem em 2 tamanhos diferentes, pequeno `small` e médio `medium`. Enquanto é uma questão de preferência, geralmente o tamanho `small` deve encaixar melhor quando usado na página de documento. Além disso, você pode adicionar mais propriedades a cada membro, como adicionar o botão "descrição" ou "patrocinador". Saiba mais sobre em [``](#vpteammembers). + +Incorporar membros da equipe na página de documento é bom para equipes de pequeno porte, onde ter uma página de equipe inteira dedicada pode ser demais, ou introduzir membros parciais como uma referência ao contexto da documentação. + +Se você tiver um grande número de membros, ou simplesmente quiser ter mais espaço para mostrar os membros da equipe, considere [criar uma página de equipe completa.](#create-a-full-team-page) + +## Criando uma página de equipe completa {#create-a-full-team-page} + +Em vez de adicionar membros da equipe à página de documento, você também pode criar uma Página de Equipe completa, da mesma forma que pode criar uma [Página Inicial](./default-theme-home-page) personalizada. + +Para criar uma página de equipe, primeiro crie um novo arquivo md. O nome do arquivo não importa, mas aqui vamos chamá-lo de `team.md`. Neste arquivo, defina a opção `layout: page` do frontmatter, e então você poderá compor a estrutura da sua página usando componentes `TeamPage`. + +```html +--- +layout: page +--- + + + + + + + + + +``` + +Ao criar uma página de equipe completa, lembre-se de agrupar todos os componentes com o componente ``. Este componente garantirá que todos os componentes aninhados relacionados à equipe obtenham a estrutura de layout adequada, como espaçamentos. + +O componente `` adiciona a seção de título da página. O título é `

`. Use os _slots_ `#title` e `#lead`para documentar sobre sua equipe. + +`` funciona da mesma forma que quando usado em uma página de documento. Ele exibirá a lista de membros. + +### Adicione seções para dividir os membros da equipe {#add-sections-to-divide-team-members} + +Você pode adicionar "seções" à página da equipe. Por exemplo, você pode ter diferentes tipos de membros da equipe, como membros da Equipe Principal e Parceiros da Comunidade. Você pode dividir esses membros em seções para explicar melhor os papéis de cada grupo. + +Para fazer isso, adicione o componente `` ao arquivo `team.md` que criamos anteriormente. + +```html +--- +layout: page +--- + + + + + + + + + + + + + + +``` + +O componente `` pode ter os _slots_ `#title` e `#lead` similar ao componente `VPTeamPageTitle`, e também o _slot_ `#members` para exibir os membros da equipe. + +Lembre-se de colocar o componente `` dentro do _slot_ `#members`. + +## `` + +O componente `` exibe uma determinada lista de membros. + +```html + +``` + +```ts +interface Props { + // Tamanho de cada membro. O padrão é `medium`. + size?: 'small' | 'medium' + + // Lista de membros a serem exibidos. + members: TeamMember[] +} + +interface TeamMember { + // Imagem avatar do membro + avatar: string + + // Nome do membro. + name: string + + // Título a ser mostrado abaixo do nome do membro. + // Ex.: Desenvolvedor, Engenheiro de Software, etc. + title?: string + + // Organização a qual o membro pertence. + org?: string + + // URL da organização. + orgLink?: string + + // Descrição do membro. + desc?: string + + // Links sociais, por exemplo, GitHub, Twitter, etc. + // Você pode passar o objeto de Links Sociais aqui. + // Veja: https://vitepress.dev/reference/default-theme-config.html#sociallinks + links?: SocialLink[] + + // URL da página de patrocinador do membro. + sponsor?: string + + // Texto para o link do patrocinador. O padrão é 'Sponsor'. + actionText?: string +} +``` + +## `` + +O componente raiz ao criar uma página de equipe completa. Ele aceita apenas um único _slot_. Ele estilizará todos os componentes relacionados à equipe passados. + +## `` + +Adiciona a seção "título" da página. Melhor usar logo no início sob ``. Aceita os _slots_ `#title` e `#lead`. + +```html + + + + + + +``` + +## `` + +Cria uma "seção" na página da equipe. Aceita os _slots_ `#title`, `#lead` e `#members`. Você pode adicionar quantas seções quiser dentro de ``. + +```html + + ... + + + + + + +``` diff --git a/docs/pt/reference/frontmatter-config.md b/docs/pt/reference/frontmatter-config.md new file mode 100644 index 00000000..41ccad66 --- /dev/null +++ b/docs/pt/reference/frontmatter-config.md @@ -0,0 +1,221 @@ +--- +outline: deep +--- + +# Configuração Frontmatter {#frontmatter-config} + +Frontmatter permite a configuração baseada em páginas. Em cada arquivo markdown, você pode usar a configuração frontmatter para sobrepor opções de configuração a nível de site ou de tema. Além disso, existem opções de configuração que só podem ser definidas em frontmatter. + +Exemplo de uso: + +```md +--- +title: Documentação com VitePress +editLink: true +--- +``` + +Você pode acessar os dados do frontmatter através da variável global `$frontmatter` em expressões Vue: + +```md +{{ $frontmatter.title }} +``` + +## title + +- Tipo: `string` + +Título para a página. É o mesmo que [config.title](./site-config#title), e sobrepõe a configuração a nível de site. + +```yaml +--- +title: VitePress +--- +``` + +## titleTemplate + +- Tipo: `string | boolean` + +O sufixo para o título. É o mesmo que [config.titleTemplate](./site-config#titletemplate), e sobrepõe a configuração a nível de site. + +```yaml +--- +title: VitePress +titleTemplate: Gerador de site estático com Vite & Vue +--- +``` + +## description + +- Tipo: `string` + +Descrição para a página. É o mesmo que [config.description](./site-config#description), e sobrepõe a configuração a nível de site. + +```yaml +--- +description: VitePress +--- +``` + +## head + +- Tipo: `HeadConfig[]` + +Especifica tags head adicionais a serem injetadas na página atual. Elas serão acrescentadas após as tags head injetadas pela configuração a nível de site. + +```yaml +--- +head: + - - meta + - name: description + content: hello + - - meta + - name: keywords + content: super duper SEO +--- +``` + +```ts +type HeadConfig = + | [string, Record] + | [string, Record, string] +``` + +## Somente no Tema Padrão {#default-theme-only} + +As seguintes opções frontmatter são aplicáveis apenas ao usar o tema padrão. + +### layout + +- Tipo: `doc | home | page` +- Padrão: `doc` + +Determina o layout da página. + +- `doc` - Aplica estilos de documentação padrão ao conteúdo markdown. +- `home` - Layout especial para a "Página Inicial". Você pode adicionar opções extras como `hero` e `features` para criar rapidamente uma bela página inicial. +- `page` - Comporta-se de maneira semelhante a `doc`, mas não aplica estilos ao conteúdo. Útil quando você deseja criar uma página totalmente personalizada. + +```yaml +--- +layout: doc +--- +``` + +### hero + +Define o conteúdo da seção _hero_ na página inicial quando `layout` está definido como `home`. Mais detalhes em [Tema Padrão: Página Inicial](./default-theme-home-page). + +### features + +Define os itens a serem exibidos na seção de funcionalidades quando `layout` está definido como `home`. Mais detalhes em [Tema Padrão: Página Inicial](./default-theme-home-page). + +### navbar + +- Tipo: `boolean` +- Padrão: `true` + +Se deve exibir a [barra de navegação](./default-theme-nav). + +```yaml +--- +navbar: false +--- +``` + +### sidebar + +- Tipo: `boolean` +- Padrão: `true` + +Se deve exibir a [barra lateral](./default-theme-sidebar). + +```yaml +--- +sidebar: false +--- +``` + +### aside + +- Tipo: `boolean | 'left'` +- Padrão: `true` + +Define a localização do componente aside no layout `doc`. + +Configurar este valor como `false` impede a apresentação do elemento aside.\ +Configurar este valor como `true` apresenta o aside à direita.\ +Configurar este valor como `'left'` apresenta o aside à esquerda. + +```yaml +--- +aside: false +--- +``` + +### outline + +- Tipo: `number | [number, number] | 'deep' | false` +- Padrão: `2` + +Os níveis do cabeçalho no _outline_ a serem exibidos para a página. É o mesmo que [config.themeConfig.outline.level](./default-theme-config#outline), e sobrepõe o valor definido na configuração no nível do site. + +### lastUpdated + +- Tipo: `boolean | Date` +- Padrão: `true` + +Se deve mostrar o texto de [última atualização](./default-theme-last-updated) no rodapé da página atual. Se uma data e hora específica forem especificadas, ela será exibida em vez do último horário de modificação do git. + +```yaml +--- +lastUpdated: false +--- +``` + +### editLink + +- Tipo: `boolean` +- Padrão: `true` + +Se deve exibir o [link de edição](./default-theme-edit-link) no rodapé da página atual. + +```yaml +--- +editLink: false +--- +``` + +### footer + +- Tipo: `boolean` +- Padrão: `true` + +Se deve exibir o [rodapé](./default-theme-footer). + +```yaml +--- +footer: false +--- +``` + +### pageClass + +- Tipo: `string` + +Adiciona um nome de classe extra a uma página específica. + +```yaml +--- +pageClass: custom-page-class +--- +``` + +Em seguida, você pode personalizar os estilos desta página específica no arquivo `.vitepress/theme/custom.css`: + +```css +.custom-page-class { +  /* estilos específicos da página */ +} +``` diff --git a/docs/pt/reference/runtime-api.md b/docs/pt/reference/runtime-api.md new file mode 100644 index 00000000..a04458a1 --- /dev/null +++ b/docs/pt/reference/runtime-api.md @@ -0,0 +1,165 @@ +# API em Tempo de Execução {#runtime-api} + +VitePress oferece várias APIs embutidas para permitir o acesso aos dados da aplicação. VitePress vem também com alguns componentes embutidos que podem ser usados globalmente. + +Os métodos auxiliares são importáveis globais de `vitepress` e geralmente são usados em componentes Vue de temas personalizados. No entanto, eles também podem ser usados dentro de páginas `.md` porque os arquivos markdown são compilados em [Componentes de Arquivo Único Vue (SFC)](https://vuejs.org/guide/scaling-up/sfc.html). + +Métodos que começam com `use*` indicam que é uma função da [API de Composição Vue 3](https://vuejs.org/guide/introduction.html#composition-api) ("Composable") que só pode ser usada dentro de `setup()` ou ` + + +``` + +## `useRoute` + +Retorna o objeto de rota atual com o seguinte tipo: + +```ts +interface Route { + path: string + data: PageData + component: Component | null +} +``` + +## `useRouter` + +Retorna a instância do roteador VitePress para que você possa navegar programaticamente para outra página. + +```ts +interface Router { + /** + * Rota atual. + */ + route: Route + /** + * Navegar para uma nova URL. + */ + go: (to?: string) => Promise + /** + * Chamado antes da mudança de rota. Retorne `false` para cancelar a navegação. + */ + onBeforeRouteChange?: (to: string) => Awaitable + /** + * Chamado antes do carregamento do componente da página (depois que o estado do histórico é + * atualizado). Retorne `false` para cancelar a navegação. + */ + onBeforePageLoad?: (to: string) => Awaitable + /** + * Chamado após a mudança de rota. + */ + onAfterRouteChanged?: (to: string) => Awaitable +} +``` + +## `withBase` + +- **Tipo**: `(path: string) => string` + +Anexa o [`base`](./site-config#base) configurado a um caminho de URL fornecido. Veja também [Base URL](../guide/asset-handling#base-url). + +## `` + +O componente `` exibe o conteúdo markdown renderizado. Útil [ao criar seu próprio tema](../guide/custom-theme). + +```vue + +``` + +## `` + +O componente `` revela seu _slot_ apenas no lado do cliente. + +Como as aplicações VitePress são interpretadas no lado do servidor em Node.js ao gerar builds estáticos, qualquer uso do Vue deve seguir os requisitos de código universal. Em resumo, certifique-se de acessar apenas APIs do Navegador / DOM em ganchos `beforeMount` ou `mounted`. + +Se você estiver usando ou demonstrando componentes que não são compatíveis com SSR (por exemplo, contêm diretivas personalizadas), você pode envolvê-los dentro do componente `ClientOnly`. + +```vue-html + + + +``` + +- Relacionado: [Compatibilidade SSR](../guide/ssr-compat) + +## `$frontmatter` + +Acesse diretamente os dados [frontmatter](../guide/frontmatter) da página atual em expressões Vue. + +```md +--- +title: Olá +--- + +# {{ $frontmatter.title }} +``` + +## `$params` + +Acesse diretamente os [parâmetros de rota dinâmica](../guide/routing#dynamic-routes) da página atual em expressões Vue. + +```md +- nome do pacote: {{ $params.pkg }} +- versão: {{ $params.version }} +``` diff --git a/docs/pt/reference/site-config.md b/docs/pt/reference/site-config.md new file mode 100644 index 00000000..013ee7d9 --- /dev/null +++ b/docs/pt/reference/site-config.md @@ -0,0 +1,705 @@ +--- +outline: deep +--- + +# Configuração do Site {#site-config} + +A configuração do site é onde você pode definir as configurações globais do site. As opções de configuração do aplicativo definem configurações que se aplicam a todos os sites VitePress, independentemente do tema que estão usando. Por exemplo, o diretório base ou o título do site. + +## Visão geral {#overview} + +### Resolução de Configuração {#config-resolution} + +O arquivo de configuração é sempre resolvido a partir de `/.vitepress/config.[ext]`, onde `` é a [raiz do projeto](../guide/routing#root-and-source-directory) VitePress e `[ext]` é uma das extensões de arquivo suportadas. O TypeScript é suportado de fábrica. As extensões suportadas incluem `.js`, `.ts`, `.mjs` e `.mts`. + +Recomenda-se usar a sintaxe de módulos ES nos arquivos de configuração. O arquivo de configuração deve exportar por padrão um objeto: + +```ts +export default { + // opções de configuração de nível da aplicação + lang: 'pt-BR', + title: 'VitePress', + description: 'Gerador de site estático Vite & Vue.', + ... +} +``` + +:::details Configuração Dinâmica (Assíncrona) + +Se você precisar gerar dinamicamente a configuração, também pode exportar por padrão uma função. Por exemplo: + +```ts +import { defineConfig } from 'vitepress' + +export default async () => { + const posts = await (await fetch('https://my-cms.com/blog-posts')).json() + + return defineConfig({ + // opções de configuração de nível da aplicação + lang: 'pt-BR', + title: 'VitePress', + description: 'Gerador de site estático Vite & Vue.', + + // opções de configuração de nível do tema + themeConfig: { + sidebar: [ + ...posts.map((post) => ({ + text: post.name, + link: `/posts/${post.name}` + })) + ] + } + }) +} +``` + +Você também pode usar o `await` no nível superior. Como: + +```ts +import { defineConfig } from 'vitepress' + +const posts = await (await fetch('https://my-cms.com/blog-posts')).json() + +export default defineConfig({ + // opções de configuração de nível da aplicação + lang: 'pt-BR', + title: 'VitePress', + description: 'Gerador de site estático Vite & Vue.', + + // opções de configuração de nível do tema + themeConfig: { + sidebar: [ + ...posts.map((post) => ({ + text: post.name, + link: `/posts/${post.name}` + })) + ] + } +}) +``` + +::: + +### Configuração Intellisense {#config-intellisense} + +Usar o auxiliar `defineConfig` fornecerá Intellisense alimentado por TypeScript para as opções de configuração. Supondo que seu IDE o suporte, isso deve funcionar tanto em JavaScript quanto em TypeScript. + +```js +import { defineConfig } from 'vitepress' + +export default defineConfig({ + // ... +}) +``` + +### Configuração de Tema Tipada {#typed-theme-config} + +Por padrão, o auxiliar `defineConfig` espera o tipo de configuração de tema do tema padrão: + +```ts +import { defineConfig } from 'vitepress' + +export default defineConfig({ + themeConfig: { + // O tipo é `DefaultTheme.Config` + } +}) +``` + +Se você estiver usando um tema personalizado e desejar verificações de tipo para a configuração do tema, será necessário usar `defineConfigWithTheme` em vez disso, e passar o tipo de configuração para o seu tema personalizado por meio de um argumento genérico: + +```ts +import { defineConfigWithTheme } from 'vitepress' +import type { ThemeConfig } from 'your-theme' + +export default defineConfigWithTheme({ + themeConfig: { + // O tipo é `ThemeConfig` + } +}) +``` + +### Configuração Vite, Vue & Markdown + +- **Vite** + + Você pode configurar a instância subjacente do Vite usando a opção [vite](#vite) em sua configuração VitePress. Não é necessário criar um arquivo de configuração Vite separado. + +- **Vue** + + VitePress já inclui o plugin Vue oficial para Vite ([@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue)). Você pode configurar suas opções usando a opção [vue](#vue) em sua configuração VitePress. + +- **Markdown** + + Você pode configurar a instância subjacente de [Markdown-It](https://github.com/markdown-it/markdown-it) usando a opção [markdown](#markdown) em sua configuração VitePress. + +## Metadados do Site {#site-metadata} + +### title + +- Tipo: `string` +- Padrão: `VitePress` +- Pode ser substituído por página via [frontmatter](./frontmatter-config#title) + +Título do site. Ao usar o tema padrão, isso será exibido na barra de navegação. + +Ele também será usado como o sufixo padrão para todos os títulos individuais das páginas, a menos que [`titleTemplate`](#titletemplate) seja definido. O título final de uma página individual será o conteúdo textual do seu primeiro cabeçalho `

`, combinado com o título global como sufixo. Por exemplo, com a seguinte configuração e conteúdo da página: + +```ts +export default { + title: 'Meu Site Incrível' +} +``` + +```md +# Olá +``` + +O título da página será `Olá | Meu Site Incrível`. + +### titleTemplate + +- Tipo: `string | boolean` +- Pode ser substituído por página via [frontmatter](./frontmatter-config#titletemplate) + +Permite personalizar o sufixo do título de cada página ou o título inteiro. Por exemplo: + +```ts +export default { + title: 'Meu Site Incrível', + titleTemplate: 'Sufixo Personalizado' +} +``` + +```md +# Olá +``` + +O título da página será `Olá | Sufixo Personalizado`. + +Para personalizar completamente como o título deve ser renderizado, você pode usar o símbolo `:title` em `titleTemplate`: + +```ts +export default { + titleTemplate: ':title - Sufixo Personalizado' +} +``` + +Aqui, `:title` será substituído pelo texto inferido do primeiro cabeçalho `

` da página. O título do exemplo anterior da página será `Olá - Sufixo Personalizado`. + +A opção pode ser definida como `false` para desativar sufixos de título. + +### description + +- Tipo: `string` +- Padrão: `Um site VitePress` +- Pode ser substituído por página via [frontmatter](./frontmatter-config#descrição) + +Descrição para o site. Isso será apresentado como uma tag `` na página HTML. + +```ts +export default { + descrição: 'Um site VitePress' +} +``` + +### head + +- Tipo: `HeadConfig[]` +- Padrão: `[]` +- Pode ser acrescentado por página via [frontmatter](./frontmatter-config#head) + +Elementos adicionais para adicionar na tag `` da página HTML. As tags adicionadas pelo usuário são mostradas antes da tag `head` de fechamento, após as tags VitePress. + +```ts +type HeadConfig = + | [string, Record] + | [string, Record, string] +``` + +#### Exemplo: Adicionando um favicon {#example-adding-a-favicon} + +```ts +export default { + cabeça: [['link', { rel: 'icon', href: '/favicon.ico' }]] +} // coloque o favicon.ico no diretório public, se a base estiver definida, use /base/favicon.ico + +/* Mostraria: + +*/ +``` + +#### Exemplo: Adicionando Fontes do 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' } + ] + ] +} + +/* Mostraria: + + + +*/ +``` + +#### Exemplo: Registrando um _service worker_ {#example-registering-a-service-worker} + +```ts +export default { + head: [ + [ + 'script', + { id: 'register-sw' }, + `;(() => { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('/sw.js') + } + })()` + ] + ] +} + +/* Mostraria: + +*/ +``` + +#### Exemplo: Usando o 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');` + ] + ] +} + +/* Mostraria: + + +*/ +``` + +### lang + +- Tipo: `string` +- Padrão: `en-US` + +O atributo de idioma para o site. Isso será mostrado como uma tag `` na página HTML. + +```ts +export default { + lang: 'en-US' +} +``` + +### base + +- Tipo: `string` +- Padrão: `/` + +A URL base em que o site será implantado. Você precisará definir isso se planeja implantar seu site em um subdiretório, por exemplo, no GitHub pages. Se você planeja implantar seu site em `https://foo.github.io/bar/` então você deve definir a base como `'/bar/'`. Deve sempre começar e terminar com uma barra. + +A base é automaticamente adicionada a todos as URLs que começam com / em outras opções, então você só precisa especificá-la uma vez. + +```ts +export default { + base: '/base/' +} +``` + +## Roteamento {#routing} + +### cleanUrls + +- Tipo: `boolean` +- Padrão: `false` + +Quando definido como `true`, VitePress removerá o `.html` no final dos URLs. Veja também [Gerando URL Limpa](../guide/routing#generating-clean-url). + +::: alerta Suporte do Servidor Necessário +Ativar isso pode exigir configurações adicionais em sua plataforma de hospedagem. Para funcionar, seu servidor deve ser capaz de servir `/foo.html` ao visitar `/foo` **sem redirecionamento**. +::: + +### rewrites + +- Tipo: `Record` + +Define mapeamentos personalizados de diretório <-> URL. Veja [Roteamento: Reescrever Rotas](../guide/routing#route-rewrites) para mais detalhes. + +```ts +export default { + rewrites: { + 'source/:page': 'destination/:page' + } +} +``` + +## Construção {#build} + +### srcDir + +- Tipo: `string` +- Padrão: `.` + +O diretório onde suas páginas de markdown são armazenadas, relativo à raiz do projeto. Veja também [Diretório Raiz e Fonte](../guide/routing#root-and-source-directory). + +```ts +export default { + srcDir: './src' +} +``` + +### srcExclude + +- Tipo: `string` +- Padrão: `undefined` + +Um [padrão glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) para corresponder a arquivos markdown que devem ser excluídos como conteúdo fonte. + +```ts +export default { + srcExclude: ['**/README.md', '**/TODO.md'] +} +``` + +### outDir + +- Tipo: `string` +- Padrão: `./.vitepress/dist` + +A localização da saída da compilação para o site, relativa à [raiz do projeto](../guide/routing#root-and-source-directory). + +```ts +export default { + outDir: '../public' +} +``` + +### assetsDir + +- Tipo: `string` +- Padrão: `assets` + +Especifica o diretório para aninhar ativos gerados. O caminho deve estar dentro de [`outDir`](#outdir) e é resolvido em relação a ele. + +```ts +export default { + assetsDir: 'static' +} +``` + +### cacheDir + +- Tipo: `string` +- Padrão: `./.vitepress/cache` + +O diretório para arquivos de cache, relativo à [raiz do projeto](../guide/routing#root-and-source-directory). Veja também: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir). + +```ts +export default { + cacheDir: './.vitepress/.vite' +} +``` + +### ignoreDeadLinks + +- Tipo: `boolean | 'localhostLinks' | (string | RegExp | ((link: string) => boolean))[]` +- Padrão: `false` + +Quando definido como `true`, VitePress não falhará na compilação devido a links quebrados. + +Quando definido como `'localhostLinks'`, a compilação falhará em links quebrados, mas não verificará links `localhost`. + +```ts +export default { + ignoreDeadLinks: true +} +``` + +Também pode ser um _array_ de uma exata URL em string, padrões regex, ou funções de filtro personalizadas. + +```ts +export default { + ignoreDeadLinks: [ + // ignora URL exata "/playground" + '/playground', + // ignora todos os links localhost + /^https?:\/\/localhost/, + // ignora todos os links incluindo "/repl/"" + /\/repl\//, + // função personalizada, ignora todos os links incluindo "ignore" + (url) => { + return url.toLowerCase().includes('ignore') + } + ] +} +``` + +### mpa + +- Tipo: `boolean` +- Padrão: `false` + +Quando definido como `true`, a aplicação em produção será compilada no [Modo MPA](../guide/mpa-mode). O modo MPA envia 0kb de JavaScript por padrão, às custas de desabilitar a navegação no lado do cliente e exigir permissão explícita para interatividade. + +## Tematização {#theming} + +### appearance + +- Tipo: `boolean | 'dark' | 'force-dark' | import('@vueuse/core').UseDarkOptions` +- Padrão: `true` + +Se habilitar o modo escuro (adicionando a classe `.dark` ao elemento ``). + +- Se a opção estiver definida como `true` o tema padrão é determinado pelo esquema de cores preferido do usuário. +- Se a opção estiver definida como `dark` o tema é escuro por padrão, a menos que o usuário mude manualmente. +- Se a opção estiver definida como `false` os usuários não poderão mudar o tema. + +Esta opção injeta um script em linha que restaura as configurações dos usuários do armazenamento local (_local storage_) usando a chave `vitepress-theme-appearance`. Isso garante que a classe `.dark` seja aplicada antes de a página ser mostrada para evitar oscilações. + +`appearance.initialValue` só pode ser `'dark' | undefined`. Refs ou getters não são suportados. + +### lastUpdated + +- Tipo: `boolean` +- Padrão: `false` + +Para obter o selo de tempo da última atualização para cada página usando o Git. O selo de data será incluído nos dados de cada página, acessíveis via [`useData`](./runtime-api#usedata). + +Ao usar o tema padrão, habilitar esta opção exibirá o horário da última atualização de cada página. Você pode personalizar o texto via opção [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext). + +## Personalização {#customization} + +### markdown + +- Tipo: `MarkdownOption` + +Configure as opções do processador Markdown. VitePress usa [Markdown-it](https://github.com/markdown-it/markdown-it) como processador e [Shiki](https://github.com/shikijs/shiki) para destacar sintaxe de linguagem. Dentro desta opção, você pode passar várias opções Markdown relacionadas para atender às suas necessidades. + +```js +export default { + markdown: {...} +} +``` + +Verifique a [declaração de tipo e jsdocs](https://github.com/vuejs/vitepress/blob/main/src/node/markdown/markdown.ts) para todas as opções disponíveis. + +### vite + +- Tipo: `import('vite').UserConfig` + +Passe a [Configuração Vite](https://vitejs.dev/config/) crua para o servidor interno / empacotador Vite. + +```js +export default { + vite: { + // Opções de configuração Vite + } +} +``` + +### vue + +- Tipo: `import('@vitejs/plugin-vue').Options` + +Passe as opções [`@vitejs/plugin-vue`](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#options) cruas para a instância interna do plugin. + +```js +export default { + vue: { + // Opções @vitejs/plugin-vue + } +} +``` + +## Ganchos de Compilação {#build-hooks} + +Os ganchos de compilação VitePress permitem adicionar novas funcionalidades ao seu site: + +- Sitemap +- Indexação de Pesquisa +- PWA +- _Teleports_ + +## buildEnd +- Tipo: `(siteConfig: SiteConfig) => Awaitable` +`buildEnd` é um gancho de compilação CLI (Interface de Linha de Comando), ele será executado após a conclusão da compilação (SSG), mas antes que o processo VitePress CLI termine. + +```ts +export default { + async buildEnd(siteConfig) { + // ... + } +} +``` + +## postRender +- Tipo: `(context: SSGContext) => Awaitable` +- `postRender` é um gancho de compilação, chamado quando a interpretação SSG é concluída. Ele permitirá que você manipule o conteúdo de _teleports_ durante a geração de site estático. + + ```ts + export default { + async postRender(context) { + // ... + } + } + ``` + + ```ts + interface SSGContext { + content: string + teleports?: Record + [key: string]: any + } + ``` + +## transformHead +- Tipo: `(context: TransformContext) => Awaitable` + +`transformHead` é um gancho de compilação para transformar o cabeçalho antes de gerar cada página. Isso permite adicionar entradas no cabeçalho que não podem ser adicionadas estaticamente à configuração VitePress. Você só precisa retornar entradas extras, que serão mescladas automaticamente com as existentes. + +:::warning +Não faça mutações em qualquer item dentro de `context`. +::: + +```ts +export default { + async transformHead(context) { + // ... + } +} +``` + +```ts +interface TransformContext { + page: string // e.g. index.md (relativo a srcDir) + assets: string[] // todos os ativos não-js/css com URL pública completamente resolvida + siteConfig: SiteConfig + siteData: SiteData + pageData: PageData + title: string + description: string + head: HeadConfig[] + content: string +} +``` + +Note que este gancho só é chamado ao gerar o site estaticamente. Não é chamado durante o desenvolvimento. Se você precisar adicionar entradas de cabeçalho dinâmicas durante o desenvolvimento, pode usar o gancho [`transformPageData`](#transformpagedata) em seu lugar. + + ```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` + } + ]) + } + } + ``` + +#### Exemplo: Adicionar URL canônica `` {#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 +- Tipo: `(code: string, id: string, context: TransformContext) => Awaitable` +`transformHtml` é um gancho de compilação para transformar o conteúdo de cada página antes de salvá-lo no disco. + +:::warning +Não faça mutações em qualquer item dentro de `context`. Além disso, modificar o conteúdo HTML pode causar problemas de hidratação em tempo de execução. +::: + +```ts +export default { + async transformHtml(code, id, context) { + // ... + } +} +``` + +### transformPageData +- Tipo: `(pageData: PageData, context: TransformPageContext) => Awaitable | { [key: string]: any } | void>` + +`transformPageData` é um gancho para transformar os dados de cada página. Você pode fazer mutações diretamente em `pageData` ou retornar valores alterados que serão mesclados nos dados da página. + +:::warning +Não faça mutações em qualquer item dentro de `context` e tenha cuidado pois isso pode impactar no desempenho do servidor de desenvolvimento, especialmente se você tiver algumas solicitações de rede ou computações pesadas (como gerar imagens) no gancho. Você pode verificar `process.env.NODE_ENV === 'production'` para lógica condicional. +::: + +```ts +export default { + async transformPageData(pageData, { siteConfig }) { + pageData.contributors = await getPageContributors(pageData.relativePath) + } + + // ou retorne dados a serem mesclados + async transformPageData(pageData, { siteConfig }) { + return { + contributors: await getPageContributors(pageData.relativePath) + } + } +} +``` + +```ts +interface TransformPageContext { + siteConfig: SiteConfig +} +``` From 59183e9cef112a004c8a8e2b365478af657858b0 Mon Sep 17 00:00:00 2001 From: Timothy Lau Date: Thu, 7 Mar 2024 15:34:59 +0800 Subject: [PATCH 025/114] fix(build): resolve patter relative to srcDir instead of root in createContentLoader (#3638) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- src/node/contentLoader.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node/contentLoader.ts b/src/node/contentLoader.ts index c213f794..dc8651ac 100644 --- a/src/node/contentLoader.ts +++ b/src/node/contentLoader.ts @@ -75,7 +75,7 @@ export interface ContentData { */ export function createContentLoader( /** - * files to glob / watch - relative to + * files to glob / watch - relative to srcDir */ pattern: string | string[], { @@ -98,7 +98,7 @@ export function createContentLoader( } if (typeof pattern === 'string') pattern = [pattern] - pattern = pattern.map((p) => normalizePath(path.join(config.root, p))) + pattern = pattern.map((p) => normalizePath(path.join(config.srcDir, p))) let md: MarkdownRenderer From 5f6297cb3df98926154235f31570e75820d4ea16 Mon Sep 17 00:00:00 2001 From: Rick Dubiel Date: Thu, 7 Mar 2024 01:40:24 -0600 Subject: [PATCH 026/114] feat(theme): allow selectively disabling external link icon on navbar items (#3607) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- docs/pt/reference/default-theme-config.md | 1 + docs/reference/default-theme-config.md | 1 + docs/zh/reference/default-theme-config.md | 1 + src/client/theme-default/components/VPNavBarMenuLink.vue | 1 + types/default-theme.d.ts | 1 + 5 files changed, 5 insertions(+) diff --git a/docs/pt/reference/default-theme-config.md b/docs/pt/reference/default-theme-config.md index 361475fc..417cbc30 100644 --- a/docs/pt/reference/default-theme-config.md +++ b/docs/pt/reference/default-theme-config.md @@ -93,6 +93,7 @@ interface NavItemWithLink { activeMatch?: string target?: string rel?: string + noIcon?: boolean } interface NavItemChildren { diff --git a/docs/reference/default-theme-config.md b/docs/reference/default-theme-config.md index f41fb7ad..b1a4a29a 100644 --- a/docs/reference/default-theme-config.md +++ b/docs/reference/default-theme-config.md @@ -93,6 +93,7 @@ interface NavItemWithLink { activeMatch?: string target?: string rel?: string + noIcon?: boolean } interface NavItemChildren { diff --git a/docs/zh/reference/default-theme-config.md b/docs/zh/reference/default-theme-config.md index bf8a3e69..a7028f16 100644 --- a/docs/zh/reference/default-theme-config.md +++ b/docs/zh/reference/default-theme-config.md @@ -93,6 +93,7 @@ interface NavItemWithLink { activeMatch?: string target?: string rel?: string + noIcon?: boolean } interface NavItemChildren { diff --git a/src/client/theme-default/components/VPNavBarMenuLink.vue b/src/client/theme-default/components/VPNavBarMenuLink.vue index a77636d4..e5c166a0 100644 --- a/src/client/theme-default/components/VPNavBarMenuLink.vue +++ b/src/client/theme-default/components/VPNavBarMenuLink.vue @@ -22,6 +22,7 @@ const { page } = useData() ) }" :href="item.link" + :noIcon="item.noIcon" :target="item.target" :rel="item.rel" tabindex="0" diff --git a/types/default-theme.d.ts b/types/default-theme.d.ts index d6636643..9a9df23f 100644 --- a/types/default-theme.d.ts +++ b/types/default-theme.d.ts @@ -176,6 +176,7 @@ export namespace DefaultTheme { activeMatch?: string rel?: string target?: string + noIcon?: boolean } export interface NavItemChildren { From 86da996ddb212bee1b617055a3106ec9bd067a74 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:59:22 +0530 Subject: [PATCH 027/114] chore: update pnpm action to node 20 --- .github/workflows/test.yml | 2 +- docs/guide/deploy.md | 2 +- docs/pt/guide/deploy.md | 2 +- docs/zh/guide/deploy.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 915171b3..4fdb4296 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@v4 - name: Install pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v3 - name: Set node version to ${{ matrix.node_version }} uses: actions/setup-node@v4 diff --git a/docs/guide/deploy.md b/docs/guide/deploy.md index 83835eed..3b5ddbfd 100644 --- a/docs/guide/deploy.md +++ b/docs/guide/deploy.md @@ -156,7 +156,7 @@ Don't enable options like _Auto Minify_ for HTML code. It will remove comments f uses: actions/checkout@v4 with: fetch-depth: 0 # Not needed if lastUpdated is not enabled - # - uses: pnpm/action-setup@v2 # Uncomment this if you're using pnpm + # - uses: pnpm/action-setup@v3 # Uncomment this if you're using pnpm # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun - name: Setup Node uses: actions/setup-node@v4 diff --git a/docs/pt/guide/deploy.md b/docs/pt/guide/deploy.md index da583034..ba8b2fd8 100644 --- a/docs/pt/guide/deploy.md +++ b/docs/pt/guide/deploy.md @@ -156,7 +156,7 @@ Não ative opções como _Auto Minify_ para código HTML. Isso removerá coment uses: actions/checkout@v4 with: fetch-depth: 0 # Não necessário se lastUpdated não estiver habilitado - # - uses: pnpm/action-setup@v2 # Descomente isso se estiver usando pnpm + # - uses: pnpm/action-setup@v3 # Descomente isso se estiver usando pnpm # - uses: oven-sh/setup-bun@v1 # Descomente isso se estiver usando Bun - name: Setup Node uses: actions/setup-node@v4 diff --git a/docs/zh/guide/deploy.md b/docs/zh/guide/deploy.md index d8ac6cca..cb479305 100644 --- a/docs/zh/guide/deploy.md +++ b/docs/zh/guide/deploy.md @@ -156,7 +156,7 @@ Cache-Control: max-age=31536000,immutable uses: actions/checkout@v4 with: fetch-depth: 0 # 如果未启用 lastUpdated,则不需要 - # - uses: pnpm/action-setup@v2 # 如果使用 pnpm,请取消注释 + # - uses: pnpm/action-setup@v3 # 如果使用 pnpm,请取消注释 # - uses: oven-sh/setup-bun@v1 # 如果使用 Bun,请取消注释 - name: Setup Node uses: actions/setup-node@v4 From 86c09672970cccaf753ce7d18f94de0b6520934f Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 8 Mar 2024 14:37:02 +0530 Subject: [PATCH 028/114] chore: bump deps and switch to polka/compression --- docs/package.json | 2 +- package.json | 45 +- pnpm-lock.yaml | 933 +++++++++++++++++----------------------- src/node/serve/serve.ts | 6 +- 4 files changed, 423 insertions(+), 563 deletions(-) diff --git a/docs/package.json b/docs/package.json index 162e4e72..0dd6620a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,7 +10,7 @@ "lunaria:open": "open-cli .vitepress/dist/_translations/index.html" }, "devDependencies": { - "@lunariajs/core": "^0.0.28", + "@lunariajs/core": "^0.0.31", "markdown-it-mathjax3": "^4.3.2", "open-cli": "^8.0.0", "vitepress": "workspace:*" diff --git a/package.json b/package.json index bf7c3b70..51d5bd14 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0-rc.45", "description": "Vite & Vue powered static site generator", "type": "module", - "packageManager": "pnpm@8.15.3", + "packageManager": "pnpm@8.15.4", "main": "dist/node/index.js", "types": "types/index.d.ts", "exports": { @@ -92,21 +92,21 @@ "release": "node scripts/release.js" }, "dependencies": { - "@docsearch/css": "^3.5.2", - "@docsearch/js": "^3.5.2", + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.1.7", + "@shikijs/transformers": "^1.1.7", "@types/markdown-it": "^13.0.7", "@vitejs/plugin-vue": "^5.0.4", - "@vue/devtools-api": "^7.0.14", - "@vueuse/core": "^10.7.2", - "@vueuse/integrations": "^10.7.2", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^6.3.0", - "shiki": "^1.1.5", - "@shikijs/core": "^1.1.5", - "@shikijs/transformers": "^1.1.5", - "vite": "^5.1.3", - "vue": "^3.4.19" + "shiki": "^1.1.7", + "vite": "^5.1.5", + "vue": "^3.4.21" }, "peerDependencies": { "markdown-it-mathjax3": "^4.3.2", @@ -129,12 +129,12 @@ "@mdit-vue/plugin-title": "^2.0.0", "@mdit-vue/plugin-toc": "^2.0.0", "@mdit-vue/shared": "^2.0.0", + "@polka/compression": "1.0.0-next.25", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-replace": "^5.0.5", - "@types/compression": "^1.7.5", "@types/cross-spawn": "^6.0.6", "@types/debug": "^4.1.12", "@types/escape-html": "^1.0.4", @@ -146,12 +146,11 @@ "@types/markdown-it-emoji": "^2.0.4", "@types/micromatch": "^4.0.6", "@types/minimist": "^1.2.5", - "@types/node": "^20.11.19", + "@types/node": "^20.11.25", "@types/postcss-prefix-selector": "^1.16.3", "@types/prompts": "^2.4.9", - "@vue/shared": "^3.4.19", + "@vue/shared": "^3.4.21", "chokidar": "^3.6.0", - "compression": "^1.7.4", "conventional-changelog-cli": "^4.1.0", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -173,31 +172,31 @@ "markdown-it-mathjax3": "^4.3.2", "micromatch": "^4.0.5", "minimist": "^1.2.8", - "nanoid": "^5.0.5", + "nanoid": "^5.0.6", "npm-run-all": "^4.1.5", "ora": "^8.0.1", "p-map": "^7.0.1", "path-to-regexp": "^6.2.1", "picocolors": "^1.0.0", "pkg-dir": "^8.0.0", - "playwright-chromium": "^1.41.2", - "polka": "1.0.0-next.24", + "playwright-chromium": "^1.42.1", + "polka": "1.0.0-next.25", "postcss-prefix-selector": "^1.16.0", "prettier": "^3.2.5", "prompts": "^2.4.2", "punycode": "^2.3.1", "rimraf": "^5.0.5", - "rollup": "^4.12.0", + "rollup": "^4.12.1", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "^6.1.1", "semver": "^7.6.0", - "simple-git-hooks": "^2.9.0", + "simple-git-hooks": "^2.10.0", "sirv": "^2.0.4", "sitemap": "^7.1.1", "supports-color": "^9.4.0", - "typescript": "^5.3.3", - "vitest": "^1.3.0", - "vue-tsc": "^1.8.27", + "typescript": "^5.4.2", + "vitest": "^1.3.1", + "vue-tsc": "^2.0.6", "wait-on": "^7.2.0" }, "simple-git-hooks": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6ff8119..5bd77169 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,32 +12,32 @@ importers: .: dependencies: '@docsearch/css': - specifier: ^3.5.2 - version: 3.5.2 + specifier: ^3.6.0 + version: 3.6.0 '@docsearch/js': - specifier: ^3.5.2 - version: 3.5.2 + specifier: ^3.6.0 + version: 3.6.0 '@shikijs/core': - specifier: ^1.1.5 - version: 1.1.5 + specifier: ^1.1.7 + version: 1.1.7 '@shikijs/transformers': - specifier: ^1.1.5 - version: 1.1.5 + specifier: ^1.1.7 + version: 1.1.7 '@types/markdown-it': specifier: ^13.0.7 version: 13.0.7 '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.1.3)(vue@3.4.19) + version: 5.0.4(vite@5.1.5)(vue@3.4.21) '@vue/devtools-api': - specifier: ^7.0.14 - version: 7.0.15(vue@3.4.19) + specifier: ^7.0.16 + version: 7.0.16(vue@3.4.21) '@vueuse/core': - specifier: ^10.7.2 - version: 10.7.2(vue@3.4.19) + specifier: ^10.9.0 + version: 10.9.0(vue@3.4.21) '@vueuse/integrations': - specifier: ^10.7.2 - version: 10.7.2(focus-trap@7.5.4)(vue@3.4.19) + specifier: ^10.9.0 + version: 10.9.0(focus-trap@7.5.4)(vue@3.4.21) focus-trap: specifier: ^7.5.4 version: 7.5.4 @@ -48,14 +48,14 @@ importers: specifier: ^6.3.0 version: 6.3.0 shiki: - specifier: ^1.1.5 - version: 1.1.5 + specifier: ^1.1.7 + version: 1.1.7 vite: - specifier: ^5.1.3 - version: 5.1.3(@types/node@20.11.19) + specifier: ^5.1.5 + version: 5.1.5(@types/node@20.11.25) vue: - specifier: ^3.4.19 - version: 3.4.19(typescript@5.3.3) + specifier: ^3.4.21 + version: 3.4.21(typescript@5.4.2) devDependencies: '@clack/prompts': specifier: ^0.7.0 @@ -81,24 +81,24 @@ importers: '@mdit-vue/shared': specifier: ^2.0.0 version: 2.0.0 + '@polka/compression': + specifier: 1.0.0-next.25 + version: 1.0.0-next.25 '@rollup/plugin-alias': specifier: ^5.1.0 - version: 5.1.0(rollup@4.12.0) + version: 5.1.0(rollup@4.12.1) '@rollup/plugin-commonjs': specifier: ^25.0.7 - version: 25.0.7(rollup@4.12.0) + version: 25.0.7(rollup@4.12.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.12.0) + version: 6.1.0(rollup@4.12.1) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.12.0) + version: 15.2.3(rollup@4.12.1) '@rollup/plugin-replace': specifier: ^5.0.5 - version: 5.0.5(rollup@4.12.0) - '@types/compression': - specifier: ^1.7.5 - version: 1.7.5 + version: 5.0.5(rollup@4.12.1) '@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.19 - version: 20.11.19 + specifier: ^20.11.25 + version: 20.11.25 '@types/postcss-prefix-selector': specifier: ^1.16.3 version: 1.16.3 @@ -142,14 +142,11 @@ importers: specifier: ^2.4.9 version: 2.4.9 '@vue/shared': - specifier: ^3.4.19 - version: 3.4.19 + specifier: ^3.4.21 + version: 3.4.21 chokidar: specifier: ^3.6.0 version: 3.6.0 - compression: - specifier: ^1.7.4 - version: 1.7.4(supports-color@9.4.0) conventional-changelog-cli: specifier: ^4.1.0 version: 4.1.0 @@ -214,8 +211,8 @@ importers: specifier: ^1.2.8 version: 1.2.8 nanoid: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.6 + version: 5.0.6 npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -235,11 +232,11 @@ importers: specifier: ^8.0.0 version: 8.0.0 playwright-chromium: - specifier: ^1.41.2 - version: 1.41.2 + specifier: ^1.42.1 + version: 1.42.1 polka: - specifier: 1.0.0-next.24 - version: 1.0.0-next.24 + specifier: 1.0.0-next.25 + version: 1.0.0-next.25 postcss-prefix-selector: specifier: ^1.16.0 version: 1.16.0 @@ -256,20 +253,20 @@ importers: specifier: ^5.0.5 version: 5.0.5 rollup: - specifier: ^4.12.0 - version: 4.12.0 + specifier: ^4.12.1 + version: 4.12.1 rollup-plugin-dts: specifier: ^6.1.0 - version: 6.1.0(rollup@4.12.0)(typescript@5.3.3) + version: 6.1.0(rollup@4.12.1)(typescript@5.4.2) rollup-plugin-esbuild: specifier: ^6.1.1 - version: 6.1.1(esbuild@0.20.1)(rollup@4.12.0)(supports-color@9.4.0) + version: 6.1.1(esbuild@0.20.1)(rollup@4.12.1)(supports-color@9.4.0) semver: specifier: ^7.6.0 version: 7.6.0 simple-git-hooks: - specifier: ^2.9.0 - version: 2.9.0 + specifier: ^2.10.0 + version: 2.10.0 sirv: specifier: ^2.0.4 version: 2.0.4 @@ -280,14 +277,14 @@ importers: specifier: ^9.4.0 version: 9.4.0 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 vitest: - specifier: ^1.3.0 - version: 1.3.0(@types/node@20.11.19)(supports-color@9.4.0) + specifier: ^1.3.1 + version: 1.3.1(@types/node@20.11.25)(supports-color@9.4.0) vue-tsc: - specifier: ^1.8.27 - version: 1.8.27(typescript@5.3.3) + specifier: ^2.0.6 + version: 2.0.6(typescript@5.4.2) wait-on: specifier: ^7.2.0 version: 7.2.0(debug@4.3.4) @@ -307,8 +304,8 @@ importers: docs: devDependencies: '@lunariajs/core': - specifier: ^0.0.28 - version: 0.0.28(supports-color@9.4.0) + specifier: ^0.0.31 + version: 0.0.31(supports-color@9.4.0) markdown-it-mathjax3: specifier: ^4.3.2 version: 4.3.2 @@ -487,23 +484,23 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.23.9: - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + /@babel/parser@7.24.0: + resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.9 + '@babel/types': 7.24.0 - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@clack/core@0.3.3: - resolution: {integrity: sha512-5ZGyb75BUBjlll6eOa1m/IZBxwk91dooBWhPSL67sWcLS0zt9SnswRL0l26TVdBhb0wnWORRxUn//uH6n4z7+A==} + /@clack/core@0.3.4: + resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} dependencies: picocolors: 1.0.0 sisteransi: 1.0.5 @@ -512,22 +509,22 @@ packages: /@clack/prompts@0.7.0: resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} dependencies: - '@clack/core': 0.3.3 + '@clack/core': 0.3.4 picocolors: 1.0.0 sisteransi: 1.0.5 dev: true bundledDependencies: - is-unicode-supported - /@docsearch/css@3.5.2: - resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} + /@docsearch/css@3.6.0: + resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} dev: false - /@docsearch/js@3.5.2: - resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==} + /@docsearch/js@3.6.0: + resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} dependencies: - '@docsearch/react': 3.5.2 - preact: 10.19.5 + '@docsearch/react': 3.6.0 + preact: 10.19.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -536,8 +533,8 @@ packages: - search-insights dev: false - /@docsearch/react@3.5.2: - resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} + /@docsearch/react@3.6.0: + resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -555,7 +552,7 @@ packages: dependencies: '@algolia/autocomplete-core': 1.9.3(algoliasearch@4.22.1) '@algolia/autocomplete-preset-algolia': 1.9.3(algoliasearch@4.22.1) - '@docsearch/css': 3.5.2 + '@docsearch/css': 3.6.0 algoliasearch: 4.22.1 transitivePeerDependencies: - '@algolia/client-search' @@ -1001,12 +998,12 @@ packages: resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} dev: true - /@lunariajs/core@0.0.28(supports-color@9.4.0): - resolution: {integrity: sha512-uDHXvhxYSKuNKWh89zlSEpvBgAoqrI+lPWETlpIhhJvZ4gkPuAav650TJsZo3uhYECjcc2VdvJHp0O6QFHliIA==} + /@lunariajs/core@0.0.31(supports-color@9.4.0): + resolution: {integrity: sha512-y0yfNOSHTw9rc7pbJJrHQCx0W0yk0T/KgO94+rlRI4OhfdP1PrsTMlTNLij2hxVR2UdstTZWuoYHQKnUk5qHcw==} engines: {node: '>=18.17.0'} hasBin: true dependencies: - '@clack/core': 0.3.3 + '@clack/core': 0.3.4 fast-glob: 3.3.2 get-port: 7.0.0 jiti: 1.21.0 @@ -1014,10 +1011,8 @@ packages: path-to-regexp: 6.2.1 picocolors: 1.0.0 simple-git: 3.22.0(supports-color@9.4.0) - ufo: 1.4.0 ultramatter: 0.0.4 zod: 3.22.4 - zod-validation-error: 2.1.0(zod@3.22.4) transitivePeerDependencies: - supports-color dev: true @@ -1113,11 +1108,16 @@ packages: dev: true optional: true - /@polka/url@1.0.0-next.24: - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + /@polka/compression@1.0.0-next.25: + resolution: {integrity: sha512-UlVkoSGRig87riHSn8QOxd2DzGhadRpNSj5Ukqj+Bt7WTE4Es+sE3ju3OYbe8SiV2OwA+8tDcSuHWUh5S3jCBQ==} + engines: {node: '>=6'} + dev: true + + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} dev: true - /@rollup/plugin-alias@5.1.0(rollup@4.12.0): + /@rollup/plugin-alias@5.1.0(rollup@4.12.1): resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1126,11 +1126,11 @@ packages: rollup: optional: true dependencies: - rollup: 4.12.0 + rollup: 4.12.1 slash: 4.0.0 dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@4.12.0): + /@rollup/plugin-commonjs@25.0.7(rollup@4.12.1): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1139,16 +1139,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) + '@rollup/pluginutils': 5.1.0(rollup@4.12.1) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.7 - rollup: 4.12.0 + magic-string: 0.30.8 + rollup: 4.12.1 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.12.0): + /@rollup/plugin-json@6.1.0(rollup@4.12.1): resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1157,11 +1157,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) - rollup: 4.12.0 + '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + rollup: 4.12.1 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.12.0): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.12.1): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1170,16 +1170,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) + '@rollup/pluginutils': 5.1.0(rollup@4.12.1) '@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.0 + rollup: 4.12.1 dev: true - /@rollup/plugin-replace@5.0.5(rollup@4.12.0): + /@rollup/plugin-replace@5.0.5(rollup@4.12.1): resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1188,12 +1188,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) - magic-string: 0.30.7 - rollup: 4.12.0 + '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + magic-string: 0.30.8 + rollup: 4.12.1 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.12.0): + /@rollup/pluginutils@5.1.0(rollup@4.12.1): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1205,108 +1205,108 @@ packages: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.12.0 + rollup: 4.12.1 dev: true - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + /@rollup/rollup-android-arm-eabi@4.12.1: + resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + /@rollup/rollup-android-arm64@4.12.1: + resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + /@rollup/rollup-darwin-arm64@4.12.1: + resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + /@rollup/rollup-darwin-x64@4.12.1: + resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + /@rollup/rollup-linux-arm-gnueabihf@4.12.1: + resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + /@rollup/rollup-linux-arm64-gnu@4.12.1: + resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + /@rollup/rollup-linux-arm64-musl@4.12.1: + resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + /@rollup/rollup-linux-riscv64-gnu@4.12.1: + resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + /@rollup/rollup-linux-x64-gnu@4.12.1: + resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + /@rollup/rollup-linux-x64-musl@4.12.1: + resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + /@rollup/rollup-win32-arm64-msvc@4.12.1: + resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + /@rollup/rollup-win32-ia32-msvc@4.12.1: + resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + /@rollup/rollup-win32-x64-msvc@4.12.1: + resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@shikijs/core@1.1.5: - resolution: {integrity: sha512-cKc5vGQ4p/4sjx48BHIO7CvLaN32vqpz5Wh7v2n+U1EezGdfX4Wms7khBctKz3iCg9yYq4sfGUc2t+JWj6EUsw==} + /@shikijs/core@1.1.7: + resolution: {integrity: sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==} dev: false - /@shikijs/transformers@1.1.5: - resolution: {integrity: sha512-ot6KWPmLuSN9nA9FAhttOXZIjKIy7cnwpNtI9aWmYN72RUaDz8eojRfMGUXsXXUxW/buvcvdZQAQldk7/pFpdw==} + /@shikijs/transformers@1.1.7: + resolution: {integrity: sha512-lXz011ao4+rvweps/9h3CchBfzb1U5OtP5D51Tqc9lQYdLblWMIxQxH6Ybe1GeGINcEVM4goMyPrI0JvlIp4UQ==} dependencies: - shiki: 1.1.5 + shiki: 1.1.7 dev: false /@sideway/address@4.1.5: @@ -1331,33 +1331,14 @@ packages: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} dev: true - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.11.19 - dev: true - /@types/braces@3.0.4: resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} dev: true - /@types/compression@1.7.5: - resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} - dependencies: - '@types/express': 4.17.21 - dev: true - - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - dependencies: - '@types/node': 20.11.19 - dev: true - /@types/cross-spawn@6.0.6: resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} dependencies: - '@types/node': 20.11.19 + '@types/node': 20.11.25 dev: true /@types/debug@4.1.12: @@ -1373,33 +1354,11 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} - dependencies: - '@types/node': 20.11.19 - '@types/qs': 6.9.11 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - dev: true - - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.11 - '@types/serve-static': 1.15.5 - dev: true - /@types/fs-extra@11.0.4: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.11.19 - dev: true - - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/node': 20.11.25 dev: true /@types/jquery@3.5.29: @@ -1411,7 +1370,7 @@ packages: /@types/jsonfile@6.1.4: resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} dependencies: - '@types/node': 20.11.19 + '@types/node': 20.11.25 dev: true /@types/linkify-it@3.0.5: @@ -1466,14 +1425,6 @@ packages: '@types/braces': 3.0.4 dev: true - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true - - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true - /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true @@ -1486,8 +1437,8 @@ packages: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: true - /@types/node@20.11.19: - resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} + /@types/node@20.11.25: + resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} dependencies: undici-types: 5.26.5 @@ -1504,18 +1455,10 @@ packages: /@types/prompts@2.4.9: resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} dependencies: - '@types/node': 20.11.19 + '@types/node': 20.11.25 kleur: 3.0.3 dev: true - /@types/qs@6.9.11: - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} - dev: true - - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true - /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true @@ -1523,22 +1466,7 @@ packages: /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: - '@types/node': 20.11.19 - dev: true - - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.11.19 - dev: true - - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} - dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.11.19 + '@types/node': 20.11.25 dev: true /@types/sizzle@2.3.8: @@ -1549,49 +1477,49 @@ packages: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: false - /@vitejs/plugin-vue@5.0.4(vite@5.1.3)(vue@3.4.19): + /@vitejs/plugin-vue@5.0.4(vite@5.1.5)(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.3(@types/node@20.11.19) - vue: 3.4.19(typescript@5.3.3) + vite: 5.1.5(@types/node@20.11.25) + vue: 3.4.21(typescript@5.4.2) dev: false - /@vitest/expect@1.3.0: - resolution: {integrity: sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==} + /@vitest/expect@1.3.1: + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} dependencies: - '@vitest/spy': 1.3.0 - '@vitest/utils': 1.3.0 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 chai: 4.4.1 dev: true - /@vitest/runner@1.3.0: - resolution: {integrity: sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==} + /@vitest/runner@1.3.1: + resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} dependencies: - '@vitest/utils': 1.3.0 + '@vitest/utils': 1.3.1 p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.3.0: - resolution: {integrity: sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==} + /@vitest/snapshot@1.3.1: + resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} dependencies: - magic-string: 0.30.7 + magic-string: 0.30.8 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.3.0: - resolution: {integrity: sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==} + /@vitest/spy@1.3.1: + resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.3.0: - resolution: {integrity: sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==} + /@vitest/utils@1.3.1: + resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -1599,156 +1527,154 @@ packages: pretty-format: 29.7.0 dev: true - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + /@volar/language-core@2.1.2: + resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} dependencies: - '@volar/source-map': 1.11.1 + '@volar/source-map': 2.1.2 dev: true - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + /@volar/source-map@2.1.2: + resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} dependencies: - muggle-string: 0.3.1 + muggle-string: 0.4.1 dev: true - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + /@volar/typescript@2.1.2: + resolution: {integrity: sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==} dependencies: - '@volar/language-core': 1.11.1 + '@volar/language-core': 2.1.2 path-browserify: 1.0.1 dev: true - /@vue/compiler-core@3.4.19: - resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==} + /@vue/compiler-core@3.4.21: + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: - '@babel/parser': 7.23.9 - '@vue/shared': 3.4.19 + '@babel/parser': 7.24.0 + '@vue/shared': 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 - /@vue/compiler-dom@3.4.19: - resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==} + /@vue/compiler-dom@3.4.21: + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} dependencies: - '@vue/compiler-core': 3.4.19 - '@vue/shared': 3.4.19 + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 - /@vue/compiler-sfc@3.4.19: - resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==} + /@vue/compiler-sfc@3.4.21: + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: - '@babel/parser': 7.23.9 - '@vue/compiler-core': 3.4.19 - '@vue/compiler-dom': 3.4.19 - '@vue/compiler-ssr': 3.4.19 - '@vue/shared': 3.4.19 + '@babel/parser': 7.24.0 + '@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.7 + magic-string: 0.30.8 postcss: 8.4.35 source-map-js: 1.0.2 dev: false - /@vue/compiler-ssr@3.4.19: - resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==} + /@vue/compiler-ssr@3.4.21: + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} dependencies: - '@vue/compiler-dom': 3.4.19 - '@vue/shared': 3.4.19 + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 dev: false - /@vue/devtools-api@7.0.15(vue@3.4.19): - resolution: {integrity: sha512-kgEYWosDyWpS1vFSuJNNWUnHkP+VkL3Y+9mw+rf7ex41SwbYL/WdC3KXqAtjiSrEs7r/FrHmUTh0BkINJPFkbA==} + /@vue/devtools-api@7.0.16(vue@3.4.21): + resolution: {integrity: sha512-fZG2CG8624qphMf4aj59zNHckMx1G3lxODUuyM9USKuLznXCh66TP+tEbPOCcml16hA0GizJ4D8w6F34hrfbcw==} dependencies: - '@vue/devtools-kit': 7.0.15(vue@3.4.19) + '@vue/devtools-kit': 7.0.16(vue@3.4.21) transitivePeerDependencies: - vue dev: false - /@vue/devtools-kit@7.0.15(vue@3.4.19): - resolution: {integrity: sha512-dT7OeCe1LUCIhHIb/yRR6Hn+XHh73r1o78onqCrxEKHdoZwBItiIeVnmJZPEUDFstIxfs+tJL231mySk3laTow==} + /@vue/devtools-kit@7.0.16(vue@3.4.21): + resolution: {integrity: sha512-IA8SSGiZbNgOi4wLT3mRvd71Q9KE0KvMfGk6haa2GZ6bL2K/xMA8Fvvj3o1maspfUXrGcCXutaqbLqbGx/espQ==} peerDependencies: vue: ^3.0.0 dependencies: - '@vue/devtools-shared': 7.0.15 + '@vue/devtools-shared': 7.0.16 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - vue: 3.4.19(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) dev: false - /@vue/devtools-shared@7.0.15: - resolution: {integrity: sha512-fpfvMVvS7aDgO7x2JPFiTQ1MHcCc63/bE7yTgs278gMBybuO9b3hdiZ/k0Pw1rN+RefaU9yQiFA+5CCFc1D+6w==} + /@vue/devtools-shared@7.0.16: + resolution: {integrity: sha512-Lew4FrGjDjmanaUWSueNE1Rre83k7jQpttc17MaoVw0eARWU5DgZ1F/g9GNUMZXVjbP9rwE+LL3gd9XfXCfkvA==} dependencies: rfdc: 1.3.1 dev: false - /@vue/language-core@1.8.27(typescript@5.3.3): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + /@vue/language-core@2.0.6(typescript@5.4.2): + resolution: {integrity: sha512-UzqU12tzf9XLqRO3TiWPwRNpP4fyUzE6MAfOQWQNZ4jy6a30ARRUpmODDKq6O8C4goMc2AlPqTmjOHPjHkilSg==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.19 - '@vue/shared': 3.4.19 + '@volar/language-core': 2.1.2 + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 computeds: 0.0.1 minimatch: 9.0.3 - muggle-string: 0.3.1 path-browserify: 1.0.1 - typescript: 5.3.3 + typescript: 5.4.2 vue-template-compiler: 2.7.16 dev: true - /@vue/reactivity@3.4.19: - resolution: {integrity: sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==} + /@vue/reactivity@3.4.21: + resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} dependencies: - '@vue/shared': 3.4.19 + '@vue/shared': 3.4.21 dev: false - /@vue/runtime-core@3.4.19: - resolution: {integrity: sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==} + /@vue/runtime-core@3.4.21: + resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} dependencies: - '@vue/reactivity': 3.4.19 - '@vue/shared': 3.4.19 + '@vue/reactivity': 3.4.21 + '@vue/shared': 3.4.21 dev: false - /@vue/runtime-dom@3.4.19: - resolution: {integrity: sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==} + /@vue/runtime-dom@3.4.21: + resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} dependencies: - '@vue/runtime-core': 3.4.19 - '@vue/shared': 3.4.19 + '@vue/runtime-core': 3.4.21 + '@vue/shared': 3.4.21 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.4.19(vue@3.4.19): - resolution: {integrity: sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==} + /@vue/server-renderer@3.4.21(vue@3.4.21): + resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} peerDependencies: - vue: 3.4.19 + vue: 3.4.21 dependencies: - '@vue/compiler-ssr': 3.4.19 - '@vue/shared': 3.4.19 - vue: 3.4.19(typescript@5.3.3) + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + vue: 3.4.21(typescript@5.4.2) dev: false - /@vue/shared@3.4.19: - resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==} + /@vue/shared@3.4.21: + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} - /@vueuse/core@10.7.2(vue@3.4.19): - resolution: {integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==} + /@vueuse/core@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.7.2 - '@vueuse/shared': 10.7.2(vue@3.4.19) - vue-demi: 0.14.7(vue@3.4.19) + '@vueuse/metadata': 10.9.0 + '@vueuse/shared': 10.9.0(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/integrations@10.7.2(focus-trap@7.5.4)(vue@3.4.19): - resolution: {integrity: sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==} + /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.21): + resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} peerDependencies: async-validator: '*' axios: '*' @@ -1788,23 +1714,23 @@ packages: universal-cookie: optional: true dependencies: - '@vueuse/core': 10.7.2(vue@3.4.19) - '@vueuse/shared': 10.7.2(vue@3.4.19) + '@vueuse/core': 10.9.0(vue@3.4.21) + '@vueuse/shared': 10.9.0(vue@3.4.21) focus-trap: 7.5.4 - vue-demi: 0.14.7(vue@3.4.19) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/metadata@10.7.2: - resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==} + /@vueuse/metadata@10.9.0: + resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} dev: false - /@vueuse/shared@10.7.2(vue@3.4.19): - resolution: {integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==} + /@vueuse/shared@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} dependencies: - vue-demi: 0.14.7(vue@3.4.19) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1818,14 +1744,6 @@ packages: through: 2.3.8 dev: true - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - /acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -1947,11 +1865,11 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.22.5 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 dev: true /assertion-error@1.1.0: @@ -1962,9 +1880,11 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /available-typed-arrays@1.0.6: - resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 dev: true /axios@1.6.7(debug@4.3.4): @@ -2022,11 +1942,6 @@ packages: run-applescript: 7.0.0 dev: true - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2192,28 +2107,6 @@ packages: dot-prop: 5.3.0 dev: true - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4(supports-color@9.4.0): - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9(supports-color@9.4.0) - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} dev: true @@ -2406,18 +2299,6 @@ packages: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true - /debug@2.6.9(supports-color@9.4.0): - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - supports-color: 9.4.0 - dev: true - /debug@4.3.4(supports-color@9.4.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2560,17 +2441,17 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.22.4: - resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} + /es-abstract@1.22.5: + resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 es-define-property: 1.0.0 es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 @@ -2578,15 +2459,15 @@ packages: globalthis: 1.0.3 gopd: 1.0.1 has-property-descriptors: 1.0.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.1 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 @@ -2599,10 +2480,10 @@ packages: string.prototype.trim: 1.2.8 string.prototype.trimend: 1.0.7 string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.1 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.1 - typed-array-length: 1.0.4 + 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 unbox-primitive: 1.0.2 which-typed-array: 1.1.14 dev: true @@ -2623,8 +2504,8 @@ packages: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: true - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 @@ -2749,7 +2630,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.2.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -2879,7 +2760,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.22.5 functions-have-names: 1.2.3 dev: true @@ -2902,7 +2783,7 @@ packages: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.1 dev: true @@ -2931,8 +2812,8 @@ packages: get-intrinsic: 1.2.4 dev: true - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -3041,8 +2922,8 @@ packages: es-define-property: 1.0.0 dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} dev: true @@ -3129,7 +3010,7 @@ packages: dependencies: es-errors: 1.3.0 hasown: 2.0.1 - side-channel: 1.0.5 + side-channel: 1.0.6 dev: true /is-array-buffer@3.0.4: @@ -3247,8 +3128,8 @@ packages: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} dev: true @@ -3283,8 +3164,9 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 dev: true @@ -3367,8 +3249,8 @@ packages: hasBin: true dev: true - /joi@17.12.1: - resolution: {integrity: sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==} + /joi@17.12.2: + resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -3461,7 +3343,7 @@ packages: /linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} dependencies: - uc.micro: 2.0.0 + uc.micro: 2.1.0 dev: true /lint-staged@15.2.2(supports-color@9.4.0): @@ -3509,7 +3391,7 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.5.0 + mlly: 1.6.1 pkg-types: 1.0.3 dev: true @@ -3578,8 +3460,8 @@ packages: yallist: 4.0.0 dev: true - /magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -3633,7 +3515,7 @@ packages: linkify-it: 5.0.0 mdurl: 2.0.0 punycode.js: 2.3.1 - uc.micro: 2.0.0 + uc.micro: 2.1.0 dev: true /mathjax-full@3.2.2: @@ -3753,8 +3635,8 @@ packages: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} dev: true - /mlly@1.5.0: - resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: acorn: 8.11.3 pathe: 1.1.2 @@ -3767,16 +3649,12 @@ packages: engines: {node: '>=10'} dev: true - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} dev: true /nanoid@3.3.7: @@ -3784,17 +3662,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@5.0.5: - resolution: {integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==} + /nanoid@5.0.6: + resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} engines: {node: ^18 || >=20} hasBin: true dev: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true @@ -3855,8 +3728,8 @@ packages: string.prototype.padend: 3.1.5 dev: true - /npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 @@ -3887,11 +3760,6 @@ packages: object-keys: 1.1.1 dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -3920,12 +3788,12 @@ packages: file-type: 18.7.0 get-stdin: 9.0.0 meow: 12.1.1 - open: 10.0.3 + open: 10.0.4 tempy: 3.1.0 dev: true - /open@10.0.3: - resolution: {integrity: sha512-dtbI5oW7987hwC9qjJTyABldTaa19SuyJse1QboWv3b0qCcrrLNVDqBx1XgELAjh9QTVQaP/C5b1nhQebd1H2A==} + /open@10.0.4: + resolution: {integrity: sha512-oujJ/FFr7ra6/7gJuQ4ZJJ8Gf2VHM0J3J/W7IvH++zaqEzacWVxzK++NiVY5NLHTTj7u/jNH5H3Ei9biL31Lng==} engines: {node: '>=18'} dependencies: default-browser: 5.2.1 @@ -4104,33 +3972,38 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.1 - mlly: 1.5.0 + mlly: 1.6.1 pathe: 1.1.2 dev: true - /playwright-chromium@1.41.2: - resolution: {integrity: sha512-1XoW4aGGRbS2BJLldtLcv2QW3deMv8myE5iCtfGRPq99BWqmBLJvJTgY/SyfBCoklwQvl91zUWYWHjCAuvKGkw==} + /playwright-chromium@1.42.1: + resolution: {integrity: sha512-VelpmKJ+3G3QlAFfA9JIuEYyU8b8vQrlIPY3tIaGv+adn7mem56SP04e+zMudcxisfOT3suQOSTD1qs6YErdDg==} engines: {node: '>=16'} hasBin: true requiresBuild: true dependencies: - playwright-core: 1.41.2 + playwright-core: 1.42.1 dev: true - /playwright-core@1.41.2: - resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} + /playwright-core@1.42.1: + resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} engines: {node: '>=16'} hasBin: true dev: true - /polka@1.0.0-next.24: - resolution: {integrity: sha512-i0EB3KPaALOLBC8K27UhPzzDyhsrn6KxDu0+agIz6ZgA2oNqqQjxBn+z9w2Ba4obV/PoqEJtyfzBkYgqKEJYiA==} + /polka@1.0.0-next.25: + resolution: {integrity: sha512-LBgDEGL73aeb/5yAwO9JWsqCuqPdvEdwA/n25Y38F4kv6jqFaLbgIWVuZfsv9Sc9O052eoWWrAjGB75oCQvELw==} engines: {node: '>=8'} dependencies: - '@polka/url': 1.0.0-next.24 + '@polka/url': 1.0.0-next.25 trouter: 4.0.0 dev: true + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + /postcss-prefix-selector@1.16.0: resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} peerDependencies: @@ -4148,8 +4021,8 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /preact@10.19.5: - resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} + /preact@10.19.6: + resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} dev: false /prettier@3.2.5: @@ -4203,7 +4076,7 @@ packages: dependencies: find-up: 6.3.0 read-pkg: 8.1.0 - type-fest: 4.10.2 + type-fest: 4.11.1 dev: true /read-pkg@3.0.0: @@ -4222,7 +4095,7 @@ packages: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.0 parse-json: 7.1.1 - type-fest: 4.10.2 + type-fest: 4.11.1 dev: true /readable-stream@3.6.2: @@ -4255,7 +4128,7 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.1 + set-function-name: 2.0.2 dev: true /regexparam@3.0.0: @@ -4300,57 +4173,57 @@ packages: glob: 10.3.10 dev: true - /rollup-plugin-dts@6.1.0(rollup@4.12.0)(typescript@5.3.3): + /rollup-plugin-dts@6.1.0(rollup@4.12.1)(typescript@5.4.2): resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} engines: {node: '>=16'} peerDependencies: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 dependencies: - magic-string: 0.30.7 - rollup: 4.12.0 - typescript: 5.3.3 + magic-string: 0.30.8 + rollup: 4.12.1 + typescript: 5.4.2 optionalDependencies: '@babel/code-frame': 7.23.5 dev: true - /rollup-plugin-esbuild@6.1.1(esbuild@0.20.1)(rollup@4.12.0)(supports-color@9.4.0): + /rollup-plugin-esbuild@6.1.1(esbuild@0.20.1)(rollup@4.12.1)(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.0) + '@rollup/pluginutils': 5.1.0(rollup@4.12.1) debug: 4.3.4(supports-color@9.4.0) es-module-lexer: 1.4.1 esbuild: 0.20.1 - get-tsconfig: 4.7.2 - rollup: 4.12.0 + get-tsconfig: 4.7.3 + rollup: 4.12.1 transitivePeerDependencies: - supports-color dev: true - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + /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.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 + '@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 /run-applescript@7.0.0: @@ -4380,10 +4253,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true @@ -4434,11 +4303,12 @@ packages: has-property-descriptors: 1.0.2 dev: true - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 dev: true @@ -4471,14 +4341,14 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true - /shiki@1.1.5: - resolution: {integrity: sha512-754GuKIwkUdT810Xm8btuyNQPL+q3PqOkwGW/VlmAWyMYp+HbvvDt69sWXO1sm5aeczBJQjmQTTMR4GkKQNQPw==} + /shiki@1.1.7: + resolution: {integrity: sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==} dependencies: - '@shikijs/core': 1.1.5 + '@shikijs/core': 1.1.7 dev: false - /side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -4500,8 +4370,8 @@ packages: engines: {node: '>=14'} dev: true - /simple-git-hooks@2.9.0: - resolution: {integrity: sha512-waSQ5paUQtyGC0ZxlHmcMmD9I1rRXauikBwX31bX58l5vTOhCEcBC5Bi+ZDkPXTjDnZAF8TbCqKBY+9+sVPScw==} + /simple-git-hooks@2.10.0: + resolution: {integrity: sha512-TtCytVYfV77pILCkzVxpOSgYKHQyaO7fBI/iwG5bLGb0dIo/v/K1Y1IZ5DN40RQu6WNNJiN0gkuRvSYjxOhFog==} hasBin: true requiresBuild: true dev: true @@ -4520,7 +4390,7 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.24 + '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 dev: true @@ -4670,7 +4540,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.22.5 dev: true /string.prototype.trim@1.2.8: @@ -4679,7 +4549,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.22.5 dev: true /string.prototype.trimend@1.0.7: @@ -4687,7 +4557,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.22.5 dev: true /string.prototype.trimstart@1.0.7: @@ -4695,7 +4565,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.22.5 dev: true /string_decoder@1.3.0: @@ -4872,13 +4742,13 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.10.2: - resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} + /type-fest@4.11.1: + resolution: {integrity: sha512-MFMf6VkEVZAETidGGSYW2B1MjXbGX+sWIywn2QPEaJ3j08V+MwVRHMXtf2noB8ENJaD0LIun9wh5Z6OPNf1QzQ==} engines: {node: '>=16'} dev: true - /typed-array-buffer@1.0.1: - resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -4886,43 +4756,48 @@ packages: is-typed-array: 1.1.13 dev: true - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 + gopd: 1.0.1 + has-proto: 1.0.3 is-typed-array: 1.1.13 dev: true - /typed-array-byte-offset@1.0.1: - resolution: {integrity: sha512-tcqKMrTRXjqvHN9S3553NPCaGL0VPgFI92lXszmrE8DMhiDPLBYLlvo8Uu4WZAAX/aGqp/T1sbA4ph8EWjDF9Q==} + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-proto: 1.0.1 + has-proto: 1.0.3 is-typed-array: 1.1.13 dev: true - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + /typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 dev: true - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true - /uc.micro@2.0.0: - resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==} + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: true /ufo@1.4.0: @@ -4981,13 +4856,8 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /vite-node@1.3.0(@types/node@20.11.19)(supports-color@9.4.0): - resolution: {integrity: sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==} + /vite-node@1.3.1(@types/node@20.11.25)(supports-color@9.4.0): + resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -4995,7 +4865,7 @@ packages: debug: 4.3.4(supports-color@9.4.0) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.3(@types/node@20.11.19) + vite: 5.1.5(@types/node@20.11.25) transitivePeerDependencies: - '@types/node' - less @@ -5007,8 +4877,8 @@ packages: - terser dev: true - /vite@5.1.3(@types/node@20.11.19): - resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + /vite@5.1.5(@types/node@20.11.25): + resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5035,22 +4905,22 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.19 + '@types/node': 20.11.25 esbuild: 0.19.12 postcss: 8.4.35 - rollup: 4.12.0 + rollup: 4.12.1 optionalDependencies: fsevents: 2.3.3 - /vitest@1.3.0(@types/node@20.11.19)(supports-color@9.4.0): - resolution: {integrity: sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==} + /vitest@1.3.1(@types/node@20.11.25)(supports-color@9.4.0): + resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} 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.0 - '@vitest/ui': 1.3.0 + '@vitest/browser': 1.3.1 + '@vitest/ui': 1.3.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5067,26 +4937,26 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.19 - '@vitest/expect': 1.3.0 - '@vitest/runner': 1.3.0 - '@vitest/snapshot': 1.3.0 - '@vitest/spy': 1.3.0 - '@vitest/utils': 1.3.0 + '@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 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4(supports-color@9.4.0) execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.7 + magic-string: 0.30.8 pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.3(@types/node@20.11.19) - vite-node: 1.3.0(@types/node@20.11.19)(supports-color@9.4.0) + vite: 5.1.5(@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: - less @@ -5098,7 +4968,7 @@ packages: - terser dev: true - /vue-demi@0.14.7(vue@3.4.19): + /vue-demi@0.14.7(vue@3.4.21): resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} engines: {node: '>=12'} hasBin: true @@ -5110,7 +4980,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.4.19(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) dev: false /vue-template-compiler@2.7.16: @@ -5120,32 +4990,32 @@ packages: he: 1.2.0 dev: true - /vue-tsc@1.8.27(typescript@5.3.3): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + /vue-tsc@2.0.6(typescript@5.4.2): + resolution: {integrity: sha512-kK50W4XqQL34vHRkxlRWLicrT6+F9xfgCgJ4KSmCHcytKzc1u3c94XXgI+CjmhOSxyw0krpExF7Obo7y4+0dVQ==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.3.3) + '@volar/typescript': 2.1.2 + '@vue/language-core': 2.0.6(typescript@5.4.2) semver: 7.6.0 - typescript: 5.3.3 + typescript: 5.4.2 dev: true - /vue@3.4.19(typescript@5.3.3): - resolution: {integrity: sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==} + /vue@3.4.21(typescript@5.4.2): + resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.19 - '@vue/compiler-sfc': 3.4.19 - '@vue/runtime-dom': 3.4.19 - '@vue/server-renderer': 3.4.19(vue@3.4.19) - '@vue/shared': 3.4.19 - typescript: 5.3.3 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-sfc': 3.4.21 + '@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 dev: false /wait-on@7.2.0(debug@4.3.4): @@ -5154,7 +5024,7 @@ packages: hasBin: true dependencies: axios: 1.6.7(debug@4.3.4) - joi: 17.12.1 + joi: 17.12.2 lodash: 4.17.21 minimist: 1.2.8 rxjs: 7.8.1 @@ -5201,7 +5071,7 @@ packages: resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 @@ -5290,15 +5160,6 @@ packages: engines: {node: '>=12.20'} dev: true - /zod-validation-error@2.1.0(zod@3.22.4): - resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 - dependencies: - zod: 3.22.4 - dev: true - /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: true diff --git a/src/node/serve/serve.ts b/src/node/serve/serve.ts index e2434e90..2c5295a4 100644 --- a/src/node/serve/serve.ts +++ b/src/node/serve/serve.ts @@ -1,8 +1,8 @@ -import compression from 'compression' +import compression from '@polka/compression' import fs from 'fs-extra' import path from 'path' import polka, { type IOptions } from 'polka' -import sirv, { type RequestHandler } from 'sirv' +import sirv from 'sirv' import { resolveConfig } from '../config' function trimChar(str: string, char: string) { @@ -37,7 +37,7 @@ export async function serve(options: ServeOptions = {}) { res.end() } - const compress = compression() as RequestHandler + const compress = compression({ brotli: true }) const serve = sirv(config.outDir, { etag: true, maxAge: 31536000, From 190904171500ad22998c8666080fd58c867a59b5 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 10 Mar 2024 14:21:41 +0530 Subject: [PATCH 029/114] fix(theme): local nav separator not visible on pages having no outline --- .../theme-default/components/VPNavBar.vue | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/client/theme-default/components/VPNavBar.vue b/src/client/theme-default/components/VPNavBar.vue index ce18f4a3..19a5da61 100644 --- a/src/client/theme-default/components/VPNavBar.vue +++ b/src/client/theme-default/components/VPNavBar.vue @@ -2,7 +2,6 @@ import { useWindowScroll } from '@vueuse/core' import { ref, watchPostEffect } from 'vue' import { useData } from '../composables/data' -import { useLocalNav } from '../composables/local-nav' import { useSidebar } from '../composables/sidebar' import VPNavBarAppearance from './VPNavBarAppearance.vue' import VPNavBarExtra from './VPNavBarExtra.vue' @@ -23,7 +22,6 @@ defineEmits<{ const { y } = useWindowScroll() const { hasSidebar } = useSidebar() -const { hasLocalNav } = useLocalNav() const { frontmatter } = useData() const classes = ref>({}) @@ -31,8 +29,8 @@ const classes = ref>({}) watchPostEffect(() => { classes.value = { 'has-sidebar': hasSidebar.value, - 'has-local-nav': hasLocalNav.value, - top: frontmatter.value.layout === 'home' && y.value === 0, + 'home': frontmatter.value.layout === 'home', + 'top': y.value === 0, } }) @@ -79,16 +77,16 @@ watchPostEffect(() => { transition: background-color 0.5s; } -.VPNavBar.has-local-nav { +.VPNavBar:not(.home) { background-color: var(--vp-nav-bg-color); } @media (min-width: 960px) { - .VPNavBar.has-local-nav { + .VPNavBar:not(.home) { background-color: transparent; } - .VPNavBar:not(.has-sidebar):not(.top) { + .VPNavBar:not(.has-sidebar):not(.home.top) { background-color: var(--vp-nav-bg-color); } } @@ -188,12 +186,12 @@ watchPostEffect(() => { } @media (min-width: 960px) { - .VPNavBar:not(.top) .content-body { + .VPNavBar:not(.home.top) .content-body { position: relative; background-color: var(--vp-nav-bg-color); } - .VPNavBar:not(.has-sidebar):not(.top) .content-body { + .VPNavBar:not(.has-sidebar):not(.home.top) .content-body { background-color: transparent; } } @@ -253,16 +251,16 @@ watchPostEffect(() => { transition: background-color 0.5s; } -.VPNavBar.has-local-nav .divider-line { +.VPNavBar:not(.home) .divider-line { background-color: var(--vp-c-gutter); } @media (min-width: 960px) { - .VPNavBar:not(.top) .divider-line { + .VPNavBar:not(.home.top) .divider-line { background-color: var(--vp-c-gutter); } - .VPNavBar:not(.has-sidebar):not(.top) .divider { + .VPNavBar:not(.has-sidebar):not(.home.top) .divider { background-color: var(--vp-c-gutter); } } From df8753bd927c2b57b9188fb292c1429e9c3c8ab6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 12 Mar 2024 23:29:29 +0800 Subject: [PATCH 030/114] 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 031/114] 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 032/114] 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 033/114] 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 034/114] 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 035/114] 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 036/114] 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 037/114] 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 038/114] 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 039/114] 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 040/114] 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 041/114] 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 042/114] 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 043/114] 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 052/114] 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 053/114] 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 054/114] 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 055/114] 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 056/114] 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" >