building-html-canvases について
レポート、図表、グラフィックプログラムなどのHTMLキャンバスを作る開発者向けガイドです。薄いReactシェル内でセマンティックHTML、CSS、ブラウザーAPIを使う方法を説明します。
主な機能
- 01セマンティックなHTML構造
- 02ブラウザーAPIによる描画
- 03テーマとキャンバスサイズの指針
- 04アニメーションとイベントの後処理
活用シーン
- 01スクロール可能なレポートページの作成
- 02インタラクティブな図表や画像の構築
- 03生のWebGLまたは2Dキャンバスの利用
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ posthog/ ai-plugin --skill building-html-canvasesインストール後、Claude Code で/building-html-canvasesを入力して読み込まれたか確認します。
詳細
HTML キャンバスの構築
キャンバスには、アプリケーションではなく、文書やグラフィックプログラムにあたるものもあります。たとえば、レポート、図、ジェネレーティブアート、WebGL シーンなどです。このような場合は、セマンティック HTML、CSS、ブラウザー API を直接使うのが適切です。静的なページに Quill コンポーネントや React の状態を無理に持ち込まないでください。
現在のランタイムで必要なラッパー
すべてのキャンバスでは、マウントされる React エントリーコンポーネントとして src/canvas.tsx を維持してください(デフォルトエクスポート、props なし)。React レイヤーは薄いシェルに保ち、その内側で HTML/CSS/ブラウザー API を使ってエクスペリエンスを構築します。
- ドキュメントは、実質的にセマンティック HTML となる JSX(
<article>、見出し、リスト、表、図など)と、タイポグラフィやレイアウト用の<style>ブロックで構成します。具体的で実用的な文章を書いてください。 - 描画/WebGL プログラムでは、
<canvas>要素をレンダリングし、ref 経由でuseEffectから命令的に操作します。そこで 2D/WebGL コンテキストを取得し、セットアップとレンダリングループを実行してください。 - effect の戻り値でクリーンアップします。
requestAnimationFrameのループをキャンセルし、リスナーを削除し、コンテキストを解放して、テーマの切り替えや再マウントによるリークや二重実行を防いでください。 - ティアを組み合わせても問題ありません。ほぼ静的なページにインタラクティブな領域を 1 つ配置したり、データボードでチャートの
<canvas>を命令的なコードに渡しつつ、React で周囲の UI を管理したりできます。
インポートの許可リストは引き続き適用されます(react、react-dom、@posthog/quill、recharts、lucide-react、dayjs)。ブラウザーのグローバル(document、CanvasRenderingContext2D、WebGLRenderingContext、requestAnimationFrame、IntersectionObserver、Web Audio など)にはインポートは不要です。Three.js やその他の npm グラフィックスライブラリはまだ読み込めません。ビルドパイプラインで依存関係の許可機能が提供されるまでは、raw WebGL または 2D canvas を使ってください。
Quill を使わないスタイル設定とテーマ設定
- 最も外側の JSX/HTML 要素には
min-h-screenまたはmin-height: 100vhを設定し、iframe のビューポートに合わせてください。これにより、ビューポート全体を埋め、コンテンツに応じてその先まで伸びます。 ここではh-screenやheight: 100vhを使わないでください。ビューポートの高さを固定すると、flex 列の高さに上限が設けられるため、背の高い子要素が縮んでスクロールせずに切れてしまいます。 そのルート要素にh-fullやheight: 100%も使わないでください。公開されたキャンバスのアーティファクトシェルでは、html、body、#root要素に明示的な高さが設定されていないため、パーセント指定の高さはコンテンツの高さに縮みます。min-heightのルート要素は確定した高さではないため、子孫要素のパーセント指定の高さも縮みます。子要素をボックスいっぱいに広げる必要がある場合は、中間のラッパーに明示的な高さを設定してください。 - Tailwind のユーティリティと
<style>ブロックを使います(キーフレームや複雑なセレクターも使用できます)。 - ユーザーの PostHog テーマが変更されると、ホストはドキュメントのルートに
.darkクラスを切り替えます。:root { … }で CSS 変数として色を定義し、html.dark { … }で上書きするか、テーマトークンのユーティリティ(bg-background、text-foreground、border-border)を使ってください。ライトテーマ専用のハードコード色は使わないでください。 - 独自の CSS 変数にはプレフィックスを付けてください(
--doc-bg、--doc-muted)。プラットフォームのトークン名は決して再利用しないでください。バンドルされた Quill スタイルシートは、すべての要素に--background、--border、--card、--chrome、--input、--muted、--primary、--fill-*を設定するため、これらの名前を使った:rootやhtml.darkの値はどの要素にも適用されません。独自の--mutedでテキストに色を付けたページでは、淡いページに淡い文字が表示され、読みにくくなります。このような宣言は検証時にplatform_token_redeclaredとして拒否されます。 - キャンバス/WebGL の描画色は、実行時に解決済みのトークン(
getComputedStyle(document.documentElement).getPropertyValue("--primary"))または独自の CSS 変数から取得してください。シーンが長時間動作する場合は、テーマ変更時に値を再取得してください。
引き続き適用されるルール
- PostHog のデータは
phブリッジ経由でのみ取得します(querying-canvas-dataを参照)。操作分析用のph.captureもこれに含まれます。その他のリクエストや外部のスタイル、画像、フォント、メディア、フレームを使用するには、それぞれの公開 HTTPS オリジンをcapabilities.network.originsに指定する必要があり、公開後にのみ動作します。リモートスクリプトと動的インポートは引き続きブロックされます。 - PostHog の数値を記載するドキュメントでは、数値をそれぞれ検証可能にする必要があります。インサイトに基づく数値には、保存済みインサイトへのリンクを付けます。このリンクは、クリック操作から
ph.openExternalを使って開きます(URL はgenerate-app-urlMCP ツールから取得します)。アドホックなph.queryの数値には、実行したクエリの正確な内容を、主張の横にある<details>要素内に記載します。詳しくはquerying-canvas-dataの「検証可能性」を参照してください。 - 外部リンクは、ユーザーの操作から
ph.openExternal(url)経由で開きます(posthog.com のオリジンのみ)。 validating-and-publishing-canvasesに記載されているとおり、キャンバスツールを使って検証し、公開してください。