@squadbase/vantage 0.6.2-dev1.01caa72 → 0.6.2-dev1.02aab78

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 (167) hide show
  1. package/dist/{build-X5NVCQKT.js → build-YOPOGPQB.js} +7 -7
  2. package/dist/{build-X5NVCQKT.js.map → build-YOPOGPQB.js.map} +1 -1
  3. package/dist/{check-ZBIH422T.js → check-FBHT6W6J.js} +5 -5
  4. package/dist/{check-ZBIH422T.js.map → check-FBHT6W6J.js.map} +1 -1
  5. package/dist/chunk-2IAPIOPS.js +152 -0
  6. package/dist/chunk-2IAPIOPS.js.map +1 -0
  7. package/dist/chunk-57GHR5LN.js +163 -0
  8. package/dist/chunk-57GHR5LN.js.map +1 -0
  9. package/dist/{chunk-7DZGJQ3P.js → chunk-5C2SEDPH.js} +21 -4
  10. package/dist/chunk-5C2SEDPH.js.map +1 -0
  11. package/dist/chunk-6OTTGAPO.js +44 -0
  12. package/dist/chunk-6OTTGAPO.js.map +1 -0
  13. package/dist/{chunk-2ICNHUG6.js → chunk-7652CGJJ.js} +10 -3
  14. package/dist/{chunk-2ICNHUG6.js.map → chunk-7652CGJJ.js.map} +1 -1
  15. package/dist/chunk-JXFCSF3K.js +673 -0
  16. package/dist/chunk-JXFCSF3K.js.map +1 -0
  17. package/dist/{chunk-IUPSBD6W.js → chunk-QOXXOFGL.js} +23 -886
  18. package/dist/chunk-QOXXOFGL.js.map +1 -0
  19. package/dist/{chunk-WAMZWZJB.js → chunk-R6MTJAHX.js} +6 -6
  20. package/dist/chunk-R6MTJAHX.js.map +1 -0
  21. package/dist/{chunk-CEXAQQ5W.js → chunk-S5MDTHH7.js} +180 -18
  22. package/dist/chunk-S5MDTHH7.js.map +1 -0
  23. package/dist/{chunk-JKLLFVEU.js → chunk-UWSQUHX6.js} +4 -99
  24. package/dist/chunk-UWSQUHX6.js.map +1 -0
  25. package/dist/cli.js +6 -6
  26. package/dist/components/index.d.ts +11 -247
  27. package/dist/components/index.js +4 -1
  28. package/dist/delta-text-CvwBGJ95.d.ts +15 -0
  29. package/dist/{dev-4XEDTELV.js → dev-GUKQT6U6.js} +7 -7
  30. package/dist/{dev-4XEDTELV.js.map → dev-GUKQT6U6.js.map} +1 -1
  31. package/dist/doc/index.d.ts +215 -2
  32. package/dist/doc/index.js +307 -3
  33. package/dist/doc/index.js.map +1 -1
  34. package/dist/{doctor-5E2VEZPK.js → doctor-B2O3GJDU.js} +5 -5
  35. package/dist/{doctor-5E2VEZPK.js.map → doctor-B2O3GJDU.js.map} +1 -1
  36. package/dist/format-U0cQl069.d.ts +243 -0
  37. package/dist/{routes-3SGAFDMC.js → routes-PVKNT777.js} +4 -4
  38. package/dist/{routes-3SGAFDMC.js.map → routes-PVKNT777.js.map} +1 -1
  39. package/dist/slide/index.d.ts +272 -1
  40. package/dist/slide/index.js +972 -2
  41. package/dist/slide/index.js.map +1 -1
  42. package/dist/table/index.js +4 -1
  43. package/dist/table/index.js.map +1 -1
  44. package/dist/{upgrade-JHXZBGQS.js → upgrade-7ZXMCTTR.js} +4 -4
  45. package/dist/{upgrade-JHXZBGQS.js.map → upgrade-7ZXMCTTR.js.map} +1 -1
  46. package/dist/vite/index.js +3 -3
  47. package/docs/en/changelog.md +2 -0
  48. package/docs/en/components.md +13 -2
  49. package/docs/en/doc/delta-text.md +40 -0
  50. package/docs/en/doc/doc-action-items.md +49 -0
  51. package/docs/en/doc/doc-callout.md +38 -0
  52. package/docs/en/doc/doc-data-table.md +60 -0
  53. package/docs/en/doc/doc-executive-summary.md +64 -0
  54. package/docs/en/doc/doc-figure.md +56 -0
  55. package/docs/en/doc/doc-key-findings.md +61 -0
  56. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  57. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  58. package/docs/en/doc/doc-report-header.md +46 -0
  59. package/docs/en/pages-and-metadata.md +15 -0
  60. package/docs/en/parts/area-chart.md +99 -0
  61. package/docs/en/parts/bar-chart.md +91 -0
  62. package/docs/en/parts/bar-list.md +50 -0
  63. package/docs/en/parts/category-bar.md +37 -0
  64. package/docs/en/parts/chart-frame.md +39 -0
  65. package/docs/en/parts/delta.md +4 -3
  66. package/docs/en/parts/donut-chart.md +72 -0
  67. package/docs/en/parts/funnel-steps.md +2 -1
  68. package/docs/en/parts/heatmap.md +53 -0
  69. package/docs/en/parts/kpi-card.md +2 -1
  70. package/docs/en/parts/legend.md +35 -0
  71. package/docs/en/parts/line-chart.md +94 -0
  72. package/docs/en/parts/progress-circle.md +33 -0
  73. package/docs/en/parts/sample-data.md +39 -0
  74. package/docs/en/parts/scatter-chart.md +56 -0
  75. package/docs/en/parts/tracker.md +36 -0
  76. package/docs/en/parts/updated-at.md +30 -0
  77. package/docs/en/parts/waterfall-chart.md +56 -0
  78. package/docs/en/slide/slide-chart-full.md +48 -0
  79. package/docs/en/slide/slide-chart-insight.md +52 -0
  80. package/docs/en/slide/slide-columns.md +46 -0
  81. package/docs/en/slide/slide-comparison.md +68 -0
  82. package/docs/en/slide/slide-cover.md +39 -0
  83. package/docs/en/slide/slide-exec-summary.md +47 -0
  84. package/docs/en/slide/slide-heading.md +38 -0
  85. package/docs/en/slide/slide-kpi-grid.md +55 -0
  86. package/docs/en/slide/slide-kpi-hero.md +58 -0
  87. package/docs/en/slide/slide-next-actions.md +49 -0
  88. package/docs/en/slide/slide-scorecard-table.md +54 -0
  89. package/docs/en/slide/slide-section.md +44 -0
  90. package/docs/en/slide/slide-source-line.md +34 -0
  91. package/docs/en/ui/alert-dialog.md +42 -0
  92. package/docs/en/ui/avatar.md +31 -0
  93. package/docs/en/ui/combobox.md +74 -0
  94. package/docs/en/ui/drawer.md +41 -0
  95. package/docs/en/ui/empty.md +1 -1
  96. package/docs/en/ui/error-state.md +4 -3
  97. package/docs/en/ui/field.md +42 -0
  98. package/docs/en/ui/hover-card.md +21 -0
  99. package/docs/en/ui/kbd.md +17 -0
  100. package/docs/en/ui/loading.md +1 -1
  101. package/docs/en/ui/pagination.md +36 -0
  102. package/docs/en/ui/radio-group.md +21 -0
  103. package/docs/en/ui/toast.md +44 -0
  104. package/docs/en/ui/toggle-group.md +4 -3
  105. package/docs/index.json +857 -77
  106. package/docs/ja/changelog.md +2 -0
  107. package/docs/ja/components.md +12 -1
  108. package/docs/ja/doc/delta-text.md +40 -0
  109. package/docs/ja/doc/doc-action-items.md +49 -0
  110. package/docs/ja/doc/doc-callout.md +38 -0
  111. package/docs/ja/doc/doc-data-table.md +60 -0
  112. package/docs/ja/doc/doc-executive-summary.md +64 -0
  113. package/docs/ja/doc/doc-figure.md +56 -0
  114. package/docs/ja/doc/doc-key-findings.md +61 -0
  115. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  116. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  117. package/docs/ja/doc/doc-report-header.md +46 -0
  118. package/docs/ja/page-types/slide.md +1 -0
  119. package/docs/ja/pages-and-metadata.md +15 -0
  120. package/docs/ja/parts/area-chart.md +49 -25
  121. package/docs/ja/parts/bar-chart.md +50 -24
  122. package/docs/ja/parts/bar-list.md +31 -8
  123. package/docs/ja/parts/chart-frame.md +36 -0
  124. package/docs/ja/parts/delta.md +5 -4
  125. package/docs/ja/parts/donut-chart.md +45 -26
  126. package/docs/ja/parts/funnel-steps.md +27 -8
  127. package/docs/ja/parts/heatmap.md +45 -0
  128. package/docs/ja/parts/kpi-card.md +2 -1
  129. package/docs/ja/parts/legend.md +36 -0
  130. package/docs/ja/parts/line-chart.md +48 -22
  131. package/docs/ja/parts/sample-data.md +61 -0
  132. package/docs/ja/parts/scatter-chart.md +69 -0
  133. package/docs/ja/parts/updated-at.md +27 -0
  134. package/docs/ja/parts/waterfall-chart.md +61 -0
  135. package/docs/ja/slide/slide-chart-full.md +48 -0
  136. package/docs/ja/slide/slide-chart-insight.md +52 -0
  137. package/docs/ja/slide/slide-columns.md +46 -0
  138. package/docs/ja/slide/slide-comparison.md +68 -0
  139. package/docs/ja/slide/slide-cover.md +39 -0
  140. package/docs/ja/slide/slide-exec-summary.md +47 -0
  141. package/docs/ja/slide/slide-heading.md +38 -0
  142. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  143. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  144. package/docs/ja/slide/slide-next-actions.md +49 -0
  145. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  146. package/docs/ja/slide/slide-section.md +44 -0
  147. package/docs/ja/slide/slide-source-line.md +34 -0
  148. package/docs/ja/ui/empty.md +1 -1
  149. package/docs/ja/ui/error-state.md +4 -3
  150. package/docs/ja/ui/loading.md +1 -1
  151. package/docs/ja/ui/toggle-group.md +4 -3
  152. package/package.json +2 -2
  153. package/registry/ui/delta.tsx +7 -4
  154. package/registry/ui/echart.tsx +123 -1
  155. package/registry/ui/kpi-card.tsx +9 -4
  156. package/skills/vantage-pitfalls/SKILL.md +5 -0
  157. package/skills/vantage-slide/SKILL.md +54 -36
  158. package/templates/AGENTS.md +4 -2
  159. package/templates/agents/doc.md +48 -0
  160. package/templates/agents/page.md +22 -1
  161. package/templates/agents/slide.md +70 -2
  162. package/theme.css +10 -7
  163. package/dist/chunk-7DZGJQ3P.js.map +0 -1
  164. package/dist/chunk-CEXAQQ5W.js.map +0 -1
  165. package/dist/chunk-IUPSBD6W.js.map +0 -1
  166. package/dist/chunk-JKLLFVEU.js.map +0 -1
  167. package/dist/chunk-WAMZWZJB.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ # SlideExecSummary
2
+
3
+ > 結論を先に伝える 1 枚。アクションタイトルと 3〜5 個の要点。
4
+
5
+ 結論が先の 1 枚です。アクションタイトルの下に、1 行の見出し(と任意の補足 1 行)を持つ要点を 3〜5 個並べます。
6
+
7
+ ```tsx
8
+ import { SlideExecSummary } from "@squadbase/vantage/slide";
9
+ import type { SlideExecSummaryProps, SlideExecSummaryPoint } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **`<Slide>` 1 枚の中身**です。`<Slide>` 自体は持たないので、`<Slide>` の直下に置いてください。ルートはキャンバス(1920×1080)いっぱい(100%)に広がり、`className` は受けません。余白・文字サイズ・グリッドは block の中で決まっている(1920×1080 の 12 カラム)ので、寸法を足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | Default | 説明 |
18
+ | --- | --- | --- | --- |
19
+ | `title` | `string` | | 結論を 1 文で書いた見出し(アクションタイトル)。**必須**。 |
20
+ | `points` | `SlideExecSummaryPoint[]` | | 要点(`{ headline: string; detail?: string }`)。3〜5 個。**必須**。 |
21
+ | `layout` | `"rows" \| "columns"` | `"rows"` | `rows` は番号付きで縦に積む。`columns` は横に並べる(3〜4 個向き)。 |
22
+ | `asOf` | `string` | | 数字を取った日。日付のみ(例: `"2026-10-01"`)。block が「2026-10-01 時点」と 1 回だけ「時点」を付けるので、「時点」は書かない。 |
23
+ | `source` | `string` | | 出典(例: `"社内 BI"`)。「出典: 社内 BI」と表示される。 |
24
+
25
+ ## 使い方
26
+
27
+ ```tsx
28
+ import { Slide, SlideExecSummary } from "@squadbase/vantage/slide";
29
+
30
+ <Slide>
31
+ <SlideExecSummary
32
+ title="Q2 は売上が計画を 4% 上回り、解約の改善が次の課題"
33
+ points={[
34
+ { headline: "売上は 5.4 億円で計画比 +4%", detail: "新規 38 社が牽引" },
35
+ { headline: "解約率は 1.8% まで低下", detail: "オンボーディング刷新の効果" },
36
+ { headline: "新規獲得は目標に 12 社届かず", detail: "紹介経由が想定の半分" },
37
+ ]}
38
+ asOf="2026-10-20"
39
+ source="社内 BI"
40
+ />
41
+ </Slide>
42
+ ```
43
+
44
+ ## 注意
45
+
46
+ - 6 個以上は描画されますが、`console.warn` が出ます。スライドを分けてください。
47
+ - `title` は話題(「売上の状況」)ではなく、結論の文で書きます。
@@ -0,0 +1,38 @@
1
+ # SlideHeading
2
+
3
+ > [部品] スライド 1 枚の見出し。アクションタイトルと任意のアイブロウ。
4
+
5
+ スライド 1 枚の見出しです。ページの大きさの `h2` で、2 行までに収まります。上に小さなラベル(`eyebrow`、章名など)を添えられます。12 カラムのグリッドの最上段に置く**部品**で、1 枚まるごとの block ではありません。
6
+
7
+ ```tsx
8
+ import { SlideHeading } from "@squadbase/vantage/slide";
9
+ import type { SlideHeadingProps } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **スライドの部品**で、1 枚まるごとの block ではありません。`<Slide>` 内の 12 カラムのグリッドの行として置きます(ルートはキャンバスいっぱい(100%×100%)には広がりません)。寸法はすべて部品の中で決まっているので、足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | 説明 |
18
+ | --- | --- | --- |
19
+ | `title` | `string` | 結論を 1 文で書いた見出し(アクションタイトル)。2 行までに切り詰められる。**必須**。 |
20
+ | `eyebrow` | `string` | 見出しの上の短いラベル(「第 2 章 解約」)。 |
21
+
22
+ ## 使い方
23
+
24
+ ```tsx
25
+ import { Slide, SlideHeading } from "@squadbase/vantage/slide";
26
+
27
+ <Slide>
28
+ <div style={{ display: "grid", gridTemplateColumns: "repeat(12, 1fr)" }}>
29
+ <SlideHeading title="解約率は 6 月以降、毎月下がり続けている" eyebrow="第 2 章 解約" />
30
+ {/* …SlideColumns など… */}
31
+ </div>
32
+ </Slide>
33
+ ```
34
+
35
+ ## 注意
36
+
37
+ - 見出しは話題ではなく結論の文で書きます。
38
+ - 置いたグリッドの 12 カラムすべてにまたがります。
@@ -0,0 +1,55 @@
1
+ # SlideKpiGrid
2
+
3
+ > 2〜4 個の KPI を並べるスコアボード。値・増減・目標。
4
+
5
+ 2〜4 個の KPI カードを横に並べるスコアボードです。各カードにラベル・値・増減・目標が入り、幅は等分されます。
6
+
7
+ ```tsx
8
+ import { SlideKpiGrid } from "@squadbase/vantage/slide";
9
+ import type { SlideKpiGridProps, SlideKpiGridItem, SlideKpiGridDelta } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **`<Slide>` 1 枚の中身**です。`<Slide>` 自体は持たないので、`<Slide>` の直下に置いてください。ルートはキャンバス(1920×1080)いっぱい(100%)に広がり、`className` は受けません。余白・文字サイズ・グリッドは block の中で決まっている(1920×1080 の 12 カラム)ので、寸法を足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | Default | 説明 |
18
+ | --- | --- | --- | --- |
19
+ | `title` | `string` | | 結論を 1 文で書いた見出し(アクションタイトル)。**必須**。 |
20
+ | `items` | `SlideKpiGridItem[]` | | KPI。2〜4 個。**必須**。各要素は下の `items[].…` の行。 |
21
+ | `items[].label` | `string` | | 指標名。**必須**。 |
22
+ | `items[].value` | `number \| null` | | 数値。`null` は「—」と表示される。**必須**。`format` で整形される。 |
23
+ | `items[].format` | `ValueFormat` | | 値の整形(`"currency"` / `"percent"` / `{ type: "number", unit: "社" }` など)。`delta` と `target` の既定の整形にもなる。 |
24
+ | `items[].display` | `string` | | 表示する文字だけを置き換える(元の数値は `value` のまま `data-raw` に残る)。 |
25
+ | `items[].delta` | `SlideKpiGridDelta` | | `{ value: number; format?: ValueFormat }`。増減の大きさを符号付きで(例: `0.074` と `format: "percent"` で「+7.4%」)。向きは符号で決まり、▲ ▼ と「増」「減」も出る。`format` の既定は item の `format`。 |
26
+ | `items[].betterWhen` | `"up" \| "down"` | `"up"` | `delta` のどちらの向きが良いか。色が決まる。 |
27
+ | `items[].comparisonLabel` | `string` | | `delta` の比較相手(「前月比」)。 |
28
+ | `items[].target` | `number` | | 目標。`format` は `value` と同じ。「目標 …(達成率 …)」と表示される。達成率は value ÷ target(`betterWhen` が `"down"` なら target ÷ value)。 |
29
+ | `asOf` | `string` | | 数字を取った日。日付のみ(例: `"2026-10-01"`)。block が「2026-10-01 時点」と 1 回だけ「時点」を付けるので、「時点」は書かない。 |
30
+ | `source` | `string` | | 出典(例: `"社内 BI"`)。「出典: 社内 BI」と表示される。 |
31
+
32
+ ## 使い方
33
+
34
+ ```tsx
35
+ import { Slide, SlideKpiGrid } from "@squadbase/vantage/slide";
36
+
37
+ <Slide>
38
+ <SlideKpiGrid
39
+ title="売上と継続率は計画どおり、新規獲得だけが未達"
40
+ items={[
41
+ { label: "月次売上", value: 540_000_000, format: "currency", delta: { value: 0.074, format: "percent" }, comparisonLabel: "前月比", target: 520_000_000 },
42
+ { label: "継続率", value: 0.982, format: { type: "percent", digits: 1 }, delta: { value: 0.004 }, comparisonLabel: "前月比", target: 0.98 },
43
+ { label: "新規獲得", value: 38, format: { type: "number", unit: "社" }, delta: { value: -4 }, comparisonLabel: "前月比", target: 50 },
44
+ ]}
45
+ asOf="2026-10-01"
46
+ source="社内 BI"
47
+ />
48
+ </Slide>
49
+ ```
50
+
51
+ ## 注意
52
+
53
+ - 5 個以上は描画されますが `console.warn` が出ます。スライドを分けてください。
54
+ - 値・増減・目標は数値で渡します。整形は `format` が行い、文字を変えたいときだけ `display` を使います。
55
+ - 「目標 …(達成率 …)」「増」「減」などの文言は block が出す日本語固定です。
@@ -0,0 +1,58 @@
1
+ # SlideKpiHero
2
+
3
+ > 1 つの数字を主役にする 1 枚。値・増減・推移の線。
4
+
5
+ 1 つの数字を大きく見せる 1 枚です。左 6 カラムにラベルと値(と増減)、右 6 カラムに推移の線を置きます。`trend` を渡さなければ数字が全幅を使います。
6
+
7
+ ```tsx
8
+ import { SlideKpiHero } from "@squadbase/vantage/slide";
9
+ import type { SlideKpiHeroProps, SlideKpiHeroDelta } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **`<Slide>` 1 枚の中身**です。`<Slide>` 自体は持たないので、`<Slide>` の直下に置いてください。ルートはキャンバス(1920×1080)いっぱい(100%)に広がり、`className` は受けません。余白・文字サイズ・グリッドは block の中で決まっている(1920×1080 の 12 カラム)ので、寸法を足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | Default | 説明 |
18
+ | --- | --- | --- | --- |
19
+ | `title` | `string` | | 結論を 1 文で書いた見出し(アクションタイトル)。**必須**。 |
20
+ | `label` | `string` | | 数字が何か(「月次売上」)。**必須**。 |
21
+ | `value` | `number \| null` | | 数値。`null` は「—」と表示される。**必須**。`format` で整形される(元の数値は `data-raw` に残り、書き出しやテストで使う)。 |
22
+ | `format` | `ValueFormat` | | 値の整形(`"currency"` / `"percent"` など)。`delta` の既定の整形にもなる。 |
23
+ | `display` | `string` | | 表示する文字だけを置き換える(元の数値は `value` のまま)。 |
24
+ | `delta` | `SlideKpiHeroDelta` | | `{ value: number; format?: ValueFormat }`。増減の大きさを符号付きで(例: `0.074` と `format: "percent"` で「+7.4%」)。向きは符号で決まり、▲ ▼ と「増」「減」も出る。`format` の既定は `format`。省くと増減は出ない。 |
25
+ | `betterWhen` | `"up" \| "down"` | `"up"` | `delta` のどちらの向きが良いか。色が決まる。 |
26
+ | `comparisonLabel` | `string` | | `delta` の比較相手(「前月比」)。 |
27
+ | `trend` | `{ x: string; y: number }[]` | | 右側の線の点。省くと数字だけの 1 枚になる。 |
28
+ | `asOf` | `string` | | 数字を取った日。日付のみ(例: `"2026-10-01"`)。block が「2026-10-01 時点」と 1 回だけ「時点」を付けるので、「時点」は書かない。 |
29
+ | `source` | `string` | | 出典(例: `"社内 BI"`)。「出典: 社内 BI」と表示される。 |
30
+
31
+ ## 使い方
32
+
33
+ ```tsx
34
+ import { Slide, SlideKpiHero } from "@squadbase/vantage/slide";
35
+
36
+ <Slide>
37
+ <SlideKpiHero
38
+ title="9 月の売上は過去最高の 5.4 億円"
39
+ label="月次売上"
40
+ value={540_000_000}
41
+ format="currency"
42
+ delta={{ value: 0.074, format: "percent" }}
43
+ comparisonLabel="前月比"
44
+ trend={[
45
+ { x: "4 月", y: 460_000_000 }, { x: "5 月", y: 480_000_000 }, { x: "6 月", y: 490_000_000 },
46
+ { x: "7 月", y: 500_000_000 }, { x: "8 月", y: 503_000_000 }, { x: "9 月", y: 540_000_000 },
47
+ ]}
48
+ asOf="2026-10-01"
49
+ source="社内 BI"
50
+ />
51
+ </Slide>
52
+ ```
53
+
54
+ ## 注意
55
+
56
+ - コストのように下がることが良い指標は `betterWhen="down"` と書きます。色は `betterWhen` に従い、向き(▲ ▼ と「増」「減」)は `delta.value` の符号で決まります。
57
+ - 「増」「減」「… 時点」「出典: …」は block が出す日本語固定の文言です。
58
+ - グラフは `EChart` でアニメーションなし。pptx への書き出しはその描画を待ちます。
@@ -0,0 +1,49 @@
1
+ # SlideNextActions
2
+
3
+ > 次の打ち手。担当・期限・確認する指標つきで 3〜5 件。
4
+
5
+ 次に何をするかを示す 1 枚で、多くのレポートの最後に置きます。アクションごとに担当・期限・確認する指標を添えられます。
6
+
7
+ ```tsx
8
+ import { SlideNextActions } from "@squadbase/vantage/slide";
9
+ import type { SlideNextActionsProps, SlideNextActionsItem } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **`<Slide>` 1 枚の中身**です。`<Slide>` 自体は持たないので、`<Slide>` の直下に置いてください。ルートはキャンバス(1920×1080)いっぱい(100%)に広がり、`className` は受けません。余白・文字サイズ・グリッドは block の中で決まっている(1920×1080 の 12 カラム)ので、寸法を足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | 説明 |
18
+ | --- | --- | --- |
19
+ | `title` | `string` | 決定や計画を 1 文で書いた見出し。**必須**。 |
20
+ | `items` | `SlideNextActionsItem[]` | 打ち手。3〜5 件。**必須**。各要素は下の `items[].…` の行。 |
21
+ | `items[].action` | `string` | 何をするか(目的語から始めて 1 文。40 文字程度まで)。**必須**。 |
22
+ | `items[].owner` | `string` | 担当。 |
23
+ | `items[].due` | `string` | 期限。書いたまま 1 行で表示される(「10/31」。10 文字程度まで)。 |
24
+ | `items[].metric` | `string` | 確認する指標。 |
25
+ | `asOf` | `string` | 数字を取った日。日付のみ(例: `"2026-10-01"`)。block が「2026-10-01 時点」と 1 回だけ「時点」を付けるので、「時点」は書かない。 |
26
+ | `source` | `string` | 出典(例: `"社内 BI"`)。「出典: 社内 BI」と表示される。 |
27
+
28
+ ## 使い方
29
+
30
+ ```tsx
31
+ import { Slide, SlideNextActions } from "@squadbase/vantage/slide";
32
+
33
+ <Slide>
34
+ <SlideNextActions
35
+ title="解約と新規獲得の施策を 3 つ、11 月末までに始める"
36
+ items={[
37
+ { action: "解約予兆スコアの上位 50 社に CS が連絡する", owner: "CS 部 山田", due: "10/31", metric: "解約率 1.5% 以下" },
38
+ { action: "紹介プログラムの特典を見直す", owner: "マーケ 佐藤", due: "11/15", metric: "紹介経由の新規 20 社" },
39
+ { action: "料金ページの導線を改善する", owner: "プロダクト 鈴木", due: "11/30", metric: "申込率 +1pt" },
40
+ ]}
41
+ />
42
+ </Slide>
43
+ ```
44
+
45
+ ## 注意
46
+
47
+ - 担当・期限・確認する指標の列は、1 件でも値があるときだけ出ます。
48
+ - 列見出し(担当 / 期限 / 確認する指標)は block が出す日本語固定で、上書きできません。
49
+ - `due` は書いたまま表示されます(「10/31」「来週まで」)。6 件以上は `console.warn` が出ます。
@@ -0,0 +1,54 @@
1
+ # SlideScorecardTable
2
+
3
+ > 指標ごとの目標と実績、状態を並べるスコアカード表。
4
+
5
+ 指標ごとに目標・実績・達成率と、状態(順調 / 要注意 / 遅延)を並べる表の 1 枚です。状態は色付きの点と言葉の両方で示すので、色だけに頼りません。
6
+
7
+ ```tsx
8
+ import { SlideScorecardTable } from "@squadbase/vantage/slide";
9
+ import type { SlideScorecardTableProps, SlideScorecardRow, SlideScorecardStatus } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **`<Slide>` 1 枚の中身**です。`<Slide>` 自体は持たないので、`<Slide>` の直下に置いてください。ルートはキャンバス(1920×1080)いっぱい(100%)に広がり、`className` は受けません。余白・文字サイズ・グリッドは block の中で決まっている(1920×1080 の 12 カラム)ので、寸法を足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | Default | 説明 |
18
+ | --- | --- | --- | --- |
19
+ | `title` | `string` | | 結論を 1 文で書いた見出し(アクションタイトル)。**必須**。 |
20
+ | `rows` | `SlideScorecardRow[]` | | 行。8 行まで。**必須**。各要素は下の `rows[].…` の行。 |
21
+ | `rows[].metric` | `string` | | 指標名(20 文字程度まで)。**必須**。 |
22
+ | `rows[].value` | `number \| null` | | 実績。`null` は「—」と表示される。**必須**。 |
23
+ | `rows[].format` | `ValueFormat` | | `value` と `target` の整形(`"currency"` / `"percent"` など)。 |
24
+ | `rows[].display` | `string` | | 表示する実績の文字だけを置き換える(元の数値は `value` のまま)。 |
25
+ | `rows[].target` | `number` | | 目標。`format` は `value` と同じ。どれかの行に目標があると達成率の列が出る(value ÷ target)。 |
26
+ | `rows[].betterWhen` | `"up" \| "down"` | `"up"` | どちらの向きが良いか。`"down"` なら達成率は target ÷ value になり、コストの目標を下回ると 100% を超える。 |
27
+ | `rows[].status` | `SlideScorecardStatus` | | `"on"`(順調)/ `"risk"`(要注意)/ `"off"`(遅延)。値から導かず、渡したものをそのまま出す。**必須**。 |
28
+ | `columns` | `Partial<Record<"metric" \| "target" \| "actual" \| "attainment" \| "status", string>>` | | 見出しの語を差し替える。省いた列は既定(指標 / 目標 / 実績 / 達成率 / 状態)。状態の言葉(順調 / 要注意 / 遅延)は上書きできない。 |
29
+ | `asOf` | `string` | | 数字を取った日。日付のみ(例: `"2026-10-01"`)。block が「2026-10-01 時点」と 1 回だけ「時点」を付けるので、「時点」は書かない。 |
30
+ | `source` | `string` | | 出典(例: `"社内 BI"`)。「出典: 社内 BI」と表示される。 |
31
+
32
+ ## 使い方
33
+
34
+ ```tsx
35
+ import { Slide, SlideScorecardTable } from "@squadbase/vantage/slide";
36
+
37
+ <Slide>
38
+ <SlideScorecardTable
39
+ title="4 指標のうち 2 つが目標どおり、解約と新規が遅れている"
40
+ rows={[
41
+ { metric: "月次売上", value: 540_000_000, target: 520_000_000, format: "currency", status: "on" },
42
+ { metric: "継続率", value: 0.982, target: 0.98, format: { type: "percent", digits: 1 }, status: "on" },
43
+ { metric: "解約率", value: 0.018, target: 0.015, format: { type: "percent", digits: 1 }, betterWhen: "down", status: "risk" },
44
+ { metric: "新規獲得", value: 38, target: 50, format: { type: "number", unit: "社" }, status: "off" },
45
+ ]}
46
+ asOf="2026-10-01"
47
+ source="社内 BI"
48
+ />
49
+ </Slide>
50
+ ```
51
+
52
+ ## 注意
53
+
54
+ - 7 行からは文字が本文から注記のサイズに下がります。9 行以上は描画されますが `console.warn` が出ます。
@@ -0,0 +1,44 @@
1
+ # SlideSection
2
+
3
+ > 章の区切りの 1 枚。章タイトルと、任意で目次。
4
+
5
+ 章の区切りに置く 1 枚です。左に章タイトル、`items` を渡すと右に目次(番号つきの一覧)を出し、`current` の章を強調します。
6
+
7
+ ```tsx
8
+ import { SlideSection } from "@squadbase/vantage/slide";
9
+ import type { SlideSectionProps } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **`<Slide>` 1 枚の中身**です。`<Slide>` 自体は持たないので、`<Slide>` の直下に置いてください。ルートはキャンバス(1920×1080)いっぱい(100%)に広がり、`className` は受けません。余白・文字サイズ・グリッドは block の中で決まっている(1920×1080 の 12 カラム)ので、寸法を足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | 説明 |
18
+ | --- | --- | --- |
19
+ | `title` | `string` | 章のタイトル。**必須**。 |
20
+ | `index` | `number` | 章番号。タイトルの上に「02」のように 2 桁で出る。 |
21
+ | `lead` | `string` | その章が何に答えるかを 1 行で。 |
22
+ | `items` | `string[]` | デッキの章の一覧。右側に番号つきの目次として出る。1 行ずつなので 6 件ほどまで。省くとタイトルが全幅を使う。 |
23
+ | `current` | `number` | `items` のうち強調する章(1 始まり)。 |
24
+
25
+ ## 使い方
26
+
27
+ ```tsx
28
+ import { Slide, SlideSection } from "@squadbase/vantage/slide";
29
+
30
+ <Slide>
31
+ <SlideSection
32
+ index={2}
33
+ title="解約の動向"
34
+ lead="どの層が、いつ離れているか"
35
+ items={["全体像", "解約の動向", "要因の分析", "次の打ち手"]}
36
+ current={2}
37
+ />
38
+ </Slide>
39
+ ```
40
+
41
+ ## 注意
42
+
43
+ - 段階表示(reveal)は持ちません。必要なら呼び出し側で `Steps` などで包んでください。
44
+ - 目次に出る番号は `items` の順で自動採番されます。`index` は章番号の表示だけに使われます。
@@ -0,0 +1,34 @@
1
+ # SlideSourceLine
2
+
3
+ > [部品] スライド 1 枚の足元の 1 行。時点・出典・ページ番号。
4
+
5
+ スライド 1 枚の足元に置く 1 行です。データの時点と出典、任意で右端にページ番号を出します。12 カラムのグリッドの最下段に置く**部品**で、1 枚まるごとの block ではありません。出すものがなければ何も描きません。
6
+
7
+ ```tsx
8
+ import { SlideSourceLine } from "@squadbase/vantage/slide";
9
+ import type { SlideSourceLineProps } from "@squadbase/vantage/slide";
10
+ ```
11
+
12
+ > [!NOTE]
13
+ > これは **スライドの部品**で、1 枚まるごとの block ではありません。`<Slide>` 内の 12 カラムのグリッドの行として置きます(ルートはキャンバスいっぱい(100%×100%)には広がりません)。寸法はすべて部品の中で決まっているので、足さないでください。デッキの組み方は [スライド](page-types/slide) を参照してください。
14
+
15
+ ## props
16
+
17
+ | Prop | Type | 説明 |
18
+ | --- | --- | --- |
19
+ | `asOf` | `string` | 数字を取った日。日付のみ(例: `"2026-10-20"`)。「2026-10-20 時点」と表示される。「時点」は書かない。 |
20
+ | `source` | `string` | 出典(例: `"社内 BI"`)。「出典: 社内 BI」と表示される。 |
21
+ | `page` | `{ current: number; total: number }` | 右端に「3 / 12」と出すページ番号。呼び出し側から渡す。 |
22
+
23
+ ## 使い方
24
+
25
+ ```tsx
26
+ import { SlideSourceLine } from "@squadbase/vantage/slide";
27
+
28
+ <SlideSourceLine asOf="2026-10-20" source="社内 BI" page={{ current: 3, total: 12 }} />
29
+ ```
30
+
31
+ ## 注意
32
+
33
+ - ページ番号は SquadKit がスライドの位置を読めないため、`page` で渡します。
34
+ - 「… 時点」「出典: …」は固定の日本語です。
@@ -10,7 +10,7 @@ import { Empty } from "@squadbase/vantage/ui";
10
10
 
11
11
  | Prop | Type | Default | 説明 |
12
12
  | --- | --- | --- | --- |
13
- | `title` | `string` | `"Nothing here yet"` | 見出し。 |
13
+ | `title` | `string` | `"表示できるデータがありません"` | 見出し。 |
14
14
  | `description` | `string` | | 見出しの下の補足文。 |
15
15
  | `icon` | `ReactNode` | | 見出しの上に置く絵柄。 |
16
16
  | `action` | `ReactNode` | | 下部に置く次の一手(ボタンやリンク)。 |
@@ -10,8 +10,9 @@ import { ErrorState } from "@squadbase/vantage/ui";
10
10
 
11
11
  | Prop | Type | Default | 説明 |
12
12
  | --- | --- | --- | --- |
13
- | `title` | `string` | `"Something went wrong"` | 見出し。 |
14
- | `message` | `ReactNode` | | 詳細。エラーメッセージをそのまま出せます。 |
13
+ | `title` | `string` | `"データを読み込めませんでした"` | 見出し。 |
14
+ | `message` | `ReactNode` | `"時間をおいて再試行してください。解決しない場合は管理者にお問い合わせください。"` | 何が起きたか、次に何をすればよいかを平易な言葉で。 |
15
+ | `details` | `ReactNode` | | 技術的な詳細(エラーメッセージやステータスコード)。「詳細を表示」の中に折りたたまれます。 |
15
16
  | `action` | `ReactNode` | | 再試行ボタンなど。 |
16
17
  | `className` | `string` | | 足すクラス。 |
17
18
 
@@ -34,7 +35,7 @@ export default function Customers() {
34
35
  if (error)
35
36
  return (
36
37
  <ErrorState
37
- message={error.message}
38
+ details={error.message}
38
39
  action={<Button variant="outline" onClick={() => refetch()}>再試行</Button>}
39
40
  />
40
41
  );
@@ -12,7 +12,7 @@ import { Loading } from "@squadbase/vantage/ui";
12
12
 
13
13
  | Prop | Type | Default | 説明 |
14
14
  | --- | --- | --- | --- |
15
- | `label` | `string` | `"Loading…"` | スピナーの右に出すテキスト。 |
15
+ | `label` | `string` | `"読み込んでいます…"` | スピナーの右に出すテキスト。 |
16
16
  | `className` | `string` | | 足すクラス。既定では最小高 30vh で縦横中央に置かれます。 |
17
17
 
18
18
  レイアウトを保ったまま待たせたいときは [`Skeleton`](ui/skeleton)、ボタンの中など
@@ -14,14 +14,15 @@ import { ToggleGroup, ToggleGroupItem } from "@squadbase/vantage/ui";
14
14
  | --- | --- | --- | --- |
15
15
  | `value` | `string[]` | | 選択中の値。**単一選択でも配列**。 |
16
16
  | `onValueChange` | `(value: string[]) => void` | | 変更時。配列で返る。 |
17
- | `toggleMultiple` | `boolean` | | 複数選択を許す。 |
17
+ | `multiple` | `boolean` | `false` | `true` で複数選択を許す。 |
18
18
  | `variant` | `"default" \| "outline"` | `"default"` | |
19
19
  | `size` | `"default" \| "sm" \| "lg"` | `"default"` | |
20
20
  | `spacing` | `number` | `2` | 項目の間隔。`0` で連結された帯になる。 |
21
21
  | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | |
22
22
 
23
23
  > [!WARNING]
24
- > Radix 版の `type="single"` / `type="multiple"` はありません。単一選択は「配列の長さを 1 に保つ」
25
- > という運用になります。その処理は
24
+ > Radix 版の `type="single"` / `type="multiple"` はありません。代わりに boolean の `multiple` が
25
+ > あり、既定(`false`)では同時に押せるのは 1 つだけです。ただし単一選択でも `value` は長さ 1 以下
26
+ > の配列になります。その扱いは
26
27
  > [`SegmentedControl`](parts/segmented-control) に入っているので、
27
28
  > 単一選択ならそちらを使うのが確実です。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@squadbase/vantage",
3
- "version": "0.6.2-dev1.01caa72",
3
+ "version": "0.6.2-dev1.02aab78",
4
4
  "description": "Data dashboard framework for Squadbase Editor. Vite-powered, config-free, one-file first.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -152,7 +152,7 @@
152
152
  "vitest": "^5.0.5",
153
153
  "@squadbase/squadkit": "0.0.0"
154
154
  },
155
- "gitHead": "01caa72ff0cba08c43ecb02cae2ba988eab1b2c1",
155
+ "gitHead": "02aab78e1f5fcbb0c508300dcb39825ca26b23a0",
156
156
  "scripts": {
157
157
  "build": "node scripts/build-docs.mjs && node scripts/build.mjs",
158
158
  "build:js": "tsup --no-dts",
@@ -9,7 +9,7 @@
9
9
  * Direction, rate, colour and wording are all derived here from `value` and
10
10
  * `comparison` (via `computeComparison`); none of them can be passed in, so they
11
11
  * cannot contradict each other. Colour is never the only signal: the arrow and
12
- * the sign always accompany it. Set `polarity="lower-is-better"` for metrics
12
+ * the sign always accompany it. Set `betterWhen="down"` for metrics
13
13
  * where a rise is bad (churn, error rate).
14
14
  *
15
15
  * - A flat change (inside `neutralBand`) uses a right arrow (→), never a minus-like dash, so it cannot
@@ -31,7 +31,7 @@
31
31
  * // Vantage: import { Delta } from "@squadbase/vantage/components"
32
32
  *
33
33
  * <Delta value={48_200_000} comparison={{ previous: 42_900_000, vs: "prior-period", grain: "month" }} />
34
- * <Delta value={0.021} format="percent" polarity="lower-is-better"
34
+ * <Delta value={0.021} format="percent" betterWhen="down"
35
35
  * comparison={{ previous: 0.026, vs: "prior-year", grain: "month" }} />
36
36
  */
37
37
  import { forwardRef, type HTMLAttributes } from "react"
@@ -85,7 +85,9 @@ export interface DeltaProps
85
85
  value: number | null | undefined
86
86
  /** What the value is compared against. Required so the delta always carries its label. */
87
87
  comparison: Comparison
88
- /** Whether a rise is good. Default `"higher-is-better"`. */
88
+ /** Which direction is good: `"up"` (default) or `"down"` (churn, error rate). Wins over `polarity`. */
89
+ betterWhen?: "up" | "down"
90
+ /** @deprecated Older name of `betterWhen` (`"higher-is-better"` / `"lower-is-better"`); `"neutral"` is only reachable here. `betterWhen` wins if both are given. */
89
91
  polarity?: Polarity
90
92
  /** Absolute ratio below which the change reads as flat (0.01 = 1%). Default 0.01. */
91
93
  neutralBand?: number
@@ -134,6 +136,7 @@ export const Delta = forwardRef<HTMLSpanElement, DeltaProps>(
134
136
  {
135
137
  value,
136
138
  comparison,
139
+ betterWhen,
137
140
  polarity,
138
141
  neutralBand,
139
142
  format,
@@ -149,7 +152,7 @@ export const Delta = forwardRef<HTMLSpanElement, DeltaProps>(
149
152
  ) => {
150
153
  // Nothing to compare against yet (a draft fills props in steps).
151
154
  if (!comparison) return null
152
- const result = computeComparison(value, comparison, { polarity, neutralBand })
155
+ const result = computeComparison(value, comparison, { polarity: betterWhen ? (betterWhen === "down" ? "lower-is-better" : "higher-is-better") : polarity, neutralBand })
153
156
  const display = change ?? defaultChangeDisplay(format)
154
157
  const formatDigits = typeof format === "object" && format !== null && "digits" in format ? format.digits : undefined
155
158
  const changeDigits = display === "points" ? (digits ?? formatDigits) : digits