@k2b/ui 0.50.0 → 0.51.0
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/base.css +32 -1
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/CommandList.js +861 -0
- package/dist/browser/actions/CommandList.js.map +1 -0
- package/dist/browser/actions/CommandMenu.js +237 -0
- package/dist/browser/actions/CommandMenu.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +43 -10
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/command-dock.js +47 -0
- package/dist/browser/actions/command-dock.js.map +1 -0
- package/dist/browser/actions/command-items.js +84 -0
- package/dist/browser/actions/command-items.js.map +1 -0
- package/dist/browser/actions/command-messages.js +42 -0
- package/dist/browser/actions/command-messages.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/charts/core/area.js +3 -5
- package/dist/browser/charts/core/area.js.map +1 -1
- package/dist/browser/charts/core/calendar.js +1 -1
- package/dist/browser/charts/core/calendar.js.map +1 -1
- package/dist/browser/charts/core/chart-messages.js +17 -0
- package/dist/browser/charts/core/chart-messages.js.map +1 -0
- package/dist/browser/charts/core/hbar-layout.js +118 -0
- package/dist/browser/charts/core/hbar-layout.js.map +1 -0
- package/dist/browser/charts/core/hbar.js +39 -0
- package/dist/browser/charts/core/hbar.js.map +1 -0
- package/dist/browser/charts/core/index.js +7 -2
- package/dist/browser/charts/core/index.js.map +1 -1
- package/dist/browser/charts/core/map.js +116 -0
- package/dist/browser/charts/core/map.js.map +1 -0
- package/dist/browser/charts/core/registry.js +22 -15
- package/dist/browser/charts/core/registry.js.map +1 -1
- package/dist/browser/charts/core/render-size.js +13 -0
- package/dist/browser/charts/core/render-size.js.map +1 -0
- package/dist/browser/charts/core/render.js +20 -10
- package/dist/browser/charts/core/render.js.map +1 -1
- package/dist/browser/charts/core/snapshot.js +3 -3
- package/dist/browser/charts/core/snapshot.js.map +1 -1
- package/dist/browser/charts/core/svg-renderers.js +2406 -0
- package/dist/browser/charts/core/svg-renderers.js.map +1 -0
- package/dist/browser/charts/core/svg.js +4 -2525
- package/dist/browser/charts/core/svg.js.map +1 -1
- package/dist/browser/charts/core/types.js +0 -2
- package/dist/browser/charts/core/types.js.map +1 -1
- package/dist/browser/charts/core/waterfall.js +162 -0
- package/dist/browser/charts/core/waterfall.js.map +1 -0
- package/dist/browser/charts/description.js +2 -0
- package/dist/browser/charts/description.js.map +1 -0
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/Chart.js +14 -628
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +632 -0
- package/dist/browser/content/ChartRoot.js.map +1 -0
- package/dist/browser/content/ChartSparkline.js +24 -0
- package/dist/browser/content/ChartSparkline.js.map +1 -0
- package/dist/browser/content/FileView.js +111 -61
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +8 -8
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/MapView.js +30 -28
- package/dist/browser/content/MapView.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +84 -52
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/PdfViewer.js +588 -0
- package/dist/browser/content/PdfViewer.js.map +1 -0
- package/dist/browser/content/chart-bar.js +246 -16
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +22 -21
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +10 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +2 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/pdf-document.js +29 -0
- package/dist/browser/content/pdf-document.js.map +1 -0
- package/dist/browser/content/pdf-limits.js +31 -0
- package/dist/browser/content/pdf-limits.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +34 -2
- package/dist/browser/content/pdf-messages.js.map +1 -1
- package/dist/browser/content/pdf-viewer-engine.js +57 -0
- package/dist/browser/content/pdf-viewer-worker.js +28 -0
- package/dist/browser/inputs/ChoiceInputs.js +94 -51
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/ChoiceSlider.js +75 -58
- package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +113 -98
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/PeriodPicker.js +874 -0
- package/dist/browser/inputs/PeriodPicker.js.map +1 -0
- package/dist/browser/inputs/index.js +4 -1
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/input-messages.js +8 -2
- package/dist/browser/inputs/input-messages.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
- package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/browser/inputs/period-picker-messages.js +71 -0
- package/dist/browser/inputs/period-picker-messages.js.map +1 -0
- package/dist/browser/inputs/period.js +263 -0
- package/dist/browser/inputs/period.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +147 -120
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +101 -108
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/DescriptionList.js +5 -2
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +19 -14
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/delta-badge.js +16 -2
- package/dist/browser/surfaces/delta-badge.js.map +1 -1
- package/dist/browser/widgets/DashboardFrame.js +310 -0
- package/dist/browser/widgets/DashboardFrame.js.map +1 -0
- package/dist/browser/widgets/index.js +1 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/CommandList.js +638 -0
- package/dist/ssr/actions/CommandList.js.map +1 -0
- package/dist/ssr/actions/CommandMenu.js +197 -0
- package/dist/ssr/actions/CommandMenu.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +43 -10
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/command-dock.js +47 -0
- package/dist/ssr/actions/command-dock.js.map +1 -0
- package/dist/ssr/actions/command-items.js +84 -0
- package/dist/ssr/actions/command-items.js.map +1 -0
- package/dist/ssr/actions/command-messages.js +42 -0
- package/dist/ssr/actions/command-messages.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/charts/core/area.js +3 -5
- package/dist/ssr/charts/core/area.js.map +1 -1
- package/dist/ssr/charts/core/calendar.js +1 -1
- package/dist/ssr/charts/core/calendar.js.map +1 -1
- package/dist/ssr/charts/core/chart-messages.js +17 -0
- package/dist/ssr/charts/core/chart-messages.js.map +1 -0
- package/dist/ssr/charts/core/hbar-layout.js +118 -0
- package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
- package/dist/ssr/charts/core/hbar.js +39 -0
- package/dist/ssr/charts/core/hbar.js.map +1 -0
- package/dist/ssr/charts/core/index.js +7 -2
- package/dist/ssr/charts/core/index.js.map +1 -1
- package/dist/ssr/charts/core/map.js +116 -0
- package/dist/ssr/charts/core/map.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +22 -15
- package/dist/ssr/charts/core/registry.js.map +1 -1
- package/dist/ssr/charts/core/render-size.js +13 -0
- package/dist/ssr/charts/core/render-size.js.map +1 -0
- package/dist/ssr/charts/core/render.js +20 -10
- package/dist/ssr/charts/core/render.js.map +1 -1
- package/dist/ssr/charts/core/snapshot.js +3 -3
- package/dist/ssr/charts/core/snapshot.js.map +1 -1
- package/dist/ssr/charts/core/svg-renderers.js +2406 -0
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +4 -2525
- package/dist/ssr/charts/core/svg.js.map +1 -1
- package/dist/ssr/charts/core/types.js +0 -2
- package/dist/ssr/charts/core/types.js.map +1 -1
- package/dist/ssr/charts/core/waterfall.js +162 -0
- package/dist/ssr/charts/core/waterfall.js.map +1 -0
- package/dist/ssr/charts/description.js +2 -0
- package/dist/ssr/charts/description.js.map +1 -0
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/Chart.js +14 -471
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +475 -0
- package/dist/ssr/content/ChartRoot.js.map +1 -0
- package/dist/ssr/content/ChartSparkline.js +24 -0
- package/dist/ssr/content/ChartSparkline.js.map +1 -0
- package/dist/ssr/content/FileView.js +56 -7
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -8
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/MapView.js +9 -9
- package/dist/ssr/content/MapView.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +49 -20
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/PdfViewer.js +484 -0
- package/dist/ssr/content/PdfViewer.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +246 -16
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +22 -21
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +10 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +2 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/pdf-document.js +29 -0
- package/dist/ssr/content/pdf-document.js.map +1 -0
- package/dist/ssr/content/pdf-limits.js +31 -0
- package/dist/ssr/content/pdf-limits.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +34 -2
- package/dist/ssr/content/pdf-messages.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +49 -12
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/ChoiceSlider.js +17 -12
- package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +14 -9
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/PeriodPicker.js +598 -0
- package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
- package/dist/ssr/inputs/index.js +4 -1
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/input-messages.js +8 -2
- package/dist/ssr/inputs/input-messages.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
- package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/ssr/inputs/period-picker-messages.js +71 -0
- package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
- package/dist/ssr/inputs/period.js +263 -0
- package/dist/ssr/inputs/period.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +27 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +16 -2
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/DescriptionList.js +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +4 -5
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/delta-badge.js +16 -2
- package/dist/ssr/surfaces/delta-badge.js.map +1 -1
- package/dist/ssr/widgets/DashboardFrame.js +200 -0
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
- package/dist/ssr/widgets/index.js +1 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Button.d.ts +1 -1
- package/dist/types/actions/CommandList.d.ts +120 -0
- package/dist/types/actions/CommandMenu.d.ts +39 -0
- package/dist/types/actions/Dropdown.d.ts +17 -0
- package/dist/types/actions/command-dock.d.ts +8 -0
- package/dist/types/actions/command-items.d.ts +134 -0
- package/dist/types/actions/command-messages.d.ts +19 -0
- package/dist/types/actions/index.d.ts +3 -0
- package/dist/types/charts/core/calendar.d.ts +1 -1
- package/dist/types/charts/core/chart-messages.d.ts +5 -0
- package/dist/types/charts/core/hbar-layout.d.ts +74 -0
- package/dist/types/charts/core/hbar.d.ts +13 -0
- package/dist/types/charts/core/index.d.ts +7 -2
- package/dist/types/charts/core/map.d.ts +3 -0
- package/dist/types/charts/core/registry.d.ts +17 -11
- package/dist/types/charts/core/render-size.d.ts +7 -0
- package/dist/types/charts/core/render.d.ts +1 -4
- package/dist/types/charts/core/snapshot.d.ts +2 -2
- package/dist/types/charts/core/svg-renderers.d.ts +722 -0
- package/dist/types/charts/core/svg.d.ts +4 -698
- package/dist/types/charts/core/types.d.ts +1 -12
- package/dist/types/charts/core/waterfall.d.ts +68 -0
- package/dist/types/charts/description.d.ts +226 -0
- package/dist/types/charts.d.ts +1 -0
- package/dist/types/content/Chart.d.ts +3 -91
- package/dist/types/content/ChartRoot.d.ts +92 -0
- package/dist/types/content/ChartSparkline.d.ts +5 -0
- package/dist/types/content/PdfViewer.d.ts +32 -0
- package/dist/types/content/chart-bar.d.ts +95 -2
- package/dist/types/content/index.d.ts +2 -0
- package/dist/types/content/pdf-document.d.ts +5 -0
- package/dist/types/content/pdf-engine.d.ts +9 -0
- package/dist/types/content/pdf-limits.d.ts +43 -0
- package/dist/types/content/pdf-messages.d.ts +16 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
- package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
- package/dist/types/inputs/DatePicker.d.ts +22 -0
- package/dist/types/inputs/PeriodPicker.d.ts +24 -0
- package/dist/types/inputs/index.d.ts +8 -2
- package/dist/types/inputs/input-messages.d.ts +3 -0
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
- package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
- package/dist/types/inputs/period-picker-messages.d.ts +34 -0
- package/dist/types/inputs/period.d.ts +134 -0
- package/dist/types/layout/DetailPanel.d.ts +12 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/DescriptionList.d.ts +5 -0
- package/dist/types/surfaces/StatCell.d.ts +6 -1
- package/dist/types/widgets/DashboardFrame.d.ts +58 -0
- package/dist/types/widgets/index.d.ts +1 -0
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts/core/area.ts"],"sourcesContent":["import { chartMessages } from \"../../content/chart-message-catalog\";\nimport { chartDatumSvg, escapeXml, niceStep } from \"./svg\";\n\nexport type AreaOptions = {\n layout: \"stacked\";\n normalize?: boolean;\n x: (string | number)[];\n series: { label: string; data: (number | null)[] }[];\n title?: string;\n subtitle?: string;\n className?: string;\n legend?: boolean;\n format?: (value: number) => string;\n locale?: string;\n /** Narrowest displayed width in CSS pixels; measured hosts pass their actual width. */\n displayWidth?: number;\n};\nexport type AreaPoint = { index: number; amount: number; share: number; lower: number; upper: number };\n\n/** Missing observations interrupt the entire stack; zero-sum columns are gaps only in normalized mode. */\nexport function areaLayout(spec: AreaOptions, size: { width: number; height: number }) {\n if (![size.width, size.height].every((v) => Number.isFinite(v) && v > 0)) throw new RangeError(\"Invalid area size\");\n if (spec.x.some((x) => typeof x === \"number\" && !Number.isFinite(x))) throw new RangeError(\"Area X values must be finite\");\n if (spec.series.some((s) => s.data.length !== spec.x.length)) throw new RangeError(\"Area series must match x length\");\n const totals = spec.x.map((_, i) => {\n let total = 0,\n missing = false;\n for (const series of spec.series) {\n const value = series.data[i];\n if (value === null) {\n missing = true;\n continue;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0)\n throw new RangeError(\"Area values must be nonnegative finite numbers or null\");\n total += value;\n }\n if (!Number.isFinite(total)) throw new RangeError(\"Area totals must be finite\");\n return missing || (spec.normalize && total === 0) ? null : total;\n });\n const layers: (AreaPoint | null)[][] = spec.series.map(() => []);\n totals.forEach((total, index) => {\n let lower = 0;\n spec.series.forEach((series, s) => {\n const amount = series.data[index];\n if (total === null || amount === null || amount === undefined) {\n layers[s]!.push(null);\n return;\n }\n const share = total === 0 ? 0 : amount / total;\n const upper = lower + (spec.normalize ? share : amount);\n layers[s]!.push({ index, amount, share, lower, upper });\n lower = upper;\n });\n });\n let rawMax = 0;\n for (const total of totals) if (total !== null) rawMax = Math.max(rawMax, total);\n const step = spec.normalize ? 0.25 : niceStep(rawMax || 1, 5);\n const max = spec.normalize ? 1 : Math.ceil((rawMax || 1) / step) * step;\n if (!(step > 0) || !Number.isFinite(max)) throw new RangeError(\"Area values cannot form a finite axis; rescale them first\");\n const ticks = Array.from({ length: Math.round(max / step) + 1 }, (_, i) => i * step);\n const format = spec.format ?? new Intl.NumberFormat(spec.locale ?? \"en\", { maximumFractionDigits: 2 }).format;\n const percent = new Intl.NumberFormat(spec.locale ?? \"en\", { style: \"percent\", minimumFractionDigits: 1, maximumFractionDigits: 1 })\n .format;\n const axisFormat = spec.normalize\n ? new Intl.NumberFormat(spec.locale ?? \"en\", { style: \"percent\", maximumFractionDigits: 0 }).format\n : format;\n const numericX = new Intl.NumberFormat(spec.locale ?? \"en\", { useGrouping: \"min2\", maximumFractionDigits: 6 }).format;\n const xFormat = (value: string | number) => (typeof value === \"number\" ? numericX(value) : value);\n const displayWidth = spec.displayWidth ?? 296;\n if (!Number.isFinite(displayWidth) || displayWidth <= 0) throw new RangeError(\"Invalid area display width\");\n const ratio = size.width / displayWidth;\n const left = Math.min(size.width * 0.6, Math.max(44, ...ticks.map((v) => axisFormat(v).length * 7 + 12)) * ratio);\n const right = size.width - 12,\n top = (spec.title || spec.subtitle ? 50 : 16) + (spec.legend === false ? 0 : spec.series.length <= 2 ? 20 : 40);\n const bottom = Math.max(top + 1, size.height - 30);\n const projectX = (index: number) => (spec.x.length < 2 ? (left + right) / 2 : left + (index / (spec.x.length - 1)) * (right - left));\n const projectY = (value: number) => bottom - (value / max) * (bottom - top);\n return { layers, totals, max, ticks, format, percent, axisFormat, xFormat, ratio, left, right, top, bottom, projectX, projectY };\n}\nconst f = (value: number) => String(Math.round(value * 100) / 100);\nconst text = (x: number, y: number, label: string, anchor = \"middle\", extra = \"\") =>\n `<text x=\"${f(x)}\" y=\"${f(y)}\" text-anchor=\"${anchor}\" fill=\"currentColor\" stroke=\"none\" font-family=\"var(--k2b-font-sans, sans-serif)\" font-size=\"11\" ${extra}>${escapeXml(label)}</text>`;\n\nexport function renderAreaSvg(spec: AreaOptions & { width: number; height: number; inspect?: boolean }): string {\n const g = areaLayout(spec, spec),\n parts: string[] = [];\n if (spec.title) parts.push(text(spec.width / 2, 16, spec.title));\n if (spec.subtitle) parts.push(text(spec.width / 2, spec.title ? 32 : 16, spec.subtitle));\n for (const tick of g.ticks) {\n const y = g.projectY(tick);\n parts.push(\n `<line x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(y)}\" y2=\"${f(y)}\" stroke=\"currentColor\" stroke-opacity=\"${tick === 0 ? 0.25 : 0.09}\"/>`,\n text(g.left - 8, y + 4, g.axisFormat(tick), \"end\", 'class=\"stdlib-chart-tick-label\"'),\n );\n }\n parts.push(\n `<line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(g.bottom)}\" y2=\"${f(g.bottom)}\" stroke=\"none\"/><line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.left)}\" y1=\"${f(g.top)}\" y2=\"${f(g.bottom)}\" stroke=\"none\"/>`,\n );\n const palette = [\"#2563eb\", \"#16a34a\", \"#d97706\", \"#dc2626\", \"#a855f7\", \"#0891b2\", \"#db2777\", \"#65a30d\"];\n if (spec.legend !== false) {\n const entries = spec.series.slice(0, 4);\n const columns = 2;\n const cell = spec.width / columns;\n entries.forEach((series, i) => {\n const x = (i % columns) * cell + 4,\n y = g.top - (entries.length <= 2 ? 11 : 28) + Math.floor(i / columns) * 17;\n const color =\n i === 3 && spec.series.length > 4 ? \"var(--k2b-text-muted, #8b8b93)\" : `var(--stdlib-chart-c${(i % 8) + 1}, ${palette[i % 8]})`;\n const point = g.layers[i]?.at(-1);\n const value = point ? (spec.normalize ? g.percent(point.share) : g.format(point.amount)) : \"—\";\n const room = Math.floor((cell * (1 / g.ratio)) / 6) - 4;\n const showValue = value.length + 3 < room;\n const maxChars = Math.max(1, room - (showValue ? value.length + 1 : 0));\n const label = series.label.length > maxChars ? series.label.slice(0, maxChars - 1) + \"…\" : series.label;\n const full =\n i === 3 && spec.series.length > 4\n ? spec.series\n .slice(3)\n .map((s) => s.label)\n .join(\", \")\n : series.label;\n const shown =\n i === 3 && spec.series.length > 4 ? `+${new Intl.NumberFormat(spec.locale ?? \"en\").format(spec.series.length - 3)}` : label;\n const valueSvg =\n showValue && !(i === 3 && spec.series.length > 4)\n ? `<tspan dx=\"6\" font-weight=\"600\" data-chart-legend-value data-series-index=\"${i}\" data-field=\"${spec.normalize ? \"percent\" : \"value\"}\" data-default=\"${escapeXml(value)}\">${escapeXml(value)}</tspan>`\n : \"\";\n const labelSvg = text(x + 12, y, shown, \"start\").replace(\"</text>\", `${valueSvg}</text>`);\n parts.push(\n `<g><title>${escapeXml(full)}</title><rect x=\"${f(x)}\" y=\"${f(y - 8)}\" width=\"8\" height=\"8\" rx=\"2\" fill=\"${color}\" stroke=\"none\"/>${labelSvg}</g>`,\n );\n });\n }\n g.layers.forEach((layer, s) => {\n const color = `var(--stdlib-chart-c${(s % 8) + 1}, ${palette[s % 8]})`;\n let run: AreaPoint[] = [];\n const flush = () => {\n if (!run.length) return;\n const halfSlot = Math.min(10 * g.ratio, (g.right - g.left) / Math.max(2, spec.x.length * 2));\n const upper =\n run.length === 1\n ? [\n [Math.max(g.left, g.projectX(run[0]!.index) - halfSlot), g.projectY(run[0]!.upper)],\n [Math.min(g.right, g.projectX(run[0]!.index) + halfSlot), g.projectY(run[0]!.upper)],\n ]\n : run.map((p) => [g.projectX(p.index), g.projectY(p.upper)]);\n const lower =\n run.length === 1\n ? [\n [upper[1]![0]!, g.projectY(run[0]!.lower)],\n [upper[0]![0]!, g.projectY(run[0]!.lower)],\n ]\n : run.toReversed().map((p) => [g.projectX(p.index), g.projectY(p.lower)]);\n const points = [...upper, ...lower].map(([x, y]) => `${f(x!)},${f(y!)}`);\n parts.push(\n `<polygon class=\"k2b-area-layer\" points=\"${points.join(\" \")}\" fill=\"color-mix(in srgb, ${color} 55%, var(--k2b-surface, #ffffff))\" stroke=\"none\"/>`,\n `<polyline class=\"k2b-area-edge k2b-area-edge-${s % 8}\" points=\"${upper.map(([x, y]) => `${f(x!)},${f(y!)}`).join(\" \")}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\"/>`,\n );\n run = [];\n };\n for (const point of layer) {\n if (point) run.push(point);\n else flush();\n }\n flush();\n layer.forEach((point) => {\n if (!point) return;\n const x = g.projectX(point.index),\n y = g.projectY((point.lower + point.upper) / 2);\n const circle = `<circle class=\"k2b-area-inspection-point\" cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"3\" fill=\"${color}\" opacity=\"0\" stroke=\"none\"/>`;\n parts.push(\n chartDatumSvg(\n circle,\n {\n role: \"point\",\n index: point.index,\n seriesIndex: s,\n label: spec.series[s]!.label,\n anchor: [x, g.top],\n values: [\n {\n key: \"x\",\n value: spec.x[point.index]!,\n formatted: g.xFormat(spec.x[point.index]!),\n },\n { key: \"value\", value: point.amount, formatted: g.format(point.amount) },\n { key: \"total\", value: g.totals[point.index]!, formatted: g.format(g.totals[point.index]!) },\n ...(spec.normalize ? [{ key: \"percent\", value: point.share * 100, formatted: g.percent(point.share) }] : []),\n ],\n },\n spec.inspect ?? false,\n ),\n );\n });\n });\n const slot = ((g.right - g.left) / Math.max(1, spec.x.length)) * (1 / g.ratio);\n const labelWidth = Math.max(1, ...spec.x.map((x) => Math.min(24, String(x).length))) * 6;\n const stride = Math.max(1, Math.ceil(labelWidth / Math.max(1, slot)));\n spec.x.forEach((value, i) => {\n if (i % stride !== 0) return;\n const label = g.xFormat(value);\n parts.push(\n text(\n g.projectX(i),\n g.bottom + 20,\n label.length > 24 ? label.slice(0, 23) + \"…\" : label,\n i === 0 ? \"start\" : i === spec.x.length - 1 ? \"end\" : \"middle\",\n 'class=\"stdlib-chart-tick-label\"',\n ),\n );\n });\n const totalLabel = chartMessages.resolve([spec.locale ?? \"en\"]).t.chartFields({ key: \"areaTotal\" });\n return `<svg data-chart-total-label=\"${escapeXml(totalLabel)}\" xmlns=\"http://www.w3.org/2000/svg\" class=\"stdlib-chart k2b-area ${escapeXml(spec.className ?? \"\")}\" width=\"${spec.width}\" height=\"${spec.height}\" viewBox=\"0 0 ${spec.width} ${spec.height}\" aria-hidden=\"true\" focusable=\"false\">${parts.join(\"\")}</svg>`;\n}\n"],"mappings":"AAAA,SAAS,aAAa,QAAQ,qCAAqC;AACnE,SAAS,aAAa,EAAE,SAAS,EAAE,QAAQ,QAAQ,OAAO;AAkB1D;AACA,OAAO,SAAS,UAAU,CAAC,IAAiB,EAAE,IAAuC,EAAE;EACrF,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAE,CAAC,IAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,mBAAmB,CAAC;EACnH,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC;EAC1H,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC;EACrH,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;IAClC,IAAI,KAAK,GAAG,CAAC;MACX,OAAO,GAAG,KAAK;IACjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;MAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;MAC5B,IAAI,KAAK,KAAK,IAAI,EAAE;QAClB,OAAO,GAAG,IAAI;QACd;MACF;MACA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EACnE,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC;MAChF,KAAK,IAAI,KAAK;IAChB;IACA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC;IAC/E,OAAO,OAAO,IAAK,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,CAAE,GAAG,IAAI,GAAG,KAAK;EAClE,CAAC,CAAC;EACF,MAAM,MAA8B,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;EAChE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK;IAC/B,IAAI,KAAK,GAAG,CAAC;IACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK;MACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;MACjC,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;QAC7D,MAAM,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC;QACrB;MACF;MACA,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK;MAC9C,MAAM,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;MACvD,MAAM,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC;QAAE,KAAK;QAAE,MAAM;QAAE,KAAK;QAAE,KAAK;QAAE;MAAM,CAAC,CAAC;MACvD,KAAK,GAAG,KAAK;IACf,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,IAAI,MAAM,GAAG,CAAC;EACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;EAChF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI;EACvE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC;EAC3H,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;EACpF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;IAAE,qBAAqB,EAAE;EAAE,CAAC,CAAC,CAAC,MAAM;EAC7G,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;IAAE,KAAK,EAAE,SAAS;IAAE,qBAAqB,EAAE,CAAC;IAAE,qBAAqB,EAAE;EAAE,CAAC,CAAC,CACjI,MAAM;EACT,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,GAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;IAAE,KAAK,EAAE,SAAS;IAAE,qBAAqB,EAAE;EAAE,CAAC,CAAC,CAAC,MAAM,GACjG,MAAM;EACV,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM;IAAE,qBAAqB,EAAE;EAAE,CAAC,CAAC,CAAC,MAAM;EACrH,MAAM,OAAO,GAAI,KAAsB,IAAM,OAAO,KAAK,KAAK,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAM;EACjG,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,GAAG;EAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC;EAC3G,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,YAAY;EACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAE,CAAC,IAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;EACjH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;IAC3B,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;EACjH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;EAClD,MAAM,QAAQ,GAAI,KAAa,IAAM,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,GAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAK,KAAK,GAAG,IAAI,CAAE;EACpI,MAAM,QAAQ,GAAI,KAAa,IAAK,MAAM,GAAI,KAAK,GAAG,GAAG,IAAK,MAAM,GAAG,GAAG,CAAC;EAC3E,OAAO;IAAE,MAAM;IAAE,MAAM;IAAE,GAAG;IAAE,KAAK;IAAE,MAAM;IAAE,OAAO;IAAE,UAAU;IAAE,OAAO;IAAE,KAAK;IAAE,IAAI;IAAE,KAAK;IAAE,GAAG;IAAE,MAAM;IAAE,QAAQ;IAAE;EAAS,CAAC;AAClI;AACA,MAAM,CAAC,GAAI,KAAa,IAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAClE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,KAAK,GAAG,EAAE,KAC9E,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,MAAM,qGAAqG,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS;AAE7L,OAAO,SAAS,aAAa,CAAC,IAAwE,EAAU;EAC9G,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;IAC9B,KAAe,GAAG,EAAE;EACtB,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;EAChE,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;EACxF,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1B,KAAK,CAAC,IAAI,CACR,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,2CAA2C,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,KAAK,EAC3I,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,CACtF,CAAC;EACH;EACA,KAAK,CAAC,IAAI,CACR,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mBACrO,CAAC;EACD,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;EACxG,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,CAAC;IACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,OAAO;IACjC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK;MAC7B,MAAM,CAAC,GAAI,CAAC,GAAG,OAAO,GAAI,IAAI,GAAG,CAAC;QAChC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE;MAC5E,MAAM,KAAK,GACT,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gCAAgC,GAAG,uBAAwB,CAAC,GAAG,CAAC,GAAI,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG;MACjI,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;MACjC,MAAM,KAAK,GAAG,KAAK,GAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAI,GAAG;MAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC,GAAG,CAAC;MACvD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI;MACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;MACvE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK;MACvG,MAAM,IAAI,GACR,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAC7B,IAAI,CAAC,MAAM,CACR,KAAK,CAAC,CAAC,CAAC,CACR,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,KAAK,CAAC,CACnB,IAAI,CAAC,IAAI,CAAC,GACb,MAAM,CAAC,KAAK;MAClB,MAAM,KAAK,GACT,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK;MAC7H,MAAM,QAAQ,GACZ,SAAS,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAC7C,8EAA8E,CAAC,iBAAiB,IAAI,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,mBAAmB,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,UAAU,GACtM,EAAE;MACR,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,SAAS,CAAC;MACzF,KAAK,CAAC,IAAI,CACR,aAAa,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,uCAAuC,KAAK,oBAAoB,QAAQ,MAC9I,CAAC;IACH,CAAC,CAAC;EACJ;EACA,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK;IAC7B,MAAM,KAAK,GAAG,uBAAwB,CAAC,GAAG,CAAC,GAAI,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG;IACtE,IAAI,GAAgB,GAAG,EAAE;IACzB,MAAM,KAAK,GAAG,MAAM;MAClB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;MACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;MAC5F,MAAM,KAAK,GACT,GAAG,CAAC,MAAM,KAAK,CAAC,GACZ,CACE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,EACnF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CACrF,GACD,GAAG,CAAC,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;MAChE,MAAM,KAAK,GACT,GAAG,CAAC,MAAM,KAAK,CAAC,GACZ,CACE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,EAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,EAC1C,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,EAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAC3C,GACD,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;MAC7E,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;MACxE,KAAK,CAAC,IAAI,CACR,2CAA2C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,KAAK,qDAAqD,EACnJ,gDAAgD,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,KAAK,wBACtJ,CAAC;MACD,GAAG,GAAG,EAAE;IACV,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;MACzB,IAAI,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KACtB,KAAK,CAAC,CAAC;IACd;IACA,KAAK,CAAC,CAAC;IACP,KAAK,CAAC,OAAO,CAAE,KAAK,IAAK;MACvB,IAAI,CAAC,KAAK,EAAE;MACZ,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;MACjD,MAAM,MAAM,GAAG,iDAAiD,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,+BAA+B;MACtI,KAAK,CAAC,IAAI,CACR,aAAa,CACX,MAAM,EACN;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,KAAK;QAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;QAClB,MAAM,EAAE,CACN;UACE,GAAG,EAAE,GAAG;UACR,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAE;UAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAE;QAC3C,CAAC,EACD;UAAE,GAAG,EAAE,OAAO;UAAE,KAAK,EAAE,KAAK,CAAC,MAAM;UAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;QAAE,CAAC,EACxE;UAAE,GAAG,EAAE,OAAO;UAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE;UAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE;QAAE,CAAC,EAC5F,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC;UAAE,GAAG,EAAE,SAAS;UAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,GAAG;UAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,CAAC,CAAC,GAAG,EAAE,CAAC;MAEhH,CAAC,EACD,IAAI,CAAC,OAAO,IAAI,KAClB,CACF,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,MAAM,IAAI,GAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;EAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,IAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;EACxF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;EACrE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK;IAC3B,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE;IACtB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9B,KAAK,CAAC,IAAI,CACR,IAAI,CACF,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EACb,CAAC,CAAC,MAAM,GAAG,EAAE,EACb,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,KAAK,EACpD,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,QAAQ,EAC9D,iCACF,CACF,CAAC;EACH,CAAC,CAAC;EACF,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAAE,GAAG,EAAE;EAAY,CAAC,CAAC;EACnG,OAAO,gCAAgC,SAAS,CAAC,UAAU,CAAC,qEAAqE,SAAS,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,YAAY,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,MAAM,kBAAkB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,0CAA0C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ;AAC3T","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/area.ts"],"sourcesContent":["import { coreChartMessages } from \"./chart-messages\";\nimport { chartDatumSvg, escapeXml, niceStep } from \"./svg-renderers\";\n\nexport type AreaOptions = {\n layout: \"stacked\";\n normalize?: boolean;\n x: (string | number)[];\n series: { label: string; data: (number | null)[] }[];\n title?: string;\n subtitle?: string;\n className?: string;\n legend?: boolean;\n format?: (value: number) => string;\n locale?: string;\n /** Narrowest displayed width in CSS pixels; measured hosts pass their actual width. */\n displayWidth?: number;\n};\nexport type AreaPoint = { index: number; amount: number; share: number; lower: number; upper: number };\n\n/** Missing observations interrupt the entire stack; zero-sum columns are gaps only in normalized mode. */\nexport function areaLayout(spec: AreaOptions, size: { width: number; height: number }) {\n if (![size.width, size.height].every((v) => Number.isFinite(v) && v > 0)) throw new RangeError(\"Invalid area size\");\n if (spec.x.some((x) => typeof x === \"number\" && !Number.isFinite(x))) throw new RangeError(\"Area X values must be finite\");\n if (spec.series.some((s) => s.data.length !== spec.x.length)) throw new RangeError(\"Area series must match x length\");\n const totals = spec.x.map((_, i) => {\n let total = 0,\n missing = false;\n for (const series of spec.series) {\n const value = series.data[i];\n if (value === null) {\n missing = true;\n continue;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0)\n throw new RangeError(\"Area values must be nonnegative finite numbers or null\");\n total += value;\n }\n if (!Number.isFinite(total)) throw new RangeError(\"Area totals must be finite\");\n return missing || (spec.normalize && total === 0) ? null : total;\n });\n const layers: (AreaPoint | null)[][] = spec.series.map(() => []);\n totals.forEach((total, index) => {\n let lower = 0;\n spec.series.forEach((series, s) => {\n const amount = series.data[index];\n if (total === null || amount === null || amount === undefined) {\n layers[s]!.push(null);\n return;\n }\n const share = total === 0 ? 0 : amount / total;\n const upper = lower + (spec.normalize ? share : amount);\n layers[s]!.push({ index, amount, share, lower, upper });\n lower = upper;\n });\n });\n let rawMax = 0;\n for (const total of totals) if (total !== null) rawMax = Math.max(rawMax, total);\n const step = spec.normalize ? 0.25 : niceStep(rawMax || 1, 5);\n const max = spec.normalize ? 1 : Math.ceil((rawMax || 1) / step) * step;\n if (!(step > 0) || !Number.isFinite(max)) throw new RangeError(\"Area values cannot form a finite axis; rescale them first\");\n const ticks = Array.from({ length: Math.round(max / step) + 1 }, (_, i) => i * step);\n const format = spec.format ?? new Intl.NumberFormat(spec.locale ?? \"en\", { maximumFractionDigits: 2 }).format;\n const percent = new Intl.NumberFormat(spec.locale ?? \"en\", { style: \"percent\", minimumFractionDigits: 1, maximumFractionDigits: 1 })\n .format;\n const axisFormat = spec.normalize\n ? new Intl.NumberFormat(spec.locale ?? \"en\", { style: \"percent\", maximumFractionDigits: 0 }).format\n : format;\n const numericX = new Intl.NumberFormat(spec.locale ?? \"en\", { useGrouping: \"min2\", maximumFractionDigits: 6 }).format;\n const xFormat = (value: string | number) => (typeof value === \"number\" ? numericX(value) : value);\n const displayWidth = spec.displayWidth ?? 296;\n if (!Number.isFinite(displayWidth) || displayWidth <= 0) throw new RangeError(\"Invalid area display width\");\n const ratio = size.width / displayWidth;\n const left = Math.min(size.width * 0.6, Math.max(44, ...ticks.map((v) => axisFormat(v).length * 7 + 12)) * ratio);\n const right = size.width - 12,\n top = (spec.title || spec.subtitle ? 50 : 16) + (spec.legend === false ? 0 : spec.series.length <= 2 ? 20 : 40);\n const bottom = Math.max(top + 1, size.height - 30);\n const projectX = (index: number) => (spec.x.length < 2 ? (left + right) / 2 : left + (index / (spec.x.length - 1)) * (right - left));\n const projectY = (value: number) => bottom - (value / max) * (bottom - top);\n return { layers, totals, max, ticks, format, percent, axisFormat, xFormat, ratio, left, right, top, bottom, projectX, projectY };\n}\nconst f = (value: number) => String(Math.round(value * 100) / 100);\nconst text = (x: number, y: number, label: string, anchor = \"middle\", extra = \"\") =>\n `<text x=\"${f(x)}\" y=\"${f(y)}\" text-anchor=\"${anchor}\" fill=\"currentColor\" stroke=\"none\" font-family=\"var(--k2b-font-sans, sans-serif)\" font-size=\"11\" ${extra}>${escapeXml(label)}</text>`;\n\nexport function renderAreaSvg(spec: AreaOptions & { width: number; height: number; inspect?: boolean }): string {\n const g = areaLayout(spec, spec),\n parts: string[] = [];\n if (spec.title) parts.push(text(spec.width / 2, 16, spec.title));\n if (spec.subtitle) parts.push(text(spec.width / 2, spec.title ? 32 : 16, spec.subtitle));\n for (const tick of g.ticks) {\n const y = g.projectY(tick);\n parts.push(\n `<line x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(y)}\" y2=\"${f(y)}\" stroke=\"currentColor\" stroke-opacity=\"${tick === 0 ? 0.25 : 0.09}\"/>`,\n text(g.left - 8, y + 4, g.axisFormat(tick), \"end\", 'class=\"stdlib-chart-tick-label\"'),\n );\n }\n parts.push(\n `<line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(g.bottom)}\" y2=\"${f(g.bottom)}\" stroke=\"none\"/><line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.left)}\" y1=\"${f(g.top)}\" y2=\"${f(g.bottom)}\" stroke=\"none\"/>`,\n );\n const palette = [\"#2563eb\", \"#16a34a\", \"#d97706\", \"#dc2626\", \"#a855f7\", \"#0891b2\", \"#db2777\", \"#65a30d\"];\n if (spec.legend !== false) {\n const entries = spec.series.slice(0, 4);\n const columns = 2;\n const cell = spec.width / columns;\n entries.forEach((series, i) => {\n const x = (i % columns) * cell + 4,\n y = g.top - (entries.length <= 2 ? 11 : 28) + Math.floor(i / columns) * 17;\n const color =\n i === 3 && spec.series.length > 4 ? \"var(--k2b-text-muted, #8b8b93)\" : `var(--stdlib-chart-c${(i % 8) + 1}, ${palette[i % 8]})`;\n const point = g.layers[i]?.at(-1);\n const value = point ? (spec.normalize ? g.percent(point.share) : g.format(point.amount)) : \"—\";\n const room = Math.floor((cell * (1 / g.ratio)) / 6) - 4;\n const showValue = value.length + 3 < room;\n const maxChars = Math.max(1, room - (showValue ? value.length + 1 : 0));\n const label = series.label.length > maxChars ? series.label.slice(0, maxChars - 1) + \"…\" : series.label;\n const full =\n i === 3 && spec.series.length > 4\n ? spec.series\n .slice(3)\n .map((s) => s.label)\n .join(\", \")\n : series.label;\n const shown =\n i === 3 && spec.series.length > 4 ? `+${new Intl.NumberFormat(spec.locale ?? \"en\").format(spec.series.length - 3)}` : label;\n const valueSvg =\n showValue && !(i === 3 && spec.series.length > 4)\n ? `<tspan dx=\"6\" font-weight=\"600\" data-chart-legend-value data-series-index=\"${i}\" data-field=\"${spec.normalize ? \"percent\" : \"value\"}\" data-default=\"${escapeXml(value)}\">${escapeXml(value)}</tspan>`\n : \"\";\n const labelSvg = text(x + 12, y, shown, \"start\").replace(\"</text>\", `${valueSvg}</text>`);\n parts.push(\n `<g><title>${escapeXml(full)}</title><rect x=\"${f(x)}\" y=\"${f(y - 8)}\" width=\"8\" height=\"8\" rx=\"2\" fill=\"${color}\" stroke=\"none\"/>${labelSvg}</g>`,\n );\n });\n }\n g.layers.forEach((layer, s) => {\n const color = `var(--stdlib-chart-c${(s % 8) + 1}, ${palette[s % 8]})`;\n let run: AreaPoint[] = [];\n const flush = () => {\n if (!run.length) return;\n const halfSlot = Math.min(10 * g.ratio, (g.right - g.left) / Math.max(2, spec.x.length * 2));\n const upper =\n run.length === 1\n ? [\n [Math.max(g.left, g.projectX(run[0]!.index) - halfSlot), g.projectY(run[0]!.upper)],\n [Math.min(g.right, g.projectX(run[0]!.index) + halfSlot), g.projectY(run[0]!.upper)],\n ]\n : run.map((p) => [g.projectX(p.index), g.projectY(p.upper)]);\n const lower =\n run.length === 1\n ? [\n [upper[1]![0]!, g.projectY(run[0]!.lower)],\n [upper[0]![0]!, g.projectY(run[0]!.lower)],\n ]\n : run.toReversed().map((p) => [g.projectX(p.index), g.projectY(p.lower)]);\n const points = [...upper, ...lower].map(([x, y]) => `${f(x!)},${f(y!)}`);\n parts.push(\n `<polygon class=\"k2b-area-layer\" points=\"${points.join(\" \")}\" fill=\"color-mix(in srgb, ${color} 55%, var(--k2b-surface, #ffffff))\" stroke=\"none\"/>`,\n `<polyline class=\"k2b-area-edge k2b-area-edge-${s % 8}\" points=\"${upper.map(([x, y]) => `${f(x!)},${f(y!)}`).join(\" \")}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\"/>`,\n );\n run = [];\n };\n for (const point of layer) {\n if (point) run.push(point);\n else flush();\n }\n flush();\n layer.forEach((point) => {\n if (!point) return;\n const x = g.projectX(point.index),\n y = g.projectY((point.lower + point.upper) / 2);\n const circle = `<circle class=\"k2b-area-inspection-point\" cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"3\" fill=\"${color}\" opacity=\"0\" stroke=\"none\"/>`;\n parts.push(\n chartDatumSvg(\n circle,\n {\n role: \"point\",\n index: point.index,\n seriesIndex: s,\n label: spec.series[s]!.label,\n anchor: [x, g.top],\n values: [\n {\n key: \"x\",\n value: spec.x[point.index]!,\n formatted: g.xFormat(spec.x[point.index]!),\n },\n { key: \"value\", value: point.amount, formatted: g.format(point.amount) },\n { key: \"total\", value: g.totals[point.index]!, formatted: g.format(g.totals[point.index]!) },\n ...(spec.normalize ? [{ key: \"percent\", value: point.share * 100, formatted: g.percent(point.share) }] : []),\n ],\n },\n spec.inspect ?? false,\n ),\n );\n });\n });\n const slot = ((g.right - g.left) / Math.max(1, spec.x.length)) * (1 / g.ratio);\n const labelWidth = Math.max(1, ...spec.x.map((x) => Math.min(24, String(x).length))) * 6;\n const stride = Math.max(1, Math.ceil(labelWidth / Math.max(1, slot)));\n spec.x.forEach((value, i) => {\n if (i % stride !== 0) return;\n const label = g.xFormat(value);\n parts.push(\n text(\n g.projectX(i),\n g.bottom + 20,\n label.length > 24 ? label.slice(0, 23) + \"…\" : label,\n i === 0 ? \"start\" : i === spec.x.length - 1 ? \"end\" : \"middle\",\n 'class=\"stdlib-chart-tick-label\"',\n ),\n );\n });\n const totalLabel = coreChartMessages.resolve([spec.locale ?? \"en\"]).t.areaTotal;\n return `<svg data-chart-total-label=\"${escapeXml(totalLabel)}\" xmlns=\"http://www.w3.org/2000/svg\" class=\"stdlib-chart k2b-area ${escapeXml(spec.className ?? \"\")}\" width=\"${spec.width}\" height=\"${spec.height}\" viewBox=\"0 0 ${spec.width} ${spec.height}\" aria-hidden=\"true\" focusable=\"false\">${parts.join(\"\")}</svg>`;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { chartDatumSvg, escapeXml, heatmap, renderHeader, svgRoot } from "./svg";
|
|
1
|
+
import { chartDatumSvg, escapeXml, heatmap, renderHeader, svgRoot } from "./svg-renderers";
|
|
2
2
|
import { chartTextWidth } from "./text";
|
|
3
3
|
const DAY = 86400000;
|
|
4
4
|
/** Bound sparse inputs too: three leap years of daily observations. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts/core/calendar.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, type HeatmapOptions, heatmap, renderHeader, svgRoot } from \"./svg\";\nimport { chartTextWidth } from \"./text\";\nexport type CalendarHeatmapOptions = ChartOptions & {\n layout: \"calendar\";\n data: [string, number | null][];\n scale: \"sequential\" | \"diverging\";\n /** Unit shown beside each tooltip value. */\n label?: string;\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport type HeatmapChartOptions = (HeatmapOptions & { layout?: undefined }) | CalendarHeatmapOptions;\nconst DAY = 86400000;\n/** Bound sparse inputs too: three leap years of daily observations. */\nexport const CALENDAR_MAX_DAYS = 1098;\nexport function calendarDay(value: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new RangeError(\"Calendar dates must be YYYY-MM-DD.\");\n const date = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) throw new RangeError(\"Invalid calendar date.\");\n return date.getTime();\n}\n/** Intl uses 1..7, JS dates use 0..6. Old engines use an explicit locale fallback. */\nexport function calendarWeekStart(locale = \"en\"): number {\n const info: Intl.Locale & { weekInfo?: { firstDay: number }; getWeekInfo?: () => { firstDay: number } } = new Intl.Locale(locale);\n const fallback: Record<string, number> = { \"en-US\": 0 };\n const key = `${info.language}-${info.region ?? info.maximize().region}`;\n return (info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay ?? fallback[key] ?? 1) % 7;\n}\nexport const calendarWords = (locale = \"en\") =>\n locale.split(\"-\")[0] === \"de\"\n ? { day: \"Tag\", less: \"weniger\", more: \"mehr\", moreIn: \"mehr rein\", moreOut: \"mehr raus\" }\n : { day: \"Day\", less: \"less\", more: \"more\", moreIn: \"more in\", moreOut: \"more out\" };\n/** Explicit fields avoid the engine-dependent dateStyle pattern. */\nconst calendarDateParts = (locale: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" });\n return (time: number) => Object.fromEntries(formatter.formatToParts(time).map((part) => [part.type, part.value]));\n};\nexport function calendarLayout(spec: CalendarHeatmapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const seen = new Set<string>();\n const dates = spec.data\n .map(([date, value], index) => {\n if (seen.has(date)) throw new RangeError(\"Calendar dates must be unique.\");\n seen.add(date);\n const time = calendarDay(date);\n if (value !== null && !Number.isNaN(value) && !Number.isFinite(value)) throw new RangeError(\"Calendar values must be finite.\");\n return { date, value, index, time };\n })\n .sort((a, b) => a.time - b.time);\n if (dates.length && (dates.at(-1)!.time - dates[0]!.time) / DAY >= CALENDAR_MAX_DAYS)\n throw new RangeError(\"Calendar span must not exceed three years.\");\n const points = dates.filter((p): p is typeof p & { value: number } => p.value !== null && Number.isFinite(p.value));\n const weekStart = calendarWeekStart(spec.locale);\n const first = dates[0]?.time ?? 0;\n const monday = first - ((new Date(first).getUTCDay() - weekStart + 7) % 7) * DAY;\n const weeks = dates.length ? Math.floor((dates.at(-1)!.time - monday) / DAY / 7) + 1 : 0;\n const headerHeight = renderHeader(size.width, spec.title, spec.subtitle).height;\n // Seven square rows use the available panel height. Wider calendars scroll rather than flattening their cells.\n const cell = Math.max(14, Math.floor((size.height - headerHeight - 32 - 20 - 18) / 7)),\n gap = 3,\n left = 32;\n const width = Math.max(spec.displayWidth ?? size.width, left + weeks * (cell + gap) + 4);\n const top = 32 + renderHeader(width, spec.title, spec.subtitle).height;\n const min = Math.min(...points.map((p) => p.value), 0),\n max = Math.max(...points.map((p) => p.value), 0);\n const absMax = Math.max(-min, max);\n return {\n width,\n height: size.height,\n minWidth: width,\n firstMonday: monday,\n weekStart,\n weeks,\n min,\n max,\n absMax,\n cell,\n cellWidth: cell,\n top,\n cells: points.map((p) => {\n const day = Math.round((p.time - monday) / DAY),\n week = Math.floor(day / 7),\n weekday = day % 7;\n const intensity = spec.scale === \"diverging\" ? Math.abs(p.value) / (absMax || 1) : (p.value - min) / (max - min || 1);\n const color =\n spec.scale === \"diverging\"\n ? p.value < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n return { ...p, week, weekday, x: left + week * (cell + gap), y: top + weekday * (cell + gap), intensity, color };\n }),\n };\n}\nconst paint = (color: string, intensity: number) =>\n `color-mix(in srgb,${color} ${12 + 88 * Math.sqrt(intensity)}%,var(--k2b-surface-muted,#f4f4f5))`;\nexport function renderCalendarSvg(spec: CalendarHeatmapOptions): string {\n const s = calendarLayout(spec),\n locale = spec.locale ?? \"en\",\n words = calendarWords(locale);\n const number = spec.format ?? new Intl.NumberFormat(locale, { maximumSignificantDigits: 15 }).format;\n const parts = calendarDateParts(locale);\n const weekday = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n const month = new Intl.DateTimeFormat(locale, { month: \"short\", timeZone: \"UTC\" });\n // Left aligned direct-core header; interactive hosts keep it at the visible scroll edge.\n const header = renderHeader(s.width, spec.title, spec.subtitle)\n .svg.replace(/x=\"[^\"]*\"/g, 'x=\"0\"')\n .replace(/text-anchor=\"middle\"/g, 'text-anchor=\"start\"')\n .replace(/<text /g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"12\" ');\n const body: string[] = [`<g style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\">${header}</g>`];\n const days: string[] = [\n `<g data-calendar-weekdays=\"true\" pointer-events=\"none\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><rect x=\"-1\" y=\"${s.top - 18}\" width=\"33\" height=\"${7 * (s.cell + 3) + 18}\" fill=\"var(--k2b-surface,#fff)\"/>`,\n ];\n for (const day of [0, 2, 4])\n days.push(\n `<text x=\"0\" y=\"${s.top + day * (s.cell + 3) + s.cell - 2}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(weekday.format(Date.UTC(2026, 0, 4 + s.weekStart + day)))}</text>`,\n );\n let lastRight = -Infinity,\n lastMonth = \"\";\n for (let week = 0; week < s.weeks; week++) {\n const time = s.firstMonday + week * 7 * DAY,\n next = time + 6 * DAY;\n const nextDate = new Date(next),\n ym = nextDate.toISOString().slice(0, 7);\n if (ym === lastMonth) continue;\n lastMonth = ym;\n const text = month.format(next);\n const textWidth = chartTextWidth(text, 11);\n const x = Math.min(s.width - textWidth - 2, Math.max(32 + week * (s.cell + 3), lastRight + 3));\n const visibility = `visibility:var(--k2b-calendar-month-${week},visible)`;\n // The year has its own row, so a partial first month cannot suppress the following month.\n if (week === 0 || nextDate.getUTCMonth() === 0)\n body.push(\n `<g style=\"${visibility}\"><text x=\"${x}\" y=\"${s.top - 24}\" font-size=\"10\" fill=\"var(--k2b-text-muted,#45454e)\">${nextDate.getUTCFullYear()}</text></g>`,\n );\n body.push(\n `<text data-calendar-month=\"${week}\" style=\"${visibility}\" x=\"${x}\" y=\"${s.top - 10}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(text)}</text>`,\n );\n lastRight = x + textWidth;\n }\n for (const c of s.cells) {\n const d = parts(c.time);\n const date = locale.startsWith(\"de\")\n ? `${d.day}. ${d.month} ${d.year}`\n : /^en(?:-US)?$/.test(locale)\n ? `${d.month} ${d.day}, ${d.year}`\n : `${d.day} ${d.month} ${d.year}`;\n const fill = spec.scale === \"diverging\" && c.value === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(c.color, c.intensity);\n const value =\n spec.scale === \"diverging\" && c.value !== 0\n ? `${number(Math.abs(c.value))} ${c.value < 0 ? words.moreOut : words.moreIn}`\n : number(c.value);\n body.push(\n chartDatumSvg(\n `<rect x=\"${c.x}\" y=\"${c.y}\" width=\"${s.cell}\" height=\"${s.cell}\" rx=\"2\" fill=\"${fill}\" stroke=\"none\"/>`,\n {\n role: \"cell\",\n index: c.index,\n label: `${d.weekday}, ${date}`,\n anchor: [c.x + s.cell / 2, c.y + s.cell / 2],\n grid: [c.week, c.weekday],\n values: [{ key: \"value\", value: c.value, formatted: value }],\n },\n spec.inspect,\n ),\n );\n }\n days.push(\"</g>\");\n body.push(days.join(\"\"));\n const legendY = s.top + 7 * (s.cell + 3) + 12;\n const start = spec.scale === \"diverging\" ? words.moreOut : words.less,\n end = spec.scale === \"diverging\" ? words.moreIn : words.more;\n const swatches = spec.scale === \"diverging\" ? [-1, -0.5, 0, 0.5, 1] : [0, 0.25, 0.5, 0.75, 1];\n const offset = 32 + start.length * 6 + 8;\n body.push(\n `<g data-calendar-legend=\"true\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><text x=\"32\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(start)}</text>`,\n );\n swatches.forEach((v, i) => {\n const color =\n spec.scale === \"diverging\"\n ? v < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n body.push(\n `<rect x=\"${offset + i * 14}\" y=\"${legendY - 10}\" width=\"11\" height=\"11\" rx=\"2\" fill=\"${spec.scale === \"diverging\" && v === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(color, Math.abs(v))}\"/>`,\n );\n });\n body.push(\n `<text x=\"${offset + swatches.length * 14 + 4}\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(end)}</text></g>`,\n );\n return svgRoot({ ...s, className: spec.className }, body.join(\"\")).replace(\n \"<svg \",\n `<svg data-calendar=\"true\" data-chart-min-width=\"${s.minWidth}\" `,\n );\n}\nexport const renderHeatmapSvg = (spec: HeatmapChartOptions): string =>\n spec.layout === \"calendar\" ? renderCalendarSvg(spec) : heatmap(spec);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/calendar.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, type HeatmapOptions, heatmap, renderHeader, svgRoot } from \"./svg-renderers\";\nimport { chartTextWidth } from \"./text\";\nexport type CalendarHeatmapOptions = ChartOptions & {\n layout: \"calendar\";\n data: [string, number | null][];\n scale: \"sequential\" | \"diverging\";\n /** Unit shown beside each tooltip value. */\n label?: string;\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport type HeatmapChartOptions = (HeatmapOptions & { layout?: undefined }) | CalendarHeatmapOptions;\nconst DAY = 86400000;\n/** Bound sparse inputs too: three leap years of daily observations. */\nexport const CALENDAR_MAX_DAYS = 1098;\nexport function calendarDay(value: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new RangeError(\"Calendar dates must be YYYY-MM-DD.\");\n const date = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) throw new RangeError(\"Invalid calendar date.\");\n return date.getTime();\n}\n/** Intl uses 1..7, JS dates use 0..6. Old engines use an explicit locale fallback. */\nexport function calendarWeekStart(locale = \"en\"): number {\n const info: Intl.Locale & { weekInfo?: { firstDay: number }; getWeekInfo?: () => { firstDay: number } } = new Intl.Locale(locale);\n const fallback: Record<string, number> = { \"en-US\": 0 };\n const key = `${info.language}-${info.region ?? info.maximize().region}`;\n return (info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay ?? fallback[key] ?? 1) % 7;\n}\nexport const calendarWords = (locale = \"en\") =>\n locale.split(\"-\")[0] === \"de\"\n ? { day: \"Tag\", less: \"weniger\", more: \"mehr\", moreIn: \"mehr rein\", moreOut: \"mehr raus\" }\n : { day: \"Day\", less: \"less\", more: \"more\", moreIn: \"more in\", moreOut: \"more out\" };\n/** Explicit fields avoid the engine-dependent dateStyle pattern. */\nconst calendarDateParts = (locale: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" });\n return (time: number) => Object.fromEntries(formatter.formatToParts(time).map((part) => [part.type, part.value]));\n};\nexport function calendarLayout(spec: CalendarHeatmapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const seen = new Set<string>();\n const dates = spec.data\n .map(([date, value], index) => {\n if (seen.has(date)) throw new RangeError(\"Calendar dates must be unique.\");\n seen.add(date);\n const time = calendarDay(date);\n if (value !== null && !Number.isNaN(value) && !Number.isFinite(value)) throw new RangeError(\"Calendar values must be finite.\");\n return { date, value, index, time };\n })\n .sort((a, b) => a.time - b.time);\n if (dates.length && (dates.at(-1)!.time - dates[0]!.time) / DAY >= CALENDAR_MAX_DAYS)\n throw new RangeError(\"Calendar span must not exceed three years.\");\n const points = dates.filter((p): p is typeof p & { value: number } => p.value !== null && Number.isFinite(p.value));\n const weekStart = calendarWeekStart(spec.locale);\n const first = dates[0]?.time ?? 0;\n const monday = first - ((new Date(first).getUTCDay() - weekStart + 7) % 7) * DAY;\n const weeks = dates.length ? Math.floor((dates.at(-1)!.time - monday) / DAY / 7) + 1 : 0;\n const headerHeight = renderHeader(size.width, spec.title, spec.subtitle).height;\n // Seven square rows use the available panel height. Wider calendars scroll rather than flattening their cells.\n const cell = Math.max(14, Math.floor((size.height - headerHeight - 32 - 20 - 18) / 7)),\n gap = 3,\n left = 32;\n const width = Math.max(spec.displayWidth ?? size.width, left + weeks * (cell + gap) + 4);\n const top = 32 + renderHeader(width, spec.title, spec.subtitle).height;\n const min = Math.min(...points.map((p) => p.value), 0),\n max = Math.max(...points.map((p) => p.value), 0);\n const absMax = Math.max(-min, max);\n return {\n width,\n height: size.height,\n minWidth: width,\n firstMonday: monday,\n weekStart,\n weeks,\n min,\n max,\n absMax,\n cell,\n cellWidth: cell,\n top,\n cells: points.map((p) => {\n const day = Math.round((p.time - monday) / DAY),\n week = Math.floor(day / 7),\n weekday = day % 7;\n const intensity = spec.scale === \"diverging\" ? Math.abs(p.value) / (absMax || 1) : (p.value - min) / (max - min || 1);\n const color =\n spec.scale === \"diverging\"\n ? p.value < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n return { ...p, week, weekday, x: left + week * (cell + gap), y: top + weekday * (cell + gap), intensity, color };\n }),\n };\n}\nconst paint = (color: string, intensity: number) =>\n `color-mix(in srgb,${color} ${12 + 88 * Math.sqrt(intensity)}%,var(--k2b-surface-muted,#f4f4f5))`;\nexport function renderCalendarSvg(spec: CalendarHeatmapOptions): string {\n const s = calendarLayout(spec),\n locale = spec.locale ?? \"en\",\n words = calendarWords(locale);\n const number = spec.format ?? new Intl.NumberFormat(locale, { maximumSignificantDigits: 15 }).format;\n const parts = calendarDateParts(locale);\n const weekday = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n const month = new Intl.DateTimeFormat(locale, { month: \"short\", timeZone: \"UTC\" });\n // Left aligned direct-core header; interactive hosts keep it at the visible scroll edge.\n const header = renderHeader(s.width, spec.title, spec.subtitle)\n .svg.replace(/x=\"[^\"]*\"/g, 'x=\"0\"')\n .replace(/text-anchor=\"middle\"/g, 'text-anchor=\"start\"')\n .replace(/<text /g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"12\" ');\n const body: string[] = [`<g style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\">${header}</g>`];\n const days: string[] = [\n `<g data-calendar-weekdays=\"true\" pointer-events=\"none\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><rect x=\"-1\" y=\"${s.top - 18}\" width=\"33\" height=\"${7 * (s.cell + 3) + 18}\" fill=\"var(--k2b-surface,#fff)\"/>`,\n ];\n for (const day of [0, 2, 4])\n days.push(\n `<text x=\"0\" y=\"${s.top + day * (s.cell + 3) + s.cell - 2}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(weekday.format(Date.UTC(2026, 0, 4 + s.weekStart + day)))}</text>`,\n );\n let lastRight = -Infinity,\n lastMonth = \"\";\n for (let week = 0; week < s.weeks; week++) {\n const time = s.firstMonday + week * 7 * DAY,\n next = time + 6 * DAY;\n const nextDate = new Date(next),\n ym = nextDate.toISOString().slice(0, 7);\n if (ym === lastMonth) continue;\n lastMonth = ym;\n const text = month.format(next);\n const textWidth = chartTextWidth(text, 11);\n const x = Math.min(s.width - textWidth - 2, Math.max(32 + week * (s.cell + 3), lastRight + 3));\n const visibility = `visibility:var(--k2b-calendar-month-${week},visible)`;\n // The year has its own row, so a partial first month cannot suppress the following month.\n if (week === 0 || nextDate.getUTCMonth() === 0)\n body.push(\n `<g style=\"${visibility}\"><text x=\"${x}\" y=\"${s.top - 24}\" font-size=\"10\" fill=\"var(--k2b-text-muted,#45454e)\">${nextDate.getUTCFullYear()}</text></g>`,\n );\n body.push(\n `<text data-calendar-month=\"${week}\" style=\"${visibility}\" x=\"${x}\" y=\"${s.top - 10}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(text)}</text>`,\n );\n lastRight = x + textWidth;\n }\n for (const c of s.cells) {\n const d = parts(c.time);\n const date = locale.startsWith(\"de\")\n ? `${d.day}. ${d.month} ${d.year}`\n : /^en(?:-US)?$/.test(locale)\n ? `${d.month} ${d.day}, ${d.year}`\n : `${d.day} ${d.month} ${d.year}`;\n const fill = spec.scale === \"diverging\" && c.value === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(c.color, c.intensity);\n const value =\n spec.scale === \"diverging\" && c.value !== 0\n ? `${number(Math.abs(c.value))} ${c.value < 0 ? words.moreOut : words.moreIn}`\n : number(c.value);\n body.push(\n chartDatumSvg(\n `<rect x=\"${c.x}\" y=\"${c.y}\" width=\"${s.cell}\" height=\"${s.cell}\" rx=\"2\" fill=\"${fill}\" stroke=\"none\"/>`,\n {\n role: \"cell\",\n index: c.index,\n label: `${d.weekday}, ${date}`,\n anchor: [c.x + s.cell / 2, c.y + s.cell / 2],\n grid: [c.week, c.weekday],\n values: [{ key: \"value\", value: c.value, formatted: value }],\n },\n spec.inspect,\n ),\n );\n }\n days.push(\"</g>\");\n body.push(days.join(\"\"));\n const legendY = s.top + 7 * (s.cell + 3) + 12;\n const start = spec.scale === \"diverging\" ? words.moreOut : words.less,\n end = spec.scale === \"diverging\" ? words.moreIn : words.more;\n const swatches = spec.scale === \"diverging\" ? [-1, -0.5, 0, 0.5, 1] : [0, 0.25, 0.5, 0.75, 1];\n const offset = 32 + start.length * 6 + 8;\n body.push(\n `<g data-calendar-legend=\"true\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><text x=\"32\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(start)}</text>`,\n );\n swatches.forEach((v, i) => {\n const color =\n spec.scale === \"diverging\"\n ? v < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n body.push(\n `<rect x=\"${offset + i * 14}\" y=\"${legendY - 10}\" width=\"11\" height=\"11\" rx=\"2\" fill=\"${spec.scale === \"diverging\" && v === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(color, Math.abs(v))}\"/>`,\n );\n });\n body.push(\n `<text x=\"${offset + swatches.length * 14 + 4}\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(end)}</text></g>`,\n );\n return svgRoot({ ...s, className: spec.className }, body.join(\"\")).replace(\n \"<svg \",\n `<svg data-calendar=\"true\" data-chart-min-width=\"${s.minWidth}\" `,\n );\n}\nexport const renderHeatmapSvg = (spec: HeatmapChartOptions): string =>\n spec.layout === \"calendar\" ? renderCalendarSvg(spec) : heatmap(spec);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
|
|
3
|
+
/** Labels needed by pure SVG renderers; UI inspection messages stay with the UI host. */
|
|
4
|
+
export const coreChartMessages = i18n.define({
|
|
5
|
+
baseLocale: "en",
|
|
6
|
+
messages: {
|
|
7
|
+
en: {
|
|
8
|
+
series: "Series",
|
|
9
|
+
areaTotal: "Total"
|
|
10
|
+
},
|
|
11
|
+
de: {
|
|
12
|
+
series: "Datenreihe",
|
|
13
|
+
areaTotal: "Zusammen"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=chart-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/chart-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\n/** Labels needed by pure SVG renderers; UI inspection messages stay with the UI host. */\nexport const coreChartMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: { series: \"Series\", areaTotal: \"Total\" },\n de: { series: \"Datenreihe\", areaTotal: \"Zusammen\" },\n },\n});\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;;AAElC;AACA,OAAO,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;EAC3C,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MAAE,MAAM,EAAE,QAAQ;MAAE,SAAS,EAAE;IAAQ,CAAC;IAC5C,EAAE,EAAE;MAAE,MAAM,EAAE,YAAY;MAAE,SAAS,EAAE;IAAW;EACpD;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { barSeriesLegend, chartTextWidth, headerHeight, wrapLabel } from "../../content/chart-bar";
|
|
2
|
+
import { chartMessages } from "../../content/chart-message-catalog";
|
|
3
|
+
import { extendDomainToNice, niceStep } from "./svg-renderers";
|
|
4
|
+
/** Stacks start at zero, group headings keep their first-appearance order. */
|
|
5
|
+
export function hbarLayout(spec, size = {
|
|
6
|
+
width: 480,
|
|
7
|
+
height: 280
|
|
8
|
+
}) {
|
|
9
|
+
if (spec.rows.some(row => row.values.length !== spec.series.length || row.values.some(v => v !== null && (!Number.isFinite(v) || v < 0)))) throw new RangeError("Horizontal bars require aligned nonnegative segment values");
|
|
10
|
+
const format = spec.valueFormat ?? String;
|
|
11
|
+
const labels = chartMessages.resolve([spec.locale ?? "en"]).t;
|
|
12
|
+
const groups = [...new Set(spec.rows.map(r => r.group))];
|
|
13
|
+
const totals = spec.rows.map(r => r.values.some(v => v !== null) ? r.values.reduce((sum, v) => sum + (v ?? 0), 0) : null);
|
|
14
|
+
const max = Math.max(0, ...totals.filter(v => v !== null));
|
|
15
|
+
const scale = extendDomainToNice(0, max || 1, niceStep(max || 1, 4));
|
|
16
|
+
const unit = size.width / 296;
|
|
17
|
+
const left = Math.min(104 * unit, size.width * 0.26);
|
|
18
|
+
const right = size.width - Math.max(52 * unit, ...totals.map(v => (chartTextWidth(v === null ? "–" : format(v)) + 8) * unit));
|
|
19
|
+
const legendLayout = barSeriesLegend(spec.series.map((label, i) => ({
|
|
20
|
+
label,
|
|
21
|
+
data: spec.rows.map(r => r.values[i] ?? null)
|
|
22
|
+
})), format, size.width, 296, 70 // One legend budget even when rows grow the initial 280-unit drawing.
|
|
23
|
+
);
|
|
24
|
+
const legend = {
|
|
25
|
+
...legendLayout,
|
|
26
|
+
items: legendLayout.items.map(entry => ({
|
|
27
|
+
...entry,
|
|
28
|
+
valueText: entry.total === null ? "–" : format(entry.total),
|
|
29
|
+
text: wrapLabel(entry.label, entry.labelWidth, 1).lines[0] ?? entry.label
|
|
30
|
+
}))
|
|
31
|
+
};
|
|
32
|
+
const header = headerHeight({
|
|
33
|
+
title: spec.title,
|
|
34
|
+
subtitle: spec.subtitle
|
|
35
|
+
});
|
|
36
|
+
const top = header + (spec.legend === false ? 0 : legend.height);
|
|
37
|
+
const groupHeight = 20;
|
|
38
|
+
const pitch = Math.max(32, (size.height - top - 24 - groups.filter(g => g !== undefined).length * groupHeight) / Math.max(1, spec.rows.length));
|
|
39
|
+
const x = v => left + v / scale.domain[1] * (right - left);
|
|
40
|
+
let y = top;
|
|
41
|
+
const rows = groups.flatMap(group => {
|
|
42
|
+
if (group !== undefined) y += groupHeight;
|
|
43
|
+
let first = true;
|
|
44
|
+
return spec.rows.flatMap((row, index) => {
|
|
45
|
+
if (row.group !== group) return [];
|
|
46
|
+
const groupHeading = first ? group : undefined;
|
|
47
|
+
first = false;
|
|
48
|
+
const center = y + pitch / 2;
|
|
49
|
+
y += pitch;
|
|
50
|
+
let acc = 0;
|
|
51
|
+
const segments = row.values.map((value, seriesIndex) => {
|
|
52
|
+
const start = acc;
|
|
53
|
+
acc += value ?? 0;
|
|
54
|
+
const width = x(acc) - x(start);
|
|
55
|
+
const label = value === null ? "–" : format(value);
|
|
56
|
+
return {
|
|
57
|
+
value,
|
|
58
|
+
seriesIndex,
|
|
59
|
+
x: x(start),
|
|
60
|
+
width,
|
|
61
|
+
label,
|
|
62
|
+
showLabel: width / unit > chartTextWidth(label) + 10
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
const labelLines = wrapLabel(row.label, Math.max(8, left / unit - 8), 2).lines;
|
|
66
|
+
const total = totals[index];
|
|
67
|
+
const valueText = total === null ? "–" : format(total);
|
|
68
|
+
const datum = {
|
|
69
|
+
role: "item",
|
|
70
|
+
index,
|
|
71
|
+
label: [row.label, row.group].filter(Boolean).join(" · "),
|
|
72
|
+
anchor: [x(total ?? 0) + 4, center],
|
|
73
|
+
values: [...row.values.map((v, i) => ({
|
|
74
|
+
key: `series:${i}`,
|
|
75
|
+
value: v ?? "–",
|
|
76
|
+
formatted: v === null ? "–" : format(v)
|
|
77
|
+
})), {
|
|
78
|
+
key: "total",
|
|
79
|
+
value: total ?? "–",
|
|
80
|
+
formatted: valueText
|
|
81
|
+
}]
|
|
82
|
+
};
|
|
83
|
+
const title = [row.label, row.group, ...row.values.map((v, i) => `${spec.series[i]}: ${v === null ? "–" : format(v)}`), `${labels.chartFields({
|
|
84
|
+
key: "total"
|
|
85
|
+
})}: ${valueText}`].filter(Boolean).join(" · ");
|
|
86
|
+
return [{
|
|
87
|
+
...row,
|
|
88
|
+
labelLines,
|
|
89
|
+
groupHeading,
|
|
90
|
+
index,
|
|
91
|
+
center,
|
|
92
|
+
segments,
|
|
93
|
+
total,
|
|
94
|
+
valueText,
|
|
95
|
+
datum,
|
|
96
|
+
title,
|
|
97
|
+
groupY: center - pitch / 2 - groupHeight
|
|
98
|
+
}];
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
...size,
|
|
103
|
+
header,
|
|
104
|
+
height: Math.max(size.height, y + 24),
|
|
105
|
+
top,
|
|
106
|
+
left,
|
|
107
|
+
right,
|
|
108
|
+
rows,
|
|
109
|
+
groups,
|
|
110
|
+
pitch,
|
|
111
|
+
x,
|
|
112
|
+
scale,
|
|
113
|
+
format,
|
|
114
|
+
unit,
|
|
115
|
+
legend
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=hbar-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/hbar-layout.ts"],"sourcesContent":["import { barSeriesLegend, chartTextWidth, headerHeight, wrapLabel } from \"../../content/chart-bar\";\nimport { chartMessages } from \"../../content/chart-message-catalog\";\nimport { extendDomainToNice, niceStep } from \"./svg-renderers\";\nimport type { ChartDatum } from \"./types\";\n\nexport type HorizontalBarOptions = {\n series: string[];\n rows: { group?: string; label: string; values: (number | null)[] }[];\n valueFormat?: (value: number) => string;\n legend?: boolean;\n title?: string;\n subtitle?: string;\n locale?: string;\n className?: string;\n};\n\n/** Stacks start at zero, group headings keep their first-appearance order. */\nexport function hbarLayout(spec: HorizontalBarOptions, size = { width: 480, height: 280 }) {\n if (\n spec.rows.some(\n (row) => row.values.length !== spec.series.length || row.values.some((v) => v !== null && (!Number.isFinite(v) || v < 0)),\n )\n )\n throw new RangeError(\"Horizontal bars require aligned nonnegative segment values\");\n const format = spec.valueFormat ?? String;\n const labels = chartMessages.resolve([spec.locale ?? \"en\"]).t;\n const groups = [...new Set(spec.rows.map((r) => r.group))];\n const totals = spec.rows.map((r) => (r.values.some((v) => v !== null) ? r.values.reduce<number>((sum, v) => sum + (v ?? 0), 0) : null));\n const max = Math.max(0, ...totals.filter((v): v is number => v !== null));\n const scale = extendDomainToNice(0, max || 1, niceStep(max || 1, 4));\n const unit = size.width / 296;\n const left = Math.min(104 * unit, size.width * 0.26);\n const right = size.width - Math.max(52 * unit, ...totals.map((v) => (chartTextWidth(v === null ? \"–\" : format(v)) + 8) * unit));\n const legendLayout = barSeriesLegend(\n spec.series.map((label, i) => ({ label, data: spec.rows.map((r) => r.values[i] ?? null) })),\n format,\n size.width,\n 296,\n 70, // One legend budget even when rows grow the initial 280-unit drawing.\n );\n const legend = {\n ...legendLayout,\n items: legendLayout.items.map((entry) => ({\n ...entry,\n valueText: entry.total === null ? \"–\" : format(entry.total),\n text: wrapLabel(entry.label, entry.labelWidth, 1).lines[0] ?? entry.label,\n })),\n };\n const header = headerHeight({ title: spec.title, subtitle: spec.subtitle });\n const top = header + (spec.legend === false ? 0 : legend.height);\n const groupHeight = 20;\n const pitch = Math.max(\n 32,\n (size.height - top - 24 - groups.filter((g) => g !== undefined).length * groupHeight) / Math.max(1, spec.rows.length),\n );\n const x = (v: number) => left + (v / scale.domain[1]) * (right - left);\n let y = top;\n const rows = groups.flatMap((group) => {\n if (group !== undefined) y += groupHeight;\n let first = true;\n return spec.rows.flatMap((row, index) => {\n if (row.group !== group) return [];\n const groupHeading = first ? group : undefined;\n first = false;\n const center = y + pitch / 2;\n y += pitch;\n let acc = 0;\n const segments = row.values.map((value, seriesIndex) => {\n const start = acc;\n acc += value ?? 0;\n const width = x(acc) - x(start);\n const label = value === null ? \"–\" : format(value);\n return { value, seriesIndex, x: x(start), width, label, showLabel: width / unit > chartTextWidth(label) + 10 };\n });\n const labelLines = wrapLabel(row.label, Math.max(8, left / unit - 8), 2).lines;\n const total = totals[index]!;\n const valueText = total === null ? \"–\" : format(total);\n const datum: ChartDatum = {\n role: \"item\",\n index,\n label: [row.label, row.group].filter(Boolean).join(\" · \"),\n anchor: [x(total ?? 0) + 4, center],\n values: [\n ...row.values.map((v, i) => ({ key: `series:${i}`, value: v ?? \"–\", formatted: v === null ? \"–\" : format(v) })),\n { key: \"total\", value: total ?? \"–\", formatted: valueText },\n ],\n };\n const title = [\n row.label,\n row.group,\n ...row.values.map((v, i) => `${spec.series[i]}: ${v === null ? \"–\" : format(v)}`),\n `${labels.chartFields({ key: \"total\" })}: ${valueText}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n return [\n {\n ...row,\n labelLines,\n groupHeading,\n index,\n center,\n segments,\n total,\n valueText,\n datum,\n title,\n groupY: center - pitch / 2 - groupHeight,\n },\n ];\n });\n });\n return { ...size, header, height: Math.max(size.height, y + 24), top, left, right, rows, groups, pitch, x, scale, format, unit, legend };\n}\n\nexport type HorizontalBarLayout = ReturnType<typeof hbarLayout>;\n"],"mappings":"AAAA,SAAS,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,QAAQ,yBAAyB;AAClG,SAAS,aAAa,QAAQ,qCAAqC;AACnE,SAAS,kBAAkB,EAAE,QAAQ,QAAQ,iBAAiB;AAc9D;AACA,OAAO,SAAS,UAAU,CAAC,IAA0B,EAAE,IAAI,GAAG;EAAE,KAAK,EAAE,GAAG;EAAE,MAAM,EAAE;AAAI,CAAC,EAAE;EACzF,IACE,IAAI,CAAC,IAAI,CAAC,IAAI,CACX,GAAG,IAAK,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAC1H,CAAC,EAED,MAAM,IAAI,UAAU,CAAC,4DAA4D,CAAC;EACpF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM;EACzC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;EAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;EAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC,IAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAS,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAK,CAAC;EACvI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC,IAAkB,CAAC,KAAK,IAAI,CAAC,CAAC;EACzE,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;EACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG;EAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;EACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAE,CAAC,IAAK,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;EAC/H,MAAM,YAAY,GAAG,eAAe,CAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM;IAAE,KAAK;IAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;EAAE,CAAC,CAAC,CAAC,EAC3F,MAAM,EACN,IAAI,CAAC,KAAK,EACV,GAAG,EACH,EAAE,CAAE;EACN,CAAC;EACD,MAAM,MAAM,GAAG;IACb,GAAG,YAAY;IACf,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAE,KAAK,KAAM;MACxC,GAAG,KAAK;MACR,SAAS,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;MAC3D,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACtE,CAAC,CAAC;EACJ,CAAC;EACD,MAAM,MAAM,GAAG,YAAY,CAAC;IAAE,KAAK,EAAE,IAAI,CAAC,KAAK;IAAE,QAAQ,EAAE,IAAI,CAAC;EAAS,CAAC,CAAC;EAC3E,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;EAChE,MAAM,WAAW,GAAG,EAAE;EACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,EAAE,EACF,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC,IAAK,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,GAAG,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CACtH,CAAC;EACD,MAAM,CAAC,GAAI,CAAS,IAAK,IAAI,GAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAK,KAAK,GAAG,IAAI,CAAC;EACtE,IAAI,CAAC,GAAG,GAAG;EACX,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAE,KAAK,IAAK;IACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC,IAAI,WAAW;IACzC,IAAI,KAAK,GAAG,IAAI;IAChB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK;MACvC,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,OAAO,EAAE;MAClC,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS;MAC9C,KAAK,GAAG,KAAK;MACb,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;MAC5B,CAAC,IAAI,KAAK;MACV,IAAI,GAAG,GAAG,CAAC;MACX,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK;QACtD,MAAM,KAAK,GAAG,GAAG;QACjB,GAAG,IAAI,KAAK,IAAI,CAAC;QACjB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QAClD,OAAO;UAAE,KAAK;UAAE,WAAW;UAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;UAAE,KAAK;UAAE,KAAK;UAAE,SAAS,EAAE,KAAK,GAAG,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;QAAG,CAAC;MAChH,CAAC,CAAC;MACF,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;MAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAE;MAC5B,MAAM,SAAS,GAAG,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;MACtD,MAAM,KAAiB,GAAG;QACxB,IAAI,EAAE,MAAM;QACZ,KAAK;QACL,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACzD,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACnC,MAAM,EAAE,CACN,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM;UAAE,GAAG,EAAE,UAAU,CAAC,EAAE;UAAE,KAAK,EAAE,CAAC,IAAI,GAAG;UAAE,SAAS,EAAE,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC;QAAE,CAAC,CAAC,CAAC,EAC/G;UAAE,GAAG,EAAE,OAAO;UAAE,KAAK,EAAE,KAAK,IAAI,GAAG;UAAE,SAAS,EAAE;QAAU,CAAC;MAE/D,CAAC;MACD,MAAM,KAAK,GAAG,CACZ,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,KAAK,EACT,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EACjF,GAAG,MAAM,CAAC,WAAW,CAAC;QAAE,GAAG,EAAE;MAAQ,CAAC,CAAC,KAAK,SAAS,EAAE,CACxD,CACE,MAAM,CAAC,OAAO,CAAC,CACf,IAAI,CAAC,KAAK,CAAC;MACd,OAAO,CACL;QACE,GAAG,GAAG;QACN,UAAU;QACV,YAAY;QACZ,KAAK;QACL,MAAM;QACN,QAAQ;QACR,KAAK;QACL,SAAS;QACT,KAAK;QACL,KAAK;QACL,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG;MAC/B,CAAC,CACF;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,OAAO;IAAE,GAAG,IAAI;IAAE,MAAM;IAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IAAE,GAAG;IAAE,IAAI;IAAE,KAAK;IAAE,IAAI;IAAE,MAAM;IAAE,KAAK;IAAE,CAAC;IAAE,KAAK;IAAE,MAAM;IAAE,IAAI;IAAE;EAAO,CAAC;AAC1I","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { hbarLayout } from "./hbar-layout";
|
|
2
|
+
import { chartDatumSvg, escapeXml, renderHeader, svgRoot } from "./svg-renderers";
|
|
3
|
+
export { hbarLayout } from "./hbar-layout";
|
|
4
|
+
export function renderHbarSvg(spec) {
|
|
5
|
+
return renderHbarLayoutSvg(spec, hbarLayout(spec, spec));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Draw an already prepared layout; lazy hosts reuse the geometry reserved before loading. */
|
|
9
|
+
export function renderHbarLayoutSvg(spec, g) {
|
|
10
|
+
const text = (x, y, value, anchor = "start", extra = "", attrs = 'class="stdlib-chart-tick-label"') => `<text ${attrs} x="${x}" y="${y}" text-anchor="${anchor}" ${extra}>${escapeXml(value)}</text>`;
|
|
11
|
+
const parts = [renderHeader(spec.width, spec.title, spec.subtitle).svg];
|
|
12
|
+
const header = g.header;
|
|
13
|
+
if (spec.legend !== false) g.legend.items.forEach((entry, i) => {
|
|
14
|
+
const y = header + entry.y;
|
|
15
|
+
parts.push(`<rect class="stdlib-chart-series-${i % 8}" x="${entry.x}" y="${y - 8}" width="${8 * g.unit}" height="8"/>`, text(entry.x + 14 * g.unit, y, entry.text), text(entry.valueX, y, entry.valueText, "end", `data-chart-legend-value data-field="series:${i}" data-default="${escapeXml(entry.valueText)}"`));
|
|
16
|
+
});
|
|
17
|
+
if (spec.legend !== false && g.legend.hidden) parts.push(text(0, header + g.legend.height - 8, `+${g.legend.hidden}`));
|
|
18
|
+
for (const tick of g.scale.ticks) parts.push(`<line class="stdlib-chart-grid" x1="${g.x(tick)}" x2="${g.x(tick)}" y1="${g.top}" y2="${g.height - 24}"/>`, text(g.x(tick), g.height - 5, g.format(tick), "middle"));
|
|
19
|
+
for (const row of g.rows) {
|
|
20
|
+
if (row.groupHeading !== undefined) {
|
|
21
|
+
parts.push(text(0, row.groupY + 14, row.groupHeading, "start", "", 'class="k2b-chart-group-heading" font-size="11.5" font-weight="600" fill="currentColor"'));
|
|
22
|
+
}
|
|
23
|
+
const height = Math.min(26, g.pitch * 0.74);
|
|
24
|
+
const marks = [`<rect class="k2b-chart-category-band" fill="none" pointer-events="all" x="0" y="${row.center - g.pitch / 2}" width="${spec.width}" height="${g.pitch}" rx="6"/>`];
|
|
25
|
+
for (const segment of row.segments) {
|
|
26
|
+
if (segment.value === null) continue;
|
|
27
|
+
marks.push(`<rect class="stdlib-chart-bar stdlib-chart-series-${segment.seriesIndex % 8}" x="${segment.x}" y="${row.center - height / 2}" width="${Math.max(segment.width / 2, segment.width - 1.5)}" height="${height}" rx="3" stroke="none" stroke-width="0" style="fill:var(--stdlib-chart-c${segment.seriesIndex % 8 + 1},#3b82f6);fill-opacity:.18"/>`);
|
|
28
|
+
if (segment.showLabel) marks.push(text(segment.x + segment.width / 2, row.center + 4, segment.label, "middle", "", 'class="k2b-chart-segment-value" font-size="11" font-weight="500" fill="currentColor"'));
|
|
29
|
+
}
|
|
30
|
+
parts.push(chartDatumSvg(marks.join(""), row.datum, spec.inspect ?? false, row.title));
|
|
31
|
+
row.labelLines.forEach((line, i) => parts.push(text(g.left - 8 * g.unit, row.center + 4 + (row.labelLines.length > 1 ? i === 0 ? -6.5 : 6.5 : 0), line, "end")));
|
|
32
|
+
parts.push(text(g.x(row.total ?? 0) + 6 * g.unit, row.center + 4, row.valueText));
|
|
33
|
+
}
|
|
34
|
+
return svgRoot({
|
|
35
|
+
...spec,
|
|
36
|
+
height: g.height
|
|
37
|
+
}, parts.join("")).replace("<svg ", '<svg data-bar-layout="rows" ');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/hbar.ts"],"sourcesContent":["import { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout } from \"./hbar-layout\";\nimport { chartDatumSvg, escapeXml, renderHeader, svgRoot } from \"./svg-renderers\";\n\nexport { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout } from \"./hbar-layout\";\n\nexport function renderHbarSvg(spec: HorizontalBarOptions & { width: number; height: number; inspect?: boolean }) {\n return renderHbarLayoutSvg(spec, hbarLayout(spec, spec));\n}\n\n/** Draw an already prepared layout; lazy hosts reuse the geometry reserved before loading. */\nexport function renderHbarLayoutSvg(\n spec: HorizontalBarOptions & { width: number; height: number; inspect?: boolean },\n g: HorizontalBarLayout,\n) {\n const text = (x: number, y: number, value: string, anchor = \"start\", extra = \"\", attrs = 'class=\"stdlib-chart-tick-label\"') =>\n `<text ${attrs} x=\"${x}\" y=\"${y}\" text-anchor=\"${anchor}\" ${extra}>${escapeXml(value)}</text>`;\n const parts: string[] = [renderHeader(spec.width, spec.title, spec.subtitle).svg];\n const header = g.header;\n if (spec.legend !== false)\n g.legend.items.forEach((entry, i) => {\n const y = header + entry.y;\n parts.push(\n `<rect class=\"stdlib-chart-series-${i % 8}\" x=\"${entry.x}\" y=\"${y - 8}\" width=\"${8 * g.unit}\" height=\"8\"/>`,\n text(entry.x + 14 * g.unit, y, entry.text),\n text(\n entry.valueX,\n y,\n entry.valueText,\n \"end\",\n `data-chart-legend-value data-field=\"series:${i}\" data-default=\"${escapeXml(entry.valueText)}\"`,\n ),\n );\n });\n if (spec.legend !== false && g.legend.hidden) parts.push(text(0, header + g.legend.height - 8, `+${g.legend.hidden}`));\n for (const tick of g.scale.ticks)\n parts.push(\n `<line class=\"stdlib-chart-grid\" x1=\"${g.x(tick)}\" x2=\"${g.x(tick)}\" y1=\"${g.top}\" y2=\"${g.height - 24}\"/>`,\n text(g.x(tick), g.height - 5, g.format(tick), \"middle\"),\n );\n for (const row of g.rows) {\n if (row.groupHeading !== undefined) {\n parts.push(\n text(\n 0,\n row.groupY + 14,\n row.groupHeading,\n \"start\",\n \"\",\n 'class=\"k2b-chart-group-heading\" font-size=\"11.5\" font-weight=\"600\" fill=\"currentColor\"',\n ),\n );\n }\n const height = Math.min(26, g.pitch * 0.74);\n const marks = [\n `<rect class=\"k2b-chart-category-band\" fill=\"none\" pointer-events=\"all\" x=\"0\" y=\"${row.center - g.pitch / 2}\" width=\"${spec.width}\" height=\"${g.pitch}\" rx=\"6\"/>`,\n ];\n for (const segment of row.segments) {\n if (segment.value === null) continue;\n marks.push(\n `<rect class=\"stdlib-chart-bar stdlib-chart-series-${segment.seriesIndex % 8}\" x=\"${segment.x}\" y=\"${row.center - height / 2}\" width=\"${Math.max(segment.width / 2, segment.width - 1.5)}\" height=\"${height}\" rx=\"3\" stroke=\"none\" stroke-width=\"0\" style=\"fill:var(--stdlib-chart-c${(segment.seriesIndex % 8) + 1},#3b82f6);fill-opacity:.18\"/>`,\n );\n if (segment.showLabel)\n marks.push(\n text(\n segment.x + segment.width / 2,\n row.center + 4,\n segment.label,\n \"middle\",\n \"\",\n 'class=\"k2b-chart-segment-value\" font-size=\"11\" font-weight=\"500\" fill=\"currentColor\"',\n ),\n );\n }\n parts.push(chartDatumSvg(marks.join(\"\"), row.datum, spec.inspect ?? false, row.title));\n row.labelLines.forEach((line, i) =>\n parts.push(text(g.left - 8 * g.unit, row.center + 4 + (row.labelLines.length > 1 ? (i === 0 ? -6.5 : 6.5) : 0), line, \"end\")),\n );\n parts.push(text(g.x(row.total ?? 0) + 6 * g.unit, row.center + 4, row.valueText));\n }\n return svgRoot({ ...spec, height: g.height }, parts.join(\"\")).replace(\"<svg \", '<svg data-bar-layout=\"rows\" ');\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
/** Portable chart contracts. This entry never imports Solid or browser APIs. */
|
|
2
2
|
|
|
3
|
-
export { barChartLayout, renderBarChartSvg } from "../../content/chart-bar";
|
|
3
|
+
export { barChartLayout, renderBarChartSvg, seriesBarLayout } from "../../content/chart-bar";
|
|
4
4
|
export { renderStateTimelineSvg, stateTimelineDomain, stateTimelineHeight } from "../../content/chart-state-timeline";
|
|
5
5
|
export { areaLayout, renderAreaSvg } from "./area";
|
|
6
6
|
export * from "./calendar";
|
|
7
|
+
export { hbarLayout, renderHbarLayoutSvg, renderHbarSvg } from "./hbar";
|
|
7
8
|
export * from "./inspection";
|
|
9
|
+
export { map } from "./map";
|
|
8
10
|
export * from "./render";
|
|
11
|
+
export { chartRenderHeight, preservesAspectRatio } from "./render-size";
|
|
9
12
|
export * from "./snapshot";
|
|
10
|
-
export {
|
|
13
|
+
export { charts } from "./svg";
|
|
14
|
+
export { arcPathD, autoBin, bar, barGauge, boxplot, chartDatumSvg, computeBoxStats, computeDomain, donut, escapeXml, extendDomainToNice, gauge, heatmap, histogram, line, linearRegression, linePathD, mapLog, mapRange, markerPath, niceLogTicks, niceStep, normalizePadding, pie, scatter, smoothPathD, sparkline, stat, stateTimeline, stepPathD, svgRoot } from "./svg-renderers";
|
|
11
15
|
export { chartDatumRoles } from "./types";
|
|
16
|
+
export { renderWaterfallLayoutSvg, renderWaterfallSvg, waterfallLayout } from "./waterfall";
|
|
12
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts/core/index.ts"],"sourcesContent":["/** Portable chart contracts. This entry never imports Solid or browser APIs. */\n\nexport { type BarChartOptions, barChartLayout, renderBarChartSvg } from \"../../content/chart-bar\";\nexport {\n renderStateTimelineSvg,\n type StateTimelineChartOptions,\n type StateTimelineDomain,\n stateTimelineDomain,\n stateTimelineHeight,\n} from \"../../content/chart-state-timeline\";\nexport { type ChartTimeAxis } from \"../../content/chart-time-axis\";\nexport { type AreaOptions, areaLayout, renderAreaSvg } from \"./area\";\nexport * from \"./calendar\";\nexport * from \"./inspection\";\nexport * from \"./render\";\nexport * from \"./snapshot\";\nexport {\n type AxisOptions,\n arcPathD,\n autoBin,\n type BarItem,\n bar,\n barGauge,\n boxplot,\n type ChartOptions,\n chartDatumSvg,\n
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/index.ts"],"sourcesContent":["/** Portable chart contracts. This entry never imports Solid or browser APIs. */\n\nexport { type BarChartLayout, type BarChartOptions, barChartLayout, renderBarChartSvg, seriesBarLayout } from \"../../content/chart-bar\";\nexport {\n renderStateTimelineSvg,\n type StateTimelineChartOptions,\n type StateTimelineDomain,\n stateTimelineDomain,\n stateTimelineHeight,\n} from \"../../content/chart-state-timeline\";\nexport { type ChartTimeAxis } from \"../../content/chart-time-axis\";\nexport { type AreaOptions, areaLayout, renderAreaSvg } from \"./area\";\nexport * from \"./calendar\";\nexport { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout, renderHbarLayoutSvg, renderHbarSvg } from \"./hbar\";\nexport * from \"./inspection\";\nexport { map } from \"./map\";\nexport * from \"./render\";\nexport { chartRenderHeight, preservesAspectRatio } from \"./render-size\";\nexport * from \"./snapshot\";\nexport { charts } from \"./svg\";\nexport {\n type AxisOptions,\n arcPathD,\n autoBin,\n type BarItem,\n bar,\n barGauge,\n boxplot,\n type ChartOptions,\n chartDatumSvg,\n computeBoxStats,\n computeDomain,\n donut,\n escapeXml,\n extendDomainToNice,\n gauge,\n heatmap,\n histogram,\n type LineStyle,\n line,\n linearRegression,\n linePathD,\n type MapOptions,\n type MapPoint,\n type MapSeries,\n type MapViewport,\n type MarkerShape,\n mapLog,\n mapRange,\n markerPath,\n niceLogTicks,\n niceStep,\n normalizePadding,\n type Padding,\n type Point,\n pie,\n type ReferenceLine,\n type Series,\n type SliceItem,\n scatter,\n smoothPathD,\n sparkline,\n stat,\n stateTimeline,\n stepPathD,\n svgRoot,\n} from \"./svg-renderers\";\nexport {\n type ChartDateFormat,\n type ChartDatum,\n type ChartDatumRole,\n type ChartFormat,\n type ChartKind,\n type ChartNumberFormat,\n chartDatumRoles,\n} from \"./types\";\n\nexport { renderWaterfallLayoutSvg, renderWaterfallSvg, type WaterfallLayout, type WaterfallOptions, waterfallLayout } from \"./waterfall\";\n"],"mappings":"AAAA;;AAEA,SAAoD,cAAc,EAAE,iBAAiB,EAAE,eAAe,QAAQ,yBAAyB;AACvI,SACE,sBAAsB,EAGtB,mBAAmB,EACnB,mBAAmB,QACd,oCAAoC;AAE3C,SAA2B,UAAU,EAAE,aAAa,QAAQ,QAAQ;AACpE,cAAc,YAAY;AAC1B,SAA8D,UAAU,EAAE,mBAAmB,EAAE,aAAa,QAAQ,QAAQ;AAC5H,cAAc,cAAc;AAC5B,SAAS,GAAG,QAAQ,OAAO;AAC3B,cAAc,UAAU;AACxB,SAAS,iBAAiB,EAAE,oBAAoB,QAAQ,eAAe;AACvE,cAAc,YAAY;AAC1B,SAAS,MAAM,QAAQ,OAAO;AAC9B,SAEE,QAAQ,EACR,OAAO,EAEP,GAAG,EACH,QAAQ,EACR,OAAO,EAEP,aAAa,EACb,eAAe,EACf,aAAa,EACb,KAAK,EACL,SAAS,EACT,kBAAkB,EAClB,KAAK,EACL,OAAO,EACP,SAAS,EAET,IAAI,EACJ,gBAAgB,EAChB,SAAS,EAMT,MAAM,EACN,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAGhB,GAAG,EAIH,OAAO,EACP,WAAW,EACX,SAAS,EACT,IAAI,EACJ,aAAa,EACb,SAAS,EACT,OAAO,QACF,iBAAiB;AACxB,SAOE,eAAe,QACV,SAAS;AAEhB,SAAS,wBAAwB,EAAE,kBAAkB,EAA+C,eAAe,QAAQ,aAAa","ignoreList":[]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { WORLD_LAND_PATH, WORLD_MAP_HEIGHT, WORLD_MAP_WIDTH } from "./chart-map-data";
|
|
2
|
+
import { chartDatumSvg, clamp, computePlotArea, escapeXml, fmt, mapRange, measureLegendHeight, normalizePadding, renderHeader, renderLegend, svgRoot } from "./svg-renderers";
|
|
3
|
+
const isMapPoint = point => Number.isFinite(point.latitude) && Number.isFinite(point.longitude) && point.latitude >= -90 && point.latitude <= 90 && point.longitude >= -180 && point.longitude <= 180;
|
|
4
|
+
const MAP_MIN_ZOOM = 0;
|
|
5
|
+
const MAP_MAX_ZOOM = 5;
|
|
6
|
+
const normalizeMapViewport = viewport => {
|
|
7
|
+
const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MAP_MIN_ZOOM, MAP_MIN_ZOOM, MAP_MAX_ZOOM);
|
|
8
|
+
const zoomScale = 2 ** zoom;
|
|
9
|
+
const latitudeLimit = 90 - 90 / zoomScale;
|
|
10
|
+
const longitudeLimit = 180 - 180 / zoomScale;
|
|
11
|
+
return {
|
|
12
|
+
latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),
|
|
13
|
+
longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),
|
|
14
|
+
zoom
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** Render geographic point series over a dependency-free world land map. */
|
|
19
|
+
export function map(opts) {
|
|
20
|
+
const width = opts.width ?? 640;
|
|
21
|
+
const height = opts.height ?? 340;
|
|
22
|
+
const padding = normalizePadding(opts.padding ?? {
|
|
23
|
+
top: 12,
|
|
24
|
+
right: 16,
|
|
25
|
+
bottom: 12,
|
|
26
|
+
left: 16
|
|
27
|
+
});
|
|
28
|
+
const header = renderHeader(width, opts.title, opts.subtitle);
|
|
29
|
+
const legendItems = opts.legend ? opts.series.map((series, index) => ({
|
|
30
|
+
label: series.label && series.label.length > 0 ? series.label : `Series ${index + 1}`,
|
|
31
|
+
seriesIndex: index
|
|
32
|
+
})) : [];
|
|
33
|
+
const legendHeight = measureLegendHeight(legendItems, width);
|
|
34
|
+
const area = computePlotArea(width, height, padding, false, false, header.height, legendHeight);
|
|
35
|
+
const availableWidth = Math.max(0, area.x1 - area.x0);
|
|
36
|
+
const availableHeight = Math.max(0, area.y1 - area.y0);
|
|
37
|
+
const scale = Math.max(0, Math.min(availableWidth / WORLD_MAP_WIDTH, availableHeight / WORLD_MAP_HEIGHT));
|
|
38
|
+
const mapWidth = WORLD_MAP_WIDTH * scale;
|
|
39
|
+
const mapHeight = WORLD_MAP_HEIGHT * scale;
|
|
40
|
+
const mapX = area.x0 + (availableWidth - mapWidth) / 2;
|
|
41
|
+
const mapY = area.y0 + (availableHeight - mapHeight) / 2;
|
|
42
|
+
const viewport = normalizeMapViewport(opts.viewport);
|
|
43
|
+
const zoomScale = 2 ** viewport.zoom;
|
|
44
|
+
const projectedScale = scale * zoomScale;
|
|
45
|
+
const centerWorldX = (viewport.longitude + 180) / 360 * WORLD_MAP_WIDTH;
|
|
46
|
+
const centerWorldY = (90 - viewport.latitude) / 180 * WORLD_MAP_HEIGHT;
|
|
47
|
+
const finitePoints = opts.series.flatMap((series, seriesIndex) => series.data.map((point, index) => ({
|
|
48
|
+
point,
|
|
49
|
+
seriesIndex,
|
|
50
|
+
index
|
|
51
|
+
})).filter(({
|
|
52
|
+
point
|
|
53
|
+
}) => isMapPoint(point)));
|
|
54
|
+
let sizeMin = Number.POSITIVE_INFINITY;
|
|
55
|
+
let sizeMax = Number.NEGATIVE_INFINITY;
|
|
56
|
+
for (const {
|
|
57
|
+
point
|
|
58
|
+
} of finitePoints) {
|
|
59
|
+
if (typeof point.size !== "number" || !Number.isFinite(point.size) || point.size < 0) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (point.size < sizeMin) sizeMin = point.size;
|
|
63
|
+
if (point.size > sizeMax) sizeMax = point.size;
|
|
64
|
+
}
|
|
65
|
+
const hasSizes = Number.isFinite(sizeMin) && Number.isFinite(sizeMax);
|
|
66
|
+
const requestedSizeRange = opts.sizeRange ?? [3, 12];
|
|
67
|
+
const firstRadius = Number.isFinite(requestedSizeRange[0]) ? Math.max(0, requestedSizeRange[0]) : 3;
|
|
68
|
+
const secondRadius = Number.isFinite(requestedSizeRange[1]) ? Math.max(0, requestedSizeRange[1]) : 12;
|
|
69
|
+
const radiusRange = firstRadius <= secondRadius ? [firstRadius, secondRadius] : [secondRadius, firstRadius];
|
|
70
|
+
const body = [header.svg];
|
|
71
|
+
if (scale > 0) {
|
|
72
|
+
body.push(`<svg class="stdlib-chart-map-viewport" x="${fmt(mapX)}" y="${fmt(mapY)}" width="${fmt(mapWidth)}" height="${fmt(mapHeight)}" viewBox="0 0 ${fmt(mapWidth)} ${fmt(mapHeight)}" overflow="hidden">`, `<path class="stdlib-chart-map-land" fill-rule="evenodd" transform="translate(${fmt(mapWidth / 2)} ${fmt(mapHeight / 2)}) scale(${fmt(projectedScale)}) translate(${fmt(-centerWorldX)} ${fmt(-centerWorldY)})" d="${WORLD_LAND_PATH}"/>`);
|
|
73
|
+
for (const {
|
|
74
|
+
point,
|
|
75
|
+
seriesIndex,
|
|
76
|
+
index
|
|
77
|
+
} of finitePoints) {
|
|
78
|
+
const pointWorldX = (point.longitude + 180) / 360 * WORLD_MAP_WIDTH;
|
|
79
|
+
const pointWorldY = (90 - point.latitude) / 180 * WORLD_MAP_HEIGHT;
|
|
80
|
+
const x = mapWidth / 2 + (pointWorldX - centerWorldX) * projectedScale;
|
|
81
|
+
const y = mapHeight / 2 + (pointWorldY - centerWorldY) * projectedScale;
|
|
82
|
+
const radius = hasSizes && typeof point.size === "number" && Number.isFinite(point.size) && point.size >= 0 ? sizeMin === sizeMax ? (radiusRange[0] + radiusRange[1]) / 2 : mapRange(point.size, [sizeMin, sizeMax], radiusRange) : 4;
|
|
83
|
+
const title = point.label && point.label.length > 0 ? `<title>${escapeXml(point.label)}</title>` : "";
|
|
84
|
+
body.push(chartDatumSvg(`<circle class="stdlib-chart-map-point stdlib-chart-series-${seriesIndex % 8}" cx="${fmt(x)}" cy="${fmt(y)}" r="${fmt(radius)}">${title}</circle>`, {
|
|
85
|
+
index,
|
|
86
|
+
seriesIndex,
|
|
87
|
+
role: "point",
|
|
88
|
+
label: point.label ?? opts.series[seriesIndex]?.label,
|
|
89
|
+
anchor: [x, y],
|
|
90
|
+
values: [{
|
|
91
|
+
key: "latitude",
|
|
92
|
+
value: point.latitude
|
|
93
|
+
}, {
|
|
94
|
+
key: "longitude",
|
|
95
|
+
value: point.longitude
|
|
96
|
+
}, ...(point.size !== undefined && Number.isFinite(point.size) ? [{
|
|
97
|
+
key: "size",
|
|
98
|
+
value: point.size
|
|
99
|
+
}] : [])]
|
|
100
|
+
}, opts.inspect && x >= 0 && y >= 0 && x <= mapWidth && y <= mapHeight));
|
|
101
|
+
}
|
|
102
|
+
body.push("</svg>");
|
|
103
|
+
}
|
|
104
|
+
if (finitePoints.length === 0) {
|
|
105
|
+
body.push(`<text class="stdlib-chart-map-empty" x="${fmt(area.x0 + availableWidth / 2)}" y="${fmt(area.y0 + availableHeight / 2)}" text-anchor="middle" dominant-baseline="middle">No data</text>`);
|
|
106
|
+
}
|
|
107
|
+
if (legendItems.length > 0) {
|
|
108
|
+
body.push(renderLegend(legendItems, width, height - legendHeight).svg);
|
|
109
|
+
}
|
|
110
|
+
return svgRoot({
|
|
111
|
+
width,
|
|
112
|
+
height,
|
|
113
|
+
className: opts.className
|
|
114
|
+
}, body.join(""));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=map.js.map
|