@squadbase/vantage 0.6.1-dev2.5f947f1 → 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.
- package/dist/add-4GHF2TX2.js +6 -0
- package/dist/add-4GHF2TX2.js.map +1 -0
- package/dist/{build-O5TVNH4E.js → build-X5NVCQKT.js} +9 -9
- package/dist/{build-O5TVNH4E.js.map → build-X5NVCQKT.js.map} +1 -1
- package/dist/{check-WFBEDHDR.js → check-ZBIH422T.js} +7 -7
- package/dist/{check-WFBEDHDR.js.map → check-ZBIH422T.js.map} +1 -1
- package/dist/chunk-2IAPIOPS.js +152 -0
- package/dist/chunk-2IAPIOPS.js.map +1 -0
- package/dist/chunk-2ICNHUG6.js +1820 -0
- package/dist/chunk-2ICNHUG6.js.map +1 -0
- package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
- package/dist/chunk-2N72FKLB.js.map +1 -0
- package/dist/chunk-57GHR5LN.js +163 -0
- package/dist/chunk-57GHR5LN.js.map +1 -0
- package/dist/{chunk-BCE22JSM.js → chunk-7DZGJQ3P.js} +33 -14
- package/dist/chunk-7DZGJQ3P.js.map +1 -0
- package/dist/{chunk-RPZAALCX.js → chunk-7S52M2SL.js} +256 -165
- package/dist/chunk-7S52M2SL.js.map +1 -0
- package/dist/{chunk-QDZA5JSL.js → chunk-AABMKHEU.js} +4 -4
- package/dist/{chunk-QDZA5JSL.js.map → chunk-AABMKHEU.js.map} +1 -1
- package/dist/{chunk-KLEIVDUV.js → chunk-CEXAQQ5W.js} +150 -11
- package/dist/chunk-CEXAQQ5W.js.map +1 -0
- package/dist/{chunk-3G43C6OL.js → chunk-GNXCX4WE.js} +46 -3
- package/dist/chunk-GNXCX4WE.js.map +1 -0
- package/dist/{chunk-JGRMRXXZ.js → chunk-JKLLFVEU.js} +3 -3
- package/dist/{chunk-JGRMRXXZ.js.map → chunk-JKLLFVEU.js.map} +1 -1
- package/dist/chunk-JXFCSF3K.js +673 -0
- package/dist/chunk-JXFCSF3K.js.map +1 -0
- package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
- package/dist/chunk-PDOBHMUQ.js.map +1 -0
- package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
- package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
- package/dist/chunk-RU6WKEOG.js +7048 -0
- package/dist/chunk-RU6WKEOG.js.map +1 -0
- package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
- package/dist/chunk-U736PVHY.js.map +1 -0
- package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
- package/dist/chunk-V3LF7BE7.js.map +1 -0
- package/dist/{chunk-EP6JHXSR.js → chunk-WAMZWZJB.js} +54 -9
- package/dist/chunk-WAMZWZJB.js.map +1 -0
- package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
- package/dist/chunk-XQUSGIDG.js.map +1 -0
- package/dist/cli.js +15 -11
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +32 -3
- package/dist/client/index.js +205 -12
- package/dist/client/index.js.map +1 -1
- package/dist/components/index.d.ts +1743 -29
- package/dist/components/index.js +7 -4
- package/dist/{dev-NZRLOQCL.js → dev-4XEDTELV.js} +24 -13
- package/dist/dev-4XEDTELV.js.map +1 -0
- package/dist/doc/index.d.ts +194 -2
- package/dist/doc/index.js +338 -5
- package/dist/doc/index.js.map +1 -1
- package/dist/{docs-ZGDJUHJI.js → docs-JVP4RPKT.js} +3 -3
- package/dist/{docs-ZGDJUHJI.js.map → docs-JVP4RPKT.js.map} +1 -1
- package/dist/{doctor-VFKEMR54.js → doctor-5E2VEZPK.js} +8 -8
- package/dist/doctor-5E2VEZPK.js.map +1 -0
- package/dist/format-U0cQl069.d.ts +243 -0
- package/dist/markdown/index.js +1 -1
- package/dist/markdown/index.js.map +1 -1
- package/dist/{preview-QDCIVVSR.js → preview-T6CLSQVX.js} +12 -4
- package/dist/preview-T6CLSQVX.js.map +1 -0
- package/dist/query/index.d.ts +0 -11
- package/dist/query/index.js +2 -2
- package/dist/{routes-RHP5FVGD.js → routes-3SGAFDMC.js} +6 -6
- package/dist/{routes-RHP5FVGD.js.map → routes-3SGAFDMC.js.map} +1 -1
- package/dist/{search-RFBELGY7.js → search-5LC4XPB5.js} +3 -3
- package/dist/{search-RFBELGY7.js.map → search-5LC4XPB5.js.map} +1 -1
- package/dist/slide/index.d.ts +177 -1
- package/dist/slide/index.js +917 -18
- package/dist/slide/index.js.map +1 -1
- package/dist/table/index.js +14 -10
- package/dist/table/index.js.map +1 -1
- package/dist/ui/index.d.ts +148 -12
- package/dist/ui/index.js +1340 -88
- package/dist/ui/index.js.map +1 -1
- package/dist/{upgrade-GF2P67M6.js → upgrade-JHXZBGQS.js} +7 -7
- package/dist/{upgrade-GF2P67M6.js.map → upgrade-JHXZBGQS.js.map} +1 -1
- package/dist/vite/index.d.ts +10 -0
- package/dist/vite/index.js +4 -4
- package/docs/en/changelog.md +24 -0
- package/docs/en/cli-reference.md +30 -0
- package/docs/en/components.md +40 -17
- package/docs/en/doc/doc-action-items.md +49 -0
- package/docs/en/doc/doc-callout.md +38 -0
- package/docs/en/doc/doc-data-table.md +60 -0
- package/docs/en/doc/doc-executive-summary.md +64 -0
- package/docs/en/doc/doc-figure.md +56 -0
- package/docs/en/doc/doc-key-findings.md +61 -0
- package/docs/en/doc/doc-kpi-scorecard.md +80 -0
- package/docs/en/doc/doc-report-header.md +46 -0
- package/docs/en/parts/area-chart.md +99 -0
- package/docs/en/parts/bar-chart.md +91 -0
- package/docs/en/parts/bar-list.md +50 -0
- package/docs/en/parts/category-bar.md +37 -0
- package/docs/en/parts/chart-frame.md +39 -0
- package/docs/en/parts/data-table.md +22 -0
- package/docs/en/parts/delta.md +50 -0
- package/docs/en/parts/donut-chart.md +72 -0
- package/docs/en/parts/format.md +43 -0
- package/docs/en/parts/funnel-steps.md +2 -1
- package/docs/en/parts/heatmap.md +53 -0
- package/docs/en/parts/kpi-card.md +57 -0
- package/docs/en/parts/legend.md +35 -0
- package/docs/en/parts/line-chart.md +94 -0
- package/docs/en/parts/metric-value.md +3 -2
- package/docs/en/parts/page-shell.md +1 -1
- package/docs/en/parts/progress-circle.md +33 -0
- package/docs/en/parts/sample-data.md +39 -0
- package/docs/en/parts/scatter-chart.md +56 -0
- package/docs/en/parts/sparkline.md +1 -1
- package/docs/en/parts/tracker.md +36 -0
- package/docs/en/parts/trend-indicator.md +17 -1
- package/docs/en/parts/updated-at.md +30 -0
- package/docs/en/parts/waterfall-chart.md +56 -0
- package/docs/en/slide/slide-chart-insight.md +52 -0
- package/docs/en/slide/slide-cover.md +39 -0
- package/docs/en/slide/slide-exec-summary.md +47 -0
- package/docs/en/slide/slide-kpi-grid.md +55 -0
- package/docs/en/slide/slide-kpi-hero.md +58 -0
- package/docs/en/slide/slide-next-actions.md +49 -0
- package/docs/en/slide/slide-scorecard-table.md +54 -0
- package/docs/en/ui/alert-dialog.md +42 -0
- package/docs/en/ui/avatar.md +31 -0
- package/docs/en/ui/combobox.md +74 -0
- package/docs/en/ui/drawer.md +41 -0
- package/docs/en/ui/empty.md +1 -1
- package/docs/en/ui/error-state.md +4 -3
- package/docs/en/ui/field.md +42 -0
- package/docs/en/ui/hover-card.md +21 -0
- package/docs/en/ui/kbd.md +17 -0
- package/docs/en/ui/loading.md +1 -1
- package/docs/en/ui/pagination.md +36 -0
- package/docs/en/ui/radio-group.md +21 -0
- package/docs/en/ui/toast.md +44 -0
- package/docs/en/ui/toggle-group.md +4 -3
- package/docs/en/ui-and-theming.md +1 -1
- package/docs/index.json +1024 -114
- package/docs/ja/changelog.md +55 -0
- package/docs/ja/cli-reference.md +29 -0
- package/docs/ja/components.md +66 -101
- package/docs/ja/doc/doc-action-items.md +49 -0
- package/docs/ja/doc/doc-callout.md +38 -0
- package/docs/ja/doc/doc-data-table.md +60 -0
- package/docs/ja/doc/doc-executive-summary.md +64 -0
- package/docs/ja/doc/doc-figure.md +56 -0
- package/docs/ja/doc/doc-key-findings.md +61 -0
- package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
- package/docs/ja/doc/doc-report-header.md +46 -0
- package/docs/ja/page-types/csv.md +83 -0
- package/docs/ja/page-types/doc.md +83 -0
- package/docs/ja/page-types/excel.md +82 -0
- package/docs/ja/page-types/slide.md +132 -0
- package/docs/ja/page-types.md +47 -0
- package/docs/ja/parts/area-chart.md +85 -0
- package/docs/ja/parts/bar-chart.md +95 -0
- package/docs/ja/parts/bar-list.md +58 -0
- package/docs/ja/parts/category-bar.md +36 -0
- package/docs/ja/parts/chart-frame.md +36 -0
- package/docs/ja/parts/data-table.md +22 -0
- package/docs/ja/parts/delta.md +50 -0
- package/docs/ja/parts/donut-chart.md +66 -0
- package/docs/ja/parts/echart.md +3 -0
- package/docs/ja/parts/format.md +44 -0
- package/docs/ja/parts/funnel-steps.md +27 -8
- package/docs/ja/parts/heatmap.md +45 -0
- package/docs/ja/parts/kpi-card.md +55 -0
- package/docs/ja/parts/legend.md +36 -0
- package/docs/ja/parts/line-chart.md +84 -0
- package/docs/ja/parts/metric-value.md +3 -2
- package/docs/ja/parts/page-shell.md +1 -1
- package/docs/ja/parts/progress-circle.md +34 -0
- package/docs/ja/parts/sample-data.md +61 -0
- package/docs/ja/parts/scatter-chart.md +69 -0
- package/docs/ja/parts/sparkline.md +2 -2
- package/docs/ja/parts/tracker.md +32 -0
- package/docs/ja/parts/trend-indicator.md +17 -1
- package/docs/ja/parts/updated-at.md +27 -0
- package/docs/ja/parts/waterfall-chart.md +61 -0
- package/docs/ja/routing.md +8 -86
- package/docs/ja/slide/slide-chart-insight.md +52 -0
- package/docs/ja/slide/slide-cover.md +39 -0
- package/docs/ja/slide/slide-exec-summary.md +47 -0
- package/docs/ja/slide/slide-kpi-grid.md +55 -0
- package/docs/ja/slide/slide-kpi-hero.md +58 -0
- package/docs/ja/slide/slide-next-actions.md +49 -0
- package/docs/ja/slide/slide-scorecard-table.md +54 -0
- package/docs/ja/ui/alert-dialog.md +41 -0
- package/docs/ja/ui/avatar.md +31 -0
- package/docs/ja/ui/combobox.md +74 -0
- package/docs/ja/ui/drawer.md +41 -0
- package/docs/ja/ui/empty.md +1 -1
- package/docs/ja/ui/error-state.md +4 -3
- package/docs/ja/ui/field.md +42 -0
- package/docs/ja/ui/hover-card.md +21 -0
- package/docs/ja/ui/kbd.md +16 -0
- package/docs/ja/ui/loading.md +1 -1
- package/docs/ja/ui/pagination.md +36 -0
- package/docs/ja/ui/radio-group.md +21 -0
- package/docs/ja/ui/toast.md +46 -0
- package/docs/ja/ui/toggle-group.md +4 -3
- package/docs/ja/ui-and-theming.md +14 -7
- package/package.json +43 -29
- package/registry/ui/accordion.tsx +76 -0
- package/registry/ui/alert-dialog.tsx +189 -0
- package/registry/ui/alert.tsx +80 -0
- package/registry/ui/app-shell.tsx +287 -0
- package/registry/ui/area-chart.tsx +3701 -0
- package/registry/ui/attention-list.tsx +303 -0
- package/registry/ui/avatar.tsx +110 -0
- package/registry/ui/badge.tsx +56 -0
- package/registry/ui/bar-chart.tsx +3698 -0
- package/registry/ui/bar-list.tsx +3743 -0
- package/registry/ui/box-plot-chart.tsx +3906 -0
- package/registry/ui/breadcrumb.tsx +128 -0
- package/registry/ui/button.tsx +62 -0
- package/registry/ui/calendar.tsx +223 -0
- package/registry/ui/card.tsx +107 -0
- package/registry/ui/category-bar.tsx +1290 -0
- package/registry/ui/chart-frame.tsx +1393 -0
- package/registry/ui/checkbox.tsx +30 -0
- package/registry/ui/collapsible.tsx +23 -0
- package/registry/ui/combobox.tsx +310 -0
- package/registry/ui/command.tsx +198 -0
- package/registry/ui/dashboard-card.tsx +217 -0
- package/registry/ui/data-table.tsx +693 -146
- package/registry/ui/date-range-picker.tsx +390 -0
- package/registry/ui/delta.tsx +188 -0
- package/registry/ui/dialog.tsx +161 -0
- package/registry/ui/donut-chart.tsx +3751 -0
- package/registry/ui/drawer.tsx +229 -0
- package/registry/ui/dropdown-menu.tsx +274 -0
- package/registry/ui/echart.tsx +1040 -0
- package/registry/ui/field.tsx +240 -0
- package/registry/ui/filter-bar.tsx +392 -0
- package/registry/ui/funnel-steps.tsx +3569 -0
- package/registry/ui/heatmap.tsx +1786 -0
- package/registry/ui/histogram-chart.tsx +3986 -0
- package/registry/ui/hover-card.tsx +52 -0
- package/registry/ui/input-group.tsx +160 -0
- package/registry/ui/input.tsx +24 -0
- package/registry/ui/kbd.tsx +30 -0
- package/registry/ui/kpi-card.tsx +699 -0
- package/registry/ui/label.tsx +22 -0
- package/registry/ui/legend.tsx +3563 -0
- package/registry/ui/line-chart.tsx +3699 -0
- package/registry/ui/metric-value.tsx +62 -0
- package/registry/ui/multi-select.tsx +232 -0
- package/registry/ui/page-shell.tsx +282 -0
- package/registry/ui/pagination.tsx +140 -0
- package/registry/ui/paired-chart.tsx +3827 -0
- package/registry/ui/placeholder.tsx +36 -0
- package/registry/ui/popover.tsx +92 -0
- package/registry/ui/progress-circle.tsx +867 -0
- package/registry/ui/progress.tsx +85 -0
- package/registry/ui/radio-group.tsx +39 -0
- package/registry/ui/sample-data.tsx +86 -0
- package/registry/ui/scatter-chart.tsx +4212 -0
- package/registry/ui/scroll-area.tsx +56 -0
- package/registry/ui/searchable-select.tsx +214 -0
- package/registry/ui/section-header.tsx +43 -0
- package/registry/ui/segmented-control.tsx +76 -0
- package/registry/ui/select.tsx +255 -0
- package/registry/ui/separator.tsx +27 -0
- package/registry/ui/sheet.tsx +139 -0
- package/registry/ui/sidebar.tsx +725 -0
- package/registry/ui/skeleton.tsx +17 -0
- package/registry/ui/slider.tsx +56 -0
- package/registry/ui/sparkline.tsx +230 -0
- package/registry/ui/spinner.tsx +14 -0
- package/registry/ui/states.tsx +90 -0
- package/registry/ui/status-badge.tsx +121 -0
- package/registry/ui/switch.tsx +34 -0
- package/registry/ui/table.tsx +118 -0
- package/registry/ui/tabs.tsx +84 -0
- package/registry/ui/textarea.tsx +22 -0
- package/registry/ui/toast.tsx +250 -0
- package/registry/ui/toggle-group.tsx +91 -0
- package/registry/ui/toggle.tsx +47 -0
- package/registry/ui/tooltip.tsx +72 -0
- package/registry/ui/tracker.tsx +849 -0
- package/registry/ui/trend-indicator.tsx +74 -0
- package/registry/ui/updated-at.tsx +122 -0
- package/registry/ui/waterfall-chart.tsx +4248 -0
- package/skills/vantage-add-feature/SKILL.md +9 -7
- package/skills/vantage-design/SKILL.md +36 -24
- package/skills/vantage-design/references/extract.md +16 -14
- package/skills/vantage-design/references/format.md +6 -5
- package/skills/vantage-design/references/presets.md +60 -110
- package/skills/vantage-pitfalls/SKILL.md +5 -1
- package/skills/vantage-slide/SKILL.md +71 -36
- package/templates/AGENTS.md +24 -3
- package/templates/agents/api.md +29 -0
- package/templates/agents/csv.md +2 -1
- package/templates/agents/doc.md +49 -3
- package/templates/agents/page.md +54 -9
- package/templates/agents/slide.md +68 -3
- package/templates/agents/xlsx.md +2 -1
- package/theme.css +252 -132
- package/dist/add-EISGSZAH.js +0 -6
- package/dist/add-EISGSZAH.js.map +0 -1
- package/dist/chunk-3G43C6OL.js.map +0 -1
- package/dist/chunk-5ZOP4SQR.js.map +0 -1
- package/dist/chunk-A2UUGASH.js.map +0 -1
- package/dist/chunk-BCE22JSM.js.map +0 -1
- package/dist/chunk-DTDVSFRY.js.map +0 -1
- package/dist/chunk-EP6JHXSR.js.map +0 -1
- package/dist/chunk-KLEIVDUV.js.map +0 -1
- package/dist/chunk-LSRMRIXA.js +0 -2227
- package/dist/chunk-LSRMRIXA.js.map +0 -1
- package/dist/chunk-PVTHHV7X.js.map +0 -1
- package/dist/chunk-PXRX5PEC.js.map +0 -1
- package/dist/chunk-RPZAALCX.js.map +0 -1
- package/dist/chunk-T3FLAGI6.js +0 -316
- package/dist/chunk-T3FLAGI6.js.map +0 -1
- package/dist/dev-NZRLOQCL.js.map +0 -1
- package/dist/doctor-VFKEMR54.js.map +0 -1
- package/dist/preview-QDCIVVSR.js.map +0 -1
package/dist/doc/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { Sparkline } from '../chunk-2IAPIOPS.js';
|
|
2
|
+
import { formatValue, formatDelta } from '../chunk-57GHR5LN.js';
|
|
3
|
+
import { Button } from '../chunk-PDOBHMUQ.js';
|
|
4
|
+
import '../chunk-U736PVHY.js';
|
|
5
|
+
import { forwardRef, useEffect, useId } from 'react';
|
|
4
6
|
import { PrinterIcon } from 'lucide-react';
|
|
5
7
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
6
8
|
|
|
@@ -91,6 +93,7 @@ function themeToCssVars(theme) {
|
|
|
91
93
|
if (theme.maxWidth) vars["--doc-max-width"] = theme.maxWidth;
|
|
92
94
|
return Object.keys(vars).length > 0 ? vars : void 0;
|
|
93
95
|
}
|
|
96
|
+
var PRINT_PAGE_CSS = "@media print { @page { margin: 0 } }";
|
|
94
97
|
function printLabel() {
|
|
95
98
|
return navigator.language.toLowerCase().startsWith("ja") ? "PDF \u3068\u3057\u3066\u4FDD\u5B58" : "Save as PDF";
|
|
96
99
|
}
|
|
@@ -104,10 +107,11 @@ var Document = forwardRef(function Document2({ theme, style, ...props }, ref) {
|
|
|
104
107
|
{
|
|
105
108
|
ref,
|
|
106
109
|
"data-slot": "document",
|
|
107
|
-
style:
|
|
110
|
+
style: { width: "100%", ...themeVars, ...style },
|
|
108
111
|
...props
|
|
109
112
|
}
|
|
110
113
|
),
|
|
114
|
+
/* @__PURE__ */ jsx("style", { children: PRINT_PAGE_CSS }),
|
|
111
115
|
/* @__PURE__ */ jsxs(
|
|
112
116
|
Button,
|
|
113
117
|
{
|
|
@@ -126,7 +130,336 @@ var Document = forwardRef(function Document2({ theme, style, ...props }, ref) {
|
|
|
126
130
|
] });
|
|
127
131
|
});
|
|
128
132
|
Document.displayName = "Document";
|
|
133
|
+
var PRIORITY = { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" };
|
|
134
|
+
var MUTED = { color: "var(--doc-muted)" };
|
|
135
|
+
function Priority({ value }) {
|
|
136
|
+
if (!value) return /* @__PURE__ */ jsx(Fragment, { children: "\u2014" });
|
|
137
|
+
return /* @__PURE__ */ jsx("span", { className: value === "high" ? "font-semibold" : void 0, children: PRIORITY[value] });
|
|
138
|
+
}
|
|
139
|
+
function DocActionItems({ title = "\u63A8\u5968\u3059\u308B\u5BFE\u5FDC", headingLevel = 2, items, variant = "table" }) {
|
|
140
|
+
const Heading = headingLevel === 3 ? "h3" : "h2";
|
|
141
|
+
return /* @__PURE__ */ jsxs("section", { "data-slot": "doc-action-items", children: [
|
|
142
|
+
/* @__PURE__ */ jsx(Heading, { children: title }),
|
|
143
|
+
variant === "asks" ? /* @__PURE__ */ jsx("ul", { children: items.map((item, i) => /* @__PURE__ */ jsxs("li", { className: "break-inside-avoid", children: [
|
|
144
|
+
item.action,
|
|
145
|
+
item.owner || item.due ? /* @__PURE__ */ jsxs("span", { style: MUTED, children: [
|
|
146
|
+
"\uFF08",
|
|
147
|
+
[item.owner, item.due ? `${item.due} \u307E\u3067` : void 0].filter(Boolean).join("\u30FB"),
|
|
148
|
+
"\uFF09"
|
|
149
|
+
] }) : null
|
|
150
|
+
] }, i)) }) : /* @__PURE__ */ jsx("div", { className: "w-full overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "table w-full", children: [
|
|
151
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
152
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u5BFE\u5FDC" }),
|
|
153
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u62C5\u5F53" }),
|
|
154
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u671F\u9650" }),
|
|
155
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u671F\u5F85\u3059\u308B\u52B9\u679C" }),
|
|
156
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u512A\u5148\u5EA6" })
|
|
157
|
+
] }) }),
|
|
158
|
+
/* @__PURE__ */ jsx("tbody", { children: items.map((item, i) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
159
|
+
/* @__PURE__ */ jsx("td", { children: item.action }),
|
|
160
|
+
/* @__PURE__ */ jsx("td", { children: item.owner ?? "\u2014" }),
|
|
161
|
+
/* @__PURE__ */ jsx("td", { className: "whitespace-nowrap tabular-nums", children: item.due ?? "\u2014" }),
|
|
162
|
+
/* @__PURE__ */ jsx("td", { children: item.impact ?? "\u2014" }),
|
|
163
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Priority, { value: item.priority }) })
|
|
164
|
+
] }, i)) })
|
|
165
|
+
] }) })
|
|
166
|
+
] });
|
|
167
|
+
}
|
|
168
|
+
var KINDS = {
|
|
169
|
+
note: { word: "\u88DC\u8DB3", rule: "border-info", tint: "bg-info-subtle", text: "text-info" },
|
|
170
|
+
insight: { word: "\u793A\u5506", rule: "border-positive", tint: "bg-positive-subtle", text: "text-positive" },
|
|
171
|
+
warning: { word: "\u6CE8\u610F", rule: "border-warning", tint: "bg-warning-subtle", text: "text-warning" },
|
|
172
|
+
decision: { word: "\u6C7A\u5B9A\u4E8B\u9805", rule: "border-foreground", tint: "bg-muted", text: "text-foreground" }
|
|
173
|
+
};
|
|
174
|
+
function DocCallout({ kind = "note", title, children }) {
|
|
175
|
+
const k = KINDS[kind];
|
|
176
|
+
const titleId = useId();
|
|
177
|
+
const heading = title && title !== k.word ? `${k.word}: ${title}` : k.word;
|
|
178
|
+
return /* @__PURE__ */ jsxs(
|
|
179
|
+
"div",
|
|
180
|
+
{
|
|
181
|
+
role: "note",
|
|
182
|
+
"aria-labelledby": titleId,
|
|
183
|
+
"data-slot": "doc-callout",
|
|
184
|
+
"data-kind": kind,
|
|
185
|
+
className: `break-inside-avoid border-l-4 px-4 py-2 ${k.rule} ${k.tint}`,
|
|
186
|
+
children: [
|
|
187
|
+
/* @__PURE__ */ jsx("p", { id: titleId, className: `m-0 font-semibold ${k.text}`, children: heading }),
|
|
188
|
+
/* @__PURE__ */ jsx("div", { children: typeof children === "string" ? /* @__PURE__ */ jsx("p", { className: "m-0", children }) : children })
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
var ALIGN = { left: "text-left", right: "text-right", center: "text-center" };
|
|
194
|
+
function DocDataTable({ title, unit, columns, rows, total, highlightRows, footnotes, source, asOf }) {
|
|
195
|
+
const isNumeric = (col) => rows.some((r) => typeof r[col.key] === "number");
|
|
196
|
+
const cls = (col) => {
|
|
197
|
+
const numeric = isNumeric(col);
|
|
198
|
+
return `${ALIGN[col.align ?? (numeric ? "right" : "left")]}${numeric ? " tabular-nums" : ""}`;
|
|
199
|
+
};
|
|
200
|
+
const text = (col, v) => typeof v === "number" ? formatValue(v, col.format ?? "number") : v === null || v === void 0 || v === "" ? "\u2014" : v;
|
|
201
|
+
const origin = [source ? `\u51FA\u5178: ${source}` : void 0, asOf ? `\u30C7\u30FC\u30BF\u6642\u70B9 ${asOf}` : void 0].filter(Boolean).join(" \uFF0F ");
|
|
202
|
+
const highlighted = new Set(highlightRows);
|
|
203
|
+
return /* @__PURE__ */ jsxs("figure", { "data-slot": "doc-data-table", className: "m-0 w-full break-inside-auto", children: [
|
|
204
|
+
/* @__PURE__ */ jsx("div", { className: "w-full overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "table w-full", children: [
|
|
205
|
+
title || unit ? /* @__PURE__ */ jsxs("caption", { className: "text-left", children: [
|
|
206
|
+
title ? /* @__PURE__ */ jsx("span", { className: "font-semibold", children: title }) : null,
|
|
207
|
+
unit ? /* @__PURE__ */ jsx("span", { style: { color: "var(--doc-muted)" }, children: title ? `\uFF08${unit}\uFF09` : unit }) : null
|
|
208
|
+
] }) : null,
|
|
209
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: columns.map((col) => /* @__PURE__ */ jsx("th", { scope: "col", className: cls(col), children: col.label }, col.key)) }) }),
|
|
210
|
+
/* @__PURE__ */ jsx("tbody", { children: rows.map((row, i) => /* @__PURE__ */ jsx("tr", { className: highlighted.has(i) ? "font-semibold" : void 0, children: columns.map((col) => /* @__PURE__ */ jsx("td", { className: cls(col), children: text(col, row[col.key]) }, col.key)) }, i)) }),
|
|
211
|
+
total ? /* @__PURE__ */ jsx("tfoot", { children: /* @__PURE__ */ jsx("tr", { className: "font-semibold", children: columns.map((col) => /* @__PURE__ */ jsx("td", { className: cls(col), children: text(col, total[col.key]) }, col.key)) }) }) : null
|
|
212
|
+
] }) }),
|
|
213
|
+
footnotes?.length || origin ? /* @__PURE__ */ jsxs("figcaption", { className: "flex flex-col gap-0.5 break-inside-avoid text-left", children: [
|
|
214
|
+
footnotes?.map((f) => /* @__PURE__ */ jsxs("span", { children: [
|
|
215
|
+
f.mark,
|
|
216
|
+
" ",
|
|
217
|
+
f.text
|
|
218
|
+
] }, f.mark)),
|
|
219
|
+
origin ? /* @__PURE__ */ jsx("span", { children: origin }) : null
|
|
220
|
+
] }) : null
|
|
221
|
+
] });
|
|
222
|
+
}
|
|
223
|
+
function ChangeText({ delta, format, betterWhen = "up" }) {
|
|
224
|
+
const { value } = delta;
|
|
225
|
+
const dir = value > 0 ? "up" : value < 0 ? "down" : "flat";
|
|
226
|
+
const mark = dir === "up" ? "\u25B2" : dir === "down" ? "\u25BC" : "\u2192";
|
|
227
|
+
const word = dir === "up" ? "\u5897" : dir === "down" ? "\u6E1B" : "\u6A2A\u3070\u3044";
|
|
228
|
+
const good = dir === "flat" ? void 0 : dir === "up" === (betterWhen === "up");
|
|
229
|
+
const tone = good === void 0 ? void 0 : good ? "text-positive" : "text-negative";
|
|
230
|
+
const text = formatDelta(value, delta.format ?? format);
|
|
231
|
+
return /* @__PURE__ */ jsxs(
|
|
232
|
+
"span",
|
|
233
|
+
{
|
|
234
|
+
className: tone,
|
|
235
|
+
style: tone ? void 0 : { color: "var(--doc-muted)" },
|
|
236
|
+
"aria-label": `${word}\u3001${text}${good === void 0 ? "" : good ? "\u3001\u6539\u5584" : "\u3001\u60AA\u5316"}`,
|
|
237
|
+
children: [
|
|
238
|
+
mark,
|
|
239
|
+
" ",
|
|
240
|
+
text
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
function DocExecutiveSummary({
|
|
246
|
+
title = "\u8981\u65E8",
|
|
247
|
+
headingLevel = 2,
|
|
248
|
+
conclusion,
|
|
249
|
+
points,
|
|
250
|
+
metrics
|
|
251
|
+
}) {
|
|
252
|
+
const Heading = headingLevel === 3 ? "h3" : "h2";
|
|
253
|
+
const shown2 = (metrics ?? []).slice(0, 3);
|
|
254
|
+
return /* @__PURE__ */ jsxs("section", { "data-slot": "doc-executive-summary", children: [
|
|
255
|
+
/* @__PURE__ */ jsx(Heading, { children: title }),
|
|
256
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold", children: conclusion }),
|
|
257
|
+
/* @__PURE__ */ jsx("ol", { children: points.map((point, i) => /* @__PURE__ */ jsx("li", { className: "break-inside-avoid", children: point }, i)) }),
|
|
258
|
+
shown2.length > 0 ? /* @__PURE__ */ jsx("dl", { className: "grid grid-cols-1 gap-4 sm:grid-cols-3 print:grid-cols-3", children: shown2.map((m) => /* @__PURE__ */ jsxs(
|
|
259
|
+
"div",
|
|
260
|
+
{
|
|
261
|
+
className: "break-inside-avoid border-l-2 pl-3",
|
|
262
|
+
style: { borderColor: "var(--doc-border)" },
|
|
263
|
+
children: [
|
|
264
|
+
/* @__PURE__ */ jsx("dt", { style: { color: "var(--doc-muted)" }, children: m.label }),
|
|
265
|
+
/* @__PURE__ */ jsx("dd", { className: "m-0 font-semibold tabular-nums", children: m.display ?? formatValue(m.value, m.format) }),
|
|
266
|
+
m.delta ? /* @__PURE__ */ jsxs("dd", { className: "m-0", children: [
|
|
267
|
+
/* @__PURE__ */ jsxs("span", { style: { color: "var(--doc-muted)" }, children: [
|
|
268
|
+
m.comparisonLabel ?? "\u524D\u671F\u6BD4",
|
|
269
|
+
" "
|
|
270
|
+
] }),
|
|
271
|
+
/* @__PURE__ */ jsx(ChangeText, { delta: m.delta, format: m.format, betterWhen: m.betterWhen })
|
|
272
|
+
] }) : null
|
|
273
|
+
]
|
|
274
|
+
},
|
|
275
|
+
m.label
|
|
276
|
+
)) }) : null
|
|
277
|
+
] });
|
|
278
|
+
}
|
|
279
|
+
function DocFigure({ title, unit, number, source, asOf, notes, children }) {
|
|
280
|
+
const titleId = useId();
|
|
281
|
+
const origin = [source ? `\u51FA\u5178: ${source}` : void 0, asOf ? `\u30C7\u30FC\u30BF\u6642\u70B9 ${asOf}` : void 0].filter(Boolean).join(" \uFF0F ");
|
|
282
|
+
const hasCaption = number !== void 0 || origin || notes && notes.length > 0;
|
|
283
|
+
return /* @__PURE__ */ jsxs("figure", { "data-slot": "doc-figure", "aria-labelledby": titleId, className: "w-full break-inside-avoid", children: [
|
|
284
|
+
/* @__PURE__ */ jsx("p", { id: titleId, className: "m-0 font-semibold", children: title }),
|
|
285
|
+
unit ? /* @__PURE__ */ jsx("p", { className: "m-0", style: { color: "var(--doc-muted)" }, children: unit }) : null,
|
|
286
|
+
/* @__PURE__ */ jsx("div", { className: "w-full", children }),
|
|
287
|
+
hasCaption ? /* @__PURE__ */ jsxs("figcaption", { className: "flex flex-col gap-0.5 text-left", children: [
|
|
288
|
+
number !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
|
|
289
|
+
"\u56F3 ",
|
|
290
|
+
number
|
|
291
|
+
] }) : null,
|
|
292
|
+
origin ? /* @__PURE__ */ jsx("span", { children: origin }) : null,
|
|
293
|
+
notes?.map((note, i) => /* @__PURE__ */ jsx("span", { children: note }, i))
|
|
294
|
+
] }) : null
|
|
295
|
+
] });
|
|
296
|
+
}
|
|
297
|
+
function ChangeText2({ delta, format, betterWhen = "up" }) {
|
|
298
|
+
const { value } = delta;
|
|
299
|
+
const dir = value > 0 ? "up" : value < 0 ? "down" : "flat";
|
|
300
|
+
const mark = dir === "up" ? "\u25B2" : dir === "down" ? "\u25BC" : "\u2192";
|
|
301
|
+
const word = dir === "up" ? "\u5897" : dir === "down" ? "\u6E1B" : "\u6A2A\u3070\u3044";
|
|
302
|
+
const good = dir === "flat" ? void 0 : dir === "up" === (betterWhen === "up");
|
|
303
|
+
const tone = good === void 0 ? void 0 : good ? "text-positive" : "text-negative";
|
|
304
|
+
const text = formatDelta(value, delta.format ?? format);
|
|
305
|
+
return /* @__PURE__ */ jsxs(
|
|
306
|
+
"span",
|
|
307
|
+
{
|
|
308
|
+
className: tone,
|
|
309
|
+
style: tone ? void 0 : { color: "var(--doc-muted)" },
|
|
310
|
+
"aria-label": `${word}\u3001${text}${good === void 0 ? "" : good ? "\u3001\u6539\u5584" : "\u3001\u60AA\u5316"}`,
|
|
311
|
+
children: [
|
|
312
|
+
mark,
|
|
313
|
+
" ",
|
|
314
|
+
text
|
|
315
|
+
]
|
|
316
|
+
}
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
function DocKeyFindings({ title = "\u4E3B\u8981\u306A\u767A\u898B", headingLevel = 2, findings }) {
|
|
320
|
+
const Heading = headingLevel === 3 ? "h3" : "h2";
|
|
321
|
+
const Item = headingLevel === 3 ? "h4" : "h3";
|
|
322
|
+
return /* @__PURE__ */ jsxs("section", { "data-slot": "doc-key-findings", children: [
|
|
323
|
+
/* @__PURE__ */ jsx(Heading, { children: title }),
|
|
324
|
+
findings.map((f, i) => /* @__PURE__ */ jsxs("article", { className: "break-inside-avoid", children: [
|
|
325
|
+
/* @__PURE__ */ jsxs(Item, { children: [
|
|
326
|
+
i + 1,
|
|
327
|
+
". ",
|
|
328
|
+
f.headline
|
|
329
|
+
] }),
|
|
330
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between print:flex-row print:justify-between", children: [
|
|
331
|
+
/* @__PURE__ */ jsx("div", { children: typeof f.evidence === "string" ? /* @__PURE__ */ jsx("p", { className: "m-0", children: f.evidence }) : f.evidence }),
|
|
332
|
+
f.metric ? /* @__PURE__ */ jsxs("dl", { className: "m-0 shrink-0 sm:text-right print:text-right", children: [
|
|
333
|
+
/* @__PURE__ */ jsx("dt", { style: { color: "var(--doc-muted)" }, children: f.metric.label }),
|
|
334
|
+
/* @__PURE__ */ jsx("dd", { className: "m-0 font-semibold tabular-nums", children: f.metric.display ?? formatValue(f.metric.value, f.metric.format) }),
|
|
335
|
+
f.metric.delta ? /* @__PURE__ */ jsxs("dd", { className: "m-0", children: [
|
|
336
|
+
/* @__PURE__ */ jsxs("span", { style: { color: "var(--doc-muted)" }, children: [
|
|
337
|
+
f.metric.comparisonLabel ?? "\u524D\u671F\u6BD4",
|
|
338
|
+
" "
|
|
339
|
+
] }),
|
|
340
|
+
/* @__PURE__ */ jsx(ChangeText2, { delta: f.metric.delta, format: f.metric.format, betterWhen: f.metric.betterWhen })
|
|
341
|
+
] }) : null
|
|
342
|
+
] }) : null
|
|
343
|
+
] })
|
|
344
|
+
] }, i))
|
|
345
|
+
] });
|
|
346
|
+
}
|
|
347
|
+
var MUTED2 = { color: "var(--doc-muted)" };
|
|
348
|
+
var ACHIEVEMENT = { type: "percent", digits: 1 };
|
|
349
|
+
function ChangeText3({ delta, format, betterWhen = "up" }) {
|
|
350
|
+
const { value } = delta;
|
|
351
|
+
const dir = value > 0 ? "up" : value < 0 ? "down" : "flat";
|
|
352
|
+
const mark = dir === "up" ? "\u25B2" : dir === "down" ? "\u25BC" : "\u2192";
|
|
353
|
+
const word = dir === "up" ? "\u5897" : dir === "down" ? "\u6E1B" : "\u6A2A\u3070\u3044";
|
|
354
|
+
const good = dir === "flat" ? void 0 : dir === "up" === (betterWhen === "up");
|
|
355
|
+
const tone = good === void 0 ? void 0 : good ? "text-positive" : "text-negative";
|
|
356
|
+
const text = formatDelta(value, delta.format ?? format);
|
|
357
|
+
return /* @__PURE__ */ jsxs(
|
|
358
|
+
"span",
|
|
359
|
+
{
|
|
360
|
+
className: tone,
|
|
361
|
+
style: tone ? void 0 : { color: "var(--doc-muted)" },
|
|
362
|
+
"aria-label": `${word}\u3001${text}${good === void 0 ? "" : good ? "\u3001\u6539\u5584" : "\u3001\u60AA\u5316"}`,
|
|
363
|
+
children: [
|
|
364
|
+
mark,
|
|
365
|
+
" ",
|
|
366
|
+
text
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
var shown = (m) => m.display ?? formatValue(m.value, m.format);
|
|
372
|
+
var achievement = (m) => m.target === void 0 || m.target === 0 || m.value === null ? "\u2014" : formatValue(m.value / m.target, ACHIEVEMENT);
|
|
373
|
+
var change = (m) => m.delta ? /* @__PURE__ */ jsx(ChangeText3, { delta: m.delta, format: m.format, betterWhen: m.betterWhen }) : "\u2014";
|
|
374
|
+
var trendOf = (m) => (m.trend ?? []).map(({ y }) => ({ value: y }));
|
|
375
|
+
function DocKpiScorecard({
|
|
376
|
+
title = "\u4E3B\u8981\u6307\u6A19",
|
|
377
|
+
headingLevel = 2,
|
|
378
|
+
metrics,
|
|
379
|
+
variant = "table",
|
|
380
|
+
asOf,
|
|
381
|
+
source
|
|
382
|
+
}) {
|
|
383
|
+
const Heading = headingLevel === 3 ? "h3" : "h2";
|
|
384
|
+
const caption = [source ? `\u51FA\u5178: ${source}` : void 0, asOf ? `\u30C7\u30FC\u30BF\u6642\u70B9 ${asOf}` : void 0].filter(Boolean).join(" \uFF0F ");
|
|
385
|
+
const columnLabel = metrics.find((m) => m.comparisonLabel)?.comparisonLabel ?? "\u524D\u671F\u6BD4";
|
|
386
|
+
return /* @__PURE__ */ jsxs("section", { "data-slot": "doc-kpi-scorecard", children: [
|
|
387
|
+
/* @__PURE__ */ jsx(Heading, { children: title }),
|
|
388
|
+
variant === "grid" ? /* @__PURE__ */ jsx("dl", { className: "m-0 grid grid-cols-1 gap-4 sm:grid-cols-3 print:grid-cols-3", children: metrics.map((m) => /* @__PURE__ */ jsxs(
|
|
389
|
+
"div",
|
|
390
|
+
{
|
|
391
|
+
className: "break-inside-avoid rounded-md border p-3",
|
|
392
|
+
style: { borderColor: "var(--doc-border)", background: "var(--doc-subtle)" },
|
|
393
|
+
children: [
|
|
394
|
+
/* @__PURE__ */ jsx("dt", { style: MUTED2, children: m.label }),
|
|
395
|
+
/* @__PURE__ */ jsx("dd", { className: "m-0 font-semibold tabular-nums", children: shown(m) }),
|
|
396
|
+
/* @__PURE__ */ jsxs("dd", { className: "m-0 flex flex-col gap-0.5", children: [
|
|
397
|
+
m.delta ? /* @__PURE__ */ jsxs("span", { children: [
|
|
398
|
+
/* @__PURE__ */ jsxs("span", { style: MUTED2, children: [
|
|
399
|
+
m.comparisonLabel ?? "\u524D\u671F\u6BD4",
|
|
400
|
+
" "
|
|
401
|
+
] }),
|
|
402
|
+
change(m)
|
|
403
|
+
] }) : null,
|
|
404
|
+
m.target !== void 0 ? /* @__PURE__ */ jsxs("span", { children: [
|
|
405
|
+
/* @__PURE__ */ jsx("span", { style: MUTED2, children: "\u9054\u6210\u7387 " }),
|
|
406
|
+
achievement(m),
|
|
407
|
+
/* @__PURE__ */ jsxs("span", { style: MUTED2, children: [
|
|
408
|
+
"\uFF08\u76EE\u6A19 ",
|
|
409
|
+
formatValue(m.target, m.format),
|
|
410
|
+
"\uFF09"
|
|
411
|
+
] })
|
|
412
|
+
] }) : null
|
|
413
|
+
] }),
|
|
414
|
+
m.trend && m.trend.length > 1 ? /* @__PURE__ */ jsx("dd", { className: "m-0", children: /* @__PURE__ */ jsx(Sparkline, { data: trendOf(m), height: 28, "aria-label": `${m.label}\u306E\u63A8\u79FB` }) }) : null
|
|
415
|
+
]
|
|
416
|
+
},
|
|
417
|
+
m.label
|
|
418
|
+
)) }) : /* @__PURE__ */ jsx("div", { className: "w-full overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "table w-full", children: [
|
|
419
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
420
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u6307\u6A19" }),
|
|
421
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "text-right", children: "\u5B9F\u7E3E" }),
|
|
422
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "text-right", children: columnLabel }),
|
|
423
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "text-right", children: "\u76EE\u6A19" }),
|
|
424
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "text-right", children: "\u9054\u6210\u7387" }),
|
|
425
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: "\u63A8\u79FB" })
|
|
426
|
+
] }) }),
|
|
427
|
+
/* @__PURE__ */ jsx("tbody", { children: metrics.map((m) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
428
|
+
/* @__PURE__ */ jsx("th", { scope: "row", className: "font-medium", children: m.label }),
|
|
429
|
+
/* @__PURE__ */ jsx("td", { className: "text-right font-semibold tabular-nums", children: shown(m) }),
|
|
430
|
+
/* @__PURE__ */ jsx("td", { className: "text-right whitespace-nowrap", children: change(m) }),
|
|
431
|
+
/* @__PURE__ */ jsx("td", { className: "text-right tabular-nums", children: m.target === void 0 ? "\u2014" : formatValue(m.target, m.format) }),
|
|
432
|
+
/* @__PURE__ */ jsx("td", { className: "text-right tabular-nums", children: achievement(m) }),
|
|
433
|
+
/* @__PURE__ */ jsx("td", { children: m.trend && m.trend.length > 1 ? /* @__PURE__ */ jsx(Sparkline, { data: trendOf(m), height: 24, "aria-label": `${m.label}\u306E\u63A8\u79FB` }) : "\u2014" })
|
|
434
|
+
] }, m.label)) })
|
|
435
|
+
] }) }),
|
|
436
|
+
caption ? /* @__PURE__ */ jsx("p", { style: MUTED2, children: caption }) : null
|
|
437
|
+
] });
|
|
438
|
+
}
|
|
439
|
+
function DocReportHeader({ title, subtitle, period, asOf, author, source }) {
|
|
440
|
+
const facts = [
|
|
441
|
+
...period ? [{ label: "\u5BFE\u8C61\u671F\u9593", value: period }] : [],
|
|
442
|
+
...asOf ? [{ label: "\u30C7\u30FC\u30BF\u6642\u70B9", value: asOf }] : [],
|
|
443
|
+
...author ? [{ label: "\u4F5C\u6210\u8005", value: author }] : [],
|
|
444
|
+
...source ? [{ label: "\u51FA\u5178", value: source }] : []
|
|
445
|
+
];
|
|
446
|
+
return /* @__PURE__ */ jsxs("header", { "data-slot": "doc-report-header", className: "break-inside-avoid", children: [
|
|
447
|
+
/* @__PURE__ */ jsx("h1", { children: title }),
|
|
448
|
+
subtitle ? typeof subtitle === "string" ? /* @__PURE__ */ jsx("p", { style: { color: "var(--doc-muted)" }, children: subtitle }) : /* @__PURE__ */ jsx("div", { style: { color: "var(--doc-muted)" }, children: subtitle }) : null,
|
|
449
|
+
facts.length > 0 ? /* @__PURE__ */ jsx(
|
|
450
|
+
"dl",
|
|
451
|
+
{
|
|
452
|
+
className: "grid grid-cols-1 gap-x-8 gap-y-2 border-y py-3 sm:grid-cols-2 print:grid-cols-2",
|
|
453
|
+
style: { borderColor: "var(--doc-border)" },
|
|
454
|
+
children: facts.map((fact) => /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
455
|
+
/* @__PURE__ */ jsx("dt", { className: "shrink-0", style: { color: "var(--doc-muted)" }, children: fact.label }),
|
|
456
|
+
/* @__PURE__ */ jsx("dd", { className: "m-0 font-medium", children: fact.value })
|
|
457
|
+
] }, fact.label))
|
|
458
|
+
}
|
|
459
|
+
) : null
|
|
460
|
+
] });
|
|
461
|
+
}
|
|
129
462
|
|
|
130
|
-
export { Document };
|
|
463
|
+
export { DocActionItems, DocCallout, DocDataTable, DocExecutiveSummary, DocFigure, DocKeyFindings, DocKpiScorecard, DocReportHeader, Document };
|
|
131
464
|
//# sourceMappingURL=index.js.map
|
|
132
465
|
//# sourceMappingURL=index.js.map
|
package/dist/doc/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/doc/print.ts","../../src/doc/document.tsx"],"names":["Document"],"mappings":";;;;;;;;;AAOA,IAAM,UAAA,GAAa,MAAA;AACnB,IAAM,UAAA,GAAa,YAAA;AAInB,IAAI,OAAA,GAA0B,IAAA;AAG9B,SAAS,UAAA,GAAmB;AAC1B,EAAA,IAAI,OAAA,EAAS;AACb,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,CAAC,QAAA,CAAS,eAAA,EAAiB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1D,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AACrC,MAAA,EAAA,CAAG,SAAA,CAAU,OAAO,UAAU,CAAA;AAC9B,MAAA,IAAA,CAAK,KAAK,MAAM,EAAA,CAAG,SAAA,CAAU,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,EAAA,CAAG,YAAA,CAAa,UAAU,CAAA,KAAM,MAAA,EAAQ;AAC1C,MAAA,EAAA,CAAG,YAAA,CAAa,YAAY,OAAO,CAAA;AACnC,MAAA,IAAA,CAAK,KAAK,MAAM,EAAA,CAAG,YAAA,CAAa,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,OAAA,GAAU,MAAM;AACd,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,EAAA,EAAG;AAAA,EAC5B,CAAA;AACF;AAEA,SAAS,YAAA,GAAqB;AAC5B,EAAA,OAAA,IAAU;AACV,EAAA,OAAA,GAAU,IAAA;AACZ;AAEA,SAAS,SAAA,GAA2B;AAClC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,qBAAA,CAAsB,MAAM,CAAA;AAC5B,IAAA,UAAA,CAAW,QAAQ,EAAE,CAAA;AAAA,EACvB,CAAC,CAAA;AACH;AASA,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,gBAAA,GAAmB,GAAA;AAEzB,eAAe,aAAA,GAA+B;AAC5C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,gBAAA;AACrC,EAAA,OAAO,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA,EAAU;AACnC,IAAA,IAAI,CAAC,QAAA,CAAS,aAAA,CAAc,6CAA6C,CAAA,EAAG;AAC5E,IAAA,MAAM,SAAA,EAAU;AAAA,EAClB;AACF;AAMA,eAAsB,aAAA,GAA+B;AACnD,EAAA,MAAM,YAAY,OAAA,KAAY,IAAA;AAC9B,EAAA,UAAA,EAAW;AACX,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,QAAW,SAAA,EAAU;AAAA,IAC3D;AACA,IAAA,MAAM,aAAA,EAAc;AACpB,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,EAAa;AACb,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAQO,SAAS,gBAAA,GAA+B;AAC7C,EAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,UAAU,CAAA;AACjD,EAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAClD,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,UAAU,CAAA;AACpD,IAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAAA,EACvD,CAAA;AACF;ACpFA,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;AAGA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,UAAU,QAAA,CAAS,WAAA,GAAc,UAAA,CAAW,IAAI,IAAI,oCAAA,GAAc,aAAA;AAC3E;AAaO,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,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,SAAA,CAAU,MAAM,gBAAA,EAAiB,EAAG,EAAE,CAAA;AACtC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,aAAa,KAAA,GAAQ,EAAE,GAAG,SAAA,EAAW,GAAG,OAAM,GAAI,MAAA;AAAA,QACxD,GAAG;AAAA;AAAA,KACN;AAAA,oBACA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,gBAAA;AAAA,QACV,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,uCAAA;AAAA,QACV,OAAA,EAAS,MAAM,KAAK,aAAA,EAAc;AAAA,QAClC,KAAA,EAAO,KAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,WAAA,EAAA,EAAY,eAAY,MAAA,EAAO,CAAA;AAAA,UAC/B;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAC;AACD,QAAA,CAAS,WAAA,GAAc,UAAA","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 \"../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/** 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 style={themeVars || style ? { ...themeVars, ...style } : undefined}\n {...props}\n />\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"]}
|
|
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-
|
|
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-
|
|
114
|
-
//# sourceMappingURL=docs-
|
|
113
|
+
//# sourceMappingURL=docs-JVP4RPKT.js.map
|
|
114
|
+
//# sourceMappingURL=docs-JVP4RPKT.js.map
|