Skip to content

feat(viewer): スライドにコピーボタン・目次/ページジャンプ・URLハッシュ同期を追加 #45

@watanabe-kohei-jp

Description

@watanabe-kohei-jp

背景

スライドは 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. コピーボタン

  • プロンプト/コードブロック.ai-buddy 内のプロンプトや pre/code ブロックに個別コピーボタンを付与。受講者が AI に渡す前提と整合
  • スライド URL(現在位置) — 現在スライドへ直リンクする URL(#NN)をコピー。下記「C. URL ハッシュ同期」と連動
  • スライド全文テキスト — 現在スライドの本文テキストをまとめてコピー(AI に丸ごと渡す用途)

B. 目次・ページジャンプ

  • progress-strip クリック可能化 — 既存の下部ラベル帯をクリックで該当スライドへジャンプ(最小実装で導線増)
  • 目次オーバーレイ — キー(例 t / 開閉は Esc)で全スライドのラベル一覧を表示、クリックでジャンプ。9 枚超でも全ページ到達可能
  • 数字キーの制約解消 — 1〜9 までしか飛べない現状を、オーバーレイで補完

C. URL ハッシュ同期

  • 現在スライドを #NN 等で URL に反映(slidechange イベントで更新)
  • ロード時にハッシュがあればその位置から開始(localStorage より優先)
  • 直リンク・ページジャンプ・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 モードで詰める。

受け入れ条件

  • 任意のデッキで、プロンプト/コードブロックにコピーボタンが出て、クリックでクリップボードに入る
  • 現在スライドの URL コピー → 別タブで開くと同じスライドが表示される
  • スライド全文コピーで本文テキストが取得できる
  • progress-strip のラベルクリックで該当スライドへ移動する
  • 目次オーバーレイで 9 枚超のデッキでも全スライドへ到達できる
  • URL ハッシュがロード時に反映され、ナビで URL が更新される
  • 既存のキーボードナビ・印刷・スピーカーノート・progress-strip 表示が壊れない
  • prompt-injection-check.yml が green(隠し要素を導入していない)

関連

  • shared/deck-stage.js — ナビ API・slidechange_go()
  • shared/progress-strip.js — 下部ラベル帯(クリック化の対象)
  • CLAUDE.md「読者と教材を読み進めるときの指針」「プロンプトインジェクション対策」

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationenhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions