Color mode

サイトのカスタマイズ

Riebeckite で生成するサイトは、通常の HonoX application としてカスタマイズできます。

Riebeckite 独自の UI framework を覚える必要はありません。ページ、component、CSS、interactive UI などは、通常の HonoX / Hono JSX と同じ方法で変更できます。

Riebeckite は主に、次の部分を担当します。

  • Markdown などの content を読み込む
  • content や plugin の情報を Site に渡す
  • plugin が提供するページや UI を Site に接続する

一方、実際のサイトを構成する app/ は Site 側のコードです。

どこを変更すればいい?

まずは、変更したいものに対応する場所を確認してください。

変更したいもの 主な場所
ページや URL app/routes/
404(ページが見つからない) app/routes/_404.tsx
Header / Footer app/components/、app/routes/_renderer.tsx
記事ページの構成 app/components/article.tsx
ボタンなどの UI app/components/
操作できる UI app/islands/
色・余白・文字・レイアウト app/style.css や各 CSS
Header / Footer のリンク riebeckite.config.ts の navigation plugin

基本的には app/ 以下を編集すればサイトの見た目や構成を変更できる と考えてかまいません。

ただし、app/.riebeckite/ は Riebeckite が自動生成するディレクトリです。ビルドのたびに更新されるため、直接編集しないでください。

Component を作る

app/components/ には、通常の Hono JSX component を作成できます。

tsx
// app/components/callout.tsx
export function Callout({ children }: { children?: unknown }) {
  return <aside class="callout">{children}</aside>;
}

作成した component は、route や別の component から通常どおり import して利用できます。

Riebeckite の UI Primitive

記事ページを作るときは、@riebeckite/honox/ui が提供する次のような UI Primitive も利用できます。

  • Article
  • ArticleLayout
  • ArticleContent

これらは Riebeckite の記事構造を組み立てるための小さな部品です。

専用の component framework ではないため、必ず使う必要はありません。Site 側で独自の HTML 構造を作ることもできます。

詳しくは UI Primitive を参照してください。

記事ページの Layout を変える

starter では、記事ページの主な構成を次の2か所で管理しています。

text
app/components/article.tsx
app/routes/_renderer.tsx

app/components/article.tsx

ここにある SiteArticle が、記事ページのレイアウトを決めます。

たとえば、

  • 記事タイトルの位置を変える
  • 記事の前後に UI を追加する
  • breadcrumbs の位置を変える
  • backlinks や related posts の位置を変える
  • sidebar を追加する

といった変更は、主にここで行います。

SiteArticle は @riebeckite/honox/ui の Article を利用して作られていますが、Site 側の component なので自由に編集できます。

なお、route 内で Article という名前で使われているものは、この Site component を指します。@riebeckite/honox/ui の Article とは別物です。

app/routes/_renderer.tsx

_renderer.tsx は、サイト全体を包む外側のレイアウトです。

主に次のものを管理します。

  • <head>
  • Header
  • Footer
  • Navigation
  • ページ全体の共通 UI
  • Riebeckite や plugin が生成した head tag / style
  • RiebeckiteHead による標準 head contents の描画

サイト全体に共通する部分を変えたい場合は、こちらを編集します。

標準的な head contents を Framework に任せつつ、カスタム head を追加する例:

tsx
import { RiebeckiteHead, ThemeRoot } from "@riebeckite/honox/ui";
 
export default jsxRenderer(({ children }, c) => (
  <ThemeRoot
    theme={config.theme}
    lang={c.get("htmlLanguage") ?? config.site.locale}
  >
    <head>
      <RiebeckiteHead
        title={config.site.title}
        headTags={c.get("headTags") ?? []}
      />
      <meta name="custom-site-value" content="..." />
    </head>
    <body class="riebeckite-page rb-site">{children}</body>
  </ThemeRoot>
);

詳しくは Head Tags を参照してください。

Header や Footer に表示するリンクは、riebeckite.config.ts に登録する @riebeckite/plugin-navigation Plugin が提供します。

ts
plugins: [
  navigation({
    items: [
      { label: "Guide", href: "/guide" },
      {
        label: "Notes",
        href: "/notes/planning",
        children: [
          { label: "Planning", href: "/notes/planning" },
          { label: "Writing", href: "/notes/writing" },
        ],
      },
    ],
    secondary: [{ label: "GitHub", href: "https://github.com/example/site" }],
  }),
]

引数なしの navigation() は Vault からリンクを導出します。items を渡すと手動で選んだリンクに、secondary には補助リンクを指定できます。

モデルを返し、SiteNav でツリーを描画するのは Plugin です。描画したリストをどこに置くかは Site が決めます。starter では app/components/site-header.tsx が SiteNav を使い、app/routes/_renderer.tsx が解決済みモデルと現在パスを渡します。そのため、

  • リンクを追加・削除したい → navigation({ items }) を変更
  • Vault からリンクを導出したい → 引数なしの navigation()
  • Header の見た目や HTML を変えたい → site-header.tsx を変更
  • Header / Footer 自体の配置を変えたい → _renderer.tsx を変更

と考えると分かりやすいです。

子の再帰描画、現在パスの判定、言語を考慮した正規化、外部リンク、aria-current といった描画の仕組みは SiteNav にあるため、Site 側で再実装する必要はありません。

設定できる項目については Configuration リファレンス を参照してください。

Plugin が作るページやリンク

Riebeckite では、Header / Footer の Navigation とは別に、plugin がページやリンクを追加することがあります。

大きく分けると、次の2種類があります。

閲覧するためのページ

たとえば、

  • Search
  • Tag / Folder 一覧
  • Taxonomy のページ
  • Feed
  • Sitemap

などです。

これらは plugin が必要なページや endpoint を生成します。

有効化しただけで Header や Footer にリンクが追加されるわけではありません。Header に表示したい場合は、通常のページと同じように navigation へ追加してください。

記事同士をつなぐ UI

たとえば、

  • Breadcrumbs
  • Backlinks
  • Related Posts
  • Series の前後リンク
  • Local Graph

などです。

これらは主に記事ページの中へ表示されます。

Plugin が提供する UI fragment は article.header や article.footer などの Body Slot を通して配置できます。

つまり、

text
Header / Footer のリンク
        ↓
riebeckite.config.ts の navigation
 
検索・Tag・Folder などのページ
        ↓
Plugin の Page Type
 
Breadcrumbs・Backlinks など
        ↓
Component / Body Slot

という違いがあります。

Route を追加する

app/routes/ は通常の HonoX route ディレクトリです。

そのため、Site 独自のページも通常どおり追加できます。

たとえば /about を作りたい場合は、HonoX の route として追加できます。

一方、Markdown の content や plugin が提供するページについては、基本的に自分で route を追加する必要はありません。

starter の catch-all route が、

  • contentRouteSsgParams
  • riebeniteSsgParams
  • resolveRiebeckiteContentRequest

を利用して、content と plugin の Page Type を自動的に解決します。

Plugin のページを Header や Footer に表示したい場合も、新しい route を作るのではなく navigation にリンクを追加します。

404(ページが見つからない)

存在しない URL は、HonoX 標準の _404.tsx route が処理します。Site 側の通常のファイルなので、これを編集すると「ページが見つからない」画面を変更できます。

tsx
// app/routes/_404.tsx
import type { NotFoundHandler } from "hono";
 
const handler: NotFoundHandler = (c) => {
  c.status(404);
 
  return c.render(
    <main class="not-found">
      <h1>Page not found</h1>
      <p>The page you requested does not exist or is not available.</p>
      <a href="/">Back to home</a>
    </main>,
  );
};
 
export default handler;

「見つからない」と判断するのは Riebeckite ですが、描画は _renderer.tsx を通るため、404 画面でも Site の Theme、head、Header、Footer がそのまま使われます。押さえておくべき点は2つです。

  • status は必ず 404 のままにします。生成される preset は c.status(404) を呼びます。見た目を整えた画面を 200 で返してはいけません。
  • 見た目は Site のものです。markup、文言、リンク、CSS はすべて Site 側で決められます。Riebeckite が上書き対象となる「デフォルトの 404 component」を用意することはありません。

404 画面に到達するのは「見つからない」リクエストだけです。draft、公開日が未来の content、非公開の content がここへ来ることはないため、404 から非公開 content の存在が漏れることはありません。

Runtime Error(任意)

Hono の標準の error 処理が error をログに記録し、500 Internal Server Error を返すため、Site 側で何かを追加する必要はありません。visitor 向けの error 画面を Site のものとして用意したい場合は、HonoX の app/routes/_error.tsx(ErrorHandler)を利用できます。生成される preset はこれを追加していません。config、plugin、build の error は開発者向けであり、ページに偽装せずそのまま見えるべきだからです。

Plugin の Component を使う

Plugin によっては、Site から直接利用できる Hono JSX component を提供しています。

たとえば Backlinks や Table of Contents を Site の好きな場所へ配置できます。

tsx
import { Backlinks } from "@riebeckite/plugin-backlinks";
import { TableOfContents } from "@riebeckite/plugin-toc";
 
export function ArticleAside({ items, backlinks }: Props) {
  return (
    <aside>
      <TableOfContents items={items} />
      <Backlinks backlinks={backlinks} />
    </aside>
  );
}

利用できる component や props は、それぞれの Plugin ページや package README を確認してください。

多くの component は ./components から default import することもできます。

tsx
import Backlinks from "@riebeckite/plugin-backlinks/components";

color-mode は例外で、ColorModeScript と ColorModeToggle を package root から公開しています。

Body Slot を使う Plugin

Plugin によっては component を直接配置するのではなく、記事ページの決められた場所へ HTML を追加するものもあります。

この仕組みが Body Slot です。

Plugin を有効にして、Site 側の SiteArticle が対応する slot を描画していれば、自動的に表示されます。

詳しくは Body Slots と UI の提供方法 を参照してください。

操作できる UI を作る

クリックや状態管理など、ブラウザ側の処理が必要な UI は app/islands/ に作ります。

これは通常の HonoX island と同じです。

作成した island を route や component から import して利用します。

Riebeckite 専用の island の仕組みがあるわけではありません。

app/client.ts では、

ts
createClient();
initRiebeckiteClient();

の両方を初期化します。

createClient() は Site の client 処理を初期化し、initRiebeckiteClient() は Plugin や Theme が提供する browser-side の処理を起動します。

Site の island は app/islands/、Plugin の browser 処理は Plugin 側、というように責務が分かれています。

CSS を変更する

Site のデザインは、app/style.css や各 component の CSS から変更できます。

通常の CSS や Tailwind を利用できます。

Riebeckite が Plugin や Theme から生成した CSS は、Site の CSS から一度だけ読み込みます。

css
/* app/style.css */
@import "./.riebeckite/framework-styles.css";
@import "./.riebeckite/plugin-styles.css";
@import "./.riebeckite/theme-styles.css";

app/.riebeckite/ のファイルは自動生成されるため、直接編集しないでください。

Plugin の見た目を上書きするときは rr-<feature>、Riebeckite の UI Primitive を調整するときは rb-* の CSS hook を利用できます。

詳しくは CSS Hooks を参照してください。

迷ったときの目安

「どこを変更すればいいか分からない」という場合は、次のように考えると簡単です。

やりたいこと 変更する場所
Header にリンクを追加したい riebeckite.config.ts
Header の見た目を変えたい app/components/site-header.tsx
サイト全体の外枠を変えたい app/routes/_renderer.tsx
記事ページの構成を変えたい app/components/article.tsx
独自ページを追加したい app/routes/
404 ページを変えたい app/routes/_404.tsx
独自 component を作りたい app/components/
操作できる UI を作りたい app/islands/
色や余白を変えたい app/style.css
Plugin の UI を配置したい Plugin Component / Body Slot

Riebeckite が content と plugin を Site へ接続し、最終的なページの見た目と構成は Site が決める、というのが基本的な考え方です。

次に読むページ

History

1 changesCollapseExpand
1 + # サイトのカスタマイズ
2 +
3 + Riebeckite で生成するサイトは、通常の **HonoX application** としてカスタマイズできます。
4 +
5 + Riebeckite 独自の UI framework を覚える必要はありません。ページ、component、CSS、interactive UI などは、通常の HonoX / Hono JSX と同じ方法で変更できます。
6 +
7 + Riebeckite は主に、次の部分を担当します。
8 +
9 + - Markdown などの content を読み込む
10 + - content や plugin の情報を Site に渡す
11 + - plugin が提供するページや UI を Site に接続する
12 +
13 + 一方、実際のサイトを構成する `app/` は Site 側のコードです。
14 +
15 + ## どこを変更すればいい?
16 +
17 + まずは、変更したいものに対応する場所を確認してください。
18 +
19 + | 変更したいもの | 主な場所 |
20 + | --- | --- |
21 + | ページや URL | `app/routes/` |
22 + | 404(ページが見つからない) | `app/routes/_404.tsx` |
23 + | Header / Footer | `app/components/`、`app/routes/_renderer.tsx` |
24 + | 記事ページの構成 | `app/components/article.tsx` |
25 + | ボタンなどの UI | `app/components/` |
26 + | 操作できる UI | `app/islands/` |
27 + | 色・余白・文字・レイアウト | `app/style.css` や各 CSS |
28 + | Header / Footer のリンク | `riebeckite.config.ts` の `navigation` plugin |
29 +
30 + 基本的には **`app/` 以下を編集すればサイトの見た目や構成を変更できる** と考えてかまいません。
31 +
32 + ただし、`app/.riebeckite/` は Riebeckite が自動生成するディレクトリです。ビルドのたびに更新されるため、直接編集しないでください。
33 +
34 + ## Component を作る
35 +
36 + `app/components/` には、通常の Hono JSX component を作成できます。
37 +
38 + ```tsx
39 + // app/components/callout.tsx
40 + export function Callout({ children }: { children?: unknown }) {
41 + return <aside class="callout">{children}</aside>;
42 + }
43 + ```
44 +
45 + 作成した component は、route や別の component から通常どおり import して利用できます。
46 +
47 + ### Riebeckite の UI Primitive
48 +
49 + 記事ページを作るときは、`@riebeckite/honox/ui` が提供する次のような UI Primitive も利用できます。
50 +
51 + - `Article`
52 + - `ArticleLayout`
53 + - `ArticleContent`
54 +
55 + これらは Riebeckite の記事構造を組み立てるための小さな部品です。
56 +
57 + 専用の component framework ではないため、必ず使う必要はありません。Site 側で独自の HTML 構造を作ることもできます。
58 +
59 + 詳しくは [UI Primitive](../framework/honox-integration.md#ui-primitive) を参照してください。
60 +
61 + ## 記事ページの Layout を変える
62 +
63 + starter では、記事ページの主な構成を次の2か所で管理しています。
64 +
65 + ```text
66 + app/components/article.tsx
67 + app/routes/_renderer.tsx
68 + ```
69 +
70 + ### `app/components/article.tsx`
71 +
72 + ここにある `SiteArticle` が、記事ページのレイアウトを決めます。
73 +
74 + たとえば、
75 +
76 + - 記事タイトルの位置を変える
77 + - 記事の前後に UI を追加する
78 + - breadcrumbs の位置を変える
79 + - backlinks や related posts の位置を変える
80 + - sidebar を追加する
81 +
82 + といった変更は、主にここで行います。
83 +
84 + `SiteArticle` は `@riebeckite/honox/ui` の `Article` を利用して作られていますが、Site 側の component なので自由に編集できます。
85 +
86 + なお、route 内で `Article` という名前で使われているものは、この Site component を指します。`@riebeckite/honox/ui` の `Article` とは別物です。
87 +
88 + ### `app/routes/_renderer.tsx`
89 +
90 + `_renderer.tsx` は、サイト全体を包む外側のレイアウトです。
91 +
92 + 主に次のものを管理します。
93 +
94 + - `<head>`
95 + - Header
96 + - Footer
97 + - Navigation
98 + - ページ全体の共通 UI
99 + - Riebeckite や plugin が生成した head tag / style
100 + - **`RiebeckiteHead` による標準 head contents の描画**
101 +
102 + サイト全体に共通する部分を変えたい場合は、こちらを編集します。
103 +
104 + 標準的な head contents を Framework に任せつつ、カスタム head を追加する例:
105 +
106 + ```tsx
107 + import { RiebeckiteHead, ThemeRoot } from "@riebeckite/honox/ui";
108 +
109 + export default jsxRenderer(({ children }, c) => (
110 + <ThemeRoot
111 + theme={config.theme}
112 + lang={c.get("htmlLanguage") ?? config.site.locale}
113 + >
114 + <head>
115 + <RiebeckiteHead
116 + title={config.site.title}
117 + headTags={c.get("headTags") ?? []}
118 + />
119 + <meta name="custom-site-value" content="..." />
120 + </head>
121 + <body class="riebeckite-page rb-site">{children}</body>
122 + </ThemeRoot>
123 + );
124 + ```
125 +
126 + 詳しくは [Head Tags](../framework/honox-integration.md#head-tags) を参照してください。
127 +
128 + ## Navigation を変える
129 +
130 + Header や Footer に表示するリンクは、`riebeckite.config.ts` に登録する
131 + [`@riebeckite/plugin-navigation`](../reference/configuration.md#navigation-の設定) Plugin が提供します。
132 +
133 + ```ts
134 + plugins: [
135 + navigation({
136 + items: [
137 + { label: "Guide", href: "/guide" },
138 + {
139 + label: "Notes",
140 + href: "/notes/planning",
141 + children: [
142 + { label: "Planning", href: "/notes/planning" },
143 + { label: "Writing", href: "/notes/writing" },
144 + ],
145 + },
146 + ],
147 + secondary: [{ label: "GitHub", href: "https://github.com/example/site" }],
148 + }),
149 + ]
150 + ```
151 +
152 + 引数なしの `navigation()` は Vault からリンクを導出します。`items` を渡すと手動で選んだリンクに、`secondary` には補助リンクを指定できます。
153 +
154 + モデルを返し、`SiteNav` でツリーを描画するのは Plugin です。描画したリストをどこに置くかは Site が決めます。starter では `app/components/site-header.tsx` が `SiteNav` を使い、`app/routes/_renderer.tsx` が解決済みモデルと現在パスを渡します。そのため、
155 +
156 + - **リンクを追加・削除したい** → `navigation({ items })` を変更
157 + - **Vault からリンクを導出したい** → 引数なしの `navigation()`
158 + - **Header の見た目や HTML を変えたい** → `site-header.tsx` を変更
159 + - **Header / Footer 自体の配置を変えたい** → `_renderer.tsx` を変更
160 +
161 + と考えると分かりやすいです。
162 +
163 + 子の再帰描画、現在パスの判定、言語を考慮した正規化、外部リンク、`aria-current` といった描画の仕組みは `SiteNav` にあるため、Site 側で再実装する必要はありません。
164 +
165 + 設定できる項目については [Configuration リファレンス](../reference/configuration.md#navigation-の設定) を参照してください。
166 +
167 + ## Plugin が作るページやリンク
168 +
169 + Riebeckite では、Header / Footer の Navigation とは別に、plugin がページやリンクを追加することがあります。
170 +
171 + 大きく分けると、次の2種類があります。
172 +
173 + ### 閲覧するためのページ
174 +
175 + たとえば、
176 +
177 + - Search
178 + - Tag / Folder 一覧
179 + - Taxonomy のページ
180 + - Feed
181 + - Sitemap
182 +
183 + などです。
184 +
185 + これらは plugin が必要なページや endpoint を生成します。
186 +
187 + 有効化しただけで Header や Footer にリンクが追加されるわけではありません。Header に表示したい場合は、通常のページと同じように `navigation` へ追加してください。
188 +
189 + ### 記事同士をつなぐ UI
190 +
191 + たとえば、
192 +
193 + - Breadcrumbs
194 + - Backlinks
195 + - Related Posts
196 + - Series の前後リンク
197 + - Local Graph
198 +
199 + などです。
200 +
201 + これらは主に記事ページの中へ表示されます。
202 +
203 + Plugin が提供する UI fragment は `article.header` や `article.footer` などの **Body Slot** を通して配置できます。
204 +
205 + つまり、
206 +
207 + ```text
208 + Header / Footer のリンク
209 + ↓
210 + riebeckite.config.ts の navigation
211 +
212 + 検索・Tag・Folder などのページ
213 + ↓
214 + Plugin の Page Type
215 +
216 + Breadcrumbs・Backlinks など
217 + ↓
218 + Component / Body Slot
219 + ```
220 +
221 + という違いがあります。
222 +
223 + ## Route を追加する
224 +
225 + `app/routes/` は通常の HonoX route ディレクトリです。
226 +
227 + そのため、Site 独自のページも通常どおり追加できます。
228 +
229 + たとえば `/about` を作りたい場合は、HonoX の route として追加できます。
230 +
231 + 一方、Markdown の content や plugin が提供するページについては、基本的に自分で route を追加する必要はありません。
232 +
233 + starter の catch-all route が、
234 +
235 + - `contentRouteSsgParams`
236 + - `riebeniteSsgParams`
237 + - `resolveRiebeckiteContentRequest`
238 +
239 + を利用して、content と plugin の Page Type を自動的に解決します。
240 +
241 + Plugin のページを Header や Footer に表示したい場合も、新しい route を作るのではなく `navigation` にリンクを追加します。
242 +
243 + ## 404(ページが見つからない)
244 +
245 + 存在しない URL は、HonoX 標準の `_404.tsx` route が処理します。Site 側の通常のファイルなので、これを編集すると「ページが見つからない」画面を変更できます。
246 +
247 + ```tsx
248 + // app/routes/_404.tsx
249 + import type { NotFoundHandler } from "hono";
250 +
251 + const handler: NotFoundHandler = (c) => {
252 + c.status(404);
253 +
254 + return c.render(
255 + <main class="not-found">
256 + <h1>Page not found</h1>
257 + <p>The page you requested does not exist or is not available.</p>
258 + <a href="/">Back to home</a>
259 + </main>,
260 + );
261 + };
262 +
263 + export default handler;
264 + ```
265 +
266 + 「見つからない」と判断するのは Riebeckite ですが、描画は `_renderer.tsx` を通るため、404 画面でも Site の Theme、head、Header、Footer がそのまま使われます。押さえておくべき点は2つです。
267 +
268 + - status は必ず 404 のままにします。生成される preset は `c.status(404)` を呼びます。見た目を整えた画面を `200` で返してはいけません。
269 + - 見た目は Site のものです。markup、文言、リンク、CSS はすべて Site 側で決められます。Riebeckite が上書き対象となる「デフォルトの 404 component」を用意することはありません。
270 +
271 + 404 画面に到達するのは「見つからない」リクエストだけです。draft、公開日が未来の content、非公開の content がここへ来ることはないため、404 から非公開 content の存在が漏れることはありません。
272 +
273 + ### Runtime Error(任意)
274 +
275 + Hono の標準の error 処理が error をログに記録し、`500 Internal Server Error` を返すため、Site 側で何かを追加する必要はありません。visitor 向けの error 画面を Site のものとして用意したい場合は、HonoX の `app/routes/_error.tsx`(`ErrorHandler`)を利用できます。生成される preset はこれを追加していません。config、plugin、build の error は開発者向けであり、ページに偽装せずそのまま見えるべきだからです。
276 +
277 + ## Plugin の Component を使う
278 +
279 + Plugin によっては、Site から直接利用できる Hono JSX component を提供しています。
280 +
281 + たとえば Backlinks や Table of Contents を Site の好きな場所へ配置できます。
282 +
283 + ```tsx
284 + import { Backlinks } from "@riebeckite/plugin-backlinks";
285 + import { TableOfContents } from "@riebeckite/plugin-toc";
286 +
287 + export function ArticleAside({ items, backlinks }: Props) {
288 + return (
289 + <aside>
290 + <TableOfContents items={items} />
291 + <Backlinks backlinks={backlinks} />
292 + </aside>
293 + );
294 + }
295 + ```
296 +
297 + 利用できる component や props は、それぞれの Plugin ページや package README を確認してください。
298 +
299 + 多くの component は `./components` から default import することもできます。
300 +
301 + ```tsx
302 + import Backlinks from "@riebeckite/plugin-backlinks/components";
303 + ```
304 +
305 + `color-mode` は例外で、`ColorModeScript` と `ColorModeToggle` を package root から公開しています。
306 +
307 + ### Body Slot を使う Plugin
308 +
309 + Plugin によっては component を直接配置するのではなく、記事ページの決められた場所へ HTML を追加するものもあります。
310 +
311 + この仕組みが **Body Slot** です。
312 +
313 + Plugin を有効にして、Site 側の `SiteArticle` が対応する slot を描画していれば、自動的に表示されます。
314 +
315 + 詳しくは [Body Slots](../reference/plugin-api.md#body-slots) と [UI の提供方法](../plugins/writing-a-plugin.md#ui-の提供方法) を参照してください。
316 +
317 + ## 操作できる UI を作る
318 +
319 + クリックや状態管理など、ブラウザ側の処理が必要な UI は `app/islands/` に作ります。
320 +
321 + これは通常の HonoX island と同じです。
322 +
323 + 作成した island を route や component から import して利用します。
324 +
325 + Riebeckite 専用の island の仕組みがあるわけではありません。
326 +
327 + `app/client.ts` では、
328 +
329 + ```ts
330 + createClient();
331 + initRiebeckiteClient();
332 + ```
333 +
334 + の両方を初期化します。
335 +
336 + `createClient()` は Site の client 処理を初期化し、`initRiebeckiteClient()` は Plugin や Theme が提供する browser-side の処理を起動します。
337 +
338 + Site の island は `app/islands/`、Plugin の browser 処理は Plugin 側、というように責務が分かれています。
339 +
340 + ## CSS を変更する
341 +
342 + Site のデザインは、`app/style.css` や各 component の CSS から変更できます。
343 +
344 + 通常の CSS や Tailwind を利用できます。
345 +
346 + Riebeckite が Plugin や Theme から生成した CSS は、Site の CSS から一度だけ読み込みます。
347 +
348 + ```css
349 + /* app/style.css */
350 + @import "./.riebeckite/framework-styles.css";
351 + @import "./.riebeckite/plugin-styles.css";
352 + @import "./.riebeckite/theme-styles.css";
353 + ```
354 +
355 + `app/.riebeckite/` のファイルは自動生成されるため、直接編集しないでください。
356 +
357 + Plugin の見た目を上書きするときは `rr-<feature>`、Riebeckite の UI Primitive を調整するときは `rb-*` の CSS hook を利用できます。
358 +
359 + 詳しくは [CSS Hooks](../reference/plugin-api.md#css-hooks) を参照してください。
360 +
361 + ## 迷ったときの目安
362 +
363 + 「どこを変更すればいいか分からない」という場合は、次のように考えると簡単です。
364 +
365 + | やりたいこと | 変更する場所 |
366 + | --- | --- |
367 + | Header にリンクを追加したい | `riebeckite.config.ts` |
368 + | Header の見た目を変えたい | `app/components/site-header.tsx` |
369 + | サイト全体の外枠を変えたい | `app/routes/_renderer.tsx` |
370 + | 記事ページの構成を変えたい | `app/components/article.tsx` |
371 + | 独自ページを追加したい | `app/routes/` |
372 + | 404 ページを変えたい | `app/routes/_404.tsx` |
373 + | 独自 component を作りたい | `app/components/` |
374 + | 操作できる UI を作りたい | `app/islands/` |
375 + | 色や余白を変えたい | `app/style.css` |
376 + | Plugin の UI を配置したい | Plugin Component / Body Slot |
377 +
378 + Riebeckite が content と plugin を Site へ接続し、**最終的なページの見た目と構成は Site が決める**、というのが基本的な考え方です。
379 +
380 + ## 次に読むページ
381 +
382 + - [HonoX Integration](../framework/honox-integration.md) — Riebeckite と HonoX の接続や UI Primitive
383 + - [プラグイン作成の詳細](../framework/plugin-system.md) — Plugin を作る場合の拡張ポイント
384 + - [Plugin API](../reference/plugin-api.md) — Body Slot、Page、Asset、CSS Hook の詳細
385 +