ブラウザ完結型のチュートリアルを手軽に作れるツールキットが出たので触ってみる

タイトルの通りです。ブラウザ完結型のチュートリアルを簡単に作れるツールキットをStackBlitzが出してくれました。

https://x.com/stackblitz/status/1816478595407077393

[こういう感じのチュートリアルサイト](https://demo.tutorialkit.dev/forms-tutorial/introduction/welcome/)の雛形がコマンド一発で作れるので、チュートリアルコンテンツの作成に集中することができます。ただし、このツールキットは[WebContainers](https://webcontainers.io/)の技術を使っているため、ブラウザ完結型で動かすことが可能な一方、WebContainersのコンテナ上で動くものに限定されてしまうので、現状としてはJS、CSSなどのライブラリやフレームワークのチュートリアルを作成できるツールと認識しておく必要があります。

## 早速触ってみる

公式のアナウンス通り、まずはプロジェクトを作成してみます

```
$ npm create tutorial
```

以下の項目に対話的に回答していくと自動的に設定してくれます。

- プロジェクト名
- プロジェクトのパス（デフォルトでカレントディレクトリの下）
- npm or pnpm
- gitのリポジトリとして初期化するか
- 依存パッケージをインストールして起動するか

![スクリーンショット 2024-07-26 11.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/aca0c600-3f6b-49e8-5dd9-aa485a9e5ea2.png)

起動完了:rocket:
表示されたurlにアクセスするとこのような構成の画面になります。

```markdown
┌─────────────────────────────────────────────────────┐
│ ● ● ●                                               │
├───────────────────────────┬─────────────────────────┤
│                           │                         │
│                           │                         │
│                           │                         │
│                           │                         │
│                           │       Code Editor       │
│                           │                         │
│                           │                         │
│                           │                         │
│                           │                         │
│          Content          ├─────────────────────────┤
│                           │                         │
│                           │                         │
│                           │  Preview & Boot Screen  │
│                           │                         │
│                           │                         │
│                           ├─────────────────────────┤
│                           │                         │
│                           │        Terminal         │
│                           │                         │
└───────────────────────────┴─────────────────────────┘
```

チュートリアルサイトなどでよく見る構成ですね。

`Content`にはドキュメントが表示されます。チュートリアルの手順や説明などをmarkdownベースで記述して所定のフォルダに配置すると自動的に表示してくれます。

`Code Editor`はその名の通りエディタが組み込まれている領域で、ブラウザ上で自由に編集することができます。

`Preview & Boot Screen`ではチュートリアルで作成したWebアプリをプレビューできます。

`Terminal`ではWebContainersのコンテナに接続されたターミナルを開くことができます。デフォルトではoutputを確認できるだけですが、設定でインタラクティブモードにもできるようです。

## コンテンツのカスタマイズ

チュートリアルはpart、chapter、lessonの階層構造を持ち、lessonレベルのフォルダ配下のcontent.mdが実際に`Content`領域に表示されるものとなります。また、フォルダ名の先頭に数字をつけることでチュートリアルの順番を示しています。直感的で分かりやすいですね。
npm createで作成されたプロジェクトでは以下のようなフォルダ構成になっていました。

```
./src/content/tutorial
├── 1-basics
│   ├── 1-introduction
│   │   ├── 1-welcome
│   │   │   ├── _files
│   │   │   │   └── counter.js
│   │   │   ├── _solution
│   │   │   │   └── counter.js
│   │   │   └── content.md
│   │   └── meta.md
│   └── meta.md
└── meta.md
```

`_files`と`_solution`はエディタに表示されるテキストの初期状態と右上solveボタンを押した時の状態が格納されています。

### レッスンの追加

レッスンを追加してみます。
以下のように、introductionの章の下に2-lesson2を追加しました。
content.mdは同じものでもいいですが変化が見たかったので適当に編集してみました。

```
./src/content/tutorial
├── 1-basics
│   ├── 1-introduction
│   │   ├── 1-welcome
│   │   │   ├── _files
│   │   │   │   └── counter.js
│   │   │   ├── _solution
│   │   │   │   └── counter.js
│   │   │   └── content.md
│   │   ├── 2-lesson2
│   │   │   ├── _files
│   │   │   │   └── counter.js
│   │   │   ├── _solution
│   │   │   │   └── counter.js
│   │   │   └── content.md
│   │   └── meta.md
│   └── meta.md
└── meta.md
```

無事レッスンが追加できました。所定の箇所に所定のフォルダ、ファイルを配置するだけでルーティングや画面遷移用のUIなど自動的にやってくれるようです。

![add_lesson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/fe5a3637-6d90-42c1-90de-34860033ca13.png)

### その他

#### テンプレート

ウェブコンテナ内で実行されるプロジェクトの雛形は`src/templates/default`に配置されています。これはViteのプロジェクトでフォルダに入って`npm install`と`npm run dev`すれば正常に起動する完全なプロジェクトです
ベースとなるプロジェクトを変更したい場合は、このフォルダを好きなプロジェクトに変えることで実現できます。

#### UIのカスタマイズ

TutorialKitのロゴや全体的な見た目などはコンポーネントのオーバーライドで書き換え可能です。

https://tutorialkit.dev/guides/overriding-components/

## 最後に

まだどこまでカスタマイズ可能か試しきれてないですが、サーバー要らずで初学者向けの学習コンテンツが作成できるので結構重宝しそうな予感がしています！

以上です！

## 参考

https://tutorialkit.dev/