@vadem/ui 0.0.0-stage → 0.0.1
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/LICENSE-lucide.txt +43 -0
- package/README.md +19 -2
- package/fesm2022/vadem-ui-accordion.mjs +139 -0
- package/fesm2022/vadem-ui-accordion.mjs.map +1 -0
- package/fesm2022/vadem-ui-active-filters.mjs +355 -0
- package/fesm2022/vadem-ui-active-filters.mjs.map +1 -0
- package/fesm2022/vadem-ui-alert-dialog.mjs +433 -0
- package/fesm2022/vadem-ui-alert-dialog.mjs.map +1 -0
- package/fesm2022/vadem-ui-alert.mjs +266 -0
- package/fesm2022/vadem-ui-alert.mjs.map +1 -0
- package/fesm2022/vadem-ui-autocomplete.mjs +715 -0
- package/fesm2022/vadem-ui-autocomplete.mjs.map +1 -0
- package/fesm2022/vadem-ui-avatar.mjs +219 -0
- package/fesm2022/vadem-ui-avatar.mjs.map +1 -0
- package/fesm2022/vadem-ui-badge.mjs +86 -0
- package/fesm2022/vadem-ui-badge.mjs.map +1 -0
- package/fesm2022/vadem-ui-breadcrumbs.mjs +61 -0
- package/fesm2022/vadem-ui-breadcrumbs.mjs.map +1 -0
- package/fesm2022/vadem-ui-button.mjs +220 -0
- package/fesm2022/vadem-ui-button.mjs.map +1 -0
- package/fesm2022/vadem-ui-calendar.mjs +1314 -0
- package/fesm2022/vadem-ui-calendar.mjs.map +1 -0
- package/fesm2022/vadem-ui-card.mjs +271 -0
- package/fesm2022/vadem-ui-card.mjs.map +1 -0
- package/fesm2022/vadem-ui-character-count.mjs +269 -0
- package/fesm2022/vadem-ui-character-count.mjs.map +1 -0
- package/fesm2022/vadem-ui-chart.mjs +1984 -0
- package/fesm2022/vadem-ui-chart.mjs.map +1 -0
- package/fesm2022/vadem-ui-checkbox.mjs +67 -0
- package/fesm2022/vadem-ui-checkbox.mjs.map +1 -0
- package/fesm2022/vadem-ui-color-picker.mjs +815 -0
- package/fesm2022/vadem-ui-color-picker.mjs.map +1 -0
- package/fesm2022/vadem-ui-command.mjs +735 -0
- package/fesm2022/vadem-ui-command.mjs.map +1 -0
- package/fesm2022/vadem-ui-copy-button.mjs +375 -0
- package/fesm2022/vadem-ui-copy-button.mjs.map +1 -0
- package/fesm2022/vadem-ui-date-range-picker.mjs +1011 -0
- package/fesm2022/vadem-ui-date-range-picker.mjs.map +1 -0
- package/fesm2022/vadem-ui-description-list.mjs +59 -0
- package/fesm2022/vadem-ui-description-list.mjs.map +1 -0
- package/fesm2022/vadem-ui-dialog.mjs +587 -0
- package/fesm2022/vadem-ui-dialog.mjs.map +1 -0
- package/fesm2022/vadem-ui-dropzone.mjs +176 -0
- package/fesm2022/vadem-ui-dropzone.mjs.map +1 -0
- package/fesm2022/vadem-ui-editable-text.mjs +641 -0
- package/fesm2022/vadem-ui-editable-text.mjs.map +1 -0
- package/fesm2022/vadem-ui-empty-state.mjs +175 -0
- package/fesm2022/vadem-ui-empty-state.mjs.map +1 -0
- package/fesm2022/vadem-ui-expandable-text.mjs +244 -0
- package/fesm2022/vadem-ui-expandable-text.mjs.map +1 -0
- package/fesm2022/vadem-ui-field.mjs +583 -0
- package/fesm2022/vadem-ui-field.mjs.map +1 -0
- package/fesm2022/vadem-ui-file-preview.mjs +532 -0
- package/fesm2022/vadem-ui-file-preview.mjs.map +1 -0
- package/fesm2022/vadem-ui-file-size.mjs +83 -0
- package/fesm2022/vadem-ui-file-size.mjs.map +1 -0
- package/fesm2022/vadem-ui-form-error-summary.mjs +201 -0
- package/fesm2022/vadem-ui-form-error-summary.mjs.map +1 -0
- package/fesm2022/vadem-ui-icon.mjs +303 -0
- package/fesm2022/vadem-ui-icon.mjs.map +1 -0
- package/fesm2022/vadem-ui-input.mjs +120 -0
- package/fesm2022/vadem-ui-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-kbd.mjs +286 -0
- package/fesm2022/vadem-ui-kbd.mjs.map +1 -0
- package/fesm2022/vadem-ui-keyboard.mjs +105 -0
- package/fesm2022/vadem-ui-keyboard.mjs.map +1 -0
- package/fesm2022/vadem-ui-locale.mjs +443 -0
- package/fesm2022/vadem-ui-locale.mjs.map +1 -0
- package/fesm2022/vadem-ui-menu.mjs +637 -0
- package/fesm2022/vadem-ui-menu.mjs.map +1 -0
- package/fesm2022/vadem-ui-navigation-list.mjs +130 -0
- package/fesm2022/vadem-ui-navigation-list.mjs.map +1 -0
- package/fesm2022/vadem-ui-number-input.mjs +264 -0
- package/fesm2022/vadem-ui-number-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-otp-input.mjs +86 -0
- package/fesm2022/vadem-ui-otp-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-pagination.mjs +353 -0
- package/fesm2022/vadem-ui-pagination.mjs.map +1 -0
- package/fesm2022/vadem-ui-password-input.mjs +213 -0
- package/fesm2022/vadem-ui-password-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-popover.mjs +178 -0
- package/fesm2022/vadem-ui-popover.mjs.map +1 -0
- package/fesm2022/vadem-ui-progress.mjs +331 -0
- package/fesm2022/vadem-ui-progress.mjs.map +1 -0
- package/fesm2022/vadem-ui-radio.mjs +39 -0
- package/fesm2022/vadem-ui-radio.mjs.map +1 -0
- package/fesm2022/vadem-ui-range-slider.mjs +561 -0
- package/fesm2022/vadem-ui-range-slider.mjs.map +1 -0
- package/fesm2022/vadem-ui-rating.mjs +404 -0
- package/fesm2022/vadem-ui-rating.mjs.map +1 -0
- package/fesm2022/vadem-ui-relative-time.mjs +217 -0
- package/fesm2022/vadem-ui-relative-time.mjs.map +1 -0
- package/fesm2022/vadem-ui-reorder-list.mjs +601 -0
- package/fesm2022/vadem-ui-reorder-list.mjs.map +1 -0
- package/fesm2022/vadem-ui-scroll-area.mjs +65 -0
- package/fesm2022/vadem-ui-scroll-area.mjs.map +1 -0
- package/fesm2022/vadem-ui-search-input.mjs +307 -0
- package/fesm2022/vadem-ui-search-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-segmented.mjs +297 -0
- package/fesm2022/vadem-ui-segmented.mjs.map +1 -0
- package/fesm2022/vadem-ui-select.mjs +1462 -0
- package/fesm2022/vadem-ui-select.mjs.map +1 -0
- package/fesm2022/vadem-ui-sidebar.mjs +493 -0
- package/fesm2022/vadem-ui-sidebar.mjs.map +1 -0
- package/fesm2022/vadem-ui-skeleton.mjs +106 -0
- package/fesm2022/vadem-ui-skeleton.mjs.map +1 -0
- package/fesm2022/vadem-ui-slider.mjs +60 -0
- package/fesm2022/vadem-ui-slider.mjs.map +1 -0
- package/fesm2022/vadem-ui-splitter.mjs +438 -0
- package/fesm2022/vadem-ui-splitter.mjs.map +1 -0
- package/fesm2022/vadem-ui-stat.mjs +369 -0
- package/fesm2022/vadem-ui-stat.mjs.map +1 -0
- package/fesm2022/vadem-ui-stepper.mjs +483 -0
- package/fesm2022/vadem-ui-stepper.mjs.map +1 -0
- package/fesm2022/vadem-ui-switch.mjs +45 -0
- package/fesm2022/vadem-ui-switch.mjs.map +1 -0
- package/fesm2022/vadem-ui-table.mjs +593 -0
- package/fesm2022/vadem-ui-table.mjs.map +1 -0
- package/fesm2022/vadem-ui-tabs.mjs +405 -0
- package/fesm2022/vadem-ui-tabs.mjs.map +1 -0
- package/fesm2022/vadem-ui-tag-input.mjs +685 -0
- package/fesm2022/vadem-ui-tag-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-text-highlight.mjs +126 -0
- package/fesm2022/vadem-ui-text-highlight.mjs.map +1 -0
- package/fesm2022/vadem-ui-time-input.mjs +430 -0
- package/fesm2022/vadem-ui-time-input.mjs.map +1 -0
- package/fesm2022/vadem-ui-timeline.mjs +313 -0
- package/fesm2022/vadem-ui-timeline.mjs.map +1 -0
- package/fesm2022/vadem-ui-toast.mjs +397 -0
- package/fesm2022/vadem-ui-toast.mjs.map +1 -0
- package/fesm2022/vadem-ui-toolbar.mjs +396 -0
- package/fesm2022/vadem-ui-toolbar.mjs.map +1 -0
- package/fesm2022/vadem-ui-tooltip.mjs +218 -0
- package/fesm2022/vadem-ui-tooltip.mjs.map +1 -0
- package/fesm2022/vadem-ui-tree.mjs +551 -0
- package/fesm2022/vadem-ui-tree.mjs.map +1 -0
- package/fesm2022/vadem-ui-upload-list.mjs +408 -0
- package/fesm2022/vadem-ui-upload-list.mjs.map +1 -0
- package/fesm2022/vadem-ui.mjs +4 -0
- package/fesm2022/vadem-ui.mjs.map +1 -0
- package/fonts/jetbrains-mono/OFL.txt +93 -0
- package/fonts/jetbrains-mono/jetbrains-mono-cyrillic.woff2 +0 -0
- package/fonts/jetbrains-mono/jetbrains-mono-latin.woff2 +0 -0
- package/fonts/manrope/OFL.txt +93 -0
- package/fonts/manrope/manrope-cyrillic.woff2 +0 -0
- package/fonts/manrope/manrope-latin.woff2 +0 -0
- package/package.json +306 -3
- package/styles/base.css +160 -0
- package/styles/components/accordion.css +130 -0
- package/styles/components/active-filters.css +42 -0
- package/styles/components/alert-dialog.css +34 -0
- package/styles/components/alert.css +159 -0
- package/styles/components/autocomplete.css +97 -0
- package/styles/components/avatar.css +90 -0
- package/styles/components/badge.css +91 -0
- package/styles/components/breadcrumbs.css +94 -0
- package/styles/components/button.css +174 -0
- package/styles/components/calendar.css +186 -0
- package/styles/components/card.css +206 -0
- package/styles/components/character-count.css +41 -0
- package/styles/components/chart.css +308 -0
- package/styles/components/checkbox.css +115 -0
- package/styles/components/color-picker.css +158 -0
- package/styles/components/command.css +175 -0
- package/styles/components/copy-button.css +58 -0
- package/styles/components/date-range-picker.css +153 -0
- package/styles/components/description-list.css +69 -0
- package/styles/components/dialog.css +334 -0
- package/styles/components/dropzone.css +89 -0
- package/styles/components/editable-text.css +58 -0
- package/styles/components/empty-state.css +72 -0
- package/styles/components/expandable-text.css +24 -0
- package/styles/components/field.css +148 -0
- package/styles/components/file-preview.css +65 -0
- package/styles/components/form-error-summary.css +71 -0
- package/styles/components/icon.css +38 -0
- package/styles/components/index.css +80 -0
- package/styles/components/input.css +171 -0
- package/styles/components/kbd.css +42 -0
- package/styles/components/menu.css +168 -0
- package/styles/components/multi-select.css +156 -0
- package/styles/components/navigation-list.css +147 -0
- package/styles/components/number-input.css +33 -0
- package/styles/components/otp-input.css +26 -0
- package/styles/components/pagination.css +127 -0
- package/styles/components/password-input.css +20 -0
- package/styles/components/popover.css +93 -0
- package/styles/components/progress-ring.css +112 -0
- package/styles/components/progress.css +162 -0
- package/styles/components/radio.css +117 -0
- package/styles/components/range-slider.css +158 -0
- package/styles/components/rating.css +100 -0
- package/styles/components/reorder-list.css +143 -0
- package/styles/components/scroll-area.css +39 -0
- package/styles/components/search-input.css +25 -0
- package/styles/components/segmented.css +136 -0
- package/styles/components/select.css +257 -0
- package/styles/components/sidebar.css +105 -0
- package/styles/components/skeleton.css +83 -0
- package/styles/components/slider.css +132 -0
- package/styles/components/splitter.css +83 -0
- package/styles/components/stat.css +62 -0
- package/styles/components/stepper.css +236 -0
- package/styles/components/switch.css +107 -0
- package/styles/components/table.css +195 -0
- package/styles/components/tabs.css +198 -0
- package/styles/components/tag-input.css +138 -0
- package/styles/components/text-highlight.css +22 -0
- package/styles/components/time-input.css +96 -0
- package/styles/components/timeline.css +182 -0
- package/styles/components/toast.css +146 -0
- package/styles/components/toolbar.css +72 -0
- package/styles/components/tooltip.css +93 -0
- package/styles/components/tree.css +88 -0
- package/styles/components/upload-list.css +113 -0
- package/styles/fonts.css +67 -0
- package/styles/index.css +14 -0
- package/styles/reset.css +57 -0
- package/styles/tokens/primitives.css +364 -0
- package/styles/tokens/semantic.css +233 -0
- package/types/vadem-ui-accordion.d.ts +43 -0
- package/types/vadem-ui-active-filters.d.ts +73 -0
- package/types/vadem-ui-alert-dialog.d.ts +87 -0
- package/types/vadem-ui-alert.d.ts +64 -0
- package/types/vadem-ui-autocomplete.d.ts +156 -0
- package/types/vadem-ui-avatar.d.ts +59 -0
- package/types/vadem-ui-badge.d.ts +25 -0
- package/types/vadem-ui-breadcrumbs.d.ts +22 -0
- package/types/vadem-ui-button.d.ts +52 -0
- package/types/vadem-ui-calendar.d.ts +327 -0
- package/types/vadem-ui-card.d.ts +58 -0
- package/types/vadem-ui-character-count.d.ts +71 -0
- package/types/vadem-ui-chart.d.ts +452 -0
- package/types/vadem-ui-checkbox.d.ts +20 -0
- package/types/vadem-ui-color-picker.d.ts +171 -0
- package/types/vadem-ui-command.d.ts +145 -0
- package/types/vadem-ui-copy-button.d.ts +90 -0
- package/types/vadem-ui-date-range-picker.d.ts +216 -0
- package/types/vadem-ui-description-list.d.ts +15 -0
- package/types/vadem-ui-dialog.d.ts +174 -0
- package/types/vadem-ui-dropzone.d.ts +73 -0
- package/types/vadem-ui-editable-text.d.ts +141 -0
- package/types/vadem-ui-empty-state.d.ts +34 -0
- package/types/vadem-ui-expandable-text.d.ts +52 -0
- package/types/vadem-ui-field.d.ts +180 -0
- package/types/vadem-ui-file-preview.d.ts +108 -0
- package/types/vadem-ui-file-size.d.ts +18 -0
- package/types/vadem-ui-form-error-summary.d.ts +46 -0
- package/types/vadem-ui-icon.d.ts +152 -0
- package/types/vadem-ui-input.d.ts +31 -0
- package/types/vadem-ui-kbd.d.ts +66 -0
- package/types/vadem-ui-keyboard.d.ts +61 -0
- package/types/vadem-ui-locale.d.ts +241 -0
- package/types/vadem-ui-menu.d.ts +132 -0
- package/types/vadem-ui-navigation-list.d.ts +28 -0
- package/types/vadem-ui-number-input.d.ts +39 -0
- package/types/vadem-ui-otp-input.d.ts +15 -0
- package/types/vadem-ui-pagination.d.ts +96 -0
- package/types/vadem-ui-password-input.d.ts +36 -0
- package/types/vadem-ui-popover.d.ts +48 -0
- package/types/vadem-ui-progress.d.ts +95 -0
- package/types/vadem-ui-radio.d.ts +11 -0
- package/types/vadem-ui-range-slider.d.ts +136 -0
- package/types/vadem-ui-rating.d.ts +95 -0
- package/types/vadem-ui-relative-time.d.ts +58 -0
- package/types/vadem-ui-reorder-list.d.ts +120 -0
- package/types/vadem-ui-scroll-area.d.ts +13 -0
- package/types/vadem-ui-search-input.d.ts +58 -0
- package/types/vadem-ui-segmented.d.ts +76 -0
- package/types/vadem-ui-select.d.ts +303 -0
- package/types/vadem-ui-sidebar.d.ts +70 -0
- package/types/vadem-ui-skeleton.d.ts +28 -0
- package/types/vadem-ui-slider.d.ts +17 -0
- package/types/vadem-ui-splitter.d.ts +99 -0
- package/types/vadem-ui-stat.d.ts +101 -0
- package/types/vadem-ui-stepper.d.ts +108 -0
- package/types/vadem-ui-switch.d.ts +10 -0
- package/types/vadem-ui-table.d.ts +172 -0
- package/types/vadem-ui-tabs.d.ts +101 -0
- package/types/vadem-ui-tag-input.d.ts +170 -0
- package/types/vadem-ui-text-highlight.d.ts +27 -0
- package/types/vadem-ui-time-input.d.ts +47 -0
- package/types/vadem-ui-timeline.d.ts +54 -0
- package/types/vadem-ui-toast.d.ts +104 -0
- package/types/vadem-ui-toolbar.d.ts +80 -0
- package/types/vadem-ui-tooltip.d.ts +71 -0
- package/types/vadem-ui-tree.d.ts +123 -0
- package/types/vadem-ui-upload-list.d.ts +70 -0
- package/types/vadem-ui.d.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vadem-ui-chart.mjs","names":[],"sources":["../../../projects/ui/chart/src/core/chart-math.ts","../../../projects/ui/chart/src/chart-frame.ts","../../../projects/ui/chart/src/chart-base.ts","../../../projects/ui/chart/src/bar-chart.ts","../../../projects/ui/chart/src/line-chart.ts","../../../projects/ui/chart/src/sparkline.ts"],"sourcesContent":["/**\n * Framework-agnostic chart geometry: scales, ticks, stacking and SVG paths.\n * No DOM access; every function is pure and unit-tested.\n */\n\nexport interface VdChartSeries {\n name: string;\n /** One value per category; `null` = missing (a gap, never zero). */\n values: readonly (number | null)[];\n}\n\nexport interface VdLinearScale {\n domain: readonly [number, number];\n range: readonly [number, number];\n (value: number): number;\n}\n\nexport function linearScale(\n domain: readonly [number, number],\n range: readonly [number, number],\n): VdLinearScale {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n const span = d1 - d0 || 1;\n const scale = ((value: number) => r0 + ((value - d0) / span) * (r1 - r0)) as VdLinearScale;\n return Object.assign(scale, { domain, range });\n}\n\n/** Round numbers for an axis: 1, 2, 2.5 or 5 times a power of ten. Always includes zero. */\nexport function niceTicks(min: number, max: number, target = 5): number[] {\n const lo = Math.min(0, min);\n const hi = Math.max(0, max);\n if (lo === hi) return [0, 1];\n const raw = (hi - lo) / Math.max(1, target);\n const power = 10 ** Math.floor(Math.log10(raw));\n const step = [1, 2, 2.5, 5, 10].map((m) => m * power).find((s) => s >= raw) ?? 10 * power;\n const start = Math.floor(lo / step) * step;\n const end = Math.ceil(hi / step) * step;\n const ticks: number[] = [];\n for (let v = start; v <= end + step / 2; v += step) ticks.push(Number(v.toFixed(10)));\n return ticks;\n}\n\nexport interface VdBand {\n /** Start of each band. */\n start: number;\n /** Centre of each band. */\n center: number;\n /** Band width including its share of padding. */\n step: number;\n}\n\n/** Evenly spaced bands across `range` for `count` categories. */\nexport function bands(count: number, range: readonly [number, number]): VdBand[] {\n const [r0, r1] = range;\n const step = count > 0 ? (r1 - r0) / count : 0;\n return Array.from({ length: count }, (_, i) => ({\n start: r0 + i * step,\n center: r0 + (i + 0.5) * step,\n step,\n }));\n}\n\n/** Index of the band nearest to `position` (pointer or keyboard), clamped. */\nexport function nearestIndex(position: number, count: number, range: readonly [number, number]) {\n if (count <= 0) return -1;\n const [r0, r1] = range;\n const t = (position - r0) / (r1 - r0 || 1);\n return Math.min(count - 1, Math.max(0, Math.floor(t * count)));\n}\n\nexport interface VdStackSegment {\n from: number;\n to: number;\n}\n\n/** Stacks positive values upward and negative values downward from zero, per category. */\nexport function stack(series: readonly VdChartSeries[], count: number): VdStackSegment[][] {\n const up = new Array<number>(count).fill(0);\n const down = new Array<number>(count).fill(0);\n return series.map((s) =>\n Array.from({ length: count }, (_, i) => {\n const v = s.values[i] ?? 0;\n if (v >= 0) {\n const seg = { from: up[i], to: up[i] + v };\n up[i] += v;\n return seg;\n }\n const seg = { from: down[i], to: down[i] + v };\n down[i] += v;\n return seg;\n }),\n );\n}\n\n/** [min, max] over all values (stacked totals when `stacked`). */\nexport function extent(series: readonly VdChartSeries[], count: number, stacked: boolean) {\n let min = 0;\n let max = 0;\n if (stacked) {\n for (const segments of stack(series, count))\n for (const seg of segments) {\n min = Math.min(min, seg.to);\n max = Math.max(max, seg.to);\n }\n } else {\n for (const s of series)\n for (const v of s.values) {\n if (v === null || !Number.isFinite(v)) continue;\n min = Math.min(min, v);\n max = Math.max(max, v);\n }\n }\n return [min, max] as const;\n}\n\nconst r = (n: number) => Math.round(n * 100) / 100;\n\n/**\n * A bar from `base` to `end` along the value axis, `thickness` wide, centred at `center` on the\n * category axis. The data end is rounded (`radius`), the baseline end square.\n */\nexport function barPath(\n center: number,\n thickness: number,\n base: number,\n end: number,\n radius: number,\n orientation: 'vertical' | 'horizontal',\n): string {\n const length = Math.abs(end - base);\n if (length < 0.5) return '';\n const rad = Math.min(radius, thickness / 2, length);\n const a = center - thickness / 2;\n const b = center + thickness / 2;\n const dir = end < base ? -1 : 1;\n const tip = end - dir * rad;\n if (orientation === 'vertical') {\n // Value axis is y; `dir` -1 means the bar grows upward on screen.\n return [\n `M${r(a)},${r(base)}`,\n `L${r(a)},${r(tip)}`,\n `Q${r(a)},${r(end)} ${r(a + rad)},${r(end)}`,\n `L${r(b - rad)},${r(end)}`,\n `Q${r(b)},${r(end)} ${r(b)},${r(tip)}`,\n `L${r(b)},${r(base)}`,\n 'Z',\n ].join(' ');\n }\n return [\n `M${r(base)},${r(a)}`,\n `L${r(tip)},${r(a)}`,\n `Q${r(end)},${r(a)} ${r(end)},${r(a + rad)}`,\n `L${r(end)},${r(b - rad)}`,\n `Q${r(end)},${r(b)} ${r(tip)},${r(b)}`,\n `L${r(base)},${r(b)}`,\n 'Z',\n ].join(' ');\n}\n\nexport type VdPoint = readonly [x: number, y: number] | null;\n\n/** Polyline through points; a `null` starts a new segment (missing data is a gap). */\nexport function linePath(points: readonly VdPoint[]): string {\n let d = '';\n let pen = false;\n for (const p of points) {\n if (!p) {\n pen = false;\n continue;\n }\n d += `${pen ? 'L' : 'M'}${r(p[0])},${r(p[1])}`;\n pen = true;\n }\n return d;\n}\n\n/** Closed area between each continuous run of points and the baseline. */\nexport function areaPath(points: readonly VdPoint[], baseline: number): string {\n const runs: (readonly [number, number])[][] = [[]];\n for (const p of points) {\n if (p) runs[runs.length - 1].push(p);\n else if (runs[runs.length - 1].length) runs.push([]);\n }\n return runs\n .filter((run) => run.length > 1)\n .map(\n (run) =>\n `M${r(run[0][0])},${r(baseline)}` +\n run.map(([x, y]) => `L${r(x)},${r(y)}`).join('') +\n `L${r(run[run.length - 1][0])},${r(baseline)}Z`,\n )\n .join('');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { VdButton } from '@vadem/ui/button';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VD_LOCALE, vdTexts } from '@vadem/ui/locale';\nimport type { VdChartSeries } from './core/chart-math';\n\nexport type VdChartKind = 'bar' | 'line';\n\n/** Formats a value for tooltips and the table (full precision, locale-aware). */\nexport type VdChartFormat = (value: number) => string;\n\n/** Series identity: slot 1..8 for categorical, \"accent\" for a single series. */\nexport function seriesSlot(index: number, count: number): string {\n return count === 1 ? 'accent' : String((index % 8) + 1);\n}\n\n/**\n * Shared chart chrome: figure with title, legend (2+ series), data-table toggle, tooltip and\n * plot measurement. Charts project their SVG into it. Spec: specs/chart.md\n */\n@Component({\n selector: 'vd-chart-frame',\n imports: [VdButton],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'vd-chart' },\n template: `\n <figure\n class=\"vd-chart__figure\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-busy]=\"loading() || null\"\n [attr.data-loading]=\"loading() ? '' : null\"\n >\n <figcaption class=\"vd-chart__head\">\n <span class=\"vd-chart__title\" [id]=\"titleId\">{{ title() }}</span>\n @if (description()) {\n <span class=\"vd-chart__description\">{{ description() }}</span>\n }\n </figcaption>\n <div class=\"vd-chart__toolbar\">\n @if (series().length > 1) {\n <ul class=\"vd-chart__legend\" role=\"list\">\n @for (s of series(); track $index) {\n <li class=\"vd-chart__legend-item\">\n <span\n class=\"vd-chart__key\"\n aria-hidden=\"true\"\n [attr.data-series]=\"slot($index)\"\n [attr.data-kind]=\"kind()\"\n ></span>\n {{ s.name }}\n </li>\n }\n </ul>\n }\n <button\n vdButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"vd-chart__table-toggle\"\n [attr.aria-pressed]=\"tableShown()\"\n [attr.aria-controls]=\"tableId\"\n (click)=\"tableShown.set(!tableShown())\"\n >\n {{ t().tableLabel }}\n </button>\n </div>\n\n <div #plot class=\"vd-chart__plot\" [hidden]=\"tableShown()\" (pointerleave)=\"leave()\">\n <ng-content />\n @if (active() >= 0 && tooltipX() !== null) {\n <div\n class=\"vd-chart__tooltip\"\n role=\"presentation\"\n aria-hidden=\"true\"\n [attr.data-side]=\"tooltipSide()\"\n [style.--vd-chart-tip-x.px]=\"tooltipX()\"\n [style.--vd-chart-tip-y.px]=\"tooltipY()\"\n >\n <span class=\"vd-chart__tooltip-category\" dir=\"auto\">{{ categories()[active()] }}</span>\n @for (s of series(); track $index) {\n <span class=\"vd-chart__tooltip-row\">\n <span\n class=\"vd-chart__key\"\n [attr.data-series]=\"slot($index)\"\n data-kind=\"line\"\n ></span>\n <strong class=\"vd-chart__tooltip-value\">{{ valueText(s.values[active()]) }}</strong>\n <span class=\"vd-chart__tooltip-name\" dir=\"auto\">{{ s.name }}</span>\n </span>\n }\n </div>\n }\n </div>\n\n <div\n class=\"vd-chart__table-wrap\"\n role=\"region\"\n tabindex=\"0\"\n [id]=\"tableId\"\n [attr.aria-labelledby]=\"titleId\"\n [hidden]=\"!tableShown()\"\n >\n @if (tableShown()) {\n <table class=\"vd-chart__table\">\n <thead>\n <tr>\n <th scope=\"col\">{{ t().categoryLabel }}</th>\n @for (s of series(); track $index) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (c of categories(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ c }}</th>\n @for (s of series(); track $index) {\n <td>{{ valueText(s.values[i]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </figure>\n `,\n})\nexport class VdChartFrame {\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly categories = input<readonly string[]>([]);\n readonly series = input<readonly VdChartSeries[]>([]);\n readonly kind = input<VdChartKind>('bar');\n readonly format = input<VdChartFormat>();\n readonly categoryLabel = input<string>();\n /** Highlighted category, driven by the chart (pointer or keyboard). */\n readonly active = input(-1);\n /** Tooltip anchor in plot pixels; null hides it. */\n readonly tooltipX = input<number | null>(null);\n readonly tooltipY = input(0);\n readonly tableLabel = input<string>();\n readonly loading = input(false);\n\n protected readonly t = vdTexts('chart', {\n tableLabel: this.tableLabel,\n categoryLabel: this.categoryLabel,\n });\n private readonly locale = inject(VD_LOCALE);\n readonly titleId = vdUniqueId('vd-chart-title');\n readonly tableId = vdUniqueId('vd-chart-table');\n readonly tableShown = signal(false);\n /** Measured plot width in CSS pixels (0 until the browser lays it out). */\n readonly width = signal(0);\n /** Fired when the pointer leaves the plot; charts clear their highlight. */\n readonly pointerLeave = output<void>();\n\n private readonly plot = viewChild.required<ElementRef<HTMLElement>>('plot');\n private readonly numberFormat = computed(() => new Intl.NumberFormat(this.locale.code));\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n const el = this.plot().nativeElement;\n const view = el.ownerDocument.defaultView;\n const measure = () => this.width.set(el.clientWidth);\n measure();\n if (!view?.ResizeObserver) return;\n const observer = new view.ResizeObserver(measure);\n observer.observe(el);\n destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n protected slot(index: number): string {\n return seriesSlot(index, this.series().length);\n }\n\n valueText(value: number | null | undefined): string {\n if (value === null || value === undefined || !Number.isFinite(value)) return '—';\n return (this.format() ?? ((v: number) => this.numberFormat().format(v)))(value);\n }\n\n protected leave(): void {\n this.pointerLeave.emit();\n }\n\n /** The tooltip sits on the roomier side of its anchor. */\n protected readonly tooltipSide = computed(() =>\n (this.tooltipX() ?? 0) > this.width() / 2 ? 'start' : 'end',\n );\n}\n","import {\n Directive,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { VD_LOCALE } from '@vadem/ui/locale';\nimport { linearScale, niceTicks, nearestIndex, type VdChartSeries } from './core/chart-math';\nimport { VdChartFrame, type VdChartFormat, seriesSlot } from './chart-frame';\n\n/** Average glyph width of 12px UI text, used to reserve room for axis labels. */\nconst CHAR_PX = 6.8;\nconst AXIS_FONT_GAP = 8;\n\n/**\n * Inputs, value scale and keyboard/pointer exploration shared by bar and line charts.\n * Rendering stays in each chart's template.\n */\n@Directive()\nexport abstract class VdChartBase {\n readonly title = input.required<string>();\n readonly description = input<string>();\n /** Category labels (x for columns and lines, y for horizontal bars). */\n readonly categories = input<readonly string[]>([]);\n readonly series = input<readonly VdChartSeries[]>([]);\n /** Plot height in pixels, including the category axis band. */\n readonly height = input(240, { transform: numberAttribute });\n /** Full value text for tooltips, labels and the table. Defaults to Intl in the locale. */\n readonly format = input<VdChartFormat>();\n /** Short value text for axis ticks. Defaults to compact Intl notation. */\n readonly axisFormat = input<VdChartFormat>();\n readonly categoryLabel = input<string>();\n /**\n * Refetching: keep the previous render, muted and `aria-busy`, so the table view, focus and\n * layout survive (dataviz: refetch keeps the frame, no skeleton).\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n protected readonly frame = viewChild.required(VdChartFrame);\n /** Highlighted category (pointer or keyboard), -1 when none. */\n protected readonly active = signal(-1);\n /** Roving tab stop among category hit targets. */\n protected readonly focusIndex = signal(0);\n\n protected readonly count = computed(() => this.categories().length);\n protected readonly width = computed(() => this.frame().width());\n\n protected abstract readonly stackedValues: () => boolean;\n protected abstract extentOf(): readonly [number, number];\n\n protected readonly ticks = computed(() => {\n const [min, max] = this.extentOf();\n return niceTicks(min, max, Math.max(2, Math.round(this.height() / 60)));\n });\n\n private readonly compact = computed(\n () =>\n new Intl.NumberFormat(this.localeCode(), { notation: 'compact', maximumFractionDigits: 1 }),\n );\n private readonly locale = inject(VD_LOCALE);\n protected localeCode(): string {\n return this.locale.code;\n }\n\n protected tickText(value: number): string {\n return (this.axisFormat() ?? ((v: number) => this.compact().format(v)))(value);\n }\n\n /** Room for the widest tick label. */\n protected readonly tickWidth = computed(\n () =>\n Math.max(...this.ticks().map((t) => this.tickText(t).length), 1) * CHAR_PX + AXIS_FONT_GAP,\n );\n protected readonly categoryWidth = computed(\n () => Math.max(...this.categories().map((c) => c.length), 1) * CHAR_PX + AXIS_FONT_GAP,\n );\n\n protected valueScale(range: readonly [number, number]) {\n const ticks = this.ticks();\n return linearScale([ticks[0], ticks[ticks.length - 1]], range);\n }\n\n protected slot(index: number): string {\n return seriesSlot(index, this.series().length);\n }\n\n /** \"Пн: Запити 4 200, Помилки 12\" - the accessible name of one category. */\n protected pointLabel(index: number): string {\n const values = this.series()\n .map((s) => `${s.name} ${this.frame().valueText(s.values[index])}`)\n .join(', ');\n return `${this.categories()[index]}: ${values}`;\n }\n\n /** Every `k`-th category label so labels never overlap. */\n protected labelEvery(available: number): number {\n const per = this.categoryWidth();\n const fit = Math.max(1, Math.floor(available / per));\n return Math.max(1, Math.ceil(this.count() / fit));\n }\n\n protected pointerAt(position: number, range: readonly [number, number]): void {\n this.active.set(nearestIndex(position, this.count(), range));\n }\n\n protected onKeydown(event: KeyboardEvent, index: number): void {\n const last = this.count() - 1;\n const next =\n {\n ArrowRight: index + 1,\n ArrowDown: index + 1,\n ArrowLeft: index - 1,\n ArrowUp: index - 1,\n Home: 0,\n End: last,\n }[event.key] ?? null;\n if (next === null) return;\n event.preventDefault();\n const target = Math.min(last, Math.max(0, next));\n this.focusIndex.set(target);\n const hits = (event.currentTarget as Element).parentElement;\n (hits?.querySelector(`[data-index=\"${target}\"]`) as SVGElement | null)?.focus();\n }\n\n protected onFocus(index: number): void {\n this.focusIndex.set(index);\n this.active.set(index);\n }\n\n protected onBlur(event: FocusEvent): void {\n const next = event.relatedTarget as Element | null;\n if (!next?.closest('.vd-chart__hits')) this.active.set(-1);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { bands, barPath, extent, stack } from './core/chart-math';\nimport { VdChartBase } from './chart-base';\nimport { VdChartFrame } from './chart-frame';\n\nexport type VdBarOrientation = 'vertical' | 'horizontal';\n\n/** Mark specs (dataviz): bars at most 24px thick, 4px rounded data end, 2px surface gap. */\nconst MAX_THICKNESS = 24;\nconst RADIUS = 4;\nconst GAP = 2;\nconst PAD = 8;\nconst AXIS_BAND = 22;\n\ninterface Mark {\n d: string;\n series: number;\n category: number;\n}\n\n/**\n * Bar / column chart: one series in the accent, several grouped or stacked in the categorical\n * palette. Spec: specs/chart.md\n */\n@Component({\n selector: 'vd-bar-chart',\n imports: [VdChartFrame],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n // The `title` input would otherwise also stay as a native tooltip on the host.\n '[attr.title]': 'null',\n class: 'vd-bar-chart',\n '[attr.data-orientation]': 'orientation()',\n },\n template: `\n <vd-chart-frame\n kind=\"bar\"\n [title]=\"title()\"\n [description]=\"description()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [format]=\"format()\"\n [categoryLabel]=\"categoryLabel()\"\n [loading]=\"loading()\"\n [active]=\"active()\"\n [tooltipX]=\"tooltip()?.x ?? null\"\n [tooltipY]=\"tooltip()?.y ?? 0\"\n (pointerLeave)=\"active.set(-1)\"\n >\n @if (width() > 0) {\n <svg\n class=\"vd-chart__svg\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n role=\"group\"\n [attr.aria-labelledby]=\"frame().titleId\"\n (pointermove)=\"onPointer($event)\"\n >\n <g class=\"vd-chart__grid\" aria-hidden=\"true\">\n @for (t of tickMarks(); track t.value) {\n <line\n [attr.x1]=\"t.x1\"\n [attr.x2]=\"t.x2\"\n [attr.y1]=\"t.y1\"\n [attr.y2]=\"t.y2\"\n [attr.data-zero]=\"t.value === 0 ? '' : null\"\n />\n <text\n [attr.x]=\"t.tx\"\n [attr.y]=\"t.ty\"\n [attr.text-anchor]=\"t.anchor\"\n dominant-baseline=\"middle\"\n >\n {{ tickText(t.value) }}\n </text>\n }\n </g>\n @if (active() >= 0) {\n <rect\n class=\"vd-chart__band\"\n aria-hidden=\"true\"\n [attr.x]=\"bandRect().x\"\n [attr.y]=\"bandRect().y\"\n [attr.width]=\"bandRect().w\"\n [attr.height]=\"bandRect().h\"\n rx=\"4\"\n />\n }\n <g class=\"vd-chart__marks\" aria-hidden=\"true\">\n @for (m of marks(); track $index) {\n <path\n class=\"vd-chart__bar\"\n [attr.d]=\"m.d\"\n [attr.data-series]=\"slot(m.series)\"\n [attr.data-muted]=\"highlighted() >= 0 && m.category !== highlighted() ? '' : null\"\n />\n }\n </g>\n <g class=\"vd-chart__axis\" aria-hidden=\"true\">\n @for (c of categoryTicks(); track c.index) {\n <text\n [attr.x]=\"c.x\"\n [attr.y]=\"c.y\"\n [attr.text-anchor]=\"c.anchor\"\n dominant-baseline=\"middle\"\n >\n {{ categories()[c.index] }}\n </text>\n }\n </g>\n <g class=\"vd-chart__hits\">\n @for (h of hits(); track h.index) {\n <rect\n class=\"vd-chart__hit\"\n rx=\"6\"\n role=\"img\"\n [attr.data-index]=\"h.index\"\n [attr.tabindex]=\"h.index === focusIndex() ? 0 : -1\"\n [attr.aria-label]=\"pointLabel(h.index)\"\n [attr.x]=\"h.x\"\n [attr.y]=\"h.y\"\n [attr.width]=\"h.w\"\n [attr.height]=\"h.h\"\n (focus)=\"onFocus(h.index)\"\n (blur)=\"onBlur($event)\"\n (keydown)=\"onKeydown($event, h.index)\"\n />\n }\n </g>\n </svg>\n }\n </vd-chart-frame>\n `,\n})\nexport class VdBarChart extends VdChartBase {\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n /** Stack series (part-to-whole) instead of grouping them side by side. */\n readonly stacked = input(false, { transform: booleanAttribute });\n /**\n * Emphasis form for a single series: keep one category in full colour and mute the rest.\n * `'max'` picks the largest value.\n */\n readonly highlight = input<number | 'max' | null>(null);\n\n protected readonly highlighted = computed(() => {\n const h = this.highlight();\n const values = this.series()[0]?.values ?? [];\n if (h === null || this.series().length !== 1) return -1;\n if (h !== 'max') return h;\n let best = -1;\n values.forEach((v, i) => {\n if (v !== null && Number.isFinite(v) && (best < 0 || v > (values[best] ?? -Infinity)))\n best = i;\n });\n return best;\n });\n\n protected readonly stackedValues = () => this.stacked();\n protected extentOf() {\n return extent(this.series(), this.count(), this.stacked());\n }\n\n private readonly vertical = computed(() => this.orientation() === 'vertical');\n\n /** Plot box inside the SVG: [start, end] on each axis. */\n protected readonly box = computed(() => {\n const w = this.width();\n const h = this.height();\n if (this.vertical()) {\n return { x0: this.tickWidth(), x1: w - PAD, y0: PAD, y1: h - AXIS_BAND };\n }\n const labels = Math.min(this.categoryWidth(), w * 0.4);\n return { x0: labels, x1: w - PAD - this.tickWidth() / 2, y0: PAD, y1: h - AXIS_BAND };\n });\n\n private readonly scale = computed(() => {\n const b = this.box();\n return this.vertical() ? this.valueScale([b.y1, b.y0]) : this.valueScale([b.x0, b.x1]);\n });\n\n private readonly categoryRange = computed<[number, number]>(() => {\n const b = this.box();\n return this.vertical() ? [b.x0, b.x1] : [b.y0, b.y1];\n });\n\n private readonly bandList = computed(() => bands(this.count(), this.categoryRange()));\n\n protected readonly marks = computed<Mark[]>(() => {\n const series = this.series();\n const n = series.length;\n if (!n || !this.count()) return [];\n const scale = this.scale();\n const zero = scale(0);\n const orient = this.orientation();\n const marks: Mark[] = [];\n if (this.stacked()) {\n const segments = stack(series, this.count());\n // Rounded only on the outermost segment of each direction.\n const outer = this.bandList().map((_, c) => {\n let top = -1;\n let bottom = -1;\n segments.forEach((s, i) => {\n if (s[c].to > s[c].from) top = i;\n if (s[c].to < s[c].from) bottom = i;\n });\n return { top, bottom };\n });\n this.bandList().forEach((band, c) => {\n const thickness = Math.min(MAX_THICKNESS, band.step * 0.6);\n segments.forEach((s, i) => {\n const seg = s[c];\n if (seg.to === seg.from) return;\n const rounded = i === outer[c].top || i === outer[c].bottom;\n const from = scale(seg.from);\n const to = scale(seg.to);\n // 2px surface gap between stacked segments, taken from the far end.\n const dir = Math.sign(to - from);\n const end = rounded ? to : to - dir * GAP;\n marks.push({\n d: barPath(band.center, thickness, from, end, rounded ? RADIUS : 0, orient),\n series: i,\n category: c,\n });\n });\n });\n return marks;\n }\n this.bandList().forEach((band, c) => {\n const thickness = Math.min(MAX_THICKNESS, (band.step * 0.7 - GAP * (n - 1)) / n);\n const group = thickness * n + GAP * (n - 1);\n series.forEach((s, i) => {\n const v = s.values[c];\n if (v === null || v === undefined || !Number.isFinite(v)) return;\n const center = band.center - group / 2 + thickness / 2 + i * (thickness + GAP);\n marks.push({\n d: barPath(center, thickness, zero, scale(v), RADIUS, orient),\n series: i,\n category: c,\n });\n });\n });\n return marks;\n });\n\n protected readonly tickMarks = computed(() => {\n const b = this.box();\n const scale = this.scale();\n return this.ticks().map((value) =>\n this.vertical()\n ? {\n value,\n x1: b.x0,\n x2: b.x1,\n y1: scale(value),\n y2: scale(value),\n tx: b.x0 - 6,\n ty: scale(value),\n anchor: 'end',\n }\n : {\n value,\n x1: scale(value),\n x2: scale(value),\n y1: b.y0,\n y2: b.y1,\n tx: scale(value),\n ty: b.y1 + AXIS_BAND / 2 + 2,\n anchor: 'middle',\n },\n );\n });\n\n protected readonly categoryTicks = computed(() => {\n const b = this.box();\n const list = this.bandList();\n if (this.vertical()) {\n const every = this.labelEvery(b.x1 - b.x0);\n return list\n .map((band, index) => ({\n index,\n x: band.center,\n y: b.y1 + AXIS_BAND / 2 + 2,\n anchor: 'middle',\n }))\n .filter((c) => c.index % every === 0);\n }\n return list.map((band, index) => ({ index, x: b.x0 - 8, y: band.center, anchor: 'end' }));\n });\n\n /** Hit targets cover the whole band, bigger than the marks. */\n protected readonly hits = computed(() => {\n const b = this.box();\n return this.bandList().map((band, index) =>\n this.vertical()\n ? { index, x: band.start, y: b.y0, w: band.step, h: b.y1 - b.y0 }\n : { index, x: b.x0, y: band.start, w: b.x1 - b.x0, h: band.step },\n );\n });\n\n protected readonly bandRect = computed(() => {\n const hit = this.hits()[this.active()];\n if (!hit) return { x: 0, y: 0, w: 0, h: 0 };\n const inset = 2;\n return {\n x: hit.x + inset,\n y: hit.y + inset,\n w: Math.max(0, hit.w - inset * 2),\n h: Math.max(0, hit.h - inset * 2),\n };\n });\n\n protected readonly tooltip = computed(() => {\n const i = this.active();\n const band = this.bandList()[i];\n if (!band) return null;\n const b = this.box();\n return this.vertical()\n ? { x: band.center, y: b.y0 }\n : { x: b.x0 + (b.x1 - b.x0) / 2, y: band.center };\n });\n\n protected onPointer(event: PointerEvent): void {\n const svg = event.currentTarget as SVGSVGElement;\n const rect = svg.getBoundingClientRect();\n const pos = this.vertical() ? event.clientX - rect.left : event.clientY - rect.top;\n this.pointerAt(pos, this.categoryRange());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { areaPath, extent, linePath, type VdPoint } from './core/chart-math';\nimport { VdChartBase } from './chart-base';\nimport { VdChartFrame } from './chart-frame';\n\nconst PAD = 12;\nconst AXIS_BAND = 22;\n/** Direct end labels only while they stay sparing (dataviz: <= 4 series). */\nconst MAX_END_LABELS = 4;\nconst END_LABEL_GAP = 14;\n\n/**\n * Line chart for trends over ordered categories. One series gets a soft area wash; several use\n * the categorical palette with a legend and direct end labels. Spec: specs/chart.md\n */\n@Component({\n selector: 'vd-line-chart',\n imports: [VdChartFrame],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n // The `title` input would otherwise also stay as a native tooltip on the host.\n '[attr.title]': 'null',\n class: 'vd-line-chart',\n },\n template: `\n <vd-chart-frame\n kind=\"line\"\n [title]=\"title()\"\n [description]=\"description()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [format]=\"format()\"\n [categoryLabel]=\"categoryLabel()\"\n [loading]=\"loading()\"\n [active]=\"active()\"\n [tooltipX]=\"tooltip()?.x ?? null\"\n [tooltipY]=\"tooltip()?.y ?? 0\"\n (pointerLeave)=\"active.set(-1)\"\n >\n @if (width() > 0) {\n <svg\n class=\"vd-chart__svg\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n role=\"group\"\n [attr.aria-labelledby]=\"frame().titleId\"\n (pointermove)=\"onPointer($event)\"\n >\n <g class=\"vd-chart__grid\" aria-hidden=\"true\">\n @for (t of tickMarks(); track t.value) {\n <line\n [attr.x1]=\"box().x0\"\n [attr.x2]=\"box().x1\"\n [attr.y1]=\"t.y\"\n [attr.y2]=\"t.y\"\n [attr.data-zero]=\"t.value === 0 ? '' : null\"\n />\n <text\n [attr.x]=\"box().x0 - 6\"\n [attr.y]=\"t.y\"\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n >\n {{ tickText(t.value) }}\n </text>\n }\n </g>\n <g class=\"vd-chart__marks\" aria-hidden=\"true\">\n @if (showArea()) {\n <path class=\"vd-chart__area\" [attr.d]=\"areaD()\" [attr.data-series]=\"slot(0)\" />\n }\n @for (l of lines(); track $index) {\n <path class=\"vd-chart__line\" [attr.d]=\"l\" [attr.data-series]=\"slot($index)\" />\n }\n @if (active() >= 0) {\n <line\n class=\"vd-chart__crosshair\"\n [attr.x1]=\"xs()[active()]\"\n [attr.x2]=\"xs()[active()]\"\n [attr.y1]=\"box().y0\"\n [attr.y2]=\"box().y1\"\n />\n }\n @for (d of dots(); track $index) {\n <circle\n class=\"vd-chart__dot\"\n [attr.cx]=\"d.x\"\n [attr.cy]=\"d.y\"\n r=\"4\"\n [attr.data-series]=\"slot(d.series)\"\n />\n }\n </g>\n <g class=\"vd-chart__end-labels\" aria-hidden=\"true\">\n @for (e of endLabels(); track e.series) {\n <text [attr.x]=\"e.x\" [attr.y]=\"e.y\" dominant-baseline=\"middle\">\n {{ series()[e.series].name }}\n </text>\n }\n </g>\n <g class=\"vd-chart__axis\" aria-hidden=\"true\">\n @for (c of categoryTicks(); track c.index) {\n <text\n [attr.x]=\"c.x\"\n [attr.y]=\"box().y1 + 13\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n >\n {{ categories()[c.index] }}\n </text>\n }\n </g>\n <g class=\"vd-chart__hits\">\n @for (x of xs(); track $index; let i = $index) {\n <rect\n class=\"vd-chart__hit\"\n rx=\"6\"\n role=\"img\"\n [attr.data-index]=\"i\"\n [attr.tabindex]=\"i === focusIndex() ? 0 : -1\"\n [attr.aria-label]=\"pointLabel(i)\"\n [attr.x]=\"x - step() / 2\"\n [attr.y]=\"box().y0\"\n [attr.width]=\"step()\"\n [attr.height]=\"box().y1 - box().y0\"\n (focus)=\"onFocus(i)\"\n (blur)=\"onBlur($event)\"\n (keydown)=\"onKeydown($event, i)\"\n />\n }\n </g>\n </svg>\n }\n </vd-chart-frame>\n `,\n})\nexport class VdLineChart extends VdChartBase {\n /** Soft area under a single series; ignored with several series. */\n readonly area = input(true, { transform: booleanAttribute });\n\n protected readonly stackedValues = () => false;\n protected extentOf() {\n return extent(this.series(), this.count(), false);\n }\n\n protected readonly showArea = computed(() => this.area() && this.series().length === 1);\n private readonly labelled = computed(\n () => this.series().length > 1 && this.series().length <= MAX_END_LABELS,\n );\n\n protected readonly box = computed(() => {\n const longest = Math.max(...this.series().map((s) => s.name.length), 0);\n const end = this.labelled() ? Math.min(longest * 6.8 + END_LABEL_GAP, this.width() * 0.3) : PAD;\n return { x0: this.tickWidth(), x1: this.width() - end, y0: PAD, y1: this.height() - AXIS_BAND };\n });\n\n private readonly scale = computed(() => this.valueScale([this.box().y1, this.box().y0]));\n\n /** Point positions: first and last categories sit on the plot edges. */\n protected readonly xs = computed(() => {\n const { x0, x1 } = this.box();\n const n = this.count();\n if (n <= 1) return [(x0 + x1) / 2];\n return Array.from({ length: n }, (_, i) => x0 + (i * (x1 - x0)) / (n - 1));\n });\n protected readonly step = computed(() => {\n const xs = this.xs();\n return xs.length > 1 ? xs[1] - xs[0] : this.box().x1 - this.box().x0;\n });\n\n private readonly points = computed(() =>\n this.series().map((s) =>\n this.xs().map((x, i): VdPoint => {\n const v = s.values[i];\n return v === null || v === undefined || !Number.isFinite(v) ? null : [x, this.scale()(v)];\n }),\n ),\n );\n\n protected readonly lines = computed(() => this.points().map((p) => linePath(p)));\n protected readonly areaD = computed(() => areaPath(this.points()[0] ?? [], this.scale()(0)));\n\n protected readonly tickMarks = computed(() =>\n this.ticks().map((value) => ({ value, y: this.scale()(value) })),\n );\n\n protected readonly categoryTicks = computed(() => {\n const every = this.labelEvery(this.box().x1 - this.box().x0);\n return this.xs()\n .map((x, index) => ({ index, x }))\n .filter((c) => c.index % every === 0 || c.index === this.count() - 1)\n .filter((c, i, all) => i === all.length - 1 || all[all.length - 1].index - c.index >= every);\n });\n\n /** Active point of every series, else the last point (current period). */\n protected readonly dots = computed(() => {\n const at = this.active() >= 0 ? this.active() : this.count() - 1;\n return this.points().flatMap((p, series) => {\n const point = p[at];\n return point ? [{ x: point[0], y: point[1], series }] : [];\n });\n });\n\n /** Names at line ends; labels that would collide fall back to the legend. */\n protected readonly endLabels = computed(() => {\n if (!this.labelled()) return [];\n const x = this.box().x1 + 8;\n const placed: { series: number; x: number; y: number }[] = [];\n this.points()\n .map((p, series) => ({ series, y: [...p].reverse().find((q) => q)?.[1] }))\n .filter((e): e is { series: number; y: number } => e.y !== undefined)\n .sort((a, b) => a.y - b.y)\n .forEach((e) => {\n if (placed.every((p) => Math.abs(p.y - e.y) >= 14)) placed.push({ ...e, x });\n });\n return placed;\n });\n\n protected readonly tooltip = computed(() => {\n const x = this.xs()[this.active()];\n return x === undefined ? null : { x, y: this.box().y0 };\n });\n\n protected onPointer(event: PointerEvent): void {\n const rect = (event.currentTarget as SVGSVGElement).getBoundingClientRect();\n const { x0, x1 } = this.box();\n const half = this.step() / 2;\n this.pointerAt(event.clientX - rect.left, [x0 - half, x1 + half]);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { VD_LOCALE, vdTexts } from '@vadem/ui/locale';\nimport { areaPath, linePath, linearScale, type VdPoint } from './core/chart-math';\nimport type { VdChartFormat } from './chart-frame';\n\n/** Fixed drawing box; the SVG scales to its container without distorting strokes. */\nconst W = 120;\nconst H = 32;\nconst INSET = 4;\n\n/**\n * Word-sized trend: line in the de-emphasis ink, current (last) point in the accent.\n * A single image with a spoken summary. Spec: specs/chart.md\n */\n@Component({\n selector: 'vd-sparkline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'vd-sparkline' },\n template: `\n <svg\n class=\"vd-sparkline__svg\"\n [attr.viewBox]=\"'0 0 ' + W + ' ' + H\"\n preserveAspectRatio=\"none\"\n role=\"img\"\n [attr.aria-label]=\"summary()\"\n >\n <path class=\"vd-sparkline__area\" [attr.d]=\"area()\" />\n <path class=\"vd-sparkline__line\" [attr.d]=\"line()\" vector-effect=\"non-scaling-stroke\" />\n </svg>\n @if (last(); as p) {\n <span\n class=\"vd-sparkline__dot\"\n aria-hidden=\"true\"\n [style.--vd-sparkline-x.%]=\"(p[0] / W) * 100\"\n [style.--vd-sparkline-y.%]=\"(p[1] / H) * 100\"\n ></span>\n }\n `,\n})\nexport class VdSparkline {\n readonly values = input<readonly (number | null)[]>([]);\n /** What the trend shows, e.g. \"Дохід за 12 тижнів\". */\n readonly label = input.required<string>();\n readonly format = input<VdChartFormat>();\n readonly trendSummary =\n input<(first: string, last: string, min: string, max: string) => string>();\n\n protected readonly W = W;\n protected readonly H = H;\n protected readonly t = vdTexts('chart', { trendSummary: this.trendSummary });\n private readonly locale = inject(VD_LOCALE);\n\n private readonly numbers = computed(() =>\n this.values().filter((v): v is number => v !== null && Number.isFinite(v)),\n );\n\n private readonly points = computed<VdPoint[]>(() => {\n const values = this.values();\n const nums = this.numbers();\n if (!nums.length) return [];\n const min = Math.min(...nums);\n const max = Math.max(...nums);\n const y = linearScale(min === max ? [min - 1, max + 1] : [min, max], [H - INSET, INSET]);\n const n = values.length;\n return values.map((v, i) =>\n v === null || !Number.isFinite(v) ? null : [n > 1 ? (i * W) / (n - 1) : W / 2, y(v)],\n );\n });\n\n protected readonly line = computed(() => linePath(this.points()));\n protected readonly area = computed(() => areaPath(this.points(), H));\n protected readonly last = computed(() => [...this.points()].reverse().find((p) => p) ?? null);\n\n protected readonly summary = computed(() => {\n const nums = this.numbers();\n if (!nums.length) return this.label();\n const fmt = this.format() ?? ((v: number) => new Intl.NumberFormat(this.locale.code).format(v));\n const text = this.t().trendSummary(\n fmt(nums[0]),\n fmt(nums[nums.length - 1]),\n fmt(Math.min(...nums)),\n fmt(Math.max(...nums)),\n );\n return `${this.label()}: ${text}`;\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { Directive, model } from "@angular/core";
|
|
3
|
+
import { VdFieldControlBase } from "@vadem/ui/field";
|
|
4
|
+
var VdCheckbox = class VdCheckbox extends VdFieldControlBase {
|
|
5
|
+
indeterminate = model(false, ...ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []);
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
7
|
+
minVersion: "12.0.0",
|
|
8
|
+
version: "22.2.1",
|
|
9
|
+
ngImport: i0,
|
|
10
|
+
type: VdCheckbox,
|
|
11
|
+
deps: null,
|
|
12
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
13
|
+
});
|
|
14
|
+
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
15
|
+
minVersion: "17.1.0",
|
|
16
|
+
version: "22.2.1",
|
|
17
|
+
type: VdCheckbox,
|
|
18
|
+
isStandalone: true,
|
|
19
|
+
selector: "input[type=checkbox][vdCheckbox]",
|
|
20
|
+
inputs: { indeterminate: {
|
|
21
|
+
classPropertyName: "indeterminate",
|
|
22
|
+
publicName: "indeterminate",
|
|
23
|
+
isSignal: true,
|
|
24
|
+
isRequired: false,
|
|
25
|
+
transformFunction: null
|
|
26
|
+
} },
|
|
27
|
+
outputs: { indeterminate: "indeterminateChange" },
|
|
28
|
+
host: {
|
|
29
|
+
listeners: { "change": "indeterminate.set(false)" },
|
|
30
|
+
properties: { "indeterminate": "indeterminate()" },
|
|
31
|
+
classAttribute: "vd-checkbox"
|
|
32
|
+
},
|
|
33
|
+
usesInheritance: true,
|
|
34
|
+
ngImport: i0
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
38
|
+
minVersion: "12.0.0",
|
|
39
|
+
version: "22.2.1",
|
|
40
|
+
ngImport: i0,
|
|
41
|
+
type: VdCheckbox,
|
|
42
|
+
decorators: [{
|
|
43
|
+
type: Directive,
|
|
44
|
+
args: [{
|
|
45
|
+
selector: "input[type=checkbox][vdCheckbox]",
|
|
46
|
+
host: {
|
|
47
|
+
class: "vd-checkbox",
|
|
48
|
+
"[indeterminate]": "indeterminate()",
|
|
49
|
+
"(change)": "indeterminate.set(false)"
|
|
50
|
+
}
|
|
51
|
+
}]
|
|
52
|
+
}],
|
|
53
|
+
propDecorators: { indeterminate: [{
|
|
54
|
+
type: i0.Input,
|
|
55
|
+
args: [{
|
|
56
|
+
isSignal: true,
|
|
57
|
+
alias: "indeterminate",
|
|
58
|
+
required: false
|
|
59
|
+
}]
|
|
60
|
+
}, {
|
|
61
|
+
type: i0.Output,
|
|
62
|
+
args: ["indeterminateChange"]
|
|
63
|
+
}] }
|
|
64
|
+
});
|
|
65
|
+
export { VdCheckbox };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=vadem-ui-checkbox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vadem-ui-checkbox.mjs","names":[],"sources":["../../../projects/ui/checkbox/src/checkbox.ts"],"sourcesContent":["import { Directive, model } from '@angular/core';\nimport { VdFieldControlBase } from '@vadem/ui/field';\n\n/**\n * Styles a native `<input type=\"checkbox\">`. Checked state, keyboard and forms stay native.\n * Spec: specs/checkbox.md\n */\n@Directive({\n selector: 'input[type=checkbox][vdCheckbox]',\n host: {\n class: 'vd-checkbox',\n '[indeterminate]': 'indeterminate()',\n // The browser clears the mixed state on click; keep the model in sync.\n '(change)': 'indeterminate.set(false)',\n },\n})\nexport class VdCheckbox extends VdFieldControlBase {\n /** Mixed state (e.g. \"select all\" with some items selected). Two-way bindable. */\n readonly indeterminate = model(false);\n}\n"],"mappings":";;;AAgBA,IAAa,aAAb,MAAa,mBAAmB,mBAAkB;CAEvC,gBAAgB,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAF1B,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,eAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,eAAA,sBAAA;EAAA,MAAA;GAAA,WAAA,EAAA,UAAA,2BAAA;GAAA,YAAA,EAAA,iBAAA,kBAAA;GAAA,gBAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAAV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EATtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,OAAO;IACP,mBAAmB;IAEnB,YAAY;GACb;EACF,CAAA"}
|