minidocs

样式

组件本身不带样式。你可以引入 minidocs 的默认样式,在它的基础上调整,也可以完全自己写。

使用默认样式

在布局里引入一次:

---
import '@minidocs/astro/styles.css';
---

正文样式

用 Prose 组件包住 <Content />,渲染出来的 Markdown 就有了完整的排版:标题、段落、列表、链接、行内代码、代码块、表格、引用、分隔线和图片。

<Prose>
  <h1>{entry.data.title}</h1>
  <Content />
</Prose>

Prose 渲染一个带 md-prose class 的 <article>,给任意元素加上这个 class 也一样。

深色模式

默认样式的颜色跟随页面的 color-scheme。用了 Layout.Root 的页面会声明 color-scheme: light dark,跟随系统切换深浅色。不用 Layout 组件时,页面始终是浅色,要支持深色模式就自己声明:

:root {
  color-scheme: light dark;
}

有深浅色切换按钮的站点,切换时把 color-scheme 设成 light 或 dark,组件会跟着变。

代码块

Astro 默认用单一主题高亮代码,颜色直接写在标签上,不会跟随深浅色。在 Astro 配置里同时指定浅色和深色两个主题,并关闭默认颜色:

// astro.config.mjs
export default defineConfig({
  markdown: {
    shikiConfig: {
      themes: { light: 'github-light', dark: 'github-dark' },
      defaultColor: false,
    },
  },
});

这样 Shiki 只输出两套颜色变量,md-prose 会按 color-scheme 选择其中一套,代码块就和页面的其他部分一起切换。只用单一主题时,代码块保持主题本身的颜色。

修改变量

:root {
  --md-color-accent: light-dark(#4338ca, #a5b4fc);
  --md-radius: 0;
}

颜色变量可以用 light-dark() 同时给出浅色和深色的值。

默认样式只有黑白灰。给 --md-color-accent 设一个颜色,侧边栏和目录的当前项、正文链接都会换成这个颜色。

常用的变量:

变量 作用
--md-color-accent 当前位置和链接的颜色
--md-color-bg、--md-color-text、--md-color-heading 背景、正文和标题的颜色
--md-radius 圆角
--md-font-sans、--md-font-mono 页面字体和代码字体
--md-layout-sidebar-width、--md-layout-main-width、--md-layout-aside-width 三栏的宽度

全部变量见组件与样式。

选择样式文件

@minidocs/astro/styles.css 包含了全部默认样式。它由按组件分开的几个文件组成,可以只引入其中一部分:

@import '@minidocs/astro/styles/base.css'; /* variables, needed by the others */
@import '@minidocs/astro/styles/layout.css';
@import '@minidocs/astro/styles/toc.css';
@import '@minidocs/astro/styles/prose.css';
@import '@minidocs/astro/styles/pager.css';
@import '@minidocs/astro/styles/callout.css';
/* sidebar.css left out: the sidebar has no default look, style it from scratch */
文件 内容
base.css 所有变量。其他文件都依赖它
layout.css 页面布局、断点、窄屏抽屉、目录的折叠形态
sidebar.css 侧边栏本身的外观:导轨、当前项、折叠箭头、菜单按钮
toc.css 目录
prose.css 正文排版
pager.css 翻页
callout.css 提示框

改一个组件的外观有三种程度:

想改多少 做法
换颜色、字号、间距 改变量
微调几处 在默认样式上覆盖几条规则
完全换一种风格 不引入这个组件的文件,从零写

不引入某个文件,那个组件就没有任何默认样式,不需要先抵消什么。窄屏下的抽屉在 layout.css 里,所以重写侧边栏的外观时,抽屉照样有效。

自己写样式

每个组件渲染出的元素都带着固定的 class,状态用属性表示。

比如 Sidebar.Link 渲染出的 <a> 带着 md-sidebar-link,当前页面的链接带着 aria-current="page"。所有的 class 和状态见组件与样式。

下面给当前页面加一条左侧竖线:

.md-sidebar [aria-current='page'] {
  box-shadow: inset 2px 0 var(--md-color-accent);
}

不需要提高优先级

默认样式全部放在 @layer minidocs 中。你写的普通 CSS 不在任何 layer 里,总会覆盖它。

作用域样式

写在 .astro 文件 <style> 里的样式默认只作用于这个文件自己的标签,管不到 minidocs 组件渲染出的元素。给它们写样式时,用 <style is:global> 或者单独的 CSS 文件。

配合 Tailwind

和 Tailwind 一起使用默认样式时,要把默认样式引入到 Tailwind 的 components layer 里:

@import 'tailwindcss';
@import '@minidocs/astro/styles.css' layer(components);

不要漏掉 layer(components)

漏掉时,默认样式要么压过你写的 Tailwind 类,要么被 Tailwind 的样式重置压过,比如正文的标题全部变成正文字号。

组件的状态都是属性,用 Tailwind 自带的变体就能写样式:

<Sidebar.Link {...nav.of(node)} class="aria-[current=page]:font-semibold">
<Sidebar.Group {...nav.of(node)} class="data-[state=open]:bg-zinc-50">

默认样式的变量也可以直接用在你自己的标签上,这样站点的其他部分会和组件保持一致的配色,深色模式也跟着切换:

<header class="border-b border-(--md-color-border) bg-(--md-color-bg)">

只想用一部分默认样式时,每个文件都同样加上 layer(components)。

完全不使用默认样式

不引入任何样式文件即可,组件的交互不受影响。

本页目录
搜索范围
输入关键词开始搜索