@squadbase/vantage 0.6.1 → 0.6.2-dev1.0017a4d

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 (319) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-O5TVNH4E.js → build-X5NVCQKT.js} +9 -9
  4. package/dist/{build-O5TVNH4E.js.map → build-X5NVCQKT.js.map} +1 -1
  5. package/dist/{check-WFBEDHDR.js → check-ZBIH422T.js} +7 -7
  6. package/dist/{check-WFBEDHDR.js.map → check-ZBIH422T.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-2ICNHUG6.js +1820 -0
  10. package/dist/chunk-2ICNHUG6.js.map +1 -0
  11. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  12. package/dist/chunk-2N72FKLB.js.map +1 -0
  13. package/dist/chunk-57GHR5LN.js +163 -0
  14. package/dist/chunk-57GHR5LN.js.map +1 -0
  15. package/dist/{chunk-BCE22JSM.js → chunk-7DZGJQ3P.js} +33 -14
  16. package/dist/chunk-7DZGJQ3P.js.map +1 -0
  17. package/dist/{chunk-MXI3PZFT.js → chunk-7S52M2SL.js} +257 -210
  18. package/dist/chunk-7S52M2SL.js.map +1 -0
  19. package/dist/{chunk-QDZA5JSL.js → chunk-AABMKHEU.js} +4 -4
  20. package/dist/{chunk-QDZA5JSL.js.map → chunk-AABMKHEU.js.map} +1 -1
  21. package/dist/{chunk-KLEIVDUV.js → chunk-CEXAQQ5W.js} +150 -11
  22. package/dist/chunk-CEXAQQ5W.js.map +1 -0
  23. package/dist/{chunk-3G43C6OL.js → chunk-GNXCX4WE.js} +46 -3
  24. package/dist/chunk-GNXCX4WE.js.map +1 -0
  25. package/dist/{chunk-JGRMRXXZ.js → chunk-JKLLFVEU.js} +3 -3
  26. package/dist/{chunk-JGRMRXXZ.js.map → chunk-JKLLFVEU.js.map} +1 -1
  27. package/dist/chunk-JXFCSF3K.js +673 -0
  28. package/dist/chunk-JXFCSF3K.js.map +1 -0
  29. package/dist/chunk-PDOBHMUQ.js +54 -0
  30. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  31. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  32. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  33. package/dist/chunk-RU6WKEOG.js +7048 -0
  34. package/dist/chunk-RU6WKEOG.js.map +1 -0
  35. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  36. package/dist/chunk-U736PVHY.js.map +1 -0
  37. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  38. package/dist/chunk-V3LF7BE7.js.map +1 -0
  39. package/dist/{chunk-EP6JHXSR.js → chunk-WAMZWZJB.js} +54 -9
  40. package/dist/chunk-WAMZWZJB.js.map +1 -0
  41. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  42. package/dist/chunk-XQUSGIDG.js.map +1 -0
  43. package/dist/cli.js +15 -11
  44. package/dist/cli.js.map +1 -1
  45. package/dist/client/index.d.ts +32 -3
  46. package/dist/client/index.js +205 -12
  47. package/dist/client/index.js.map +1 -1
  48. package/dist/components/index.d.ts +1743 -29
  49. package/dist/components/index.js +7 -3
  50. package/dist/{dev-NZRLOQCL.js → dev-4XEDTELV.js} +24 -13
  51. package/dist/dev-4XEDTELV.js.map +1 -0
  52. package/dist/doc/index.d.ts +198 -2
  53. package/dist/doc/index.js +438 -11
  54. package/dist/doc/index.js.map +1 -1
  55. package/dist/{docs-ZGDJUHJI.js → docs-JVP4RPKT.js} +3 -3
  56. package/dist/{docs-ZGDJUHJI.js.map → docs-JVP4RPKT.js.map} +1 -1
  57. package/dist/{doctor-VFKEMR54.js → doctor-5E2VEZPK.js} +8 -8
  58. package/dist/doctor-5E2VEZPK.js.map +1 -0
  59. package/dist/format-U0cQl069.d.ts +243 -0
  60. package/dist/markdown/index.js +1 -1
  61. package/dist/markdown/index.js.map +1 -1
  62. package/dist/{preview-QDCIVVSR.js → preview-T6CLSQVX.js} +12 -4
  63. package/dist/preview-T6CLSQVX.js.map +1 -0
  64. package/dist/query/index.d.ts +0 -11
  65. package/dist/query/index.js +2 -2
  66. package/dist/{routes-RHP5FVGD.js → routes-3SGAFDMC.js} +6 -6
  67. package/dist/{routes-RHP5FVGD.js.map → routes-3SGAFDMC.js.map} +1 -1
  68. package/dist/{search-RFBELGY7.js → search-5LC4XPB5.js} +3 -3
  69. package/dist/{search-RFBELGY7.js.map → search-5LC4XPB5.js.map} +1 -1
  70. package/dist/slide/index.d.ts +177 -1
  71. package/dist/slide/index.js +917 -18
  72. package/dist/slide/index.js.map +1 -1
  73. package/dist/table/index.js +14 -9
  74. package/dist/table/index.js.map +1 -1
  75. package/dist/ui/index.d.ts +148 -12
  76. package/dist/ui/index.js +1340 -87
  77. package/dist/ui/index.js.map +1 -1
  78. package/dist/{upgrade-GF2P67M6.js → upgrade-JHXZBGQS.js} +7 -7
  79. package/dist/{upgrade-GF2P67M6.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  80. package/dist/vite/index.d.ts +10 -0
  81. package/dist/vite/index.js +4 -4
  82. package/docs/en/changelog.md +24 -0
  83. package/docs/en/cli-reference.md +30 -0
  84. package/docs/en/components.md +40 -17
  85. package/docs/en/doc/doc-action-items.md +49 -0
  86. package/docs/en/doc/doc-callout.md +38 -0
  87. package/docs/en/doc/doc-data-table.md +60 -0
  88. package/docs/en/doc/doc-executive-summary.md +64 -0
  89. package/docs/en/doc/doc-figure.md +56 -0
  90. package/docs/en/doc/doc-key-findings.md +61 -0
  91. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  92. package/docs/en/doc/doc-report-header.md +46 -0
  93. package/docs/en/parts/area-chart.md +99 -0
  94. package/docs/en/parts/bar-chart.md +91 -0
  95. package/docs/en/parts/bar-list.md +50 -0
  96. package/docs/en/parts/category-bar.md +37 -0
  97. package/docs/en/parts/chart-frame.md +39 -0
  98. package/docs/en/parts/data-table.md +22 -0
  99. package/docs/en/parts/delta.md +50 -0
  100. package/docs/en/parts/donut-chart.md +72 -0
  101. package/docs/en/parts/format.md +43 -0
  102. package/docs/en/parts/funnel-steps.md +2 -1
  103. package/docs/en/parts/heatmap.md +53 -0
  104. package/docs/en/parts/kpi-card.md +57 -0
  105. package/docs/en/parts/legend.md +35 -0
  106. package/docs/en/parts/line-chart.md +94 -0
  107. package/docs/en/parts/metric-value.md +3 -2
  108. package/docs/en/parts/page-shell.md +1 -1
  109. package/docs/en/parts/progress-circle.md +33 -0
  110. package/docs/en/parts/sample-data.md +39 -0
  111. package/docs/en/parts/scatter-chart.md +56 -0
  112. package/docs/en/parts/sparkline.md +1 -1
  113. package/docs/en/parts/tracker.md +36 -0
  114. package/docs/en/parts/trend-indicator.md +17 -1
  115. package/docs/en/parts/updated-at.md +30 -0
  116. package/docs/en/parts/waterfall-chart.md +56 -0
  117. package/docs/en/routing.md +4 -2
  118. package/docs/en/slide/slide-chart-insight.md +52 -0
  119. package/docs/en/slide/slide-cover.md +39 -0
  120. package/docs/en/slide/slide-exec-summary.md +47 -0
  121. package/docs/en/slide/slide-kpi-grid.md +55 -0
  122. package/docs/en/slide/slide-kpi-hero.md +58 -0
  123. package/docs/en/slide/slide-next-actions.md +49 -0
  124. package/docs/en/slide/slide-scorecard-table.md +54 -0
  125. package/docs/en/ui/alert-dialog.md +42 -0
  126. package/docs/en/ui/avatar.md +31 -0
  127. package/docs/en/ui/combobox.md +74 -0
  128. package/docs/en/ui/drawer.md +41 -0
  129. package/docs/en/ui/empty.md +1 -1
  130. package/docs/en/ui/error-state.md +4 -3
  131. package/docs/en/ui/field.md +42 -0
  132. package/docs/en/ui/hover-card.md +21 -0
  133. package/docs/en/ui/kbd.md +17 -0
  134. package/docs/en/ui/loading.md +1 -1
  135. package/docs/en/ui/pagination.md +36 -0
  136. package/docs/en/ui/radio-group.md +21 -0
  137. package/docs/en/ui/toast.md +44 -0
  138. package/docs/en/ui/toggle-group.md +4 -3
  139. package/docs/en/ui-and-theming.md +1 -1
  140. package/docs/index.json +1024 -114
  141. package/docs/ja/changelog.md +55 -0
  142. package/docs/ja/cli-reference.md +29 -0
  143. package/docs/ja/components.md +66 -101
  144. package/docs/ja/doc/doc-action-items.md +49 -0
  145. package/docs/ja/doc/doc-callout.md +38 -0
  146. package/docs/ja/doc/doc-data-table.md +60 -0
  147. package/docs/ja/doc/doc-executive-summary.md +64 -0
  148. package/docs/ja/doc/doc-figure.md +56 -0
  149. package/docs/ja/doc/doc-key-findings.md +61 -0
  150. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  151. package/docs/ja/doc/doc-report-header.md +46 -0
  152. package/docs/ja/page-types/csv.md +83 -0
  153. package/docs/ja/page-types/doc.md +83 -0
  154. package/docs/ja/page-types/excel.md +82 -0
  155. package/docs/ja/page-types/slide.md +132 -0
  156. package/docs/ja/page-types.md +47 -0
  157. package/docs/ja/parts/area-chart.md +85 -0
  158. package/docs/ja/parts/bar-chart.md +95 -0
  159. package/docs/ja/parts/bar-list.md +58 -0
  160. package/docs/ja/parts/category-bar.md +36 -0
  161. package/docs/ja/parts/chart-frame.md +36 -0
  162. package/docs/ja/parts/data-table.md +22 -0
  163. package/docs/ja/parts/delta.md +50 -0
  164. package/docs/ja/parts/donut-chart.md +66 -0
  165. package/docs/ja/parts/echart.md +3 -0
  166. package/docs/ja/parts/format.md +44 -0
  167. package/docs/ja/parts/funnel-steps.md +27 -8
  168. package/docs/ja/parts/heatmap.md +45 -0
  169. package/docs/ja/parts/kpi-card.md +55 -0
  170. package/docs/ja/parts/legend.md +36 -0
  171. package/docs/ja/parts/line-chart.md +84 -0
  172. package/docs/ja/parts/metric-value.md +3 -2
  173. package/docs/ja/parts/page-shell.md +1 -1
  174. package/docs/ja/parts/progress-circle.md +34 -0
  175. package/docs/ja/parts/sample-data.md +61 -0
  176. package/docs/ja/parts/scatter-chart.md +69 -0
  177. package/docs/ja/parts/sparkline.md +2 -2
  178. package/docs/ja/parts/tracker.md +32 -0
  179. package/docs/ja/parts/trend-indicator.md +17 -1
  180. package/docs/ja/parts/updated-at.md +27 -0
  181. package/docs/ja/parts/waterfall-chart.md +61 -0
  182. package/docs/ja/routing.md +8 -84
  183. package/docs/ja/slide/slide-chart-insight.md +52 -0
  184. package/docs/ja/slide/slide-cover.md +39 -0
  185. package/docs/ja/slide/slide-exec-summary.md +47 -0
  186. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  187. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  188. package/docs/ja/slide/slide-next-actions.md +49 -0
  189. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  190. package/docs/ja/ui/alert-dialog.md +41 -0
  191. package/docs/ja/ui/avatar.md +31 -0
  192. package/docs/ja/ui/combobox.md +74 -0
  193. package/docs/ja/ui/drawer.md +41 -0
  194. package/docs/ja/ui/empty.md +1 -1
  195. package/docs/ja/ui/error-state.md +4 -3
  196. package/docs/ja/ui/field.md +42 -0
  197. package/docs/ja/ui/hover-card.md +21 -0
  198. package/docs/ja/ui/kbd.md +16 -0
  199. package/docs/ja/ui/loading.md +1 -1
  200. package/docs/ja/ui/pagination.md +36 -0
  201. package/docs/ja/ui/radio-group.md +21 -0
  202. package/docs/ja/ui/toast.md +46 -0
  203. package/docs/ja/ui/toggle-group.md +4 -3
  204. package/docs/ja/ui-and-theming.md +14 -7
  205. package/package.json +43 -29
  206. package/registry/ui/accordion.tsx +76 -0
  207. package/registry/ui/alert-dialog.tsx +189 -0
  208. package/registry/ui/alert.tsx +80 -0
  209. package/registry/ui/app-shell.tsx +287 -0
  210. package/registry/ui/area-chart.tsx +3701 -0
  211. package/registry/ui/attention-list.tsx +303 -0
  212. package/registry/ui/avatar.tsx +110 -0
  213. package/registry/ui/badge.tsx +56 -0
  214. package/registry/ui/bar-chart.tsx +3698 -0
  215. package/registry/ui/bar-list.tsx +3743 -0
  216. package/registry/ui/box-plot-chart.tsx +3906 -0
  217. package/registry/ui/breadcrumb.tsx +128 -0
  218. package/registry/ui/button.tsx +62 -0
  219. package/registry/ui/calendar.tsx +223 -0
  220. package/registry/ui/card.tsx +107 -0
  221. package/registry/ui/category-bar.tsx +1290 -0
  222. package/registry/ui/chart-frame.tsx +1393 -0
  223. package/registry/ui/checkbox.tsx +30 -0
  224. package/registry/ui/collapsible.tsx +23 -0
  225. package/registry/ui/combobox.tsx +310 -0
  226. package/registry/ui/command.tsx +198 -0
  227. package/registry/ui/dashboard-card.tsx +217 -0
  228. package/registry/ui/data-table.tsx +693 -146
  229. package/registry/ui/date-range-picker.tsx +390 -0
  230. package/registry/ui/delta.tsx +188 -0
  231. package/registry/ui/dialog.tsx +161 -0
  232. package/registry/ui/donut-chart.tsx +3751 -0
  233. package/registry/ui/drawer.tsx +229 -0
  234. package/registry/ui/dropdown-menu.tsx +274 -0
  235. package/registry/ui/echart.tsx +1040 -0
  236. package/registry/ui/field.tsx +240 -0
  237. package/registry/ui/filter-bar.tsx +392 -0
  238. package/registry/ui/funnel-steps.tsx +3569 -0
  239. package/registry/ui/heatmap.tsx +1786 -0
  240. package/registry/ui/histogram-chart.tsx +3986 -0
  241. package/registry/ui/hover-card.tsx +52 -0
  242. package/registry/ui/input-group.tsx +160 -0
  243. package/registry/ui/input.tsx +24 -0
  244. package/registry/ui/kbd.tsx +30 -0
  245. package/registry/ui/kpi-card.tsx +699 -0
  246. package/registry/ui/label.tsx +22 -0
  247. package/registry/ui/legend.tsx +3563 -0
  248. package/registry/ui/line-chart.tsx +3699 -0
  249. package/registry/ui/metric-value.tsx +62 -0
  250. package/registry/ui/multi-select.tsx +232 -0
  251. package/registry/ui/page-shell.tsx +282 -0
  252. package/registry/ui/pagination.tsx +140 -0
  253. package/registry/ui/paired-chart.tsx +3827 -0
  254. package/registry/ui/placeholder.tsx +36 -0
  255. package/registry/ui/popover.tsx +92 -0
  256. package/registry/ui/progress-circle.tsx +867 -0
  257. package/registry/ui/progress.tsx +85 -0
  258. package/registry/ui/radio-group.tsx +39 -0
  259. package/registry/ui/sample-data.tsx +86 -0
  260. package/registry/ui/scatter-chart.tsx +4212 -0
  261. package/registry/ui/scroll-area.tsx +56 -0
  262. package/registry/ui/searchable-select.tsx +214 -0
  263. package/registry/ui/section-header.tsx +43 -0
  264. package/registry/ui/segmented-control.tsx +76 -0
  265. package/registry/ui/select.tsx +255 -0
  266. package/registry/ui/separator.tsx +27 -0
  267. package/registry/ui/sheet.tsx +139 -0
  268. package/registry/ui/sidebar.tsx +725 -0
  269. package/registry/ui/skeleton.tsx +17 -0
  270. package/registry/ui/slider.tsx +56 -0
  271. package/registry/ui/sparkline.tsx +230 -0
  272. package/registry/ui/spinner.tsx +14 -0
  273. package/registry/ui/states.tsx +90 -0
  274. package/registry/ui/status-badge.tsx +121 -0
  275. package/registry/ui/switch.tsx +34 -0
  276. package/registry/ui/table.tsx +118 -0
  277. package/registry/ui/tabs.tsx +84 -0
  278. package/registry/ui/textarea.tsx +22 -0
  279. package/registry/ui/toast.tsx +250 -0
  280. package/registry/ui/toggle-group.tsx +91 -0
  281. package/registry/ui/toggle.tsx +47 -0
  282. package/registry/ui/tooltip.tsx +72 -0
  283. package/registry/ui/tracker.tsx +849 -0
  284. package/registry/ui/trend-indicator.tsx +74 -0
  285. package/registry/ui/updated-at.tsx +122 -0
  286. package/registry/ui/waterfall-chart.tsx +4248 -0
  287. package/skills/vantage-add-feature/SKILL.md +9 -7
  288. package/skills/vantage-design/SKILL.md +36 -24
  289. package/skills/vantage-design/references/extract.md +16 -14
  290. package/skills/vantage-design/references/format.md +6 -5
  291. package/skills/vantage-design/references/presets.md +60 -110
  292. package/skills/vantage-pitfalls/SKILL.md +5 -1
  293. package/skills/vantage-slide/SKILL.md +71 -36
  294. package/templates/AGENTS.md +24 -3
  295. package/templates/agents/api.md +29 -0
  296. package/templates/agents/csv.md +2 -1
  297. package/templates/agents/doc.md +51 -3
  298. package/templates/agents/page.md +54 -9
  299. package/templates/agents/slide.md +68 -3
  300. package/templates/agents/xlsx.md +2 -1
  301. package/theme.css +284 -128
  302. package/dist/add-EISGSZAH.js +0 -6
  303. package/dist/add-EISGSZAH.js.map +0 -1
  304. package/dist/chunk-3G43C6OL.js.map +0 -1
  305. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  306. package/dist/chunk-A2UUGASH.js.map +0 -1
  307. package/dist/chunk-BCE22JSM.js.map +0 -1
  308. package/dist/chunk-DTDVSFRY.js.map +0 -1
  309. package/dist/chunk-EP6JHXSR.js.map +0 -1
  310. package/dist/chunk-KLEIVDUV.js.map +0 -1
  311. package/dist/chunk-MXI3PZFT.js.map +0 -1
  312. package/dist/chunk-PLST5Q7T.js +0 -2221
  313. package/dist/chunk-PLST5Q7T.js.map +0 -1
  314. package/dist/chunk-PVTHHV7X.js.map +0 -1
  315. package/dist/chunk-T3FLAGI6.js +0 -316
  316. package/dist/chunk-T3FLAGI6.js.map +0 -1
  317. package/dist/dev-NZRLOQCL.js.map +0 -1
  318. package/dist/doctor-VFKEMR54.js.map +0 -1
  319. package/dist/preview-QDCIVVSR.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/doc/document.tsx"],"names":["Document"],"mappings":";;;;;AAeA,SAAS,eAAe,KAAA,EAA6D;AACnF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,IAAI,KAAA,CAAM,EAAA,EAAI,IAAA,CAAK,UAAU,IAAI,KAAA,CAAM,EAAA;AACvC,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,aAAa,IAAI,KAAA,CAAM,KAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,KAAA,CAAM,MAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,KAAA,CAAM,MAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,KAAA,CAAM,MAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,iBAAiB,IAAI,KAAA,CAAM,QAAA;AACpD,EAAA,IAAI,KAAA,CAAM,WAAA,EAAa,IAAA,CAAK,oBAAoB,IAAI,KAAA,CAAM,WAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,iBAAiB,IAAI,KAAA,CAAM,QAAA;AACpD,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,iBAAiB,IAAI,KAAA,CAAM,QAAA;AACpD,EAAA,IAAI,KAAA,CAAM,UAAA,EAAY,IAAA,CAAK,mBAAmB,IAAI,KAAA,CAAM,UAAA;AACxD,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,iBAAiB,IAAI,KAAA,CAAM,QAAA;AACpD,EAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAK,IAAA,GAAyB,MAAA;AAClE;AASO,IAAM,QAAA,GAAW,UAAA,CAAuC,SAASA,SAAAA,CACtE,EAAE,OAAO,KAAA,EAAO,GAAG,KAAA,EAAM,EACzB,GAAA,EACA;AACA,EAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AACtC,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,aAAa,KAAA,GAAQ,EAAE,GAAG,SAAA,EAAW,GAAG,OAAM,GAAI,MAAA;AAAA,MACxD,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;AACD,QAAA,CAAS,WAAA,GAAc,UAAA","file":"index.js","sourcesContent":["import { forwardRef } from \"react\"\nimport type { CSSProperties, HTMLAttributes } from \"react\"\n\nimport type { DocumentTheme } from \"./types\"\n\nexport interface DocumentProps extends HTMLAttributes<HTMLElement> {\n /** Token overrides for this document; anything omitted follows the app's theme. */\n theme?: DocumentTheme\n}\n\n/**\n * Only the keys the document set are emitted — the rest resolve up the\n * cascade to `--doc-*` in theme.css. Writing defaults here would freeze every\n * document to light.\n */\nfunction themeToCssVars(theme: DocumentTheme | undefined): CSSProperties | undefined {\n if (!theme) return undefined\n const vars: Record<string, string> = {}\n if (theme.fg) vars[\"--doc-fg\"] = theme.fg\n if (theme.muted) vars[\"--doc-muted\"] = theme.muted\n if (theme.accent) vars[\"--doc-accent\"] = theme.accent\n if (theme.border) vars[\"--doc-border\"] = theme.border\n if (theme.subtle) vars[\"--doc-subtle\"] = theme.subtle\n if (theme.fontBody) vars[\"--doc-font-body\"] = theme.fontBody\n if (theme.fontHeading) vars[\"--doc-font-heading\"] = theme.fontHeading\n if (theme.fontMono) vars[\"--doc-font-mono\"] = theme.fontMono\n if (theme.sizeBody) vars[\"--doc-size-body\"] = theme.sizeBody\n if (theme.lineHeight) vars[\"--doc-line-height\"] = theme.lineHeight\n if (theme.maxWidth) vars[\"--doc-max-width\"] = theme.maxWidth\n return Object.keys(vars).length > 0 ? (vars as CSSProperties) : undefined\n}\n\n/**\n * The container of a document page. Plain elements written inside it —\n * headings, paragraphs, lists, tables, quotes, code, figures — are typeset by\n * the `[data-slot=\"document\"]` rules in theme.css, so the page body needs no\n * classes. Those rules sit in `@layer components`, below Tailwind utilities, so\n * a `className` on any element still wins.\n */\nexport const Document = forwardRef<HTMLElement, DocumentProps>(function Document(\n { theme, style, ...props },\n ref,\n) {\n const themeVars = themeToCssVars(theme)\n return (\n <article\n ref={ref}\n data-slot=\"document\"\n style={themeVars || style ? { ...themeVars, ...style } : undefined}\n {...props}\n />\n )\n})\nDocument.displayName = \"Document\"\n"]}
1
+ {"version":3,"sources":["../../src/doc/print.ts","../../src/doc/document.tsx","../../../squadkit/registry/blocks/doc-action-items/doc-action-items.tsx","../../../squadkit/registry/blocks/doc-callout/doc-callout.tsx","../../../squadkit/registry/blocks/doc-data-table/doc-data-table.tsx","../../../squadkit/registry/blocks/doc-executive-summary/doc-executive-summary.tsx","../../../squadkit/registry/blocks/doc-figure/doc-figure.tsx","../../../squadkit/registry/blocks/doc-key-findings/doc-key-findings.tsx","../../../squadkit/registry/blocks/doc-kpi-scorecard/doc-kpi-scorecard.tsx","../../../squadkit/registry/blocks/doc-report-header/doc-report-header.tsx"],"names":["Document","jsx","Fragment","jsxs","shown","useId","ChangeText","MUTED"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Printing a document — the browser's own print dialog, where \"Save as PDF\"\n * is the download. Paper is white and backgrounds are dropped by default, so a\n * dark theme would print pale text on nothing: the page is switched to light\n * for the duration and put back afterwards.\n */\n\nconst DARK_CLASS = \"dark\"\nconst THEME_ATTR = \"data-theme\"\n\ntype Restore = () => void\n\nlet restore: Restore | null = null\n\n/** Drop every dark marker on `<html>`/`<body>`, remembering exactly what was there. */\nfunction forceLight(): void {\n if (restore) return\n const undo: Restore[] = []\n for (const el of [document.documentElement, document.body]) {\n if (!el) continue\n if (el.classList.contains(DARK_CLASS)) {\n el.classList.remove(DARK_CLASS)\n undo.push(() => el.classList.add(DARK_CLASS))\n }\n if (el.getAttribute(THEME_ATTR) === \"dark\") {\n el.setAttribute(THEME_ATTR, \"light\")\n undo.push(() => el.setAttribute(THEME_ATTR, \"dark\"))\n }\n }\n restore = () => {\n for (const fn of undo) fn()\n }\n}\n\nfunction restoreTheme(): void {\n restore?.()\n restore = null\n}\n\nfunction nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false\n const settle = () => {\n if (settled) return\n settled = true\n resolve()\n }\n requestAnimationFrame(settle)\n setTimeout(settle, 50)\n })\n}\n\n/**\n * Canvas charts keep the colours they were painted with, and a CSS switch at\n * print time does not repaint them. Their tokens are re-read a frame after the\n * theme flips, then React re-inits the chart, which animates in from empty —\n * printed mid-way, the bars are missing. So wait a few frames for the re-init\n * to start, then for every chart to report its paint done.\n */\nconst REPAINT_FRAMES = 4\nconst CHART_TIMEOUT_MS = 3000\n\nasync function waitForCharts(): Promise<void> {\n const deadline = performance.now() + CHART_TIMEOUT_MS\n while (performance.now() < deadline) {\n if (!document.querySelector('[data-slot=\"echart-canvas\"][data-rendering]')) return\n await nextFrame()\n }\n}\n\n/**\n * The theme comes back on `afterprint` (see `watchPrintEvents`), not after\n * `window.print()` returns — not every browser blocks on the dialog.\n */\nexport async function printDocument(): Promise<void> {\n const wasForced = restore !== null\n forceLight()\n try {\n if (!wasForced && restore) {\n for (let i = 0; i < REPAINT_FRAMES; i++) await nextFrame()\n }\n await waitForCharts()\n window.print()\n } catch (error) {\n restoreTheme()\n throw error\n }\n}\n\n/**\n * Must be mounted while a document is on screen. It also covers the browser's\n * own Print command, which skips the button: flipping the theme in\n * `beforeprint` still gets the text and rules right, though canvas charts\n * cannot repaint in time on that path.\n */\nexport function watchPrintEvents(): () => void {\n window.addEventListener(\"beforeprint\", forceLight)\n window.addEventListener(\"afterprint\", restoreTheme)\n return () => {\n window.removeEventListener(\"beforeprint\", forceLight)\n window.removeEventListener(\"afterprint\", restoreTheme)\n }\n}\n","import { forwardRef, useEffect } from \"react\"\nimport type { CSSProperties, HTMLAttributes } from \"react\"\nimport { PrinterIcon } from \"lucide-react\"\n\nimport { Button } from \"@squadbase/squadkit/ui/button\"\nimport { printDocument, watchPrintEvents } from \"./print\"\nimport type { DocumentTheme } from \"./types\"\n\nexport interface DocumentProps extends HTMLAttributes<HTMLElement> {\n /** Token overrides for this document; anything omitted follows the app's theme. */\n theme?: DocumentTheme\n}\n\n/**\n * Only the keys the document set are emitted — the rest resolve up the\n * cascade to `--doc-*` in theme.css. Writing defaults here would freeze every\n * document to light.\n */\nfunction themeToCssVars(theme: DocumentTheme | undefined): CSSProperties | undefined {\n if (!theme) return undefined\n const vars: Record<string, string> = {}\n if (theme.fg) vars[\"--doc-fg\"] = theme.fg\n if (theme.muted) vars[\"--doc-muted\"] = theme.muted\n if (theme.accent) vars[\"--doc-accent\"] = theme.accent\n if (theme.border) vars[\"--doc-border\"] = theme.border\n if (theme.subtle) vars[\"--doc-subtle\"] = theme.subtle\n if (theme.fontBody) vars[\"--doc-font-body\"] = theme.fontBody\n if (theme.fontHeading) vars[\"--doc-font-heading\"] = theme.fontHeading\n if (theme.fontMono) vars[\"--doc-font-mono\"] = theme.fontMono\n if (theme.sizeBody) vars[\"--doc-size-body\"] = theme.sizeBody\n if (theme.lineHeight) vars[\"--doc-line-height\"] = theme.lineHeight\n if (theme.maxWidth) vars[\"--doc-max-width\"] = theme.maxWidth\n return Object.keys(vars).length > 0 ? (vars as CSSProperties) : undefined\n}\n\n/**\n * With no page margin the browser has nowhere to print its date / URL header\n * and footer. Rendered by `<Document>` rather than put in theme.css because an\n * `@page` rule cannot be scoped — there it would reach every dashboard too.\n */\nconst PRINT_PAGE_CSS = \"@media print { @page { margin: 0 } }\"\n\n/** The one piece of chrome a document shows: English, Japanese for a Japanese browser. */\nfunction printLabel(): string {\n return navigator.language.toLowerCase().startsWith(\"ja\") ? \"PDF として保存\" : \"Save as PDF\"\n}\n\n/**\n * The container of a document page. Plain elements written inside it —\n * headings, paragraphs, lists, tables, quotes, code, figures — are typeset by\n * the `[data-slot=\"document\"]` rules in theme.css, so the page body needs no\n * classes. Those rules sit in `@layer components`, below Tailwind utilities, so\n * a `className` on any element still wins.\n *\n * It also carries its own way out: a button that opens the print dialog, where\n * \"Save as PDF\" is the download. The print rules in theme.css leave only the\n * document on paper.\n */\nexport const Document = forwardRef<HTMLElement, DocumentProps>(function Document(\n { theme, style, ...props },\n ref,\n) {\n const themeVars = themeToCssVars(theme)\n const label = printLabel()\n useEffect(() => watchPrintEvents(), [])\n return (\n <>\n <article\n ref={ref}\n data-slot=\"document\"\n // `margin-inline: auto` shrinks an article to its content inside a flex column parent;\n // 100% keeps the column (max-width from the theme still caps it).\n style={{ width: \"100%\", ...themeVars, ...style }}\n {...props}\n />\n <style>{PRINT_PAGE_CSS}</style>\n <Button\n data-slot=\"document-print\"\n variant=\"outline\"\n size=\"sm\"\n className=\"fixed right-4 bottom-4 z-10 shadow-sm\"\n onClick={() => void printDocument()}\n title={label}\n >\n <PrinterIcon aria-hidden=\"true\" />\n {label}\n </Button>\n </>\n )\n})\nDocument.displayName = \"Document\"\n","\"use client\"\n\n/**\n * doc-action-items — what to do next: action, owner, due date, expected effect, priority.\n * For the recommendation section of a report, a QBR or a board paper.\n *\n * - `variant=\"table\"` (default) is a plain `table`. `variant=\"asks\"` is a short bulleted list of\n * requests to the reader (introductions, a decision, a hire): owner and due are shown inline.\n * - `priority` is an enum (`high` | `medium` | `low`), printed as a plain word (高 / 中 / 低; 高 in\n * semibold) with no badge and no colour. A missing owner / due / impact shows \"—\".\n * - Rows are listed in the order given; put the most important first.\n * - The heading is a bare `h2` / `h3`; the document sets its size. No width is set anywhere.\n *\n * @example\n * import { DocActionItems } from \"@/blocks/doc-action-items/doc-action-items\"\n * <DocActionItems items={[{ action: \"法人プランの導入支援を増員する\", owner: \"CS 部\", due: \"2026-11-15\", priority: \"high\" }]} />\n */\nimport type { ReactNode } from \"react\"\n\nexport type DocActionPriority = \"high\" | \"medium\" | \"low\"\n\nexport interface DocActionItem {\n action: ReactNode\n owner?: string\n /** Due date as written, e.g. \"2026-11-15\" or \"11 月末\". */\n due?: string\n /** What we expect to change, e.g. \"解約率 −0.5pt\". */\n impact?: string\n priority?: DocActionPriority\n}\n\nexport interface DocActionItemsProps {\n /** Heading text. Default \"推奨する対応\". */\n title?: string\n /** `2` directly under the document, `3` inside another section. Default 2. */\n headingLevel?: 2 | 3\n items: DocActionItem[]\n variant?: \"table\" | \"asks\"\n}\n\nconst PRIORITY = { high: \"高\", medium: \"中\", low: \"低\" } as const\n\nconst MUTED = { color: \"var(--doc-muted)\" } as const\n\nfunction Priority({ value }: { value: DocActionPriority | undefined }) {\n if (!value) return <>—</>\n return <span className={value === \"high\" ? \"font-semibold\" : undefined}>{PRIORITY[value]}</span>\n}\n\nexport function DocActionItems({ title = \"推奨する対応\", headingLevel = 2, items, variant = \"table\" }: DocActionItemsProps) {\n const Heading = headingLevel === 3 ? \"h3\" : \"h2\"\n\n return (\n <section data-slot=\"doc-action-items\">\n <Heading>{title}</Heading>\n {variant === \"asks\" ? (\n <ul>\n {items.map((item, i) => (\n <li key={i} className=\"break-inside-avoid\">\n {item.action}\n {item.owner || item.due ? (\n <span style={MUTED}>\n ({[item.owner, item.due ? `${item.due} まで` : undefined].filter(Boolean).join(\"・\")})\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"table w-full\">\n <thead>\n <tr>\n <th scope=\"col\">対応</th>\n <th scope=\"col\">担当</th>\n <th scope=\"col\">期限</th>\n <th scope=\"col\">期待する効果</th>\n <th scope=\"col\">優先度</th>\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr key={i}>\n <td>{item.action}</td>\n <td>{item.owner ?? \"—\"}</td>\n <td className=\"whitespace-nowrap tabular-nums\">{item.due ?? \"—\"}</td>\n <td>{item.impact ?? \"—\"}</td>\n <td>\n <Priority value={item.priority} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </section>\n )\n}\n\nexport default DocActionItems\n","\"use client\"\n\n/**\n * doc-callout — a boxed remark inside the running text: a note, an insight, a warning, or a\n * decision that was made. Use it for the one thing a reader must not miss; not for decoration.\n *\n * - A `div role=\"note\"` named by its heading, with a left rule in the kind's colour (`decision` is\n * neutral: a decision is not bad news). The kind also prints as a word (\"注意\", \"示唆\"), so colour\n * is never the only signal. When `title` equals the kind's word, it is shown once.\n * - `children` is a `string` or a `ReactNode`; Markdown strings are not parsed. Paragraphs\n * inside take the document's body size.\n * - `break-inside-avoid` keeps it on one page when printed.\n *\n * @example\n * import { DocCallout } from \"@/blocks/doc-callout/doc-callout\"\n * <DocCallout kind=\"warning\" title=\"9 月の数値は速報値\">10 月 10 日の確定で変わることがあります。</DocCallout>\n */\nimport { useId, type ReactNode } from \"react\"\n\nexport type DocCalloutKind = \"note\" | \"insight\" | \"warning\" | \"decision\"\n\nexport interface DocCalloutProps {\n kind?: DocCalloutKind\n /** Heading of the box, one short line. Default: the kind's word. */\n title?: string\n children: ReactNode\n}\n\nconst KINDS: Record<DocCalloutKind, { word: string; rule: string; tint: string; text: string }> = {\n note: { word: \"補足\", rule: \"border-info\", tint: \"bg-info-subtle\", text: \"text-info\" },\n insight: { word: \"示唆\", rule: \"border-positive\", tint: \"bg-positive-subtle\", text: \"text-positive\" },\n warning: { word: \"注意\", rule: \"border-warning\", tint: \"bg-warning-subtle\", text: \"text-warning\" },\n decision: { word: \"決定事項\", rule: \"border-foreground\", tint: \"bg-muted\", text: \"text-foreground\" },\n}\n\nexport function DocCallout({ kind = \"note\", title, children }: DocCalloutProps) {\n const k = KINDS[kind]\n const titleId = useId()\n const heading = title && title !== k.word ? `${k.word}: ${title}` : k.word\n return (\n <div\n role=\"note\"\n aria-labelledby={titleId}\n data-slot=\"doc-callout\"\n data-kind={kind}\n className={`break-inside-avoid border-l-4 px-4 py-2 ${k.rule} ${k.tint}`}\n >\n <p id={titleId} className={`m-0 font-semibold ${k.text}`}>\n {heading}\n </p>\n <div>{typeof children === \"string\" ? <p className=\"m-0\">{children}</p> : children}</div>\n </div>\n )\n}\n\nexport default DocCallout\n","\"use client\"\n\n/**\n * doc-data-table — a table with the notes a printed table needs: title, unit, right-aligned\n * numbers, a total row, highlighted rows, footnote marks, and a source line.\n *\n * - A plain `table`: the document styles it and keeps each row on one page when printed; a long\n * table may break between rows (the figure is allowed to split, the caption stays whole).\n * (`ui/table` and `DataTable` are for screens — sorting, scrolling — and are not used here.)\n * - Numbers are formatted from `format` (default: a plain number) and right-aligned with\n * `tabular-nums`; a missing value shows \"—\". Text columns align left.\n * - `total` is a row of values keyed like the rows, shown in a `tfoot`.\n * - `footnotes` are `{ mark, text }`; put the same `mark` (\"※1\") in a cell string to point at it.\n * - A column is `w-full` in a table that fills the column; no width is set on cells.\n *\n * @example\n * import { DocDataTable } from \"@/blocks/doc-data-table/doc-data-table\"\n * <DocDataTable title=\"部門別の売上\" unit=\"単位: 百万円\" columns={[{ key: \"dept\", label: \"部門\" }, { key: \"sales\", label: \"売上\", format: \"number\" }]} rows={[{ dept: \"法人営業\", sales: 312 }]} />\n */\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\n\nexport type DocTableCell = string | number | null | undefined\nexport type DocTableRow = Record<string, DocTableCell>\n\nexport interface DocTableColumn {\n key: string\n label: string\n /** Format of a numeric column. Without it, numbers use a plain thousands format. */\n format?: ValueFormat\n /** Default: right for a column of numbers, left otherwise. */\n align?: \"left\" | \"right\" | \"center\"\n}\n\nexport interface DocDataTableProps {\n /** Table title, as a caption above the table. */\n title?: string\n /** Unit or scale, e.g. \"単位: 百万円\". */\n unit?: string\n columns: DocTableColumn[]\n rows: DocTableRow[]\n /** The total row, keyed like `rows`. */\n total?: DocTableRow\n /** Row indexes to set in semibold. */\n highlightRows?: number[]\n footnotes?: { mark: string; text: string }[]\n source?: string\n /** When the data was taken: a date only, e.g. \"2026-10-03\". \"データ時点\" is added here. */\n asOf?: string\n}\n\nconst ALIGN = { left: \"text-left\", right: \"text-right\", center: \"text-center\" } as const\n\nexport function DocDataTable({ title, unit, columns, rows, total, highlightRows, footnotes, source, asOf }: DocDataTableProps) {\n const isNumeric = (col: DocTableColumn) => rows.some((r) => typeof r[col.key] === \"number\")\n const cls = (col: DocTableColumn) => {\n const numeric = isNumeric(col)\n return `${ALIGN[col.align ?? (numeric ? \"right\" : \"left\")]}${numeric ? \" tabular-nums\" : \"\"}`\n }\n const text = (col: DocTableColumn, v: DocTableCell) =>\n typeof v === \"number\" ? formatValue(v, col.format ?? \"number\") : v === null || v === undefined || v === \"\" ? \"—\" : v\n const origin = [source ? `出典: ${source}` : undefined, asOf ? `データ時点 ${asOf}` : undefined].filter(Boolean).join(\" / \")\n const highlighted = new Set(highlightRows)\n\n return (\n <figure data-slot=\"doc-data-table\" className=\"m-0 w-full break-inside-auto\">\n <div className=\"w-full overflow-x-auto\">\n <table className=\"table w-full\">\n {title || unit ? (\n <caption className=\"text-left\">\n {title ? <span className=\"font-semibold\">{title}</span> : null}\n {unit ? <span style={{ color: \"var(--doc-muted)\" }}>{title ? `(${unit})` : unit}</span> : null}\n </caption>\n ) : null}\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key} scope=\"col\" className={cls(col)}>\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i} className={highlighted.has(i) ? \"font-semibold\" : undefined}>\n {columns.map((col) => (\n <td key={col.key} className={cls(col)}>\n {text(col, row[col.key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n {total ? (\n <tfoot>\n <tr className=\"font-semibold\">\n {columns.map((col) => (\n <td key={col.key} className={cls(col)}>\n {text(col, total[col.key])}\n </td>\n ))}\n </tr>\n </tfoot>\n ) : null}\n </table>\n </div>\n {footnotes?.length || origin ? (\n <figcaption className=\"flex flex-col gap-0.5 break-inside-avoid text-left\">\n {footnotes?.map((f) => (\n <span key={f.mark}>\n {f.mark} {f.text}\n </span>\n ))}\n {origin ? <span>{origin}</span> : null}\n </figcaption>\n ) : null}\n </figure>\n )\n}\n\nexport default DocDataTable\n","\"use client\"\n\n/**\n * doc-executive-summary — the answer first (BLUF): one conclusion sentence, 3–5 supporting\n * points, and optionally up to 3 headline numbers. One section to put right after the header.\n *\n * - `conclusion` is a sentence that carries the verdict, set in semibold at body size.\n * - `points` is a numbered list. Each is a `string` or a `ReactNode`; Markdown strings are not parsed.\n * - `metrics` (at most 3) are a `dl`. `value` is formatted by `format` (or shown as `display`; null is \"—\").\n * `delta` is the change itself; its direction comes from the sign, and `betterWhen` (\"up\" by default)\n * decides good / bad. The mark ▲▼ and the sign are always printed, so colour is never the only signal.\n * - Only the points and the metric tiles keep together when printed; the section itself may split.\n * - The heading is a bare `h2` / `h3` (`headingLevel`), so the document sets its size.\n *\n * @example\n * import { DocExecutiveSummary } from \"@/blocks/doc-executive-summary/doc-executive-summary\"\n * <DocExecutiveSummary conclusion=\"9 月の売上は計画を上回った。\" points={[\"…\", \"…\", \"…\"]} />\n */\nimport type { ReactNode } from \"react\"\n\nimport { formatDelta, formatValue, type ValueFormat } from \"../../lib/format\"\n\nexport interface DocSummaryMetric {\n label: string\n value: number | null\n format?: ValueFormat\n /** Overrides the shown value (e.g. \"約 5,400 万円\"). */\n display?: string\n /** The change from the comparison; direction comes from its sign. Omit for no comparison. */\n delta?: { value: number; format?: ValueFormat }\n /** Name of the comparison, e.g. \"前月比\". Default \"前期比\". */\n comparisonLabel?: string\n /** Which way is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n}\n\nexport interface DocExecutiveSummaryProps {\n /** Heading text. Default \"要旨\". */\n title?: string\n /** `2` directly under the document, `3` inside another section. Default 2. */\n headingLevel?: 2 | 3\n /** The verdict in one sentence. */\n conclusion: ReactNode\n /** 3–5 supporting points, most important first. */\n points: ReactNode[]\n /** Up to 3 headline numbers; any beyond are ignored. */\n metrics?: DocSummaryMetric[]\n}\n\n/** The change as a bare `span` (no text size): mark + signed value, so print and colour-blind readers get the direction; colour only adds good / bad. */\nfunction ChangeText({ delta, format, betterWhen = \"up\" }: { delta: { value: number; format?: ValueFormat }; format?: ValueFormat; betterWhen?: \"up\" | \"down\" }) {\n const { value } = delta\n const dir = value > 0 ? \"up\" : value < 0 ? \"down\" : \"flat\"\n const mark = dir === \"up\" ? \"▲\" : dir === \"down\" ? \"▼\" : \"→\"\n const word = dir === \"up\" ? \"増\" : dir === \"down\" ? \"減\" : \"横ばい\"\n const good = dir === \"flat\" ? undefined : (dir === \"up\") === (betterWhen === \"up\")\n const tone = good === undefined ? undefined : good ? \"text-positive\" : \"text-negative\"\n const text = formatDelta(value, delta.format ?? format)\n return (\n <span\n className={tone}\n style={tone ? undefined : { color: \"var(--doc-muted)\" }}\n aria-label={`${word}、${text}${good === undefined ? \"\" : good ? \"、改善\" : \"、悪化\"}`}\n >\n {mark} {text}\n </span>\n )\n}\n\nexport function DocExecutiveSummary({\n title = \"要旨\",\n headingLevel = 2,\n conclusion,\n points,\n metrics,\n}: DocExecutiveSummaryProps) {\n const Heading = headingLevel === 3 ? \"h3\" : \"h2\"\n const shown = (metrics ?? []).slice(0, 3)\n\n return (\n <section data-slot=\"doc-executive-summary\">\n <Heading>{title}</Heading>\n <p className=\"font-semibold\">{conclusion}</p>\n <ol>\n {points.map((point, i) => (\n <li key={i} className=\"break-inside-avoid\">\n {point}\n </li>\n ))}\n </ol>\n {shown.length > 0 ? (\n <dl className=\"grid grid-cols-1 gap-4 sm:grid-cols-3 print:grid-cols-3\">\n {shown.map((m) => (\n <div\n key={m.label}\n className=\"break-inside-avoid border-l-2 pl-3\"\n style={{ borderColor: \"var(--doc-border)\" }}\n >\n <dt style={{ color: \"var(--doc-muted)\" }}>{m.label}</dt>\n <dd className=\"m-0 font-semibold tabular-nums\">{m.display ?? formatValue(m.value, m.format)}</dd>\n {m.delta ? (\n <dd className=\"m-0\">\n <span style={{ color: \"var(--doc-muted)\" }}>{m.comparisonLabel ?? \"前期比\"} </span>\n <ChangeText delta={m.delta} format={m.format} betterWhen={m.betterWhen} />\n </dd>\n ) : null}\n </div>\n ))}\n </dl>\n ) : null}\n </section>\n )\n}\n\nexport default DocExecutiveSummary\n","\"use client\"\n\n/**\n * doc-figure — the figure convention in one place: a title that states the finding, the unit,\n * the chart (passed as `children`), and a caption with source and notes. The block owns the\n * convention; the chart is yours (any typed chart, an `EChart`, an image).\n *\n * - A real `figure` + `figcaption`, named by its title (`aria-labelledby`); the document's print\n * rule keeps it on one page. Do not give the chart its own `title`: the title is here.\n * - `title` is a sentence that says what the chart shows (\"解約率は 3 か月連続で低下\"), not its\n * subject (\"解約率の推移\"). `unit` goes right under it. `number` prefixes the caption (\"図 1\").\n * - The chart gets the full column (`w-full`); no width is set here.\n * - `source` and `asOf` are first-class: a number without a source and a date is not finished.\n * `asOf` is a date only (\"2026-10-03\"); \"データ時点\" is added here.\n *\n * @example\n * import { DocFigure } from \"@/blocks/doc-figure/doc-figure\"\n * <DocFigure number={1} title=\"解約率は 3 か月連続で低下\" unit=\"単位: %\" source=\"課金システム\" asOf=\"2026-10-03\"><LineChart … /></DocFigure>\n */\nimport { useId, type ReactNode } from \"react\"\n\nexport interface DocFigureProps {\n /** The finding, as a sentence. */\n title: string\n /** Unit or scale, e.g. \"単位: 百万円\". */\n unit?: string\n /** Figure number; shown as \"図 N\" in the caption. */\n number?: number\n /** Where the data comes from. */\n source?: string\n /** When the data was taken: a date only, e.g. \"2026-10-03\". */\n asOf?: string\n /** Footnotes, one per line. */\n notes?: string[]\n /** The chart. */\n children: ReactNode\n}\n\nexport function DocFigure({ title, unit, number, source, asOf, notes, children }: DocFigureProps) {\n const titleId = useId()\n const origin = [source ? `出典: ${source}` : undefined, asOf ? `データ時点 ${asOf}` : undefined].filter(Boolean).join(\" / \")\n const hasCaption = number !== undefined || origin || (notes && notes.length > 0)\n\n return (\n <figure data-slot=\"doc-figure\" aria-labelledby={titleId} className=\"w-full break-inside-avoid\">\n <p id={titleId} className=\"m-0 font-semibold\">{title}</p>\n {unit ? (\n <p className=\"m-0\" style={{ color: \"var(--doc-muted)\" }}>\n {unit}\n </p>\n ) : null}\n <div className=\"w-full\">{children}</div>\n {hasCaption ? (\n <figcaption className=\"flex flex-col gap-0.5 text-left\">\n {number !== undefined ? <span className=\"font-medium\">図 {number}</span> : null}\n {origin ? <span>{origin}</span> : null}\n {notes?.map((note, i) => <span key={i}>{note}</span>)}\n </figcaption>\n ) : null}\n </figure>\n )\n}\n\nexport default DocFigure\n","\"use client\"\n\n/**\n * doc-key-findings — 3–5 findings, each a headline that states the conclusion, the evidence\n * under it, and optionally one number. For the \"what we learned\" section of an analysis.\n *\n * - Each finding is a numbered `h3` (the section heading is `h2`, or `h3` with `headingLevel={3}`\n * when the block sits inside another section — then the findings drop to `h4`).\n * - `headline` is a sentence with a verdict (\"解約は法人プランに集中している\"), not a topic.\n * - `evidence` is a `string` or a `ReactNode`; Markdown strings are not parsed.\n * - The optional `metric` is a number with a change: `delta` is the change itself, its direction comes\n * from the sign, `betterWhen` (\"up\" by default) decides good / bad. The mark ▲▼ and the sign are\n * always printed, so colour is never the only signal.\n *\n * @example\n * import { DocKeyFindings } from \"@/blocks/doc-key-findings/doc-key-findings\"\n * <DocKeyFindings findings={[{ headline: \"新規契約は法人プランが牽引した\", evidence: \"法人プランの新規が前月比 +18%。\" }]} />\n */\nimport type { ReactNode } from \"react\"\n\nimport { formatDelta, formatValue, type ValueFormat } from \"../../lib/format\"\n\nexport interface DocFindingMetric {\n label: string\n value: number | null\n format?: ValueFormat\n /** Overrides the shown value. */\n display?: string\n /** The change from the comparison; direction comes from its sign. */\n delta?: { value: number; format?: ValueFormat }\n /** Name of the comparison, e.g. \"前月比\". Default \"前期比\". */\n comparisonLabel?: string\n /** Which way is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n}\n\nexport interface DocFinding {\n /** The conclusion, as a sentence. */\n headline: string\n evidence: ReactNode\n metric?: DocFindingMetric\n}\n\nexport interface DocKeyFindingsProps {\n /** Heading text. Default \"主要な発見\". */\n title?: string\n /** `2` directly under the document, `3` inside another section. Default 2. */\n headingLevel?: 2 | 3\n /** 3–5 findings, most important first. */\n findings: DocFinding[]\n}\n\n/** The change as a bare `span` (no text size): mark + signed value, so print and colour-blind readers get the direction; colour only adds good / bad. */\nfunction ChangeText({ delta, format, betterWhen = \"up\" }: { delta: { value: number; format?: ValueFormat }; format?: ValueFormat; betterWhen?: \"up\" | \"down\" }) {\n const { value } = delta\n const dir = value > 0 ? \"up\" : value < 0 ? \"down\" : \"flat\"\n const mark = dir === \"up\" ? \"▲\" : dir === \"down\" ? \"▼\" : \"→\"\n const word = dir === \"up\" ? \"増\" : dir === \"down\" ? \"減\" : \"横ばい\"\n const good = dir === \"flat\" ? undefined : (dir === \"up\") === (betterWhen === \"up\")\n const tone = good === undefined ? undefined : good ? \"text-positive\" : \"text-negative\"\n const text = formatDelta(value, delta.format ?? format)\n return (\n <span\n className={tone}\n style={tone ? undefined : { color: \"var(--doc-muted)\" }}\n aria-label={`${word}、${text}${good === undefined ? \"\" : good ? \"、改善\" : \"、悪化\"}`}\n >\n {mark} {text}\n </span>\n )\n}\n\nexport function DocKeyFindings({ title = \"主要な発見\", headingLevel = 2, findings }: DocKeyFindingsProps) {\n const Heading = headingLevel === 3 ? \"h3\" : \"h2\"\n const Item = headingLevel === 3 ? \"h4\" : \"h3\"\n\n return (\n <section data-slot=\"doc-key-findings\">\n <Heading>{title}</Heading>\n {findings.map((f, i) => (\n <article key={i} className=\"break-inside-avoid\">\n <Item>\n {i + 1}. {f.headline}\n </Item>\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between print:flex-row print:justify-between\">\n <div>{typeof f.evidence === \"string\" ? <p className=\"m-0\">{f.evidence}</p> : f.evidence}</div>\n {f.metric ? (\n <dl className=\"m-0 shrink-0 sm:text-right print:text-right\">\n <dt style={{ color: \"var(--doc-muted)\" }}>{f.metric.label}</dt>\n <dd className=\"m-0 font-semibold tabular-nums\">{f.metric.display ?? formatValue(f.metric.value, f.metric.format)}</dd>\n {f.metric.delta ? (\n <dd className=\"m-0\">\n <span style={{ color: \"var(--doc-muted)\" }}>{f.metric.comparisonLabel ?? \"前期比\"} </span>\n <ChangeText delta={f.metric.delta} format={f.metric.format} betterWhen={f.metric.betterWhen} />\n </dd>\n ) : null}\n </dl>\n ) : null}\n </div>\n </article>\n ))}\n </section>\n )\n}\n\nexport default DocKeyFindings\n","\"use client\"\n\n/**\n * doc-kpi-scorecard — the key metrics in one place: actual, change from the previous period,\n * progress to target, and a small trend. One section for a monthly report, a QBR or an investor update.\n *\n * - `variant=\"table\"` (default) is a plain `table`: it prints well and each row stays together.\n * `variant=\"grid\"` is a 3-column `dl` of metric tiles for a short list (3–6 metrics).\n * - `value` is formatted by `format` (or shown as `display`); null shows \"—\".\n * - `delta` is the change itself: its direction comes from the sign, `betterWhen` (\"up\" by default;\n * `\"down\"` for churn, cost) decides good / bad. The mark ▲▼ and the sign are always printed, so\n * colour is never the only signal. `comparisonLabel` names it (\"前年同期比\"; default \"前期比\").\n * - `target` is shown in the metric's `format`; the achievement rate (value ÷ target) is computed here.\n * - `trend` is a single series `{ x, y }[]`, drawn as a `Sparkline`; leave it out and the column shows \"—\".\n * - `asOf` (a date only, e.g. \"2026-10-03\") and `source` go in a caption line under the block.\n * - The heading is a bare `h2` / `h3`; the document sets its size. The table fills the column\n * (`w-full`) and scrolls sideways inside its own wrapper when it is too wide.\n *\n * @example\n * import { DocKpiScorecard } from \"@/blocks/doc-kpi-scorecard/doc-kpi-scorecard\"\n * <DocKpiScorecard title=\"主要指標\" asOf=\"2026-10-03\" metrics={[{ label: \"売上\", value: 53_900_000, format: \"currency\", delta: { value: 3_700_000 }, comparisonLabel: \"前月比\", target: 52_000_000 }]} />\n */\nimport { Sparkline } from \"../../charts/sparkline\"\nimport { formatDelta, formatValue, type ValueFormat } from \"../../lib/format\"\n\nexport interface DocScorecardMetric {\n label: string\n value: number | null\n format?: ValueFormat\n /** Overrides the shown value. */\n display?: string\n /** The change from the comparison; direction comes from its sign. */\n delta?: { value: number; format?: ValueFormat }\n /** Name of the comparison, e.g. \"前年同期比\". Default \"前期比\". */\n comparisonLabel?: string\n /** Which way is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** The target for the period, in the same `format` as `value`. */\n target?: number\n /** One series over time, oldest first; the last one is the current value. */\n trend?: { x: string; y: number }[]\n}\n\nexport interface DocKpiScorecardProps {\n /** Heading text. Default \"主要指標\". */\n title?: string\n /** `2` directly under the document, `3` inside another section. Default 2. */\n headingLevel?: 2 | 3\n metrics: DocScorecardMetric[]\n variant?: \"table\" | \"grid\"\n /** When the numbers were taken: a date only, e.g. \"2026-10-03\". \"データ時点\" is added here. */\n asOf?: string\n source?: string\n}\n\nconst MUTED = { color: \"var(--doc-muted)\" } as const\nconst ACHIEVEMENT: ValueFormat = { type: \"percent\", digits: 1 }\n\n/** The change as a bare `span` (no text size): mark + signed value, so print and colour-blind readers get the direction; colour only adds good / bad. */\nfunction ChangeText({ delta, format, betterWhen = \"up\" }: { delta: { value: number; format?: ValueFormat }; format?: ValueFormat; betterWhen?: \"up\" | \"down\" }) {\n const { value } = delta\n const dir = value > 0 ? \"up\" : value < 0 ? \"down\" : \"flat\"\n const mark = dir === \"up\" ? \"▲\" : dir === \"down\" ? \"▼\" : \"→\"\n const word = dir === \"up\" ? \"増\" : dir === \"down\" ? \"減\" : \"横ばい\"\n const good = dir === \"flat\" ? undefined : (dir === \"up\") === (betterWhen === \"up\")\n const tone = good === undefined ? undefined : good ? \"text-positive\" : \"text-negative\"\n const text = formatDelta(value, delta.format ?? format)\n return (\n <span\n className={tone}\n style={tone ? undefined : { color: \"var(--doc-muted)\" }}\n aria-label={`${word}、${text}${good === undefined ? \"\" : good ? \"、改善\" : \"、悪化\"}`}\n >\n {mark} {text}\n </span>\n )\n}\n\nconst shown = (m: DocScorecardMetric) => m.display ?? formatValue(m.value, m.format)\nconst achievement = (m: DocScorecardMetric) =>\n m.target === undefined || m.target === 0 || m.value === null ? \"—\" : formatValue(m.value / m.target, ACHIEVEMENT)\nconst change = (m: DocScorecardMetric) => (m.delta ? <ChangeText delta={m.delta} format={m.format} betterWhen={m.betterWhen} /> : \"—\")\nconst trendOf = (m: DocScorecardMetric) => (m.trend ?? []).map(({ y }) => ({ value: y }))\n\nexport function DocKpiScorecard({\n title = \"主要指標\",\n headingLevel = 2,\n metrics,\n variant = \"table\",\n asOf,\n source,\n}: DocKpiScorecardProps) {\n const Heading = headingLevel === 3 ? \"h3\" : \"h2\"\n const caption = [source ? `出典: ${source}` : undefined, asOf ? `データ時点 ${asOf}` : undefined].filter(Boolean).join(\" / \")\n const columnLabel = metrics.find((m) => m.comparisonLabel)?.comparisonLabel ?? \"前期比\"\n\n return (\n <section data-slot=\"doc-kpi-scorecard\">\n <Heading>{title}</Heading>\n {variant === \"grid\" ? (\n <dl className=\"m-0 grid grid-cols-1 gap-4 sm:grid-cols-3 print:grid-cols-3\">\n {metrics.map((m) => (\n <div\n key={m.label}\n className=\"break-inside-avoid rounded-md border p-3\"\n style={{ borderColor: \"var(--doc-border)\", background: \"var(--doc-subtle)\" }}\n >\n <dt style={MUTED}>{m.label}</dt>\n <dd className=\"m-0 font-semibold tabular-nums\">{shown(m)}</dd>\n <dd className=\"m-0 flex flex-col gap-0.5\">\n {m.delta ? (\n <span>\n <span style={MUTED}>{m.comparisonLabel ?? \"前期比\"} </span>\n {change(m)}\n </span>\n ) : null}\n {m.target !== undefined ? (\n <span>\n <span style={MUTED}>達成率 </span>\n {achievement(m)}\n <span style={MUTED}>(目標 {formatValue(m.target, m.format)})</span>\n </span>\n ) : null}\n </dd>\n {m.trend && m.trend.length > 1 ? (\n <dd className=\"m-0\">\n <Sparkline data={trendOf(m)} height={28} aria-label={`${m.label}の推移`} />\n </dd>\n ) : null}\n </div>\n ))}\n </dl>\n ) : (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"table w-full\">\n <thead>\n <tr>\n <th scope=\"col\">指標</th>\n <th scope=\"col\" className=\"text-right\">実績</th>\n <th scope=\"col\" className=\"text-right\">{columnLabel}</th>\n <th scope=\"col\" className=\"text-right\">目標</th>\n <th scope=\"col\" className=\"text-right\">達成率</th>\n <th scope=\"col\">推移</th>\n </tr>\n </thead>\n <tbody>\n {metrics.map((m) => (\n <tr key={m.label}>\n <th scope=\"row\" className=\"font-medium\">\n {m.label}\n </th>\n <td className=\"text-right font-semibold tabular-nums\">{shown(m)}</td>\n <td className=\"text-right whitespace-nowrap\">{change(m)}</td>\n <td className=\"text-right tabular-nums\">{m.target === undefined ? \"—\" : formatValue(m.target, m.format)}</td>\n <td className=\"text-right tabular-nums\">{achievement(m)}</td>\n <td>\n {m.trend && m.trend.length > 1 ? (\n <Sparkline data={trendOf(m)} height={24} aria-label={`${m.label}の推移`} />\n ) : (\n \"—\"\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {caption ? <p style={MUTED}>{caption}</p> : null}\n </section>\n )\n}\n\nexport default DocKpiScorecard\n","\"use client\"\n\n/**\n * doc-report-header — the opening of a document: title, subtitle, and a short fact sheet\n * (period, data as-of, author, source). One section to put directly under `<Document>`.\n *\n * - The only block that owns the `h1`. The rest of the document starts at `h2`.\n * - Typography comes from the document (`h1` / `p`); this block sets no text size and no width.\n * - The fact sheet is a `dl`, so a screen reader reads each label with its value. An empty\n * fact is left out instead of showing \"—\".\n * - `break-inside-avoid` keeps the header on one page when printed.\n *\n * @example\n * import { DocReportHeader } from \"@/blocks/doc-report-header/doc-report-header\"\n * <DocReportHeader title=\"2026 年 9 月 月次事業報告\" period=\"2026-09-01 〜 2026-09-30\" asOf=\"2026-10-03\" />\n */\nimport type { ReactNode } from \"react\"\n\nexport interface DocReportHeaderProps {\n /** The document title (h1). State the subject and the period, not a slogan. */\n title: string\n /** One line under the title, e.g. who the report is for. */\n subtitle?: ReactNode\n /** The period the numbers cover, e.g. \"2026 年 9 月\" or \"2026-07-01 〜 2026-09-30\". */\n period?: string\n /** When the data was taken: a date only, e.g. \"2026-10-03\". Shown under \"データ時点\". */\n asOf?: string\n author?: string\n /** Where the numbers come from, e.g. \"受注管理システム、会計システム\". */\n source?: string\n}\n\nexport function DocReportHeader({ title, subtitle, period, asOf, author, source }: DocReportHeaderProps) {\n const facts: { label: string; value: string }[] = [\n ...(period ? [{ label: \"対象期間\", value: period }] : []),\n ...(asOf ? [{ label: \"データ時点\", value: asOf }] : []),\n ...(author ? [{ label: \"作成者\", value: author }] : []),\n ...(source ? [{ label: \"出典\", value: source }] : []),\n ]\n\n return (\n <header data-slot=\"doc-report-header\" className=\"break-inside-avoid\">\n <h1>{title}</h1>\n {subtitle ? (\n typeof subtitle === \"string\" ? (\n <p style={{ color: \"var(--doc-muted)\" }}>{subtitle}</p>\n ) : (\n <div style={{ color: \"var(--doc-muted)\" }}>{subtitle}</div>\n )\n ) : null}\n {facts.length > 0 ? <dl\n className=\"grid grid-cols-1 gap-x-8 gap-y-2 border-y py-3 sm:grid-cols-2 print:grid-cols-2\"\n style={{ borderColor: \"var(--doc-border)\" }}\n >\n {facts.map((fact) => (\n <div key={fact.label} className=\"flex gap-3\">\n <dt className=\"shrink-0\" style={{ color: \"var(--doc-muted)\" }}>\n {fact.label}\n </dt>\n <dd className=\"m-0 font-medium\">{fact.value}</dd>\n </div>\n ))}\n </dl> : null}\n </header>\n )\n}\n\nexport default DocReportHeader\n"]}
@@ -1,5 +1,5 @@
1
1
  import { loadCatalog, isDocLang, DOC_LANGS, DEFAULT_DOC_LANG, docsForLang, readDoc, resolveDoc, groupBySection } from './chunk-2KRCGXBY.js';
2
- import { log, printJson } from './chunk-3G43C6OL.js';
2
+ import { log, printJson } from './chunk-GNXCX4WE.js';
3
3
  import './chunk-C2CX6GLX.js';
4
4
  import pc from 'picocolors';
5
5
 
@@ -110,5 +110,5 @@ async function docs(_root, args) {
110
110
  }
111
111
 
112
112
  export { docs };
113
- //# sourceMappingURL=docs-ZGDJUHJI.js.map
114
- //# sourceMappingURL=docs-ZGDJUHJI.js.map
113
+ //# sourceMappingURL=docs-JVP4RPKT.js.map
114
+ //# sourceMappingURL=docs-JVP4RPKT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/docs.ts"],"names":["content"],"mappings":";;;;;;AAgBA,SAAS,MAAM,QAAA,EAA0B;AACvC,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,QAAA;AAClC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,OAAO,SACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9B,MAAA,OAAA,GAAU,CAAC,OAAA;AACX,MAAA,OAAO,EAAA,CAAG,IAAI,IAAI,CAAA;AAAA,IACpB;AACA,IAAA,IAAI,SAAS,OAAO,IAAA;AACpB,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,GAAG,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC3D,IAAA,IAAI,QAAQ,IAAA,CAAK,IAAI,GAAG,OAAO,EAAA,CAAG,IAAI,IAAI,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,SAAS,UAAU,OAAA,EAA2B;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA;AAClE,EAAA,KAAA,MAAW,KAAA,IAAS,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,EAAA,CAAG,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IACnE;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,oEAAoE,CAAC,CAAA;AACxF,EAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,2DAA2D,CAAC,CAAA;AACjF;AAEA,SAAS,MAAA,CAAO,KAAe,OAAA,EAAiB;AAC9C,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB;AAAA,GACF;AACF;AAGA,eAAsB,IAAA,CAAK,OAAe,IAAA,EAAmC;AAC3E,EAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,GAAA,CAAI,MAAM,gHAAgH,CAAA;AAC1H,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA;AAC5B,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,CAAC,SAAA,CAAU,QAAQ,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAA,CAAO,QAAQ,CAAC,iBAAiB,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACpF,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAgB,SAAA,CAAU,QAAQ,CAAA,GAAI,QAAA,GAAW,gBAAA;AAEvD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,EAAS,IAAI,CAAA;AACzC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,EAAA,CAAI,CAAA;AACnD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA;AAE/B,EAAA,IAAI,IAAA,CAAK,MAAM,GAAA,EAAK;AAClB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAA,EAAK,OAAA,EAAS,OAAA,CAAQ,GAAG,CAAA,EAAE,CAAE,CAAA;AACnE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,SAAA,CAAU,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,OAAA,EAAAA,QAAAA,OAAc,MAAA,CAAO,GAAA,EAAKA,QAAO,CAAC,GAAG,CAAA;AAC/E,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,OAAA,EAAAA,QAAAA,EAAQ,KAAMA,QAAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,aAAa,IAAI,IAAI,CAAA;AAC7F,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AAC5B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,SAAA,CAAU;AAAA,QACR,IAAA;AAAA,QACA,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,MAAM,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,YAAA,EAAa,MAAO;AAAA,UAC1E,IAAA;AAAA,UACA,KAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACF,CAAE;AAAA,OACH,CAAA;AACD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,IAAI,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,CAAA,EAAI,IAAI,CAAA,yBAAA,EAA4B,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC3F,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,IAAA,MAAM,cAAc,KAAA,CAAM,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvD,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,WAAA,CAAY,MAAA,GACR,CAAA,eAAA,EAAkB,IAAI,oBAAoB,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAC5E,kBAAkB,IAAI,CAAA,2CAAA;AAAA,KAC5B;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,OAAO,CAAC,CAAA;AACpC,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAA,EAAS,IAAI,IAAI,CAAA;AACpD,EAAA,OAAO,CAAA;AACT","file":"docs-ZGDJUHJI.js","sourcesContent":["import pc from \"picocolors\"\nimport {\n DEFAULT_DOC_LANG,\n DOC_LANGS,\n docsForLang,\n groupBySection,\n isDocLang,\n loadCatalog,\n readDoc,\n resolveDoc,\n type DocEntry,\n type DocLang,\n} from \"./docs-catalog\"\nimport { log, printJson, type ParsedArgs } from \"./util\"\n\n/** Highlight Markdown for a terminal. Piped output stays untouched. */\nfunction paint(markdown: string): string {\n if (!process.stdout.isTTY) return markdown\n let inFence = false\n return markdown\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence\n return pc.dim(line)\n }\n if (inFence) return line\n if (/^#{1,6}\\s/.test(line)) return pc.bold(pc.magenta(line))\n if (/^>\\s?/.test(line)) return pc.dim(line)\n return line\n })\n .join(\"\\n\")\n}\n\nfunction printList(entries: DocEntry[]): void {\n const width = Math.max(...entries.map((doc) => doc.slug.length), 0)\n for (const group of groupBySection(entries)) {\n console.log(\"\")\n console.log(pc.bold(group.title))\n for (const doc of group.docs) {\n const slug = doc.slug.padEnd(width)\n console.log(` ${pc.cyan(slug)} ${doc.description || doc.title}`)\n }\n }\n console.log(\"\")\n console.log(pc.dim(\"vantage docs <name> show one page --json machine-readable\"))\n console.log(pc.dim(\"vantage docs --all show every page --lang ja | en\"))\n}\n\nfunction toJson(doc: DocEntry, content: string) {\n return {\n slug: doc.slug,\n lang: doc.lang,\n title: doc.title,\n description: doc.description,\n section: doc.section,\n sectionTitle: doc.sectionTitle,\n content,\n }\n}\n\n/** `vantage docs [name] [--list] [--all] [--json] [--lang ja|en]` */\nexport async function docs(_root: string, args: ParsedArgs): Promise<number> {\n const catalog = loadCatalog()\n if (!catalog) {\n log.error(\"The bundled documentation is missing. Reinstall @squadbase/vantage, or run `pnpm build` in the framework repo.\")\n return 1\n }\n\n const langFlag = args.flags.lang\n if (langFlag !== undefined && !isDocLang(langFlag)) {\n log.error(`Unknown --lang \"${String(langFlag)}\". Available: ${DOC_LANGS.join(\", \")}`)\n return 1\n }\n const lang: DocLang = isDocLang(langFlag) ? langFlag : DEFAULT_DOC_LANG\n\n const entries = docsForLang(catalog, lang)\n if (entries.length === 0) {\n log.error(`No documentation bundled for \"${lang}\".`)\n return 1\n }\n\n const json = Boolean(args.flags.json)\n const name = args.positionals[1]\n\n if (args.flags.all) {\n const pages = entries.map((doc) => ({ doc, content: readDoc(doc) }))\n if (json) {\n printJson({ lang, docs: pages.map(({ doc, content }) => toJson(doc, content)) })\n return 0\n }\n process.stdout.write(pages.map(({ content }) => content.trimEnd()).join(\"\\n\\n---\\n\\n\") + \"\\n\")\n return 0\n }\n\n if (!name || args.flags.list) {\n if (json) {\n printJson({\n lang,\n docs: entries.map(({ slug, title, description, section, sectionTitle }) => ({\n slug,\n title,\n description,\n section,\n sectionTitle,\n })),\n })\n return 0\n }\n printList(entries)\n return 0\n }\n\n const found = resolveDoc(entries, name)\n if (found.kind === \"ambiguous\") {\n log.error(`\"${name}\" matches several pages: ${found.matches.map((d) => d.slug).join(\", \")}`)\n return 1\n }\n if (found.kind === \"missing\") {\n const suggestions = found.suggestions.map((d) => d.slug)\n log.error(\n suggestions.length\n ? `No page named \"${name}\". Did you mean: ${suggestions.slice(0, 8).join(\", \")}?`\n : `No page named \"${name}\". Run \\`vantage docs\\` to list every page.`,\n )\n return 1\n }\n\n const content = readDoc(found.doc)\n if (json) {\n printJson(toJson(found.doc, content))\n return 0\n }\n process.stdout.write(paint(content.trimEnd()) + \"\\n\")\n return 0\n}\n"]}
1
+ {"version":3,"sources":["../src/cli/docs.ts"],"names":["content"],"mappings":"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","file":"docs-JVP4RPKT.js","sourcesContent":["import pc from \"picocolors\"\nimport {\n DEFAULT_DOC_LANG,\n DOC_LANGS,\n docsForLang,\n groupBySection,\n isDocLang,\n loadCatalog,\n readDoc,\n resolveDoc,\n type DocEntry,\n type DocLang,\n} from \"./docs-catalog\"\nimport { log, printJson, type ParsedArgs } from \"./util\"\n\n/** Highlight Markdown for a terminal. Piped output stays untouched. */\nfunction paint(markdown: string): string {\n if (!process.stdout.isTTY) return markdown\n let inFence = false\n return markdown\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence\n return pc.dim(line)\n }\n if (inFence) return line\n if (/^#{1,6}\\s/.test(line)) return pc.bold(pc.magenta(line))\n if (/^>\\s?/.test(line)) return pc.dim(line)\n return line\n })\n .join(\"\\n\")\n}\n\nfunction printList(entries: DocEntry[]): void {\n const width = Math.max(...entries.map((doc) => doc.slug.length), 0)\n for (const group of groupBySection(entries)) {\n console.log(\"\")\n console.log(pc.bold(group.title))\n for (const doc of group.docs) {\n const slug = doc.slug.padEnd(width)\n console.log(` ${pc.cyan(slug)} ${doc.description || doc.title}`)\n }\n }\n console.log(\"\")\n console.log(pc.dim(\"vantage docs <name> show one page --json machine-readable\"))\n console.log(pc.dim(\"vantage docs --all show every page --lang ja | en\"))\n}\n\nfunction toJson(doc: DocEntry, content: string) {\n return {\n slug: doc.slug,\n lang: doc.lang,\n title: doc.title,\n description: doc.description,\n section: doc.section,\n sectionTitle: doc.sectionTitle,\n content,\n }\n}\n\n/** `vantage docs [name] [--list] [--all] [--json] [--lang ja|en]` */\nexport async function docs(_root: string, args: ParsedArgs): Promise<number> {\n const catalog = loadCatalog()\n if (!catalog) {\n log.error(\"The bundled documentation is missing. Reinstall @squadbase/vantage, or run `pnpm build` in the framework repo.\")\n return 1\n }\n\n const langFlag = args.flags.lang\n if (langFlag !== undefined && !isDocLang(langFlag)) {\n log.error(`Unknown --lang \"${String(langFlag)}\". Available: ${DOC_LANGS.join(\", \")}`)\n return 1\n }\n const lang: DocLang = isDocLang(langFlag) ? langFlag : DEFAULT_DOC_LANG\n\n const entries = docsForLang(catalog, lang)\n if (entries.length === 0) {\n log.error(`No documentation bundled for \"${lang}\".`)\n return 1\n }\n\n const json = Boolean(args.flags.json)\n const name = args.positionals[1]\n\n if (args.flags.all) {\n const pages = entries.map((doc) => ({ doc, content: readDoc(doc) }))\n if (json) {\n printJson({ lang, docs: pages.map(({ doc, content }) => toJson(doc, content)) })\n return 0\n }\n process.stdout.write(pages.map(({ content }) => content.trimEnd()).join(\"\\n\\n---\\n\\n\") + \"\\n\")\n return 0\n }\n\n if (!name || args.flags.list) {\n if (json) {\n printJson({\n lang,\n docs: entries.map(({ slug, title, description, section, sectionTitle }) => ({\n slug,\n title,\n description,\n section,\n sectionTitle,\n })),\n })\n return 0\n }\n printList(entries)\n return 0\n }\n\n const found = resolveDoc(entries, name)\n if (found.kind === \"ambiguous\") {\n log.error(`\"${name}\" matches several pages: ${found.matches.map((d) => d.slug).join(\", \")}`)\n return 1\n }\n if (found.kind === \"missing\") {\n const suggestions = found.suggestions.map((d) => d.slug)\n log.error(\n suggestions.length\n ? `No page named \"${name}\". Did you mean: ${suggestions.slice(0, 8).join(\", \")}?`\n : `No page named \"${name}\". Run \\`vantage docs\\` to list every page.`,\n )\n return 1\n }\n\n const content = readDoc(found.doc)\n if (json) {\n printJson(toJson(found.doc, content))\n return 0\n }\n process.stdout.write(paint(content.trimEnd()) + \"\\n\")\n return 0\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { runDiagnostics } from './chunk-BCE22JSM.js';
2
- import './chunk-JGRMRXXZ.js';
3
- import './chunk-KLEIVDUV.js';
4
- import { scanProject } from './chunk-ZVANIULZ.js';
5
- import { printJson, frameworkVersion, log } from './chunk-3G43C6OL.js';
1
+ import { runDiagnostics } from './chunk-7DZGJQ3P.js';
2
+ import './chunk-JKLLFVEU.js';
3
+ import './chunk-CEXAQQ5W.js';
4
+ import { scanProject } from './chunk-RNTDBX6S.js';
5
+ import { printJson, frameworkVersion, log } from './chunk-GNXCX4WE.js';
6
6
  import './chunk-C2CX6GLX.js';
7
7
  import fs from 'fs';
8
8
  import path from 'path';
@@ -19,7 +19,7 @@ async function doctor(root, args) {
19
19
  });
20
20
  const pkgPath = path.join(root, "package.json");
21
21
  facets.push({ name: "package.json", ok: fs.existsSync(pkgPath), detail: fs.existsSync(pkgPath) ? "found" : "missing" });
22
- const lockfiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock"];
22
+ const lockfiles = ["bun.lock", "bun.lockb", "pnpm-lock.yaml", "package-lock.json", "yarn.lock"];
23
23
  const lock = lockfiles.find((f) => fs.existsSync(path.join(root, f)) || fs.existsSync(path.join(root, "..", f)) || fs.existsSync(path.join(root, "..", "..", f)));
24
24
  facets.push({ name: "lockfile", ok: Boolean(lock), detail: lock ?? "none found" });
25
25
  let installedVantage = "not installed";
@@ -54,5 +54,5 @@ async function doctor(root, args) {
54
54
  }
55
55
 
56
56
  export { doctor };
57
- //# sourceMappingURL=doctor-VFKEMR54.js.map
58
- //# sourceMappingURL=doctor-VFKEMR54.js.map
57
+ //# sourceMappingURL=doctor-5E2VEZPK.js.map
58
+ //# sourceMappingURL=doctor-5E2VEZPK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/doctor.ts"],"names":["require"],"mappings":"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","file":"doctor-5E2VEZPK.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { runDiagnostics } from \"../core/diagnostics\"\nimport { scanProject } from \"../core/scan\"\nimport { frameworkVersion, log, printJson, type ParsedArgs } from \"./util\"\n\ninterface Facet {\n name: string\n ok: boolean\n detail: string\n}\n\n/** `vantage doctor` — environment and installation health checks. */\nexport async function doctor(root: string, args: ParsedArgs): Promise<number> {\n const facets: Facet[] = []\n\n const nodeMajor = Number(process.versions.node.split(\".\")[0])\n facets.push({\n name: \"node\",\n ok: nodeMajor >= 20,\n detail: `v${process.versions.node}${nodeMajor >= 20 ? \"\" : \" (requires >= 20)\"}`,\n })\n\n const pkgPath = path.join(root, \"package.json\")\n facets.push({ name: \"package.json\", ok: fs.existsSync(pkgPath), detail: fs.existsSync(pkgPath) ? \"found\" : \"missing\" })\n\n const lockfiles = [\"bun.lock\", \"bun.lockb\", \"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\"]\n const lock = lockfiles.find((f) => fs.existsSync(path.join(root, f)) || fs.existsSync(path.join(root, \"..\", f)) || fs.existsSync(path.join(root, \"..\", \"..\", f)))\n facets.push({ name: \"lockfile\", ok: Boolean(lock), detail: lock ?? \"none found\" })\n\n let installedVantage = \"not installed\"\n let vantageOk = false\n try {\n const require = createRequire(path.join(root, \"noop.js\"))\n const p = require.resolve(\"@squadbase/vantage/package.json\")\n installedVantage = (JSON.parse(fs.readFileSync(p, \"utf8\")) as { version: string }).version\n vantageOk = true\n } catch {\n /* not resolvable */\n }\n facets.push({ name: \"@squadbase/vantage\", ok: vantageOk, detail: installedVantage })\n\n const model = scanProject(root)\n const errors = runDiagnostics(root, model).filter((d) => d.severity === \"error\")\n facets.push({\n name: \"project\",\n ok: errors.length === 0,\n detail: errors.length === 0 ? \"no blocking errors\" : `${errors.length} error(s) (run \\`vantage check\\`)`,\n })\n\n const allOk = facets.every((f) => f.ok)\n\n if (args.flags.json) {\n printJson({ ok: allOk, cli: frameworkVersion(), facets })\n return allOk ? 0 : 1\n }\n\n log.brand(`doctor (cli v${frameworkVersion()})`)\n for (const f of facets) {\n const line = `${f.name.padEnd(22)} ${f.detail}`\n if (f.ok) log.ok(line)\n else log.error(line)\n }\n return allOk ? 0 : 1\n}\n"]}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Locale-aware number formatting shared by KPI cards, tables and charts. All
3
+ * shortening is delegated to `Intl.NumberFormat` (`notation: "compact"`); this
4
+ * module never hard-codes unit thresholds or unit strings.
5
+ *
6
+ * | `format` | input | ja-JP output |
7
+ * |--------------------------------------------|--------------|----------------|
8
+ * | `"compact"` (default) | `48_200_000` | `4,820万` |
9
+ * | `"number"` | `1234.567` | `1,234.57` |
10
+ * | `"currency"` (JPY, compact) | `48_200_000` | `¥4,820万` |
11
+ * | `{ type: "currency", notation: "standard" }` | `48_200_000` | `¥48,200,000` |
12
+ * | `{ type: "currency", currency: "USD" }` | `1234.5` | `$1,234.5` |
13
+ * | `"percent"` — pass a **ratio** | `0.124` | `12.4%` |
14
+ * | `{ type: "percent", digits: 0 }` | `0.124` | `12%` |
15
+ * | `"multiple"` | `1.5` | `1.5×` |
16
+ * | `{ type: "number", unit: "件" }` | `48_210` | `48,210件` |
17
+ * | `{ type: "compact", unit: "人" }` | `12_345` | `1.2万人` |
18
+ * | `"duration"` — pass **seconds** | `12_000` | `3時間20分` |
19
+ * | `{ type: "duration", durationUnit: "minute" }` | `2160` | `1.5日` |
20
+ *
21
+ * - `percent` takes a ratio (0.124 → 12.4%). Passing 12.4 renders 1,240%. The fraction
22
+ * digits are **fixed**, never trimmed (`PERCENT_DIGITS` = 1: 0.14 → "14.0%", never "14%"
23
+ * beside "11.9%"). Pass `digits` in the format to share another count across cards.
24
+ * - A minus sign is always U+2212 (`MINUS_SIGN`, "−1,234" / "−5.0%"), never the hyphen-minus.
25
+ * - `currency` defaults to JPY and to compact notation (万・億 in ja); pass
26
+ * `notation: "standard"` for every digit (tables, invoices). In ja-JP the yen
27
+ * sign is the half-width `¥`.
28
+ * - `unit` is a counter appended right after the number, with no space
29
+ * ("48,210件", "1.2万人"), for `number` / `compact` / `currency`. It is
30
+ * ignored for `percent` and `duration`, and for `multiple` it replaces the
31
+ * default `×` ("2.7倍"). Do not write it into a `valueFormatter` by hand.
32
+ * - Charts take the same `format` a KpiCard takes (`format="currency"`).
33
+ * `toValueFormatter(format)` turns it into a function for places that need
34
+ * one (a `valueFormatter`, table cells).
35
+ * - Missing values (null / undefined / NaN) render as `—` (`EMPTY_VALUE`).
36
+ * - Dates go through `formatDate` (`Intl.DateTimeFormat`): `"date"` → `2026/10/20`,
37
+ * `"datetime"` → `2026/10/20 14:30`, `"year-month"` → `2026年10月`, `"month"` → `10月`,
38
+ * `"year"` → `2026年`.
39
+ * - A period goes through `formatDateRange`: `2026/9/23〜10/20` (same year drops the end year),
40
+ * `2025/12/20〜2026/1/18` across years; month and day are not zero-padded.
41
+ */
42
+ /**
43
+ * The kind of number a value is. Pick by what the number means, not by how
44
+ * long it is: `currency` for money, `percent` for a ratio, `multiple` for a
45
+ * factor ("1.5×"), `duration` for a length of time ("3時間20分"), `number` for
46
+ * exact counts in tables, `compact` (default) for large headline counts (万・億).
47
+ */
48
+ type FormatKind = "number" | "compact" | "currency" | "percent" | "multiple" | "duration";
49
+ /** The unit a `duration` value is measured in. */
50
+ type DurationUnit = "second" | "minute" | "hour" | "day";
51
+ /**
52
+ * How to display a number: a `FormatKind` alone, or an object for digits,
53
+ * currency, notation and a counter. The same value is accepted by KpiCard,
54
+ * Delta, the charts (`format`) and `formatValue`.
55
+ *
56
+ * @example
57
+ * "currency" // ¥4,820万
58
+ * { type: "currency", notation: "standard" } // ¥48,200,000
59
+ * { type: "percent", digits: 1 } // 2.0%
60
+ * { type: "number", unit: "件" } // 48,210件
61
+ */
62
+ type ValueFormat = FormatKind | {
63
+ type: FormatKind;
64
+ /** Fixed number of fraction digits. */
65
+ digits?: number;
66
+ /** ISO 4217 code for `currency`. Default `"JPY"`. */
67
+ currency?: string;
68
+ /** `currency` only: `"compact"` (default, 万・億) or `"standard"` (every digit). */
69
+ notation?: "compact" | "standard";
70
+ /** Counter appended after the number, e.g. `"件"`, `"人"`. Ignored for `percent` and `duration`. For `multiple` it replaces the default `×` (`"倍"` → `2.7倍`). */
71
+ unit?: string;
72
+ /** 値をこの数で割ってから整形する。例: `divisor: 100`(セント → ドル)。0 と非有限は無視。 */
73
+ divisor?: number;
74
+ /** `duration` only: the unit the value is in. Default `"second"`. Reads as "45秒" / "12分" / "3時間20分" / "1.5日" (`digits` sets the fraction digits of days). */
75
+ durationUnit?: DurationUnit;
76
+ };
77
+ /** Locale used when none is passed. Every function here takes a `locale` to override it. */
78
+ declare const DEFAULT_LOCALE = "ja-JP";
79
+ /** Shown in place of a missing value (null / undefined / NaN). */
80
+ declare const EMPTY_VALUE = "\u2014";
81
+ /** The minus sign every formatter writes (U+2212), so a negative never mixes with a hyphen-minus. */
82
+ declare const MINUS_SIGN = "\u2212";
83
+ /** Extra options for `formatValue`. */
84
+ interface FormatValueOptions {
85
+ /** `"auto"` (default) signs negatives only; `"exceptZero"` also writes `+` on positives (for differences). */
86
+ signDisplay?: "auto" | "exceptZero";
87
+ /** Round to this many significant digits (e.g. 3 for an estimate: 79,653,985 → 7,970万). */
88
+ significantDigits?: number;
89
+ }
90
+ /**
91
+ * The kind of a format, whether it was given as a string or an object. Use it
92
+ * to branch on the meaning of a metric (e.g. a `percent` metric compares in
93
+ * points) without unpacking `ValueFormat` yourself.
94
+ *
95
+ * @param format - The format as a KpiCard / chart takes it. `undefined` means the default.
96
+ * @returns The `FormatKind`; `"compact"` when `format` is omitted.
97
+ *
98
+ * @example
99
+ * formatKind("percent") // "percent"
100
+ * formatKind({ type: "currency", notation: "standard" }) // "currency"
101
+ * formatKind(undefined) // "compact"
102
+ */
103
+ declare function formatKind(format: ValueFormat | undefined): FormatKind;
104
+ /**
105
+ * Format a number for display — KPI values, table cells, chart labels and
106
+ * sentences built from data (titles, summaries). See the table at the top of
107
+ * this module.
108
+ *
109
+ * @param value - The number. `null` / `undefined` / `NaN` render as `—`.
110
+ * For `percent`, a ratio (0.124 means 12.4%).
111
+ * @param format - How to display it. Default `"compact"`.
112
+ * @param locale - BCP 47 locale. Default `"ja-JP"`.
113
+ * @param options - `signDisplay` and `significantDigits` (rounding for estimates).
114
+ * @returns The display string. In ja-JP the yen sign is the half-width `¥`.
115
+ *
116
+ * @example
117
+ * formatValue(48_200_000, "currency") // "¥4,820万"
118
+ * formatValue(48_200_000, { type: "currency", notation: "standard" }) // "¥48,200,000"
119
+ * formatValue(0.021, "percent") // "2.1%"
120
+ * formatValue(0.124, "percent", "ja-JP", { signDisplay: "exceptZero" }) // "+12.4%"
121
+ * formatValue(79_653_985, "currency", "ja-JP", { significantDigits: 3 }) // "¥7,970万"
122
+ * formatValue(48_210, { type: "number", unit: "件" }) // "48,210件"
123
+ * formatValue(1.5, "multiple") // "1.5×"
124
+ * formatValue(null) // "—"
125
+ */
126
+ declare function formatValue(value: number | null | undefined, format?: ValueFormat, locale?: string, options?: FormatValueOptions): string;
127
+ /**
128
+ * Like `formatValue`, but always signed (except zero) — for a difference
129
+ * between two values ("+¥530万", "−120件"). Use `formatPoints` instead for a
130
+ * difference between two rates.
131
+ *
132
+ * @param value - The difference (current − previous). Missing values render as `—`.
133
+ * @param format - Format of the metric itself. Default `"compact"`.
134
+ * @param locale - BCP 47 locale. Default `"ja-JP"`.
135
+ * @returns The signed display string; zero has no sign.
136
+ *
137
+ * @example
138
+ * formatDelta(5_300_000, "currency") // "+¥530万"
139
+ * formatDelta(-120, { type: "number", unit: "件" }) // "−120件"
140
+ * formatDelta(0.031, "percent") // "+3.1%"
141
+ * formatDelta(0, "currency") // "¥0"
142
+ */
143
+ declare function formatDelta(value: number | null | undefined, format?: ValueFormat, locale?: string): string;
144
+ /**
145
+ * A difference between two rates in percentage points, always signed:
146
+ * `formatPoints(0.021 - 0.026)` → `"−0.5pt"`. Use it instead of a relative
147
+ * change for rate metrics (churn, conversion), where "−19.2%" reads as a drop
148
+ * of nineteen points. `signDisplay: "never"` drops the sign ("あと 0.5pt").
149
+ *
150
+ * @param difference - The difference of two **ratios** (0.021 − 0.026). Missing values render as `—`.
151
+ * @param locale - BCP 47 locale. Default `"ja-JP"`.
152
+ * @param options - `digits`: fixed fraction digits (default `PERCENT_DIGITS` = 1, so "0.0pt" / "+0.5pt"); `signDisplay`:
153
+ * `"exceptZero"` (default) or `"never"` when the sentence already says the direction.
154
+ * @returns The difference in points with the `pt` suffix.
155
+ *
156
+ * @example
157
+ * formatPoints(0.021 - 0.026) // "−0.5pt"
158
+ * formatPoints(0.031 - 0.026) // "+0.5pt"
159
+ * formatPoints(0.02 - 0.015, "ja-JP", { signDisplay: "never" }) // "0.5pt"(「目標まであと 0.5pt」)
160
+ */
161
+ declare function formatPoints(difference: number | null | undefined, locale?: string, options?: {
162
+ digits?: number;
163
+ signDisplay?: "exceptZero" | "never";
164
+ }): string;
165
+ /**
166
+ * Binds a format and locale into a single-argument formatter, for a chart
167
+ * `valueFormatter` or a table cell: `valueFormatter={toValueFormatter("currency")}`.
168
+ * Prefer passing `format` to the chart directly; this is for APIs that only
169
+ * take a function.
170
+ *
171
+ * @param format - How to display each value. Default `"compact"`.
172
+ * @param locale - BCP 47 locale. Default `"ja-JP"`.
173
+ * @returns `(value) => string`, rendering missing values as `—`.
174
+ *
175
+ * @example
176
+ * const yen = toValueFormatter("currency")
177
+ * yen(48_200_000) // "¥4,820万"
178
+ * yen(null) // "—"
179
+ * const count = toValueFormatter({ type: "number", unit: "件" })
180
+ * count(48_210) // "48,210件"(表のセル)
181
+ */
182
+ declare function toValueFormatter(format?: ValueFormat, locale?: string): (value: number | null | undefined) => string;
183
+ /**
184
+ * 日付の書式。何を表す日付かで選ぶ: 日単位は `"date"`、時刻まで要るなら `"datetime"`、
185
+ * 月次の集計は `"year-month"`(年をまたぐ軸)か `"month"`(同じ年の中の軸)、年次は `"year"`。
186
+ */
187
+ type DateStyle = "date" | "datetime" | "month" | "year-month" | "year";
188
+ /** `formatDate` の追加オプション。 */
189
+ interface FormatDateOptions {
190
+ /**
191
+ * IANA のタイムゾーン名(例: `"Asia/Tokyo"`)。既定は実行環境のタイムゾーン。
192
+ * サーバーとブラウザで描画が食い違う(SSR)なら固定する。日付だけの文字列(`"2026-10-20"`)には効かず、常にその暦日のまま出す。
193
+ */
194
+ timeZone?: string;
195
+ }
196
+ /**
197
+ * 日付を表示用の文字列にする。表のセル・タイトル・文に埋める日付に使い、`toLocaleString` や手組みの
198
+ * `getMonth() + 1` は使わない。
199
+ *
200
+ * @param value - `Date`、エポックミリ秒、または日付文字列(`"2026-10-20"`、ISO 8601)。`null` / `undefined` / 解釈できない値は `—`。
201
+ * @param style - 何を表す日付か。既定 `"date"`。
202
+ * @param locale - BCP 47 ロケール。既定 `"ja-JP"`。
203
+ * @param options - `timeZone`。
204
+ * @returns 表示文字列。
205
+ *
206
+ * @example
207
+ * formatDate("2026-10-20") // "2026/10/20"
208
+ * formatDate(new Date("2026-10-20T05:30:00Z"), "datetime", "ja-JP", { timeZone: "Asia/Tokyo" }) // "2026/10/20 14:30"
209
+ * formatDate("2026-10-01", "year-month") // "2026年10月"
210
+ * formatDate("2026-10-01", "month") // "10月"
211
+ * formatDate(null) // "—"
212
+ */
213
+ declare function formatDate(value: Date | string | number | null | undefined, style?: DateStyle, locale?: string, options?: FormatDateOptions): string;
214
+ /** `formatDateRange` のオプション。 */
215
+ interface FormatDateRangeOptions extends FormatDateOptions {
216
+ /** BCP 47 ロケール。既定 `"ja-JP"`。 */
217
+ locale?: string;
218
+ }
219
+ /**
220
+ * 期間を「2026/9/23〜10/20」の形にする。同じ年なら終了側の年を省き、年をまたぐときは両方に付ける。
221
+ * 月日はゼロ詰めしない。区切りは日本語で「〜」、それ以外のロケールでは「 – 」。始まりと終わりが同じ日なら 1 日だけ出す。
222
+ *
223
+ * @param start - 期間の最初の日(`Date`、エポックミリ秒、日付文字列)。`"2026-09-23"` のような日付だけの文字列はその暦日のまま出す。
224
+ * @param end - 期間の最後の日。
225
+ * @param options - `locale` と `timeZone`。
226
+ * @returns 表示文字列。どちらかが解釈できなければ `—`。
227
+ *
228
+ * @example
229
+ * formatDateRange("2026-09-23", "2026-10-20") // "2026/9/23〜10/20"
230
+ * formatDateRange("2025-12-20", "2026-01-18") // "2025/12/20〜2026/1/18"
231
+ */
232
+ declare function formatDateRange(start: Date | string | number | null | undefined, end: Date | string | number | null | undefined, options?: FormatDateRangeOptions): string;
233
+ /**
234
+ * 文中の ISO の年月・日付(`2023-04`、`2026-10-20`)を `formatDate` の書式に置き換える。期間や出典の注記のように、
235
+ * 利用者が文字列で渡す文に日付が混ざるときの表示用(`"2023-04 以降"` → `"2023年4月 以降"`)。日付でない数字は触らない。
236
+ *
237
+ * @param text - 日付を含みうる文。
238
+ * @param locale - BCP 47 ロケール。既定 `"ja-JP"`。
239
+ * @returns ISO の年月は `"year-month"`、年月日は `"date"` で整形した文。
240
+ */
241
+ declare function formatDatesInText(text: string, locale?: string): string;
242
+
243
+ export { DEFAULT_LOCALE as D, EMPTY_VALUE as E, type FormatDateOptions as F, MINUS_SIGN as M, type ValueFormat as V, type DateStyle as a, type FormatKind as b, type FormatValueOptions as c, formatDateRange as d, formatDatesInText as e, formatDate as f, formatDelta as g, formatKind as h, formatPoints as i, formatValue as j, toValueFormatter as t };
@@ -1,4 +1,4 @@
1
- import { cn } from '../chunk-A2UUGASH.js';
1
+ import { cn } from '../chunk-U736PVHY.js';
2
2
  import { forwardRef } from 'react';
3
3
  import { Streamdown } from 'streamdown';
4
4
  import { code } from '@streamdown/code';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/markdown/index.tsx"],"names":["MarkdownRenderer"],"mappings":";;;;;;;;AAyBO,IAAM,gBAAA,GAAmB,UAAA;AAAA,EAC9B,SAASA,iBAAAA,CAAiB,EAAE,OAAA,EAAS,SAAA,IAAa,GAAA,EAAK;AACrD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,mBAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,QAElD,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAS,EAAE,IAAA,IAAS,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA,KAC1C;AAAA,EAEJ;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA","file":"index.js","sourcesContent":["/**\n * `@squadbase/vantage/markdown` — markdown rendering, on its own subpath.\n *\n * This lives apart from `@squadbase/vantage/components` on purpose. Streamdown\n * bundles Shiki with every language grammar it supports — several hundred\n * chunks and roughly 11 MB of build output. Re-exporting it from the shared\n * `components` barrel would create an import edge that bundlers cannot drop,\n * so every app would emit that payload whether or not it renders markdown.\n * Behind its own entry, only apps that import this pay for it.\n */\nimport { forwardRef } from \"react\"\nimport { Streamdown } from \"streamdown\"\nimport { code } from \"@streamdown/code\"\n\nimport { cn } from \"../ui/cn\"\n\n// Streamdown's own stylesheet. Vite resolves this in the app build; it is\n// scoped to this optional entry, so apps that never import it stay unaffected.\nimport \"streamdown/styles.css\"\n\nexport interface MarkdownRendererProps {\n content: string\n className?: string\n}\n\nexport const MarkdownRenderer = forwardRef<HTMLDivElement, MarkdownRendererProps>(\n function MarkdownRenderer({ content, className }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"markdown-renderer\"\n className={cn(\"text-sm leading-relaxed\", className)}\n >\n <Streamdown plugins={{ code }}>{content}</Streamdown>\n </div>\n )\n },\n)\nMarkdownRenderer.displayName = \"MarkdownRenderer\"\n"]}
1
+ {"version":3,"sources":["../../src/markdown/index.tsx"],"names":["MarkdownRenderer"],"mappings":";;;;;;;;AAyBO,IAAM,gBAAA,GAAmB,UAAA;AAAA,EAC9B,SAASA,iBAAAA,CAAiB,EAAE,OAAA,EAAS,SAAA,IAAa,GAAA,EAAK;AACrD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,mBAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,QAElD,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAS,EAAE,IAAA,IAAS,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA,KAC1C;AAAA,EAEJ;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA","file":"index.js","sourcesContent":["/**\n * `@squadbase/vantage/markdown` — markdown rendering, on its own subpath.\n *\n * This lives apart from `@squadbase/vantage/components` on purpose. Streamdown\n * bundles Shiki with every language grammar it supports — several hundred\n * chunks and roughly 11 MB of build output. Re-exporting it from the shared\n * `components` barrel would create an import edge that bundlers cannot drop,\n * so every app would emit that payload whether or not it renders markdown.\n * Behind its own entry, only apps that import this pay for it.\n */\nimport { forwardRef } from \"react\"\nimport { Streamdown } from \"streamdown\"\nimport { code } from \"@streamdown/code\"\n\nimport { cn } from \"@squadbase/squadkit/lib/utils\"\n\n// Streamdown's own stylesheet. Vite resolves this in the app build; it is\n// scoped to this optional entry, so apps that never import it stay unaffected.\nimport \"streamdown/styles.css\"\n\nexport interface MarkdownRendererProps {\n content: string\n className?: string\n}\n\nexport const MarkdownRenderer = forwardRef<HTMLDivElement, MarkdownRendererProps>(\n function MarkdownRenderer({ content, className }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"markdown-renderer\"\n className={cn(\"text-sm leading-relaxed\", className)}\n >\n <Streamdown plugins={{ code }}>{content}</Streamdown>\n </div>\n )\n },\n)\nMarkdownRenderer.displayName = \"MarkdownRenderer\"\n"]}
@@ -1,4 +1,4 @@
1
- import { log, resolvePortOptions, reportPortInUse } from './chunk-3G43C6OL.js';
1
+ import { log, resolvePortOptions, resolveHostOptions, reportPortInUse } from './chunk-GNXCX4WE.js';
2
2
  import './chunk-C2CX6GLX.js';
3
3
  import fs from 'fs';
4
4
  import path from 'path';
@@ -18,6 +18,11 @@ async function preview(root, args) {
18
18
  return 1;
19
19
  }
20
20
  const { port, strictPort } = ports;
21
+ const hosts = resolveHostOptions(args.flags);
22
+ if (!hosts.ok) {
23
+ log.error(hosts.error);
24
+ return 1;
25
+ }
21
26
  if (manifest.mode === "fullstack") {
22
27
  const serverPath = path.join(root, "dist", "server", "index.mjs");
23
28
  if (!fs.existsSync(serverPath)) {
@@ -25,6 +30,9 @@ async function preview(root, args) {
25
30
  return 1;
26
31
  }
27
32
  if (!strictPort) log.info(" --no-strict-port has no effect on a fullstack preview");
33
+ if (Object.keys(hosts.options).length) {
34
+ log.info(" --host / --allowed-hosts have no effect on a fullstack preview");
35
+ }
28
36
  log.brand(`preview (fullstack) \u2192 http://localhost:${port}`);
29
37
  const child = spawn(process.execPath, [serverPath], {
30
38
  stdio: "inherit",
@@ -44,7 +52,7 @@ async function preview(root, args) {
44
52
  configFile: false,
45
53
  root,
46
54
  build: { outDir: path.join(root, "dist", "client") },
47
- preview: { port, strictPort }
55
+ preview: { port, strictPort, ...hosts.options }
48
56
  });
49
57
  } catch (err) {
50
58
  if (reportPortInUse(err, port, strictPort)) return 1;
@@ -57,5 +65,5 @@ async function preview(root, args) {
57
65
  }
58
66
 
59
67
  export { preview };
60
- //# sourceMappingURL=preview-QDCIVVSR.js.map
61
- //# sourceMappingURL=preview-QDCIVVSR.js.map
68
+ //# sourceMappingURL=preview-T6CLSQVX.js.map
69
+ //# sourceMappingURL=preview-T6CLSQVX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/preview.ts"],"names":[],"mappings":"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","file":"preview-T6CLSQVX.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { spawn } from \"node:child_process\"\nimport {\n log,\n reportPortInUse,\n resolveHostOptions,\n resolvePortOptions,\n type ParsedArgs,\n} from \"./util\"\n\n/** `vantage preview` — run the production build locally. */\nexport async function preview(root: string, args: ParsedArgs): Promise<number> {\n const manifestPath = path.join(root, \"dist\", \"vantage-manifest.json\")\n if (!fs.existsSync(manifestPath)) {\n log.error(\"No build found. Run `vantage build` first.\")\n return 1\n }\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as { mode: string }\n const ports = resolvePortOptions(args.flags, 4173)\n if (!ports.ok) {\n log.error(ports.error)\n return 1\n }\n const { port, strictPort } = ports\n const hosts = resolveHostOptions(args.flags)\n if (!hosts.ok) {\n log.error(hosts.error)\n return 1\n }\n\n if (manifest.mode === \"fullstack\") {\n const serverPath = path.join(root, \"dist\", \"server\", \"index.mjs\")\n if (!fs.existsSync(serverPath)) {\n log.error(\"Server bundle missing. Re-run `vantage build`.\")\n return 1\n }\n // The production Node server binds exactly one port and exits on EADDRINUSE,\n // so a fullstack preview is always strict — there is no walk to opt out of.\n if (!strictPort) log.info(\" --no-strict-port has no effect on a fullstack preview\")\n // The Node server listens on every interface and does no Host check, so\n // there is nothing for these to configure there.\n if (Object.keys(hosts.options).length) {\n log.info(\" --host / --allowed-hosts have no effect on a fullstack preview\")\n }\n log.brand(`preview (fullstack) → http://localhost:${port}`)\n const child = spawn(process.execPath, [serverPath], {\n stdio: \"inherit\",\n env: { ...process.env, PORT: String(port) },\n })\n return new Promise<number>((resolve) => {\n child.on(\"exit\", (code) => resolve(code ?? 0))\n const stop = () => child.kill(\"SIGINT\")\n process.on(\"SIGINT\", stop)\n process.on(\"SIGTERM\", stop)\n })\n }\n\n // SPA-only preview via Vite's static preview server.\n const { preview: vitePreview } = await import(\"vite\")\n let server: Awaited<ReturnType<typeof vitePreview>>\n try {\n server = await vitePreview({\n configFile: false,\n root,\n build: { outDir: path.join(root, \"dist\", \"client\") },\n preview: { port, strictPort, ...hosts.options },\n })\n } catch (err) {\n if (reportPortInUse(err, port, strictPort)) return 1\n throw err\n }\n log.brand(\"preview (spa)\")\n server.printUrls()\n return new Promise<number>(() => {})\n}\n"]}