@squadbase/vantage 0.6.2-dev1.42c4e48 → 0.6.2-dev1.48b34e1
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/{build-MFWRPYKW.js → build-U7GO26HR.js} +7 -7
- package/dist/{build-MFWRPYKW.js.map → build-U7GO26HR.js.map} +1 -1
- package/dist/{check-ZBIH422T.js → check-MRVAIHG5.js} +5 -5
- package/dist/{check-ZBIH422T.js.map → check-MRVAIHG5.js.map} +1 -1
- package/dist/chunk-2IAPIOPS.js +152 -0
- package/dist/chunk-2IAPIOPS.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-6OTTGAPO.js +44 -0
- package/dist/chunk-6OTTGAPO.js.map +1 -0
- package/dist/{chunk-OB6UBJXF.js → chunk-7S52M2SL.js} +127 -36
- package/dist/chunk-7S52M2SL.js.map +1 -0
- package/dist/{chunk-V3LF7BE7.js → chunk-ANZLVSEP.js} +4 -5
- package/dist/chunk-ANZLVSEP.js.map +1 -0
- package/dist/{chunk-XQUSGIDG.js → chunk-CKWPK4RO.js} +10 -3
- package/dist/chunk-CKWPK4RO.js.map +1 -0
- 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-7DZGJQ3P.js → chunk-PJ4SPXHS.js} +23 -6
- package/dist/chunk-PJ4SPXHS.js.map +1 -0
- package/dist/chunk-QOXXOFGL.js +7051 -0
- package/dist/chunk-QOXXOFGL.js.map +1 -0
- package/dist/{chunk-CEXAQQ5W.js → chunk-S5MDTHH7.js} +180 -18
- package/dist/chunk-S5MDTHH7.js.map +1 -0
- package/dist/{chunk-IBGOCWJB.js → chunk-SDJTTMLK.js} +247 -86
- package/dist/chunk-SDJTTMLK.js.map +1 -0
- package/dist/{chunk-QEWCYW3I.js → chunk-SHZM3EXB.js} +29 -8
- package/dist/chunk-SHZM3EXB.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-JKLLFVEU.js → chunk-UWSQUHX6.js} +4 -99
- package/dist/chunk-UWSQUHX6.js.map +1 -0
- package/dist/cli.js +6 -6
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +8 -2
- package/dist/client/index.js.map +1 -1
- package/dist/components/index.d.ts +1596 -100
- package/dist/components/index.js +7 -4
- package/dist/delta-text-CvwBGJ95.d.ts +15 -0
- package/dist/{dev-DCTOHQ6W.js → dev-O42JFQ64.js} +7 -7
- package/dist/{dev-DCTOHQ6W.js.map → dev-O42JFQ64.js.map} +1 -1
- package/dist/doc/index.d.ts +215 -2
- package/dist/doc/index.js +309 -5
- package/dist/doc/index.js.map +1 -1
- package/dist/{doctor-5E2VEZPK.js → doctor-YD3XAAOT.js} +5 -5
- package/dist/{doctor-5E2VEZPK.js.map → doctor-YD3XAAOT.js.map} +1 -1
- 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/query/index.js +2 -2
- package/dist/{routes-3SGAFDMC.js → routes-PVKNT777.js} +4 -4
- package/dist/{routes-3SGAFDMC.js.map → routes-PVKNT777.js.map} +1 -1
- package/dist/slide/index.d.ts +272 -1
- package/dist/slide/index.js +974 -4
- package/dist/slide/index.js.map +1 -1
- package/dist/table/index.js +11 -8
- package/dist/table/index.js.map +1 -1
- package/dist/ui/index.d.ts +8 -2
- package/dist/ui/index.js +22 -112
- package/dist/ui/index.js.map +1 -1
- package/dist/{upgrade-DBBE6GIR.js → upgrade-6DT7ADRP.js} +4 -4
- package/dist/{upgrade-DBBE6GIR.js.map → upgrade-6DT7ADRP.js.map} +1 -1
- package/dist/vite/index.js +3 -3
- package/docs/en/agent-skills.md +1 -1
- package/docs/en/changelog.md +2 -0
- package/docs/en/components.md +42 -17
- package/docs/en/doc/delta-text.md +40 -0
- 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-notes-and-sources.md +43 -0
- package/docs/en/doc/doc-report-header.md +46 -0
- package/docs/en/pages-and-metadata.md +15 -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 +51 -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 +58 -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/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-full.md +48 -0
- package/docs/en/slide/slide-chart-insight.md +52 -0
- package/docs/en/slide/slide-columns.md +46 -0
- package/docs/en/slide/slide-comparison.md +68 -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-heading.md +38 -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/slide/slide-section.md +44 -0
- package/docs/en/slide/slide-source-line.md +34 -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 +917 -77
- package/docs/ja/agent-skills.md +1 -1
- package/docs/ja/changelog.md +2 -0
- package/docs/ja/components.md +39 -16
- package/docs/ja/doc/delta-text.md +40 -0
- 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-notes-and-sources.md +43 -0
- package/docs/ja/doc/doc-report-header.md +46 -0
- package/docs/ja/page-types/slide.md +1 -0
- package/docs/ja/pages-and-metadata.md +15 -0
- package/docs/ja/parts/area-chart.md +49 -25
- package/docs/ja/parts/bar-chart.md +50 -24
- package/docs/ja/parts/bar-list.md +31 -8
- package/docs/ja/parts/chart-frame.md +36 -0
- package/docs/ja/parts/data-table.md +22 -0
- package/docs/ja/parts/delta.md +51 -0
- package/docs/ja/parts/donut-chart.md +45 -26
- 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 +56 -0
- package/docs/ja/parts/legend.md +36 -0
- package/docs/ja/parts/line-chart.md +48 -22
- package/docs/ja/parts/metric-value.md +3 -2
- package/docs/ja/parts/sample-data.md +61 -0
- package/docs/ja/parts/scatter-chart.md +69 -0
- package/docs/ja/parts/sparkline.md +1 -1
- 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/slide/slide-chart-full.md +48 -0
- package/docs/ja/slide/slide-chart-insight.md +52 -0
- package/docs/ja/slide/slide-columns.md +46 -0
- package/docs/ja/slide/slide-comparison.md +68 -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-heading.md +38 -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/slide/slide-section.md +44 -0
- package/docs/ja/slide/slide-source-line.md +34 -0
- package/docs/ja/ui/empty.md +1 -1
- package/docs/ja/ui/error-state.md +4 -3
- package/docs/ja/ui/loading.md +1 -1
- package/docs/ja/ui/toggle-group.md +4 -3
- package/docs/ja/ui-and-theming.md +2 -2
- package/package.json +26 -24
- package/registry/ui/accordion.tsx +4 -2
- package/registry/ui/alert-dialog.tsx +3 -3
- package/registry/ui/alert.tsx +3 -1
- package/registry/ui/app-shell.tsx +7 -1
- package/registry/ui/area-chart.tsx +2852 -166
- package/registry/ui/attention-list.tsx +303 -0
- package/registry/ui/avatar.tsx +1 -1
- package/registry/ui/badge.tsx +3 -1
- package/registry/ui/bar-chart.tsx +2851 -166
- package/registry/ui/bar-list.tsx +3531 -90
- package/registry/ui/box-plot-chart.tsx +3906 -0
- package/registry/ui/breadcrumb.tsx +3 -1
- package/registry/ui/button.tsx +3 -1
- package/registry/ui/calendar.tsx +3 -1
- package/registry/ui/card.tsx +4 -2
- package/registry/ui/category-bar.tsx +1025 -16
- package/registry/ui/chart-frame.tsx +1393 -0
- package/registry/ui/checkbox.tsx +3 -1
- package/registry/ui/collapsible.tsx +3 -1
- package/registry/ui/combobox.tsx +2 -2
- package/registry/ui/command.tsx +3 -1
- package/registry/ui/dashboard-card.tsx +71 -28
- package/registry/ui/data-table.tsx +678 -56
- package/registry/ui/date-range-picker.tsx +245 -64
- package/registry/ui/delta.tsx +191 -0
- package/registry/ui/dialog.tsx +5 -3
- package/registry/ui/donut-chart.tsx +2929 -182
- package/registry/ui/drawer.tsx +1 -1
- package/registry/ui/dropdown-menu.tsx +5 -3
- package/registry/ui/echart.tsx +621 -67
- package/registry/ui/field.tsx +1 -1
- package/registry/ui/filter-bar.tsx +33 -6
- package/registry/ui/funnel-steps.tsx +3344 -49
- package/registry/ui/heatmap.tsx +1786 -0
- package/registry/ui/histogram-chart.tsx +3986 -0
- package/registry/ui/hover-card.tsx +2 -2
- package/registry/ui/input-group.tsx +3 -1
- package/registry/ui/input.tsx +3 -1
- package/registry/ui/kbd.tsx +3 -1
- package/registry/ui/kpi-card.tsx +704 -0
- package/registry/ui/label.tsx +3 -1
- package/registry/ui/legend.tsx +3563 -0
- package/registry/ui/line-chart.tsx +2852 -160
- package/registry/ui/metric-value.tsx +9 -1
- package/registry/ui/multi-select.tsx +11 -5
- package/registry/ui/page-shell.tsx +106 -51
- package/registry/ui/pagination.tsx +3 -1
- package/registry/ui/paired-chart.tsx +3827 -0
- package/registry/ui/placeholder.tsx +8 -2
- package/registry/ui/popover.tsx +4 -2
- package/registry/ui/progress-circle.tsx +607 -12
- package/registry/ui/progress.tsx +3 -1
- package/registry/ui/radio-group.tsx +1 -1
- package/registry/ui/sample-data.tsx +86 -0
- package/registry/ui/scatter-chart.tsx +4212 -0
- package/registry/ui/scroll-area.tsx +3 -2
- package/registry/ui/searchable-select.tsx +8 -3
- package/registry/ui/section-header.tsx +5 -3
- package/registry/ui/segmented-control.tsx +7 -2
- package/registry/ui/select.tsx +4 -2
- package/registry/ui/separator.tsx +3 -1
- package/registry/ui/sheet.tsx +4 -2
- package/registry/ui/sidebar.tsx +4 -2
- package/registry/ui/skeleton.tsx +4 -2
- package/registry/ui/slider.tsx +4 -2
- package/registry/ui/sparkline.tsx +84 -9
- package/registry/ui/spinner.tsx +3 -1
- package/registry/ui/states.tsx +34 -5
- package/registry/ui/status-badge.tsx +83 -41
- package/registry/ui/switch.tsx +3 -1
- package/registry/ui/table.tsx +4 -2
- package/registry/ui/tabs.tsx +5 -3
- package/registry/ui/textarea.tsx +3 -1
- package/registry/ui/toast.tsx +2 -2
- package/registry/ui/toggle-group.tsx +3 -1
- package/registry/ui/toggle.tsx +3 -1
- package/registry/ui/tooltip.tsx +10 -4
- package/registry/ui/tracker.tsx +632 -19
- package/registry/ui/trend-indicator.tsx +15 -3
- package/registry/ui/updated-at.tsx +122 -0
- package/registry/ui/waterfall-chart.tsx +4248 -0
- package/skills/vantage-design/SKILL.md +60 -52
- package/skills/vantage-design/references/extract.md +26 -27
- package/skills/vantage-design/references/format.md +12 -172
- package/skills/vantage-design/references/presets.md +50 -110
- package/skills/vantage-pitfalls/SKILL.md +5 -0
- package/skills/vantage-slide/SKILL.md +54 -36
- package/templates/AGENTS.md +42 -15
- package/templates/agents/doc.md +48 -0
- package/templates/agents/page.md +33 -2
- package/templates/agents/slide.md +77 -3
- package/theme.css +247 -149
- package/dist/chunk-5ZOP4SQR.js.map +0 -1
- package/dist/chunk-7DZGJQ3P.js.map +0 -1
- package/dist/chunk-A2UUGASH.js.map +0 -1
- package/dist/chunk-AG6RZ2RR.js +0 -3208
- package/dist/chunk-AG6RZ2RR.js.map +0 -1
- package/dist/chunk-CEXAQQ5W.js.map +0 -1
- package/dist/chunk-IBGOCWJB.js.map +0 -1
- package/dist/chunk-JKLLFVEU.js.map +0 -1
- package/dist/chunk-OB6UBJXF.js.map +0 -1
- package/dist/chunk-PXRX5PEC.js.map +0 -1
- package/dist/chunk-QEWCYW3I.js.map +0 -1
- package/dist/chunk-V3LF7BE7.js.map +0 -1
- package/dist/chunk-XQUSGIDG.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../squadkit/registry/lib/chart-theme.ts","../../squadkit/registry/charts/echart.tsx"],"names":["useState","useEffect","EChart","useRef","useCallback"],"mappings":"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","file":"chunk-JXFCSF3K.js","sourcesContent":["/**\n * Chart theming — reads the design tokens off the document and turns them into\n * an ECharts theme object.\n *\n * Canvas can't resolve CSS variables *while painting*, which is why series\n * colours can't just be `var(--chart-1)`. It can resolve them once, up front:\n * `getComputedStyle` returns the substituted value, and that value is handed to\n * `echarts.init` as a theme. Every colour is normalized to `rgb()`/`#rrggbb`\n * first — zrender's own colour parser only understands hex/`rgb()`/`hsl()`.\n * Canvas still paints an `oklch()` series, but every colour zrender derives from\n * it comes out empty: the hover emphasis lifts the fill, can't parse it, and the\n * hovered bar disappears. A `fillStyle` round-trip is not enough on its own —\n * current Chrome serializes `oklch()` back as `oklch()` — so a colour that comes\n * back in any other form is painted onto the canvas and read back as a pixel.\n */\nimport { createContext, useCallback, useEffect, useRef, useState, type ForwardedRef, type RefObject } from \"react\"\n\nimport type { ChartTone } from \"./types\"\n\n/**\n * The colour of the folded「その他」series / slice / row. The ONLY place this\n * grey is defined — every chart takes it from here. It is the most subdued\n * colour in a chart, not the darkest: the theme's `--neutral` mixed halfway into\n * `--background`, so it recedes in light and dark alike (and brand themes follow\n * it). `--neutral-subtle` alone sits too close to the background to read as a\n * slice. Canvas charts resolve it through `resolveChartColors`.\n */\nexport const CHART_OTHER_COLOR = \"color-mix(in oklab, var(--neutral) 50%, var(--background))\"\n\n/**\n * True inside `ChartFrame`. The frame's plot area carries the chart's single\n * `role=\"img\"` and label, so `EChart` drops its own when it sees this.\n */\nexport const ChartFrameContext = createContext(false)\n\n/** Series palette, in order. Missing tokens are skipped, not defaulted. */\nconst SERIES_TOKENS = [\"--chart-1\", \"--chart-2\", \"--chart-3\", \"--chart-4\", \"--chart-5\"] as const\n\nexport interface ChartTokens {\n /** Resolved `--chart-1..5`, in order. */\n series: string[]\n /** Computed `font-family` of the container, so canvas text matches the DOM. Optional. */\n fontFamily?: string\n /** Body text: titles and the default `textStyle`. */\n foreground: string | null\n /** Secondary text: axis labels, legend, subtitles. */\n mutedForeground: string | null\n /** Axis lines, ticks, split lines, tooltip border. */\n border: string | null\n /** Tooltip surface. */\n popover: string | null\n /** Semantic and surface dependencies used by typed chart options. Optional for hand-built tokens. */\n colors?: Record<string, string>\n /** Actual inherited painting surface (may change without a token changing). */\n surface?: string | null\n /** Tooltip text. */\n popoverForeground: string | null\n}\n\n// Keep scope out of the public token shape. A resolved snapshot remembers where arbitrary\n// var(--token) expressions must be read, without retaining unmounted charts globally.\nconst tokenScopes = new WeakMap<ChartTokens, Element>()\nconst OPTION_COLOR_TOKENS = [\n \"--background\", \"--card\", \"--muted\", \"--primary\", \"--destructive\",\n ...[\"positive\", \"negative\", \"warning\", \"neutral\", \"info\"].flatMap((tone) =>\n [\"\", \"-fill\", \"-subtle\"].map((suffix) => `--${tone}${suffix}`)),\n]\n\nlet normalizeContext: CanvasRenderingContext2D | null | undefined\n\n/** The forms `fillStyle` serializes legacy colours to, and zrender can parse. */\nconst ZRENDER_COLOR_RE = /^(?:#[0-9a-f]{6}|rgba?\\()/i\n\n/**\n * Serialize a CSS colour into a canvas-safe form, or `null` if the browser\n * rejects it. Assigning an invalid value to `fillStyle` is a no-op, so the same\n * input is written over two different known colours: agreeing results mean the\n * value parsed, differing ones mean it was dropped.\n */\nfunction toCanvasColor(value: string): string | null {\n const raw = value.trim()\n if (!raw) return null\n if (normalizeContext === undefined) {\n const canvas = document.createElement(\"canvas\")\n canvas.width = 1\n canvas.height = 1\n normalizeContext = canvas.getContext(\"2d\", { willReadFrequently: true })\n }\n const ctx = normalizeContext\n if (!ctx) return raw\n ctx.fillStyle = \"#000000\"\n ctx.fillStyle = raw\n const onBlack = ctx.fillStyle\n ctx.fillStyle = \"#ffffff\"\n ctx.fillStyle = raw\n if (onBlack !== ctx.fillStyle || typeof onBlack !== \"string\") return null\n if (ZRENDER_COLOR_RE.test(onBlack)) return onBlack\n // Still `oklch()` / `lab()` / `color(...)`: paint it and read the pixel back.\n // Wide-gamut colours clip to sRGB, which is all zrender can express anyway.\n ctx.clearRect(0, 0, 1, 1)\n ctx.fillRect(0, 0, 1, 1)\n const [r = 0, g = 0, b = 0, a = 0] = ctx.getImageData(0, 0, 1, 1).data\n return a === 255\n ? `rgb(${r}, ${g}, ${b})`\n : `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 1000) / 1000})`\n}\n\n/**\n * Read the chart tokens off `el` (the document root by default — tokens live on\n * `:root` and inherit). Returns `null` outside the browser so callers fall back\n * to plain ECharts defaults.\n */\nexport function readChartTokens(el?: Element | null): ChartTokens | null {\n if (typeof document === \"undefined\") return null\n const target = el ?? document.documentElement\n if (!target) return null\n const styles = getComputedStyle(target)\n const read = (name: string) => toCanvasColor(styles.getPropertyValue(name))\n const series: string[] = []\n for (const token of SERIES_TOKENS) {\n const color = read(token)\n if (color) series.push(color)\n }\n const tokens: ChartTokens = {\n series,\n colors: Object.fromEntries(OPTION_COLOR_TOKENS.map((name) => [name, styles.getPropertyValue(name).trim()])),\n surface: readChartSurface(target),\n ...(styles.fontFamily ? { fontFamily: styles.fontFamily } : {}),\n foreground: read(\"--foreground\"),\n mutedForeground: read(\"--muted-foreground\"),\n border: read(\"--border\"),\n popover: read(\"--popover\"),\n popoverForeground: read(\"--popover-foreground\"),\n }\n tokenScopes.set(tokens, target)\n return tokens\n}\n\n/** Structural equality, so a theme toggle that changes nothing doesn't re-init. */\nexport function sameChartTokens(a: ChartTokens | null, b: ChartTokens | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return (\n tokenScopes.get(a) === tokenScopes.get(b) &&\n a.surface === b.surface &&\n Object.keys(a.colors ?? {}).length === Object.keys(b.colors ?? {}).length &&\n Object.entries(a.colors ?? {}).every(([name, value]) => b.colors?.[name] === value) &&\n a.series.length === b.series.length &&\n a.series.every((color, i) => color === b.series[i]) &&\n a.fontFamily === b.fontFamily &&\n a.foreground === b.foreground &&\n a.mutedForeground === b.mutedForeground &&\n a.border === b.border &&\n a.popover === b.popover &&\n a.popoverForeground === b.popoverForeground\n )\n}\n\n/**\n * Watch everything that can change the resolved tokens and call `onChange` when\n * something might have. It only ever says \"re-read\" — the caller compares with\n * `sameChartTokens` and decides whether anything actually moved. Returns a\n * disposer.\n *\n * Two sources, not one:\n * - light/dark flips, which land as `class` / `data-theme` (or an inline\n * `style`) on `<html>`/`<body>`, or as an OS preference change\n * - stylesheet changes. In dev, editing `styles.css` rewrites the injected\n * `<style>` in `<head>` and touches nothing else, so watching the theme\n * attributes alone leaves the chart painted in the previous palette until a\n * reload — the tokens in the DOM are new, the canvas is not.\n */\nexport function watchChartTokens(onChange: () => void, scope?: Element | null): () => void {\n if (typeof document === \"undefined\") return () => {}\n // Style edits arrive as bursts of mutations; coalesce them into one read, and\n // take it after the next frame so a swapped stylesheet has been applied.\n let frame = 0\n const schedule = () => {\n if (frame) return\n frame = requestAnimationFrame(() => {\n frame = 0\n onChange()\n })\n }\n\n const themeObserver = new MutationObserver(schedule)\n const attributeFilter = [\"class\", \"style\", \"data-theme\"]\n // Only the chart and its ancestors can change its inherited theme. Never observe\n // the document subtree: canvas/tooltip/rendering mutations would trigger every chart.\n for (let node: Element | null = scope ?? document.body ?? document.documentElement; node; node = node.parentElement) {\n themeObserver.observe(node, { attributes: true, attributeFilter })\n }\n\n const styleObserver = new MutationObserver(schedule)\n if (document.head) {\n styleObserver.observe(document.head, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"href\", \"media\", \"disabled\"],\n })\n }\n\n // A swapped `<link>` only applies once the sheet has loaded, after its mutation.\n const onLoad = (event: Event) => {\n if (event.target instanceof HTMLLinkElement) schedule()\n }\n document.addEventListener(\"load\", onLoad, true)\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\")\n media.addEventListener(\"change\", schedule)\n\n return () => {\n if (frame) cancelAnimationFrame(frame)\n themeObserver.disconnect()\n styleObserver.disconnect()\n document.removeEventListener(\"load\", onLoad, true)\n media.removeEventListener(\"change\", schedule)\n }\n}\n\n/** Shared shape for the four axis types ECharts themes address separately. */\nfunction axisTheme(tokens: ChartTokens, splitLine: boolean) {\n const line = tokens.border ?? undefined\n return {\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: { show: true, color: tokens.mutedForeground ?? undefined, fontSize: 12 },\n // Faint horizontal rules only: the border colour at low opacity.\n splitLine: { show: splitLine, lineStyle: { color: line ? [line] : undefined, opacity: 0.5, width: 1 } },\n splitArea: { show: false },\n }\n}\n\n/**\n * Build the ECharts theme. `option.color` still wins over `theme.color`, so an\n * app that sets its own palette keeps it.\n */\nexport function buildChartTheme(tokens: ChartTokens): Record<string, unknown> {\n const text = tokens.foreground ?? undefined\n const muted = tokens.mutedForeground ?? undefined\n const line = tokens.border ?? undefined\n return {\n // Let the page background show through: charts sit on cards, not on a canvas.\n backgroundColor: \"transparent\",\n ...(tokens.series.length > 0 ? { color: tokens.series } : {}),\n textStyle: { color: text, ...(tokens.fontFamily ? { fontFamily: tokens.fontFamily } : {}) },\n title: { textStyle: { color: text }, subtextStyle: { color: muted } },\n legend: { textStyle: { color: muted } },\n categoryAxis: axisTheme(tokens, false),\n valueAxis: axisTheme(tokens, true),\n logAxis: axisTheme(tokens, true),\n timeAxis: axisTheme(tokens, true),\n tooltip: {\n // ECharts' default 0.4s transform lags the tooltip ~300ms behind the cursor.\n transitionDuration: 0,\n backgroundColor: tokens.popover ?? undefined,\n borderColor: line,\n borderWidth: 1,\n padding: [8, 12],\n // Rounded card with a soft shadow; in dark mode the shadow barely shows, so the border carries the edge.\n extraCssText: \"border-radius:8px;box-shadow:var(--shadow-card, 0 4px 12px rgb(0 0 0 / 0.08));\",\n textStyle: {\n color: tokens.popoverForeground ?? undefined,\n fontSize: 12,\n ...(tokens.fontFamily ? { fontFamily: tokens.fontFamily } : {}),\n },\n axisPointer: { lineStyle: { color: line }, crossStyle: { color: line } },\n },\n }\n}\n\n/**\n * The resolved tokens, kept current: re-read whenever `watchChartTokens` says\n * they may have moved, and only replaced when a value actually changed. For\n * components that build an ECharts option from token colours themselves (the\n * typed charts), so their palette follows light/dark like `EChart`'s theme.\n */\nexport function useChartTokens(scope?: Element | null | RefObject<Element | null>): ChartTokens | null {\n const [tokens, setTokens] = useState<ChartTokens | null>(() => readChartTokens())\n // Compared here, not inside a `setTokens` updater: an updater that reads the DOM is\n // replayed by React on every rebase and returns a fresh object each time, so the state\n // never settles (\"Maximum update depth exceeded\" once the tokens change after mount).\n const tokensRef = useRef(tokens)\n useEffect(() => {\n const target = scope && \"current\" in scope ? scope.current : scope\n const sync = () => {\n const next = readChartTokens(target)\n if (sameChartTokens(tokensRef.current, next)) return\n tokensRef.current = next\n setTokens(next)\n }\n sync()\n return watchChartTokens(sync, target)\n }, [scope])\n return tokens\n}\n\nconst SERIES_TOKEN_NAME_RE = /^chart-([1-5])$/\nconst TONE_NAME_RE = /^(?:positive|warning|negative|neutral|info)(?:-fill)?$/\nconst CSS_VAR_RE = /^var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*(.+))?\\)$/\nconst EMBEDDED_VAR_RE = /var\\(\\s*(--[\\w-]+)\\s*\\)/g\n\n/**\n * Turn chart colours into canvas-safe strings. `\"chart-1\"`〜`\"chart-5\"` come from\n * the resolved series tokens; `\"positive\"` / `\"warning\"` / `\"negative\"` / `\"neutral\"` (and the area\n * variants `\"positive-fill\"`, …) are read in the snapshot's inherited scope (`--positive`, …); `var(--token)` uses the same scope; any\n * other CSS colour is normalized like the tokens are. A colour that can't be\n * resolved comes back as `\"\"`, which ECharts treats as \"use the palette\".\n */\nexport function resolveChartColors(colors: readonly string[], tokens: ChartTokens | null): string[] {\n return colors.map((color) => {\n const token = SERIES_TOKEN_NAME_RE.exec(color.trim())\n if (token) return tokens?.series[Number(token[1]) - 1] ?? \"\"\n // Meaning colours are the theme tokens of the same name: same path as `var(--positive)`.\n if (TONE_NAME_RE.test(color.trim())) {\n if (typeof document === \"undefined\") return \"\"\n const target = (tokens && tokenScopes.get(tokens)) ?? document.documentElement\n return toCanvasColor(getComputedStyle(target).getPropertyValue(`--${color.trim()}`)) ?? \"\"\n }\n if (typeof document === \"undefined\") return color\n let value = color.trim()\n const cssVar = CSS_VAR_RE.exec(value)\n const styles = getComputedStyle((tokens && tokenScopes.get(tokens)) ?? document.documentElement)\n if (cssVar) {\n value = styles.getPropertyValue(cssVar[1]!).trim() || (cssVar[2] ?? \"\").trim()\n } else if (value.includes(\"var(\")) {\n // A colour function over tokens (`color-mix(… var(--muted-foreground) …)`):\n // substitute the tokens, then let the canvas resolve the rest.\n value = value.replace(EMBEDDED_VAR_RE, (_, name: string) => styles.getPropertyValue(name).trim())\n }\n return toCanvasColor(value) ?? \"\"\n })\n}\n\n/** Every meaning colour resolved for the canvas (`\"\"` when it can't be resolved). */\nexport function resolveToneColors(tokens: ChartTokens | null): Record<ChartTone, string> {\n const [positive = \"\", warning = \"\", negative = \"\", neutral = \"\"] = resolveChartColors(\n [\"positive\", \"warning\", \"negative\", \"neutral\"],\n tokens,\n )\n return { positive, warning, negative, neutral }\n}\n\n/** The area (`--<tone>-fill`) colours of every meaning tone, resolved for the canvas (`\"\"` when it can't be resolved). */\nexport function resolveFillColors(tokens: ChartTokens | null): Record<ChartTone, string> {\n const [positive = \"\", warning = \"\", negative = \"\", neutral = \"\"] = resolveChartColors(\n [\"positive-fill\", \"warning-fill\", \"negative-fill\", \"neutral-fill\"],\n tokens,\n )\n return { positive, warning, negative, neutral }\n}\n\nconst TRANSPARENT_RE = /^(?:transparent|rgba\\([^)]*,\\s*0(?:\\.0+)?\\))$/i\n\n/**\n * The colour the chart is painted on: the first opaque `background-color` up\n * from `el` (a card, the page), else `--background`. Canvas-safe, or `null`\n * outside the browser.\n */\nexport function readChartSurface(el: Element | null): string | null {\n if (typeof document === \"undefined\") return null\n for (let node: Element | null = el; node; node = node.parentElement) {\n const bg = getComputedStyle(node).backgroundColor.trim()\n if (bg && !TRANSPARENT_RE.test(bg)) {\n const color = toCanvasColor(bg)\n if (color) return color\n }\n }\n return toCanvasColor(getComputedStyle(el ?? document.documentElement).getPropertyValue(\"--background\"))\n}\n\n/** Widths are bucketed so a resize only rebuilds the option when the label budget can change. */\nconst WIDTH_BUCKET = 40\n\n/**\n * The surface colour behind a chart (see `readChartSurface`), re-read when the\n * tokens move (light/dark), and the plot's width (rounded down to 40px;\n * `undefined` until measured). Returns a ref for the plot that also feeds the\n * component's forwarded ref.\n */\nexport function useChartSurface<E extends Element>(\n forwarded: ForwardedRef<E>,\n tokens?: ChartTokens | null,\n): { ref: (el: E | null) => void; surface: string | undefined; width: number | undefined; tokens: ChartTokens | null } {\n const [node, setNode] = useState<E | null>(null)\n const scopedTokens = useChartTokens(node)\n const [surface, setSurface] = useState<string | undefined>(undefined)\n const [width, setWidth] = useState<number | undefined>(undefined)\n const ref = useCallback(\n (el: E | null) => {\n setNode(el)\n if (typeof forwarded === \"function\") forwarded(el)\n else if (forwarded) forwarded.current = el\n },\n [forwarded],\n )\n useEffect(() => {\n if (!node) return\n setSurface(readChartSurface(node) ?? undefined)\n }, [node, tokens, scopedTokens])\n useEffect(() => {\n if (!node || typeof ResizeObserver === \"undefined\") return\n const update = (w: number) => setWidth(Math.floor(w / WIDTH_BUCKET) * WIDTH_BUCKET)\n update(node.getBoundingClientRect().width)\n const observer = new ResizeObserver((entries) => update(entries[0]?.contentRect.width ?? 0))\n observer.observe(node)\n return () => observer.disconnect()\n }, [node])\n return { ref, surface, width, tokens: scopedTokens }\n}\n","\"use client\"\n\n/**\n * EChart — a thin Apache ECharts wrapper. It owns the canvas lifecycle (init,\n * resize, dispose), forwards `option` and event handlers, drives the loading\n * spinner, and can copy/download the chart as a PNG.\n *\n * Colours follow the design tokens: `--chart-1..5` become the series palette,\n * and the text/border/popover tokens style axes, legend and tooltip. They're\n * resolved once at init (see `chart-theme.ts`) and re-read whenever they can\n * have changed — a light/dark flip, or a stylesheet swap such as editing\n * `styles.css` while the dev server is running. `theme` opts out entirely;\n * `option.color` overrides just the palette and keeps the rest.\n *\n * Pitfall: the canvas can't read CSS. A colour written into the option as\n * `\"var(--chart-1)\"`, `\"chart-1\"` or `\"oklch(…)\"` paints black (or nothing).\n * Leave colours out and the tokens apply; when you must set one yourself, pass\n * it through `useResolvedChartColors` and use the result:\n *\n * @example\n * const [accent] = useResolvedChartColors([\"chart-2\"])\n * const option = { series: [{ type: \"line\", data, lineStyle: { color: accent } }] }\n * return <EChart option={option} />\n *\n * Updates merge instead of replacing (`replaceMerge` on every component type in\n * play), so series with a stable `id` transition to their new values while\n * anything dropped from the option is still removed. With\n * `prefers-reduced-motion: reduce` every animation is off.\n *\n * ECharts is loaded modularly (`echarts/core`): only the bar / line / pie series (and `custom`, which draws\n * the per-bar target marker),\n * the components the typed charts emit and the canvas renderer are registered\n * below. To draw anything else with `<EChart>` (scatter, funnel, dataZoom, …),\n * register it once in your own code:\n *\n * @example\n * import { use } from \"echarts/core\"\n * import { ScatterChart } from \"echarts/charts\"\n * use([ScatterChart])\n */\nimport { forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\"\nimport { init, use } from \"echarts/core\"\nimport { BarChart, CustomChart, LineChart, PieChart } from \"echarts/charts\"\nimport {\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TooltipComponent,\n} from \"echarts/components\"\nimport { CanvasRenderer } from \"echarts/renderers\"\nimport type { ECharts, EChartsOption } from \"echarts\"\nimport { Check, Copy, Download } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport type { ChartActionsOptions } from \"../lib/types\"\nimport {\n buildChartTheme,\n ChartFrameContext,\n resolveChartColors,\n useChartTokens,\n} from \"../lib/chart-theme\"\n\n// What the typed charts (Bar / Line / Area / Donut) emit. Other series and\n// components are the consumer's to `use()` — see the note at the top.\nuse([\n BarChart,\n CustomChart,\n LineChart,\n PieChart,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TooltipComponent,\n CanvasRenderer,\n])\n\nexport interface EChartProps {\n /**\n * ECharts のオプション。\n *\n * 型推論を効かせるため、必ず `EChartsOption` を annotation するか\n * `satisfies EChartsOption` を付けること。付けないと `type: \"category\"` などの\n * literal が `string` に拡張され、ビルドが失敗する。\n *\n * @example\n * import type { EChartsOption } from \"@/components/echart\"\n *\n * const option: EChartsOption = {\n * xAxis: { type: \"category\", data: [\"A\", \"B\"] },\n * yAxis: { type: \"value\" },\n * series: [{ type: \"bar\", data: [1, 2] }],\n * }\n * <EChart option={option} />\n */\n option: EChartsOption\n /**\n * チャートの高さ。数値は px、文字列は CSS 値(例: `\"50vh\"`)として扱う。\n *\n * 省略した場合は外側ラッパーに `h-[400px]` がデフォルトで当たるが、`className` に\n * `h-full` や `h-[360px]` などの高さクラスを渡せばそちらが優先される\n * (`h-full` を使う場合は親要素に確定した高さが必要)。\n * `height` と `className` の高さを両方指定した場合は `height`(インライン style)が勝つ。\n */\n height?: string | number\n loading?: boolean\n /**\n * `echarts.init` にそのまま渡すテーマ(名前または登録済みテーマオブジェクト)。\n *\n * 渡すとデザイントークン追従は**完全に無効**になり、明暗の切り替えにも追従しなく\n * なる。系列色だけ変えたいなら `option.color` を使う ― option はテーマより優先\n * されるので、軸・凡例・ツールチップのトークン追従は残る。\n */\n theme?: string | object\n onEvents?: Record<string, (params: unknown) => void>\n ariaLabel?: string\n className?: string\n /**\n * true にするとチャート右上に PNG コピー / ダウンロードボタンを表示する。\n * `exportHeader` があれば PNG の上にその見出しを含める(`{ includeTitle: false }` で含めない)。\n */\n actions?: boolean | ChartActionsOptions\n /** ダウンロード時のファイル名(拡張子含む)。省略時は \"chart.png\" */\n fileName?: string\n /**\n * PNG の上に含める見出しと要約。型付きグラフは自分の `title` / `summary` を渡す。\n * 自分で `ChartFrame` を組むときも同じものを渡すと、保存した画像だけで何のグラフか分かる。\n */\n exportHeader?: ChartExportHeader\n}\n\n/** The heading a saved PNG carries above the plot. */\nexport interface ChartExportHeader {\n title?: string\n summary?: string\n}\n\nconst HEADER_PAD_X = 16\nconst HEADER_PAD_TOP = 16\nconst HEADER_PAD_BOTTOM = 12\nconst HEADER_LINE_HEIGHT = 20\nconst HEADER_GAP = 4\nconst HEADER_FONT_SIZE = 14\n\nexport interface ChartExportHeaderLine {\n text: string\n kind: \"title\" | \"summary\"\n}\n\n/**\n * Break `text` into lines no wider than `maxWidth` (px, via `measure`), character\n * by character so Japanese wraps without spaces. Always at least one line for\n * non-empty text; a single over-wide character still gets its own line.\n */\nexport function wrapChartText(text: string, maxWidth: number, measure: (text: string) => number): string[] {\n const lines: string[] = []\n let line = \"\"\n for (const ch of text) {\n if (ch === \"\\n\") {\n lines.push(line)\n line = \"\"\n continue\n }\n if (line !== \"\" && measure(line + ch) > maxWidth) {\n lines.push(line)\n line = ch.trim() === \"\" ? \"\" : ch\n } else {\n line += ch\n }\n }\n if (line !== \"\" || lines.length === 0) lines.push(line)\n return lines.filter((l, i) => l !== \"\" || i < lines.length - 1)\n}\n\n/**\n * The lines and total height (CSS px) of the PNG's heading band for a plot\n * `width` px wide. `measure` takes (text, kind) and returns its width in px.\n * No title and no summary → no band (`height` 0).\n */\nexport function chartExportHeaderLayout(\n header: ChartExportHeader | undefined,\n width: number,\n measure: (text: string, kind: \"title\" | \"summary\") => number,\n): { lines: ChartExportHeaderLine[]; height: number } {\n const title = header?.title?.trim()\n const summary = header?.summary?.trim()\n if (!title && !summary) return { lines: [], height: 0 }\n const room = Math.max(40, width - HEADER_PAD_X * 2)\n const lines: ChartExportHeaderLine[] = [\n ...(title ? wrapChartText(title, room, (t) => measure(t, \"title\")).map((text) => ({ text, kind: \"title\" as const })) : []),\n ...(summary ? wrapChartText(summary, room, (t) => measure(t, \"summary\")).map((text) => ({ text, kind: \"summary\" as const })) : []),\n ]\n const gap = title && summary ? HEADER_GAP : 0\n return { lines, height: HEADER_PAD_TOP + lines.length * HEADER_LINE_HEIGHT + gap + HEADER_PAD_BOTTOM }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error(\"PNG の読み込みに失敗しました\"))\n image.src = src\n })\n}\n\n/** Draw a heading band (title in foreground, summary muted) above the exported plot and return the new PNG. */\nasync function pngWithHeader(\n dataUrl: string,\n header: ChartExportHeader,\n look: { background: string; color: string; mutedColor: string; fontFamily: string },\n pixelRatio: number,\n): Promise<string> {\n const image = await loadImage(dataUrl)\n const width = image.width / pixelRatio\n const plotHeight = image.height / pixelRatio\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return dataUrl\n const font = (kind: \"title\" | \"summary\") => `${kind === \"title\" ? 500 : 400} ${HEADER_FONT_SIZE}px ${look.fontFamily}`\n ctx.font = font(\"title\")\n const layout = chartExportHeaderLayout(header, width, (text, kind) => {\n ctx.font = font(kind)\n return ctx.measureText(text).width\n })\n if (layout.height === 0) return dataUrl\n canvas.width = Math.round(image.width)\n canvas.height = Math.round((layout.height + plotHeight) * pixelRatio)\n ctx.scale(pixelRatio, pixelRatio)\n ctx.fillStyle = look.background\n ctx.fillRect(0, 0, width, layout.height + plotHeight)\n ctx.textBaseline = \"middle\"\n let y = HEADER_PAD_TOP\n let previous: \"title\" | \"summary\" | null = null\n for (const line of layout.lines) {\n if (previous === \"title\" && line.kind === \"summary\") y += HEADER_GAP\n ctx.font = font(line.kind)\n ctx.fillStyle = line.kind === \"title\" ? look.color : look.mutedColor\n ctx.fillText(line.text, HEADER_PAD_X, y + HEADER_LINE_HEIGHT / 2)\n y += HEADER_LINE_HEIGHT\n previous = line.kind\n }\n ctx.drawImage(image, 0, layout.height, width, plotHeight)\n return canvas.toDataURL(\"image/png\")\n}\n\n/**\n * Canvas-safe versions of theme colours, kept current across light/dark.\n * Takes `\"chart-1\"`〜`\"chart-5\"`, `\"var(--token)\"` or any CSS colour; one that\n * can't be resolved comes back as `\"\"` (ECharts then uses the palette).\n * Use it whenever a colour goes into a raw `EChart` option by hand.\n *\n * @example\n * const [line, band] = useResolvedChartColors([\"chart-1\", \"var(--muted-foreground)\"])\n */\nexport function useResolvedChartColors(colors: readonly string[]): string[] {\n const tokens = useChartTokens()\n const key = colors.join(\"\\u0000\")\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `key` stands for the array's contents\n return useMemo(() => resolveChartColors(colors, tokens), [key, tokens])\n}\n\ntype EChartsEventHandler = (params: unknown) => void\n\n/**\n * ECharts component main types. Listed in `replaceMerge`, a type keeps only the\n * components whose `id` matches (merged, so they can transition) and drops the\n * rest — including every one of them when the new option no longer has the type.\n */\nconst COMPONENT_MAIN_TYPES = new Set([\n \"title\", \"legend\", \"grid\", \"xAxis\", \"yAxis\", \"polar\", \"radiusAxis\", \"angleAxis\", \"radar\",\n \"dataZoom\", \"visualMap\", \"tooltip\", \"axisPointer\", \"toolbox\", \"brush\", \"geo\", \"parallel\",\n \"parallelAxis\", \"singleAxis\", \"graphic\", \"calendar\", \"dataset\", \"series\", \"matrix\", \"thumbnail\",\n])\n\nexport interface EChartSetOptionOpts {\n notMerge: boolean\n replaceMerge?: string[]\n lazyUpdate: boolean\n}\n\n/**\n * How to apply `next` after `prev`: the first option and timeline / media\n * options replace everything; otherwise merge, replacing every component type\n * either option uses so nothing stale survives.\n */\nexport function echartSetOptionOpts(prev: EChartsOption | null, next: EChartsOption): EChartSetOptionOpts {\n const special = (o: EChartsOption) => \"timeline\" in o || \"baseOption\" in o || \"options\" in o || \"media\" in o\n if (!prev || special(prev) || special(next)) return { notMerge: true, lazyUpdate: true }\n const types = new Set<string>()\n for (const key of [...Object.keys(prev), ...Object.keys(next)]) if (COMPONENT_MAIN_TYPES.has(key)) types.add(key)\n return { notMerge: false, replaceMerge: [...types], lazyUpdate: true }\n}\n\n/**\n * Component types that get a generated `id` when the option has none, so replaceMerge can match them across updates.\n * Not `dataset` / `graphic` / `tooltip`: they are rebuilt on every update (there is nothing to transition).\n */\nconst ID_TYPES = [\n \"title\", \"legend\", \"grid\", \"xAxis\", \"yAxis\", \"polar\", \"radiusAxis\", \"angleAxis\", \"radar\",\n \"dataZoom\", \"visualMap\", \"geo\", \"singleAxis\", \"calendar\",\n] as const\n\n/**\n * What `withStableIds` remembers between updates: per generated id, the shape last applied and how many\n * times it changed (the id's `~v<n>` suffix); per component type, the order of its ids.\n */\nexport interface StableIdState {\n ids: Map<string, { shape: string; version: number }>\n order: Map<string, string[]>\n}\nexport const createStableIdState = (): StableIdState => ({ ids: new Map(), order: new Map() })\n\n/**\n * Shape of a component: which keys it has, recursively (arrays only as \"array\", values not at all —\n * except `type`). A merge keeps keys the new option dropped, so a changed shape must not be merged.\n */\nfunction shapeOf(v: unknown): string {\n if (Array.isArray(v)) return \"[]\"\n if (!v || typeof v !== \"object\" || Object.getPrototypeOf(v) !== Object.prototype) return \".\"\n const o = v as Record<string, unknown>\n return `{${Object.keys(o)\n .filter((k) => o[k] !== undefined)\n .sort()\n .map((k) => (k === \"type\" || k === \"id\" ? `${k}=${String(o[k])}` : `${k}:${shapeOf(o[k])}`))\n .join(\",\")}}`\n}\n\n/**\n * Gives every series (and the common components) an `id` it does not have yet —\n * series: `series:<name ?? index>`, others `<type>:<index>` — so an update that\n * only changes values is matched to the existing component and transitions\n * instead of being rebuilt. If the component's shape changed since `state` last\n * saw it (a key was removed or added, the type changed), the id gets a new\n * `~v<n>` suffix so replaceMerge builds it from scratch: the result then always\n * equals applying the option with `notMerge`. Explicit ids are kept; the input is not mutated.\n */\nexport function withStableIds(option: EChartsOption, state: StableIdState = createStableIdState()): EChartsOption {\n const out: Record<string, unknown> = { ...(option as Record<string, unknown>) }\n const taken = new Set<string>()\n const list = (v: unknown): Record<string, unknown>[] | null =>\n Array.isArray(v) ? (v as Record<string, unknown>[]) : v && typeof v === \"object\" ? [v as Record<string, unknown>] : null\n const give = (key: string, pick: (c: Record<string, unknown>, i: number) => string) => {\n const items = list(out[key])\n if (!items) return\n const used = new Set<string>(items.flatMap((c) => (c && c.id != null ? [String(c.id)] : [])))\n const bases = items.map((c, i) => {\n if (!c || typeof c !== \"object\" || c.id != null) return null\n let base = pick(c, i)\n for (let n = 2; used.has(base) || taken.has(`${key}\\u0000${base}`); n++) base = `${pick(c, i)}#${n}`\n used.add(base)\n taken.add(`${key}\\u0000${base}`)\n return base\n })\n // A merge fills the empty slots a removal left and keeps the slot order of what exists, so after any\n // change in which components there are (or their order) it would not match a fresh render: rebuild them all.\n const prevOrder = state.order.get(key) ?? []\n const cur = bases.filter((b): b is string => b !== null)\n const inOrder = cur.length === prevOrder.length && cur.every((b, i) => b === prevOrder[i])\n state.order.set(key, cur)\n out[key] = items.map((c, i) => {\n const base = bases[i]\n if (base == null) return c\n const shape = shapeOf(c)\n const prev = state.ids.get(base)\n const version = !prev ? 0 : prev.shape === shape && inOrder ? prev.version : prev.version + 1\n state.ids.set(base, { shape, version })\n return { ...c, id: version ? `${base}~v${version}` : base }\n })\n }\n give(\"series\", (c, i) => `series:${typeof c.name === \"string\" && c.name ? c.name : i}`)\n for (const key of ID_TYPES) give(key, (_c, i) => `${key}:${i}`)\n return out as EChartsOption\n}\n\n/** Copy of the plain objects / arrays of an option (functions, class instances, Dates stay shared), to compare against later in-place edits. */\nexport function snapshotOption<T>(v: T): T {\n if (Array.isArray(v)) return v.map(snapshotOption) as T\n if (v && typeof v === \"object\") {\n const proto = Object.getPrototypeOf(v)\n if (proto === Object.prototype || proto === null) {\n return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, snapshotOption(x)])) as T\n }\n }\n return v\n}\n\n/** Structural equality for option trees; functions and other non-plain objects compare by reference. */\nexport function optionEquals(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true\n if (typeof a !== \"object\" || typeof b !== \"object\" || !a || !b) return false\n if (Array.isArray(a) !== Array.isArray(b)) return false\n if (Array.isArray(a)) {\n const bb = b as unknown[]\n return a.length === bb.length && a.every((v, i) => optionEquals(v, bb[i]))\n }\n if (a instanceof Date || b instanceof Date) return a instanceof Date && b instanceof Date && a.getTime() === b.getTime()\n const pa = Object.getPrototypeOf(a)\n if ((pa !== Object.prototype && pa !== null) || Object.getPrototypeOf(b) !== pa) return false\n const ka = Object.keys(a)\n const kb = Object.keys(b)\n return ka.length === kb.length && ka.every((k) => Object.hasOwn(b, k) && optionEquals((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]))\n}\n\n/** `graphic` text doesn't inherit the global `textStyle`, so give it the inherited font unless it sets its own. */\nfunction withGraphicFont(option: EChartsOption, fontFamily: string | undefined): EChartsOption {\n const graphic = (option as { graphic?: unknown }).graphic\n if (!fontFamily || !Array.isArray(graphic)) return option\n return {\n ...option,\n graphic: graphic.map((g: { type?: string; style?: Record<string, unknown> }) =>\n g && g.type === \"text\" && g.style && !g.style.fontFamily ? { ...g, style: { ...g.style, fontFamily } } : g,\n ),\n } as EChartsOption\n}\n\n/** `option` as applied: reduced motion forces `animation: false`; otherwise animation stays explicit so it can flip back. */\nexport function withMotionPreference(option: EChartsOption, reducedMotion: boolean): EChartsOption {\n return { ...option, animation: reducedMotion ? false : (option.animation ?? true) }\n}\n\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\"\n\n/** `prefers-reduced-motion: reduce`, kept current. `false` on the server. */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(\n () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(REDUCED_MOTION_QUERY).matches,\n )\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return\n const media = window.matchMedia(REDUCED_MOTION_QUERY)\n const sync = () => setReduced(media.matches)\n sync()\n media.addEventListener(\"change\", sync)\n return () => media.removeEventListener(\"change\", sync)\n }, [])\n return reduced\n}\n\nexport const EChart = forwardRef<HTMLDivElement, EChartProps>(function EChart(\n {\n option,\n height,\n loading = false,\n theme,\n onEvents,\n ariaLabel,\n className,\n actions = false,\n fileName = \"chart.png\",\n exportHeader,\n },\n ref,\n) {\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [instance, setInstance] = useState<ECharts | null>(null)\n const [copied, setCopied] = useState(false)\n const tokens = useChartTokens(containerRef)\n const reducedMotion = usePrefersReducedMotion()\n // What the current instance last received, to pick the merge mode of the next update.\n const appliedRef = useRef<EChartsOption | null>(null)\n // The option (before ids) as it was when applied, deep-copied; and the shape history behind the generated ids.\n const snapshotRef = useRef<EChartsOption | null>(null)\n const idStateRef = useRef<StableIdState>(createStableIdState())\n\n const autoTheme = useMemo(() => (tokens ? buildChartTheme(tokens) : undefined), [tokens])\n const resolvedTheme = theme ?? autoTheme\n\n // init / re-init: ECharts はテーマの差し替えに対応しないので、テーマが変わったら\n // インスタンスを破棄して作り直す(トークンが実際に変わったときだけここに来る)\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n const inst = init(container, resolvedTheme, { renderer: \"canvas\" })\n appliedRef.current = null\n snapshotRef.current = null\n // `data-rendering` stays on until the (animated) paint is done, so anything\n // capturing the page — printing a document — can wait for real pixels.\n container.dataset.rendering = \"\"\n inst.on(\"finished\", () => {\n delete container.dataset.rendering\n })\n setInstance(inst)\n\n // At most one resize per frame (the sidebar animates the width).\n let frame = 0\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (!inst.isDisposed()) inst.resize()\n })\n })\n observer.observe(container)\n\n return () => {\n observer.disconnect()\n cancelAnimationFrame(frame)\n inst.dispose()\n }\n }, [resolvedTheme])\n\n useEffect(() => {\n if (!instance || instance.isDisposed()) return\n const prepared = withGraphicFont(\n withMotionPreference(option, reducedMotion),\n theme === undefined ? tokens?.fontFamily : undefined,\n )\n // Same content as last time (a re-render that built an equal option): nothing to redraw.\n // Compared with a snapshot, so an in-place edit of a nested array of the caller's option still counts as a change.\n if (snapshotRef.current && optionEquals(snapshotRef.current, prepared)) return\n if (containerRef.current) containerRef.current.dataset.rendering = \"\"\n const next = withStableIds(prepared, idStateRef.current)\n instance.setOption(next, echartSetOptionOpts(appliedRef.current, next))\n appliedRef.current = next\n snapshotRef.current = snapshotOption(prepared)\n }, [instance, option, reducedMotion, theme, tokens?.fontFamily])\n\n useEffect(() => {\n if (!instance || instance.isDisposed()) return\n if (loading) instance.showLoading()\n else instance.hideLoading()\n }, [instance, loading])\n\n useEffect(() => {\n if (!instance || instance.isDisposed() || !onEvents) return\n const entries = Object.entries(onEvents)\n for (const [event, handler] of entries) {\n instance.on(event, handler as EChartsEventHandler)\n }\n return () => {\n if (instance.isDisposed()) return\n for (const [event, handler] of entries) {\n instance.off(event, handler as EChartsEventHandler)\n }\n }\n }, [instance, onEvents])\n\n const includeTitle = typeof actions === \"object\" ? (actions.includeTitle ?? true) : true\n const getPngDataUrl = useCallback(async (): Promise<string | null> => {\n if (!instance) return null\n // Export over the nearest opaque background (card, then page) so the PNG\n // matches what is on screen in dark too. Computed styles resolve to rgb(a),\n // so this stays canvas-safe whatever the token.\n let backgroundColor = \"#ffffff\"\n for (let el: HTMLElement | null = containerRef.current; el; el = el.parentElement) {\n const bg = getComputedStyle(el).backgroundColor\n if (bg && bg !== \"rgba(0, 0, 0, 0)\" && bg !== \"transparent\") {\n backgroundColor = bg\n break\n }\n }\n const pixelRatio = 2\n const dataUrl = instance.getDataURL({ type: \"png\", pixelRatio, backgroundColor })\n if (!includeTitle || !exportHeader || !(exportHeader.title || exportHeader.summary) || !containerRef.current) return dataUrl\n try {\n const style = getComputedStyle(containerRef.current)\n return await pngWithHeader(\n dataUrl,\n exportHeader,\n { background: backgroundColor, color: style.color, mutedColor: tokens?.mutedForeground ?? style.color, fontFamily: style.fontFamily },\n pixelRatio,\n )\n } catch {\n return dataUrl\n }\n }, [instance, includeTitle, exportHeader, tokens])\n\n const handleCopy = useCallback(async () => {\n const dataUrl = await getPngDataUrl()\n if (!dataUrl) return\n try {\n const blob = await (await fetch(dataUrl)).blob()\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": blob })])\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // ClipboardItem 未対応ブラウザでは silent fail\n }\n }, [getPngDataUrl])\n\n const handleDownload = useCallback(async () => {\n const dataUrl = await getPngDataUrl()\n if (!dataUrl) return\n const link = document.createElement(\"a\")\n link.href = dataUrl\n link.download = fileName\n link.click()\n }, [getPngDataUrl, fileName])\n\n // 高さの解決: height prop を渡した場合はインライン style が勝つ。未指定なら\n // h-[400px] をデフォルトで当て、className の高さクラスに後勝ちさせる。\n const inFrame = useContext(ChartFrameContext)\n const styleHeight =\n height == null ? undefined : typeof height === \"number\" ? `${height}px` : height\n\n return (\n <div\n ref={ref}\n data-slot=\"echart\"\n className={cn(\"group relative w-full\", height == null && \"h-[400px]\", className)}\n style={styleHeight != null ? { height: styleHeight } : undefined}\n >\n {/* `role=\"img\"` wraps the canvas only, so the action buttons stay reachable. Inside a ChartFrame the plot area is the one image. */}\n <div\n ref={containerRef}\n data-slot=\"echart-canvas\"\n className=\"h-full w-full\"\n role={inFrame ? undefined : \"img\"}\n aria-label={inFrame ? undefined : (ariaLabel ?? \"チャート\")}\n />\n {actions && (\n <div\n data-slot=\"echart-actions\"\n className=\"absolute top-2 right-2 z-10 flex gap-1 pointer-events-none opacity-0 transition-opacity group-hover:pointer-events-auto group-hover:opacity-100 focus-within:pointer-events-auto focus-within:opacity-100 [@media(hover:none)]:pointer-events-auto [@media(hover:none)]:opacity-100\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleCopy}\n aria-label={copied ? \"コピーしました\" : \"PNG をクリップボードにコピー\"}\n >\n {copied ? <Check className=\"size-4\" /> : <Copy className=\"size-4\" />}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleDownload}\n aria-label=\"PNG をダウンロード\"\n >\n <Download className=\"size-4\" />\n </Button>\n </div>\n )}\n </div>\n )\n})\nEChart.displayName = \"EChart\"\n\nexport type { EChartsOption } from \"echarts\"\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cn } from './chunk-
|
|
1
|
+
import { cn } from './chunk-U736PVHY.js';
|
|
2
2
|
import { Button as Button$1 } from '@base-ui/react/button';
|
|
3
3
|
import { cva } from 'class-variance-authority';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -50,5 +50,5 @@ function Button({
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export { Button, buttonVariants };
|
|
53
|
-
//# sourceMappingURL=chunk-
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
53
|
+
//# sourceMappingURL=chunk-PDOBHMUQ.js.map
|
|
54
|
+
//# sourceMappingURL=chunk-PDOBHMUQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../squadkit/registry/ui/button.tsx"],"names":["ButtonPrimitive"],"mappings":";;;;;;AAOA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,4lBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,wDAAA;AAAA,QACT,OAAA,EACE,iLAAA;AAAA,QACF,SAAA,EACE,gLAAA;AAAA,QACF,KAAA,EACE,kHAAA;AAAA,QACF,WAAA,EACE,6NAAA;AAAA,QACF,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EACE,sFAAA;AAAA,QACF,EAAA,EAAI,+MAAA;AAAA,QACJ,EAAA,EAAI,yNAAA;AAAA,QACJ,EAAA,EAAI,sFAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EACE,yHAAA;AAAA,QACF,SAAA,EACE,oFAAA;AAAA,QACF,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAEA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAgE;AAC9D,EAAA,uBACE,GAAA;AAAA,IAACA,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,MACzD,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-PDOBHMUQ.js","sourcesContent":["\"use client\"\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { detectApiMethods
|
|
2
|
-
import { isHomePagePath, isPlaceholderHomePage } from './chunk-
|
|
1
|
+
import { detectApiMethods } from './chunk-UWSQUHX6.js';
|
|
2
|
+
import { isHomePagePath, isPlaceholderHomePage, readLayoutLang, isValidLang, DEFAULT_APP_LANG, maskSource, stripComments } from './chunk-S5MDTHH7.js';
|
|
3
3
|
import { timed } from './chunk-RNTDBX6S.js';
|
|
4
4
|
import { PUBLIC_ENV_PREFIX, FORBIDDEN_FILES, ROUTED_EXTENSIONS, SRC_DIR, SUSPICIOUS_ROUTE_DIRS, FILE_PAGE_EXTENSIONS, FILE_PAGE_MAX_BYTES, API_METHODS } from './chunk-C2CX6GLX.js';
|
|
5
5
|
import fs from 'fs';
|
|
@@ -275,6 +275,22 @@ function checkPageExports(ctx) {
|
|
|
275
275
|
}
|
|
276
276
|
return diags;
|
|
277
277
|
}
|
|
278
|
+
function checkAppLang(ctx) {
|
|
279
|
+
const { root, model } = ctx;
|
|
280
|
+
const layout = model.layouts.find((l) => l.dir === "");
|
|
281
|
+
if (!layout) return [];
|
|
282
|
+
const lang = readLayoutLang(layout.absFile);
|
|
283
|
+
if (lang === void 0 || isValidLang(lang)) return [];
|
|
284
|
+
return [
|
|
285
|
+
{
|
|
286
|
+
code: "INVALID_APP_LANG",
|
|
287
|
+
severity: "warning",
|
|
288
|
+
message: `Root layout exports lang ${JSON.stringify(lang)}, which is not a valid language tag; <html lang> falls back to "${DEFAULT_APP_LANG}".`,
|
|
289
|
+
files: [rel(root, layout.absFile)],
|
|
290
|
+
fix: 'Use a BCP 47 tag as a string literal, e.g. `export const lang = "ja"`.'
|
|
291
|
+
}
|
|
292
|
+
];
|
|
293
|
+
}
|
|
278
294
|
function checkApiExports(ctx) {
|
|
279
295
|
const diags = [];
|
|
280
296
|
for (const api of ctx.model.apis) {
|
|
@@ -481,7 +497,7 @@ function checkHardcodedColors(ctx) {
|
|
|
481
497
|
message: `${file} hard-codes ${hits.length} color(s):
|
|
482
498
|
${lines.join("\n ")}`,
|
|
483
499
|
files: [...new Set(shown.map((h) => `${file}:${h.line}`))].concat(more > 0 ? [`+${more} more`] : []),
|
|
484
|
-
fix: "Use theme tokens instead (bg-primary, text-muted-foreground, var(--chart-N), \u2026 as defined in styles.css and
|
|
500
|
+
fix: "Use theme tokens instead (bg-primary, text-muted-foreground, var(--chart-N), \u2026 as defined in styles.css; see the \u300C\u898B\u305F\u76EE\u306E\u898F\u7D04\u300D section of AGENTS.md, and to change colors switch the theme or override styles.css). If a color carries data meaning (e.g. map fills), put `// vantage-ignore-color` (`{/* vantage-ignore-color */}` inside JSX) on that line or the line above; `vantage-ignore-color-file` within the first 5 lines exempts the whole file."
|
|
485
501
|
});
|
|
486
502
|
}
|
|
487
503
|
return diags;
|
|
@@ -499,7 +515,7 @@ function checkDesignDoc(ctx) {
|
|
|
499
515
|
severity: "warning",
|
|
500
516
|
message: `DESIGN.md is ${lines} lines long (aim for ${DESIGN_MD_MAX_LINES} or fewer).`,
|
|
501
517
|
files: ["DESIGN.md"],
|
|
502
|
-
fix: "Keep
|
|
518
|
+
fix: "Keep DESIGN.md to your own intent (density, slide headings, brand material). Colors, fonts and radii belong to the theme / styles.css, and the usage rules to the \u300C\u898B\u305F\u76EE\u306E\u898F\u7D04\u300D section of AGENTS.md \u2014 do not copy values into DESIGN.md."
|
|
503
519
|
}
|
|
504
520
|
];
|
|
505
521
|
}
|
|
@@ -516,6 +532,7 @@ function runDiagnostics(root, model) {
|
|
|
516
532
|
...checkFilePageSize(ctx),
|
|
517
533
|
...checkPageExports(ctx),
|
|
518
534
|
...checkApiExports(ctx),
|
|
535
|
+
...checkAppLang(ctx),
|
|
519
536
|
...client.boundary,
|
|
520
537
|
...client.env,
|
|
521
538
|
...checkHardcodedColors(ctx),
|
|
@@ -525,5 +542,5 @@ function runDiagnostics(root, model) {
|
|
|
525
542
|
}
|
|
526
543
|
|
|
527
544
|
export { runDiagnostics };
|
|
528
|
-
//# sourceMappingURL=chunk-
|
|
529
|
-
//# sourceMappingURL=chunk-
|
|
545
|
+
//# sourceMappingURL=chunk-PJ4SPXHS.js.map
|
|
546
|
+
//# sourceMappingURL=chunk-PJ4SPXHS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/diagnostics.ts"],"names":[],"mappings":"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","file":"chunk-PJ4SPXHS.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport {\n API_METHODS,\n FILE_PAGE_EXTENSIONS,\n FILE_PAGE_MAX_BYTES,\n FORBIDDEN_FILES,\n PUBLIC_ENV_PREFIX,\n ROUTED_EXTENSIONS,\n SRC_DIR,\n SUSPICIOUS_ROUTE_DIRS,\n} from \"./constants\"\nimport { isHomePagePath, isPlaceholderHomePage } from \"./placeholder\"\nimport { timed } from \"./profile\"\nimport { detectApiMethods } from \"./route-spec\"\nimport { DEFAULT_APP_LANG, isValidLang, readLayoutLang } from \"./route-tree\"\nimport { maskSource, stripComments } from \"./source\"\nimport type { Diagnostic, RouteModel } from \"./types\"\n\n/** Vite/env identifiers that are always allowed on `import.meta.env`. */\nconst ALLOWED_ENV_KEYS = new Set([\"MODE\", \"DEV\", \"PROD\", \"SSR\", \"BASE_URL\", \"PUBLIC_\"])\n\n/** Whether a module has a default export (direct, aliased, or re-exported). */\nfunction hasDefaultExport(src: string): boolean {\n return (\n /\\bexport\\s+default\\b/.test(src) ||\n /\\bexport\\s*\\{[^}]*\\bas\\s+default\\b[^}]*\\}/.test(src) ||\n /\\bexport\\s*\\{[^}]*\\bdefault\\b[^}]*\\}\\s*from\\b/.test(src)\n )\n}\n\n/** Collect client-side source files (everything outside server/ and generated dirs). */\nfunction collectClientFiles(root: string): string[] {\n const out: string[] = []\n const skipDirs = new Set([\"node_modules\", \".vantage\", \"dist\", \"server\", \"public\"])\n const walk = (dir: string) => {\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true })\n } catch {\n return\n }\n for (const entry of entries) {\n if (entry.name.startsWith(\".\")) continue\n const abs = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n if (skipDirs.has(entry.name)) continue\n walk(abs)\n } else if (/\\.(tsx?|jsx?)$/.test(entry.name)) {\n out.push(abs)\n }\n }\n }\n walk(root)\n return out\n}\n\n/**\n * Per-run scratch space. Every checker reads the filesystem through this, so a\n * `check` walks the project once and reads (and `stripComments`) each source\n * file at most once — page modules used to be read three times over, and the\n * client tree used to be walked twice.\n */\ninterface Ctx {\n root: string\n model: RouteModel\n /** Raw file text for an absolute path; null when unreadable. */\n raw(abs: string): string | null\n /** Comment-stripped source for an absolute path; null when unreadable. */\n source(abs: string): string | null\n /**\n * Byte size of a file; null when unreadable. Separate from `source` because\n * `source` decodes as UTF-8 and strips comments — fine for a page module,\n * ruinous for a few MB of spreadsheet.\n */\n size(abs: string): number | null\n /** Client-side source files, walked lazily and only once. */\n clientFiles(): string[]\n /** `readdir` of the project root, read lazily and only once. */\n rootEntries(): string[]\n}\n\nfunction createCtx(root: string, model: RouteModel): Ctx {\n const raws = new Map<string, string | null>()\n const sources = new Map<string, string | null>()\n const sizes = new Map<string, number | null>()\n let clientFiles: string[] | null = null\n let rootEntries: string[] | null = null\n\n const raw = (abs: string): string | null => {\n const hit = raws.get(abs)\n if (hit !== undefined) return hit\n let text: string | null\n try {\n text = fs.readFileSync(abs, \"utf8\")\n } catch {\n text = null\n }\n raws.set(abs, text)\n return text\n }\n\n return {\n root,\n model,\n raw,\n source(abs) {\n const hit = sources.get(abs)\n if (hit !== undefined) return hit\n const text = raw(abs)\n const src = text === null ? null : stripComments(text)\n sources.set(abs, src)\n return src\n },\n size(abs) {\n const hit = sizes.get(abs)\n if (hit !== undefined) return hit\n let bytes: number | null\n try {\n bytes = fs.statSync(abs).size\n } catch {\n bytes = null\n }\n sizes.set(abs, bytes)\n return bytes\n },\n clientFiles() {\n return (clientFiles ??= collectClientFiles(root))\n },\n rootEntries() {\n if (rootEntries) return rootEntries\n try {\n rootEntries = fs.readdirSync(root)\n } catch {\n rootEntries = []\n }\n return rootEntries\n },\n }\n}\n\nfunction rel(root: string, abs: string): string {\n return path.relative(root, abs).split(path.sep).join(\"/\")\n}\n\n/** Detect forbidden config files at the project root. */\nfunction checkForbiddenFiles(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const name of ctx.rootEntries()) {\n for (const rule of FORBIDDEN_FILES) {\n if (rule.pattern.test(name)) {\n diags.push({\n code: \"FORBIDDEN_FILE\",\n severity: \"error\",\n message: `${rule.label} file \"${name}\" is not allowed in a Vantage project.`,\n files: [name],\n fix: rule.remedy,\n })\n }\n }\n }\n return diags\n}\n\n/**\n * Detect a project split between `src/` and the project root. Once `src/`\n * exists it is the only page-scan root, so anything left behind at the root is\n * silently dead — and `server/` moved *into* `src/` is silently unserved.\n */\nfunction checkSrcLayout(ctx: Ctx): Diagnostic[] {\n const { root, model } = ctx\n if (model.pageDir === \"\") return []\n const diags: Diagnostic[] = []\n\n const entries = ctx.rootEntries()\n // Lowercased before matching, as scan does: `Sales.CSV` at the root is a\n // stray page too, and saying so is the whole point of this check.\n const strayPages = entries.filter((name) =>\n ROUTED_EXTENSIONS.some((ext) => name.toLowerCase().endsWith(ext)),\n )\n if (strayPages.length > 0) {\n diags.push({\n code: \"SRC_DIR_SPLIT\",\n severity: \"error\",\n message: `${strayPages.length} page module(s) sit at the project root, but ${SRC_DIR}/ exists so pages are only scanned from ${SRC_DIR}/.`,\n files: strayPages.sort(),\n fix: `Move them into ${SRC_DIR}/, or delete ${SRC_DIR}/ to keep a root-level layout.`,\n })\n }\n\n if (entries.includes(\"styles.css\")) {\n diags.push({\n code: \"SRC_DIR_SPLIT\",\n severity: \"error\",\n message: `styles.css sits at the project root, but ${SRC_DIR}/ exists so the global stylesheet is read from ${SRC_DIR}/styles.css.`,\n files: [\"styles.css\"],\n fix: `Move it to ${SRC_DIR}/styles.css.`,\n })\n }\n\n if (fs.existsSync(path.join(root, SRC_DIR, \"server\"))) {\n diags.push({\n code: \"SRC_DIR_SPLIT\",\n severity: \"error\",\n message: `${SRC_DIR}/server/ is never scanned: server code lives at the project root, outside the client source tree.`,\n files: [`${SRC_DIR}/server`],\n fix: `Move it to server/ at the project root.`,\n })\n }\n\n return diags\n}\n\n/** Flag routes generated from directories that are almost certainly scaffolding. */\nfunction checkSuspiciousRouteDirs(model: RouteModel): Diagnostic[] {\n const byDir = new Map<string, { files: string[]; routes: string[] }>()\n for (const page of model.pages) {\n const top = page.dir.split(\"/\")[0] ?? \"\"\n if (top === \"\" || !SUSPICIOUS_ROUTE_DIRS.has(top)) continue\n const hit = byDir.get(top) ?? { files: [], routes: [] }\n hit.files.push(page.file)\n hit.routes.push(page.routePath)\n byDir.set(top, hit)\n }\n\n const diags: Diagnostic[] = []\n for (const [dir, hit] of byDir) {\n diags.push({\n code: \"SUSPICIOUS_ROUTE_DIR\",\n severity: \"warning\",\n message: `${dir}/ is part of the URL: ${hit.routes.slice(0, 3).join(\", \")}${\n hit.routes.length > 3 ? \", …\" : \"\"\n }`,\n files: hit.files,\n fix: `Directory names become route segments. Non-page modules belong in components/, hooks/ or lib/ (never scanned); if ${dir}/ really is meant to be a URL segment, ignore this warning.`,\n })\n }\n return diags\n}\n\n/** Detect two page files resolving to the same route path. */\nfunction checkRouteConflicts(ctx: Ctx): Diagnostic[] {\n const byPath = new Map<string, string[]>()\n for (const page of ctx.model.pages) {\n const list = byPath.get(page.routePath) ?? []\n list.push(page.file)\n byPath.set(page.routePath, list)\n }\n const diags: Diagnostic[] = []\n for (const [routePath, files] of byPath) {\n if (files.length <= 1) continue\n\n // Special case: if route is \"/\" and one of the files is the untouched\n // template placeholder home page, exclude it from the conflict.\n // This allows new artifacts (e.g. index.slide.tsx) to claim \"/\" when\n // the placeholder has not been edited.\n if (routePath === \"/\") {\n const nonPlaceholders = files.filter((file) => {\n if (!isHomePagePath(file)) return true\n const abs = path.join(ctx.root, file)\n const content = ctx.raw(abs)\n return content === null || !isPlaceholderHomePage(content)\n })\n\n // If only one non-placeholder file remains, no conflict.\n if (nonPlaceholders.length <= 1) continue\n\n // If multiple non-placeholder files, report conflict with only those.\n if (nonPlaceholders.length < files.length) {\n diags.push({\n code: \"ROUTE_CONFLICT\",\n severity: \"error\",\n message: `${nonPlaceholders.length} files resolve to ${routePath}`,\n files: nonPlaceholders,\n fix: \"Rename or remove one route file so each route is unique. A page-kind suffix and a data-file extension both drop out of the URL, so `june.slide.tsx`, `june.csv` and `june.tsx` all resolve to /june.\",\n })\n continue\n }\n }\n\n diags.push({\n code: \"ROUTE_CONFLICT\",\n severity: \"error\",\n message: `${files.length} files resolve to ${routePath}`,\n files,\n fix: \"Rename or remove one route file so each route is unique. A page-kind suffix and a data-file extension both drop out of the URL, so `june.slide.tsx`, `june.csv` and `june.tsx` all resolve to /june.\",\n })\n }\n return diags\n}\n\n/**\n * Speak up about files the scan walked past. Neither case reaches the router,\n * so nothing else in the toolchain has an opportunity to mention them: the\n * page simply never appears in `routes`, in the nav, or at a URL. Without this\n * the only symptom is absence.\n */\nfunction checkUnroutedFiles(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const entry of ctx.model.unrouted) {\n if (entry.reason === \"extension\") {\n diags.push({\n code: \"UNSUPPORTED_PAGE_FILE\",\n severity: \"warning\",\n message: `\"${entry.file}\" is not a page: Vantage has no viewer for \"${path.posix.extname(\n entry.file,\n )}\".`,\n files: [entry.file],\n fix: `Only ${FILE_PAGE_EXTENSIONS.join(\" and \")} files become pages. Convert it, or render it from a .tsx page with <TableViewer> from @squadbase/vantage/table.`,\n })\n continue\n }\n diags.push({\n code: \"INVALID_PAGE_VARIANT\",\n severity: \"error\",\n message: `\"${entry.file}\" carries the \"${entry.variant}\" page kind but is not a page module, so it is not routed.`,\n files: [entry.file],\n fix: `A page kind only applies to a page module that becomes a route: name it <name>.${entry.variant}.tsx. Layouts, _404/_error and underscore-prefixed modules cannot carry one.`,\n })\n }\n return diags\n}\n\n/**\n * Data-file pages are parsed in the browser, so an oversized file does not\n * fail the build — it renders an error on its own page. A warning, not an\n * error, keeps one large export from blocking a deploy of everything else.\n */\nfunction checkFilePageSize(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const page of ctx.model.pages) {\n if (page.kind !== \"file\") continue\n const size = ctx.size(page.absFile)\n if (size === null || size <= FILE_PAGE_MAX_BYTES) continue\n diags.push({\n code: \"FILE_PAGE_TOO_LARGE\",\n severity: \"warning\",\n message: `${page.file} is ${(size / 1024 / 1024).toFixed(1)} MB, so ${page.routePath} will show an error instead of a table.`,\n files: [page.file],\n fix: `Data-file pages are parsed in the browser and capped at ${\n FILE_PAGE_MAX_BYTES / 1024 / 1024\n } MB. Serve larger data from server/api/ and render it with DataTable.`,\n })\n }\n return diags\n}\n\n/** Ensure every page module has a default export. */\nfunction checkPageExports(ctx: Ctx): Diagnostic[] {\n const { root, model } = ctx\n const diags: Diagnostic[] = []\n const pageFiles = [\n // Data-file pages have no default export to look for — their component is\n // the generated wrapper, not the `.csv` itself.\n ...model.pages.filter((p) => p.kind === \"module\").map((p) => p.absFile),\n ...model.layouts.map((l) => l.absFile),\n model.notFound && path.join(root, model.notFound),\n model.error && path.join(root, model.error),\n ].filter((x): x is string => Boolean(x))\n\n for (const abs of pageFiles) {\n const src = ctx.source(abs)\n if (src === null) continue\n if (!hasDefaultExport(src)) {\n diags.push({\n code: \"MISSING_DEFAULT_EXPORT\",\n severity: \"error\",\n message: `Page module has no default export.`,\n files: [rel(root, abs)],\n fix: \"A page/layout must `export default` a React component.\",\n })\n }\n }\n return diags\n}\n\n/** Warn when the root layout's `lang` is not a valid language tag (the shell falls back to \"en\"). */\nfunction checkAppLang(ctx: Ctx): Diagnostic[] {\n const { root, model } = ctx\n const layout = model.layouts.find((l) => l.dir === \"\")\n if (!layout) return []\n const lang = readLayoutLang(layout.absFile)\n if (lang === undefined || isValidLang(lang)) return []\n return [\n {\n code: \"INVALID_APP_LANG\",\n severity: \"warning\",\n message: `Root layout exports lang ${JSON.stringify(lang)}, which is not a valid language tag; <html lang> falls back to \"${DEFAULT_APP_LANG}\".`,\n files: [rel(root, layout.absFile)],\n fix: 'Use a BCP 47 tag as a string literal, e.g. `export const lang = \"ja\"`.',\n },\n ]\n}\n\n/** Ensure every API module exports at least one valid HTTP method handler. */\nfunction checkApiExports(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const api of ctx.model.apis) {\n const src = ctx.source(api.absFile)\n if (src === null) continue\n const exported = detectApiMethods(src)\n if (exported.length === 0) {\n // Common mistake: lowercase method names.\n const lower = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\"].filter((m) =>\n new RegExp(`export\\\\s+(async\\\\s+)?function\\\\s+${m}\\\\b`).test(src),\n )\n diags.push({\n code: \"INVALID_API_EXPORT\",\n severity: \"error\",\n message: `API module exports no HTTP method handler${\n lower.length ? ` (found lowercase \"${lower.join(\", \")}\")` : \"\"\n }.`,\n files: [api.file],\n fix: `Export one of: ${API_METHODS.join(\", \")} (uppercase).`,\n })\n }\n }\n return diags\n}\n\n/**\n * The two source-level client checks — the server-import boundary and non-public\n * env reads — in a single pass over the client tree. They used to walk and read\n * the whole tree once each; the diagnostics are still emitted grouped by code so\n * the reported order is unchanged.\n */\nfunction checkClientSources(ctx: Ctx): { boundary: Diagnostic[]; env: Diagnostic[] } {\n const { root } = ctx\n const boundary: Diagnostic[] = []\n const env: Diagnostic[] = []\n const importRe = /(?:import|export)[^'\"]*?from\\s+[\"']([^\"']+)[\"']|import\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g\n const envRe = /import\\.meta\\.env\\.([A-Za-z_][A-Za-z0-9_]*)/g\n\n for (const abs of ctx.clientFiles()) {\n const src = ctx.source(abs)\n if (src === null) continue\n\n let m: RegExpExecArray | null\n importRe.lastIndex = 0\n while ((m = importRe.exec(src))) {\n const spec = m[1] ?? m[2]\n if (!spec) continue\n const isServer =\n spec === \"server\" ||\n spec.startsWith(\"server/\") ||\n /(^|\\/)\\.\\.?\\/server(\\/|$)/.test(spec) ||\n /\\/server\\//.test(spec)\n if (isServer) {\n boundary.push({\n code: \"CLIENT_IMPORTS_SERVER\",\n severity: \"error\",\n message: `Client module imports from server/ (\"${spec}\").`,\n files: [rel(root, abs)],\n fix: \"server/ code must never be imported by the client. Move shared code to lib/.\",\n })\n }\n }\n\n envRe.lastIndex = 0\n const bad = new Set<string>()\n while ((m = envRe.exec(src))) {\n const key = m[1]!\n if (ALLOWED_ENV_KEYS.has(key)) continue\n if (key.startsWith(PUBLIC_ENV_PREFIX)) continue\n bad.add(key)\n }\n for (const key of bad) {\n env.push({\n code: \"PUBLIC_ENV_MISUSE\",\n severity: \"warning\",\n message: `Client reads non-public env \"import.meta.env.${key}\".`,\n files: [rel(root, abs)],\n fix: `Only ${PUBLIC_ENV_PREFIX}* vars reach the client. Read secrets via ApiContext.env in server/.`,\n })\n }\n }\n return { boundary, env }\n}\n\n// ── hard-coded colors ────────────────────────────────────────────────────────\n\n/** Tailwind utilities that take a color. */\nconst COLOR_PREFIXES =\n \"text|bg|border|ring|fill|stroke|from|via|to|outline|decoration|divide|accent|caret|shadow|placeholder\"\nconst PALETTES =\n \"slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose\"\nconst COLOR_FNS = \"rgba?|hsla?|oklch|oklab|lab|lch|color\"\n\n/** `dark:hover:bg-blue-500/50` — variants, prefix, palette, opacity. */\nconst PALETTE_CLASS_RE = new RegExp(\n `(?<![\\\\w-])((?:[\\\\w-]+:)*)(${COLOR_PREFIXES})-(${PALETTES})-(50|[1-9]00|950)(\\\\/(?:\\\\d+|\\\\[[^\\\\]\\\\s]+\\\\]))?(?![\\\\w-])`,\n \"g\",\n)\n/** `bg-[#0f172a]`, `text-[rgb(1,2,3)]`, `shadow-[0_0_4px_rgba(…)]`. */\nconst ARBITRARY_CLASS_RE = new RegExp(\n `(?<![\\\\w-])((?:[\\\\w-]+:)*)(${COLOR_PREFIXES})-\\\\[([^\\\\]\\\\s\"'\\`]+)\\\\]`,\n \"g\",\n)\nconst COLOR_FN_RE = new RegExp(\n `(?<![\\\\w-])(?:${COLOR_FNS})\\\\((?:[^()]|\\\\([^()]*\\\\))*\\\\)`,\n \"g\",\n)\nconst HEX_RE = /(?<![\\w&#/-])#([0-9a-fA-F]{3,8})(?![\\w-])/g\nconst HEX_LITERAL_RE = /(?<![\\w&])#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})(?![\\w-])/\n/** `href=\"#abc\"`, `to=\"#add\"` — an anchor, not a color. */\nconst ANCHOR_BEFORE_RE = /\\b(?:href|to|id|hash)\\s*[=:]\\s*\\{?\\s*[\"'`]$/\n\nconst NEUTRAL_PALETTES = new Set([\"slate\", \"gray\", \"zinc\", \"neutral\", \"stone\"])\nconst DANGER_PALETTES = new Set([\"red\", \"rose\"])\n/** Nearest chart token per hue family — the `--chart-1..5` order in theme.css. */\nconst CHART_BY_PALETTE: Record<string, string> = {\n blue: \"chart-1\",\n indigo: \"chart-1\",\n sky: \"chart-1\",\n cyan: \"chart-1\",\n green: \"chart-2\",\n emerald: \"chart-2\",\n teal: \"chart-2\",\n lime: \"chart-2\",\n orange: \"chart-3\",\n amber: \"chart-3\",\n yellow: \"chart-3\",\n violet: \"chart-4\",\n purple: \"chart-4\",\n fuchsia: \"chart-4\",\n pink: \"chart-5\",\n}\nconst MAX_COLOR_HITS = 20\n\n/** Semantic-token candidates for a Tailwind palette class. */\nfunction suggestPaletteClass(variants: string, prefix: string, palette: string, opacity: string): string[] {\n const t = (token: string) => `${variants}${prefix}-${token}${opacity}`\n if (DANGER_PALETTES.has(palette)) return [t(\"destructive\")]\n if (NEUTRAL_PALETTES.has(palette)) {\n if (prefix === \"text\") return [t(\"foreground\"), t(\"muted-foreground\")]\n if (prefix === \"bg\") return [t(\"muted\"), t(\"card\")]\n if (prefix === \"border\" || prefix === \"divide\" || prefix === \"outline\") return [t(\"border\")]\n if (prefix === \"ring\") return [t(\"ring\")]\n return [t(\"muted-foreground\")]\n }\n const chart = CHART_BY_PALETTE[palette] ?? \"chart-1\"\n return chart === \"chart-1\" ? [t(\"primary\"), t(chart)] : [t(chart), t(\"primary\")]\n}\n\n/** Whether a Tailwind arbitrary value carries a literal color. */\nfunction isColorValue(value: string): boolean {\n if (value.includes(\"var(\")) return false\n return HEX_LITERAL_RE.test(value) || new RegExp(`(?<![\\\\w-])(?:${COLOR_FNS})\\\\(`).test(value)\n}\n\ninterface ColorHit {\n line: number\n text: string\n suggest: string[]\n}\n\n/** Every hard-coded color in one module, with raw-file line numbers. */\nfunction findColorHits(raw: string): ColorHit[] {\n const rawLines = raw.split(\"\\n\")\n if (rawLines.slice(0, 5).some((l) => l.includes(\"vantage-ignore-color-file\"))) return []\n // A marker exempts its own line (trailing comment) and the next (comment above).\n const ignored = new Set<number>()\n rawLines.forEach((l, i) => {\n if (l.includes(\"vantage-ignore-color\")) ignored.add(i + 1).add(i + 2)\n })\n\n const { code, inString } = maskSource(raw)\n const lineStarts = [0]\n for (let i = 0; i < raw.length; i++) if (raw[i] === \"\\n\") lineStarts.push(i + 1)\n const lineAt = (offset: number) => {\n let lo = 0\n let hi = lineStarts.length - 1\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (lineStarts[mid]! <= offset) lo = mid\n else hi = mid - 1\n }\n return lo + 1\n }\n\n const hits: ColorHit[] = []\n const covered: [number, number][] = []\n const isCovered = (at: number) => covered.some(([s, e]) => at >= s && at < e)\n const push = (at: number, end: number, text: string, suggest: string[]) => {\n if (!inString[at] || isCovered(at)) return\n covered.push([at, end])\n const line = lineAt(at)\n if (ignored.has(line)) return\n hits.push({ line, text: text.length > 48 ? `${text.slice(0, 47)}…` : text, suggest })\n }\n\n let m: RegExpExecArray | null\n ARBITRARY_CLASS_RE.lastIndex = 0\n while ((m = ARBITRARY_CLASS_RE.exec(code))) {\n if (!isColorValue(m[3]!)) continue\n const token = (m[2] === \"shadow\" ? \"\" : m[2]!) || \"bg\"\n push(m.index, m.index + m[0].length, m[0], [\n `${m[1]}${token}-primary`,\n `${m[1]}${token}-chart-1`,\n ])\n }\n PALETTE_CLASS_RE.lastIndex = 0\n while ((m = PALETTE_CLASS_RE.exec(code))) {\n push(\n m.index,\n m.index + m[0].length,\n m[0],\n suggestPaletteClass(m[1]!, m[2]!, m[3]!, m[5] ?? \"\"),\n )\n }\n const literalSuggest = [\"var(--primary)\", \"var(--chart-1..5)\", \"var(--muted-foreground)\"]\n COLOR_FN_RE.lastIndex = 0\n while ((m = COLOR_FN_RE.exec(code))) {\n if (m[0].includes(\"var(\")) continue\n push(m.index, m.index + m[0].length, m[0], literalSuggest)\n }\n HEX_RE.lastIndex = 0\n while ((m = HEX_RE.exec(code))) {\n const hex = m[1]!\n if (![3, 4, 6, 8].includes(hex.length)) continue\n const before = code.slice(Math.max(0, m.index - 24), m.index)\n if (ANCHOR_BEFORE_RE.test(before)) continue\n // `\"Order #123\"` is a number, not a color, unless it opens a literal.\n if (hex.length <= 4 && /^\\d+$/.test(hex) && !/[\"'`[]$/.test(before)) continue\n push(m.index, m.index + m[0].length, m[0], literalSuggest)\n }\n return hits.sort((a, b) => a.line - b.line)\n}\n\n/**\n * Colors belong to the theme: `theme.css` / `styles.css` define the tokens and\n * the 「見た目の規約」 section of AGENTS.md says how to use them, so a literal in a component silently opts out of light/\n * dark, `styles.css` overrides and chart presets. Only `.ts`/`.tsx` is scanned —\n * `.css` is where the values are supposed to live. Warning, never error: a map\n * fill or a status color can legitimately carry data meaning.\n */\nfunction checkHardcodedColors(ctx: Ctx): Diagnostic[] {\n const diags: Diagnostic[] = []\n for (const abs of ctx.clientFiles()) {\n if (!/\\.tsx?$/.test(abs) || abs.endsWith(\".d.ts\")) continue\n const raw = ctx.raw(abs)\n if (raw === null) continue\n const hits = findColorHits(raw)\n if (hits.length === 0) continue\n const file = rel(ctx.root, abs)\n const shown = hits.slice(0, MAX_COLOR_HITS)\n const more = hits.length - shown.length\n const lines = shown.map((h) => `L${h.line}: ${h.text} → suggest: ${h.suggest.join(\" / \")}`)\n if (more > 0) lines.push(`+${more} more`)\n diags.push({\n code: \"HARDCODED_COLOR\",\n severity: \"warning\",\n message: `${file} hard-codes ${hits.length} color(s):\\n ${lines.join(\"\\n \")}`,\n files: [...new Set(shown.map((h) => `${file}:${h.line}`))].concat(more > 0 ? [`+${more} more`] : []),\n fix: \"Use theme tokens instead (bg-primary, text-muted-foreground, var(--chart-N), … as defined in styles.css; see the 「見た目の規約」 section of AGENTS.md, and to change colors switch the theme or override styles.css). If a color carries data meaning (e.g. map fills), put `// vantage-ignore-color` (`{/* vantage-ignore-color */}` inside JSX) on that line or the line above; `vantage-ignore-color-file` within the first 5 lines exempts the whole file.\",\n })\n }\n return diags\n}\n\nconst DESIGN_MD_MAX_LINES = 150\n\n/** An optional DESIGN.md holds the user's own intent only, not a second copy of styles.css. */\nfunction checkDesignDoc(ctx: Ctx): Diagnostic[] {\n if (!ctx.rootEntries().includes(\"DESIGN.md\")) return []\n const raw = ctx.raw(path.join(ctx.root, \"DESIGN.md\"))\n if (raw === null) return []\n const lines = raw.replace(/\\n$/, \"\").split(\"\\n\").length\n if (lines <= DESIGN_MD_MAX_LINES) return []\n return [\n {\n code: \"DESIGN_MD_TOO_LONG\",\n severity: \"warning\",\n message: `DESIGN.md is ${lines} lines long (aim for ${DESIGN_MD_MAX_LINES} or fewer).`,\n files: [\"DESIGN.md\"],\n fix: \"Keep DESIGN.md to your own intent (density, slide headings, brand material). Colors, fonts and radii belong to the theme / styles.css, and the usage rules to the 「見た目の規約」 section of AGENTS.md — do not copy values into DESIGN.md.\",\n },\n ]\n}\n\n/** Run all static diagnostics for a project. */\nexport function runDiagnostics(root: string, model: RouteModel): Diagnostic[] {\n return timed(\"diagnostics\", () => {\n const ctx = createCtx(root, model)\n const client = checkClientSources(ctx)\n return [\n ...checkForbiddenFiles(ctx),\n ...checkSrcLayout(ctx),\n ...checkSuspiciousRouteDirs(model),\n ...checkRouteConflicts(ctx),\n ...checkUnroutedFiles(ctx),\n ...checkFilePageSize(ctx),\n ...checkPageExports(ctx),\n ...checkApiExports(ctx),\n ...checkAppLang(ctx),\n ...client.boundary,\n ...client.env,\n ...checkHardcodedColors(ctx),\n ...checkDesignDoc(ctx),\n ]\n })\n}\n"]}
|