pro-deck-builder について
pro-deck-builder は、PowerPoint の作成と編集を支援する Claude スキルです。デザイン選択に加え、タイポグラフィ、配色、レイアウト、グラフ、テキスト調整の指針を提供します。
主な機能
- 01PptxGenJS による PowerPoint 作成
- 02既存プレゼンテーションの編集ガイド
- 03ライト/ダークのデザイン体系
- 04フォントとパレットの選択
- 05グラフ書式とテキスト調整ルール
活用シーン
- 01SaaS風プレゼンテーションの新規作成
- 02既存のプレゼンテーションやテンプレートの編集
- 03レポートやデータ中心のスライド作成
- 04内容抽出結果やスライドサムネイルの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ thatrebeccarae/ claude-marketing --skill pro-deck-builderインストール後、Claude Code で/pro-deck-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
EXAMPLES.mdLICENSEREFERENCE.md詳細
プレゼンテーションデザイナー
PowerPoint に VC 支援 SaaS のようなデザイン品質を。Linear、Attio、Vercel、Raycast のようなスタイルを目指し、企業向けのクリップアートは使いません。
インストール
git clone https://github.com/thatrebeccarae/claude-marketing.git && cp -r claude-marketing/skills/pro-deck-builder ~/.claude/skills/
クイックリファレンス
| タスク | 方法 |
|---|---|
| ゼロから作成 | REFERENCE.md を読み、PptxGenJS を使用します |
| 既存のものを編集/テンプレートを使用 | editing.md を読みます |
| コンテンツの読み取り/抽出 | python -m markitdown presentation.pptx |
| ビジュアルの概要 | python scripts/thumbnail.py presentation.pptx |
開始前の必須手順
ステップ 1:ユーザーに確認する
コードを書く前に、次の点を確認します。
- ライトモードとダークモードのどちらにしますか? ダークはプレミアム感のある基調講演向け、ライトはレポートやデータ中心のスライド向けです。
- カラーパレットの希望はありますか? 以下のパレット表を見せるか、ブランドカラーがあるか尋ねます。
- ロゴはありますか? 使用するロゴファイル(PNG/SVG のパス)があるか尋ねます。
ステップ 2:フォントを確認する
インストール済みのフォントを確認します。プレミアムフォントを使うと、仕上がりが大きく変わります。
# macOS — list all installed font families
fc-list : family | sort -u
# Search for premium fonts first
fc-list : family | grep -iE "inter|dm.sans|poppins|avenir|futura|geist|sf.pro|sf.mono|jetbrains|fira.code|montserrat|playfair|source.sans"
# Check macOS Font Book directories directly
ls ~/Library/Fonts/ /Library/Fonts/ /System/Library/Fonts/Supplemental/ 2>/dev/null
フォント選択の優先順位:
- Inter — SaaS UI の標準フォントです(インストールされていれば、すべてに使用します)
- DM Sans — ジオメトリックで、スタートアップ向けです
- Poppins — 丸みがあり、親しみやすいフォントです
- Avenir / Avenir Next — macOS に付属する、Apple に近い洗練されたフォントです
- Calibri — 安全な代替フォントで、常に利用できます
データ/等幅フォント: JetBrains Mono > Fira Code > SF Mono > Consolas
デザイン言語:VC 支援 SaaS
美的原則
- レイヤーによる奥行き — 背景の上に浮かぶようなサーフェスにします。カードやパネルには、単色の平坦なボックスではなく、影や細い境界線でさりげない立体感を与えます。
- 大胆なタイポグラフィ、装飾は最小限に — タイポグラフィの階層で表現します。アクセントライン、装飾的な図形、クリップアートは使用しません。
- 色は控えめに — アクセントカラーは 1 色だけを控えめに(10%)使用します。それ以外はほぼニュートラルカラーにします。色は装飾ではなく、情報を伝えるために使います。
- ゆとりのある余白 — 余白は自信を表します。スライドがスカスカに感じられる場合は、要素を追加するのではなく、コンテンツを大きくします。
- すべての要素に役割を持たせる — 何かを追加する前に、それが何を伝えるのかを考えます。取り除いても何も変わらないなら、削除します。
ライトモードとダークモード
ユーザーはデッキ全体で使用するモードを 1 つ選びます。デッキ内でモードを混在させてはいけません。
カラーシステム
ダークモード(デフォルト — プレミアム/基調講演向け)
| トークン | 値 | 用途 |
|---|---|---|
bg-primary | 0A0A0C | スライドの背景(深い宇宙のような黒) |
bg-surface | 17181A | カード、パネル(濃いスレート) |
bg-elevated | 1E1F23 | 浮き上がったサーフェス、ホバー状態 |
bg-glass | FFFFFF at 4% opacity | 半透明のオーバーレイ |
text-primary | FFFFFF | 見出し、主要コンテンツ |
text-secondary | A0A0A0 | 本文、説明 |
text-muted | 5A5A5E | キャプション、メタデータ、ラベル |
border-subtle | FFFFFF at 8% opacity | カードの境界線 |
ライトモード(レポート/データ中心)
| トークン | 値 | 用途 |
|---|---|---|
bg-primary | FFFFFF | スライドの背景 |
bg-surface | F8F9FA | カード、パネル |
bg-elevated | FFFFFF | 浮き上がったサーフェス(影を使用) |
text-primary | 111111 | 見出し、主要コンテンツ |
text-secondary | 555555 | 本文、説明 |
text-muted | 999999 | キャプション、メタデータ、ラベル |
border-subtle | E8E8E8 | カードの境界線 |
パレットシステム
各パレットでは、アクセントカラー(10% 使用)を 1 色と、意味を持つステータスカラーを定義します。アクセントカラーが個性を表し、それ以外はすべてニュートラルカラーです。
組み込みパレット
| 名前 | アクセント | Hex | 最適な用途 |
|---|---|---|---|
| エレクトリックブルー | 鮮やかなアズール | 0055FF | SaaS、テクノロジー、製品 |
| ネオンライム | 酸味のあるグリーン | 39FF14 | 開発ツール、パフォーマンス |
| ホットコーラル | 温かみのあるエネルギー | FF6B6B | マーケティング、クリエイティブ |
| インディゴ | 深いパープル | 6366F1 | スタートアップ、AI/ML |
| ティールトラスト | 落ち着いた信頼感 | 0D9488 | ヘルスケア、金融 |
| アンバーシグナル | 温かみのある権威 | F59E0B | コンサルティング、戦略 |
| ローズ | 洗練されたピンク | F43F5E | デザイン、ブランド、高級感 |
| エメラルド | 成長を感じさせるグリーン | 10B981 | サステナビリティ、成功 |
| シアンエッジ | シャープなブルーグリーン | 06B6D4 | データ、分析 |
| バイオレット | 創造性を深める色 | 8B5CF6 | 教育、イノベーション |
| スレート | アクセントなし | 64748B | ミニマル、控えめ |
| ゴールドスタンダード | 金融向けの高級感 | D4AF37 | 投資家、取締役会向けの資料 |
カスタムパレット(ユーザーのブランドカラー)
ユーザーがブランドカラーを指定した場合は、カスタムパレットを作成します。
const palette = {
accent: "0055FF", // primary brand color
accentMuted: "0055FF" + " at 15% opacity", // for tinted backgrounds
positive: "10B981", // good, up, success
warning: "F59E0B", // attention, caution
critical: "EF4444", // bad, down, error
};
色の適用:85/10/5 ルール
- 85% — 背景+ニュートラルなテキスト(モードの bg+text トークン)
- 10% — アクセント(主要な数値、チャートの主要色、CTA、アクティブ状態)
- 5% — セマンティックなステータス(KPI とデータにおけるポジティブ/警告/重大)
タイポグラフィ
フォントの優先順位
フォントの検出を実行し(上記のステップ 2)、次の中から選びます。
| 優先順位 | 見出し | 本文 | データ/等幅 | 雰囲気 |
|---|---|---|---|---|
| 1位 | Inter 700 | Inter 400 | JetBrains Mono | Linear/Vercel |
| 2位 | DM Sans 700 | DM Sans 400 | Fira Code | 幾何学的なスタートアップ |
| 3位 | Avenir Next Bold | Avenir 400 | SF Mono | Apple に近い雰囲気 |
| 4位 | Poppins 700 | Poppins 400 | JetBrains Mono | 親しみやすくモダン |
| 安全 | Calibri Bold | Calibri | Consolas | 常に利用可能 |
エディトリアル/金融向けの資料の場合:
| 見出し | 本文 | 雰囲気 |
|---|---|---|
| DM Serif Display | DM Sans | 洗練されたエディトリアル |
| Playfair Display | Source Sans Pro | 高級感、金融 |
| Georgia | Calibri | クラシックな企業向け |
サイズスケール
| 役割 | サイズ | 太さ | 用途 |
|---|---|---|---|
| ヒーロータイトル | 54-72pt | 太字(700) | タイトルスライドのみ |
| スライドタイトル | 32-40pt | 太字(700) | すべてのコンテンツスライド |
| セクション見出し | 20-24pt | セミボールド(600) | スライド内のセクション |
| 本文 | 14-16pt | レギュラー(400) | 段落、箇条書き |
| キャプション/メタ情報 | 10-12pt | レギュラー(400) | 脚注、出典 |
| 大きな KPI 数値 | 48-72pt | 太字(700) | ダッシュボードのコールアウト |
| KPI ラベル | 9-10pt | セミボールド、すべて大文字、+字間 | KPI 数値の下 |
| データ/数値 | 11-14pt | 等幅レギュラー | 表、データラベル |
タイポグラフィのルール
- 本文とリストは左揃えにし、タイトルと KPI 値のみ中央揃えにします。
- 1 つの資料で使用するフォントファミリーは最大 2 種類にします(データ用の等幅フォントは 1 種類追加できます)。
- すべて大文字+charSpacingは、小さなラベル(KPI ラベル、カテゴリタグ)のみに使用します。
- 行の高さ:本文は 1.3x、タイトルは 1.1x にします。
- 強調に下線は使わず、太字またはアクセントカラーを使用します。
テキストの調整(はみ出し防止)
文字数を確認せずに固定のフォントサイズを使うと、大きな数値やタイトルは必ずはみ出します。次のルールに従ってください。
大きな KPI 数値 — 文字数に応じてフォントサイズを調整します:
| 文字数 | 例 | 最大フォントサイズ(カード) | 最大フォントサイズ(単独) |
|---|---|---|---|
| 1–4 | $4.2M | 48pt | 72pt |
| 5–7 | $5,307K | 36pt | 54pt |
| 8–10 | $5,307,540 | 28pt | 44pt |
| 11+ | $12,345,678 | 22pt | 36pt |
ルール:数値は省略形を優先してください。 $5.3M > $5,307,540。精度が重要な表や脚注でのみ、完全な数値を使用してください。
スライドのタイトル — 折り返しが発生する最大文字数:
| フォントサイズ | 最大文字数(幅約9") | 超過する場合 |
|---|---|---|
| 54pt | ~30 | 44ptに縮小するか、短く書き換えます |
| 44pt | ~38 | 36ptに縮小するか、短く書き換えます |
| 36pt | ~46 | 32ptに縮小するか、短く書き換えます |
| 32pt | ~52 | はみ出す部分にはサブタイトルを使います |
ルール:fontSize を設定する前に文字数を数えてください。 スライドのコンテンツタイトルは、決して2行に折り返さないでください。セクション区切りは折り返してもかまいません。
幅の狭いコンテナー内の本文(インサイトパネル、サイドバー):
狭いパネル(幅 < 4")では、テキストのはみ出しがよく発生します。PptxGenJS はテキストを自動で縮小しません。次のルールに従ってください。
| コンテナーの幅 | 最大フォントサイズ | 1行あたりの最大文字数(約) | 行間1.25倍での最大行数 |
|---|---|---|---|
| 4.0"+ | 14pt | ~55 | 高さ ÷ 0.22" |
| 3.0-3.9" | 11pt | ~45 | 高さ ÷ 0.18" |
| 2.0-2.9" | 10pt | ~35 | 高さ ÷ 0.16" |
| < 2.0" | 9pt | ~25 | 高さ ÷ 0.15" |
ルール:テキストを追加する前に行数を見積もってください。 テキストの文字数を数え、1行あたりの最大文字数で割って行数を求め、コンテナーの高さに収まることを確認します。収まらない場合は、(1) fontSize を小さくする、(2) テキストを短くする、または (3) コンテナーを大きくします。テキストを気付かないうちにはみ出させないでください。はみ出したテキストは切り取られたり、隣接する要素と重なったりします。
// ✅ CORRECT: 2.8" panel → max 10pt, ~35 chars/line
// "Welcome series dominates at 62%..." = 90 chars ≈ 3 lines
// Container h: 1.6" → fits ~10 lines at 10pt. Safe.
s.addText("Short, edited copy.", {
x: 6.55, y: 1.45, w: 2.7, h: 1.6,
fontSize: 10, fontFace: theme.font.body,
});
// ❌ WRONG: 2.8" panel with 14pt font and 200+ char paragraph
s.addText("Very long paragraph that will overflow...", {
x: 6.55, y: 1.45, w: 2.8, h: 1.6,
fontSize: 14, fontFace: theme.font.body, // too large for narrow panel
});
グラフの数値書式
グラフの数値は、必ず読みやすい形式にしてください。軸やデータラベルに「1000000」のような未加工の数値を表示することはできません。
重要:valAxisLabelFormatCode で書式設定されるのは軸のみです。showValue: true によるデータラベルは、dataLabelFormatCode で個別に書式設定します。 valAxisLabelFormatCode を設定しても dataLabelFormatCode を設定しない場合、データラベルには「2888000」のような書式設定されていない数値が表示されます。numFmt は有効な PptxGenJS プロパティではありません。必ず dataLabelFormatCode を使用してください。
推奨される方法 — 未加工の値を使った OOXML 条件付き書式: 未加工(スケーリングされていない)の値を使用し、OOXML の条件付き数値書式で表示形式を処理します。これが最も信頼性の高い方法で、桁の異なるデータが混在する場合(例:$2.9M と $3.6K の両方を含むグラフ)にも対応できます。
// ✅ BEST: Raw values + OOXML conditional format
// Under 1K: whole number ($500)
// 1K-999K: X.XXK ($540.18K, $57.72K)
// 1M+: X.XM ($2.9M)
const currFmt = '[>=1000000]"$"#,##0.0,,"M";[>=1000]"$"#,##0.00,"K";"$"#,##0';
values: [2888000, 717734, 425467, 3655], // raw dollar values
dataLabelFormatCode: currFmt, // conditional brackets OK here
valAxisLabelFormatCode: '"$"#,##0.0,,"M"', // simple format only (no brackets)
// ✅ ALSO OK: Pre-scale when all values are same magnitude
values: [2888, 718, 425], // raw values divided by 1000
dataLabelFormatCode: '"$"#,##0"K"',
valAxisLabelFormatCode: '"$"#,##0"K"',
// ❌ WRONG: Raw values with axis-only format
values: [2888000, 718000, 425000],
valAxisLabelFormatCode: "$#,##0,K", // axis may format but data labels show 2888000
// ❌ WRONG: numFmt (not a valid PptxGenJS property)
OOXML 条件付き書式のリファレンス(未加工の値と併用):
| データ範囲 | 書式コード | 表示例 |
|---|---|---|
| 通貨(自動スケーリング) | '[>=1000000]"$"#,##0.0,,"M";[>=1000]"$"#,##0.00,"K";"$"#,##0' | $2.9M、$540.18K、$500 |
| 数値(自動スケーリング) | '[>=1000000]#,##0.0,,"M";[>=1000]#,##0.00,"K";#,##0' | 2.9M、540.18K、500 |
| パーセンテージ | '0%' | 50%、85% |
書式コードの構文: OOXML では、角括弧内の条件を最大 2 つと、デフォルトの書式を指定できます。[condition1]format1;[condition2]format2;defaultFormat の形式です。末尾の , は 1,000 で割ることを示します(つまり、,, は 1M で割ります)。
重要:valAxisLabelFormatCode は OOXML の条件付き書式 [>=1000] に対応していません。 データ範囲に合わせて、軸にはシンプルな書式を使用してください。
| 軸の範囲 | valAxisLabelFormatCode | 表示例 |
|---|---|---|
| 約 999K 以下 | '"$"#,##0,"K"' | $0K、$100K、$500K |
| 約 10M 以上まで | '"$"#,##0.0,,"M"' | $0.0M、$0.5M、$1.0M |
| 約 999 以下 | '"$"#,##0' | $0、$100、$500 |
dataLabelFormatCode(角括弧に対応)には条件付きの currFmt を使用し、valAxisLabelFormatCode にはシンプルな書式を使用してください。棒グラフでは、読者が軸をたどらなくても正確な値を確認できるよう、常に dataLabelPosition: "outEnd" とともに showValue: true を設定してください。
間隔
| トークン | 値 | 用途 |
|---|---|---|
xs | 0.125" | グループ化された要素内 |
sm | 0.25" | ラベルと値の間、アイコンとテキストの間 |
md | 0.375" | カード内のセクション間 |
lg | 0.5" | カード間、主要なセクション間 |
xl | 0.75" | コンテンツ領域間 |
レイアウトグリッド(10" × 5.625")
Margins: 0.5" from all edges
Content area: 9.0" wide × ~4.5" tall
Title zone: y = 0.3"
Content zone: y = 1.0" to y = 5.0"
Footer zone: y = 5.2"
Card gap: 0.25" - 0.3"
ロゴの配置
ロゴを探す
find ~/Desktop ~/Downloads ~/Documents -maxdepth 3 -iname "*logo*" \( -name "*.png" -o -name "*.svg" -o -name "*.jpg" \) 2>/dev/null
配置パターン
| スライドの種類 | 位置 | サイズ | 備考 |
|---|---|---|---|
| タイトルスライド(左上) | x:0.5, y:0.4 | w:1.5, h:0.5 | 控えめなブランドマーク |
| タイトルスライド(中央) | x:4.0, y:0.8 | w:2.0, h:0.7 | タイトルテキストの上 |
| コンテンツスライド | x:8.5, y:0.2 | w:1.0, h:0.35 | 右上隅、すべてのスライド |
| クロージングスライド | x:3.5, y:1.5 | w:3.0, h:1.0 | 中央、ヒーローサイズ |
ロゴのルール
- アスペクト比を維持するため、必ず
sizing: { type: "contain", w, h }を使用してください - コンテンツスライド:幅は最大 1" とし、コンテンツより目立たないようにしてください
- タイトル/クロージング:ブランドを印象付けるため、幅は最大 3" にできます
- ダークモード:利用できる場合は、白または明るい色のロゴを使用してください(ユーザーに確認)
- スライドマスター:すべてのスライドにロゴを表示する場合は、マスター定義に追加してください
アイコン
パイプライン:react-icons → sharp → PNG → PptxGenJS
npm install -g react-icons react react-dom sharp
Lucide(react-icons/lu)または Feather(react-icons/fi)を推奨します。Linear/Vercel のアイコンのスタイルに合っています。
| パッケージ | インポート | スタイル |
|---|---|---|
react-icons/lu | Lucide | Linear スタイル、シンプル |
react-icons/fi | Feather | 細線、モダン |
react-icons/hi2 | Heroicons v2 | Apple 風 |
react-icons/tb | Tabler | 一貫した線幅 |
アイコンのサイズ
| コンテキスト | 表示サイズ | 色 |
|---|---|---|
| KPI カードのアイコン | 0.35" × 0.35" | 暗い背景ではアクセントカラー、明るい背景では控えめな色 |
| 機能行のアイコン | 0.4" × 0.4" | アクセントカラーの円の内側に白色 |
| セクション区切り | 0.5" × 0.5" | アクセントカラー |
| インラインの箇条書き | 0.25" × 0.25" | text-secondary |
再利用可能なコンポーネント
下部のコールアウトボックス(標準化)
多くのスライドでは、強調表示されたコールアウトボックス(推奨事項、重要な洞察、総合的な効果)で締めくくります。これらはすべてのスライドで視覚的に同一にする必要があります。
| プロパティ | 値 | 備考 |
|---|---|---|
| ボックスの高さ | 0.6" | 常に0.6"にします。0.5"、0.7"、0.9"にはしません |
| テキストの高さ | 0.5" | パディングを含めて0.6"のボックス内に収まります |
| フォントサイズ | 11pt | 常に11ptの太字にします。12ptや13ptにはしません |
| フォント | theme.font.body | 太字、左揃え、valign: "middle" |
| ボックスのx/w | x: 0.5, w: 9.0 | コンテンツ幅全体 |
| テキストのx/w | x: 0.7, w: 8.6 | ボックスの端から0.2"内側 |
| テキストのyオフセット | ボックスのy + 0.05" | テキストを垂直方向の中央に配置 |
| 角丸半径 | 0.06" | すべてのコールアウトで統一 |
// Standard bottom callout — copy this pattern exactly
s.addShape(pres.shapes.RECTANGLE, {
x: 0.5, y: calloutY, w: 9.0, h: 0.6,
fill: { color: "DCFCE7" }, // or theme.accentMuted, "FEF3C7", etc.
line: { color: theme.status.positive, width: 0.75 },
rectRadius: 0.06,
});
s.addText("Callout text here.", {
x: 0.7, y: calloutY + 0.05, w: 8.6, h: 0.5,
fontSize: 11, fontFace: theme.font.body, bold: true,
color: "166534", align: "left", valign: "middle",
});
表とコールアウトのレイアウト(重なりを防止)
表の下にコールアウトを配置する前に、必ず表の最下部の位置を計算します。 PptxGenJSの表は高さを自動的に返さないため、自分で計算する必要があります。
tableBottom = tableY + (rowCount × rowH)
calloutY = tableBottom + 0.15" // minimum 0.15" gap
**calloutY + 0.6"(コールアウトの高さ)< 5.2"(フッター領域)であることを確認します。**収まらない場合は、rowHまたは表のフォントサイズを小さくします。コールアウトをフッターに重ねてはいけません。
| 行数(ヘッダーを含む) | rowH: 0.32" | rowH: 0.36" | rowH: 0.42" | rowH: 0.48" | rowH: 0.55" |
|---|---|---|---|---|---|
| 6行 | 1.92" | 2.16" | 2.52" | 2.88" | 3.30" |
| 7行 | 2.24" | 2.52" | 2.94" | 3.36" | 3.85" |
| 8行 | 2.56" | 2.88" | 3.36" | 3.84" | 4.40" |
| 11行 | 3.52" | 3.96" | 4.62" | — | — |
表の開始位置がy: 1.0"で、コールアウトに0.75"(0.15"の間隔 + 0.6"のボックス)が必要な場合、フッターより上に収めるには表の高さを**3.45"**以下にします。これに合わせてrowHを選びます。
スライド間の一貫性ルール
繰り返し使用する要素は、すべてのスライドで同一の寸法にする必要があります。
- 下部のコールアウトボックス — すべてのスライドでh、fontSize、パディングを統一します(上記の標準を参照)
- グラフのフォントサイズ — 複数のスライドに棒グラフや折れ線グラフがある場合、すべてのグラフで
dataLabelFontSize、catAxisLabelFontSize、valAxisLabelFontSizeを統一します - 表のスタイル — ヘッダー行のスタイル(
hdr())とセルのスタイル(cell())は、一度だけヘルパーとして定義して再利用します - カードの寸法 — 複数のスライドで統計カードを使う場合は、カードの幅、高さ、角丸半径を統一します
- セクションバッジの位置 — インパクトバッジ(例:「$400K-$800K」)には、同じx、y、w、h、fontSizeを使います
ルール:複数のスライドで使う寸法は、スクリプトの先頭で再利用可能な定数として定義します。
スライドの構成
レイアウトに変化をつける — 最も重要なルール
同じレイアウトを3回以上連続で使ってはいけません。次のレイアウトを順番に使い分けます。
| 種類 | 用途 | 要素 |
|---|---|---|
| タイトルスライド | 冒頭/締めくくり | メインテキスト、サブタイトル、ロゴ、日付 |
| KPIダッシュボード | エグゼクティブサマリー | 3~5枚のカード、大きな数値 |
| グラフ + 洞察 | 背景情報を伴うデータ | 60/40の分割 |
| 全幅グラフ | グラフがストーリーの中心となる場合 | 全幅、コールアウトのオーバーレイ |
| アイコン機能グリッド | 機能、柱となる要素 | アイコンとテキストを組み合わせた3~4行 |
| データ表 | 財務情報、比較 | スタイル付きの行、等幅フォントの数値 |
| セクション区切り | セクション間 | 暗色またはアクセントカラーの背景に太字のタイトル |
| 引用 | お客様の声 | 大きなイタリック体、出典 |
| 大きな数値 | 重要な統計を1つだけ示す場合 | 中央に配置した大きな指標 |
| 比較 | 変更前/変更後、対比 | 横並びの列 |
| 画像 + テキスト | 製品、事例紹介 | 半分を塗り足し画像にする |
| 締めくくり | 最後 | ロゴ、CTA、連絡先 |
アンチパターン(絶対に行わないでください)
- タイトル、サブタイトル、見出しの下に、アクセント用の水平線やバーを絶対に追加しないでください — これが AI らしさを最も強く示します。テキストの下に装飾的な区切りとして配置する細い長方形(高さ:0.03~0.05)は使用しないでください。タイトルスライド、セクションの区切り、締めくくりのスライドなど、どこにも使用しないでください。スライドに視覚的な区切りが必要な場合は、余白または色付きのパネルを使用してください。
- 図形にグラデーション塗りつぶしを使わないでください — 単色と控えめな境界線を使用してください
- 濃い影を使わないでください — 不透明度は最大 0.1、ぼかしは 6 にしてください
- 連続するスライドで同じレイアウトを繰り返さないでください
- 本文を中央揃えにしないでください — タイトルと KPI 以外はすべて左揃えにしてください
- フォントは最大 2 種類にしてください(+等幅フォント 1 種類)
- テキストの壁を作らないでください — スライドごとの本文は最大 6 行にしてください
- 装飾的な図形を使わないでください — 無作為な円、三角形、曲線などは使用しないでください
- クリップアートを使わないでください — Lucide/Feather アイコンを使用してください
- 色付きのカード背景を使わないでください — カードには
bg-surfaceと控えめな境界線を使用してください - Unicode の箇条書きを使わないでください —
bullet: trueを使用してください - 1 つのデッキ内でライトとダークを混在させないでください
- グラフのデータラベルを未設定のままにしないでください —
showValue: trueを使う場合は、必ずdataLabelFormatCodeも設定してください。valAxisLabelFormatCodeだけではデータラベルは書式設定されません。最良の結果を得るには、生の値を使った OOXML 条件付き書式を使用してください。 - サイズを確認せず、幅の狭いパネルに長いテキストを入れないでください — 幅が 4" 未満のコンテナーに本文を追加する前に、行数を推定し(文字数 ÷ 1 行あたりの文字数)、コンテナーの高さに収まることを確認してください。収まらない場合は、フォントサイズを小さくするか、テキストを短くしてください。
- コールアウトボックスのスタイルを統一してください — スライド下部の全幅コールアウトボックスはすべて、スライド間で高さ(0.6")、テキストのフォントサイズ(11pt)、パディングを統一してください。コールアウトのパターンを一度定義し、そのまま正確に複製してください。
- コールアウトを表に重ねないでください — 必ず
tableBottom = tableY + (rows × rowH)を計算し、コールアウトは少なくともtableBottom + 0.15"の位置に配置してください。表と重ならないことを確認せずに、コールアウトの y 位置を固定値にしないでください。 - グラフのフォントサイズを統一してください — 複数のスライドにグラフがある場合は、
dataLabelFontSize、catAxisLabelFontSize、valAxisLabelFontSizeの値をすべて統一してください。これらを定数として定義し、再利用してください。
QA(必須)
問題があることを前提にしてください。最初のレンダリングが正しいことはありません。
コンテンツの確認
python -m markitdown output.pptx
python -m markitdown output.pptx | grep -iE "xxxx|lorem|ipsum|placeholder|click to"
ビジュアル QA(サブエージェントを使用)
python scripts/office/soffice.py --headless --convert-to pdf output.pptx
pdftoppm -jpeg -r 150 output.pdf slide
サブエージェントへのプロンプト:
Inspect these slides. Assume issues exist — find them.
Look for:
- TEXT OVERFLOW: Numbers or titles that wrap to a second line inside their container. Also check body text in narrow panels (<4" wide) — long paragraphs at font sizes >11pt will overflow.
- ACCENT LINES: Any thin horizontal bars/lines under titles or headings (must be removed)
- CHART DATA LABELS: Raw unformatted numbers on data labels (e.g., "2888000" instead of "$2,889K"). This is the #1 chart bug — valAxisLabelFormatCode does NOT format data labels.
- CHART AXES: Raw unformatted numbers on axes (should be $500K not 500000)
- Overlapping elements, cramped spacing (<0.3"), insufficient margins (<0.5")
- Low contrast, text-only slides, repeated layouts, placeholder text
- Mode inconsistency (light elements on dark or vice versa)
- Big numbers that should be abbreviated ($5.3M not $5,307,540)
- CALLOUT INCONSISTENCY: Bottom callout boxes with different heights, font sizes, or padding across slides (all must be h:0.6", fontSize:11)
- TABLE-CALLOUT OVERLAP: Callout boxes overlapping tables — calculate tableY + (rows × rowH) and verify callout clears it
- CHART FONT INCONSISTENCY: Different dataLabelFontSize, catAxisLabelFontSize, or valAxisLabelFontSize between charts on different slides
修正 → 再レンダリング → 確認 → 問題がなくなるまで繰り返してください。少なくとも 1 回は修正サイクルを完了してください。
依存関係
npm install -g pptxgenjs # Creation
npm install -g react-icons react react-dom sharp # Icons
pip install "markitdown[pptx]" Pillow # Reading + QA
# Also: LibreOffice (soffice) + Poppler (pdftoppm) for visual QA
実装
REFERENCE.md を読んで、PptxGenJS API のパターンと、ライトモードとダークモードの両方に対応したスライド構成コード全体を確認してください。
ブランドのコンテキスト(任意)
作業ディレクトリに brand-profile.json がある場合は、デッキを作成する前に読み込んでください。デフォルトの RRBC パレットをブランドの色(プライマリ、セカンダリ、背景)に置き換え、使用可能な場合はブランドフォントを使い(使用できない場合はシステムフォントにフォールバック)、タイトルスライドとヘッダーにブランド名を含めてください。このプロファイルは brand-dna スキルによって生成されます。