@squadbase/vantage 0.6.2-dev1.a7c4a3e → 0.6.2-dev1.a881d95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-JB4VOMUI.js → build-U7GO26HR.js} +9 -9
  4. package/dist/{build-JB4VOMUI.js.map → build-U7GO26HR.js.map} +1 -1
  5. package/dist/{check-ZJYK6RLG.js → check-MRVAIHG5.js} +7 -7
  6. package/dist/{check-ZJYK6RLG.js.map → check-MRVAIHG5.js.map} +1 -1
  7. package/dist/chunk-2IAPIOPS.js +152 -0
  8. package/dist/chunk-2IAPIOPS.js.map +1 -0
  9. package/dist/chunk-3RJEOP3J.js +174 -0
  10. package/dist/chunk-3RJEOP3J.js.map +1 -0
  11. package/dist/chunk-77CISBMG.js +7581 -0
  12. package/dist/chunk-77CISBMG.js.map +1 -0
  13. package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
  14. package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
  15. package/dist/{chunk-PVTHHV7X.js → chunk-ANZLVSEP.js} +28 -7
  16. package/dist/chunk-ANZLVSEP.js.map +1 -0
  17. package/dist/chunk-CKWPK4RO.js +50 -0
  18. package/dist/chunk-CKWPK4RO.js.map +1 -0
  19. package/dist/chunk-EG4PX726.js +678 -0
  20. package/dist/chunk-EG4PX726.js.map +1 -0
  21. package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
  22. package/dist/chunk-GNXCX4WE.js.map +1 -0
  23. package/dist/chunk-NZ5QIIG4.js +74 -0
  24. package/dist/chunk-NZ5QIIG4.js.map +1 -0
  25. package/dist/{chunk-BCE22JSM.js → chunk-PJ4SPXHS.js} +52 -16
  26. package/dist/chunk-PJ4SPXHS.js.map +1 -0
  27. package/dist/{chunk-RPZAALCX.js → chunk-QNOX7WLZ.js} +256 -165
  28. package/dist/chunk-QNOX7WLZ.js.map +1 -0
  29. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  30. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  31. package/dist/{chunk-PXRX5PEC.js → chunk-ROHNXP7J.js} +73 -4
  32. package/dist/chunk-ROHNXP7J.js.map +1 -0
  33. package/dist/chunk-S5MDTHH7.js +466 -0
  34. package/dist/chunk-S5MDTHH7.js.map +1 -0
  35. package/dist/chunk-SDJTTMLK.js +1877 -0
  36. package/dist/chunk-SDJTTMLK.js.map +1 -0
  37. package/dist/{chunk-EP6JHXSR.js → chunk-SHZM3EXB.js} +68 -12
  38. package/dist/chunk-SHZM3EXB.js.map +1 -0
  39. package/dist/chunk-TRMHNMMZ.js +61 -0
  40. package/dist/chunk-TRMHNMMZ.js.map +1 -0
  41. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  42. package/dist/chunk-U736PVHY.js.map +1 -0
  43. package/dist/{chunk-JGRMRXXZ.js → chunk-UWSQUHX6.js} +4 -99
  44. package/dist/chunk-UWSQUHX6.js.map +1 -0
  45. package/dist/cli.js +12 -11
  46. package/dist/cli.js.map +1 -1
  47. package/dist/client/index.d.ts +34 -3
  48. package/dist/client/index.js +211 -12
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/components/index.d.ts +1761 -30
  51. package/dist/components/index.js +7 -4
  52. package/dist/delta-text-CbrOaW83.d.ts +17 -0
  53. package/dist/{dev-FCEC3UKQ.js → dev-O42JFQ64.js} +10 -10
  54. package/dist/dev-O42JFQ64.js.map +1 -0
  55. package/dist/doc/index.d.ts +215 -2
  56. package/dist/doc/index.js +423 -5
  57. package/dist/doc/index.js.map +1 -1
  58. package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
  59. package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
  60. package/dist/{doctor-WHZXPERA.js → doctor-YD3XAAOT.js} +7 -7
  61. package/dist/{doctor-WHZXPERA.js.map → doctor-YD3XAAOT.js.map} +1 -1
  62. package/dist/format-DihQkL1N.d.ts +249 -0
  63. package/dist/markdown/index.js +1 -1
  64. package/dist/markdown/index.js.map +1 -1
  65. package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
  66. package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
  67. package/dist/query/index.d.ts +0 -11
  68. package/dist/query/index.js +2 -2
  69. package/dist/{routes-GTFO5PUF.js → routes-PVKNT777.js} +6 -6
  70. package/dist/{routes-GTFO5PUF.js.map → routes-PVKNT777.js.map} +1 -1
  71. package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
  72. package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
  73. package/dist/slide/index.d.ts +272 -1
  74. package/dist/slide/index.js +1072 -14
  75. package/dist/slide/index.js.map +1 -1
  76. package/dist/table/index.js +14 -10
  77. package/dist/table/index.js.map +1 -1
  78. package/dist/ui/index.d.ts +148 -12
  79. package/dist/ui/index.js +1340 -88
  80. package/dist/ui/index.js.map +1 -1
  81. package/dist/{upgrade-AL4KZZR4.js → upgrade-6DT7ADRP.js} +7 -7
  82. package/dist/{upgrade-AL4KZZR4.js.map → upgrade-6DT7ADRP.js.map} +1 -1
  83. package/dist/vite/index.d.ts +10 -0
  84. package/dist/vite/index.js +4 -4
  85. package/docs/en/agent-skills.md +1 -1
  86. package/docs/en/changelog.md +2 -0
  87. package/docs/en/components.md +42 -17
  88. package/docs/en/doc/delta-text.md +40 -0
  89. package/docs/en/doc/doc-action-items.md +49 -0
  90. package/docs/en/doc/doc-callout.md +38 -0
  91. package/docs/en/doc/doc-data-table.md +60 -0
  92. package/docs/en/doc/doc-executive-summary.md +64 -0
  93. package/docs/en/doc/doc-figure.md +56 -0
  94. package/docs/en/doc/doc-key-findings.md +61 -0
  95. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  96. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  97. package/docs/en/doc/doc-report-header.md +46 -0
  98. package/docs/en/pages-and-metadata.md +15 -0
  99. package/docs/en/parts/area-chart.md +99 -0
  100. package/docs/en/parts/bar-chart.md +91 -0
  101. package/docs/en/parts/bar-list.md +50 -0
  102. package/docs/en/parts/category-bar.md +37 -0
  103. package/docs/en/parts/chart-frame.md +39 -0
  104. package/docs/en/parts/data-table.md +22 -0
  105. package/docs/en/parts/delta.md +51 -0
  106. package/docs/en/parts/donut-chart.md +72 -0
  107. package/docs/en/parts/format.md +43 -0
  108. package/docs/en/parts/funnel-steps.md +2 -1
  109. package/docs/en/parts/heatmap.md +53 -0
  110. package/docs/en/parts/kpi-card.md +58 -0
  111. package/docs/en/parts/legend.md +35 -0
  112. package/docs/en/parts/line-chart.md +94 -0
  113. package/docs/en/parts/metric-value.md +3 -2
  114. package/docs/en/parts/progress-circle.md +33 -0
  115. package/docs/en/parts/sample-data.md +39 -0
  116. package/docs/en/parts/scatter-chart.md +56 -0
  117. package/docs/en/parts/sparkline.md +1 -1
  118. package/docs/en/parts/tracker.md +36 -0
  119. package/docs/en/parts/trend-indicator.md +17 -1
  120. package/docs/en/parts/updated-at.md +30 -0
  121. package/docs/en/parts/waterfall-chart.md +56 -0
  122. package/docs/en/slide/slide-chart-full.md +48 -0
  123. package/docs/en/slide/slide-chart-insight.md +52 -0
  124. package/docs/en/slide/slide-columns.md +46 -0
  125. package/docs/en/slide/slide-comparison.md +68 -0
  126. package/docs/en/slide/slide-cover.md +39 -0
  127. package/docs/en/slide/slide-exec-summary.md +47 -0
  128. package/docs/en/slide/slide-heading.md +38 -0
  129. package/docs/en/slide/slide-kpi-grid.md +55 -0
  130. package/docs/en/slide/slide-kpi-hero.md +58 -0
  131. package/docs/en/slide/slide-next-actions.md +49 -0
  132. package/docs/en/slide/slide-scorecard-table.md +54 -0
  133. package/docs/en/slide/slide-section.md +44 -0
  134. package/docs/en/slide/slide-source-line.md +34 -0
  135. package/docs/en/ui/alert-dialog.md +42 -0
  136. package/docs/en/ui/avatar.md +31 -0
  137. package/docs/en/ui/combobox.md +74 -0
  138. package/docs/en/ui/drawer.md +41 -0
  139. package/docs/en/ui/empty.md +1 -1
  140. package/docs/en/ui/error-state.md +4 -3
  141. package/docs/en/ui/field.md +42 -0
  142. package/docs/en/ui/hover-card.md +21 -0
  143. package/docs/en/ui/kbd.md +17 -0
  144. package/docs/en/ui/loading.md +1 -1
  145. package/docs/en/ui/pagination.md +36 -0
  146. package/docs/en/ui/radio-group.md +21 -0
  147. package/docs/en/ui/toast.md +44 -0
  148. package/docs/en/ui/toggle-group.md +4 -3
  149. package/docs/en/ui-and-theming.md +1 -1
  150. package/docs/index.json +1184 -114
  151. package/docs/ja/agent-skills.md +1 -1
  152. package/docs/ja/changelog.md +33 -0
  153. package/docs/ja/components.md +68 -101
  154. package/docs/ja/doc/delta-text.md +40 -0
  155. package/docs/ja/doc/doc-action-items.md +49 -0
  156. package/docs/ja/doc/doc-callout.md +38 -0
  157. package/docs/ja/doc/doc-data-table.md +60 -0
  158. package/docs/ja/doc/doc-executive-summary.md +64 -0
  159. package/docs/ja/doc/doc-figure.md +56 -0
  160. package/docs/ja/doc/doc-key-findings.md +61 -0
  161. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  162. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  163. package/docs/ja/doc/doc-report-header.md +46 -0
  164. package/docs/ja/page-types/csv.md +83 -0
  165. package/docs/ja/page-types/doc.md +83 -0
  166. package/docs/ja/page-types/excel.md +82 -0
  167. package/docs/ja/page-types/slide.md +133 -0
  168. package/docs/ja/page-types.md +47 -0
  169. package/docs/ja/pages-and-metadata.md +15 -0
  170. package/docs/ja/parts/area-chart.md +85 -0
  171. package/docs/ja/parts/bar-chart.md +95 -0
  172. package/docs/ja/parts/bar-list.md +58 -0
  173. package/docs/ja/parts/category-bar.md +36 -0
  174. package/docs/ja/parts/chart-frame.md +36 -0
  175. package/docs/ja/parts/data-table.md +22 -0
  176. package/docs/ja/parts/delta.md +51 -0
  177. package/docs/ja/parts/donut-chart.md +66 -0
  178. package/docs/ja/parts/echart.md +3 -0
  179. package/docs/ja/parts/format.md +44 -0
  180. package/docs/ja/parts/funnel-steps.md +27 -8
  181. package/docs/ja/parts/heatmap.md +45 -0
  182. package/docs/ja/parts/kpi-card.md +56 -0
  183. package/docs/ja/parts/legend.md +36 -0
  184. package/docs/ja/parts/line-chart.md +84 -0
  185. package/docs/ja/parts/metric-value.md +3 -2
  186. package/docs/ja/parts/progress-circle.md +34 -0
  187. package/docs/ja/parts/sample-data.md +61 -0
  188. package/docs/ja/parts/scatter-chart.md +69 -0
  189. package/docs/ja/parts/sparkline.md +2 -2
  190. package/docs/ja/parts/tracker.md +32 -0
  191. package/docs/ja/parts/trend-indicator.md +17 -1
  192. package/docs/ja/parts/updated-at.md +27 -0
  193. package/docs/ja/parts/waterfall-chart.md +61 -0
  194. package/docs/ja/routing.md +8 -86
  195. package/docs/ja/slide/slide-chart-full.md +48 -0
  196. package/docs/ja/slide/slide-chart-insight.md +52 -0
  197. package/docs/ja/slide/slide-columns.md +46 -0
  198. package/docs/ja/slide/slide-comparison.md +68 -0
  199. package/docs/ja/slide/slide-cover.md +39 -0
  200. package/docs/ja/slide/slide-exec-summary.md +47 -0
  201. package/docs/ja/slide/slide-heading.md +38 -0
  202. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  203. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  204. package/docs/ja/slide/slide-next-actions.md +49 -0
  205. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  206. package/docs/ja/slide/slide-section.md +44 -0
  207. package/docs/ja/slide/slide-source-line.md +34 -0
  208. package/docs/ja/ui/alert-dialog.md +41 -0
  209. package/docs/ja/ui/avatar.md +31 -0
  210. package/docs/ja/ui/combobox.md +74 -0
  211. package/docs/ja/ui/drawer.md +41 -0
  212. package/docs/ja/ui/empty.md +1 -1
  213. package/docs/ja/ui/error-state.md +4 -3
  214. package/docs/ja/ui/field.md +42 -0
  215. package/docs/ja/ui/hover-card.md +21 -0
  216. package/docs/ja/ui/kbd.md +16 -0
  217. package/docs/ja/ui/loading.md +1 -1
  218. package/docs/ja/ui/pagination.md +36 -0
  219. package/docs/ja/ui/radio-group.md +21 -0
  220. package/docs/ja/ui/toast.md +46 -0
  221. package/docs/ja/ui/toggle-group.md +4 -3
  222. package/docs/ja/ui-and-theming.md +14 -7
  223. package/package.json +43 -29
  224. package/registry/ui/accordion.tsx +76 -0
  225. package/registry/ui/alert-dialog.tsx +189 -0
  226. package/registry/ui/alert.tsx +80 -0
  227. package/registry/ui/app-shell.tsx +424 -0
  228. package/registry/ui/area-chart.tsx +3960 -0
  229. package/registry/ui/attention-list.tsx +465 -0
  230. package/registry/ui/avatar.tsx +110 -0
  231. package/registry/ui/badge.tsx +56 -0
  232. package/registry/ui/bar-chart.tsx +3954 -0
  233. package/registry/ui/bar-list.tsx +3998 -0
  234. package/registry/ui/box-plot-chart.tsx +4214 -0
  235. package/registry/ui/breadcrumb.tsx +128 -0
  236. package/registry/ui/button.tsx +62 -0
  237. package/registry/ui/calendar.tsx +223 -0
  238. package/registry/ui/card.tsx +107 -0
  239. package/registry/ui/category-bar.tsx +1498 -0
  240. package/registry/ui/chart-frame.tsx +1604 -0
  241. package/registry/ui/checkbox.tsx +30 -0
  242. package/registry/ui/collapsible.tsx +23 -0
  243. package/registry/ui/combobox.tsx +310 -0
  244. package/registry/ui/command.tsx +198 -0
  245. package/registry/ui/dashboard-card.tsx +217 -0
  246. package/registry/ui/data-table.tsx +896 -157
  247. package/registry/ui/date-range-picker.tsx +544 -0
  248. package/registry/ui/delta.tsx +350 -0
  249. package/registry/ui/dialog.tsx +161 -0
  250. package/registry/ui/donut-chart.tsx +4006 -0
  251. package/registry/ui/drawer.tsx +229 -0
  252. package/registry/ui/dropdown-menu.tsx +274 -0
  253. package/registry/ui/echart.tsx +1178 -0
  254. package/registry/ui/field.tsx +240 -0
  255. package/registry/ui/filter-bar.tsx +551 -0
  256. package/registry/ui/funnel-steps.tsx +3843 -0
  257. package/registry/ui/heatmap.tsx +2027 -0
  258. package/registry/ui/histogram-chart.tsx +4284 -0
  259. package/registry/ui/hover-card.tsx +52 -0
  260. package/registry/ui/input-group.tsx +160 -0
  261. package/registry/ui/input.tsx +24 -0
  262. package/registry/ui/kbd.tsx +30 -0
  263. package/registry/ui/kpi-card.tsx +905 -0
  264. package/registry/ui/label.tsx +22 -0
  265. package/registry/ui/legend.tsx +3817 -0
  266. package/registry/ui/line-chart.tsx +3958 -0
  267. package/registry/ui/metric-value.tsx +62 -0
  268. package/registry/ui/multi-select.tsx +382 -0
  269. package/registry/ui/page-shell.tsx +420 -0
  270. package/registry/ui/pagination.tsx +140 -0
  271. package/registry/ui/paired-chart.tsx +4086 -0
  272. package/registry/ui/placeholder.tsx +36 -0
  273. package/registry/ui/popover.tsx +92 -0
  274. package/registry/ui/progress-circle.tsx +1033 -0
  275. package/registry/ui/progress.tsx +85 -0
  276. package/registry/ui/radio-group.tsx +39 -0
  277. package/registry/ui/sample-data.tsx +230 -0
  278. package/registry/ui/scatter-chart.tsx +4503 -0
  279. package/registry/ui/scroll-area.tsx +56 -0
  280. package/registry/ui/searchable-select.tsx +352 -0
  281. package/registry/ui/section-header.tsx +43 -0
  282. package/registry/ui/segmented-control.tsx +76 -0
  283. package/registry/ui/select.tsx +255 -0
  284. package/registry/ui/separator.tsx +27 -0
  285. package/registry/ui/sheet.tsx +139 -0
  286. package/registry/ui/sidebar.tsx +725 -0
  287. package/registry/ui/skeleton.tsx +17 -0
  288. package/registry/ui/slider.tsx +56 -0
  289. package/registry/ui/sparkline.tsx +230 -0
  290. package/registry/ui/spinner.tsx +14 -0
  291. package/registry/ui/states.tsx +247 -0
  292. package/registry/ui/status-badge.tsx +286 -0
  293. package/registry/ui/switch.tsx +34 -0
  294. package/registry/ui/table.tsx +118 -0
  295. package/registry/ui/tabs.tsx +84 -0
  296. package/registry/ui/textarea.tsx +22 -0
  297. package/registry/ui/toast.tsx +250 -0
  298. package/registry/ui/toggle-group.tsx +91 -0
  299. package/registry/ui/toggle.tsx +47 -0
  300. package/registry/ui/tooltip.tsx +72 -0
  301. package/registry/ui/tracker.tsx +1015 -0
  302. package/registry/ui/trend-indicator.tsx +217 -0
  303. package/registry/ui/updated-at.tsx +276 -0
  304. package/registry/ui/waterfall-chart.tsx +4561 -0
  305. package/skills/vantage-add-feature/SKILL.md +14 -7
  306. package/skills/vantage-design/SKILL.md +62 -52
  307. package/skills/vantage-design/references/extract.md +26 -27
  308. package/skills/vantage-design/references/format.md +12 -172
  309. package/skills/vantage-design/references/presets.md +50 -110
  310. package/skills/vantage-pitfalls/SKILL.md +10 -1
  311. package/skills/vantage-slide/SKILL.md +71 -36
  312. package/templates/AGENTS.md +53 -16
  313. package/templates/agents/api.md +36 -0
  314. package/templates/agents/csv.md +2 -1
  315. package/templates/agents/doc.md +52 -3
  316. package/templates/agents/page.md +91 -10
  317. package/templates/agents/slide.md +90 -4
  318. package/templates/agents/xlsx.md +2 -1
  319. package/theme.css +247 -132
  320. package/dist/add-DY4AXANK.js +0 -6
  321. package/dist/add-DY4AXANK.js.map +0 -1
  322. package/dist/chunk-5ZOP4SQR.js +0 -47
  323. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  324. package/dist/chunk-A2UUGASH.js.map +0 -1
  325. package/dist/chunk-BCE22JSM.js.map +0 -1
  326. package/dist/chunk-DTDVSFRY.js +0 -29
  327. package/dist/chunk-DTDVSFRY.js.map +0 -1
  328. package/dist/chunk-EP6JHXSR.js.map +0 -1
  329. package/dist/chunk-JGRMRXXZ.js.map +0 -1
  330. package/dist/chunk-KLEIVDUV.js +0 -165
  331. package/dist/chunk-KLEIVDUV.js.map +0 -1
  332. package/dist/chunk-MP3QSOXL.js +0 -2232
  333. package/dist/chunk-MP3QSOXL.js.map +0 -1
  334. package/dist/chunk-PVTHHV7X.js.map +0 -1
  335. package/dist/chunk-PXRX5PEC.js.map +0 -1
  336. package/dist/chunk-QI3XQKHS.js.map +0 -1
  337. package/dist/chunk-RPZAALCX.js.map +0 -1
  338. package/dist/chunk-T3FLAGI6.js +0 -316
  339. package/dist/chunk-T3FLAGI6.js.map +0 -1
  340. package/dist/dev-FCEC3UKQ.js.map +0 -1
@@ -1,110 +1,50 @@
1
- # 初期デザインのプリセット
2
-
3
- プロジェクト作成時に選ぶ 4 つの出発点。**id(`default` / `calm` / `vivid` / `mono`)はプロジェクト
4
- 作成のワークフローが参照するので変えないこと。** どれも「チャートのプリセット 1 つ + `--primary` +
5
- `DESIGN.md` の差分」でできている。**`--primary` はどのプリセットでも必ず書く**(無彩色のプリセットも
6
- 値を明示する)。チャートだけ変えるとホームのような色の少ない画面では見た目が変わらず、別のプリセットから
7
- 切り替えたときに前の `--primary` が残るため。
8
-
9
- 適用の手順は共通:
10
-
11
- 1. `npx @squadbase/vantage-template chart <チャートのプリセット>` で `styles.css` のマーカーブロックを
12
- 差し替える。**マーカーブロックの中(`--chart-1..5`)は手で編集しない** ― コマンドの生成物で、
13
- 次の適用で消える。
14
- 2. 各プリセットの `--primary` / `--primary-foreground` を、`styles.css` のマーカーの**外**(先頭の
15
- `:root` ブロック)に `:root` と `.dark, [data-theme="dark"]` の両方で書く。既にある `--primary` は置き換える。
16
- 3. `DESIGN.md` を `format.md` の雛形から作り、下の「DESIGN.md の差分」の行だけを書き換える。
17
- 4. `scripts/contrast.mjs` で `--primary-foreground` / `--primary` をライトとダークで確かめる。
18
-
19
- | id | トーン | チャートのプリセット | `--primary` |
20
- | --- | --- | --- | --- |
21
- | `default` | 無彩色のベース。色を持つのはデータ(`blue` チャート)だけ | `blue` | 無彩色(`theme.css` の既定値を明示) |
22
- | `calm` | 落ち着いた寒色。報告書・経営向け | `ocean` | 深い青(スカイ 700 / 300) |
23
- | `vivid` | 明るい暖色。営業・マーケティング向け | `sunset` | 濃いオレンジ(オレンジ 700 / 400) |
24
- | `mono` | モノクロ。印刷・資料への貼り付け向け | `mono` | ジンク 900 / 200 |
25
-
26
- ## `default`
27
-
28
- - トーン: 落ち着いた無彩色のベースに、データだけが色を持つ業務ダッシュボード。装飾より読みやすさ。
29
- - チャート: `blue`(青 → ティール → フクシア → バイオレット → グレー)。
30
- - `--primary`(フレームワークの既定と同じ無彩色。他のプリセットから戻すときのために明示する):
31
-
32
- ```css
33
- :root {
34
- --primary: oklch(0.205 0 0);
35
- --primary-foreground: oklch(0.985 0 0);
36
- }
37
- .dark,
38
- [data-theme="dark"] {
39
- --primary: oklch(0.922 0 0);
40
- --primary-foreground: oklch(0.205 0 0);
41
- }
42
- ```
43
-
44
- - `DESIGN.md`: 雛形そのまま(`format.md` の雛形は `default` を説明している)。
45
-
46
- ## `calm`
47
-
48
- - トーン: 寒色でまとめた静かな画面。強調は控えめにし、数字と罫線で読ませる。
49
- - チャート: `ocean`(スカイ → シアン → インディゴ → ティール → スレート)。
50
- - `--primary`(チャートのスカイに揃えた深い青):
51
-
52
- ```css
53
- :root {
54
- --primary: var(--color-sky-700);
55
- --primary-foreground: oklch(0.985 0 0);
56
- }
57
- .dark,
58
- [data-theme="dark"] {
59
- --primary: var(--color-sky-300);
60
- --primary-foreground: oklch(0.205 0 0);
61
- }
62
- ```
63
-
64
- - `DESIGN.md` の差分: 「全体のトーン」を上の文に。チャートの色味を「スカイ → シアン → インディゴ →
65
- ティール → スレート」に。良い = `--chart-4`(ティール)。1 系列の強調は `--chart-1` + 残り `--chart-5`。
66
- 禁止: `--chart-1` と `--chart-2` を隣り合う細い線で並べる(どちらも明るい青系)。
67
-
68
- ## `vivid`
69
-
70
- - トーン: 明るく勢いのある暖色。KPI とトレンドを大きく見せ、強調色をはっきり使う。
71
- - チャート: `sunset`(オレンジ → アンバー → ローズ → イエロー → ストーン)。
72
- - `--primary`(オレンジ 600 は白文字で 4.5:1 に届かないので 700 を使う):
73
-
74
- ```css
75
- :root {
76
- --primary: var(--color-orange-700);
77
- --primary-foreground: oklch(0.985 0 0);
78
- }
79
- .dark,
80
- [data-theme="dark"] {
81
- --primary: var(--color-orange-400);
82
- --primary-foreground: oklch(0.205 0 0);
83
- }
84
- ```
85
-
86
- - `DESIGN.md` の差分: トーンを上の文に。主色の行を「濃いオレンジ」に。良い = 専用色なし(▲ と
87
- `--foreground`)、悪い = `--destructive`。禁止: `--chart-3`(ローズ)と `--destructive` を同じ
88
- チャートに置く(悪い値と区別できない)。1 系列の強調は `--chart-1` + 残り `--chart-5`。
89
-
90
- ## `mono`
91
-
92
- - トーン: 白黒と灰色だけ。色で意味を運ばず、太さ・順番・ラベルで読ませる。
93
- - チャート: `mono`(ジンク 900 → 200。ダークでは反転)。
94
- - `--primary`(チャートの両端と同じジンク):
95
-
96
- ```css
97
- :root {
98
- --primary: var(--color-zinc-900);
99
- --primary-foreground: oklch(0.985 0 0);
100
- }
101
- .dark,
102
- [data-theme="dark"] {
103
- --primary: var(--color-zinc-200);
104
- --primary-foreground: oklch(0.205 0 0);
105
- }
106
- ```
107
-
108
- - `DESIGN.md` の差分: トーンを上の文に。強調 = `--chart-1`(最も濃い灰)。良い = 専用色なし(▲ と
109
- 符号)、悪い = `--destructive`(**画面で唯一の有彩色**として使う)。チャートは系列を 3 つまでにし、
110
- それ以上は直接ラベルを付ける。禁止: 隣り合う `--chart-4` と `--chart-5`(明度差が小さい)。
1
+ # 初期デザイン(テーマ)
2
+
3
+ プロジェクトの見た目の出発点は、SquadKit の 7 テーマから選ぶ。**テーマ id はプロジェクト作成の
4
+ ワークフローが参照するので変えないこと。** テーマは主色・背景・文字・境界・チャート 5 色・角丸・書体を
5
+ まとめて持つ(ライトとダークの両方)。
6
+
7
+ | id | トーン | 向く場面 |
8
+ | --- | --- | --- |
9
+ | `neutral` | 既定。Vantage の素の見た目(青の主色と無彩色の面) | 迷ったとき・おまかせ |
10
+ | `ocean` | 青を基調にした落ち着いた信頼感。角丸はやや小さめ | 報告書・経営向け |
11
+ | `forest` | 緑を基調にした自然な印象。丸ゴシック系の書体、角丸はやや小さめ | 環境・ヘルスケア・自然 |
12
+ | `sunset` | 橙を基調にした温かみ。角丸はやや大きめ | 営業・マーケティング |
13
+ | `violet` | 紫を基調にしたやわらかい印象。角丸は大きめ | 華やかさ・ポップ |
14
+ | `rose` | 赤紫からピンクの落ち着いた色。角丸は大きめ(`--destructive` の赤とは別の色) | 華やかさ・ポップ |
15
+ | `mono` | 無彩色寄り。チャートも彩度を抑え、角丸は最小。等幅フォント | 印刷・資料への貼り付け |
16
+
17
+ ## 当てる
18
+
19
+ プロジェクトルートで次を実行する。`--dry-run` で書き込まずに結果を見られる。
20
+
21
+ ```bash
22
+ npx @squadbase/vantage-template theme <id>
23
+ npx @squadbase/vantage-template theme ocean --reset-chart # chart コマンドで選んだ配色を捨て、テーマのチャート色に揃える
24
+ ```
25
+
26
+ - `styles.css` の ``/* squadkit-theme — regenerated by `theme`; edits here are lost */`` 〜
27
+ `/* squadkit-theme:end */` の範囲(テーマ範囲)だけを差し替える。**範囲の中は手で編集しない**。
28
+ マーカーが無いファイルには自動で足される。同じ id を再実行しても変わらない。
29
+ - テーマ範囲はファイル先頭の `:root` より後ろに置かれ、同じ詳細度なら後ろが勝つ。
30
+ 先頭の `:root` に手書きした `--primary` などはテーマに負ける。
31
+ - `chart <preset>` の範囲(`--chart-*` だけ)はテーマ範囲の**後ろ**に置かれ、テーマのチャート色に勝つ。
32
+ チャートの配色もテーマに任せるなら `--reset-chart` で外す。
33
+
34
+ ## 旧プリセット id の読み替え
35
+
36
+ 古い呼び出しの `default` / `calm` / `vivid` / `mono` は、`theme` コマンドがそのまま受けて次の id として扱う。
37
+
38
+ | 旧 | 新 |
39
+ | --- | --- |
40
+ | `default` | `neutral` |
41
+ | `calm` | `ocean` |
42
+ | `vivid` | `sunset` |
43
+ | `mono` | `mono` |
44
+
45
+ ## テーマに無い値(ブランド色など)
46
+
47
+ テーマの `--primary` を変えたい、特定の色だけブランドに合わせたい、というときは、テーマを当てたうえで
48
+ **`/* squadkit-theme:end */`(チャート範囲があればその終端)より後ろ**に、変えたいトークンだけ
49
+ `:root` と `.dark, [data-theme="dark"]` の**両方**に書く。前に書くとテーマに負ける。
50
+ `scripts/contrast.mjs` で `--primary-foreground` / `--primary` をライトとダークで確かめる。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vantage-pitfalls
3
- description: Vantage(@squadbase/vantage)アプリを書くときに静かに壊れる落とし穴のリファレンス。Base UI は Radix ではない(asChild 無し・render プロップ)、Select の value/label、クライアントから server/ を import しない、EChart の配色と高さ、動的パラメータの3綴り同期、PUBLIC_ env、HttpError、csv/xlsx ページの URL 衝突とサイズ上限、スライドの data-waitfor など。Vantage の UI コンポーネントやルーティングが思った通りに動かないとき、ビルドやスタイルが静かに欠落するときに参照する。
3
+ description: Vantage(@squadbase/vantage)アプリを書くときに静かに壊れる落とし穴のリファレンス。Base UI は Radix ではない(asChild 無し・render プロップ)、Select の value/label、クライアントから server/ を import しない、チャートの色指定と EChart の配色・高さ、動的パラメータの3綴り同期、PUBLIC_ env、HttpError、csv/xlsx ページの URL 衝突とサイズ上限、スライドの data-waitfor など。Vantage の UI コンポーネントやルーティングが思った通りに動かないとき、ビルドやスタイルが静かに欠落するときに参照する。
4
4
  ---
5
5
 
6
6
  # Vantage アプリの落とし穴リファレンス
@@ -59,6 +59,10 @@ Base UI の `SelectValue` は選択中の **value をそのまま描き**、`Sel
59
59
 
60
60
  ## チャート:`EChart` の配色はトークン追従。上書きは `option.color`
61
61
 
62
+ ふつうの推移・比較・構成比は型付きチャート(`LineChart`・`BarChart` など。→ `agents/page.md`)で
63
+ 描く。その `colors` に渡すのはトークン名 `"chart-1"`〜`"chart-5"` か CSS 色で、Tailwind クラス
64
+ (`"bg-blue-500"` など)は効かない。以下は `EChart` を直接使うときの話。
65
+
62
66
  系列色は `--chart-1..5`、軸・凡例・ツールチップは文字色/境界色のトークンから組まれる
63
67
  (init 時にトークンの実値を解決している)。ライト / ダークの切り替えにも、`styles.css` の
64
68
  書き換えやテーマプリセットの適用にも追従する。
@@ -90,6 +94,11 @@ Base UI の `SelectValue` は選択中の **value をそのまま描き**、`Sel
90
94
  - 表示ルート `/sales/:customerId`
91
95
  - リンク `to="/sales/$customerId"` + `params={{ customerId }}` / 取り出し `useParams().customerId`
92
96
 
97
+ ## 日本語アプリは `lang` を指定する
98
+
99
+ ルート `src/_layout.tsx` に `export const lang = "ja"`(リテラル)が無いと `<html lang="en">` のままで、
100
+ スライドの見出しが文節の途中で折れる。内容が日本語なら必ず指定する。
101
+
93
102
  ## ページ:`definePage` の値はリテラルで書く
94
103
 
95
104
  title/description/navLabel は**ビルド時に静的抽出**される。変数・関数呼び出し・テンプレート補間を
@@ -43,20 +43,36 @@ export default function JuneDeck() {
43
43
 
44
44
  - **1 ファイル = 1 デッキ = 1 ルート。** `export default` は `<SlideDeck>` を返す React コンポーネント
45
45
  (通常のページと同じ契約なので、`vantage check` も `vantage routes` も特別扱いをしません)。
46
- - **スライドは `<SlideDeck>` の直下の `<Slide>`。** 深くネストした `<Slide>` は拾われません。
47
- - `definePage` の `title` / `navLabel` はビルド時に静的抽出されるので**リテラルで書く**(変数・
48
- テンプレート補間は不可)。ナビの表示名はこれで決まります。
46
+ - **ファイル形式の MUST / SHOULD(`<Slide>` は `<SlideDeck>` の直下、`<Step>` は `<Steps>` の直下、
47
+ `definePage` はリテラル など)は `agents/slide.md` と `agents/page.md` が正本**です。ここでは繰り返しません。
49
48
  - **`.slide` を付けられるのはルートになるページモジュールだけ。** `_layout.slide.tsx` や
50
49
  `deck.slide.ts` は `INVALID_PAGE_VARIANT` エラーになります。
51
50
  - **`june.slide.tsx` と `june.tsx` は同じ URL** になるので `ROUTE_CONFLICT` です。どちらかを消すこと。
51
+ - **ルート `/` がすでに他のページ(`index.tsx` など)で使われている場合、スライドは `index.slide.tsx` ではなく、タイトルから作った slug でファイル名を付ける。** `index.slide.tsx` と `index.tsx` は同じ `/` に解決して `ROUTE_CONFLICT` になる。
52
+ - 例: "Label check" → `src/label-check.slide.tsx` → `/label-check`
53
+ - 例: "Monthly Report" → `src/monthly-report.slide.tsx` → `/monthly-report`
52
54
  - **デッキファイル以外を作らない。** ヘルパーコンポーネントも定数も同じ `.slide.tsx` の中に書く。
53
55
  スライド専用のコンポーネントを `components/` に切り出すと、デッキ 1 本を読むのに 2 ファイル
54
56
  追わせることになります。
55
57
 
58
+ ## まず block を探す
59
+
60
+ 1 枚分の中身は、手で組む前に `@squadbase/vantage/slide` の block(`SlideCover` `SlideExecSummary`
61
+ `SlideKpiHero` `SlideKpiGrid` `SlideChartInsight` `SlideScorecardTable` `SlideNextActions` `SlideSection` `SlideComparison` `SlideChartFull`)に
62
+ 合うものがないか探します。`<Slide>` の**中**に置き、props は `vantage docs <name>`(例:
63
+ `vantage docs slide-cover`)で引く。一覧は `agents/slide.md` が正本です。
64
+ - props は block 間で共通: `value: number | null` + `format`(上書きだけ `display`)、`delta: { value, format? }` + `betterWhen` + `comparisonLabel`、`target: number`、`source` は文字列、`asOf` は日付だけ(「時点」は block が付ける)。
65
+
66
+ - block は `@squadbase/vantage/slide` から import する。**新しい import 元は増えない**(下の
67
+ 「import してよいもの」と矛盾しない)。`vantage add` でコピーするものでもない。
68
+ - block が合わない**1 枚だけ**を、この下の規約で手書きする。デッキ全体を手書きに切り替えない。
69
+ - デッキ以外のファイルは作らない。block を使っても、デッキは 1 ファイルのままで、独自の
70
+ ヘルパーコンポーネントは同じ `.slide.tsx` に書く。
71
+
56
72
  ## import してよいもの
57
73
 
58
74
  - `@squadbase/vantage/slide` — `SlideDeck` `Slide` `Steps` `Step` `MorphElement` `useSlideNumber`
59
- `useIsActiveSlide` `SlideCanvas` と、その型
75
+ `useIsActiveSlide` `SlideCanvas`、1 枚分の block(`SlideCover` ほか上の 10 個)、手書きの 1 枚に使う部品(`SlideHeading` `SlideSourceLine` `SlideColumns` `SlideColumn` `DeltaText`)と、その型
60
76
  - `@squadbase/vantage` — `definePage`
61
77
  - `@squadbase/vantage/components` の `EChart` — **チャートを載せるときはこれ**(→「チャート」)
62
78
  - `lucide-react` のアイコン
@@ -74,21 +90,25 @@ export default function JuneDeck() {
74
90
  - 各スライドのルート要素はキャンバスを埋める(`width: "100%"; height: "100%"`)
75
91
  - インライン `style={{ … }}` を使う。読み込んだ CSS はグローバルです
76
92
 
77
- ### タイプスケール(ここから始めて調整する)
93
+ 以下の値がスライドの規約です。ヒーローと本文は `var(--slide-size-hero)` /
94
+ `var(--slide-size-body)` としても読めます(→ `references/tokens.md`)。
95
+
96
+ ### タイプスケール
78
97
 
79
98
  | 要素 | サイズ |
80
99
  | --- | --- |
81
- | ヒーロータイトル | 140–200px |
82
- | セクション見出し | 80–120px |
83
- | ページ見出し | 56–80px |
84
- | 本文 | 32–44px |
85
- | キャプション / ラベル | 22–28px |
100
+ | ヒーロータイトル | 168px |
101
+ | セクション見出し | 88px |
102
+ | ページ見出し | 64px |
103
+ | 本文 | 36px |
104
+ | キャプション / ラベル | 24px |
86
105
 
87
- ### 余白
106
+ ### 余白とグリッド
88
107
 
89
- - コンテンツの padding: キャンバス端から **100–160px**。文字を端に触れさせない
90
- - line-height: 見出し 1.2、本文 1.5–1.7
91
- - 要素間: 32–64px
108
+ - セーフエリア: キャンバス端から **左右 160px・上下 120px**。中身はこの内側の **1600 × 840px** に置き、文字を端に触れさせない
109
+ - グリッド: 内容幅 1600px を **12 列**(列幅 104px・溝 32px)に割る
110
+ - line-height: 見出し 1.2、本文 1.6
111
+ - 要素間: 32 / 48 / 64px のどれか
92
112
 
93
113
  ### 縦方向の予算 — 中身は 1080px に収まらなければならない
94
114
 
@@ -96,33 +116,32 @@ export default function JuneDeck() {
96
116
  計算して収まることを確かめること。**これがスライドが壊れる原因の第 1 位**で、確かめない限り
97
117
  溢れていると思ってください。
98
118
 
99
- **使える高さ** = `1080 − 上 padding − 下 padding`。上下 120px なら **840px**、160px なら **760px**。
100
- 先に padding を決めて、その予算の中で設計します。
119
+ **使える高さ** = `1080 − 上下のセーフエリア(120px × 2)` = **840px**。この予算の中で設計します。
101
120
 
102
121
  **要素の高さ** = `文字サイズ × line-height × 行数`。2 行に折り返す箇条書きは 2 行と数えます。
103
- 次の要素を足す前に、その下の gap(32–64px)を加算してください。
122
+ 次の要素を足す前に、その下の gap(32 / 48 / 64px)を加算してください。
104
123
 
105
- **計算例 — 本文 1 枚、padding 120px(予算 840px):**
124
+ **計算例 — 本文 1 枚(予算 840px):**
106
125
 
107
126
  | 要素 | 高さ |
108
127
  | --- | --- |
109
- | 見出し: 80px × 1.2 × 1 行 | 96px |
128
+ | ページ見出し: 64px × 1.2 × 1 行 | 76.8px |
110
129
  | gap | 64px |
111
- | 本文: 40px × 1.6 × 3 行 | 192px |
130
+ | 本文: 36px × 1.6 × 3 行 | 172.8px |
112
131
  | gap | 48px |
113
- | 箇条書き 5 行: 40px × 1.6 × 1 行 | 320px(5 × 64px) |
114
- | 箇条書き間の gap 4 つ: 24px | 96px |
115
- | **合計** | **816px ✅ 840 に収まる** |
132
+ | 箇条書き 5 行: 36px × 1.6 × 1 行 | 288px(5 × 57.6px) |
133
+ | 箇条書き間の gap 4 つ: 32px | 128px |
134
+ | **合計** | **777.6px ✅ 840 に収まる** |
116
135
 
117
- 見出しを 120px にするか箇条書きを 6 つにすると溢れます。**書く前に毎ページこの検算をすること。**
136
+ 箇条書きを 6 つにすると 867.2px で溢れます。**書く前に毎ページこの検算をすること。**
118
137
 
119
138
  **ページ単位の規則:**
120
139
 
121
140
  - 「見出し + 本文」か「見出し + 5 つ以内の短い箇条書き」のどちらか。両方は載せない
122
141
  - 箇条書きは選んだ文字サイズで 1 行に収まること。折り返すなら短くするか別ページに割る
123
- - ヒーロータイトル(140–200px)はタイトル + サブタイトル 1 行 + アイブロウまで。それ以外は載せない
124
- - セクション見出し(80–120px)のページにはほとんど何も足さない
125
- - 収めるために padding を上げる・スケールの下限より小さい文字にする・本文の line-height を 1.4 未満に
142
+ - ヒーロータイトル(168px)はタイトル + サブタイトル 1 行 + アイブロウまで。それ以外は載せない
143
+ - セクション見出し(88px)のページにはほとんど何も足さない
144
+ - 収めるためにセーフエリアを削る・タイプスケールより小さい文字にする・本文の line-height を 1.6 未満に
126
145
  詰める、をやりたくなったら**ページを 2 枚に割る**。予算が厳しいときは分割が常に正解
127
146
 
128
147
  **`overflow: auto/scroll`・負のマージン・transform で溢れを隠さないこと。** キャンバスは固定で、
@@ -136,7 +155,7 @@ export default function JuneDeck() {
136
155
  それ以外はプレーンな const にする(→ `references/tokens.md`)
137
156
  - **書体** — ディスプレイ 1 + 本文 1。指定がなければシステムスタック。見出しは太く(800–900)、
138
157
  本文は通常(400–500)
139
- - **レイアウトグリッド** — padding を 1 つ決めて(例: 120px)貫く。左揃えは編集的、中央揃えは儀礼的
158
+ - **レイアウトグリッド** — セーフエリアと 12 列グリッド(→「余白とグリッド」)を全ページで貫く。左揃えは編集的、中央揃えは儀礼的
140
159
  - **美学のコミットメント** — 1 つ選ぶ: ミニマル / マキシマル / エディトリアル / レトロ /
141
160
  ブルータリスト / ソフト・パステル / ネオン / 紙・印刷。混ぜない
142
161
 
@@ -149,12 +168,12 @@ export default function JuneDeck() {
149
168
  // ✅ 各カードが独自の JSX ノードを持つ
150
169
  const Card = ({ label, value }: { label: string; value: string }) => (
151
170
  <div style={{ flex: 1 }}>
152
- <div style={{ fontSize: 28, opacity: 0.6 }}>{label}</div>
153
- <div style={{ fontSize: 120, fontWeight: 800 }}>{value}</div>
171
+ <div style={{ fontSize: 24, opacity: 0.6 }}>{label}</div>
172
+ <div style={{ fontSize: 88, fontWeight: 800 }}>{value}</div>
154
173
  </div>
155
174
  )
156
175
 
157
- <div style={{ display: "flex", gap: 96 }}>
176
+ <div style={{ display: "flex", gap: 64 }}>
158
177
  <Card label="売上" value="¥5.2億" />
159
178
  <Card label="解約率" value="1.4%" />
160
179
  </div>
@@ -166,6 +185,8 @@ const Card = ({ label, value }: { label: string; value: string }) => (
166
185
 
167
186
  これは**視覚要素が繰り返すとき**の話で、データが繰り返すときの話ではありません。純粋な
168
187
  テキストの箇条書き(`<ul><li>`)は各 `<li>` が既に独立した JSX ノードなので、そのままで正しい。
188
+ `<SlideDeck>` の直下に `<Slide>` を配列で渡すこと自体はファイル形式として可能です(`agents/slide.md`)が、
189
+ 1 枚ごとの文言・図を変えるスライドは 1 枚ずつ書きます。
169
190
 
170
191
  ## ページ番号
171
192
 
@@ -194,6 +215,17 @@ pptx 書き出しのために描き終わりを待たせる必要があります
194
215
  チャートに色をハードコードしないこと(`option.color` / `itemStyle.color` / `theme`)。
195
216
  `EChart` はテーマトークンに追従します。
196
217
 
218
+ ## 説明と図表を同じデータ時点へ揃える
219
+
220
+ 分析を共有するデッキでは、本文・数値・図表が**同じ対象期間と同じ取得時点の結果**を参照していることを
221
+ 確かめます。
222
+
223
+ - 対象期間とデータ取得時点を、該当ページかフッターに短く表示する(例: 「2026年6月 / 7月1日 9:00 取得」)
224
+ - **固定した説明文に対して図表だけが最新値へ変わる構成を避ける。** ライブ更新を意図するなら、本文の
225
+ 数値・結論も同じ取得結果から導いて、図表と一緒に変わる構成にする
226
+ - 同一時点の結果を保持・参照できない場合は、スナップショットとして保存できたとは報告しない。
227
+ 必要な保持の仕組みと、現在保証できない範囲(例: 再表示すると図表だけ最新値になる)を伝える
228
+
197
229
  ## 実行時に無料で付いてくるもの
198
230
 
199
231
  - `src/june.slide.tsx` → `/june`。ナビ(`useRoutes()`)に通常のページと同格で並ぶ
@@ -236,14 +268,15 @@ pptx 書き出しのために描き終わりを待たせる必要があります
236
268
  - [ ] `export default` が `<SlideDeck>` を返している
237
269
  - [ ] `<Slide>` が `<SlideDeck>` の直下にある
238
270
  - [ ] 各スライドのルート要素が `100% × 100%` を埋めている
239
- - [ ] 文字が padding の内側にある(端に触れていない)
240
- - [ ] **全ページで(文字サイズ × line-height × 行数)+ gap + padding×2 ≤ 1080px。** 際どいなら分割
271
+ - [ ] 文字がセーフエリア(左右 160px・上下 120px)の内側にある
272
+ - [ ] **全ページで(文字サイズ × line-height × 行数)+ gap ≤ 840px。** 際どいなら分割
241
273
  - [ ] 箇条書きが 2 行目に折り返していない
242
274
  - [ ] 配色とタイプスケールが全ページで一貫している
243
275
  - [ ] 1 ページ 1 メッセージ
244
276
  - [ ] 繰り返す視覚要素が `array.map` ではなく明示的な `<Component />` になっている
245
277
  - [ ] ページ番号が `useSlideNumber()` から来ている(ハードコードしていない)
246
278
  - [ ] チャートが `data-waitfor="canvas"` で包まれている
279
+ - [ ] 本文・数値・図表が同じ対象期間と取得時点の結果を参照し、その期間と時点が表示されている
247
280
  - [ ] `<Steps>` を使ったページが、`?p=` で直接開いても完成した絵として読める
248
281
  - [ ] トランジションを宣言したなら、全ページが 1 つの family に収まっている(→ `references/transitions.md`)
249
282
  - [ ] `definePage` の値がリテラルである
@@ -252,13 +285,15 @@ pptx 書き出しのために描き終わりを待たせる必要があります
252
285
  ## アンチパターン
253
286
 
254
287
  - ❌ 文字の壁。1 ページ 40 語を超えたら分割する
255
- - ❌ キャンバス全面を本文で使う。padding 100–160px を守る
288
+ - ❌ キャンバス全面を本文で使う。セーフエリア(左右 160px・上下 120px)を守る
256
289
  - ❌ 縦に 1080px を溢れさせる。切れた中身は見えない — 分割する
257
290
  - ❌ `overflow: auto` / `scroll` / `hidden` で溢れを「隠す」。バグを隠しただけ
258
- - ❌ 詰め込むためにスケールの下限より小さい文字にする・padding を 100px 未満にする
259
- - ❌ 本文 28px 未満。プロジェクタで読めない
291
+ - ❌ 詰め込むためにタイプスケールより小さい文字にする・セーフエリアを削る
292
+ - ❌ 本文を 36px 未満にする。プロジェクタで読めない
260
293
  - ❌ `@squadbase/vantage/ui` のプリミティブをスライドに置く(縮小されて読めなくなる)
261
294
  - ❌ 依存を追加する。使えるのは `@squadbase/vantage/*` と `lucide-react` と標準 Web API だけ
262
295
  - ❌ スライド用のコンポーネントを別ファイルに切り出す
263
296
  - ❌ チャートに `data-waitfor="canvas"` を付け忘れる(pptx が白紙になる)
264
297
  - ❌ プリミティブを `references/*.md` を読まずに使う
298
+ - ❌ 説明文を固定したまま図表だけライブデータで描く(再表示すると本文と図表の時点がずれる)
299
+ - ❌ 同一時点の結果を保持できていないのに「スナップショットとして保存した」と報告する
@@ -7,8 +7,8 @@
7
7
  > このファイルと `agents/*.md` は、いずれも **Vantage フレームワークが所有する正本**の
8
8
  > コピーです。手で書き換えても、`vantage upgrade` を実行するとフレームワーク同梱の正本から
9
9
  > 再同期されて上書きされます。アプリ固有のメモは別ファイル(例: `README.md`)に書いてください。
10
- > 例外はプロジェクトルートの `DESIGN.md` で、これは**ユーザーが所有**します(`vantage upgrade` も
11
- > `vantage add agents` も触らない。→「デザインの意図(DESIGN.md)」)。
10
+ > 例外はプロジェクトルートの任意の `DESIGN.md` で、これは**ユーザーが所有**します(`vantage upgrade` も
11
+ > `vantage add agents` も触らない。→「見た目の規約」)。
12
12
  >
13
13
  > 手順を伴う踏み込んだワークフローは、同梱の Claude Code Skill に分かれています。このファイルは
14
14
  > 「地図」、`agents/*.md` は「種類ごとの静的リファレンス」、Skill は「手順書」という役割分担です。
@@ -47,6 +47,9 @@ UI キット・開発サーバー・API サーバー・ビルドはすべて Van
47
47
  - **`definePage` の値はリテラルで書く。** title/description/navLabel はビルド時に静的抽出される
48
48
  ため、変数・関数呼び出し・テンプレート補間は使わない。`page` エクスポートはランタイムでは
49
49
  読まれない。
50
+ - **アプリの表示言語は、ルート `_layout.tsx` の `export const lang = "en"`(リテラル。BCP 47)で指定する。**
51
+ `<html lang>` になり、日本語の文節改行とスライドの文言切り替えに効く。未指定は `"en"`。
52
+ 画面の文言・docs・コメントは、ユーザーが使う言語に合わせる(`lang` もその言語にする)。
50
53
 
51
54
  ## ディレクトリ構造(ページをどこに置くか)
52
55
 
@@ -93,13 +96,25 @@ root/
93
96
  | `@squadbase/vantage/router` | `Link`・`Outlet`・`useParams`・`useSearch`・`useNavigate`・`redirect`・`notFound`・`useRoutes`・`useCurrentRoute`・`useSearchParam`・`useSearchState` |
94
97
  | `@squadbase/vantage/query` | `useApiQuery`・`useApiMutation`・`apiJson`・`apiFetch`・`apiUrl`・`ApiError`、ほか `useQuery`/`useMutation` など TanStack Query の再エクスポート |
95
98
  | `@squadbase/vantage/ui` | shadcn/ui(Base UI バリアント)プリミティブ(`Button`・`Loading`・`ErrorState`・`Empty` ほか) |
96
- | `@squadbase/vantage/components` | 複合パーツ(`PageShell`・`DashboardCardPreset`・`DataTablePreset`・`EChart` ほか) |
99
+ | `@squadbase/vantage/components` | 複合パーツ(`PageShell`・`DashboardCardPreset`・`DataTablePreset`、KPI の `KpiCard`・`Delta`、型付きチャート `LineChart`・`BarChart`・`AreaChart`・`DonutChart`・`BarList` ほか、`EChart`、書式の `formatValue`) |
97
100
  | `@squadbase/vantage/table` | `FilePageView`・`TableViewer`(データファイルページの表ビューア) |
98
- | `@squadbase/vantage/slide` | `SlideDeck`・`Slide`・`Steps`・`Step`・`MorphElement`・`useSlideNumber`・`useIsActiveSlide`(スライド専用。1920×1080 の固定キャンバス) |
99
- | `@squadbase/vantage/doc` | `Document`(ドキュメント専用。中の素の HTML 要素に見出し・表などのスタイルが当たる) |
101
+ | `@squadbase/vantage/slide` | `SlideDeck`・`Slide`・`Steps`・`Step`・`MorphElement`・`useSlideNumber`・`useIsActiveSlide`、1 枚分の block `SlideCover`・`SlideExecSummary`・`SlideKpiHero`・`SlideKpiGrid`・`SlideChartInsight`・`SlideScorecardTable`・`SlideNextActions`・`SlideSection`・`SlideComparison`・`SlideChartFull`、手書きの 1 枚に使う部品 `SlideHeading`・`SlideSourceLine`・`SlideColumns`・`SlideColumn`・`DeltaText`(スライド専用。1920×1080 の固定キャンバス) |
102
+ | `@squadbase/vantage/doc` | `Document`、ドキュメント用の block `DocReportHeader`・`DocExecutiveSummary`・`DocKpiScorecard`・`DocFigure`・`DocDataTable`・`DocCallout`・`DocKeyFindings`・`DocActionItems`・`DocNotesAndSources`、部品 `DeltaText`(ドキュメント専用。中の素の HTML 要素に見出し・表などのスタイルが当たる) |
100
103
  | `@squadbase/vantage/markdown` | `MarkdownRenderer`(Shiki を隔離するための専用サブパス) |
101
104
  | `@squadbase/vantage/server` | `ApiContext`・`ApiHandler`・`HttpError`・`isHttpError`・`json`(server/ 側でのみ使う) |
102
105
 
106
+ **KPI は `KpiCard`、増減は `Delta`(`comparison` を渡し、下がって良い指標は `betterWhen="down"`)。** 向き・率・色は値から計算
107
+ されるので手で渡さない。`TrendIndicator` は非推奨(`direction` を手で渡すので値と食い違いうる)。props は
108
+ `vantage docs kpi-card` / `vantage docs delta` を引く。
109
+
110
+ ```tsx
111
+ import { KpiCard, Delta } from "@squadbase/vantage/components";
112
+
113
+ <KpiCard label="売上" value={48_200_000} format="currency"
114
+ comparison={{ previous: 42_900_000, vs: "prior-period" }} />
115
+ <Delta value={0.021} comparison={{ previous: 0.026, vs: "prior-period" }} polarity="lower-is-better" />
116
+ ```
117
+
103
118
  ## モードは 2 つ、切り替えるのは `server/` の有無だけ
104
119
 
105
120
  `server/` ディレクトリがあれば **fullstack**、無ければ **SPA**。`vantage-manifest.json` の
@@ -111,17 +126,30 @@ root/
111
126
  - `server/` が**無い** → 外部 API を直接叩くなら `useQuery`(→ `agents/page.md`)。自前の API が
112
127
  要るようになったら `server/api/*.ts` を足すだけでよい(設定変更は不要)。
113
128
 
114
- ## デザインの意図(DESIGN.md)
129
+ ## 見た目の規約
115
130
 
116
- プロジェクトルートに `DESIGN.md` があれば、**UI(ページ・スライド・コンポーネント)を書く前に
117
- 読む。** 色・チャート・書体・レイアウトの使い分けがトークン名で書いてあるので、それに従って
118
- トークンで書く(値は `styles.css` にあり、`DESIGN.md` には色コードを書かない)。
131
+ 色・書体・角丸などの**値と色の割り当ては、テーマ(`styles.css` の `/* theme: <name> */` マーカー以降の
132
+ 上書き)だけが持つ。** ここには値を書かず、使い分けの規則だけを置く。UI(ページ・スライド・
133
+ コンポーネント)はこの規則に従い、色は必ずトークンで指定する(色コード・素のパレットクラスは書かない)。
119
134
 
120
- - **会話中の指示は `DESIGN.md` より優先する。** 同じ指示が繰り返されたら、`DESIGN.md` への
121
- 反映をユーザーに提案する。
122
- - **「色を変えて」「ブランドに合わせて」などデザイン全体の変更は、ファイルごとに直さない。**
123
- Skill `vantage-design` の手順で `DESIGN.md` と `styles.css` をまとめて更新する。
124
- - `DESIGN.md` はユーザーの持ち物。`vantage upgrade` は書き換えない。
135
+ - **意味トークン:** 良い = `positive`、悪い = `negative`、注意 = `warning`、情報 = `info`、
136
+ 中立 = `neutral`。系列色は `chart-1`〜`chart-5` を番号順に使う(5 系列まで。超えるなら「その他」に
137
+ まとめる)。増減の良否は指標の性質(コスト減・解約率減は良い)で決めて
138
+ positive / negative に分け(`KpiCard` / `Delta` の `betterWhen`。下がって良い指標は `betterWhen="down"`)、向きは ▲▼ や符号で表す。
139
+ - **レイアウト:** 内容はカードで包む。順序は KPI → チャート → 表。値が 1 つなら KPI にする
140
+ (1 本の棒グラフにしない)。強調は 1 画面(スライドは 1 枚)に 1 か所。数値には単位と比較対象を添える。
141
+ - **Do:** トークンで色を指定する / 色の意味をアプリ全体でそろえる / チャートのタイトルに結論を書く。
142
+ - **Don't:** 色コードや素のパレットクラスを書く / `dark:` を並べる / 3D・装飾目的のグラデーション・
143
+ 円グラフの多用 / 同じチャートで `negative` を普通の系列色に使う。
144
+ - スライド固有の規則は `agents/slide.md`。
145
+
146
+ **任意の `DESIGN.md`:** プロジェクトルートにあれば読んで従う(密度・スライドの見出し方針・
147
+ ブランド素材などユーザー固有の意図)。AGENTS.md の規則に加えて従うが、**色の割り当てはテーマを優先**
148
+ する。新規には作らない。ユーザーの持ち物で、`vantage upgrade` は書き換えも削除もしない。
149
+
150
+ **デザイン変更の依頼**(「もっと落ち着いた色に」「ブランドに合わせて」など)は、ファイルごとに
151
+ 直さず、テーマの切り替えかスタイルシートの上書きで完結させる。`DESIGN.md` には記録しない。今のテーマ名は
152
+ `styles.css` の `/* theme: <name> */` マーカーから読む。手順は Skill `vantage-design`。
125
153
 
126
154
  ## 何を書くか → どのファイルを読むか
127
155
 
@@ -137,6 +165,15 @@ root/
137
165
  | `.xlsx` ページ | `agents/xlsx.md` |
138
166
  | `.csv` ページ | `agents/csv.md` |
139
167
 
168
+ **ページになるのは `.tsx` / `.jsx`(`.slide.tsx`・`.doc.tsx` を含む)・`.csv`・`.xlsx` だけ。**
169
+
170
+ - `.xls`・`.xlsm`・`.xlsb`・`.ods`・`.tsv`・`.numbers`・`.parquet` はルートにならず、404 にもならない。
171
+ `vantage check` の `UNSUPPORTED_PAGE_FILE` 警告だけが知らせる。`.xlsx` / `.csv` に変換して置く
172
+ - `.md`・`.json`・`.txt` は何も言わずに無視される。Markdown を見せたいときは `.tsx` のページで
173
+ `MarkdownRenderer`(`@squadbase/vantage/markdown`)に渡す
174
+ - `.csv` / `.xlsx` はブラウザでパースする。25MB を超えるとそのページにエラーが出る
175
+ (`FILE_PAGE_TOO_LARGE` 警告)。20 万行を超えるシートは先頭 20 万行だけが表示される
176
+
140
177
  ## 環境変数
141
178
 
142
179
  - **クライアントで読めるのは `import.meta.env.PUBLIC_*` と `MODE`/`DEV`/`PROD`/`SSR`/`BASE_URL`
@@ -151,7 +188,7 @@ vantage docs button # 1 ページ表示(短縮名。ui/button に解
151
188
  vantage docs parts/data-table # 完全な slug でも引ける
152
189
  vantage docs data-table --json # { slug, title, description, section, content }
153
190
  vantage docs --all # 全ページを連結(まとめて読み込む用)
154
- vantage docs routing --lang en # 英語版(既定は ja)
191
+ vantage docs routing --lang en # 英語版(`--lang` 省略時は ja。アプリの文言の言語とは無関係)
155
192
  ```
156
193
 
157
194
  props の表・使用例・落とし穴はコンポーネントのページに載っている。**推測で props を書く前に
@@ -189,7 +226,7 @@ body・レスポンスの status と形)まで出る。`vantage check --json` /
189
226
  - **`vantage-app`** — アプリを一から作る / 構成を広げるときの進め方と検証の順序
190
227
  - **`vantage-add-feature`** — 既存アプリに page / api / ui を 1 つ足す定型
191
228
  - **`vantage-slide`** — `.slide.tsx` でスライドデッキを書く(キャンバスの予算・段階表示・pptx 書き出し)
192
- - **`vantage-design`** — `DESIGN.md` と `styles.css` をまとめて作る / 直す(配色・書体・ブランド合わせ)
229
+ - **`vantage-design`** — テーマの切り替え・`styles.css` の上書きで見た目を直す(配色・書体・ブランド合わせ)
193
230
  - **`vantage-pitfalls`** — Base UI(≠ Radix)の癖など、静かに壊れる落とし穴のリファレンス
194
231
  - **`project-storage`** — Squadbase の Project Storage(アップロード済みファイル)をブラウザから読み書きする
195
232
 
@@ -25,8 +25,16 @@ export async function GET({ params, env }: ApiContext) {
25
25
  エクスポートする。それ以外の名前は `INVALID_API_EXPORT` エラー。
26
26
  - 動的 API も `[id].ts` 記法: `server/api/customers/[id].ts` → `GET /api/customers/:id`。
27
27
  `params.id` で取り出す(`noUncheckedIndexedAccess` が効くので narrowing が要る)。
28
+ - **`noUncheckedIndexedAccess` は配列・レコードの添字すべてに効く。** `arr[0]` も `obj[key]` も
29
+ `T | undefined` になる。最初に書く前に、添字アクセスと `useApiQuery` の `data` が
30
+ undefined を扱っているかを頭の中で型検査してから書く。上流の生の応答の値は
31
+ `Number(row.metricValues?.[0]?.value ?? "0")` のように `?.` と `??` で取り出す
32
+ (`!` で黙らせない)。
28
33
  - **クライアントに見せたいエラーは `HttpError(status, msg)` を throw する。** それ以外の throw は
29
34
  ログに記録され汎用の 500 に丸められる。
35
+ - **入力の誤りは 400 で返し、`msg` には何がどう誤りかを書く。** `msg` はそのまま `ErrorState` に
36
+ 出る。「開始日(10/20)が終了日(10/01)より後です」のように、利用者が条件を直せる文にする。
37
+ 許す範囲だけを並べた文(「最大366日で指定」)では、どこを直せばよいか伝わらない。
30
38
  - **シークレットは `ApiContext.env` にだけ届く**(クライアントには決して届かない)。
31
39
 
32
40
  クライアント側からは `useApiQuery` で `/api/*` を叩く。ベース URL の解決・JSON パース・
@@ -34,9 +42,12 @@ export async function GET({ params, env }: ApiContext) {
34
42
 
35
43
  ```tsx
36
44
  import { useApiQuery, useApiMutation } from "@squadbase/vantage/query"
45
+ import { Loading, ErrorState } from "@squadbase/vantage/ui"
37
46
 
38
47
  const q = useApiQuery<Customer>(`/api/customers/${customerId}`)
48
+ if (q.isPending) return <Loading />
39
49
  if (q.isError) return <ErrorState message={q.error.message} /> // HttpError のメッセージ
50
+ q.data // ここで初めて Customer(undefined ではない)
40
51
 
41
52
  // クエリ文字列は search で。undefined の項目は落ちる
42
53
  const rows = useApiQuery<Row[]>("/api/customers", { search: { segment } })
@@ -45,5 +56,30 @@ const rows = useApiQuery<Row[]>("/api/customers", { search: { segment } })
45
56
  const save = useApiMutation<Customer, Payload>("/api/customers", { method: "POST" })
46
57
  ```
47
58
 
59
+ **`data` は、同じ結果オブジェクトで `isPending` と `isError` を判定したあとでしか
60
+ narrowing されない。** 判定前や、配列の `.find` などでまとめた判定のあとでは `T | undefined` のまま。
61
+ 複数のクエリは 1 本ずつ判定してから `data` を使う(`data!` で黙らせない):
62
+
63
+ ```tsx
64
+ const sessions = useApiQuery<SessionsDaily[]>("/api/sessions-daily")
65
+ const metrics = useApiQuery<MetricsDaily[]>("/api/metrics-daily")
66
+
67
+ if (sessions.isPending || metrics.isPending) return <Loading />
68
+ if (sessions.isError) return <ErrorState message={sessions.error.message} />
69
+ if (metrics.isError) return <ErrorState message={metrics.error.message} />
70
+ // ここから sessions.data: SessionsDaily[] / metrics.data: MetricsDaily[]
71
+ return <Chart sessions={sessions.data} metrics={metrics.data} />
72
+
73
+ // NG: const failed = [sessions, metrics].find((q) => q.isError) のように配列でまとめて判定すると
74
+ // 各 q.data は narrowing されず、`T[] | undefined` を T[] の props に渡して型エラーになる
75
+ ```
76
+
77
+ カードごとに別々に読み込み中・エラーを出すなら、`data` を渡す側で `q.data ?? []` にするか、
78
+ カードのコンポーネントの中で上と同じ判定をする。
79
+
80
+ 期間などの絞り込みを持つページでは、上の早期 return をページの先頭に置かない。失敗したときに
81
+ 絞り込みの欄まで消え、条件を直せなくなる。判定はデータを描く子コンポーネントの中で行う
82
+ (→ `agents/page.md` の「絞り込みの欄は、読み込み中も失敗したときも出し続ける」)。
83
+
48
84
  `ApiError` は `message`・`status`・`body`・`requestId` を持つ。hook が使えない場所では
49
85
  `apiJson(path, init)`、生の `Response` が要るときは `apiFetch`。
@@ -27,6 +27,7 @@
27
27
  ```
28
28
  - 数式・グラフ・セル書式といった概念は csv には無いので、値がそのまま読めます。ブラウザで
29
29
  パースするので 25MB を超えるファイルはそのページにエラーが出ます —— 大きいデータは
30
- `server/api/` から配って `DataTable` で描いてください
30
+ `server/api/` から配って `DataTable` で描いてください。20 万行を超えると先頭
31
+ 20 万行だけが表示されます(残りはダウンロードして見る)
31
32
  - **ビューアの無い拡張子(`.tsv` など)はルートになりません。** `vantage check` の
32
33
  `UNSUPPORTED_PAGE_FILE` 警告が知らせます