背景
スライドは shared/deck-stage.js を中核とした HTML デッキ。受講者は 自分の AI(Claude Code 等)と一緒に読み進める 前提だが、現状の閲覧 UX には以下のギャップがある:
- コピー導線がゼロ — プロンプトやコードを AI に渡したくても、手で範囲選択するしかない(
shared/*.js に clipboard 実装は皆無)。スライド本文も「AI に丸ごと渡す」手段がない
- ページジャンプが弱い — ナビはキーボードのみ(←/→・数字 1〜9・Home/End・R)。9 枚を超えると番号キーで直接飛べない
- 下部
progress-strip がクリック不可 — 全ラベルを表示しているのに、押してもジャンプしない(progress-strip.js に click ハンドラなし)
- URL が現在位置を持たない — リロードは localStorage で復帰するが、URL を共有しても先頭から。特定スライドへの直リンクができない
「概要はスライド、詳細は読者の AI へ」という設計思想(CLAUDE.md)を機能させるには、コピーと直リンク/ジャンプの導線 が要になる。
目的
閲覧 UX を底上げし、(1) スライドの内容を AI/他者に渡しやすく、(2) 任意スライドへ一発で移動・共有できるようにする。実装は shared/ のスライドエンジンに汎用機能として載せ、全デッキへ自動適用する。
スコープ
A. コピーボタン
B. 目次・ページジャンプ
C. URL ハッシュ同期
out of scope
- スライド内容(教材本文)の変更
- PPTX/PDF エクスポート経路への UI 反映(印刷は既存
@media print を維持)
- 検索機能・サムネイル付き目次(別 Issue 候補)
設計方針(叩き台)
- 実装は
shared/deck-stage.js(ナビ API・slidechange イベント・_go() を保有)を軸に。コピー UI と目次は 別ファイル(例: shared/copy-button.js / shared/toc-overlay.js)として defer 注入し、progress-strip.js と同じ「全スライド自動適用」パターンに合わせる
- ジャンプは既存の
deck-stage の _go(index) / slidechange を利用(独自に index 管理を二重化しない)
- 目次のラベルは各
<section> の data-label を真実源にする(progress-strip と同じ抽出ロジックを共有)
- URL ハッシュ ↔ localStorage の優先順位を明文化(ハッシュ > localStorage > 0)
- プロンプトインジェクション対策と整合:追加する UI は可視要素のみ。
data-ai-* 属性・隠し要素・JSON-LD を新設しない(prompt-injection-check.yml に抵触しないこと)
- アクセシビリティ:コピーボタン・目次はキーボード操作可能、
aria-label 付与、コピー成功フィードバックを出す
詳細設計は Plan モードで詰める。
受け入れ条件
関連
shared/deck-stage.js — ナビ API・slidechange・_go()
shared/progress-strip.js — 下部ラベル帯(クリック化の対象)
- CLAUDE.md「読者と教材を読み進めるときの指針」「プロンプトインジェクション対策」
背景
スライドは
shared/deck-stage.jsを中核とした HTML デッキ。受講者は 自分の AI(Claude Code 等)と一緒に読み進める 前提だが、現状の閲覧 UX には以下のギャップがある:shared/*.jsに clipboard 実装は皆無)。スライド本文も「AI に丸ごと渡す」手段がないprogress-stripがクリック不可 — 全ラベルを表示しているのに、押してもジャンプしない(progress-strip.jsに click ハンドラなし)「概要はスライド、詳細は読者の AI へ」という設計思想(CLAUDE.md)を機能させるには、コピーと直リンク/ジャンプの導線 が要になる。
目的
閲覧 UX を底上げし、(1) スライドの内容を AI/他者に渡しやすく、(2) 任意スライドへ一発で移動・共有できるようにする。実装は
shared/のスライドエンジンに汎用機能として載せ、全デッキへ自動適用する。スコープ
A. コピーボタン
.ai-buddy内のプロンプトやpre/codeブロックに個別コピーボタンを付与。受講者が AI に渡す前提と整合#NN)をコピー。下記「C. URL ハッシュ同期」と連動B. 目次・ページジャンプ
t/ 開閉はEsc)で全スライドのラベル一覧を表示、クリックでジャンプ。9 枚超でも全ページ到達可能 にC. URL ハッシュ同期
#NN等で URL に反映(slidechangeイベントで更新)out of scope
@media printを維持)設計方針(叩き台)
shared/deck-stage.js(ナビ API・slidechangeイベント・_go()を保有)を軸に。コピー UI と目次は 別ファイル(例:shared/copy-button.js/shared/toc-overlay.js)としてdefer注入し、progress-strip.jsと同じ「全スライド自動適用」パターンに合わせるdeck-stageの_go(index)/slidechangeを利用(独自に index 管理を二重化しない)<section>のdata-labelを真実源にする(progress-strip と同じ抽出ロジックを共有)data-ai-*属性・隠し要素・JSON-LD を新設しない(prompt-injection-check.ymlに抵触しないこと)aria-label付与、コピー成功フィードバックを出す詳細設計は Plan モードで詰める。
受け入れ条件
prompt-injection-check.ymlが green(隠し要素を導入していない)関連
shared/deck-stage.js— ナビ API・slidechange・_go()shared/progress-strip.js— 下部ラベル帯(クリック化の対象)