コンテンツにスキップ
Blume is now publicly available.
Blume
日本語
Esc
移動開く⌘Jプレビュー
このページの内容

コンポーネント

カード、ステップ、タブ、アコーディオン、バッジ、コードグループ、フレーム、ツリー、型テーブル、ライブプレビュー、差分 — 任意の MDX ページで使える組み込みコンポーネント。

Blume には、アクセシブルでテーマ設定可能なコンポーネントセットが同梱されており、インポート不要で任意の .mdx ページで利用できます。以下ではそれぞれをライブプレビューとソースとともに紹介します。コンポーネントはバニラ実装で React を使いません。React は独自のアイランドを追加した場合にのみ有効になります。

Card と CardGroup

カードは、アイコン、タイトル、短い説明文とともにリンク先を示します。CardGroup でまとめるとレスポンシブなグリッドになります。ランディングページ、セクションのインデックス、「次のステップ」など、読者を先へ導きたい場所で活用してください。

<CardGroup cols={2}>
  <Card title="Quickstart" href="/docs/quickstart" icon="rocket">
    Install Blume and ship your first page.
  </Card>
  <Card title="Components" href="/docs/content/components" icon="folder">
    Browse the component library.
  </Card>
</CardGroup>

Cardtitle、任意の href(省略するとクリックできないカードになります)、そして Blume 組み込みのアイコンセットから選ぶ icon を受け取ります。CardGroupcols(デフォルトは 2)を受け取ります。

Steps

順序のある手順(インストール、セットアップの流れ、順番が重要なチュートリアルなど)のための、番号付きの縦方向シーケンスです。各 Steptitle を受け取ります。

Blume をインストール

パッケージをプロジェクトに追加します。

ページを書く

コンテンツフォルダに .mdx ファイルを追加します。

公開する

blume build を実行して dist/ をデプロイします。

<Steps>
  <Step title="Install Blume">Add the package to your project.</Step>
  <Step title="Write a page">
    Drop an `.mdx` file into your content folder.
  </Step>
  <Step title="Ship it">Run `blume build` and deploy `dist/`.</Step>
</Steps>

Tabs

同等の内容 — 言語ごとのバリエーション、OS 別のコマンド、代替となるアプローチなど — をその場で切り替えられます。すべてをページ上に積み上げる必要がありません。各 Tabtitle を受け取ります。

Homebrew を使ってツールチェーンをインストールします。
winget を使ってツールチェーンをインストールします。
<Tabs>
  <Tab title="macOS">Use Homebrew to install the toolchain.</Tab>
  <Tab title="Windows">Use winget to install the toolchain.</Tab>
</Tabs>

inline を追加すると、枠線付きのボックスではなく、ボーダーレスで描画されます — 全幅の罫線上にタブストリップが並び、コンテンツはその下に本文として流れます。param を追加すると、アクティブなタブがハッシュではなく URL のクエリパラメータに同期され、選択状態を共有できるようになります。?install=windows で終わるリンクを開くと Windows タブが表示されます。各グループはそれぞれ独自の param に同期するため、1 ページ内に独立してディープリンク可能なグループを複数配置できます。

Homebrew を使ってツールチェーンをインストールします。
winget を使ってツールチェーンをインストールします。
<Tabs inline param="install">
  <Tab title="macOS">Use Homebrew to install the toolchain.</Tab>
  <Tab title="Windows">Use winget to install the toolchain.</Tab>
</Tabs>

Badge

ステータスやメタデータを示す小さなインラインラベルです — バージョンタグ、「new」や「beta」のマーカー、安定性レベルなど。variant で意味に合わせて色を調整します。

デフォルト

特に強調のない中立的なメタデータ。

安定版
<Badge>Stable</Badge>

アクセント

テーマのアクセントカラーで注意を引きます — 「new」や注目マーカーに適しています。

新機能
<Badge variant="accent">New</Badge>

成功

肯定的、または合格を示す状態。

合格
<Badge variant="success">Passing</Badge>

警告

実験的機能など、注意して使うべきもの。

ベータ
<Badge variant="warning">Beta</Badge>

危険

非推奨など、否定的または破壊的な状態。

非推奨
<Badge variant="danger">Deprecated</Badge>

Icon

名前を指定してアイコンを描画します — 同じ icon プロパティが、カード、ステップ、タブ、サイドバーの項目でも使われます。名前は Lucide 由来で、小文字のケバブケースです(rocketgaugebook-open)。

<Icon icon="rocket" size={20} />

Blume は Lucide 専用です — 名前だけを指定すると Lucide から解決され、他のアイコン入力との対称性のために lucide: を前置することもできます(lucide:rocket)。size はピクセルサイズ(デフォルトは 16)を設定し、color は色を付けます(任意の CSS カラー。デフォルトは currentColor)。名前の代わりに生の <svg> 文字列、画像 URL、ローカル画像パスを渡せば独自のアートを描画でき、label を追加すると支援技術に公開されます。label がない場合、アイコンは装飾扱いになります。

アイコンはビルド時に解決され、JavaScript を伴わない SVG としてインライン展開されます。実行時に取得されるものはありません。

ファイルツリー

プロジェクトやフォルダの構成を図示します。通常の Markdown リストをラップすると、Blume がツリーとしてスタイリングします — セットアップや設定のガイドで構造を説明するのに便利です。

  • docs/
    • index.mdx
    • guides/
      • configuration.mdx
  • blume.config.ts
<FileTree>

- docs/
  - index.mdx
  - guides/
    - configuration.mdx
- blume.config.ts

</FileTree>

Accordion

関連する折りたたみ要素を、区切り線の入った 1 つの枠線付きコンテナにまとめます — FAQ、任意の手順、長い例などに。各子要素は AccordionItem です(title、任意の icondescriptiondefaultOpen)。単独の開閉要素には Expandable を使ってください。

MDX に対応していますか?

はい — すべてのページを .md または .mdx にできます。

テーマはカスタマイズできますか?

はい。Tailwind v4 のトークンと独自の theme.css を通じて可能です。

<Accordion>
  <AccordionItem title="Does it support MDX?">
    Yes — every page can be `.md` or `.mdx`.
  </AccordionItem>
  <AccordionItem title="Is the theme customizable?">
    Yes, via Tailwind v4 tokens and your own `theme.css`.
  </AccordionItem>
</Accordion>

Expandable

入れ子の詳細(フィールドのサブプロパティの展開や補足の余談など)のための軽量なインライン開閉要素です。title がトグルのラベルになります(デフォルトは「Show more」)。defaultOpen を指定すると展開された状態で始まります。

詳細オプションを表示

これらの設定は任意で、変更が必要になることはほとんどありません。

<Expandable title="Show advanced options">
  These settings are optional and rarely need changing.
</Expandable>

Columns

カードやブロックを、モバイルで折り返される等幅カラムのレスポンシブグリッドに配置します。Columnscols を受け取り、各セルを Column でラップします。

高速

Astro と Vite の上に構築されています。

テーマ設定可能

Tailwind v4 のデザイントークン。

<Columns cols={2}>
  <Column>
    <Card title="Fast" icon="rocket">
      Built on Astro and Vite.
    </Card>
  </Column>
  <Column>
    <Card title="Themeable" icon="sun">
      Tailwind v4 design tokens.
    </Card>
  </Column>
</Columns>

CodeGroup

複数のコードブロックを 1 つのタブ切り替え式にまとめます — 言語ごと、ファイルごとに 1 タブ。タブのラベルは各ブロックのタイトル(言語の後に続くテキスト)になります。dropdown を追加すると、タブバーの代わりにメニューで切り替えます。

export const greet = (name: string) => `Hello, ${name}`;
def greet(name: str) -> str:
    return f"Hello, {name}"
fn greet(name: &str) -> String {
    format!("Hello, {name}")
}
<CodeGroup>

```ts TypeScript
export const greet = (name: string) => `Hello, ${name}`;
```

```python Python
def greet(name: str) -> str:
    return f"Hello, {name}"
```

```rust Rust
fn greet(name: &str) -> String {
    format!("Hello, {name}")
}
```

</CodeGroup>

Frame

画像や任意のビジュアルを、中央揃えの枠線付きフレームで囲みます。任意の caption(Markdown として描画されます)と hint を指定できます。

フレームはビジュアルを中央揃えし、キャプションを付けます。

フレーム付きのイラスト。
<Frame
  caption="A **framed** illustration."
  hint="Frames center and caption visuals."
>
  <img src="/screenshot.png" alt="Product screenshot" />
</Frame>

YouTube

YouTube 動画を、レスポンシブでプライバシーに配慮した(youtube-nocookie.com)16 のフレームに埋め込みます。クライアント JavaScript は一切含まれません。動画の id または完全な url に加え、任意の title(アクセシビリティ用)と秒単位の start 時間を渡せます。

<YouTube id="aqz-KE-bpKQ" title="Big Buck Bunny" />
<YouTube url="https://youtu.be/aqz-KE-bpKQ" start={30} />

Color

コピー可能な 16 進数値とともにカラースウォッチを表示します — パレットやブランドカラーを文書化するのに便利です。スウォッチのリストには variant="compact" を、グループ化するには Color.Row と併せて variant="table" を使います。各 Color.Itemnamevalue(16 進数の文字列、またはテーマ対応の色のための { light, dark })を受け取ります。

<Color variant="compact">
  <Color.Item name="blue-500" value="#3B82F6" />
  <Color.Item name="green-500" value="#16A34A" />
  <Color.Item name="background" value={{ light: "#FFFFFF", dark: "#0A0A0A" }} />
</Color>

Tree

展開可能なフォルダを備えた階層的なファイル/フォルダ構造を描画します。(リスト駆動の手軽な方法については ファイルツリー を参照してください。Tree はフォルダごとの制御が可能です。)Tree.Foldername、任意の defaultOpenopenable)と Tree.Filename)を使います。

src
index.ts
components
Button.tsx
blume.config.ts
<Tree>
  <Tree.Folder name="src" defaultOpen>
    <Tree.File name="index.ts" />
    <Tree.Folder name="components">
      <Tree.File name="Button.tsx" />
    </Tree.Folder>
  </Tree.Folder>
  <Tree.File name="blume.config.ts" />
</Tree>

Panel

脇に置いておく補足的なコンテンツのための、タイトル付きコンテナです。title は任意です。

<Panel title="Good to know">
  Panels hold supporting detail without interrupting the main flow.
</Panel>

Tooltip

インラインの用語について、ホバー時に定義やヒントを表示します。tip がホバー時のテキストです。任意で headline と、フォローアップリンク用の cta + href を追加できます。

APIAPIソフトウェアが通信に使う一連のプロトコル。ガイドを読む

という用語にホバーすると詳細がわかります。

Hover the <Tooltip tip="A set of protocols software uses to communicate." headline="API" cta="Read the guide" href="/docs/quickstart">API</Tooltip> term.

Tile

ビジュアル(アイコンや画像)を前面に出し、その下にタイトルと説明を配置したクリック可能なプレビューです。ギャラリーやショーケースに適しています。titledescriptionhref を受け取り、子要素がビジュアルになります。

クイックスタート

数分で最初のページを公開しましょう。

<Tile
  title="Quickstart"
  description="Ship your first page in minutes."
  href="/docs/quickstart"
>
  <Icon icon="rocket" size={28} />
</Tile>

Prompt

ラベルとコピーボタンからなる 1 行の要素です。description(Markdown)が表示されるラベルで、本文がプロンプトそのものになります。本文は非表示で、Copy prompt ボタンを押すとクリップボードにコピーされます。actions でボタンを制御します(例: ["copy", "cursor"])。

エンドポイントをドキュメント化するようモデルに依頼します。

<Prompt
  description="Ask the model to **document** an endpoint."
  actions={["copy"]}
>
  Write reference docs for the POST /v1/pets endpoint.
</Prompt>

Visibility

対象読者に応じてコンテンツを表示または非表示にします。for="web" はサイト上にのみ描画され、for="agents" は AI エージェントが読むエージェント向け Markdown(llms-full.txt と各ページの .md ミラー)を対象とします。

この注記はウェブサイトには表示されますが、エージェント向け Markdown からは 除外されます。

<Visibility for="web">Shown on the site only.</Visibility>
<Visibility for="agents">Shown only in the generated Markdown.</Visibility>

型テーブル

オブジェクトのプロパティ — プロパティ、型、デフォルト値 — を文書化するためのテーブルです。TypeTable で行を手書きするか、AutoTypeTable で TypeScript のインターフェースや型エイリアスから直接生成できます。

型テーブル

各行を展開すると説明と詳細が現れる、プロパティ / 型のグリッドです。プロパティ名をキーとする type マップを渡します。各エントリは type に加えて、任意の descriptiondefaultrequired フラグ、typeDescriptiontypeDescriptionLink を受け取ります。省略可能なプロパティ(required が未設定)は、名前の後に ? が表示されます。

PropType
labelstring

ボタンに表示されるラベル。

Typestring
variant?"primary" | "ghost"

見た目のスタイル。

Type"primary" | "ghost"
Default"primary"
disabled?boolean
Typeboolean
<TypeTable
  type={{
    label: {
      type: "string",
      required: true,
      description: "The button's visible label.",
    },
    variant: {
      type: '"primary" | "ghost"',
      default: '"primary"',
      description: "Visual style.",
    },
    disabled: { type: "boolean" },
  }}
/>

自動型テーブル

TypeScript の型から型テーブルを生成し、ドキュメントをソースと同期させ続けます。AutoTypeTablepath(プロジェクトルートからの解決)と型の name を指定します。説明は JSDoc コメントから、デフォルト値は @default タグから取得され、省略可能なプロパティ(?)はそれに応じて示されます。

<AutoTypeTable path="./src/button.ts" name="ButtonProps" />

path の代わりに type で型をインラインで渡すこともできます — 小さな例に便利です。

PropType
labelstring

The button's visible label.

Typestring
variant?"primary" | "ghost"

Visual style.

Type"primary" | "ghost"
Default"primary"
disabled?boolean

Disable interaction.

Typeboolean
<AutoTypeTable
  name="ButtonProps"
  type={`
export interface ButtonProps {
  /** The button's visible label. */
  label: string;
  /**
   * Visual style.
   * @default "primary"
   */
  variant?: "primary" | "ghost";
  /** Disable interaction. */
  disabled?: boolean;
}
`}
/>

GitHub 情報

GitHub リポジトリへのリンクを、最新のスター数とフォーク数とともに表示するカードです。カウントはビルド時に取得され — クライアント JavaScript は不要 — API に到達できない場合でもカードは描画されます。ownerrepo を渡すか、省略して blume.config のリポジトリを使用します。API のレート制限を緩和するには、環境変数 GITHUB_TOKEN を設定してください。

haydenbleasel/blumeWorld-class docs for everything you ship. Fast, AI-ready, and zero-config.1.1K63
<!-- Uses the repo from blume.config -->
<GithubInfo />

<!-- Or point it at any repository -->
<GithubInfo owner="haydenbleasel" repo="blume" />

Component

Component は、プロジェクトの examples/ ディレクトリにあるサンプルファイルを、ハイライトされたソースと並べてタブ形式でライブプレビューとして描画します。path でファイルを指定します — examples/ 配下の位置から拡張子を除いたもの(つまり examples/counter.tsx なら path="counter")。React、Vue、Svelte、Astro のサンプルがすべてサポートされ、フレームワークのサンプルはハイドレートされ、Astro のものは静的に描画されます。単一のファイルからプレビューとコードを同期させ続けます。

プレビューは、ドキュメントのスタイルが一切届かない独立したフレーム内で描画されます — 本文のマージン、タイポグラフィ、テーマの装飾がコンポーネントに漏れ込むことはありません。フレームには Tailwind(プリフライトと、サンプルファイルおよびそれがインポートするものからスキャンされたユーティリティ)と、bg-background のようなクラスがデフォルトでサイトのパレットに従うようにする Blume のデザイントークンが与えられ、サイトのライト/ダーク切り替えにリアルタイムで追従します。ペインは描画されたサンプルに合わせてサイズを調整し — 読み込み後にサンプルが拡大・縮小しても追従し続けます — Preview タブと Code タブは同じ高さを共有するため、切り替えてもページがずれることはありません。

shadcn の変数など、独自のデザインシステムでプレビューをスタイリングするには、examples.css にスタイルシートを指定します。これは Blume のデフォルトの後に各プレビューフレームへ注入されるため、あなたのトークンが優先されます。その中で @import "tailwindcss" は書かないでください。フレームはすでに Tailwind を提供しています。ダークモードのオーバーライドには .dark[data-theme="dark"] のどちらも使えます。

// blume.config.ts
export default defineConfig({
  examples: { css: "examples/theme.css" },
});
/* examples/theme.css */
:root {
  --primary: oklch(0.6 0.2 260);
}

.dark {
  --primary: oklch(0.75 0.15 260);
}

@theme inline {
  --color-primary: var(--primary);
}

ディレクトリも設定可能です — サンプルが別の場所(レジストリ構成など)にある場合は source を設定します(または文字列の省略記法 examples: "..." を使います)。path は常にそこからの相対パスになります。

// blume.config.ts
export default defineConfig({
  examples: "registry/files-sdk",
});
<!-- registry/files-sdk/file-list/basic.tsx -->
<Component path="file-list/basic" />

examples には glob(*?[]{}! を含むもの)も指定できます。マッチしたファイルのみが検出され、path は glob の静的なプレフィックス(最初のワイルドカードより前の部分)からの相対パスになります。これは、各コンポーネントのソースをそのサンプルと同じ場所に置くレジストリ向けです — プレビュー用のデフォルトエクスポートを持たないソースが巻き込まれないよう、サンプルだけを指定してください。

// blume.config.ts
export default defineConfig({
  // registry/files-sdk/file-list/file-list.tsx — source, left out
  // registry/files-sdk/file-list/examples/basic.tsx — discovered
  examples: "registry/files-sdk/**/examples/*",
});
<!-- keyed relative to registry/files-sdk -->
<Component path="file-list/examples/basic" />
import { useState } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <button
      className="rounded-blume border border-border bg-background px-4 py-2 font-medium text-foreground text-sm transition-colors hover:bg-muted"
      onClick={() => setCount((value) => value + 1)}
      type="button"
    >
      Clicked {count} {count === 1 ? "time" : "times"}
    </button>
  );
};

export default Counter;
<!-- examples/counter.tsx -->
<Component path="counter" />

Astro のサンプルは、クライアント JavaScript なしでライブに描画されます。

---
interface Props {
  title?: string;
}

const { title = "Hello from Astro" } = Astro.props;
---

<div class="rounded-blume border border-border bg-muted/30 px-5 py-4">
  <p class="m-0 font-semibold text-foreground text-sm">{title}</p>
  <p class="m-0 mt-1 text-muted-foreground text-sm">
    A static, server-rendered example — no client JavaScript ships.
  </p>
</div>

CodeBlock

CodeBlock は、フェンス付きコードと同じ Shiki のテーマとトランスフォーマー(ライト/ダークの切り替えを含む)でコード文字列をハイライトします。ランディングページや独自のコンポーネントなど、フェンスを置けない場所のためのものです。codelang を渡します。

export const greet = (name: string): string =>
`Hello, ${name}!`;
---
import CodeBlock from "blume/components/content/CodeBlock.astro";
---

<CodeBlock lang="ts" code={source} />

(独自コンポーネントの中などで)自分で HTML 文字列にハイライトしたい場合は、blume/markdown から基盤となるヘルパーをインポートします。

import { highlightCode } from "blume/markdown";

const html = await highlightCode(source, "ts");

Diff

Diff は git 形式の差分を、コードブロックと同じ Shiki のテーマでハイライトして描画します。すべてビルド時に生成されるため、クライアント JavaScript は不要です。2 つのインライン文字列(old / new)、2 つのファイルパス(before / after)、または unified 形式のパッチ(インラインの patch 文字列か src ファイル)を渡します。

<Diff
  lang="ts"
  old={`export function greet(name) {
  return "Hi, " + name;
}`}
  new={`export function greet(name: string): string {
  return "Hi, " + name + "!";
}`}
/>

プロジェクト内の 2 つのファイルを、ルートからの相対パスで差分表示します。

<Diff before="diffs/button-before.ts" after="diffs/button-after.ts" />

あるいは unified 形式のパッチを描画します — src でファイルから読み込むか、patch でインラインに指定します。

<Diff src="diffs/greet.patch" />
<Diff
  patch={`--- a/greet.ts
+++ b/greet.ts
@@ -1,3 +1,4 @@
-export function greet(name) {
-  return "Hi, " + name;
+export function greet(name: string): string {
+  const greeting = "Hi, " + name + "!";
+  return greeting;
 }`}
/>

このページは役に立ちましたか?