slidev-theme-watabegg 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.ja.md +381 -112
  2. package/README.md +197 -115
  3. package/components/AgendaList.vue +49 -0
  4. package/components/Cite.vue +28 -0
  5. package/components/DiagramFrame.vue +92 -0
  6. package/components/FigureGrid.vue +108 -0
  7. package/components/KaTexReveal.vue +25 -24
  8. package/components/QuestionList.vue +256 -125
  9. package/components/SectionNumber.vue +34 -0
  10. package/components/SlideReferences.vue +82 -0
  11. package/components/SmallText.vue +25 -0
  12. package/components/TextBox.vue +6 -6
  13. package/components/ThemeFooter.vue +51 -0
  14. package/components/ThemeWave.vue +44 -0
  15. package/custom-nav-controls.vue +40 -0
  16. package/global-bottom.vue +25 -65
  17. package/layouts/agenda.vue +33 -0
  18. package/layouts/cover.vue +7 -21
  19. package/layouts/end.vue +13 -9
  20. package/layouts/image-scroll.vue +4 -2
  21. package/layouts/image.vue +9 -3
  22. package/layouts/section.vue +65 -0
  23. package/package.json +45 -12
  24. package/setup/mermaid.ts +28 -0
  25. package/setup/shiki.ts +3 -4
  26. package/setup/shortcuts.ts +3 -4
  27. package/slide-bottom.vue +56 -0
  28. package/styles/globals.css +99 -87
  29. package/styles/globals.css.d.ts +3 -0
  30. package/styles/layout.css +10 -8
  31. package/styles/layout.css.d.ts +3 -0
  32. package/utils/agenda.ts +89 -0
  33. package/utils/colors.ts +1 -3
  34. package/utils/figure.ts +11 -0
  35. package/utils/presentation.ts +57 -0
  36. package/utils/references.ts +72 -0
  37. package/utils/render.ts +42 -4
  38. package/utils/safeUrl.ts +27 -0
  39. package/utils/themeConfig.ts +20 -0
  40. package/utils/useAvailableHeight.ts +75 -0
  41. package/utils/useThemePalette.ts +21 -25
  42. package/example.md +0 -197
  43. package/utils/link.ts +0 -17
package/README.ja.md CHANGED
@@ -1,167 +1,436 @@
1
- # slidev-theme-watabegg (日本語ドキュメント)
1
+ # slidev-theme-watabegg
2
2
 
3
- [![NPM version](https://img.shields.io/npm/v/slidev-theme-watabegg?color=3AB9D4&label=)](https://www.npmjs.com/package/slidev-theme-watabegg)
3
+ `slidev-theme-watabegg`(バージョン 1.2.0)は、研究発表や進捗報告での利用を想定した Slidev 向けの個人用テーマです。Vue 3 と TypeScript で開発されており、MIT ライセンスで公開されています。
4
4
 
5
- 教育現場(集団授業・試験対策)向けに視認性と操作性を重視した Slidev テーマです。普通に自分用に開発しました。
5
+ 発表資料としての読みやすさを考慮し、日本語フォントには「M PLUS 2」、等幅フォントには「Fira Code」を採用しています。白を基調としたスライドに、5 色(red、yellow、green、blue、purple)のアクセントカラーを組み合わせて利用できます。カラーの初期値は green、デモ資料では blue を使用しています。コードハイライトには Shiki の `vitesse-light` および `vitesse-dark` を適用します。
6
6
 
7
- ## 特徴
8
- - 教育特化のミニマルデザイン
9
- - 日本語表示最適化 (M PLUS 2) / 等幅 Fira Code
10
- - 自動フッター(`cover` / `image` / `image-scroll` 以外で日付 + ページ番号)
11
- - ショートカット: Enter (次) / Backspace (前)
12
- - レイアウト: `cover`, `two-cols`, `image`, `image-scroll`, `end`
13
- - フロントマター `color` でテーマカラーを `red | yellow | green | blue | purple` から選択
14
- - コンポーネント: `QuestionList`, `TextBox`, `KaTexReveal`
15
- - 多段ラベル: 丸番号 / カタカナ / ひらがな / 漢数字(1–19) / 英字 / カスタム
16
- - ユーティリティ: `.text-highlight`, `.card`
17
- - Shiki テーマ: vitesse-light / vitesse-dark
7
+ ## 動作環境と導入方法
8
+
9
+ 本テーマの動作要件および開発環境は以下のとおりです。
10
+
11
+ - Node.js: >= 22.12.0
12
+ - Slidev: >= 53.0.0
13
+ - 開発時パッケージマネージャー: pnpm 11.1.3
14
+
15
+ ### インストールと利用
16
+
17
+ 公開されているテーマを自身のプレゼンテーションで使用する場合は、スライド先頭の YAML frontmatter でテーマを指定します。
18
18
 
19
- ## インストール
20
19
  ```yaml
21
20
  ---
22
21
  theme: slidev-theme-watabegg
23
22
  ---
24
23
  ```
25
- ローカル開発(クローンしたリポジトリで):
24
+
25
+ リポジトリを複製してローカルでデモを確認したり、テーマ自体を開発したりする場合は、依存パッケージをインストールしたあとに開発サーバーを起動します。
26
+
27
+ ```bash
28
+ git clone https://github.com/watabegg/slidev-theme-watabegg
29
+ cd slidev-theme-watabegg
30
+ pnpm install
31
+ pnpm dev
32
+ ```
33
+
34
+ 起動すると、`theme: ./` を指定したローカルのサンプルスライド `example.md` が表示されます。`example.md` ではコンポーネントや画像、キーボード操作といった機能デモに加え、アジェンダやセクション、表などのスライド例を確認できます。なお、リポジトリに含まれる過去の画像(`example/*.png`)は履歴上の記録であり、最新の表示結果ではないため本書には掲載していません。
35
+
36
+ ## スライド全体の設定例
37
+
38
+ スライド全体に適用する既定値は、最初のスライドの frontmatter 内にある `themeConfig.watabegg` で設定します。
39
+
26
40
  ```yaml
27
41
  ---
28
- theme: ./
42
+ theme: slidev-theme-watabegg
43
+ date: '2026-10-05'
44
+ themeConfig:
45
+ watabegg:
46
+ color: blue
47
+ density: research
48
+ footer:
49
+ text: '研究室ミーティング'
50
+ navigation:
51
+ href: 'https://example.com/research'
52
+ label: '発表一覧に戻る'
29
53
  ---
30
54
  ```
31
55
 
32
- ## フロントマター例
56
+ スライド全体で設定したアクセントカラー(`color`)は、各スライドの frontmatter で個別に指定して上書きできます(情報密度はスライド全体で固定されます)。
57
+
58
+ ## 情報密度(Density)の調整
59
+
60
+ スライド全体の情報密度は、`themeConfig.watabegg.density` で `research`(既定値)または `comfortable` を指定します。認識できない値が指定された場合は `research` にフォールバックします。スライドごとの個別上書きには対応していません。
61
+
62
+ - `research`(標準・既定値):
63
+ - 本文: 20px / タイトル: 30px
64
+ - 余白: 左右 28px、上 24px(下部はフッター表示時に 36px、非表示時に 24px を確保)
65
+ - 段落、リスト、カードの間隔を詰めた引き締まった配置
66
+ - `comfortable`:
67
+ - 本文: 24px / タイトル: 40px
68
+ - 余白: 左右 32px、上 32px(下部はフッター表示時に 36px、非表示時に 24px を確保)
69
+ - 全体的に間隔を広げたゆとりのある配置
70
+
33
71
  ```yaml
34
- title: Theme Demo
35
- subtitle: サブタイトル
36
- author: 講師名
37
- date: '2025/08/03'
38
- color: green # red | yellow | green | blue | purple
39
- link: 'https://example.com' # フッターリンク(省略可)
40
- transition: fade
72
+ ---
73
+ themeConfig:
74
+ watabegg:
75
+ density: comfortable
76
+ ---
41
77
  ```
42
78
 
43
- `color` を省略するとデフォルトの `green` が適用されます。
79
+ ## フッター(Footer)の仕様と設定
44
80
 
45
- 下図は`blue`指定の例。
81
+ スライドの可読性を損なわないよう、フッターには背景色、枠線、ホームリンクを設けず、11px のプレーンテキストで表示します。
82
+ 左側に日付、中央に任意のテキスト(キャプション)、右側にページ番号(現在ページ / 総ページ数)が配置されます。ビューワーではスライド遷移アニメーションとは独立した固定フッターとして画面下部に常駐し、ページ番号が更新されます(一覧表示やプレビューでは個別の静的フッターとして描画されます)。
46
83
 
47
- ![フロントマター例](https://raw.githubusercontent.com/watabegg/slidev-theme-watabegg/refs/heads/main/example/0.png)
84
+ - 中央のテキスト: スライド全体の設定(`themeConfig.watabegg.footer.text`)で一度だけ指定します(スライドごとの `footer.text` は無視されます)。初期状態では空で、長すぎる場合は末尾が自動的に省略されます。
85
+ - 日付の表示優先度: 個別スライドの `footer.date` > スライド全体の `footer.date` > 個別スライドの `date` > スライド全体の `date` の順で適用されます。
86
+ - 自動非表示: `cover`、`image`、`image-scroll` の各レイアウトでは自動的にフッターが隠れます。フッターが非表示のときはコンテンツ下部の余白がわずかに縮小されます。フッター表示用の帯状オーバーレイ領域は配置していません。
87
+ - 表示制御と上書き:
88
+ - スライド全体で非表示にする場合は、`themeConfig.watabegg.footer: false` を指定します。
89
+ - 個別のスライドで非表示にする場合は、そのスライドの frontmatter で `footer: false` を指定します。
90
+ - スライド全体でフッターを無効化している場合でも、個別スライドで `footer: true` を指定すれば通常のスライドとしてフッターを表示できます。
91
+ - 個別スライドでは `date` や `pageNumber`(`pageNumber: false` でページ番号を非表示)を個別に上書きできます。
48
92
 
49
- ## レイアウト
50
- | 名称 | 用途 | 特徴 |
51
- |------|------|------|
52
- | cover | 表紙 | グラデーション波 + title/subtitle/author |
53
- | two-cols | 2カラム | `::left::` / `::right::` スロット |
54
- | image | 背景画像 | `image:` 指定 + `TextBox` で自由配置 |
55
- | image-scroll | 背景画像(縦スクロール) | `image:` 指定 + 縦長背景 + `TextBox` |
56
- | end | 終了スライド | シンプルな終了画面 |
57
-
58
- ### two-cols 例
59
- ```markdown
93
+ ```yaml
60
94
  ---
61
- layout: two-cols
95
+ themeConfig:
96
+ watabegg:
97
+ footer:
98
+ text: '研究室ミーティング'
62
99
  ---
63
- ::left::
64
- 左
65
- ::right::
66
- 右
67
100
  ```
68
101
 
69
- ![two-cols 例](https://raw.githubusercontent.com/watabegg/slidev-theme-watabegg/refs/heads/main/example/1.png)
102
+ ## アジェンダとセクションレイアウト
103
+
104
+ 単一階層のアジェンダレイアウト(`layout: agenda`)とセクションレイアウト(`layout: section`)を使用します。スライド全体で単一のアウトラインを共有し、アジェンダと各セクションの番号が自動的に同期されます。
105
+
106
+ ### デザイン仕様
107
+
108
+ - **文字サイズ**: アジェンダ項目の文字サイズは標準(research)で 30px、`themeConfig.watabegg.density: comfortable` 指定時は 36px です。
109
+ - **バッジ**: 丸型のテーマバッジ内に白文字で番号を表示します。フォントは本文と同じ M PLUS 2 の等幅数字(tabular nums)を用い、直径は標準で 44px、comfortable で 48px です。桁数が多い数字には枠内に収まるフォントサイズが自動適用されます。
110
+ - **余白**: アウトライン領域の余白はコンテンツ領域に対して上部 12px、左右 24px です。項目間の間隔は 24px、数字バッジとテキストの間隔は 18px です。
111
+ - **配色と表示要素**: 選択中の項目を含め、タイトルにはテーマ色を使用せず本文テキスト色を維持します。アジェンダやセクションにサブタイトルは表示されません。セクションスライドは白背景に同デザインの大きめの丸型バッジとテーマ色の下線が表示され、波形装飾はありません。本文の配置は任意です。
112
+
113
+ ### アウトラインの生成方式
114
+
115
+ #### 自動生成(デフォルト)
116
+
117
+ スライド順に配置されたすべての `layout: section` スライドから、フラットな 1, 2, 3... のアウトラインを自動生成します。通常のコンテンツスライドは除外されます。タイトルは frontmatter の `title` または Markdown の `#` 見出しから取得され、スライド順を入れ替えるとアジェンダとバッジの番号も連動して更新されます。Markdown の `#` 見出しを使用した場合もタイトルは1度だけ表示されます。`level` プロパティは番号付けに影響しません。各セクションで個別に番号を指定する必要はありません。
118
+
119
+ ```yaml
120
+ ---
121
+ layout: agenda
122
+ title: Agenda
123
+ ---
70
124
 
71
- ### image 例
72
- ```markdown
73
125
  ---
74
- layout: image
75
- image: /path/to/bg.jpg
126
+ layout: section
127
+ title: 背景
76
128
  ---
77
- <TextBox :x="120" :y="160" :width="360">注釈</TextBox>
78
- ```
79
129
 
80
- ## image-scroll 例
81
- ```markdown
82
130
  ---
83
- layout: image-scroll
84
- image: /path/to/long-bg.jpg
85
- imageScroll:
86
- offsetY: -120
131
+ layout: section
132
+ title: 手法
87
133
  ---
88
134
  ```
89
135
 
90
- ![image-scroll 例](https://raw.githubusercontent.com/watabegg/slidev-theme-watabegg/refs/heads/main/example/7.png)
136
+ #### 手動定義
91
137
 
92
- image-scroll オプション(frontmatter `imageScroll`):
93
- - `offsetY`: 画像の中心からの初期スクロール量(px)
138
+ 最初のアジェンダスライドで `agenda` 配列を指定すると、スライド全体で共有されるアウトラインを明示的に定義できます。文字列の配列または `{ title: '...' }` のオブジェクトを受け付け、以降のアジェンダスライドでは配列を省略して再利用できます。既存の `example.md` もこの定義に従っています。
94
139
 
95
- 操作:
96
- - Wheel / トラックパッド: 縦スクロール
97
- - タッチ: 縦スクロール
98
-
99
- 初期位置の例:
100
- ```markdown
140
+ ```yaml
101
141
  ---
102
- layout: image-scroll
103
- image: /path/to/long-bg.jpg
104
- imageScroll:
105
- offsetY: 180
142
+ layout: agenda
143
+ title: Agenda
144
+ agenda: ['背景', '手法', '結果']
145
+ agendaActive: 2
106
146
  ---
107
147
  ```
108
148
 
109
- ## コンポーネント
110
- ### QuestionList
111
- 入れ子質問/解答・Markdown 埋め込み・階層別スタイル。
112
- ```vue
149
+ 手動定義では、セクションのタイトルが一意に一致すれば自動で紐付けられます。タイトルが異なる場合や重複している場合は、`sectionNumber: 2` のように既存の共有アウトライン項目番号を明示的に参照します(任意の新しい番号を割り振ることはできません)。不一致や曖昧なセクションにはバッジが表示されません。一方、自動生成セクションはスライド番号で識別されるため、同じタイトルの重複に対応します。アウトラインを明示的に無効化したい場合は、空配列 `agenda: []` を指定します。
150
+
151
+ ### アクティブ項目の強調(agendaActive)
152
+
153
+ `agendaActive: 2` のように指定すると該当項目が太字(BOLD)でのみ強調され、文字色は本文色のまま保たれます(アクティブな親項目という概念はありません)。省略時は直前のセクションスライドと現在のページ情報(概要やエクスポート時など)から自動で強調されます。先頭のアジェンダスライドなど直前にセクションが存在しない場合は自動強調されないため、明示的に `agendaActive` を指定します。強調を無効化したい場合は `agendaActive: 0` を指定します。
154
+
155
+ ## Mermaid
156
+
157
+ Slidev のスライド内で図表を作成する際は、Mermaid の標準的なコードフェンス記法を利用できます。テーマ側であらかじめフォントや配置の間隔を設定しているため、標準の記述のままでもスライド全体と調和した図表を表示できます。
158
+
159
+ ### デフォルト設定とカスタマイズ
160
+
161
+ 本テーマでは、`setup/mermaid.ts` によって以下の表示設定が初期値として適用されます。
162
+
163
+ - **フォント**: M PLUS 2(サンセリフ体)、文字サイズ 16px、クラシックな外観
164
+ - **フローチャート(flowchart)**: パディング 8px、ノード間隔(nodeSpacing) 24px、階層間隔(rankSpacing) 30px
165
+ - **シーケンス図(sequence)**: アクター枠を横長(幅 320px、高さ 32px)にし、余白や間隔を縮小して配置(アクターの反転配置 mirrorActors は無効)。これらはレンダラーに渡される初期値であり、実際の表示間隔はレンダラー側の仕様に依存する場合があります
166
+
167
+ 配色はテーマ独自の色パレットではなく、Mermaid の標準色を維持しています。これらの設定を変更したい場合は、各コードフェンス内の先頭で Mermaid の YAML 設定ブロックを記述して上書きできます。詳細な記法については、[Slidev の Mermaid ドキュメント](https://sli.dev/features/mermaid.html) および [Mermaid のシーケンス図ドキュメント](https://mermaid.js.org/syntax/sequenceDiagram.html) を参照してください。
168
+
169
+ ### ノードの整列と注意点
170
+
171
+ フローチャートで長方形ノードの高さを揃えるには、ノードの形状とラベルの行数を一致させる必要があります。異なる形状のノードを混在させたり、複数行のテキストを含むノードを配置したりすると、ノードごとに高さが変わります。SVG の表示サイズを自動調整してもノードや矢印の内部配置は再計算されないため、高さを揃えたい場合はダイアグラム側で記述を調整してください。
172
+
173
+ 以下のようにラベルがすべて1行の長方形ノードを並べた構成では、ノードの高さが自然に揃います。
174
+
175
+ ```mermaid
176
+ flowchart LR
177
+ A[入力データ] --> B[前処理]
178
+ B --> C[推論実行]
179
+ C --> D[出力結果]
180
+ ```
181
+
182
+ ### DiagramFrame による自動サイズ調整
183
+
184
+ 複雑な図を描画するとスライドの領域外にはみ出したり、逆に小さな図が意図せず拡大されてレイアウトが崩れたりすることがあります。`DiagramFrame` は、Mermaid の標準コードフェンスを囲むことで、アスペクト比を保ったまま縦横中央に自動配置するコンポーネントです。
185
+
186
+ #### 主な特徴とプロパティ
187
+
188
+ - **`height`**: フレームの最大高さをスライドの論理ピクセル単位で指定します(初期値: 260px)。後続の通常の本文段落や参考文献パネルに必要な領域がある場合は自動的にフレームが縮小されますが、最大高さを明示的に抑えたい場合にこの値を指定します。
189
+ - **`max-scale`**: 元の SVG サイズに対する拡大率の上限を指定します(初期値: 1)。初期値のままにしておくことで、小さな図が元の寸法以上に拡大されるのを防ぎます。
190
+
191
+ 図を縮小すると内部のラベル文字も一緒に小さくなります。複雑な図を一定の枠内に収めながらフォントサイズだけを維持することはできないため、文字の可読性と図の密度のバランスを考慮してサイズを調整してください。
192
+
193
+ #### 使用上の注意
194
+
195
+ - `DiagramFrame` は1つのコンポーネントにつき1つの図を囲んでください。
196
+ - スライドの通常のフローレイアウト内で使用します。
197
+ - コードフェンス側の `scale` 設定と `DiagramFrame` の自動調整を併用すると予期しない表示になるため、サイズの制御は `DiagramFrame` の `height` または `max-scale` に一元化してください。
198
+ - Vue コンポーネントの開始タグ・終了タグとコードフェンスの間には、必ず空行を挟んでください。
199
+
200
+ #### 記述例
201
+
202
+ ````markdown
203
+ 上の段落の説明文を記述します。
204
+
205
+ <DiagramFrame :height="200" :max-scale="1">
206
+
207
+ ```mermaid
208
+ flowchart LR
209
+ Input[入力] --> Process[処理]
210
+ Process --> Output[出力]
211
+ ```
212
+
213
+ </DiagramFrame>
214
+
215
+ 下の段落で補足説明を続けます。
216
+ ````
217
+
218
+
219
+ ## 図・補足文・参考文献
220
+
221
+ スライド内で複数の実験結果を並べて比較したり、補足説明や出典情報を明記したりするためのコンポーネントを提供しています。
222
+
223
+ ### FigureGrid
224
+
225
+ 研究発表などにおいて、複数の画像やグラフを横一列に整列させて比較するためのコンポーネントです。
226
+
227
+ #### 仕様と動作
228
+
229
+ - **画像数**: `images` プロパティに `src` と `alt` を持つオブジェクトの配列を渡します。指定できる画像数は **2枚から4枚** に限られます。
230
+ - **配置と寸法**: 画像は横一列に並びます。各画像は正方形の枠内に収められ、CSS の `object-fit: contain` によって元のアスペクト比を維持したまま表示されます。元の画像が正方形でなくてもトリミング(切り抜き)は行われません。
231
+ - **自動サイズ計算**: コンポーネント全体の初期最大高さは 380 論理ピクセル(上下の補足文やキャプションを含む)です。画像の各辺の長さは、利用可能な高さと等分割された幅のうち、小さい方の値に合わせて自動的に決定されます。さらにサイズを抑えたい場合は、`height` プロパティで任意の高さを指定できます。
232
+ - **補足文とキャプション**: 画像の上下に2〜3行程度のテキストを配置できるよう、`#before` スロットと `#after` スロットを用意しています(段落 `<p>` と改行 `<br>` を使用)。全体の共通キャプションは `caption` プロパティで指定できるほか、インライン引用などを埋め込みたい場合は `#caption` スロットを利用できます。
233
+
234
+ 標準的なスライドレイアウトでの使用を推奨します。前後の本文やキャプション、参考文献の分量が多いと画像の表示領域が狭くなります。要素を過密に配置すると視認性が損なわれる恐れがあるため、余白に余裕を持たせて構成してください。
235
+
236
+ #### 記述例
237
+
238
+ ```html
239
+ <FigureGrid
240
+ :images="[
241
+ { src: '/plots/a.png', alt: '条件Aの測定結果' },
242
+ { src: '/plots/b.png', alt: '条件Bの測定結果' }
243
+ ]"
244
+ caption="図1: 条件Aおよび条件Bの比較"
245
+ >
246
+ <template #before>
247
+ <p>比較対象の概要をここに記述します。<br>必要に応じて2〜3行程度で補足します。</p>
248
+ </template>
249
+ <template #after>
250
+ <p>図から読み取れる結果の要点を記述します。<br>レイアウトに合わせて簡潔にまとめます。</p>
251
+ </template>
252
+ </FigureGrid>
253
+ ```
254
+
255
+
256
+ ### SmallText
257
+
258
+ スライド本文の文字サイズ(research で 20px、comfortable で 24px)に対し、注釈や前提条件などの補足情報を一段控えめに掲載したい場合に `SmallText` を使用します。スライドの密度設定に連動して、research では 16px、comfortable では 18px で表示されます。
259
+
260
+ #### 仕様
261
+
262
+ - **ブロック表示**: 属性を指定しない場合、`<div>` 要素としてブロックレベルで描画されます。スロット内に空行を設けることで Markdown の段落を記述できます。安全に複数段落を組む場合は HTML の `<p>` タグも使用できます。
263
+ - **インライン表示**: `inline` 属性を指定すると、`<span>` 要素としてインラインで描画されます。
264
+
265
+ #### 記述例
266
+
267
+ ```html
268
+ <!-- ブロック表示の例 -->
269
+ <SmallText>
270
+ <p>※ 測定値は環境温度 20℃、湿度 50% の条件下で記録した暫定値です。</p>
271
+ </SmallText>
272
+
273
+ <!-- インライン表示の例 -->
274
+ <p>本文の途中で <SmallText inline>(詳細は補足資料を参照)</SmallText> のように注釈を挿入することもできます。</p>
275
+ ```
276
+
277
+ ### SlideReferences と Cite
278
+
279
+ 各スライド内で引用した文献や参照元を明示し、スライド下部に統一された形式で表示するためのコンポーネントです。
280
+
281
+ #### 配置と挙動
282
+
283
+ - **表示位置**: 各スライドの下部、フッターの直上に1枚あたり1つの参考文献パネルとして配置されます。文字サイズ 11px、グレー(`#757575`)で表示され、長い URL は自動的に折り返されます。
284
+ - **余白の自動確保**: パネル自身の高さを測定し、スライドの通常フロー本文に対して追加の下部余白(padding)を確保します(スライドに絶対配置された TextBox などの要素は自動余白の管理対象外です)。
285
+ - **フッターとの分離**: スライド下部中央のフッターテキストはスライド共通の固定要素として維持され、参考文献パネルとは独立して表示されます。
286
+ - **一貫した書式**: 参考文献全体が規定のフォーマットで統一して表示されます。自由形式のスロットや独自のスタイル指定プロパティは提供していません。
287
+
288
+ #### Cite によるインライン引用とフォーカス移動
289
+
290
+ 本文中では `Cite` コンポーネントを使って引用番号(例: `[1]`)を上付きの小さめの文字サイズで配置できます。
291
+
292
+ - **番号の指定**: `number` プロパティに正の整数を明示的に指定します。スライド全体を通した自動採番は行われないため、作成者が意図した一貫性のある文献番号を複数のスライドにわたって再利用できます。
293
+ - **フォーカス機能**: `Cite` をクリックするか Enter キーを押すと、同じスライド内にある対応する参考文献項目へフォーカスが移動します。ページ遷移やスクロールは行われません。なお、現在のスライド内に対応する番号の文献エントリが存在しない場合はフォーカスされません。
294
+
295
+ #### データ型仕様(厳格な識別共用体型)
296
+
297
+ `SlideReferences` の `:items` には、以下の仕様に基づいたオブジェクトの配列を指定します。不正なフィールドが含まれている場合や、パネル内で `number` が重複している場合は、正常な描画を装わずにコンポーネント作成エラーを目に見える形で画面に表示します。
298
+
299
+ 各エントリの文字列は Vue によって安全にエスケープされるため、Markdown や HTML のメタデータとしては処理されません。出力時は左端に `[1]` のような番号が置かれ、続いて「著者名(カンマ区切り)、タイトル、出版社または掲載誌、年、アクセス日(存在する場合)、URL(存在する場合)」の順に整形されます。
300
+
301
+ | フィールド | 型 | 必須・任意 | 説明 |
302
+ | :--- | :--- | :--- | :--- |
303
+ | `number` | 正の整数 | 必須(全種別) | パネル内で一意となる文献番号。 |
304
+ | `type` | `'web'` \| `'book'` \| `'article'` | 必須(全種別) | 文献の種類。 |
305
+ | `title` | 空でない文字列 | 必須(全種別) | 文献のタイトル。 |
306
+ | `authors` | 空でない文字列の配列 | 種別による | 著者名一覧。`book` および `article` では必須。`web` では任意。 |
307
+ | `year` | 正の整数 | 種別による | 刊行年または発表年。`book` および `article` では必須。`web` では指定不可。 |
308
+ | `publisher` | 空でない文字列 | 種別による | 出版社。`book` で必須。`web` および `article` では指定不可。 |
309
+ | `venue` | 空でない文字列 | 種別による | 掲載誌または学会名。`article` で必須。`web` および `book` では指定不可。 |
310
+ | `url` | HTTP/HTTPS の絶対 URL | 種別による | 参照先 URL。`web` で必須。`book` および `article` では任意(指定時は絶対 URL が必須)。 |
311
+ | `accessed` | `YYYY-MM-DD` 形式の日付 | 種別による | 閲覧日(実在する日付)。`web` で必須。`book` および `article` では任意(指定時は実在する有効な日付が必須)。 |
312
+
313
+ #### 記述例
314
+
315
+ ```html
316
+ <p>本文中で<Cite :number="1" />のように引用します。</p>
317
+
318
+ <SlideReferences :items="[
319
+ {
320
+ number: 1,
321
+ type: 'web',
322
+ title: 'Slidev Documentation',
323
+ url: 'https://sli.dev/',
324
+ accessed: '2026-10-05'
325
+ }
326
+ ]" />
327
+ ```
328
+
329
+ 書籍や学術論文を参照する場合は、上記の表で規定された必須項目を指定してください。
330
+
331
+ - **書籍(`book`)の指定例**: `authors: ['Christopher M. Bishop']`、`title: 'Pattern Recognition and Machine Learning'`、`publisher: 'Springer'`、`year: 2006`
332
+ - **学術論文(`article`)の指定例**: `authors: ['Ashish Vaswani', '...']`、`title: 'Attention Is All You Need'`、`venue: 'NeurIPS'`、`year: 2017`、`url: 'https://arxiv.org/abs/1706.03762'`
333
+
334
+ ## その他のレイアウトとコンポーネント
335
+
336
+ ### 収録レイアウト
337
+
338
+ - `cover`: 表紙用レイアウト。タイトル、サブタイトル、著者、日付、波模様(wave)を表示します。
339
+ - `two-cols`: 2 列レイアウト。タイトルに加え、`::left::` と `::right::` スロットで左右の内容を分割配置します。
340
+ - `image`: 指定した画像をスライド全体に表示します(`image` プロパティ)。
341
+ - `image-scroll`: 画像を表示し、マウスホイールやタッチ操作による縦スクロールに対応します(`image`、`imageScroll.offsetY` プロパティ)。
342
+ - `end`: 結びのスライド。タイトルを変更可能で(既定値は「ご清聴ありがとうございました」)、任意の本文スロットに対応します。戻りリンクは含まれません。
343
+ - Slidev 標準の組み込みレイアウト(`default`、`center`)も引き続き利用できます。
344
+
345
+ ### 独自コンポーネント
346
+
347
+ - `QuestionList`: Markdown と数式(TeX)を混在させて再帰的にネストできるリストコンポーネントです。HTML はエスケープされますが、リンク(`http`、`https`、`mailto`、`tel`、および相対パス)は維持されます。
348
+ - `items`: 文字列、または `{ text, label, items, formula, block }` のオブジェクト配列
349
+ - `styles`: 各階層の記号スタイル配列(例: `['decimal-circle', 'katakana-paren', 'loweralpha-dot']`)
350
+ - `start`: 各階層の開始番号配列(例: `[1, 1, 'c']`)
351
+ - `styles` 文字列を構成するカウンターと装飾子(項目の `label` が指定されている場合は自動採番より優先):
352
+ - カウンター: `decimal` | `hiragana` | `katakana` | `kanji` | `upperalpha` | `loweralpha` | `none`
353
+ - 装飾子: `circle` | `square` | `paren` | `dot` | `q` | `big-q` | `none`
354
+
355
+ ```html
113
356
  <QuestionList
114
- :items="['最初 **OK**', { text: '2番目', items: ['子A','子B'] }]"
115
- :styles="['decimal-circle','katakana-paren','loweralpha-dot']"
116
- :start="[1,1,'c']"
357
+ :items="[
358
+ { text: '主要な課題', items: ['前提条件の整理', '評価基準の設定'] },
359
+ '検証方法の選定'
360
+ ]"
361
+ :styles="['decimal-circle', 'katakana-paren']"
362
+ :start="[1, 1]"
117
363
  />
118
364
  ```
119
- カウンター種別: `decimal | hiragana | katakana | kanji | upperalpha | loweralpha | none`
120
- デコレータ: `circle | square | paren | dot | q | big-q | none`
121
- アイテム内 `label` があればそれを優先表示。
122
365
 
123
- ![QuestionList 例](https://raw.githubusercontent.com/watabegg/slidev-theme-watabegg/refs/heads/main/example/3.png)
366
+ - `TextBox`: スライド上の絶対座標に注釈ボックスを配置します。
367
+ - 属性: `x`, `y`, `width`, `height`, `textBg`, `color`, `vClick`
124
368
 
125
- ### TextBox
126
- 背景画像上などに絶対配置。
127
- ```vue
128
- <TextBox :x="100" :y="220" :width="400" textBg="green" v-click="1">メモ</TextBox>
369
+ ```html
370
+ <TextBox :x="100" :y="220" :width="400" textBg="green">
371
+ 注釈
372
+ </TextBox>
129
373
  ```
130
- Props: `x`, `y`, `width`, `height`, `textBg`, `color`, `vClick`
131
374
 
132
- ### KaTexReveal
133
- KaTeX API で数式を確実に描画するコンポーネント。
134
- ```vue
135
- <KaTexReveal formula="\\int_0^{2\\pi} \\sin x\\,dx = 0" block class="text-2xl" />
136
- <KaTexReveal formula="E = mc^2" :block="false" v-click="1" />
375
+ - `KaTexReveal`: KaTeX による数式を描画します。必要に応じて `v-click` を指定することで段階的な表示が可能です。
376
+ - 属性: `formula`(必須)、`block`(デフォルトは `false`)、`tag`(任意)。`class` や `v-click` の転送に対応します。
377
+
378
+ ```html
379
+ <KaTexReveal formula="E = mc^2" :block="false" />
137
380
  ```
138
- Props: `formula`(必須), `block`(既定 false), `tag`(省略時 `div`/`span` 自動), そのほか `class` や `v-click` など任意の属性も転送。`QuestionList` のアイテムに TeX が含まれる場合もこのコンポーネントで描画。
139
381
 
140
- ![KaTeX 例](https://raw.githubusercontent.com/watabegg/slidev-theme-watabegg/refs/heads/main/example/4.png)
382
+ ### ユーティリティと操作方法
141
383
 
142
- ## フッター & ショートカット
143
- - フッター: (cover/image 以外) `date` + 現在ページ/総ページ
144
- - Enter: 次のフラグメント/スライド
145
- - Backspace: 前へ
384
+ - スタイルクラス: テキストを強調する `.text-highlight`、枠線付きコンテナを作成する `.card` を利用できます。また、Markdown の表には情報密度に応じた下部余白(標準で 20px、comfortable で 32px)が自動的に適用されます。
385
+ - キーボード操作:
386
+ - `Enter`: 次のスライドまたは次のステップ(fragment)へ進む
387
+ - `Backspace`: 前のスライドまたは前のステップへ戻る
146
388
 
147
- ## ユーティリティクラス
148
- - `.text-highlight` 行マーカ風ハイライト
149
- - `.card` 角丸ボックス + 余白 + 枠線
389
+ ## 埋め込みナビゲーション(Embed Navigation)
150
390
 
151
- ![ユーティリティ例](https://raw.githubusercontent.com/watabegg/slidev-theme-watabegg/refs/heads/main/example/7.png)
391
+ ポータルサイトや iframe 内にスライドを埋め込む際、スライド面上ではなく Slidev の操作パネル側に戻りリンクを設置できます。
392
+ 従来のフッターや終了スライドにあった自動リンクは廃止され、`themeConfig.watabegg.navigation` で明示的に指定する方式に変更されました。
152
393
 
153
- ## 開発
154
- ```bash
155
- pnpm install
156
- pnpm dev
157
- pnpm build
158
- pnpm export
159
- pnpm screenshot
394
+ ```yaml
395
+ ---
396
+ themeConfig:
397
+ watabegg:
398
+ navigation:
399
+ href: 'https://example.com/research'
400
+ label: '発表一覧に戻る'
401
+ ---
160
402
  ```
161
403
 
162
- ## FAQ
163
- **Q. フォント設定は必要?** → いいえ、テーマ内で Google Fonts を読み込みます。
404
+ - リンクはスライド面上ではなく、ポインターを画面左下に近づけたときに表示される Slidev のビューワー操作パネル内に現れます。
405
+ - iframe 埋め込み時にも親ウィンドウ全体を遷移できるよう、アンカータグには `target="_top"` が設定されます。
406
+ - スライドのエクスポート時には出力に含まれません。
407
+ - 過去のリンク用フィールドからの自動引き継ぎは行われず、空のリンクや安全でない `href` は自動的に除外されます。
408
+
409
+ ## 開発と保守(Development)
410
+
411
+ ### 開発用コマンド
412
+
413
+ パッケージマネージャーには pnpm 11.1.3 を使用します。pnpm 11 組み込みの `lint` コマンドとの衝突を避けるため、リント実行時は明示的に `pnpm run lint` を実行してください。
414
+
415
+ - `pnpm dev`: 開発サーバーを起動
416
+ - `pnpm dev:polling`: Linux 環境でファイル監視数の上限(ENOSPC)が発生した場合にポーリング方式で起動
417
+ - `pnpm build`: 本番向けビルド
418
+ - `pnpm export`: スライドのエクスポート
419
+ - `pnpm screenshot`: スクリーンショットの生成
420
+ - `pnpm check`: 型チェック、リント、フォーマット検証、ビルド、パッケージ内容の検証(pack)を一括で実行
421
+ - `pnpm run lint`: リントチェックの実行
422
+ - `pnpm typecheck`: TypeScript の型チェック
423
+ - `pnpm format:check`: コードフォーマットの検証
424
+
425
+ CI 環境では、型チェック、リント、フォーマット、ビルド、パッケージ内容の検証(pack)、および依存関係の監査(audit)を実施します。また、バージョンタグ(`v*`)の付与時に npm へ公開するリリースワークフローが用意されています。
426
+
427
+ ### 依存関係の調整理由
164
428
 
165
- **Q. フッターを消したい** → 自作テーマで `global-bottom.vue` を上書きしてください。
429
+ テーマの安定動作のため、主要な依存パッケージを更新しつつ、互換性の問題があるツールについては意図的にバージョンを固定しています。
166
430
 
167
- **Q. 番号開始位置を変えたい** → `:start="[1,'c']"` のように配列で指定。
431
+ - Slidev 53、Vue 3.5.43、Biome 2.5.15、KaTeX 0.19.0、marked 18.0.14、Playwright 1.63.0、vue-tsc 3.3.12、bumpp 12.3.0 を採用しています。
432
+ - TypeScript は 6.0.3 を維持しています。`vue-tsc` 3.3.12 が TypeScript 7 の内部構造を読み込めないためです。
433
+ - `markdown-it` は workspace overrides を用いて `^14.3.2` に固定しています(`package.json` の開発用依存関係でも peer 依存として提供)。これは、依存している `Comark` 0.3.4 が `markdown-it` バージョン 15 で削除された非公開ファイル(`lib/token.mjs`)を読み込んでいることへの回避策です。
434
+ - `floating-vue` は `5.2.2` に固定しています。Shiki 4.5.0 の Twoslash が `VMenu` 登録時にインポートする `rest[1].components.Popper.extends` が FloatingVue 5.4.0 では利用できず、5.2.2 のコンポーネント構成と互換性があるためです。
435
+ - `dompurify` はセキュリティ勧告を解消するため `^3.4.16` に更新しています。
436
+ - 1.2.0では設定やショートカットを変えず、型インポートと`satisfies`による直接エクスポートで`@slidev/types`を`devDependencies`へ移しました。例外なしで本番監査を有効に保ち、本番依存から未修正の[braces勧告](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm)が除外されます。なお開発環境にはSlidev経由で`braces`が残ります。