ADR-0042: 公開するスライドは、ビルドのときに静的な HTML にして /slides/<slug> に置き、記事には iframe で埋め込む¶
Status¶
承認
Context¶
運営者が作ったスライドを、サイトで公開し、記事に埋め込む。
公開するスライドの URL、ページ送りの作り方、記事への埋め込みの形、Markdown の配置先を決める必要がある。
- 埋め込むコンテンツは、種別にも形式にもしない。本文に置く機能として追加する。URL の表に、スライドの URL は無い。
- ADR-0030: 種別を記事の 1 つにし、構成を記事の形式で、シリーズをディレクトリで表す
- スライドは Marp で作り、テーマの CSS からトークンの CSS 変数を参照する。
- marp-core の出力は、全てのスライドを縦に並べた HTML で、ページ送りを持たない。
- marp-cli の
bespokeのテンプレートは、ページ送り、進み具合のバー、発表者の画面を持つ。 - サイトは、OS の設定でライトとダークを切り替える。サイトに、テーマを切り替える操作を置かない。
- 出典: トークンの文書
- Node の実行環境を埋め込む記事の URL には、
COOP: same-originとCOEP: require-corpを返す。
Decision¶
1. Markdown の配置先と URL¶
運営者は、公開するスライドの Markdown を、apps/web/src/content/slides/<slug>.md に置く。
ビルドのときに、Node で marp-core を動かして静的な HTML にし、fukuemon.dev/slides/<slug> で公開する。
- 記事の schema と分ける。スライドを追加するときに変えるファイルは、その Markdown の 1 枚である。
- 公開するスライドのページには、トークンの CSS を入れる。
- サイトの URL に、次の 1 つを足す。ADR-0030 の Decision 2 のほかの URL は変えない。
| URL | 中身 |
|---|---|
/slides/<slug> |
運営者が公開するスライド |
最初の公開では、スライドの一覧のページを作らない。
スライドには、記事の埋め込みと、スライドの URL から辿る。
2. ページ送り¶
ページ送りは、リンクと CSS の :target で作る。
JavaScript を無効にしても、前後に送れるようにするためである。
- スライドごとに「前へ」「次へ」のリンクを置き、URL の
#2のような番号で、表示するスライドを決める。 - JavaScript が有効なときは、矢印キーでも送れる。
3. 記事への埋め込み¶
記事には、スライドのページを <iframe> で埋め込む。
記事のページの CSS と、Marp の CSS を分けるためである。
Verification¶
端末、ブラウザ、バージョンは、ADR-0041 の Verification と同じである。
- 運営者の Markdown を、Node のスクリプトで静的な HTML にした。4 枚の描画は 122 ミリ秒だった(最初の 1 回。ライブラリの読み込みを含まない)。
- 出力のページは 33 KB で、トークンの CSS の 21 KB を含む。Marp の出力に、
<script>は入らなかった。 - リンクと
:targetと:has()で作ったページ送りで、JavaScript を無効にして、1 枚目から 2 枚目、3 枚目、2 枚目へ送れた(3 つのブラウザ)。 - 記事にスライドのページを
<iframe>で埋め込み、JavaScript を無効にしても、1 枚目が出て、iframe の中のリンクで送れた。 - iframe の中のページは、OS の設定の明暗に従った。記事のページの
data-themeは、iframe の中に届かなかった。 - marp-cli の
bespokeのテンプレートは、試していない。JavaScript なしで送れるかは未確認である。 COEP: require-corpを返す記事に、スライドの iframe を埋め込めるかは未確認である。- 全画面の表示と、スワイプでの操作は作っていない。
Considered Options¶
| 選択肢 | 強み | 弱み |
|---|---|---|
採用: 静的な HTML を /slides/<slug> に置き、ページ送りをリンクと :target で作り、記事には iframe で埋め込む |
JavaScript なしで、前後に送れる。依存は marp-core だけで、ビルドにブラウザが要らない。サイトのトークンで画面を作れる | ページ送りの画面を、自分で作って保守する。全画面の表示と、スワイプでの操作は、別に作る |
marp-cli の bespoke のテンプレートで HTML を作る |
ページ送り、進み具合のバー、タッチの操作が、最初から付く | marp-cli の依存が増える。JavaScript なしで送れるかは未確認。画面の見た目を、サイトに合わせにくい |
| 全てのスライドを、1 ページに縦に並べる | 作るものが最も少ない。JavaScript も :has() も要らない |
ページを前後に送る操作が、スクロールになる |
| 記事の形式に、スライドを足す | スライドが、記事の一覧とシリーズに入る | ADR-0030 は、埋め込むコンテンツを形式にしないと決めている |
play.fukuemon.dev のエディタのページを、iframe で見せる |
公開するスライドのページを作らない | スライドを見るだけの訪問者も、エディタの JavaScript を読み込む。JavaScript なしで読めない |
| ビルドのときに、スライドの HTML を記事の中に展開する | iframe が要らない | Marp の CSS を、記事の CSS と分ける処理が要る。その処理は未確認 |
| 記事には、1 枚目の画像とリンクだけを置く | 記事のページが軽い | 記事の中で、スライドを送れない |
| Markdown を、記事のディレクトリの中か、記事の本文のフェンスに置く | スライドを、記事と一緒に管理できる | 記事の schema に、スライドの項目が入る。記事に埋め込まないスライドを公開できない |
Consequences¶
Positive¶
- 運営者は、Markdown の 1 枚を置くだけで、スライドを URL で公開できる。
- 訪問者は、JavaScript を無効にしても、スライドを開いて前後に送れる。
- スライドのページは、エディタの JavaScript を読み込まない。
Negative¶
- サイトの URL の種類が 1 つ増える。ADR-0030 の URL の表だけを読むと、スライドの URL が分からない。
- ページ送りの画面を、自分で作って保守する。
- ページ送りは、CSS の
:has()に依る。 - 公開するスライドのページごとに、トークンの CSS(21 KB)が入る。
- サイトにテーマを切り替える操作を置くことにしたときは、iframe の中のスライドに明暗を届ける仕組みが要る。