Merge branch 'translate_vitepress' into docs_spanish_translation

pull/3859/head
Camilo Parra 1 year ago
commit fda6b56d41

@ -1,3 +1,35 @@
## [1.2.2](https://github.com/vuejs/vitepress/compare/v1.2.1...v1.2.2) (2024-05-21)
### Bug Fixes
- dont escape ampersand twice in title ([7ea3572](https://github.com/vuejs/vitepress/commit/7ea357256c855ae0a9a142c14bbd5e7d344ef865))
## [1.2.1](https://github.com/vuejs/vitepress/compare/v1.2.0...v1.2.1) (2024-05-21)
### Bug Fixes
- **a11y:** make code blocks accessible with keyboard ([#3902](https://github.com/vuejs/vitepress/issues/3902)) ([cb308b9](https://github.com/vuejs/vitepress/commit/cb308b9295e1e661c2c72fa4229b5c7d83278d49))
- escape title properly in build ([49b1233](https://github.com/vuejs/vitepress/commit/49b1233378436054c07a6ef646d0029096124021))
- **theme:** remove unnecessary navigation role on nav element ([af4717d](https://github.com/vuejs/vitepress/commit/af4717d6820233a011200d44abba53d0f66bfad3))
# [1.2.0](https://github.com/vuejs/vitepress/compare/v1.1.4...v1.2.0) (2024-05-18)
### Bug Fixes
- **build:** show file info on error ([f0debd2](https://github.com/vuejs/vitepress/commit/f0debd20f48ab7eb58cfd142147531509d6c0209))
- **dev:** match dev and prod routing behavior ([#3837](https://github.com/vuejs/vitepress/issues/3837)) ([b360ac8](https://github.com/vuejs/vitepress/commit/b360ac88df3bfd60e3498cc19066c0c90261ee4f))
- **markdown:** entities and escapes not working properly ([#3882](https://github.com/vuejs/vitepress/issues/3882)) ([d5dbd70](https://github.com/vuejs/vitepress/commit/d5dbd704ceb215ebf3ce9b23deec6e6c90634f0a))
- render 404 page completely on client to infer locale from browser path ([#3858](https://github.com/vuejs/vitepress/issues/3858)) ([728cb15](https://github.com/vuejs/vitepress/commit/728cb15677f4f84b33bed6bb2f70f47600ea1057))
- **style:** prefer YaHei over DengXian ([f0a37b4](https://github.com/vuejs/vitepress/commit/f0a37b4b8445ec914700df054c0897721382e5b1))
- **theme/regression:** custom font not applying in Chinese docs because of specificity ([fa2f38a](https://github.com/vuejs/vitepress/commit/fa2f38a0c3bd121dcb7e07420566087c19b10f96)), closes [#3864](https://github.com/vuejs/vitepress/issues/3864)
- **theme:** external link icon not visible for target \_blank links ([d08eeed](https://github.com/vuejs/vitepress/commit/d08eeed89726572f7ea341df59864cc72716751c)), closes [#3327](https://github.com/vuejs/vitepress/issues/3327)
- **theme:** fix invalid vp-offset in ssr ([9794877](https://github.com/vuejs/vitepress/commit/9794877347140c7b4955d735cd8867c260a5089d))
### Features
- **build/i18n:** support customizing copy code button's tooltip text ([#3854](https://github.com/vuejs/vitepress/issues/3854)) ([ed6ada7](https://github.com/vuejs/vitepress/commit/ed6ada7a688c466920f3e0ef33b7176b8eb01eee))
- **build:** add localeIndex to md.env ([#3862](https://github.com/vuejs/vitepress/issues/3862)) ([0cbb469](https://github.com/vuejs/vitepress/commit/0cbb469842d74381ad56d44b7975f34c405b78f8))
## [1.1.4](https://github.com/vuejs/vitepress/compare/v1.1.3...v1.1.4) (2024-04-27)
### Bug Fixes

@ -0,0 +1,74 @@
# Intefaz de Linea de Comando {#command-line-interface}
## `vitepress dev`
Inicia el servidor de desarrollo VitePress con el directorio designado como raíz. Por defecto, utiliza el director actual. el comando `dev` también se puede omitir cuando se ejecuta el directorio actual.
### Uso
```sh
# Comienza en el directorio actual, omite el `dev`
vitepress
# iniciar en un subdirectorio
vitepress dev [root]
```
### Opciones {#options}
| Opciones | Descripción |
| --------------- | ----------------------------------------------------------------- |
| `--open [path]` | Abre el navegador en el inicio (`boolean \| string`) |
| `--port <port>` | Especifica el puerto (`number`) |
| `--base <path>` | Ruta de base pública (por defecto: `/`) (`string`) |
| `--cors` | Habilitar CORS |
| `--strictPort` | Salir si el puerto especificado ya esta en uso (`boolean`) |
| `--force` | Obligar al optimizador a ignorar el cachey volver a empaquetar (`boolean`) |
## `vitepress build`
Compilar el sitio web de VitePress para producción.
### Uso
```sh
vitepress build [root]
```
### Opciones
| Opcion | Descripción |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| `--mpa` (experimental) | Compilar en [Modo MPA](../guide/mpa-mode) Sin hidratación del lado del cliente (`boolean`) |
| `--base <path>` | Ruta de base pública (por defecto: `/`) (`string`) |
| `--target <target>` | Transpilar objetivo (por defecto: `"modules"`) (`string`) |
| `--outDir <dir>` | Directorio de salida relativo a **cwd** (por defecto: `<root>/.vitepress/dist`) (`string`) |
| `--minify [minifier]` | Habilitar/desabilitar la minificación, o especifica un minero para usar (por defecto: `"esbuild"`) (`boolean \| "terser" \| "esbuild"`) |
| `--assetsInlineLimit <number>` | Limitar los bytes para alinear los activos en base 64 (por defecto: `4096`) (`number`) |
## `vitepress preview`
Proporciona localmente la compilación de la producción.
### Uso
```sh
vitepress preview [root]
```
### Opciones
| Opción | Descripción |
| --------------- | ------------------------------------------ |
| `--base <path>` | Ruta de base pública (por defecto: `/`) (`string`) |
| `--port <port>` | Especifica el puerto (`number`) |
## `vitepress init`
Inicia el [Asistente de Instalación](../guide/getting-started#setup-wizard) en el directorio actual.
### Uso
```sh
vitepress init
```

@ -0,0 +1,69 @@
# Badge {#badge}
Los Badge te permite agregar estados a tus encabezados. Por ejemplo, podría resultar útil especificar el tipo de sección o la version compatible.
## Uso {#usage}
Puedes usar el componente `Badge` que está disponible globalmente.
```html
### Title <Badge type="info" text="default" />
### Title <Badge type="tip" text="^1.9.0" />
### Title <Badge type="warning" text="beta" />
### Title <Badge type="danger" text="caution" />
```
el código anterior se representa como:
### Title <Badge type="info" text="default" />
### Title <Badge type="tip" text="^1.9.0" />
### Title <Badge type="warning" text="beta" />
### Title <Badge type="danger" text="caution" />
## Personalizar hijos {#custom-children}
`<Badge>` acepta `children` (hijos), que se mostrará en el badge.
```html
### Title <Badge type="info">custom element</Badge>
```
### Title <Badge type="info">custom element</Badge>
## Personalizar Tipo de Color {#customize-type-color}
Puedes personalizar el estilo del badge anulando las variables CSS. los siguiente son los valores predeterminados:
```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>`
El componente `<Badge>` acepta las siguiente propiedades:
```ts
interface Props {
// Quando `<slot>` é passado, esse valor é ignorado.
text?: string
// O padrão é `tip`.
type?: 'info' | 'tip' | 'warning' | 'danger'
}
```

@ -0,0 +1,22 @@
# Carbon Ads {#carbon-ads}
VitePress ha incorporado soporte nativo para [Carbon Ads](https://www.carbonads.net/). Al definir las credenciales de Carbon Ads en la configuración, VitePress mostrará anuncios en la página.
```js
export default {
themeConfig: {
carbonAds: {
code: 'seu-código-carbon',
placement: 'sua-veiculação-carbon'
}
}
}
```
Estos valores se utilizan para llamar al script en CDN de carbon como se muestra a continuación.
```js
`//cdn.carbonads.com/carbon.js?serve=${code}&placement=${placement}`
```
Para obtener más información de la configuración de Carbono Ads, por favor visite [Site Carbon Ads](https://www.carbonads.net/).

@ -0,0 +1,452 @@
# Configuración del Tema Predeterminado {#default-theme-config}
La configuración del tema te permite personalizar tu tema. puede definir la configuración del tema a travez de la opción `themeConfig` en el archivo de configuración:
```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: { ... }
}
}
```
**Las opciones documentadas de esta página se aplican unicamente al tema por defecto.** Diferentes temas esperan configuraciones diferentes de tema. Cuando se utiliza un tema personalizado, el objeto de configuración del tema se pasará al tema para que se puedan definir comportamientos condicionales.
## i18nRouting
- Tipo: `boolean`
Cambie la configuración a, por ejemplo, `zh` será alterado para URL `/foo` (ou `/en/foo/`) para `/zh/foo`. Puedes desactivar este comportamiento configurado `themeConfig.i18nRouting` como `false`.
## logo
- Tipo: `ThemeableImage`
Archivo de logotipo que se mostrará en la barra de navegación, justo antes del título del sitio. Acepta una ruta de cadena o un objeto para definir un logotipo diferente para los modos claro/oscuro.
```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`
Puede personalizar este elemento para reemplazar el título del sitio predeterminado (`title` en configuración de la aplicación) en navegación. Cuando se establece como `false`, el título en la navegación quedará deshabilitado. Útil cuando tienes un `logo` que ya contiene el título del sitio.
```ts
export default {
themeConfig: {
siteTitle: 'Olá Mundo'
}
}
```
## nav
- Tipo: `NavItem`
La configuración del elemento del menú de navegación. Más detalles en [Tema Predeterminado: Navegación](./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
noIcon?: boolean
}
interface NavItemChildren {
text?: string
items: NavItemWithLink[]
}
interface NavItemWithChildren {
text?: string
items: (NavItemChildren | NavItemWithLink)[]
activeMatch?: string
}
```
## sidebar
- Tipo: `Sidebar`
La configuración del elemento del menú de la barra lateral. Más detalles en [Tema Predeterminado: Barra Lateral](./default-theme-sidebar).
```ts
export default {
themeConfig: {
sidebar: [
{
text: 'Guia',
items: [
{ text: 'Introducción', link: '/introduction' },
{ text: 'A partir de', link: '/getting-started' },
...
]
}
]
}
}
```
```ts
export type Sidebar = SidebarItem[] | SidebarMulti
export interface SidebarMulti {
[path: string]: SidebarItem[]
}
export type SidebarItem = {
/**
* El rotulo del item.
*/
text?: string
/**
* El link del item.
*/
link?: string
/**
* Los hijos del item.
*/
items?: SidebarItem[]
/**
* Si no se especifica, el grupo no es retráctil.
*
* Si es 'true', el grupo se puede contraer y está contraído de forma predeterminada.
*
* Si es 'false', el grupo se puede contraer pero se expande de forma predeterminada.
*/
collapsed?: boolean
}
```
## aside
- Tipo: `boolean | 'left'`
- Estandar: `true`
- Puede ser anulado por la página a través de [frontmatter](./frontmatter-config#aside)
Definir este valor como `false` evita que se muestre el elemento lateral.\
Definir este valor como `true` presenta el lado de la derecha.\
Definir este valor como `left` presenta el lado de la izquierda.
Si desea deshabilitarlo para todas las vistas, debe usar `outline: false` en vez de eso.
## outline
- Tipo: `Outline | Outline['level'] | false`
- El nivel se puede superponer por página mediante [frontmatter](./frontmatter-config#outline)
Definir este valor como `false` evita que el elemento se muestre _outline_. Consulte la interfaz para más detalles:
```ts
interface Outline {
/**
* Los niveles de título que se mostrarán en el esquema.
* Un solo número significa que solo se mostrarán los títulos de ese nivel.
* Si se pasa una tupla, el primer número es el nivel mínimo y el segundo número es el nivel máximo.
* `'deep'` es lo mismo que `[2, 6]`, lo que sifnifica que todos los titulos `<h2>` a `<h6>` serán mostrados.
*
* @default 2
*/
level?: number | [number, number] | 'deep'
/**
* El titulo que se mostrará en el equema.
*
* @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: '...' },
// También puedes agregar íconos personalizados pasando SVG como string:
{
icon: {
svg: '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Dribbble</title><path d="M12...6.38z"/></svg>'
},
link: '...',
// También puedes incluir una etiquera personalizada de accesibilidad (opcional pero recomendada):
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`
- Se puede superponer por página mediante [frontmatter](./frontmatter-config#footer)
Configuración de pie de página. Puede agregar un mensaje o texto de derechos de autor en el pie de página; sin embargo, solo se mostrará cuando la página no contenga una barra lateral. Esto se debe a preocupaciones de diseño.
```ts
export default {
themeConfig: {
footer: {
message: 'Publicado bajo la licencia MIT.',
copyright: 'Derechos de autor © 2019-presente Evan You'
}
}
}
```
```ts
export interface Footer {
message?: string
copyright?: string
}
```
## editLink
- Tipo: `EditLink`
- Se puede superponer por página mediante [frontmatter](./frontmatter-config#editlink)
_EditLink_ le permite mostrar un enlace para editar la página en los servicios de administración Git, como GitHub o GitLab. Consulte [Tema por defecto: Editar Link](./default-theme-edit-link) para más detalles.
```ts
export default {
themeConfig: {
editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path',
text: 'Editar esta página en GitHub'
}
}
}
```
```ts
export interface EditLink {
pattern: string
text?: string
}
```
## lastUpdated
- Tipo: `LastUpdatedOptions`
Permite la personalización del formato de fecha y texto actualizado por ultima vez.
```ts
export default {
themeConfig: {
lastUpdated: {
text: 'Actualizado en',
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`
Una opción para dar soporte para buscar en su sitio de documentación usando [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Obtenga más información en [Tema predeterminado: Buscar](./default-theme-search).
```ts
export interface AlgoliaSearchOptions extends DocSearchProps {
locales?: Record<string, Partial<DocSearchProps>>
}
```
Ver todas las opciones [aquí](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts).
## carbonAds {#carbon-ads}
- Tipo: `CarbonAdsOptions`
Una opción para mostrar [Carbon Ads](https://www.carbonads.net/).
```ts
export default {
themeConfig: {
carbonAds: {
code: 'su-código-carbon',
placement: 'su-colocación-carbon'
}
}
}
```
```ts
export interface CarbonAdsOptions {
code: string
placement: string
}
```
Obtenga más información en [Tema Predeterminado: Carbon Ads](./default-theme-carbon-ads).
## docFooter
- Tipo: `DocFooter`
Se puede utilizar para personalizar el texto que aparece encima de los enlaces anterior y siguiente. Útil si no estás escribiendo documentación en inglés. También se puede utilizar para desactivar globalmente los enlaces anteriores/siguientes. Si desea habilitar/deshabilitar selectivamente enlaces anteriores/siguientes, puede 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`
- Estandar: `Appearance`
Se puede utilizar para personalizar la etiqueta del botón del modo oscuro. Esta etiqueta solo se muestra en la vista móvil.
## lightModeSwitchTitle
- Tipo: `string`
- Estandar: `Switch to light theme`
Se puede utilizar para personalizar el título del botón borrar que aparece al pasar el mouse.
## darkModeSwitchTitle
- Tipo: `string`
- Estandar: `Switch to dark theme`
Se puede utilizar para personalizar el título del botón del modo oscuro que aparece al pasar el mouse.
## sidebarMenuLabel
- Tipo: `string`
- Estandar: `Menu`
Se puede utilizar para personalizar la etiqueta del menú de la barra lateral. Esta etiqueta solo se muestra en la vista móvil.
## returnToTopLabel
- Tipo: `string`
- Estandar: `Return to top`
Se puede utilizar para personalizar la etiqueta del botón Volver al principio. Esta etiqueta solo se muestra en la vista móvil.
## langMenuLabel
- Tipo: `string`
- Estandar: `Change language`
Se puede utilizar para personalizar la etiqueta aria del botón de idioma en la barra de navegación. Esto sólo se usa si estás usando [i18n](../guide/i18n).
## externalLinkIcon
- Tipo: `boolean`
- Estandar: `false`
Se debe mostrar um ícono de link externo junto a los enlaces externos en markdown.

@ -0,0 +1,60 @@
# Editar Link {#edit-link}
## Configuración a nivel de sitio {#site-level-config}
Editar enlace le permite mostrar un enlace para editar la página con servicios de administración de Git como GitHub o GitLab. Para habilitar, agregue la opción `themeConfig.editLink` en su configuración.
```js
export default {
themeConfig: {
editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path'
}
}
}
```
La opción `pattern` define una estructura de URL para el enlace, y `:path` se reemplaza con la misma ruta de la página
También puedes poner una función pura que acepte [`PageData`](./runtime-api#usedata) como argumento y retorna una URL en 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}`
}
}
}
}
}
```
Esto no debería generar efectos secundarios ni acceder a nada fuera de su alcance, ya que será serializado y ejecutado en el navegador.
De forma predeterminada, esto agregará el enlace con el texto 'Editar esta página' al final de la página de documentación. Puedes personalizar este texto configurando la opción `text`.
```js
export default {
themeConfig: {
editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path',
text: 'Edite essa página no GitHub'
}
}
}
```
## Configuración Frontmatter {#frontmatter-config}
La funcionalidad se puede desactivar por página utilizando la opción `editLink` en frontmatter:
```yaml
---
editLink: false
---
```

@ -0,0 +1,53 @@
# Pie de página {#footer}
VitePress mostrará un pie de página global en la parte inferior de la página cuando `themeConfig.footer` está presente.
```ts
export default {
themeConfig: {
footer: {
message: 'Publicado bajo la licencia MIT.',
copyright: 'Derechos de autor © 2019-present Evan You'
}
}
}
```
```ts
export interface Footer {
// El mensaje mostrado justo antes del copyright.
message?: string
// El texto real de copyright.
copyright?: string
}
```
La configuración anterior también admite cadenas HTML. Entonces, por ejemplo, si desea configurar el texto de su pie de página para que tenga algunos enlaces, puede ajustar la configuración de la siguiente manera:
```ts
export default {
themeConfig: {
footer: {
message: 'Publicado bajo <a href="https://github.com/vuejs/vitepress/blob/main/LICENSE">Licencia MIT</a>.',
copyright: 'Derechos de autor © 2019-present <a href="https://github.com/yyx990803">Evan You</a>'
}
}
}
```
::: warning
Solo se utilizan elementos _inline_ será utilizado en `message` y `copyright` tal como se presenta dentro del elemento `<p>`. Si desea agregar elementos de tipo _block_, considere usar un _slot_ [`layout-bottom`](../guide/extending-default-theme#layout-slots).
:::
Tenga en cuenta que el pie de página no se mostrará cuando la [Barra Lateral](./default-theme-sidebar) es visible.
## Configuración Frontmatter {#frontmatter-config}
Esto se puede desactivar por página usando la opción `footer` en frontmatter:
```yaml
---
footer: false
---
```

@ -0,0 +1,168 @@
# Página Inicial {#home-page}
El tema predeterminado de VitePress proporciona un diseño de página de inicio, que también puedes ver en uso [en la página de inicio de este sitio web](../). Puedes usarlo en cualquiera de sus páginas especificando `layout: home` en [frontmatter](./frontmatter-config).
```yaml
---
layout: home
---
```
Sin embargo, esta opción por sí sola no sirve de mucho. Puede agregar varias "secciones" predefinidas diferentes a la página de inicio configurando opciones adicionales como `hero` y `features`.
## Sección Hero {#hero-section}
La sección _Hero_ queda en la parte superior de la página de inicio. Asi es como se puede configurar la sección _Hero_.
```yaml
---
layout: home
hero:
name: VitePress
text: Generador de sitios web estaticos con 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 en GitHub
link: https://github.com/vuejs/vitepress
---
```
```ts
interface Hero {
// El string que se muestra encima del `text`. Viene con el color de la marca
// y se espera que sea breve, como el nombre del producto.
name?: string
// El texto principal de la sección de hero.
// Esto se definirá como un tag `h1`.
text: string
// Eslogan que se muestra abajo del `text`.
tagline?: string
// La imagen se muestra junto al área de texto y eslogan.
image?: ThemeableImage
// Botones accionables para mostrar en la sección principal de la página de inicio.
actions?: HeroAction[]
}
type ThemeableImage =
| string
| { src: string; alt?: string }
| { light: string; dark: string; alt?: string }
interface HeroAction {
// Tema de color de botón. Estándar: `brand`.
theme?: 'brand' | 'alt'
// Etqueta del botón.
text: string
// Destino del enlace del botón.
link: string
// Atributo target del link.
target?: string
// Atributo rel del link.
rel?: string
}
```
### Personalizando el color del nombre {#customizing-the-name-color}
VitePress usa el color de la marca (`--vp-c-brand-1`) para `name`. Sin embargo, puedes personalizar este color anulando la variable `--vp-home-hero-name-color`.
```css
:root {
--vp-home-hero-name-color: blue;
}
```
También puedes personalizarlo aún más combinando `--vp-home-hero-name-background` para dar al `name` un color degradado.
```css
:root {
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #bd34fe, #41d1ff);
}
```
## Sección de caracteristicas {#features-section}
En la sección de funciones, puede enumerar cualquier cantidad de funciones que desee mostrar inmediatamente después de la sección. _Hero_. Para configurarlo seleccione la opción `features` para el frontmatter.
Puede proporcionar un icono para cada función, que puede ser un emoji o cualquier tipo de imagen. Cuando el icono configurado es una imagen (svg, png, jpeg...), debes proporcionar al ícono el ancho y alto apropiados; También puedes proporcionar la descripción, su tamaño intrínseco y sus variantes para temas oscuros y claros cuando sea necesario.
```yaml
---
layout: home
features:
- icon: 🛠️
title: Sencillo y minimalista, siempre
details: Lorem ipsum...
- icon:
src: /cool-feature-icon.svg
title: Otra caracteristica interesante
details: Lorem ipsum...
- icon:
dark: /dark-feature-icon.svg
light: /light-feature-icon.svg
title: Otra caracteristica interesante
details: Lorem ipsum...
---
```
```ts
interface Feature {
// Muestra el icono en cada cuadro de funcón.
icon?: FeatureIcon
// Título de la caracteristica.
title: string
// Detalles de la caracteristicas.
details: string
// Enlace al hacer clic en el componente de funcionalidad
// El vínculo puede ser interno o externo.
//
// ex. `guide/reference/default-theme-home-page` ou `https://example.com`
link?: string
// Texto del enlace que se mostrará dentro del componente de funcionalidad.
// Mejor usado con opción `link`.
//
// ex. `Saiba mais`, `Visitar página`, etc.
linkText?: string
// Atributo rel de enlace para la opción `link`.
//
// ex. `external`
rel?: string
// Atributo de destino del enlace para la opción `link`.
target?: string
}
type FeatureIcon =
| string
| { src: string; alt?: string; width?: string; height: string }
| {
light: string
dark: string
alt?: string
width?: string
height: string
}
```

@ -0,0 +1,27 @@
# Última Actualización {#last-updated}
La hora en que se actualizó el contenido por última vez se mostrará en la esquina inferior derecha de la página. Para habilitar, agregue la opción `lastUpdated` en su confirguración.
::: tip
Necesitas hacer un _commit_ en el archivo markdown para ver el clima actualizado.
:::
## Configuración a nivel de sitio {#site-level-config}
```js
export default {
lastUpdated: true
}
```
## Configuración Frontmatter {#frontmatter-config}
Esto se puede desactivar por página usando la opción `lastUpdated` en frontmatter:
```yaml
---
lastUpdated: false
---
```
Consulte [Tema PErsonalizado: Última Actualización](./default-theme-config#lastupdated) para obtener más. Cualquier valor positivo a nivel de tema también habilitará la funcionalidad a menos que esté explícitamente deshabilitado a nivel de página o sitio.

@ -0,0 +1,63 @@
# Layout {#layout}
Puedes elegir el layout de la página definiendo una opción de `layout` para el [frontmatter](./frontmatter-config) De la página. Hay tres opciones de layout: `doc`, `page` y `home`. Si no se especifica nada, la página será tratada como una página. `doc`.
```yaml
---
layout: doc
---
```
## Layout del documento {#doc-layout}
La opción `doc` es el layout predeterminado y aplca estlo a todo el contenido de Markdown el aspecto de "documentación". Funciona agrupando todo el contenido en la clase CSS `vp-doc`, y aplicando estilos a los elementos debajo de ella.
Casi todos los elementos genéricos como `p` o `h2`, recibir un estilo especial. Por tanto, recuerda que si añades algún HTML contenido personalizado dentro del contenido Markdown, también se verá afectado por estos estilos.
También proporciona recursos de documentación específicos que se enumeran a continuación. Estas funciones solo están habilitadas en este layout.
- Editar link
- Links Anterior y próximo.
- _Outline_
- [Carbon Ads](./default-theme-carbon-ads)
## Layout de la Página {#page-layout}
La opción `page` se trata como una 'página en blanco'. Markdown aún se procesará y todo [Extensiones Markdown](../guide/markdown) funcionará de la misma manera que el layout `doc`,
pero esto no recibirá ningún estilo predeterminado.
El layout de la página le permitirá diseñar todo sin que el tema de VitePress afecte el marcado. Esto es útil cuando desea crear su propia página personalizada.
Tenga en cuenta que incluso en este mismo layout, a barra lateral seguirá apareciendo si la página tiene una configuración de barra lateral correspondiente.
## Layout de Home {#home-layout}
La opción `home` gerará un modelo de _"Homepage"_. En este layout você pofra definir opciones extras, como `hero` y `features`, para personalizar todavá más el contenido. Visite [Tema padrão: Página Inicial](./default-theme-home-page) para obter más detalles.
## Sin Layout {#no-layout}
Si no quieres ningún diseño, puedes pasar `layout: false` a través del frontmatter. Esta opción es útil si deseas una página de destino completamente personalizable (sin barra lateral, barra de navegacón o pie de página por defecto).
## Layout Personalizado {#custom-layout}
También puedes usar un layout personalizado:
```md
---
layout: foo
---
```
Esto buscará un componente llamado `foo` registrado en contexto. Por ejemplo, puede registrar su componente globalmente en `.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)
}
}
```

@ -0,0 +1,162 @@
# Navegacion {#nav}
Refiriéndose a la barra de navegación que se muestra en la parte superior de la página. Contiene el título del sitio, enlaces del menú global, etc.
## Título y logotipo del sitio {#site-title-and-logo}
Por defecto, la navegación muestra el título del sitio que hace referencia al valor de [`config.title`](./site-config#title). Si desea cambiar lo que se muestra en la navegación, puede configurar un texto personalizado en el `themeConfig.siteTitle`.
```js
export default {
themeConfig: {
siteTitle: 'Mi Título Personalizado'
}
}
```
Si tiene un logotipo para su sitio web, puede mostrarlo pasando la ruta a la imagen. Debes colocar el logo directamente dentro de la carpeta. `public`, y establezca la ruta absoluta hacia él.
```js
export default {
themeConfig: {
logo: '/my-logo.svg'
}
}
```
Cuando agrega un logotipo, se muestra junto con el título del sitio. Si su logotipo tiene todo lo que necesita y desea ocultar el texto del título, configure `false` en la opción `siteTitle`.
```js
export default {
themeConfig: {
logo: '/my-logo.svg',
siteTitle: false
}
}
```
También puedes pasar un objeto como logotipo si quieres agregar un atributo. `alt` o personalizarlo según el modo claro/oscuro. Consultar [`themeConfig.logo`](./default-theme-config#logo) para obtener más detalles.
## Links de Navegaion {#navigation-links}
Puedes configurar la opción `themeConfig.nav` para añadir enlaces a tu navegación.
```js
export default {
themeConfig: {
nav: [
{ text: 'Guia', link: '/guide' },
{ text: 'Configuración', link: '/config' },
{ text: 'Registro de Cambios', link: 'https://github.com/...' }
]
}
}
```
`text` es el texto que se muestra en la navegación, y el `link` es el link al que será navegando cuando se hace click en el texto. Para el enlace, establezca la ruta al archivo sin el prefijo `.md` y siempre comenzar por `/`.
Links de navegación también pueden ser menus _dropdown_. Para hacer eso, establezca la clave de `items` en la opción del link.
```js
export default {
themeConfig: {
nav: [
{ text: 'Guia', link: '/guide' },
{
text: 'Menú Dropdown',
items: [
{ text: 'Item A', link: '/item-1' },
{ text: 'Item B', link: '/item-2' },
{ text: 'Item C', link: '/item-3' }
]
}
]
}
}
```
Tenga en cuenta que el titulo del menú _dropdown_ (`Menu Dropdown` en el ejemplo anterior) no puede tener una propiedad `link`, ya que se convierte en un botón para abrir el cuadro del dialogo dropdown.
También puedes agregar "secciones" a los elementos del menú _dropdown_ pasando más elementos anidados.
```js
export default {
themeConfig: {
nav: [
{ text: 'Guia', link: '/guia' },
{
text: 'Menú Dropdown',
items: [
{
// Título da seção.
text: 'Título de la sección A',
items: [
{ text: 'Item A de la sección A', link: '...' },
{ text: 'Item B de la sección B', link: '...' }
]
}
]
},
{
text: 'Menú Dropdown',
items: [
{
// También puedes omitir el título
items: [
{ text: 'Item A da Seção A', link: '...' },
{ text: 'Item B da Seção B', link: '...' }
]
}
]
}
]
}
}
```
### Personaliza el estado "activo" del link {#customize-link-s-active-state}
Los elementos del menú de navegación se resaltarán cuando la página actual esté en la ruta correspondiente. Si desea personalizar la ruta que debe coincidir, establezca la propiedad `activeMatch` el regex como um valor en string.
```js
export default {
themeConfig: {
nav: [
// Este link esta en estado activo cuando
// el usuario esta en el camino `/config/`.
{
text: 'Guia',
link: '/guide',
activeMatch: '/config/'
}
]
}
}
```
::: warning
`activeMatch` Debería ser un string regex, pero deberías definirla como un string. No podemos usar un objeto RegExp real aquí porque no es serializable durante el tiempo de construcción.
:::
### Personalizar los atributos "target" y "rel" de links {#customize-link-s-target-and-rel-attributes}
Por defecto, VitePress determina automaticamente lod atributos `target` y `rel` en función de si existe un enlace externo o no. Pero si quieres, también puedes personalizarlos.
```js
export default {
themeConfig: {
nav: [
{
text: 'Merchandise',
link: 'https://www.thegithubshop.com/',
target: '_self',
rel: 'sponsored'
}
]
}
}
```
## Links Scociales {#social-links}
Consulte [`socialLinks`](./default-theme-config#sociallinks).

@ -0,0 +1,43 @@
# Links Anterior y Próximo {#prev-next-links}
Puede personalizar el texto y el enlace de los botones Anterior y Siguiente que se muestran en la parte inferior de la página. Esto es útil cuando desea mostrar un texto diferente al que tiene en la barra lateral. Además, puede resultarle útil desactivar el pie de página o el enlace a la página para que no se incluya en la barra lateral.
## prev
- Tipo: `string | false | { text?: string; link?: string }`
- Detalles:
Especifica el text/enlace que se mostrará en el enlace a la página anterior. Si no ve esto al principio, el text/enlace se deducirá de la configuración de la barra lateral.
- Ejemplos:
- Para personalizar solo texto:
```yaml
---
prev: 'Iniciar | Markdown'
---
```
- Para personalizar ambos texto y link:
```yaml
---
prev:
text: 'Markdown'
link: '/guide/markdown'
---
```
- Para esconder la página anterior:
```yaml
---
prev: false
---
```
## next
Igual que el `prev` pero para la página siguiente.

@ -0,0 +1,379 @@
---
outline: deep
---
# Buscar {#search}
## Busqueda local {#local-search}
VitePress admite la búsqueda de texto completo utilizando un índice en el navegador gracias a [minisearch](https://github.com/lucaong/minisearch/). Para habilitar esta función, simplemente configure la opción `themeConfig.search.provider` como `'local'` en el archivo `.vitepress/config.ts`:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
themeConfig: {
search: {
provider: 'local'
}
}
})
```
Resultado de ejemplo:
![captura de pantalla del modo de búsqueda](/search.png)
Alternativamente, puedes usar [Algolia DocSearch](#algolia-search) ou algunos complementos comunitarios como <https://www.npmjs.com/package/vitepress-plugin-search> o <https://www.npmjs.com/package/vitepress-plugin-pagefind>.
### i18n {#local-search-i18n}
Puede utilizar una configuración como esta para utilizar la búsqueda multilingüe:
```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: '切换'
}
}
}
}
}
}
}
}
})
```
### Opciones MiniSearch {#mini-search-options}
Puedes configurar MiniSearch de esta manera:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
themeConfig: {
search: {
provider: 'local',
options: {
miniSearch: {
/**
* @type {Pick<import('minisearch').Options, 'extractField' | 'tokenize' | 'processTerm'>}
*/
options: {
/* ... */
},
/**
* @type {import('minisearch').SearchOptions}
* @default
* { fuzzy: 0.2, prefix: true, boost: { title: 4, text: 2, titles: 1 } }
*/
searchOptions: {
/* ... */
}
}
}
}
}
})
```
Obtenga más información en [documentação do MiniSearch](https://lucaong.github.io/minisearch/classes/MiniSearch.MiniSearch.html).
### Presentador de contenido personalizado {#custom-content-renderer}
Puedes personalizar la función utilizada para presentar el contenido de rebajas antes de indexarlo:
```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
}
}
}
}
})
```
Esta función se eliminará de los datos del sitio web en el lado del cliente, por lo que podrá utilizar las API de Node.js en ella.
#### Ejemplo: Excluir páginas de la busqueda {#example-excluding-pages-from-search}
Puedes excluir páginas de la busqueda adicionando `search: false` al principio de la 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
En este caso, una función `_render` se proporciona, es necesario manipular el `search: false` desde el frente por su cuenta. Además, el objeto `env` não estará completamente populado antes que `md.render` no estará completamente poblado antes `env`, como `frontmatter`, debe hacerse después de eso.
:::
#### Ejemplo: Transformar contenido - agregar anclajes {#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 admite la búsqueda en su sitio de documentación utilizando [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Consulte su guía de introducción. en tu archivo `.vitepress/config.ts`, Deberá proporcionar al menos lo siguiente 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}
Puede utilizar una configuración como esta para utilizar la búsqueda multilingüe:
```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: '点击反馈'
}
}
}
}
}
}
}
}
})
```
[Estas opciones](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) se pueden superponer. Consulte la documentación oficial de Algolia para obtener más información sobre ellos.
### Configuración _Crawler_ {#crawler-config}
A continuación se muestra un ejemplo de la configuración que utiliza este sitio:
```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: '<span class="algolia-docsearch-suggestion--highlight">',
highlightPostTag: '</span>',
minWordSizefor1Typo: 3,
minWordSizefor2Typos: 7,
allowTyposOnNumericTokens: false,
minProximity: 1,
ignorePlurals: true,
advancedSyntax: true,
attributeCriteriaComputedByMinProximity: true,
removeWordsIfNoResults: 'allOptional'
}
}
})
```
<style>
img[src="/search.png"] {
width: 100%;
aspect-ratio: 1 / 1;
}
</style>

@ -0,0 +1,217 @@
# Barra Lateral {#sidebar}
La barra lateral es el bloque de navegación principal de su documentación. Puede configurar el menú de la barra lateral en [`themeConfig.sidebar`](./default-theme-config#sidebar).
```js
export default {
themeConfig: {
sidebar: [
{
text: 'Guia',
items: [
{ text: 'Introducción', link: '/introduction' },
{ text: 'Iniciando', link: '/getting-started' },
...
]
}
]
}
}
```
## Conceptos básicos {#the-basics}
La forma más sencilla del menú de la barra lateral es pasar una único _array_ de links. El elemento de primer nivel define la "sección" de la barra latera. debe contener `text`, cuál es el título de la sección, y `items` que son los propios enlaces de navegación.
```js
export default {
themeConfig: {
sidebar: [
{
text: 'Título de la sección A',
items: [
{ text: 'Item A', link: '/item-a' },
{ text: 'Item B', link: '/item-b' },
...
]
},
{
text: 'Título de la sección B',
items: [
{ text: 'Item C', link: '/item-c' },
{ text: 'Item D', link: '/item-d' },
...
]
}
]
}
}
```
Cada `link` debe especificar la ruta al archivo en sí comenzando con `/`.
Si agrega una barra al final del enlace, mostrará el `index.md` del directorio correspondiente.
```js
export default {
themeConfig: {
sidebar: [
{
text: 'Guia',
items: [
// Esto muestra la página `/guide/index.md`.
{ text: 'Introducción', link: '/guide/' }
]
}
]
}
}
```
Puede anidar aún más elementos de la barra lateral hasta 6 niveles de profundidad contando desde el nivel raíz. Tenga en cuenta que los niveles superiores a 6 se ignorarán y no se mostrarán en la barra lateral.
```js
export default {
themeConfig: {
sidebar: [
{
text: 'Nivel 1',
items: [
{
text: 'Nivel 2',
items: [
{
text: 'Nivel 3',
items: [
...
]
}
]
}
]
}
]
}
}
```
## Varias Barras Laterales {#multiple-sidebars}
Puede mostrar una barra lateral diferente según la ruta de la página. Por ejemplo, como se muestra en este sitio, es posible que desee crear secciones separadas de contenido en su documentación, como la página "Guía" y la página "Configuración".
Para hacer esto, primero organice sus páginas en directorios para cada sección deseada:
```
.
├─ guide/
│ ├─ index.md
│ ├─ one.md
│ └─ two.md
└─ config/
├─ index.md
├─ three.md
└─ four.md
```
Luego actualice su configuración para definir su barra lateral para cada sección. Esta vez debes pasar un objeto en lugar de un array.
```js
export default {
themeConfig: {
sidebar: {
// Esta barra lateral se muestra cuando un usuario
// está en el directorio `guide`.
'/guide/': [
{
text: 'Guia',
items: [
{ text: 'Índice', link: '/guide/' },
{ text: 'Um', link: '/guide/one' },
{ text: 'Dois', link: '/guide/two' }
]
}
],
// Esta barra lateral se muestra cuando un usuario
// está en el directorio `config`.
'/config/': [
{
text: 'Configuración',
items: [
{ text: 'Índice', link: '/config/' },
{ text: 'Tres', link: '/config/three' },
{ text: 'Cuatro', link: '/config/four' }
]
}
]
}
}
}
```
## Grupos Retráctiles en la Barra Lateral {#collapsible-sidebar-groups}
Adicionando una opción `collapsed` al grupo de la barra lateral, muestra un botón para ocultar/mostrar cada sección
```js
export default {
themeConfig: {
sidebar: [
{
text: 'Título de la sección A',
collapsed: false,
items: [...]
}
]
}
}
```
Todas las secciones están 'abiertas' de forma predeterminada. Si desea que estén 'cerrados' al cargar la página inicial, configure la opción `collapsed` como `true`.
```js
export default {
themeConfig: {
sidebar: [
{
text: 'Título de la sección A',
collapsed: true,
items: [...]
}
]
}
}
```
## `useSidebar` <Badge type="info" text="composable" />
Devuelve datos relacionados con la barra lateral. El objeto devuelto tiene el siguiente tipo:
```ts
export interface DocSidebar {
isOpen: Ref<boolean>
sidebar: ComputedRef<DefaultTheme.SidebarItem[]>
sidebarGroups: ComputedRef<DefaultTheme.SidebarItem[]>
hasSidebar: ComputedRef<boolean>
hasAside: ComputedRef<boolean>
leftAside: ComputedRef<boolean>
isSidebarEnabled: ComputedRef<boolean>
open: () => void
close: () => void
toggle: () => void
}
```
**Exemplo:**
```vue
<script setup>
import { useSidebar } from 'vitepress/theme'
const { hasSidebar } = useSidebar()
</script>
<template>
<div v-if="hasSidebar">Sólo visible cuando existe la barra lateral
</div>
</template>
```

@ -0,0 +1,258 @@
<script setup>
import { VPTeamMembers } from 'vitepress/theme'
const members = [
{
avatar: 'https://github.com/yyx990803.png',
name: 'Evan You',
title: 'Criador',
links: [
{ icon: 'github', link: 'https://github.com/yyx990803' },
{ icon: 'twitter', link: 'https://twitter.com/youyuxi' }
]
},
{
avatar: 'https://github.com/kiaking.png',
name: 'Kia King Ishii',
title: 'Desenvolvedor',
links: [
{ icon: 'github', link: 'https://github.com/kiaking' },
{ icon: 'twitter', link: 'https://twitter.com/KiaKing85' }
]
}
]
</script>
# Página de Equipo {#team-page}
Si desea presentar a su equipo, puede utilizar componentes del equipo para crear la página del equipo. Hay dos formas de utilizar estos componentes. Una es incrustarlo en la página del documento y otra es crear una página de equipo completa.
## Mostrar miembros del equipo en una página {#show-team-members-in-a-page}
Puedes usar el componente `<VPTeamMembers>` expuesto en `vitepress/theme` para mostrar una lista de los miembros del equipo en cualquier página.
```html
<script setup>
import { VPTeamMembers } from 'vitepress/theme'
const members = [
{
avatar: 'https://www.github.com/yyx990803.png',
name: 'Evan You',
title: 'Criador',
links: [
{ icon: 'github', link: 'https://github.com/yyx990803' },
{ icon: 'twitter', link: 'https://twitter.com/youyuxi' }
]
},
...
]
</script>
# Nuestro equipo
Saluda a nuestro increible equipo.
<VPTeamMembers size="small" :members="members" />
```
El código anterior mostrará a un miembro del equipo en un elemento similar a una tarjeta. Debería mostrar algo similar a lo siguiente.
<VPTeamMembers size="small" :members="members" />
El componente `<VPTeamMembers>` viene en dos tamaños diferentes, pequeño `small` y médio `medium`. Si bien es una cuestión de preferencia, generalmente el tamaño `small` debería encajar mejor cuando se use en la página del documento. Además, puede agregar más propiedades a cada miembro, como agregar el botón "descripción" o "patrocinador". Obtenga más información sobre en [`<VPTeamMembers>`](#vpteammembers).
Incrustar miembros del equipo en la página del documento es bueno para equipos pequeños donde tener una página de equipo dedicada completa puede ser demasiado, o introducir miembros parciales como referencia al contexto de la documentación.
Si tienes una gran cantidad de miembros o simplemente deseas más espacio para exhibir a los miembros del equipo, considere [crear una página de equipo completa.](#create-a-full-team-page)
## Creando una página de equipo completa {#create-a-full-team-page}
En lugar de agregar miembros del equipo a la página del documento, también puede crear una página de equipo completa, del mismo modo que puede crear una [Página Inicial](./default-theme-home-page) personalizada.
Para crear una página de equipo, primero cree un nuevo md. El nombre del archivo no importa, pero aquí lo llamaremos `team.md`. En este archivo, configure la opción `layout: page` desde frontmatter, y luego puedes componer la estructura de tu página usando componentes `TeamPage`.
```html
---
layout: page
---
<script setup>
import {
VPTeamPage,
VPTeamPageTitle,
VPTeamMembers
} from 'vitepress/theme'
const members = [
{
avatar: 'https://www.github.com/yyx990803.png',
name: 'Evan You',
title: 'Creador',
links: [
{ icon: 'github', link: 'https://github.com/yyx990803' },
{ icon: 'twitter', link: 'https://twitter.com/youyuxi' }
]
},
...
]
</script>
<VPTeamPage>
<VPTeamPageTitle>
<template #title>
Nuestro equipo
</template>
<template #lead>
El desarrollo de VitePress está guiado por un equipo internacional,
Algunos de los miembros han elegido aparecer a continuación.
</template>
</VPTeamPageTitle>
<VPTeamMembers
:members="members"
/>
</VPTeamPage>
```
Al crear una página de equipo completa, recuerde agrupar todos los componentes con el componente `<VPTeamPage>`. Este componente garantizará que todos los componentes anidados relacionados con el equipo obtengan la estructura de diseño adecuada, como los espacios.
El componente `<VPPageTitle>` adiciona la sección de título de la página. El título es `<h1>`. Use los _slots_ `#title` y `#lead` para poder documentar sobre su equipo.
`<VPMembers>` funciona igual que cuando se usa en una página de documento. Mostrará la lista de miembros.
### Agregar secciones para dividir a los miembros del equipo {#add-sections-to-divide-team-members}
Puede agregar "secciones" a la página de su equipo. Por ejemplo, puede tener diferentes tipos de miembros del equipo, como miembros del equipo central y socios de la comunidad. Puede dividir a estos miembros en secciones para explicar mejor las funciones de cada grupo.
Para poder hacerlo, agregue al componente `<VPTeamPageSection>` al archivo `team.md` que creamos anteriormente.
```html
---
layout: page
---
<script setup>
import {
VPTeamPage,
VPTeamPageTitle,
VPTeamMembers,
VPTeamPageSection
} from 'vitepress/theme'
const coreMembers = [...]
const partners = [...]
</script>
<VPTeamPage>
<VPTeamPageTitle>
<template #title>Nuestro equipo</template>
<template #lead>...</template>
</VPTeamPageTitle>
<VPTeamMembers size="medium" :members="coreMembers" />
<VPTeamPageSection>
<template #title>Amigos</template>
<template #lead>...</template>
<template #members>
<VPTeamMembers size="small" :members="partners" />
</template>
</VPTeamPageSection>
</VPTeamPage>
```
El componente `<VPTeamPageSection>` Puede tener los _slots_ `#title` y `#lead` similares al componente `VPTeamPageTitle`, y también al _slot_ `#members` para mostrar a los miembros del equipo.
Recuerde colocar el componente `<VPTeamMembers>` dentro del _slot_ `#members`.
## `<VPTeamMembers>`
El componente `<VPTeamMembers>` muestra una determinada lista de miembros.
```html
<VPTeamMembers
size="medium"
:members="[
{ avatar: '...', name: '...' },
{ avatar: '...', name: '...' },
...
]"
/>
```
```ts
interface Props {
// Tamaño de cada miembro. El valor predeterminado es `medium`.
size?: 'small' | 'medium'
// Lista de miembros que se mostrará.
members: TeamMember[]
}
interface TeamMember {
// Imagen de avatar de miembro.
avatar: string
// Nombre del miembro.
name: string
// Título a ser mostrado a bajo del nombre del miembro.
// Ej.: Desarrollador, Ingeniero de Software, etc.
title?: string
// Organización a la que pertenece al miembro.
org?: string
// URL de la organización.
orgLink?: string
// Descripción del miembro.
desc?: string
// Links sociales, por ejemplo, GitHub, Twitter, etc.
// Puedes pasar un objeto de Links Sociales aquí.
// Vea: https://vitepress.dev/reference/default-theme-config.html#sociallinks
links?: SocialLink[]
// URL de la página del patrocinador del miembro.
sponsor?: string
// Texto para enlace del patrocinador. El valor predeterminado es 'Sponsor'.
actionText?: string
}
```
## `<VPTeamPage>`
El componente raíz al crear una página de equipo completa. Sólo acepta una _slot_. Aplicará estilo a todos los componentes anteriores relacionados con el equipo.
## `<VPTeamPageTitle>`
Agrega la sección "título" a la página. Es mejor usarlo desde el principio debajo `<VPTeamPage>`. Acepta los _slots_ `#title` y `#lead`.
```html
<VPTeamPage>
<VPTeamPageTitle>
<template #title>
Nuestro equipo
</template>
<template #lead>
El desarrollo de VitePress está guiado por un equipo internacional,
Algunos de los miembros han elegido aparecer a continuación.
</template>
</VPTeamPageTitle>
</VPTeamPage>
```
## `<VPTeamPageSection>`
Crea una 'sección' en la página del equipo. Aceptar los _slots_ `#title`, `#lead` y `#members`. Puedes agregar tantas secciones como quieras dentro `<VPTeamPage>`.
```html
<VPTeamPage>
...
<VPTeamPageSection>
<template #title>Amigos</template>
<template #lead>Lorem ipsum...</template>
<template #members>
<VPTeamMembers :members="data" />
</template>
</VPTeamPageSection>
</VPTeamPage>
```

@ -0,0 +1,221 @@
---
outline: deep
---
# Configuración Frontmatter {#frontmatter-config}
Frontmatter permite la configuración basada en páginas. En cada archivo markdown, puede utilizar la configuración de frontmatter para anular las opciones de configuración a nivel de sitio o tema. Además, hay opciones de configuración que sólo se pueden establecer en frontmatter.
Ejemplo de uso:
```md
---
title: Documentación con VitePress
editLink: true
---
```
Puede acceder a los datos del frontmatter a través de la variable global `$frontmatter` en expresiones Vue:
```md
{{ $frontmatter.title }}
```
## title
- Tipo: `string`
Título de la página. Es lo mismo que [config.title](./site-config#title), y anula la configuración a nivel de sitio.
```yaml
---
title: VitePress
---
```
## titleTemplate
- Tipo: `string | boolean`
El sufijo del título. Es lo mismo que [config.titleTemplate](./site-config#titletemplate), y anula la configuración a nivel de sitio.
```yaml
---
title: VitePress
titleTemplate: Generador de sitios web estaticos con Vite & Vue
---
```
## descripción
- Tipo: `string`
Descripción de la página. Es lo mismo que [config.description](./site-config#description), y anula la configuración a nivel de sitio.
```yaml
---
description: VitePress
---
```
## head
- Tipo: `HeadConfig[]`
Especifica etiquetas de encabezado adicionales que se inyectarán en la página actual. Se agregarán después de las etiquetas principales inyectadas por la configuración a nivel de sitio.
```yaml
---
head:
- - meta
- name: description
content: hello
- - meta
- name: keywords
content: super duper SEO
---
```
```ts
type HeadConfig =
| [string, Record<string, string>]
| [string, Record<string, string>, string]
```
## Solo Tema Predeterminado {#default-theme-only}
Las siguientes opciones de frontmatter solo se aplican cuando se usa el tema predeterminado.
### layout
- Tipo: `doc | home | page`
- Predeterminado: `doc`
Determina el layout de la página.
- `doc` - Aplica estilos de documentación por defecto al contenido markdown.
- `home` - Layout especial para la "Página Inicial". Puedes agregar opciones extras como `hero` y `features` para crear rapidamente una hermosa página inicial.
- `page` - Se comporta de manera similar a `doc`, pero no aplica estilos al contenido. Útil cuando desea crear una página totalmente personalizada.
```yaml
---
layout: doc
---
```
### hero <Badge type="info" text="apenas para página inicial" />
Define el contenido de la sección _hero_ en la página inicial cuando `layout` está definido como `home`. Más detalles en [Tema Predeterminado: Página Inicial](./default-theme-home-page).
### features <Badge type="info" text="apenas para página inicial" />
Define los elementos que se mostrarán en la sección de características cuando `layout` está definido como `home`. Más detalles en [Tema Predeterminado: Página Inicial](./default-theme-home-page).
### navbar
- Tipo: `boolean`
- Predeterminado: `true`
Se debe mostrar una [barra de navegación](./default-theme-nav).
```yaml
---
navbar: false
---
```
### sidebar
- Tipo: `boolean`
- Predeterminado: `true`
Se debe mostrar una [barra lateral](./default-theme-sidebar).
```yaml
---
sidebar: false
---
```
### aside
- Tipo: `boolean | 'left'`
- Predeterminado: `true`
Define la localización del componente aside en el layout `doc`.
Configurar este valor como `false` evita que se muestre el elemento lateral.\
Configurar este valor como `true` presenta el lado de la derecha.\
Configurar este valor como `'left'` presenta el lado de la izquierda.
```yaml
---
aside: false
---
```
### outline
- Tipo: `number | [number, number] | 'deep' | false`
- Predeterminado: `2`
Los niveles del encabezado en _outline_ que se mostrará para la página. Es lo mismo que [config.themeConfig.outline.level](./default-theme-config#outline), y anula el valor establecido en la configuración a nivel de sitio.
### lastUpdated
- Tipo: `boolean | Date`
- Predeterminado: `true`
Se debe mostrar el texto de [última actualización](./default-theme-last-updated) en el pie de página de la página actual. Si se especifica una fecha y hora específicas, se mostrarán en lugar de la hora de la última modificación de git.
```yaml
---
lastUpdated: false
---
```
### editLink
- Tipo: `boolean`
- Predeterminado: `true`
Se debe mostrar el [link de edición](./default-theme-edit-link) en el pie de página de la página actual.
```yaml
---
editLink: false
---
```
### footer
- Tipo: `boolean`
- Predeterminado: `true`
Se debe mostrar el [pie de página](./default-theme-footer).
```yaml
---
footer: false
---
```
### pageClass
- Tipo: `string`
Agrega un nombre de clase adicional a una página específica.
```yaml
---
pageClass: custom-page-class
---
```
Luego puede personalizar los estilos para esta página específica en el archivo. `.vitepress/theme/custom.css`:
```css
.custom-page-class {
  /* estilos especificos de la página */
}
```

@ -0,0 +1,165 @@
# API en Tiempo de Ejecución {#runtime-api}
VitePress ofrece varias API integradas para permitir el acceso a los datos de la aplicación. VitePress también viene con algunos componentes integrados que se pueden utilizar globalmente.
Los métodos auxiliares son importaciones globales de `vitepress` y se utilizan a menudo en componentes Vue de temas personalizados. Sin embargo, también se pueden utilizar dentro de páginas `.md` porque los archivos de rebajas se compilan en [Componentes de Archivo Ú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()` o `<script setup>`.
## `useData` <Badge type="info" text="composable" />
Retorna datos específicos de la página. El objeto devuelto tiene el siguiente tipo:
```ts
interface VitePressData<T = any> {
/**
* Metadados a nivel del sitio
*/
site: Ref<SiteData<T>>
/**
* themeConfig de .vitepress/config.js
*/
theme: Ref<T>
/**
* Metadados a nível de la página
*/
page: Ref<PageData>
/**
* Frontmatter de la página
*/
frontmatter: Ref<PageData['frontmatter']>
/**
* Parámetros de ruta dinámica
*/
params: Ref<PageData['params']>
title: Ref<string>
description: Ref<string>
lang: Ref<string>
isDark: Ref<boolean>
dir: Ref<string>
localeIndex: Ref<string>
}
interface PageData {
title: string
titleTemplate?: string | boolean
description: string
relativePath: string
filePath: string,
headers: Header[]
frontmatter: Record<string, any>
params?: Record<string, any>
isNotFound?: boolean
lastUpdated?: number
}
```
**Ejemplo:**
```vue
<script setup>
import { useData } from 'vitepress'
const { theme } = useData()
</script>
<template>
<h1>{{ theme.footer.copyright }}</h1>
</template>
```
## `useRoute` <Badge type="info" text="composable" />
Devuelve el objeto de ruta actual con el siguiente tipo:
```ts
interface Route {
path: string
data: PageData
component: Component | null
}
```
## `useRouter` <Badge type="info" text="composable" />
Devuelve la instancia del enrutador VitePress para que pueda navegar mediante programación a otra página.
```ts
interface Router {
/**
* Ruta atual.
*/
route: Route
/**
* Navegar para una nueva URL.
*/
go: (to?: string) => Promise<void>
/**
* Llamado antes del cambio de ruta. Devuelve 'falso' para cancelar la navegación.
*/
onBeforeRouteChange?: (to: string) => Awaitable<void | boolean>
/**
* Se llama antes de que se cargue el componente de la página (después de que se haya actualizado el estado del historial).
* atualizado). Retorne `false` para cancelar a navegação.
*/
onBeforePageLoad?: (to: string) => Awaitable<void | boolean>
/**
* Llamado después del cambio de ruta.
*/
onAfterRouteChanged?: (to: string) => Awaitable<void>
}
```
## `withBase` <Badge type="info" text="helper" />
- **Tipo**: `(path: string) => string`
agrega la [`base`](./site-config#base) configurada a una ruta URL determinada. Consulte también [Base URL](../guide/asset-handling#base-url).
## `<Content />` <Badge type="info" text="component" />
El componente `<Content />` muestra el contenido de markdown renderizado. Útil [al crear tu propio tema](../guide/custom-theme).
```vue
<template>
<h1>Layout Personalizado!</h1>
<Content />
</template>
```
## `<ClientOnly />` <Badge type="info" text="component" />
El componente `<ClientOnly />` muestra tu _slot_ solo del lado del cliente.
Debido a que las aplicaciones VitePress se interpretan en el lado del servidor en Node.js cuando generan compilaciones estáticas, cualquier uso de Vue debe seguir los requisitos del código universal. En resumen, asegúrese de acceder solo a las API del navegador/DOM en ganchos `beforeMount` o `mounted`.
Si está utilizando o demostrando componentes que no son compatibles con SSR (por ejemplo, contienen directivas personalizadas), puede incluirlos dentro del componente. `ClientOnly`.
```vue-html
<ClientOnly>
<NonSSRFriendlyComponent />
</ClientOnly>
```
- Relacionado: [Compatibilidad SSR](../guide/ssr-compat)
## `$frontmatter` <Badge type="info" text="template global" />
Accede directamente a los datos [frontmatter](../guide/frontmatter) de la página actual en expresiones Vue.
```md
---
title: Olá
---
# {{ $frontmatter.title }}
```
## `$params` <Badge type="info" text="template global" />
Accede directamente a los [parámetros de ruta dinámica](../guide/routing#dynamic-routes) de la página actual en expresiones Vue.
```md
- nombre del paquete: {{ $params.pkg }}
- versión: {{ $params.version }}
```

@ -0,0 +1,705 @@
---
outline: deep
---
# Configuración de site {#site-config}
La configuración del site es donde puede configurar los ajustes globales del site. Las opciones de configuración de la aplicación definen las configuraciones que se aplican a todos los sites de VitePress, independientemente del tema que estén utilizando. Por ejemplo, el directorio base o el título del site.
## Vista general {#overview}
### Resolución de configuración {#config-resolution}
El archivo de configuración siempre se resuelve desde `<root>/.vitepress/config.[ext]`, donde `<root>` es la [raiz del proyecto](../guide/routing#root-and-source-directory) VitePress y `[ext]` es una de las extensiones de archivo compatibles. TypeScript es compatible desde el primer momento. Las extensiones compatibles incluyen `.js`, `.ts`, `.mjs` y `.mts`.
Recuerde usar la sintaxis de módulos ES en los archivos de configuración. El archivo de configuración debe exportar por defecto un objeto:
```ts
export default {
// opciones de configuración a nivel de apllicación
lang: 'pt-BR',
title: 'VitePress',
description: 'Generador de site estático Vite & Vue.',
...
}
```
:::detalles de Convifugración Dinámica (Assíncrona)
Si necesitas generar dinamicamente la configuración, también puedes exportar por defecto una función. Por ejemplo:
```ts
import { defineConfig } from 'vitepress'
export default async () => {
const posts = await (await fetch('https://my-cms.com/blog-posts')).json()
return defineConfig({
// opciones de configuración a nivel de apllicación
lang: 'pt-BR',
title: 'VitePress',
description: 'Generador de site estático Vite & Vue.',
// opciones de configuración a nivel de tema
themeConfig: {
sidebar: [
...posts.map((post) => ({
text: post.name,
link: `/posts/${post.name}`
}))
]
}
})
}
```
También puedes utilizar `await` en el nivel superior. Como:
```ts
import { defineConfig } from 'vitepress'
const posts = await (await fetch('https://my-cms.com/blog-posts')).json()
export default defineConfig({
// opciones de configuración a nivel de aplicación
lang: 'pt-BR',
title: 'VitePress',
description: 'Generador de site estático Vite & Vue.',
// opciones de configuración a nivel de tema
themeConfig: {
sidebar: [
...posts.map((post) => ({
text: post.name,
link: `/posts/${post.name}`
}))
]
}
})
```
:::
### Configuración Intellisense {#config-intellisense}
Usar el auxiliar `defineConfig` proporcionará Intellisense con tecnología TypeScript para las opciones de configuración. Suponiendo que su IDE lo admita, esto debería funcionar tanto en JavaScript como en TypeScript.
```js
import { defineConfig } from 'vitepress'
export default defineConfig({
// ...
})
```
### Configuración de Tema Escrito {#typed-theme-config}
Por defecto, el auxiliar `defineConfig` espera el tipo de configuración del tema por defecto:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
themeConfig: {
// El tipo es `DefaultTheme.Config`
}
})
```
Si usa un tema personalizado y desea realizar comprobaciones de tipo para la configuración del tema, deberá usar `defineConfigWithTheme` en su lugar, y pase el tipo de configuración para su tema personalizado a través de un argumento genérico:
```ts
import { defineConfigWithTheme } from 'vitepress'
import type { ThemeConfig } from 'your-theme'
export default defineConfigWithTheme<ThemeConfig>({
themeConfig: {
// El tipo es `ThemeConfig`
}
})
```
### Configuración Vite, Vue & Markdown
- **Vite**
Puede configurar la instancia de Vite subyacente usando la opción [vite](#vite) en su configuración de VitePress. No es necesario crear un archivo de configuración de Vite por separado.
- **Vue**
VitePress ya incluye el plugin oficial de Vue para Vite ([@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue)). Puede configurar sus opciones usando la opción [vue](#vue) en su configuración VitePress.
- **Markdown**
Puede configurar la instancia subyacente de [Markdown-It](https://github.com/markdown-it/markdown-it) usando la opción [markdown](#markdown) en su configuración VitePress.
## Metadados de Site {#site-metadata}
### title
- Tipo: `string`
- Predeterminado: `VitePress`
- Puede ser reemplazado por página a través de [frontmatter](./frontmatter-config#title)
Título de site. Al usar el tema por defecto, este será mostrado en la barra de navegación.
También se utilizará como sufijo predeterminado para todos los títulos de páginas individuales a menos que [`titleTemplate`](#titletemplate) definirse. El título final de una página individual será el contenido textual de su primer encabezado. `<h1>`, combinado con el título global como sufijo. Por ejemplo, con la siguiente configuración y contenido de página:
```ts
export default {
title: 'Mi increible sitio web'
}
```
```md
# Hola
```
El título de la página será `Hola | Mi increible sitio web`.
### titleTemplate
- Tipo: `string | boolean`
- Puede ser reemplazado por página a través de [frontmatter](./frontmatter-config#titletemplate)
Le permite personalizar el sufijo del título de cada página o el título completo. Por ejemplo:
```ts
export default {
title: 'Mi increible sitio web',
titleTemplate: 'Sufijo Personalizado'
}
```
```md
# Hola
```
El título de la página será `Hola | Sufijo Personalizado`.
Para personalizar completamente cómo se debe representar el título, puedes usar el símbolo `:title` en `titleTemplate`:
```ts
export default {
titleTemplate: ':title - Sufijo Personalizado'
}
```
Aqui, `:title` será reemplazado por el texto que se deduce del primer título `<h1>` de la página. El título del ejemplo de la página anterior será `Hola - Sufijo Personalizado`.
Una opción puede ser definida como `false` para desactivar sufijos del título.
### description
- Tipo: `string`
- Predeterminado: `Um site VitePress`
- Puede ser sustituído por página a través de [frontmatter](./frontmatter-config#descrição)
Descripción del sitio web. Esto se presentará como una etiqueta. `<meta>` en la página HTML.
```ts
export default {
descripción: 'Un site VitePress'
}
```
### head
- Tipo: `HeadConfig[]`
- Predeterminado: `[]`
- Se puede agregar por página a través de [frontmatter](./frontmatter-config#head)
Elementos adicionales para agregar a la etiqueta `<head>` de la página HTML. Las etiquetas agregadas por los usuarios son mostradas antes de la etiqueta `head` de cierre, despues de las etiquetas VitePress.
```ts
type HeadConfig =
| [string, Record<string, string>]
| [string, Record<string, string>, string]
```
#### Ejemplo: Agregando un favicon {#example-adding-a-favicon}
```ts
export default {
cabecera: [['link', { rel: 'icon', href: '/favicon.ico' }]]
} // coloque favicon.ico en el directorio público, si la base está definida, use /base/favicon.ico
/* Mostraria:
<link rel="icon" href="/favicon.ico">
*/
```
#### Ejemplo: Agregando Fuentes de 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:
<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">
*/
```
#### Ejemplo: Registrando un _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:
<script id="register-sw">
;(() => {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
}
})()
</script>
*/
```
#### Ejemplo: Usando 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:
<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'TAG_ID');
</script>
*/
```
### lang
- Tipo: `string`
- Predeterminado: `en-US`
El atributo de idioma del sitio. Esto se mostrará como una etiqueta. `<html lang="en-US">` en la página HTML.
```ts
export default {
lang: 'en-US'
}
```
### base
- Tipo: `string`
- Predeterminado: `/`
La URL base donde se implementará el sitio. Deberá configurar esto si planea implementar su sitio en un subdirectorio, por ejemplo, en páginas de GitHub. Si planea implementar su sitio web en `https://foo.github.io/bar/` entonces deberías definir la base como `'/bar/'`. Siempre debe comenzar y terminar con una barra.
La base se agrega automáticamente a todas las URL que comienzan con / en otras opciones, por lo que solo necesitas especificarla una vez.
```ts
export default {
base: '/base/'
}
```
## Roteamento {#routing}
### cleanUrls
- Tipo: `boolean`
- Predeterminado: `false`
Cuando se establece en `true`, VitePress eliminará el `.html` al final de las URLs. Consulte también [Generar URL Limpia](../guide/routing#generating-clean-url).
::: Alerta de Soporte de Servidor Requerido
Habilitar esto puede requerir configurar adicional en su plataforma de alojamiento. Para funcionar, su servidor debe poder servir `/foo.html` cuando visite `/foo` **sin redirección**.
:::
### rewrites
- Tipo: `Record<string, string>`
Define asignaciones de directorios personalizados &lt;-&gt; URL. Visite [Rutas: Reescribir Rutas](../guide/routing#route-rewrites) para obtener más detalles.
```ts
export default {
rewrites: {
'source/:page': 'destination/:page'
}
}
```
## Construcción {#build}
### srcDir
- Tipo: `string`
- Predeterminado: `.`
El directorio donde se almacenan sus páginas de rebajas, en relación con la raíz del proyecto. vea también [Directorio Raiz y de origen](../guide/routing#root-and-source-directory).
```ts
export default {
srcDir: './src'
}
```
### srcExclude
- Tipo: `string`
- Predeterminado: `undefined`
Un [patrón glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) para hacer coincidir los archivos de rebajas que deben exluirse como conenido de origen.
```ts
export default {
srcExclude: ['**/README.md', '**/TODO.md']
}
```
### outDir
- Tipo: `string`
- Predeterminado: `./.vitepress/dist`
La ubicación de la salida de compilación para el sitio, en relación con el [raiz del proyecto](../guide/routing#root-and-source-directory).
```ts
export default {
outDir: '../public'
}
```
### assetsDir
- Tipo: `string`
- Predeterminado: `assets`
Especifica el directorio para anidar los activos generados. El camino debe estar dentro [`outDir`](#outdir) y se resuelve en relación con el mismo.
```ts
export default {
assetsDir: 'static'
}
```
### cacheDir
- Tipo: `string`
- Predeterminado: `./.vitepress/cache`
El directorio para los archivos de caché, en relación con el [raiz del proyecto](../guide/routing#root-and-source-directory). Vea también: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir).
```ts
export default {
cacheDir: './.vitepress/.vite'
}
```
### ignoreDeadLinks
- Tipo: `boolean | 'localhostLinks' | (string | RegExp | ((link: string) => boolean))[]`
- Predeterminado: `false`
Cuando se establece en `true`, VitePress no dejará de compilarse debido a links rotos.
Cuando se establece en `'localhostLinks'`, la compilación fallará en links rotos, per no verificará los links `localhost`.
```ts
export default {
ignoreDeadLinks: true
}
```
También puede ser un _array_ de una exacta URL en string, patrones regex, o funciones de filtro personalizadas.
```ts
export default {
ignoreDeadLinks: [
// ignora URL exacta "/playground"
'/playground',
// ignora todos los links localhost
/^https?:\/\/localhost/,
// ignora todos los links incluyendo "/repl/""
/\/repl\//,
// función personalizada, ignora todos los links incluyendo "ignore"
(url) => {
return url.toLowerCase().includes('ignore')
}
]
}
```
### mpa <Badge type="warning" text="experimental" />
- Tipo: `boolean`
- Predeterminado: `false`
Cuando se define como `true`, la aplicación de producción se compilará en [Modo MPA](../guide/mpa-mode). El modo MPA envía 0 kb de JavaScript de forma predeterminada, a expensas de deshabilitar la navegación del lado del cliente y requerir permiso explícito para la interactividad.
## Tematización {#theming}
### appearance
- Tipo: `boolean | 'dark' | 'force-dark' | import('@vueuse/core').UseDarkOptions`
- Predeterminado: `true`
Se habilitará el modo oscuro (agregando una classe `.dark` al elemento `<html>`).
- Si la opción está configurada en `true` El tema predeterminado está determinado por la combinación de colores preferida del usuario.
- Si la opción está configurada en `dark` El tema es oscuro de forma predeterminada a menos que el usuario lo cambie manualmente.
- Si la opción está configurada en `false` los usuarios no podrán cambiar el tema.
Esta opción inyecta un script en línea que restaura la configuración de los usuarios desde el almacenamiento local. (_local storage_) usando una llave `vitepress-theme-appearance`. Eso asegurará que la clase `.dark` se aplicará antes de que se muestre la página para evitar el parpadeo.
`appearance.initialValue` puede ser `'dark' | undefined`. Refs o getters no son soportados.
### lastUpdated
- Tipo: `boolean`
- Predeterminado: `false`
Para obtener la marca de tiempo de la última actualización para cada página usando Git. El sello de fecha se incluirá en los datos de cada página, accesible a través de [`useData`](./runtime-api#usedata).
Cuando se utiliza el tema predeterminado, al habilitar esta opción se mostrará la última hora de actualización de cada página. Puedes personalizar el texto mediante la opción [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext).
## Personalización {#customization}
### markdown
- Tipo: `MarkdownOption`
Configure las opciones de procesador Markdown. VitePress usa [Markdown-it](https://github.com/markdown-it/markdown-it) como procesador y [Shiki](https://github.com/shikijs/shiki) para resaltar la sintaxis del idioma. Dentro de esta opción, puede pasar varias opciones de Markdown relacionadas para satisfacer sus necesidades.
```js
export default {
markdown: {...}
}
```
Consulte la [declaración de tipo y jsdocs](https://github.com/vuejs/vitepress/blob/main/src/node/markdown/markdown.ts) para conocer todas las opciones disponibles.
### vite
- Tipo: `import('vite').UserConfig`
Pase la [Configuración Vite](https://vitejs.dev/config/) sin procesar al servidor interno / empacotador Vite.
```js
export default {
vite: {
// Opciones de configuración Vite
}
}
```
### vue
- Tipo: `import('@vitejs/plugin-vue').Options`
Pase las opciones [`@vitejs/plugin-vue`](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#options) sin formato a la instancia del complemento interno.
```js
export default {
vue: {
// Opciones @vitejs/plugin-vue
}
}
```
## Construir Ganchos {#build-hooks}
Los enlaces de compilación VitePress permiten agregar nuevas funciones al su sitio web:
- Sitemap
- Indexação de Pesquisa
- PWA
- _Teleports_
## buildEnd
- Tipo: `(siteConfig: SiteConfig) => Awaitable<void>`
`buildEnd` es un enlace de compilación CLI (Interfaz de línea de comando), se ejecutará después de que se complete la compilación (SSG) pero antes de que finalice el proceso CLI de VitePress.
```ts
export default {
async buildEnd(siteConfig) {
// ...
}
}
```
## postRender
- Tipo: `(context: SSGContext) => Awaitable<SSGContext | void>`
- `postRender` es un gancho de compilación, llamado cuando se completa la interpretación de SSG. Le permitirá manipular el contenido de los _teleports_ durante la generación de sitios estáticos.
```ts
export default {
async postRender(context) {
// ...
}
}
```
```ts
interface SSGContext {
content: string
teleports?: Record<string, string>
[key: string]: any
}
```
## transformHead
- Tipo: `(context: TransformContext) => Awaitable<HeadConfig[]>`
`transformHead` es un enlace de compilación para transformar el encabezado antes de generar cada página. Esto le permite agregar entradas de encabezado que no se pueden agregar estáticamente a la configuración de VitePress. Sólo necesita devolver entradas adicionales, que se fusionarán automáticamente con las existentes.
:::warning
No mutes ningún elemento dentro `context`.
:::
```ts
export default {
async transformHead(context) {
// ...
}
}
```
```ts
interface TransformContext {
page: string // e.g. index.md (relativo a srcDir)
assets: string[] // todos los activos no-js/css con URL pública completamente resuelta
siteConfig: SiteConfig
siteData: SiteData
pageData: PageData
title: string
description: string
head: HeadConfig[]
content: string
}
```
Tenga en cuenta que este enlace solo se llama cuando se genera el sitio de forma estática. No se llama durante el desarrollo. Si necesita agregar entradas de encabezado dinámicas durante el desarrollo, puede usar el enlace [`transformPageData`](#transformpagedata) en su 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`
}
])
}
}
```
#### Ejemplo: Agregando una URL canónica `<link>` {#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<string | void>`
`transformHtml` es un gancho de compilación para transformar el contenido de cada página antes de guardarla en el disco.
:::warning
No mute ningún elemento dentro del `context`. Además, modificar el contenido HTML puede provocar problemas de hidratación en tiempo de ejecución.
:::
```ts
export default {
async transformHtml(code, id, context) {
// ...
}
}
```
### transformPageData
- Tipo: `(pageData: PageData, context: TransformPageContext) => Awaitable<Partial<PageData> | { [key: string]: any } | void>`
`transformPageData` es un gancho para transformar los datos de cada página. Puedes hacer mutaciones directamente en `pageData` o devolver valores modificados que se fusionarán con los datos de la página.
:::warning
No mute ningún elemento dentro del `context` y tenga cuidado ya que esto puede afectar el rendimiento del servidor de desarrollo, especialmente si tiene algunas solicitudes de red o cálculos pesados (como generar imágenes) en el gancho. Puede consultar `process.env.NODE_ENV === 'production'` para ver la lógica condicional.
:::
```ts
export default {
async transformPageData(pageData, { siteConfig }) {
pageData.contributors = await getPageContributors(pageData.relativePath)
}
// o devolver datos para fusionar
async transformPageData(pageData, { siteConfig }) {
return {
contributors: await getPageContributors(pageData.relativePath)
}
}
}
```
```ts
interface TransformPageContext {
siteConfig: SiteConfig
}
```

@ -29,6 +29,10 @@ $ pnpm add -D vitepress
$ yarn add -D vitepress
```
```sh [yarn (pnp)]
$ yarn add -D vitepress vue
```
```sh [bun]
$ bun add -D vitepress
```

@ -3,13 +3,11 @@
VitePress comes with out-of-the-box support for generating a `sitemap.xml` file for your site. To enable it, add the following to your `.vitepress/config.js`:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com'
}
})
}
```
To have `<lastmod>` tags in your `sitemap.xml`, you can enable the [`lastUpdated`](../reference/default-theme-last-updated) option.
@ -19,14 +17,23 @@ To have `<lastmod>` tags in your `sitemap.xml`, you can enable the [`lastUpdated
Sitemap support is powered by the [`sitemap`](https://www.npmjs.com/package/sitemap) module. You can pass any options supported by it to the `sitemap` option in your config file. These will be passed directly to the `SitemapStream` constructor. Refer to the [`sitemap` documentation](https://www.npmjs.com/package/sitemap#options-you-can-pass) for more details. Example:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com',
lastmodDateOnly: false
}
})
}
```
If you're using `base` in your config, you should append it to the `hostname` option:
```ts
export default {
base: '/my-site/',
sitemap: {
hostname: 'https://example.com/my-site/'
}
}
```
## `transformItems` Hook
@ -34,9 +41,7 @@ export default defineConfig({
You can use the `sitemap.transformItems` hook to modify the sitemap items before they are written to the `sitemap.xml` file. This hook is called with an array of sitemap items and expects an array of sitemap items to be returned. Example:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com',
transformItems: (items) => {
@ -49,5 +54,5 @@ export default defineConfig({
return items
}
}
})
}
```

@ -10,7 +10,7 @@
"preview": "vitepress preview"
},
"devDependencies": {
"@lunariajs/core": "^0.0.32",
"@lunariajs/core": "^0.1.0",
"markdown-it-mathjax3": "^4.3.2",
"open-cli": "^8.0.0",
"vitepress": "workspace:*"

@ -29,6 +29,10 @@ $ pnpm add -D vitepress
$ yarn add -D vitepress
```
```sh [yarn (pnp)]
$ yarn add -D vitepress vue
```
```sh [bun]
$ bun add -D vitepress
```

@ -29,6 +29,10 @@ $ pnpm add -D vitepress
$ yarn add -D vitepress
```
```sh [yarn (pnp)]
$ yarn add -D vitepress vue
```
```sh [bun]
$ bun add -D vitepress
```

@ -3,13 +3,11 @@
VitePress поставляется с готовой поддержкой генерации файла `sitemap.xml` для вашего сайта. Чтобы включить её, добавьте следующее в файл `.vitepress/config.js`:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com'
}
})
}
```
Чтобы теги `<lastmod>` присутствовали в вашем файле `sitemap.xml`, вы можете включить опцию [`lastUpdated`](../reference/default-theme-last-updated).
@ -19,14 +17,23 @@ export default defineConfig({
Поддержка карты сайта осуществляется с помощью модуля [`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({
export default {
sitemap: {
hostname: 'https://example.com',
lastmodDateOnly: false
}
})
}
```
При использовании параметра `base` в своей конфигурации обязательно добавьте его в адрес `hostname`:
```ts
export default {
base: '/my-site/',
sitemap: {
hostname: 'https://example.com/my-site/'
}
}
```
## Хук `transformItems` {#transformitems-hook}
@ -34,9 +41,7 @@ export default defineConfig({
Вы можете использовать хук `sitemap.transformItems` для изменения элементов карты сайта перед их записью в файл `sitemap.xml`. Этот хук вызывается с массивом элементов sitemap и ожидает возвращения массива элементов sitemap. Пример:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com',
transformItems: (items) => {
@ -49,5 +54,5 @@ export default defineConfig({
return items
}
}
})
}
```

@ -28,7 +28,7 @@ export default defineConfig({
### i18n {#local-search-i18n}
Вы можете использовать подобную конфигурацию для использования многоязычного поиска:
Пример конфигурации для использования многоязычного поиска:
```ts
import { defineConfig } from 'vitepress'
@ -199,7 +199,7 @@ export default defineConfig({
### i18n {#algolia-search-i18n}
Вы можете использовать подобную конфигурацию для использования многоязычного поиска:
Пример конфигурации для использования многоязычного поиска:
```ts
import { defineConfig } from 'vitepress'

@ -287,3 +287,51 @@ Cache-Control: max-age=31536000,immutable
### Kinsta 静态站点托管 {#kinsta-static-site-hosting}
你可以按照这些[说明](https://kinsta.com/docs/vitepress-static-site-example/) 在 [Kinsta](https://kinsta.com/static-site-hosting/) 上部署 Vitepress 站点。
### Stormkit
你可以按照这些[说明](https://stormkit.io/blog/how-to-deploy-vitepress)将你的 VitePress 项目部署到 [Stormkit](https://www.stormkit.io)。
### Nginx
下面是一个 Nginx 服务器块配置示例。此配置包括对基于文本的常见资源的 gzip 压缩、使用适当缓存头为 VitePress 站点静态文件提供服务的规则以及处理 `cleanUrls: true` 的方法。
```nginx
server {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
listen 80;
server_name _;
index index.html;
location / {
# content location
root /app;
# exact matches -> reverse clean urls -> folders -> not found
try_files $uri $uri.html $uri/ =404;
# non existent pages
error_page 404 /404.html;
# a folder without index.html raises 403 in this setup
error_page 403 /404.html;
# adjust caching headers
# files in the assets folder have hashes filenames
location ~* ^/assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
}
```
本配置默认已构建的 VitePress 站点位于服务器上的 `/app` 目录中。如果站点文件位于其他位置,请相应调整 `root` 指令。
::: warning 不要默认为 index.html
try_files 解析不能像其他 Vue 应用那样默认为 index.html。这会导致页面状态处于无效。
:::
更多信息请参见 [nginx 官方文档](https://nginx.org/en/docs/)、这些 GitHub Issue [#2837](https://github.com/vuejs/vitepress/discussions/2837)、[#3235](https://github.com/vuejs/vitepress/issues/3235)以及 Mehdi Merah 发表的[博客](https://blog.mehdi.cc/articles/vitepress-cleanurls-on-nginx-environment#readings)。

@ -29,6 +29,10 @@ $ pnpm add -D vitepress
$ yarn add -D vitepress
```
```sh [yarn (pnp)]
$ yarn add -D vitepress vue
```
```sh [bun]
$ bun add -D vitepress
```
@ -86,7 +90,7 @@ $ bun vitepress init
<<< @/snippets/init.ansi
:::tip Vue 作为 peer dependency
如果打算使用 Vue 组件或 API 进行自定义,还应该明确地将 `vue` 安装为 peer dependency。
如果打算使用 Vue 组件或 API 进行自定义,还应该明确地将 `vue` 安装为 dependency。
:::
## 文件结构 {#file-structure}

@ -3,13 +3,11 @@
VitePress 提供开箱即用的配置,为站点生成 `sitemap.xml` 文件。要启用它,请将以下内容添加到 `.vitepress/config.js` 中:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com'
}
})
}
```
要在 `sitemap.xml` 中包含 `<lastmod>` 标签,可以启用 [`lastUpdated`](../reference/default-theme-last-updated) 选项。
@ -19,14 +17,23 @@ export default defineConfig({
VitePress 的 sitemap 由 [`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({
export default {
sitemap: {
hostname: 'https://example.com',
lastmodDateOnly: false
}
})
}
```
如果在配置中使用 `base`,则应将其追加到 `hostname` 选项中:
```ts
export default {
base: '/my-site/',
sitemap: {
hostname: 'https://example.com/my-site/'
}
}
```
## `transformItems` Hook
@ -34,13 +41,11 @@ export default defineConfig({
在将 sitemap 写入 `sitemap.xml` 文件之前,可以使用 `sitemap.transformItems` 钩子来修改 sitemap。使用 sitemap 调用该钩子,应返回 sitemap 数组。例如:
```ts
import { defineConfig } from 'vitepress'
export default defineConfig({
export default {
sitemap: {
hostname: 'https://example.com',
transformItems: (items) => {
// 添加新选项或修改/过滤现有选项
// 添加新项目或修改/筛选现有选项
items.push({
url: '/extra-page',
changefreq: 'monthly',
@ -49,5 +54,5 @@ export default defineConfig({
return items
}
}
})
}
```

@ -1,20 +1,17 @@
{
"name": "vitepress",
"version": "1.1.4",
"version": "1.2.2",
"description": "Vite & Vue powered static site generator",
"keywords": [
"vite",
"vue",
"vitepress"
],
"homepage": "https://github.com/vuejs/vitepress/tree/main/#readme",
"homepage": "https://vitepress.dev/",
"bugs": {
"url": "https://github.com/vuejs/vitepress/issues"
},
"repository": {
"type": "git",
"url": "git+https://github.com/vuejs/vitepress.git"
},
"repository": "github:vuejs/vitepress",
"license": "MIT",
"author": "Evan You",
"type": "module",
@ -104,39 +101,38 @@
"dependencies": {
"@docsearch/css": "^3.6.0",
"@docsearch/js": "^3.6.0",
"@shikijs/core": "^1.4.0",
"@shikijs/transformers": "^1.4.0",
"@shikijs/core": "^1.6.1",
"@shikijs/transformers": "^1.6.1",
"@types/markdown-it": "^14.1.1",
"@vitejs/plugin-vue": "^5.0.4",
"@vue/devtools-api": "^7.0.27",
"@vue/shared": "^3.4.26",
"@vueuse/core": "^10.9.0",
"@vueuse/integrations": "^10.9.0",
"@vitejs/plugin-vue": "^5.0.5",
"@vue/devtools-api": "^7.2.0",
"@vue/shared": "^3.4.27",
"@vueuse/core": "^10.10.0",
"@vueuse/integrations": "^10.10.0",
"focus-trap": "^7.5.4",
"mark.js": "8.11.1",
"minisearch": "^6.3.0",
"shiki": "^1.4.0",
"vite": "^5.2.11",
"vue": "^3.4.26"
"shiki": "^1.6.1",
"vite": "^5.2.12",
"vue": "^3.4.27"
},
"devDependencies": {
"@clack/prompts": "^0.7.0",
"@mdit-vue/plugin-component": "^2.1.2",
"@mdit-vue/plugin-frontmatter": "^2.1.2",
"@mdit-vue/plugin-headers": "^2.1.2",
"@mdit-vue/plugin-sfc": "^2.1.2",
"@mdit-vue/plugin-title": "^2.1.2",
"@mdit-vue/plugin-toc": "^2.1.2",
"@mdit-vue/shared": "^2.1.2",
"@mdit-vue/plugin-component": "^2.1.3",
"@mdit-vue/plugin-frontmatter": "^2.1.3",
"@mdit-vue/plugin-headers": "^2.1.3",
"@mdit-vue/plugin-sfc": "^2.1.3",
"@mdit-vue/plugin-title": "^2.1.3",
"@mdit-vue/plugin-toc": "^2.1.3",
"@mdit-vue/shared": "^2.1.3",
"@polka/compression": "1.0.0-next.25",
"@rollup/plugin-alias": "^5.1.0",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-commonjs": "^25.0.8",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-replace": "^5.0.5",
"@types/cross-spawn": "^6.0.6",
"@types/debug": "^4.1.12",
"@types/escape-html": "^1.0.4",
"@types/fs-extra": "^11.0.4",
"@types/lodash.template": "^4.5.3",
"@types/mark.js": "^8.11.12",
@ -145,57 +141,56 @@
"@types/markdown-it-emoji": "^3.0.1",
"@types/micromatch": "^4.0.7",
"@types/minimist": "^1.2.5",
"@types/node": "^20.12.8",
"@types/node": "^20.12.13",
"@types/postcss-prefix-selector": "^1.16.3",
"@types/prompts": "^2.4.9",
"chokidar": "^3.6.0",
"conventional-changelog-cli": "^4.1.0",
"conventional-changelog-cli": "^5.0.0",
"cross-spawn": "^7.0.3",
"debug": "^4.3.4",
"esbuild": "^0.20.2",
"escape-html": "^1.0.3",
"execa": "^8.0.1",
"debug": "^4.3.5",
"esbuild": "^0.21.4",
"execa": "^9.1.0",
"fast-glob": "^3.3.2",
"fs-extra": "^11.2.0",
"get-port": "^7.1.0",
"gray-matter": "^4.0.3",
"lint-staged": "^15.2.2",
"lint-staged": "^15.2.5",
"lodash.template": "^4.5.0",
"lru-cache": "^10.2.2",
"markdown-it": "^14.1.0",
"markdown-it-anchor": "^8.6.7",
"markdown-it-anchor": "^9.0.1",
"markdown-it-attrs": "^4.1.6",
"markdown-it-container": "^4.0.0",
"markdown-it-emoji": "^3.0.0",
"markdown-it-mathjax3": "^4.3.2",
"micromatch": "^4.0.5",
"micromatch": "^4.0.7",
"minimist": "^1.2.8",
"nanoid": "^5.0.7",
"npm-run-all": "^4.1.5",
"ora": "^8.0.1",
"p-map": "^7.0.2",
"path-to-regexp": "^6.2.2",
"picocolors": "^1.0.0",
"picocolors": "^1.0.1",
"pkg-dir": "^8.0.0",
"playwright-chromium": "^1.43.1",
"playwright-chromium": "^1.44.1",
"polka": "1.0.0-next.25",
"postcss-prefix-selector": "^1.16.1",
"prettier": "^3.2.5",
"prompts": "^2.4.2",
"punycode": "^2.3.1",
"rimraf": "^5.0.5",
"rollup": "^4.17.2",
"rollup-plugin-dts": "^6.1.0",
"rimraf": "^5.0.7",
"rollup": "^4.18.0",
"rollup-plugin-dts": "^6.1.1",
"rollup-plugin-esbuild": "^6.1.1",
"semver": "^7.6.0",
"semver": "^7.6.2",
"simple-git-hooks": "^2.11.1",
"sirv": "^2.0.4",
"sitemap": "^7.1.1",
"sitemap": "^8.0.0",
"sort-package-json": "^2.10.0",
"supports-color": "^9.4.0",
"typescript": "^5.4.5",
"vitest": "^1.5.3",
"vue-tsc": "2.0.14",
"vitest": "^1.6.0",
"vue-tsc": "^2.0.19",
"wait-on": "^7.2.0"
},
"peerDependencies": {
@ -210,7 +205,7 @@
"optional": true
}
},
"packageManager": "pnpm@9.0.6",
"packageManager": "pnpm@9.1.4",
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": [
@ -221,10 +216,6 @@
},
"overrides": {
"ora>string-width": "^5"
},
"patchedDependencies": {
"markdown-it-anchor@8.6.7": "patches/markdown-it-anchor@8.6.7.patch",
"rollup-plugin-dts@6.1.0": "patches/rollup-plugin-dts@6.1.0.patch"
}
}
}

@ -1,29 +0,0 @@
diff --git a/types/index.d.ts b/types/index.d.ts
index 7c94aae194faa66ca006ace98cdb0dee82a3e471..0377cace7c4a9653d4ecf963babffd4bd68494b0 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -1,10 +1,10 @@
-import MarkdownIt = require('markdown-it');
-import Token = require('markdown-it/lib/token');
-import State = require('markdown-it/lib/rules_core/state_core');
+import MarkdownIt from 'markdown-it';
+import Token from 'markdown-it/lib/token.mjs';
+import StateCore from 'markdown-it/lib/rules_core/state_core.mjs';
declare namespace anchor {
- export type RenderHref = (slug: string, state: State) => string;
- export type RenderAttrs = (slug: string, state: State) => Record<string, string | number>;
+ export type RenderHref = (slug: string, state: StateCore) => string;
+ export type RenderAttrs = (slug: string, state: StateCore) => Record<string, string | number>;
export interface PermalinkOptions {
class?: string,
@@ -37,7 +37,7 @@ declare namespace anchor {
placement?: 'before' | 'after'
}
- export type PermalinkGenerator = (slug: string, opts: PermalinkOptions, state: State, index: number) => void;
+ export type PermalinkGenerator = (slug: string, opts: PermalinkOptions, state: StateCore, index: number) => void;
export interface AnchorInfo {
slug: string;

@ -1,13 +0,0 @@
diff --git a/dist/rollup-plugin-dts.mjs b/dist/rollup-plugin-dts.mjs
index 4a9412285c48c37d03340a086c771f8e61fd82ac..c73cba3bf47550f69011366e37d2ae974f0c9fc0 100644
--- a/dist/rollup-plugin-dts.mjs
+++ b/dist/rollup-plugin-dts.mjs
@@ -675,6 +675,8 @@ function preProcess({ sourceFile }) {
const nextToken = children[idx + 1];
const isPunctuation = nextToken.kind >= ts.SyntaxKind.FirstPunctuation && nextToken.kind <= ts.SyntaxKind.LastPunctuation;
if (isPunctuation) {
+ const addSpace = code.slice(token.getEnd(), nextToken.getStart()) != " ";
+ code.appendLeft(nextToken.getStart(), `${addSpace ? " " : ""}${defaultExport}`);
code.appendLeft(nextToken.getStart(), defaultExport);
}
else {

File diff suppressed because it is too large Load Diff

@ -13,7 +13,7 @@ import {
type AsyncComponentLoader
} from 'vue'
export { inBrowser } from '../shared'
export { inBrowser, escapeHtml as _escapeHtml } from '../shared'
/**
* Join two paths by resolving the slash collision.

@ -21,7 +21,8 @@ export {
onContentUpdated,
defineClientComponent,
withBase,
getScrollOffset
getScrollOffset,
_escapeHtml
} from './app/utils'
// components

@ -30,7 +30,6 @@ useActiveAnchor(container, marker)
class="VPDocAsideOutline"
:class="{ 'has-outline': headers.length > 0 }"
ref="container"
role="navigation"
>
<div class="content">
<div class="outline-marker" ref="marker" />

@ -242,8 +242,7 @@ vite-error-overlay {
}
mjx-container {
display: inline-block;
margin: auto 2px -2px;
overflow-x: auto;
}
mjx-container > svg {

@ -268,11 +268,11 @@
font-optical-sizing: auto;
}
:root:lang(zh) {
:root:where(:lang(zh)) {
--vp-font-family-base: 'Punctuation SC', 'Inter', ui-sans-serif, system-ui,
'PingFang SC', 'Noto Sans CJK SC', 'Noto Sans SC', 'Heiti SC', 'DengXian',
'Microsoft YaHei', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
'PingFang SC', 'Noto Sans CJK SC', 'Noto Sans SC', 'Heiti SC',
'Microsoft YaHei', 'DengXian', sans-serif, 'Apple Color Emoji',
'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
/**

@ -1,13 +1,14 @@
import { isBooleanAttr } from '@vue/shared'
import escape from 'escape-html'
import fs from 'fs-extra'
import path from 'path'
import { pathToFileURL } from 'url'
import { normalizePath, transformWithEsbuild, type Rollup } from 'vite'
import { version } from '../../../package.json'
import type { SiteConfig } from '../config'
import {
EXTERNAL_URL_RE,
createTitle,
escapeHtml,
mergeHead,
notFoundPageData,
resolveSiteDataByRoute,
@ -17,7 +18,6 @@ import {
type PageData,
type SSGContext
} from '../shared'
import { version } from '../../../package.json'
export async function renderPage(
render: (path: string) => Promise<SSGContext>,
@ -163,7 +163,7 @@ export async function renderPage(
? ''
: '<meta name="viewport" content="width=device-width,initial-scale=1">'
}
<title>${title}</title>
<title>${escapeHtml(title)}</title>
${
isDescriptionOverridden(head)
? ''
@ -260,7 +260,7 @@ function renderAttrs(attrs: Record<string, string>): string {
return Object.keys(attrs)
.map((key) => {
if (isBooleanAttr(key)) return ` ${key}`
return ` ${key}="${escape(attrs[key] as string)}"`
return ` ${key}="${escapeHtml(attrs[key] as string)}"`
})
.join('')
}

@ -231,6 +231,10 @@ export const createMarkdownRenderer = async (
)
.use(lineNumberPlugin, options.lineNumbers)
md.renderer.rules.table_open = function (tokens, idx, options, env, self) {
return '<table tabindex="0">\n'
}
if (options.gfmAlerts !== false) {
md.use(gitHubAlertsPlugin)
}
@ -287,6 +291,13 @@ export const createMarkdownRenderer = async (
md.use(mathPlugin.default ?? mathPlugin, {
...(typeof options.math === 'boolean' ? {} : options.math)
})
const orig = md.renderer.rules.math_block!
md.renderer.rules.math_block = (tokens, idx, options, env, self) => {
return orig(tokens, idx, options, env, self).replace(
/^<mjx-container /,
'<mjx-container tabindex="0" '
)
}
} catch (error) {
throw new Error(
'You need to install `markdown-it-mathjax3` to use math support.'

@ -1,8 +1,10 @@
import type MarkdownIt from 'markdown-it'
import container from 'markdown-it-container'
import type { RenderRule } from 'markdown-it/lib/renderer.mjs'
import type Token from 'markdown-it/lib/token.mjs'
import container from 'markdown-it-container'
import { nanoid } from 'nanoid'
import type { MarkdownEnv } from '../../shared'
import {
extractTitle,
getAdaptiveThemeMarker,
@ -60,7 +62,7 @@ function createContainer(
container,
klass,
{
render(tokens, idx, _options, env) {
render(tokens, idx, _options, env: MarkdownEnv & { references?: any }) {
const token = tokens[idx]
const info = token.info.trim().slice(klass.length).trim()
const attrs = md.renderer.renderAttrs(token)

@ -85,7 +85,6 @@ export async function highlight(
{
name: 'vitepress:clean-up',
pre(node) {
delete node.properties.tabindex
delete node.properties.style
}
}

@ -1,11 +1,50 @@
import type MarkdownIt from 'markdown-it'
import type StateCore from 'markdown-it/lib/rules_core/state_core.mjs'
import type Token from 'markdown-it/lib/token.mjs'
import { escapeHtml } from '../../shared'
export function restoreEntities(md: MarkdownIt): void {
md.core.ruler.disable('text_join')
md.renderer.rules.text_special = (tokens, idx) => {
if (tokens[idx].info === 'entity') {
return tokens[idx].markup // leave as is so Vue can handle it
}
return md.utils.escapeHtml(tokens[idx].content)
md.core.ruler.at('text_join', text_join)
md.renderer.rules.text = (tokens, idx) => escapeHtml(tokens[idx].content)
}
function text_join(state: StateCore): void {
let curr, last
const blockTokens = state.tokens
const l = blockTokens.length
for (let j = 0; j < l; ++j) {
if (blockTokens[j].type !== 'inline') continue
const tokens = blockTokens[j].children || []
const max = tokens.length
for (curr = 0; curr < max; ++curr)
if (tokens[curr].type === 'text_special') tokens[curr].type = 'text'
for (curr = last = 0; curr < max; ++curr)
if (
tokens[curr].type === 'text' &&
curr + 1 < max &&
tokens[curr + 1].type === 'text'
) {
tokens[curr + 1].content =
getContent(tokens[curr]) + getContent(tokens[curr + 1])
tokens[curr + 1].info = ''
tokens[curr + 1].markup = ''
} else {
if (curr !== last) tokens[last] = tokens[curr]
++last
}
if (curr !== last) tokens.length = last
}
}
function getContent(token: Token): string {
return token.info === 'entity'
? token.markup
: token.info === 'escape' && token.content === '&'
? '&amp;'
: token.content
}

@ -11,11 +11,12 @@ import {
} from './markdown/markdown'
import {
EXTERNAL_URL_RE,
getLocaleForPath,
slash,
treatAsHtml,
type HeadConfig,
type MarkdownEnv,
type PageData,
treatAsHtml
type PageData
} from './shared'
import { getGitTimestamp } from './utils/getGitTimestamp'
import { processIncludes } from './utils/processIncludes'
@ -95,13 +96,16 @@ export async function createMarkdownToVueRenderFn(
let includes: string[] = []
src = processIncludes(srcDir, src, fileOrig, includes)
const localeIndex = getLocaleForPath(siteConfig?.site, relativePath)
// reset env before render
const env: MarkdownEnv = {
path: file,
relativePath,
cleanUrls,
includes,
realPath: fileOrig
realPath: fileOrig,
localeIndex
}
const html = md.render(src, env)
const {

@ -87,7 +87,7 @@ export async function createVitePressPlugin(
if (markdown?.math) {
isCustomElement = (tag) => {
if (['mjx-container', 'mjx-assistive-mml'].includes(tag)) {
if (tag.startsWith('mjx-')) {
return true
}
return userCustomElementChecker?.(tag) ?? false

@ -7,7 +7,7 @@ import type { Plugin, ViteDevServer } from 'vite'
import type { SiteConfig } from '../config'
import { createMarkdownRenderer } from '../markdown/markdown'
import {
resolveSiteDataByRoute,
getLocaleForPath,
slash,
type DefaultTheme,
type MarkdownEnv
@ -83,12 +83,6 @@ export async function localSearchPlugin(
return index
}
function getLocaleForPath(file: string) {
const relativePath = slash(path.relative(siteConfig.srcDir, file))
const siteData = resolveSiteDataByRoute(siteConfig.site, relativePath)
return siteData?.localeIndex ?? 'root'
}
let server: ViteDevServer | undefined
function onIndexUpdated() {
@ -126,7 +120,7 @@ export async function localSearchPlugin(
const file = path.join(siteConfig.srcDir, page)
// get file metadata
const fileId = getDocId(file)
const locale = getLocaleForPath(file)
const locale = getLocaleForPath(siteConfig.site, page)
const index = getIndexByLocale(locale)
// retrieve file and split into "sections"
const html = await render(file)

@ -72,6 +72,20 @@ export function isExternal(path: string): boolean {
return EXTERNAL_URL_RE.test(path)
}
export function getLocaleForPath(
siteData: SiteData | undefined,
relativePath: string
): string {
return (
Object.keys(siteData?.locales || {}).find(
(key) =>
key !== 'root' &&
!isExternal(key) &&
isActive(relativePath, `/${key}/`, true)
) || 'root'
)
}
/**
* this merges the locales data to the main data by the route
*/
@ -79,13 +93,7 @@ export function resolveSiteDataByRoute(
siteData: SiteData,
relativePath: string
): SiteData {
const localeIndex =
Object.keys(siteData.locales).find(
(key) =>
key !== 'root' &&
!isExternal(key) &&
isActive(relativePath, `/${key}/`, true)
) || 'root'
const localeIndex = getLocaleForPath(siteData, relativePath)
return Object.assign({}, siteData, {
localeIndex,
@ -211,3 +219,14 @@ export function treatAsHtml(filename: string): boolean {
export function escapeRegExp(str: string) {
return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d')
}
/**
* @internal
*/
export function escapeHtml(str: string): string {
return str
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/&(?![\w#]+;)/g, '&amp;')
}

1
types/shared.d.ts vendored

@ -200,4 +200,5 @@ export interface MarkdownEnv {
links?: string[]
includes?: string[]
realPath?: string
localeIndex?: string
}

Loading…
Cancel
Save