版の配色
1920 × 1080 作品として見る 版そのものを描画 — どの倍率でも字は潰れません 骨格・余白・カラムを重ねた状態
1920 × 1080 作品として見る 版そのものを描画 — どの倍率でも字は潰れません 骨格・余白・カラムを重ねた状態
コピーして貼るか、ファイルに保存して渡す。ネットにつながらない環境には「全部入り」を 1 つ渡せば足りる。
このパネルの中身を、URL の先にあるファイルの中身まで含めて 1 つにまとめた Markdown — 大きいのでファイルで渡す(コピーは 32KB まで)
以下の仕様でスライドを 1 枚作ってください。 - 版面 1920 × 1080 - 余白 上 92 右 140 下 92 左 140 - 5 カラム(等分)、間隔 3 ## 強調 3 列目のみ。手段は 塗り だけ。ほかは変えない ## 文字(版面 1920px に対する px) title 44px / 700 / 字間 0.01em / 行送り 1.3 total 17px / 500 / 等幅数字 segName 16px / 500 segPct 20px / 700 / 等幅数字 col 15px / 500 / 字間 0.12em pname 20px / 700 / 行送り 1.4 num 19px / 500 / 等幅数字 fkey 14px / 500 / 字間 0.14em fval 16px / 400 / 行送り 1.75 / 等幅数字 ## 配色 地 #FFFFFF / 面 #F4F6F9 / 文字 #131820 / 補助 #667183 / 強調 #1F5FA8 / 罫 #DBE1E9 ## 外すと崩れる点 - 積み上げの帯を表より上に置く。総額から読ませると「高い/安い」の話になり、どこに費用が乗っているかの話にならない - 単価は工程ごとに出す。平均単価 1 つだと、工程を削ったときの再計算が合わず、値引き交渉が算数の話になる - 発注側の工数は金額に入れず、行としては残す。消すと「こちらは何もしなくてよい」と読まれる - 前提と変動要因を同じ面に置く。別紙に送ると総額だけが独り歩きし、範囲が変わっても金額は据え置きだと思われる - 有効期限を書く。要員の確保が前提の金額なので、期限の無い見積は約束として扱われる - 塗るのはいちばん重い工程 1 つだけ。2 つ塗ると「重い」が意味を失う 内容は[ここに自分の内容を書く]に置き換えてください。寸法と配色はそのまま守ってください。 正確に再現する場合は、この HTML をそのまま使ってください: https://design-vault.pages.dev/designs/estimate-breakdown-by-phase/pattern.html
/ai/designs/estimate-breakdown-by-phase.json
format: slide-16x9
density: high
layout:
kind: waterfall
canvas:
w: 1920
h: 1080
margin:
top: 92
right: 140
bottom: 92
left: 140
columns:
count: 5
gap: 3
emphasis:
column: 3
via:
- fill
type:
title:
size: 44
weight: 700
tracking: 0.01em
leading: 1.3
total:
size: 17
weight: 500
numeric: tabular
segName:
size: 16
weight: 500
segPct:
size: 20
weight: 700
numeric: tabular
col:
size: 15
weight: 500
tracking: 0.12em
pname:
size: 20
weight: 700
leading: 1.4
num:
size: 19
weight: 500
numeric: tabular
fkey:
size: 14
weight: 500
tracking: 0.14em
fval:
size: 16
weight: 400
leading: 1.75
numeric: tabular
colors:
ground: "#FFFFFF"
surface: "#F4F6F9"
ink: "#131820"
muted: "#667183"
accent: "#1F5FA8"
rule: "#DBE1E9"
rules:
- 積み上げの帯を表より上に置く。総額から読ませると「高い/安い」の話になり、どこに費用が乗っているかの話にならない
- 単価は工程ごとに出す。平均単価 1 つだと、工程を削ったときの再計算が合わず、値引き交渉が算数の話になる
- 発注側の工数は金額に入れず、行としては残す。消すと「こちらは何もしなくてよい」と読まれる
- 前提と変動要因を同じ面に置く。別紙に送ると総額だけが独り歩きし、範囲が変わっても金額は据え置きだと思われる
- 有効期限を書く。要員の確保が前提の金額なので、期限の無い見積は約束として扱われる
- 塗るのはいちばん重い工程 1 つだけ。2 つ塗ると「重い」が意味を失う{
"format": "slide-16x9",
"density": "high",
"layout": {
"kind": "waterfall",
"canvas": {
"w": 1920,
"h": 1080
},
"margin": {
"top": 92,
"right": 140,
"bottom": 92,
"left": 140
},
"columns": {
"count": 5,
"gap": 3
},
"emphasis": {
"column": 3,
"via": [
"fill"
]
}
},
"type": {
"title": {
"size": 44,
"weight": 700,
"tracking": "0.01em",
"leading": 1.3
},
"total": {
"size": 17,
"weight": 500,
"numeric": "tabular"
},
"segName": {
"size": 16,
"weight": 500
},
"segPct": {
"size": 20,
"weight": 700,
"numeric": "tabular"
},
"col": {
"size": 15,
"weight": 500,
"tracking": "0.12em"
},
"pname": {
"size": 20,
"weight": 700,
"leading": 1.4
},
"num": {
"size": 19,
"weight": 500,
"numeric": "tabular"
},
"fkey": {
"size": 14,
"weight": 500,
"tracking": "0.14em"
},
"fval": {
"size": 16,
"weight": 400,
"leading": 1.75,
"numeric": "tabular"
}
},
"colors": {
"ground": "#FFFFFF",
"surface": "#F4F6F9",
"ink": "#131820",
"muted": "#667183",
"accent": "#1F5FA8",
"rule": "#DBE1E9"
},
"rules": [
"積み上げの帯を表より上に置く。総額から読ませると「高い/安い」の話になり、どこに費用が乗っているかの話にならない",
"単価は工程ごとに出す。平均単価 1 つだと、工程を削ったときの再計算が合わず、値引き交渉が算数の話になる",
"発注側の工数は金額に入れず、行としては残す。消すと「こちらは何もしなくてよい」と読まれる",
"前提と変動要因を同じ面に置く。別紙に送ると総額だけが独り歩きし、範囲が変わっても金額は据え置きだと思われる",
"有効期限を書く。要員の確保が前提の金額なので、期限の無い見積は約束として扱われる",
"塗るのはいちばん重い工程 1 つだけ。2 つ塗ると「重い」が意味を失う"
]
} /designs/estimate-breakdown-by-phase/pattern.html — 版そのものの HTML。書体の部分集合ごと同梱で、開けばこの絵がそのまま出ます。
<!doctype html>
<meta charset="utf-8">
<title>見積の内訳 — 総額より先に構成比を読ませる</title>
<meta name="dv-font" content="Zen Kaku Gothic New:400;500;700">
<link rel="stylesheet" href="./font.css">
<style>
/* この版そのもの。index.md の layout / type / colors は、この HTML を
scripts/render-pattern.mjs で実測した結果であって、別に書いた説明ではない。 */
:root {
--ground: #FFFFFF;
--surface: #F4F6F9;
--ink: #131820;
--muted: #667183;
--accent: #1F5FA8;
--rule: #DBE1E9;
}
* { box-sizing: border-box; margin: 0; }
html, body { width: 1920px; height: 1080px; }
body { font-family: "Zen Kaku Gothic New", "IPAGothic", sans-serif; }
.artboard {
width: 1920px; height: 1080px;
background: var(--ground); color: var(--ink);
padding: 92px 140px; /* → layout.margin */
}
.content { height: 100%; display: grid; grid-template-rows: auto 1fr auto; }
.head { display: flex; align-items: baseline; justify-content: space-between; gap: 40px; }
.title { font-size: 44px; font-weight: 700; line-height: 1.3; letter-spacing: .01em; }
.total { font-size: 17px; font-weight: 500; font-variant-numeric: tabular-nums; }
.total b { font-size: 30px; font-weight: 700; letter-spacing: .01em; }
.body { align-self: center; display: grid; gap: 40px; }
/* 積み上げの帯を表より先に置く。総額だけを読む紙にしないための順序で、
どの工程が重いかが数字を追う前に決まる。 */
.stack { display: grid; grid-template-columns: 12.33fr 19.38fr 40.46fr 18.14fr 9.69fr; gap: 3px; }
.seg { height: 76px; background: color-mix(in srgb, var(--ink) 12%, transparent); display: grid; align-content: center; padding: 0 20px; }
/* 塗るのはいちばん重い工程 1 つだけ。2 つ塗ると「重い」の意味が薄まる。 */
.seg[data-emphasis] { background: var(--accent); }
.segName { font-size: 16px; font-weight: 500; }
.segPct { font-size: 20px; font-weight: 700; margin-top: 4px; font-variant-numeric: tabular-nums; }
.seg[data-emphasis] .segName,
.seg[data-emphasis] .segPct { color: var(--ground); }
.table { width: 100%; }
/* 工程・人月・単価・金額・構成比。単価は工程ごとに出す —— 平均単価 1 つだと
工程を削ったときの再計算が合わない。 */
.row { display: grid; grid-template-columns: 1fr 130px 200px 240px 150px; align-items: baseline; gap: 34px; padding: 19px 22px; border-bottom: 1px solid var(--rule); }
.row:first-child { border-top: 1px solid var(--rule); }
.row.head-row { padding: 14px 22px; border-bottom-color: var(--ink); }
.col { font-size: 15px; font-weight: 500; letter-spacing: .12em; color: var(--muted); text-align: right; }
.col:first-child { text-align: left; }
.pname { font-size: 20px; font-weight: 700; line-height: 1.4; }
.num { font-size: 19px; font-weight: 500; text-align: right; font-variant-numeric: tabular-nums; }
.num[data-soft] { color: var(--muted); font-weight: 400; }
/* 御社側の工数は金額に入れないが、行としては残す。
消すと「こちらは何もしなくてよい」と読まれる。 */
.row[data-client] .pname { color: var(--muted); font-weight: 500; }
.row.sum { border-bottom: 2px solid var(--ink); background: var(--surface); }
.row.sum .pname,
.row.sum .num { font-weight: 700; }
.foot { display: grid; grid-template-columns: 1.25fr 1.25fr .9fr; gap: 56px; border-top: 1px solid var(--rule); padding-top: 24px; }
.fkey { font-size: 14px; font-weight: 500; letter-spacing: .14em; color: var(--muted); }
.fval { font-size: 16px; font-weight: 400; line-height: 1.75; color: var(--ink); margin-top: 10px; font-variant-numeric: tabular-nums; }
</style>
<div class="artboard" data-artboard>
<div class="content" data-content>
<div class="head">
<h1 class="title" data-type="title">見積の内訳(第 1 期)</h1>
<p class="total" data-type="total">弊社分 合計 <b>136,200</b> 千円(税別)/ 132 人月</p>
</div>
<div class="body">
<div class="stack">
<div class="seg" data-col="1">
<p class="segName" data-type="segName">要件定義</p>
<p class="segPct" data-type="segPct">12.3%</p>
</div>
<div class="seg" data-col="2">
<p class="segName">基本設計</p>
<p class="segPct">19.4%</p>
</div>
<div class="seg" data-col="3" data-emphasis="fill">
<p class="segName">詳細設計・実装</p>
<p class="segPct">40.5%</p>
</div>
<div class="seg" data-col="4">
<p class="segName">結合・総合テスト</p>
<p class="segPct">18.1%</p>
</div>
<div class="seg" data-col="5">
<p class="segName">移行・切替</p>
<p class="segPct">9.7%</p>
</div>
</div>
<div class="table">
<div class="row head-row">
<p class="col" data-type="col">工程</p>
<p class="col">人月</p>
<p class="col">単価(千円/人月)</p>
<p class="col">金額(千円)</p>
<p class="col">構成比</p>
</div>
<div class="row">
<p class="pname" data-type="pname">要件定義</p>
<p class="num" data-type="num">14</p>
<p class="num">1,200</p>
<p class="num">16,800</p>
<p class="num" data-soft>12.3%</p>
</div>
<div class="row">
<p class="pname">基本設計</p>
<p class="num">22</p>
<p class="num">1,200</p>
<p class="num">26,400</p>
<p class="num" data-soft>19.4%</p>
</div>
<div class="row">
<p class="pname">詳細設計・実装</p>
<p class="num">58</p>
<p class="num">950</p>
<p class="num">55,100</p>
<p class="num" data-soft>40.5%</p>
</div>
<div class="row">
<p class="pname">結合・総合テスト</p>
<p class="num">26</p>
<p class="num">950</p>
<p class="num">24,700</p>
<p class="num" data-soft>18.1%</p>
</div>
<div class="row">
<p class="pname">移行・切替</p>
<p class="num">12</p>
<p class="num">1,100</p>
<p class="num">13,200</p>
<p class="num" data-soft>9.7%</p>
</div>
<div class="row sum">
<p class="pname">弊社分 合計</p>
<p class="num">132</p>
<p class="num" data-soft>—</p>
<p class="num">136,200</p>
<p class="num" data-soft>100.0%</p>
</div>
<div class="row" data-client>
<p class="pname">受入テスト(御社ご担当)</p>
<p class="num" data-soft>8</p>
<p class="num" data-soft>—</p>
<p class="num" data-soft>見積外</p>
<p class="num" data-soft>—</p>
</div>
</div>
</div>
<div class="foot">
<div>
<p class="fkey" data-type="fkey">前提</p>
<p class="fval" data-type="fval">対象範囲は 2 章の「第 1 期で作るもの」5 項目。帳票は主要 9 本、連携は在庫・会計の 2 系統。</p>
</div>
<div>
<p class="fkey">この金額が動く要因</p>
<p class="fval">統合対象 4 帳票を個別に残す判断(+約 6,800 千円)/ 在庫連携を非同期に変更(△ 約 3,200 千円)。</p>
</div>
<div>
<p class="fkey">有効期限</p>
<p class="fval">2026.11.30 まで。要員の確保を前提とするため。</p>
</div>
</div>
</div>
</div>
/designs/estimate-breakdown-by-phase/font.css — 全部入りには入れていない
/* dv-subset v2 — generated by scripts/subset-font.mjs. Do not edit.
* font Zen Kaku Gothic New 400;500;700
* chars 134 (d7cf4e913d888afa)
*
* pattern.html の文字だけを含む部分集合。描画時に外部へ取りに行かないよう同梱する。
* 版の文字を変えたら取り直すこと — 忘れると足りない字が豆腐になる。
* その取り忘れは pattern-entries.test.ts が上の指紋で検出する。
*/
@font-face {
font-family: 'Zen Kaku Gothic New';
font-style: normal;
font-weight: 400;
font-display: block;
src: url(./font-0.woff2) format('woff2');
unicode-range: U+25, U+2c, U+2e, U+30-39, U+2014, U+25b3, U+3001-3002, U+300c-300d, U+304b-304c, U+304f-3050, U+3053-3054, U+3059-305c, U+305f-3060, U+3066-3069, U+306b, U+306e-3070, U+307e, U+3081-3082, U+3088, U+308a-308b, U+3092, U+3099, U+30b9-30ba, U+30c6-30c9, U+30fb, U+4e3b, U+4eba, U+4ef6, U+4f1a, U+4f5c, U+4fa1, U+4fdd, U+500b, U+5148, U+5165, U+5185-5186, U+5206-5207, U+5224-5225, U+524d, U+52b9, U+52d5, U+5343, U+5358, U+53d7, U+5408, U+540c, U+54e1, U+56e0, U+56f2, U+5728, U+57fa, U+5909, U+5916, U+5b9a, U+5b9f, U+5bfe, U+5de5, U+5e33, U+5eab, U+5f0a, U+5f53, U+5fa1, U+6210, U+62c5, U+63d0, U+643a, U+65ad, U+66f4, U+66ff, U+6708-6709, U+671f, U+672c, U+69cb, U+6b8b, U+6bd4, U+76ee, U+78ba, U+793e, U+7968, U+79fb, U+7a0b, U+7a0e, U+7a4d, U+7ae0, U+7b2c, U+7bc4, U+7cfb, U+7d04, U+7d30, U+7d50, U+7d71, U+7dcf, U+7fa9, U+884c, U+88c5, U+8981, U+898b, U+8a08, U+8a2d, U+8a33, U+8a73, U+8aad, U+8c61, U+9023, U+91d1, U+9650, U+975e, U+9805, U+984d, U+ff08-ff09, U+ff0b, U+ff0f;
}
@font-face {
font-family: 'Zen Kaku Gothic New';
font-style: normal;
font-weight: 500;
font-display: block;
src: url(./font-1.woff2) format('woff2');
unicode-range: U+25, U+2c, U+2e, U+30-39, U+2014, U+25b3, U+3001-3002, U+300c-300d, U+304b-304c, U+304f-3050, U+3053-3054, U+3059-305c, U+305f-3060, U+3066-3069, U+306b, U+306e-3070, U+307e, U+3081-3082, U+3088, U+308a-308b, U+3092, U+3099, U+30b9-30ba, U+30c6-30c9, U+30fb, U+4e3b, U+4eba, U+4ef6, U+4f1a, U+4f5c, U+4fa1, U+4fdd, U+500b, U+5148, U+5165, U+5185-5186, U+5206-5207, U+5224-5225, U+524d, U+52b9, U+52d5, U+5343, U+5358, U+53d7, U+5408, U+540c, U+54e1, U+56e0, U+56f2, U+5728, U+57fa, U+5909, U+5916, U+5b9a, U+5b9f, U+5bfe, U+5de5, U+5e33, U+5eab, U+5f0a, U+5f53, U+5fa1, U+6210, U+62c5, U+63d0, U+643a, U+65ad, U+66f4, U+66ff, U+6708-6709, U+671f, U+672c, U+69cb, U+6b8b, U+6bd4, U+76ee, U+78ba, U+793e, U+7968, U+79fb, U+7a0b, U+7a0e, U+7a4d, U+7ae0, U+7b2c, U+7bc4, U+7cfb, U+7d04, U+7d30, U+7d50, U+7d71, U+7dcf, U+7fa9, U+884c, U+88c5, U+8981, U+898b, U+8a08, U+8a2d, U+8a33, U+8a73, U+8aad, U+8c61, U+9023, U+91d1, U+9650, U+975e, U+9805, U+984d, U+ff08-ff09, U+ff0b, U+ff0f;
}
@font-face {
font-family: 'Zen Kaku Gothic New';
font-style: normal;
font-weight: 700;
font-display: block;
src: url(./font-2.woff2) format('woff2');
unicode-range: U+25, U+2c, U+2e, U+30-39, U+2014, U+25b3, U+3001-3002, U+300c-300d, U+304b-304c, U+304f-3050, U+3053-3054, U+3059-305c, U+305f-3060, U+3066-3069, U+306b, U+306e-3070, U+307e, U+3081-3082, U+3088, U+308a-308b, U+3092, U+3099, U+30b9-30ba, U+30c6-30c9, U+30fb, U+4e3b, U+4eba, U+4ef6, U+4f1a, U+4f5c, U+4fa1, U+4fdd, U+500b, U+5148, U+5165, U+5185-5186, U+5206-5207, U+5224-5225, U+524d, U+52b9, U+52d5, U+5343, U+5358, U+53d7, U+5408, U+540c, U+54e1, U+56e0, U+56f2, U+5728, U+57fa, U+5909, U+5916, U+5b9a, U+5b9f, U+5bfe, U+5de5, U+5e33, U+5eab, U+5f0a, U+5f53, U+5fa1, U+6210, U+62c5, U+63d0, U+643a, U+65ad, U+66f4, U+66ff, U+6708-6709, U+671f, U+672c, U+69cb, U+6b8b, U+6bd4, U+76ee, U+78ba, U+793e, U+7968, U+79fb, U+7a0b, U+7a0e, U+7a4d, U+7ae0, U+7b2c, U+7bc4, U+7cfb, U+7d04, U+7d30, U+7d50, U+7d71, U+7dcf, U+7fa9, U+884c, U+88c5, U+8981, U+898b, U+8a08, U+8a2d, U+8a33, U+8a73, U+8aad, U+8c61, U+9023, U+91d1, U+9650, U+975e, U+9805, U+984d, U+ff08-ff09, U+ff0b, U+ff0f;
}
「なぜこの金額か」を 1 枚で説明する版。pattern.html が版そのもので、cover.png と
frontmatter の寸法はどちらもそこから機械的に出している。編集するのは pattern.html だけ。
The page that explains why the number is the number. pattern.html is the artboard itself; both
cover.png and the measurements come from it, so the three cannot drift apart.
12.33fr 19.38fr 40.46fr 18.14fr 9.69fr。表の構成比と同じ値を fr に
そのまま置くので、絵と数字がずれようがない--surface を敷き、下端を --ink の 2px で締める。塗りと罫の 2 手段を使うのは
この 1 行だけ