From 212ce69cd7b75bdaa4a5bd187710391c338b1b6e Mon Sep 17 00:00:00 2001 From: Alexander Sorokin <10401817+brawaru@users.noreply.github.com> Date: Tue, 2 Sep 2025 16:23:30 +0700 Subject: [PATCH] feat(theme): support title-less custom containers Adds a special handling for the no-title attribute on the container, which skips rendering the title, alowing for titleless containers. The styles are updated as well to remove the excessive padding for such containers. --- docs/en/guide/what-is-vitepress.md | 6 ++---- docs/es/guide/what-is-vitepress.md | 6 ++---- docs/fa/guide/what-is-vitepress.md | 6 ++---- docs/ko/guide/what-is-vitepress.md | 6 ++---- docs/pt/guide/what-is-vitepress.md | 6 ++---- docs/ru/guide/what-is-vitepress.md | 6 ++---- docs/zh/guide/what-is-vitepress.md | 6 ++---- .../theme-default/styles/components/custom-block.css | 6 +++++- src/node/markdown/plugins/containers.ts | 8 ++++++++ 9 files changed, 27 insertions(+), 29 deletions(-) diff --git a/docs/en/guide/what-is-vitepress.md b/docs/en/guide/what-is-vitepress.md index 3407c76d..e60c0357 100644 --- a/docs/en/guide/what-is-vitepress.md +++ b/docs/en/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ VitePress is a [Static Site Generator](https://en.wikipedia.org/wiki/Static_site_generator) (SSG) designed for building fast, content-centric websites. In a nutshell, VitePress takes your source content written in [Markdown](https://en.wikipedia.org/wiki/Markdown), applies a theme to it, and generates static HTML pages that can be easily deployed anywhere. -
- +::: tip {no-title} Just want to try it out? Skip to the [Quickstart](./getting-started). - -
+::: ## Use Cases diff --git a/docs/es/guide/what-is-vitepress.md b/docs/es/guide/what-is-vitepress.md index b8e07672..12c1c8d6 100644 --- a/docs/es/guide/what-is-vitepress.md +++ b/docs/es/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ VitePress es un [Generador de Sitios Estáticos](https://en.wikipedia.org/wiki/Static_site_generator) (SSG) diseñado para construir sitios web rápidos y enfocados en el contenido. En pocas palabras, VitePress toma tu contenido fuente escrito en [Markdown](https://en.wikipedia.org/wiki/Markdown), le aplica un tema y genera páginas HTML estáticas que se pueden desplegar fácilmente en cualquier lugar. -
- +::: tip {no-title} ¿Quieres probarlo? Ve directo al [Inicio Rápido](./getting-started). - -
+::: ## Casos de Uso {#use-cases} diff --git a/docs/fa/guide/what-is-vitepress.md b/docs/fa/guide/what-is-vitepress.md index 1d3d7f7f..d1150fd3 100644 --- a/docs/fa/guide/what-is-vitepress.md +++ b/docs/fa/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ ویت‌پرس یک [تولید کننده سایت ایستا](https://en.wikipedia.org/wiki/Static_site_generator) (SSG) است که برای ساخت وب‌سایت‌های سریع و محتوا محور طراحی شده است. به طور خلاصه، ویت‌پرس محتوای منبع شما که به زبان [Markdown](https://en.wikipedia.org/wiki/Markdown) نوشته شده است را گرفته، یک تم بر روی آن اعمال می‌کند و صفحات HTML ایستا تولید می‌کند که به راحتی در هر جایی قابل استقرار هستند. -
- +::: tip {no-title} فقط می‌خواهید آن را امتحان کنید؟ به [شروع سریع](./getting-started) بروید. - -
+::: ## موارد استفاده {#use-cases} diff --git a/docs/ko/guide/what-is-vitepress.md b/docs/ko/guide/what-is-vitepress.md index a2ed0dee..1d971915 100644 --- a/docs/ko/guide/what-is-vitepress.md +++ b/docs/ko/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ VitePress는 빠르고 컨텐츠 중심의 웹사이트를 구축하기 위해 설계된 [정적 사이트 생성기](https://en.wikipedia.org/wiki/Static_site_generator) (SSG)입니다. 다시말해 VitePress는 [마크다운](https://en.wikipedia.org/wiki/Markdown)으로 작성된 소스 컨텐츠를 가져와서 테마를 적용하고, 어디에나 쉽게 배포할 수 있는 정적 HTML 페이지를 생성합니다. -
- +::: tip {no-title} 그냥 한번 사용해보고 싶으신가요? [빠른 시작](./getting-started)으로 건너뛰세요. - -
+::: ## 사용 사례 {#use-cases} diff --git a/docs/pt/guide/what-is-vitepress.md b/docs/pt/guide/what-is-vitepress.md index c447fd02..f199b333 100644 --- a/docs/pt/guide/what-is-vitepress.md +++ b/docs/pt/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ O VitePress é um [Gerador de Site Estático](https://en.wikipedia.org/wiki/Static_site_generator) (SSG) projetado para criar sites rápidos e centrados em conteúdo. Em suma, VitePress utiliza seu conteúdo-fonte escrito em [Markdown](https://en.wikipedia.org/wiki/Markdown), aplica um tema a ele e gera páginas HTML estáticas que podem ser facilmente implantadas em qualquer lugar. -
- +::: tip {no-title} Quer apenas experimentar? Pule para o [Início Rápido](./getting-started). - -
+::: ## Casos de Uso {#use-cases} diff --git a/docs/ru/guide/what-is-vitepress.md b/docs/ru/guide/what-is-vitepress.md index eb683940..5f6dc866 100644 --- a/docs/ru/guide/what-is-vitepress.md +++ b/docs/ru/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ VitePress — это [Генератор статических сайтов](https://en.wikipedia.org/wiki/Static_site_generator) (ГСС), предназначенный для быстрого создания сайтов, ориентированных на контент. В двух словах, VitePress берёт ваш исходный контент, написанный в [Markdown](https://ru.wikipedia.org/wiki/Markdown), применяет к нему тему и генерирует статические HTML-страницы, которые можно легко развернуть в любом месте. -
- +::: tip {no-title} Хотите попробовать прямо сейчас? Перейдите к главе [Первые шаги](./getting-started). - -
+::: ## Примеры использования {#use-cases} diff --git a/docs/zh/guide/what-is-vitepress.md b/docs/zh/guide/what-is-vitepress.md index edff730a..9ca0ab1b 100644 --- a/docs/zh/guide/what-is-vitepress.md +++ b/docs/zh/guide/what-is-vitepress.md @@ -2,11 +2,9 @@ VitePress 是一个[静态站点生成器](https://en.wikipedia.org/wiki/Static_site_generator) (SSG),专为构建快速、以内容为中心的站点而设计。简而言之,VitePress 获取用 Markdown 编写的内容,对其应用主题,并生成可以轻松部署到任何地方的静态 HTML 页面。 -
- +::: tip {no-title} 只是想尝试一下?跳到[快速开始](./getting-started)。 - -
+::: ## 使用场景 {#use-cases} diff --git a/src/client/theme-default/styles/components/custom-block.css b/src/client/theme-default/styles/components/custom-block.css index a960381c..25bf3ba7 100644 --- a/src/client/theme-default/styles/components/custom-block.css +++ b/src/client/theme-default/styles/components/custom-block.css @@ -1,12 +1,16 @@ .custom-block { border: 1px solid transparent; border-radius: 8px; - padding: 16px 16px 8px; + padding: 8px 16px; line-height: 24px; font-size: var(--vp-custom-block-font-size); color: var(--vp-c-text-2); } +.custom-block:has(.custom-block-title) { + padding-top: 16px; +} + .custom-block.info { border-color: var(--vp-custom-block-info-border); color: var(--vp-custom-block-info-text); diff --git a/src/node/markdown/plugins/containers.ts b/src/node/markdown/plugins/containers.ts index 39efce17..f1bf3e43 100644 --- a/src/node/markdown/plugins/containers.ts +++ b/src/node/markdown/plugins/containers.ts @@ -28,6 +28,12 @@ export const containerPlugin = ( type ContainerArgs = [typeof container, string, { render: RenderRule }] +function attrPop(token: Token, name: string) { + const idx = token.attrIndex(name) + if (idx < 0) return null + return token.attrs!.splice(idx, 1)[0][1] +} + function createContainer( klass: string, defaultTitle: string, @@ -41,7 +47,9 @@ function createContainer( const token = tokens[idx] if (token.nesting === 1) { token.attrJoin('class', `${klass} custom-block`) + const skipTitle = attrPop(token, 'no-title') === '' const attrs = md.renderer.renderAttrs(token) + if (skipTitle && klass !== 'details') return `
\n` const info = token.info.trim().slice(klass.length).trim() const title = md.renderInline(info || defaultTitle, { references: env.references