ngwr 15.0.1 → 15.2.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/anchor/styles/_index.scss +13 -2
- package/bits/aurora/styles/_rules.scss +11 -0
- package/bits/dot-grid/dot-grid.scss +1 -0
- package/bits/dot-grid/styles/_index.scss +8 -0
- package/bits/dot-grid/styles/_rules.scss +54 -0
- package/bits/iridescence/iridescence.scss +1 -0
- package/bits/iridescence/styles/_index.scss +8 -0
- package/bits/iridescence/styles/_rules.scss +72 -0
- package/bits/marquee/styles/_rules.scss +7 -3
- package/bits/ripple-grid/ripple-grid.scss +1 -0
- package/bits/ripple-grid/styles/_index.scss +8 -0
- package/bits/ripple-grid/styles/_rules.scss +63 -0
- package/bits/spotlight-card/styles/_rules.scss +7 -4
- package/bits/star-border/styles/_rules.scss +5 -2
- package/bits/threads/styles/_index.scss +8 -0
- package/bits/threads/styles/_rules.scss +76 -0
- package/bits/threads/threads.scss +1 -0
- package/bits/waves/styles/_rules.scss +8 -1
- package/charts/bar-chart/styles/_index.scss +607 -7
- package/charts/boxplot-chart/styles/_index.scss +297 -0
- package/charts/bullet-chart/styles/_index.scss +268 -0
- package/charts/calendar-heatmap/styles/_index.scss +25 -3
- package/charts/candlestick-chart/styles/_index.scss +307 -0
- package/charts/chart-legend/styles/_index.scss +143 -0
- package/charts/core/styles/_index.scss +30 -0
- package/charts/donut-chart/styles/_index.scss +39 -3
- package/charts/funnel-chart/styles/_index.scss +237 -0
- package/charts/gauge/styles/_index.scss +4 -2
- package/charts/heatmap-chart/styles/_index.scss +329 -0
- package/charts/line-chart/styles/_index.scss +141 -8
- package/charts/meter-group/styles/_index.scss +44 -13
- package/charts/radar-chart/styles/_index.scss +206 -0
- package/charts/scatter-chart/styles/_index.scss +245 -0
- package/charts/sparkline/styles/_index.scss +10 -1
- package/charts/treemap-chart/styles/_index.scss +215 -0
- package/charts/waterfall-chart/styles/_index.scss +321 -0
- package/collapse/styles/_index.scss +6 -1
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bits-aurora.mjs +30 -38
- package/fesm2022/ngwr-bits-aurora.mjs.map +1 -1
- package/fesm2022/ngwr-bits-blur-text.mjs +3 -3
- package/fesm2022/ngwr-bits-border-glow-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bits-border-glow.mjs +11 -5
- package/fesm2022/ngwr-bits-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-bits-circular-text.mjs +3 -3
- package/fesm2022/ngwr-bits-click-spark.mjs +3 -3
- package/fesm2022/ngwr-bits-confetti.mjs +3 -3
- package/fesm2022/ngwr-bits-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-bits-dot-grid-testing.mjs +40 -0
- package/fesm2022/ngwr-bits-dot-grid-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bits-dot-grid.mjs +482 -0
- package/fesm2022/ngwr-bits-dot-grid.mjs.map +1 -0
- package/fesm2022/ngwr-bits-falling-text.mjs +3 -3
- package/fesm2022/ngwr-bits-fuzzy-text.mjs +3 -3
- package/fesm2022/ngwr-bits-glitch-text.mjs +3 -3
- package/fesm2022/ngwr-bits-gradient-text.mjs +3 -3
- package/fesm2022/ngwr-bits-iridescence-testing.mjs +31 -0
- package/fesm2022/ngwr-bits-iridescence-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bits-iridescence.mjs +591 -0
- package/fesm2022/ngwr-bits-iridescence.mjs.map +1 -0
- package/fesm2022/ngwr-bits-marquee-testing.mjs +1 -1
- package/fesm2022/ngwr-bits-marquee-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bits-marquee.mjs +7 -7
- package/fesm2022/ngwr-bits-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-bits-ripple-grid-testing.mjs +40 -0
- package/fesm2022/ngwr-bits-ripple-grid-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bits-ripple-grid.mjs +805 -0
- package/fesm2022/ngwr-bits-ripple-grid.mjs.map +1 -0
- package/fesm2022/ngwr-bits-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-bits-shiny-text.mjs +6 -6
- package/fesm2022/ngwr-bits-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-bits-split-text.mjs +3 -3
- package/fesm2022/ngwr-bits-spotlight-card-testing.mjs +1 -1
- package/fesm2022/ngwr-bits-spotlight-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bits-spotlight-card.mjs +10 -10
- package/fesm2022/ngwr-bits-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-bits-star-border-testing.mjs +1 -1
- package/fesm2022/ngwr-bits-star-border-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bits-star-border.mjs +7 -7
- package/fesm2022/ngwr-bits-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-bits-threads-testing.mjs +41 -0
- package/fesm2022/ngwr-bits-threads-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bits-threads.mjs +482 -0
- package/fesm2022/ngwr-bits-threads.mjs.map +1 -0
- package/fesm2022/ngwr-bits-tilt-card.mjs +6 -6
- package/fesm2022/ngwr-bits-typewriter.mjs +3 -3
- package/fesm2022/ngwr-bits-waves-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bits-waves.mjs +60 -41
- package/fesm2022/ngwr-bits-waves.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +8 -8
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-calendar.mjs +3 -3
- package/fesm2022/ngwr-card.mjs +9 -9
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-cascader.mjs +5 -5
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-charts-bar-chart-testing.mjs +127 -3
- package/fesm2022/ngwr-charts-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-bar-chart.mjs +683 -49
- package/fesm2022/ngwr-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/ngwr-charts-boxplot-chart-testing.mjs +161 -0
- package/fesm2022/ngwr-charts-boxplot-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-boxplot-chart.mjs +517 -0
- package/fesm2022/ngwr-charts-boxplot-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-bullet-chart-testing.mjs +68 -0
- package/fesm2022/ngwr-charts-bullet-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-bullet-chart.mjs +459 -0
- package/fesm2022/ngwr-charts-bullet-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-calendar-heatmap-testing.mjs +27 -0
- package/fesm2022/ngwr-charts-calendar-heatmap-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-calendar-heatmap.mjs +96 -17
- package/fesm2022/ngwr-charts-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-charts-candlestick-chart-testing.mjs +107 -0
- package/fesm2022/ngwr-charts-candlestick-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-candlestick-chart.mjs +508 -0
- package/fesm2022/ngwr-charts-candlestick-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-chart-legend-testing.mjs +126 -0
- package/fesm2022/ngwr-charts-chart-legend-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-chart-legend.mjs +251 -0
- package/fesm2022/ngwr-charts-chart-legend.mjs.map +1 -0
- package/fesm2022/ngwr-charts-core.mjs +383 -0
- package/fesm2022/ngwr-charts-core.mjs.map +1 -0
- package/fesm2022/ngwr-charts-donut-chart-testing.mjs +10 -1
- package/fesm2022/ngwr-charts-donut-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-donut-chart.mjs +187 -31
- package/fesm2022/ngwr-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-charts-funnel-chart-testing.mjs +100 -0
- package/fesm2022/ngwr-charts-funnel-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-funnel-chart.mjs +415 -0
- package/fesm2022/ngwr-charts-funnel-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-gauge-testing.mjs +9 -3
- package/fesm2022/ngwr-charts-gauge-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-gauge.mjs +9 -15
- package/fesm2022/ngwr-charts-gauge.mjs.map +1 -1
- package/fesm2022/ngwr-charts-heatmap-chart-testing.mjs +120 -0
- package/fesm2022/ngwr-charts-heatmap-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-heatmap-chart.mjs +519 -0
- package/fesm2022/ngwr-charts-heatmap-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-line-chart-testing.mjs +43 -1
- package/fesm2022/ngwr-charts-line-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-line-chart.mjs +436 -122
- package/fesm2022/ngwr-charts-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-charts-meter-group-testing.mjs +14 -2
- package/fesm2022/ngwr-charts-meter-group-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-meter-group.mjs +101 -32
- package/fesm2022/ngwr-charts-meter-group.mjs.map +1 -1
- package/fesm2022/ngwr-charts-radar-chart-testing.mjs +98 -0
- package/fesm2022/ngwr-charts-radar-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-radar-chart.mjs +720 -0
- package/fesm2022/ngwr-charts-radar-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-scatter-chart-testing.mjs +132 -0
- package/fesm2022/ngwr-charts-scatter-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-scatter-chart.mjs +545 -0
- package/fesm2022/ngwr-charts-scatter-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-sparkline-testing.mjs.map +1 -1
- package/fesm2022/ngwr-charts-sparkline.mjs +14 -16
- package/fesm2022/ngwr-charts-sparkline.mjs.map +1 -1
- package/fesm2022/ngwr-charts-treemap-chart-testing.mjs +103 -0
- package/fesm2022/ngwr-charts-treemap-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-treemap-chart.mjs +535 -0
- package/fesm2022/ngwr-charts-treemap-chart.mjs.map +1 -0
- package/fesm2022/ngwr-charts-waterfall-chart-testing.mjs +131 -0
- package/fesm2022/ngwr-charts-waterfall-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-charts-waterfall-chart.mjs +462 -0
- package/fesm2022/ngwr-charts-waterfall-chart.mjs.map +1 -0
- package/fesm2022/ngwr-checkbox.mjs +6 -6
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-color-picker.mjs +6 -6
- package/fesm2022/ngwr-command-palette.mjs +3 -3
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-context-menu.mjs +12 -12
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-counter.mjs +6 -6
- package/fesm2022/ngwr-date-picker.mjs +21 -21
- package/fesm2022/ngwr-date.mjs +6 -6
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-dialog.mjs +15 -15
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-drawer.mjs +18 -18
- package/fesm2022/ngwr-dropdown.mjs +9 -9
- package/fesm2022/ngwr-editor.mjs +3 -3
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar.mjs +6 -6
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-form.mjs +9 -9
- package/fesm2022/ngwr-graph.mjs +6 -6
- package/fesm2022/ngwr-hotkey.mjs +6 -6
- package/fesm2022/ngwr-i18n-ar.mjs +90 -4
- package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-cs.mjs +90 -4
- package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-de.mjs +90 -4
- package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +90 -4
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-es.mjs +90 -4
- package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-fr.mjs +90 -4
- package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-he.mjs +90 -4
- package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-hi.mjs +90 -4
- package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-id.mjs +90 -4
- package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-it.mjs +90 -4
- package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ja.mjs +90 -4
- package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ko.mjs +90 -4
- package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-nl.mjs +90 -4
- package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pl.mjs +90 -4
- package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pt.mjs +90 -4
- package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +90 -4
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-sv.mjs +90 -4
- package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-tr.mjs +90 -4
- package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-uk.mjs +90 -4
- package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-vi.mjs +90 -4
- package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh-tw.mjs +90 -4
- package/fesm2022/ngwr-i18n-zh-tw.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh.mjs +90 -4
- package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-input-number.mjs +3 -3
- package/fesm2022/ngwr-input-otp.mjs +3 -3
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +5 -5
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +8 -8
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +6 -6
- package/fesm2022/ngwr-mention.mjs +6 -6
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-overlay.mjs +6 -6
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs +3 -3
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-platform.mjs +6 -6
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popover.mjs +43 -20
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs +4 -3
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-schema-form.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs +3 -3
- package/fesm2022/ngwr-select.mjs +12 -12
- package/fesm2022/ngwr-sidebar.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +3 -3
- package/fesm2022/ngwr-sortable-list.mjs +11 -11
- package/fesm2022/ngwr-sortable-list.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-storage.mjs +3 -3
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-table.mjs +18 -18
- package/fesm2022/ngwr-tabs-router.mjs +3 -3
- package/fesm2022/ngwr-tabs.mjs +6 -6
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast-testing.mjs +2 -1
- package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
- package/fesm2022/ngwr-toast.mjs +34 -15
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tour.mjs +6 -6
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs +3 -3
- package/fesm2022/ngwr-typography.mjs +3 -3
- package/fesm2022/ngwr-utils.mjs +31 -1
- package/fesm2022/ngwr-utils.mjs.map +1 -1
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
- package/fesm2022/ngwr-window-testing.mjs +61 -5
- package/fesm2022/ngwr-window-testing.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +1538 -895
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/fesm2022/ngwr.mjs.map +1 -1
- package/i18n/ar.json +84 -4
- package/i18n/cs.json +84 -4
- package/i18n/de.json +84 -4
- package/i18n/en.json +84 -4
- package/i18n/es.json +84 -4
- package/i18n/fr.json +84 -4
- package/i18n/he.json +84 -4
- package/i18n/hi.json +84 -4
- package/i18n/id.json +84 -4
- package/i18n/it.json +84 -4
- package/i18n/ja.json +84 -4
- package/i18n/ko.json +84 -4
- package/i18n/nl.json +84 -4
- package/i18n/pl.json +84 -4
- package/i18n/pt.json +84 -4
- package/i18n/ru.json +84 -4
- package/i18n/sv.json +84 -4
- package/i18n/tr.json +84 -4
- package/i18n/uk.json +84 -4
- package/i18n/vi.json +84 -4
- package/i18n/zh-TW.json +84 -4
- package/i18n/zh.json +84 -4
- package/llms-full.txt +266 -9
- package/llms.txt +30 -7
- package/mcp/api.js +69 -1
- package/mcp/catalog.js +10 -1
- package/mcp/server.js +15 -1
- package/mcp/tools.js +122 -26
- package/package.json +132 -1
- package/popover/styles/_index.scss +75 -7
- package/schematics/component-style/index.js +3 -0
- package/schematics/migrations/v15/index.js +3 -26
- package/schematics/ng-add/index.js +2 -2
- package/schematics/use/symbol-map.json +14 -0
- package/schematics/utility/global-styles.js +19 -4
- package/schematics/utility/v15-moves.js +55 -0
- package/skills/ngwr/SKILL.md +8 -2
- package/skills/ngwr/references/catalog.md +28 -0
- package/skills/ngwr/references/setup.md +5 -4
- package/theme/styles/_focus.scss +8 -0
- package/toast/styles/_index.scss +103 -12
- package/types/ngwr-bits-aurora.d.ts +11 -0
- package/types/ngwr-bits-border-glow-testing.d.ts +5 -6
- package/types/ngwr-bits-border-glow.d.ts +5 -1
- package/types/ngwr-bits-dot-grid-testing.d.ts +92 -0
- package/types/ngwr-bits-dot-grid.d.ts +158 -0
- package/types/ngwr-bits-iridescence-testing.d.ts +85 -0
- package/types/ngwr-bits-iridescence.d.ts +244 -0
- package/types/ngwr-bits-ripple-grid-testing.d.ts +96 -0
- package/types/ngwr-bits-ripple-grid.d.ts +294 -0
- package/types/ngwr-bits-splash-cursor.d.ts +0 -1
- package/types/ngwr-bits-spotlight-card-testing.d.ts +3 -1
- package/types/ngwr-bits-star-border-testing.d.ts +7 -7
- package/types/ngwr-bits-threads-testing.d.ts +97 -0
- package/types/ngwr-bits-threads.d.ts +216 -0
- package/types/ngwr-bits-waves-testing.d.ts +1 -1
- package/types/ngwr-bits-waves.d.ts +20 -3
- package/types/ngwr-charts-bar-chart-testing.d.ts +193 -14
- package/types/ngwr-charts-bar-chart.d.ts +546 -38
- package/types/ngwr-charts-boxplot-chart-testing.d.ts +165 -0
- package/types/ngwr-charts-boxplot-chart.d.ts +308 -0
- package/types/ngwr-charts-bullet-chart-testing.d.ts +99 -0
- package/types/ngwr-charts-bullet-chart.d.ts +262 -0
- package/types/ngwr-charts-calendar-heatmap-testing.d.ts +32 -1
- package/types/ngwr-charts-calendar-heatmap.d.ts +55 -6
- package/types/ngwr-charts-candlestick-chart-testing.d.ts +135 -0
- package/types/ngwr-charts-candlestick-chart.d.ts +361 -0
- package/types/ngwr-charts-chart-legend-testing.d.ts +84 -0
- package/types/ngwr-charts-chart-legend.d.ts +178 -0
- package/types/ngwr-charts-core.d.ts +391 -0
- package/types/ngwr-charts-donut-chart-testing.d.ts +28 -5
- package/types/ngwr-charts-donut-chart.d.ts +124 -12
- package/types/ngwr-charts-funnel-chart-testing.d.ts +130 -0
- package/types/ngwr-charts-funnel-chart.d.ts +296 -0
- package/types/ngwr-charts-gauge-testing.d.ts +5 -0
- package/types/ngwr-charts-gauge.d.ts +6 -4
- package/types/ngwr-charts-heatmap-chart-testing.d.ts +148 -0
- package/types/ngwr-charts-heatmap-chart.d.ts +359 -0
- package/types/ngwr-charts-line-chart-testing.d.ts +72 -11
- package/types/ngwr-charts-line-chart.d.ts +291 -67
- package/types/ngwr-charts-meter-group-testing.d.ts +16 -2
- package/types/ngwr-charts-meter-group.d.ts +71 -11
- package/types/ngwr-charts-radar-chart-testing.d.ts +162 -0
- package/types/ngwr-charts-radar-chart.d.ts +461 -0
- package/types/ngwr-charts-scatter-chart-testing.d.ts +147 -0
- package/types/ngwr-charts-scatter-chart.d.ts +396 -0
- package/types/ngwr-charts-sparkline-testing.d.ts +4 -1
- package/types/ngwr-charts-sparkline.d.ts +8 -6
- package/types/ngwr-charts-treemap-chart-testing.d.ts +131 -0
- package/types/ngwr-charts-treemap-chart.d.ts +295 -0
- package/types/ngwr-charts-waterfall-chart-testing.d.ts +149 -0
- package/types/ngwr-charts-waterfall-chart.d.ts +338 -0
- package/types/ngwr-color-picker.d.ts +0 -21
- package/types/ngwr-dropdown.d.ts +0 -52
- package/types/ngwr-editor.d.ts +2 -84
- package/types/ngwr-i18n.d.ts +0 -15
- package/types/ngwr-mention.d.ts +0 -13
- package/types/ngwr-popconfirm.d.ts +0 -33
- package/types/ngwr-popover.d.ts +29 -53
- package/types/ngwr-toast-testing.d.ts +6 -1
- package/types/ngwr-tour.d.ts +0 -2
- package/types/ngwr-utils.d.ts +49 -7
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-window-testing.d.ts +65 -7
- package/types/ngwr-window.d.ts +831 -207
- package/types/ngwr.d.ts +1 -0
- package/window/styles/_index.scss +528 -82
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { Component, DestroyRef, LOCALE_ID, ViewEncapsulation, afterNextRender, computed, effect, inject, input, isDevMode, signal, viewChild, viewChildren } from "@angular/core";
|
|
3
|
+
import { coerceBooleanProperty, coerceNumberProperty } from "@angular/cdk/coercion";
|
|
4
|
+
import { readI18nText, useI18nText } from "ngwr/i18n";
|
|
5
|
+
import { WrChartTable, chartColor, useChartNumbers } from "ngwr/charts/core";
|
|
6
|
+
import { useChartTooltip } from "ngwr/popover";
|
|
7
|
+
/**
|
|
8
|
+
* @license
|
|
9
|
+
*
|
|
10
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
11
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
12
|
+
*/
|
|
13
|
+
function worst(items, start, end, sum, side) {
|
|
14
|
+
let largest = 0;
|
|
15
|
+
let smallest = Number.POSITIVE_INFINITY;
|
|
16
|
+
for (let k = start; k < end; k++) {
|
|
17
|
+
largest = Math.max(largest, items[k].area);
|
|
18
|
+
smallest = Math.min(smallest, items[k].area);
|
|
19
|
+
}
|
|
20
|
+
const s2 = sum * sum;
|
|
21
|
+
const w2 = side * side;
|
|
22
|
+
return Math.max(w2 * largest / s2, s2 / (w2 * smallest));
|
|
23
|
+
}
|
|
24
|
+
function squarify(values, box) {
|
|
25
|
+
const out = values.map(() => null);
|
|
26
|
+
const positive = values.flatMap((value, index) => Number.isFinite(value) && value > 0 ? [{
|
|
27
|
+
index,
|
|
28
|
+
value
|
|
29
|
+
}] : []);
|
|
30
|
+
const total = positive.reduce((sum, item) => sum + item.value, 0);
|
|
31
|
+
if (positive.length === 0 || !(total > 0) || !(box.width > 0) || !(box.height > 0)) return out;
|
|
32
|
+
const scale = box.width * box.height / total;
|
|
33
|
+
const items = positive.map(({ index, value }) => ({
|
|
34
|
+
index,
|
|
35
|
+
area: value * scale
|
|
36
|
+
}));
|
|
37
|
+
let { x, y, width, height } = box;
|
|
38
|
+
let start = 0;
|
|
39
|
+
while (start < items.length) {
|
|
40
|
+
const side = Math.min(width, height);
|
|
41
|
+
let end = start + 1;
|
|
42
|
+
let sum = items[start].area;
|
|
43
|
+
let ratio = worst(items, start, end, sum, side);
|
|
44
|
+
while (end < items.length) {
|
|
45
|
+
const next = worst(items, start, end + 1, sum + items[end].area, side);
|
|
46
|
+
if (next > ratio) break;
|
|
47
|
+
ratio = next;
|
|
48
|
+
sum += items[end].area;
|
|
49
|
+
end++;
|
|
50
|
+
}
|
|
51
|
+
const last = end === items.length;
|
|
52
|
+
if (width >= height) {
|
|
53
|
+
const depth = last ? width : Math.min(width, sum / height);
|
|
54
|
+
let top = y;
|
|
55
|
+
for (let k = start; k < end; k++) {
|
|
56
|
+
const length = k === end - 1 ? y + height - top : items[k].area / depth;
|
|
57
|
+
out[items[k].index] = {
|
|
58
|
+
x,
|
|
59
|
+
y: top,
|
|
60
|
+
width: depth,
|
|
61
|
+
height: length
|
|
62
|
+
};
|
|
63
|
+
top += length;
|
|
64
|
+
}
|
|
65
|
+
x += depth;
|
|
66
|
+
width = Math.max(0, width - depth);
|
|
67
|
+
} else {
|
|
68
|
+
const depth = last ? height : Math.min(height, sum / width);
|
|
69
|
+
let left = x;
|
|
70
|
+
for (let k = start; k < end; k++) {
|
|
71
|
+
const length = k === end - 1 ? x + width - left : items[k].area / depth;
|
|
72
|
+
out[items[k].index] = {
|
|
73
|
+
x: left,
|
|
74
|
+
y,
|
|
75
|
+
width: length,
|
|
76
|
+
height: depth
|
|
77
|
+
};
|
|
78
|
+
left += length;
|
|
79
|
+
}
|
|
80
|
+
y += depth;
|
|
81
|
+
height = Math.max(0, height - depth);
|
|
82
|
+
}
|
|
83
|
+
start = end;
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* @license
|
|
89
|
+
*
|
|
90
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
91
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
92
|
+
*/
|
|
93
|
+
const FALLBACK_WIDTH = 640;
|
|
94
|
+
const HEADER = 20;
|
|
95
|
+
const PAD = 3;
|
|
96
|
+
const MIN_INNER = 12;
|
|
97
|
+
const LABEL_MIN_WIDTH = 36;
|
|
98
|
+
const LABEL_MIN_HEIGHT = 22;
|
|
99
|
+
const VALUE_MIN_HEIGHT = 38;
|
|
100
|
+
const SEPARATOR = " / ";
|
|
101
|
+
const SUM_TOLERANCE = 1e-9;
|
|
102
|
+
const percent = (value) => Math.round(value * 1e3) / 1e3;
|
|
103
|
+
function resolveNodes(nodes, path, inherited, key) {
|
|
104
|
+
return nodes.map((node, i) => {
|
|
105
|
+
const color = node.color ?? inherited ?? chartColor(i);
|
|
106
|
+
const own = typeof node.value === "number" && Number.isFinite(node.value) ? node.value : null;
|
|
107
|
+
const ownSize = own !== null && own > 0 ? own : 0;
|
|
108
|
+
const nodePath = [...path, node.label];
|
|
109
|
+
const children = resolveNodes(node.children ?? [], nodePath, color, `${key}${i}.`);
|
|
110
|
+
const childSize = children.reduce((sum, child) => sum + child.size, 0);
|
|
111
|
+
const group = children.length > 0;
|
|
112
|
+
return {
|
|
113
|
+
key: `${key}${i}`,
|
|
114
|
+
label: node.label,
|
|
115
|
+
path: nodePath,
|
|
116
|
+
color,
|
|
117
|
+
own,
|
|
118
|
+
value: group ? own ?? childSize : own,
|
|
119
|
+
size: group ? Math.max(ownSize, childSize) : ownSize,
|
|
120
|
+
childSize,
|
|
121
|
+
children
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function flatten(nodes) {
|
|
126
|
+
return nodes.flatMap((node) => [node, ...flatten(node.children)]);
|
|
127
|
+
}
|
|
128
|
+
function placeTiles(nodes, remainder, box, options, out) {
|
|
129
|
+
const order = nodes.map((node, index) => ({
|
|
130
|
+
node,
|
|
131
|
+
index
|
|
132
|
+
})).filter(({ node }) => node.size > 0).sort((a, b) => b.node.size - a.node.size || a.index - b.index);
|
|
133
|
+
const sizes = order.map(({ node }) => node.size);
|
|
134
|
+
if (remainder > 0) sizes.push(remainder);
|
|
135
|
+
const rects = squarify(sizes, box);
|
|
136
|
+
order.forEach(({ node }, k) => {
|
|
137
|
+
const rect = rects[k];
|
|
138
|
+
if (!rect) return;
|
|
139
|
+
const roomForHeader = options.labels && rect.height >= 40 && rect.width >= LABEL_MIN_WIDTH;
|
|
140
|
+
const top = roomForHeader ? HEADER : PAD;
|
|
141
|
+
const inner = {
|
|
142
|
+
x: rect.x + PAD,
|
|
143
|
+
y: rect.y + top,
|
|
144
|
+
width: rect.width - 6,
|
|
145
|
+
height: rect.height - top - PAD
|
|
146
|
+
};
|
|
147
|
+
const group = node.childSize > 0 && inner.width >= MIN_INNER && inner.height >= MIN_INNER;
|
|
148
|
+
const labelled = !group && options.labels && rect.width >= LABEL_MIN_WIDTH && rect.height >= LABEL_MIN_HEIGHT;
|
|
149
|
+
out.push({
|
|
150
|
+
node,
|
|
151
|
+
rect,
|
|
152
|
+
group,
|
|
153
|
+
header: group && roomForHeader,
|
|
154
|
+
labelled,
|
|
155
|
+
valued: labelled && options.values && rect.height >= VALUE_MIN_HEIGHT
|
|
156
|
+
});
|
|
157
|
+
if (group) {
|
|
158
|
+
const rest = node.size - node.childSize;
|
|
159
|
+
placeTiles(node.children, rest > node.size * SUM_TOLERANCE ? rest : 0, inner, options, out);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
var WrTreemapChart = class WrTreemapChart {
|
|
164
|
+
data = input([], ...ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []);
|
|
165
|
+
ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
|
|
166
|
+
resolvedAriaLabel = useI18nText(this.ariaLabel, "treemapChart.label", "Treemap chart");
|
|
167
|
+
valueLabel = input(null, ...ngDevMode ? [{ debugName: "valueLabel" }] : /* istanbul ignore next */ []);
|
|
168
|
+
valueName = useI18nText(this.valueLabel, "treemapChart.value", "Value");
|
|
169
|
+
shareName = readI18nText("treemapChart.share", "Share");
|
|
170
|
+
height = input(280, {
|
|
171
|
+
...ngDevMode ? { debugName: "height" } : /* istanbul ignore next */ {},
|
|
172
|
+
transform: (v) => {
|
|
173
|
+
const value = coerceNumberProperty(v, 280);
|
|
174
|
+
return Number.isFinite(value) ? Math.max(80, value) : 280;
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
showLabels = input(true, {
|
|
178
|
+
...ngDevMode ? { debugName: "showLabels" } : /* istanbul ignore next */ {},
|
|
179
|
+
transform: coerceBooleanProperty
|
|
180
|
+
});
|
|
181
|
+
showValues = input(true, {
|
|
182
|
+
...ngDevMode ? { debugName: "showValues" } : /* istanbul ignore next */ {},
|
|
183
|
+
transform: coerceBooleanProperty
|
|
184
|
+
});
|
|
185
|
+
tooltip = input(true, {
|
|
186
|
+
...ngDevMode ? { debugName: "tooltip" } : /* istanbul ignore next */ {},
|
|
187
|
+
transform: coerceBooleanProperty
|
|
188
|
+
});
|
|
189
|
+
valueFormat = input(null, ...ngDevMode ? [{ debugName: "valueFormat" }] : /* istanbul ignore next */ []);
|
|
190
|
+
percentFormat = input(null, ...ngDevMode ? [{ debugName: "percentFormat" }] : /* istanbul ignore next */ []);
|
|
191
|
+
dataTable = input(false, {
|
|
192
|
+
...ngDevMode ? { debugName: "dataTable" } : /* istanbul ignore next */ {},
|
|
193
|
+
transform: coerceBooleanProperty
|
|
194
|
+
});
|
|
195
|
+
numbers = useChartNumbers(this.valueFormat);
|
|
196
|
+
shares = new Intl.NumberFormat(inject(LOCALE_ID), {
|
|
197
|
+
style: "percent",
|
|
198
|
+
maximumFractionDigits: 1
|
|
199
|
+
});
|
|
200
|
+
smallShares = new Intl.NumberFormat(inject(LOCALE_ID), {
|
|
201
|
+
style: "percent",
|
|
202
|
+
maximumSignificantDigits: 2
|
|
203
|
+
});
|
|
204
|
+
plot = viewChild.required("plot", ...ngDevMode ? [{ debugName: "plot" }] : /* istanbul ignore next */ []);
|
|
205
|
+
tileEls = viewChildren("tile", ...ngDevMode ? [{ debugName: "tileEls" }] : /* istanbul ignore next */ []);
|
|
206
|
+
box = signal(null, ...ngDevMode ? [{ debugName: "box" }] : /* istanbul ignore next */ []);
|
|
207
|
+
constructor() {
|
|
208
|
+
const destroyRef = inject(DestroyRef);
|
|
209
|
+
afterNextRender(() => {
|
|
210
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
211
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
212
|
+
const { width, height } = entry.contentRect;
|
|
213
|
+
if (width <= 0 || height <= 0) return;
|
|
214
|
+
const last = this.box();
|
|
215
|
+
if (last?.width === width && last.height === height) return;
|
|
216
|
+
this.box.set({
|
|
217
|
+
width,
|
|
218
|
+
height
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
observer.observe(this.plot().nativeElement);
|
|
222
|
+
destroyRef.onDestroy(() => observer.disconnect());
|
|
223
|
+
});
|
|
224
|
+
if (isDevMode()) {
|
|
225
|
+
const warned = /* @__PURE__ */ new Set();
|
|
226
|
+
effect(() => {
|
|
227
|
+
for (const node of this.nodes()) {
|
|
228
|
+
const path = node.path.join(SEPARATOR);
|
|
229
|
+
let problem = null;
|
|
230
|
+
if (node.own !== null && node.own < 0) {
|
|
231
|
+
const drawn = node.size > 0 ? `It is drawn at the ${node.childSize} its children add up to, which has to fit.` : "It draws no tile, and the data table still lists it.";
|
|
232
|
+
problem = `"${path}" has a negative value (${node.own}), which has no area. ${drawn}`;
|
|
233
|
+
} else if (node.children.length > 0 && node.own !== null && node.own < node.childSize * .999999999) problem = `"${path}" is given a value of ${node.own}, below the ${node.childSize} its children add up to. It is drawn at its children’s total, which has to fit.`;
|
|
234
|
+
if (problem === null || warned.has(problem)) continue;
|
|
235
|
+
warned.add(problem);
|
|
236
|
+
console.warn(`[NGWR] <wr-treemap-chart>: ${problem}`);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
tree = computed(() => resolveNodes(this.data(), [], null, ""), ...ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []);
|
|
242
|
+
nodes = computed(() => flatten(this.tree()), ...ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []);
|
|
243
|
+
total = computed(() => this.tree().reduce((sum, node) => sum + node.size, 0), ...ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []);
|
|
244
|
+
layoutBox = computed(() => this.box() ?? {
|
|
245
|
+
width: FALLBACK_WIDTH,
|
|
246
|
+
height: this.height()
|
|
247
|
+
}, ...ngDevMode ? [{ debugName: "layoutBox" }] : /* istanbul ignore next */ []);
|
|
248
|
+
tiles = computed(() => {
|
|
249
|
+
const { width, height } = this.layoutBox();
|
|
250
|
+
const placed = [];
|
|
251
|
+
placeTiles(this.tree(), 0, {
|
|
252
|
+
x: 0,
|
|
253
|
+
y: 0,
|
|
254
|
+
width,
|
|
255
|
+
height
|
|
256
|
+
}, {
|
|
257
|
+
labels: this.showLabels(),
|
|
258
|
+
values: this.showValues()
|
|
259
|
+
}, placed);
|
|
260
|
+
return placed.map((tile) => ({
|
|
261
|
+
key: tile.node.key,
|
|
262
|
+
node: tile.node,
|
|
263
|
+
group: tile.group,
|
|
264
|
+
header: tile.header,
|
|
265
|
+
labelled: tile.labelled,
|
|
266
|
+
valued: tile.valued,
|
|
267
|
+
text: tile.node.value === null ? "" : this.numbers.label(tile.node.value),
|
|
268
|
+
start: percent(tile.rect.x / width * 100),
|
|
269
|
+
top: percent(tile.rect.y / height * 100),
|
|
270
|
+
width: percent(tile.rect.width / width * 100),
|
|
271
|
+
height: percent(tile.rect.height / height * 100)
|
|
272
|
+
}));
|
|
273
|
+
}, ...ngDevMode ? [{ debugName: "tiles" }] : /* istanbul ignore next */ []);
|
|
274
|
+
headerHeight = HEADER;
|
|
275
|
+
tableData = computed(() => ({
|
|
276
|
+
caption: this.resolvedAriaLabel(),
|
|
277
|
+
columns: [this.valueName(), this.shareName()],
|
|
278
|
+
groups: [{ rows: this.nodes().map((node) => ({
|
|
279
|
+
header: node.path.join(SEPARATOR),
|
|
280
|
+
cells: [node.value === null ? "" : this.numbers.value(node.value), this.share(node)]
|
|
281
|
+
})) }]
|
|
282
|
+
}), ...ngDevMode ? [{ debugName: "tableData" }] : /* istanbul ignore next */ []);
|
|
283
|
+
tip = useChartTooltip(this.tooltip, (index) => {
|
|
284
|
+
const tile = this.tiles()[index];
|
|
285
|
+
const el = this.tileEls()[index]?.nativeElement;
|
|
286
|
+
if (!tile || !el) return null;
|
|
287
|
+
const { node } = tile;
|
|
288
|
+
const share = this.share(node);
|
|
289
|
+
return {
|
|
290
|
+
datum: {
|
|
291
|
+
label: node.path.join(SEPARATOR),
|
|
292
|
+
value: node.value === null ? "" : this.numbers.value(node.value),
|
|
293
|
+
color: node.color,
|
|
294
|
+
rows: share ? [{
|
|
295
|
+
label: this.shareName(),
|
|
296
|
+
value: share
|
|
297
|
+
}] : []
|
|
298
|
+
},
|
|
299
|
+
anchor: el
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
onPointerMove(event) {
|
|
303
|
+
const tile = event.target?.closest(".wr-treemap-chart__tile");
|
|
304
|
+
const index = tile ? Number(tile.dataset["index"]) : NaN;
|
|
305
|
+
if (Number.isInteger(index) && index >= 0) this.tip.enter(index);
|
|
306
|
+
else this.tip.leave(event);
|
|
307
|
+
}
|
|
308
|
+
share(node) {
|
|
309
|
+
const total = this.total();
|
|
310
|
+
if (node.size <= 0 || total <= 0) return "";
|
|
311
|
+
const share = node.size / total;
|
|
312
|
+
const custom = this.percentFormat();
|
|
313
|
+
if (custom) return custom(share);
|
|
314
|
+
return (share < .01 ? this.smallShares : this.shares).format(share);
|
|
315
|
+
}
|
|
316
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
317
|
+
minVersion: "12.0.0",
|
|
318
|
+
version: "22.2.4",
|
|
319
|
+
ngImport: i0,
|
|
320
|
+
type: WrTreemapChart,
|
|
321
|
+
deps: [],
|
|
322
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
323
|
+
});
|
|
324
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
325
|
+
minVersion: "17.0.0",
|
|
326
|
+
version: "22.2.4",
|
|
327
|
+
type: WrTreemapChart,
|
|
328
|
+
isStandalone: true,
|
|
329
|
+
selector: "wr-treemap-chart",
|
|
330
|
+
inputs: {
|
|
331
|
+
data: {
|
|
332
|
+
classPropertyName: "data",
|
|
333
|
+
publicName: "data",
|
|
334
|
+
isSignal: true,
|
|
335
|
+
isRequired: false,
|
|
336
|
+
transformFunction: null
|
|
337
|
+
},
|
|
338
|
+
ariaLabel: {
|
|
339
|
+
classPropertyName: "ariaLabel",
|
|
340
|
+
publicName: "ariaLabel",
|
|
341
|
+
isSignal: true,
|
|
342
|
+
isRequired: false,
|
|
343
|
+
transformFunction: null
|
|
344
|
+
},
|
|
345
|
+
valueLabel: {
|
|
346
|
+
classPropertyName: "valueLabel",
|
|
347
|
+
publicName: "valueLabel",
|
|
348
|
+
isSignal: true,
|
|
349
|
+
isRequired: false,
|
|
350
|
+
transformFunction: null
|
|
351
|
+
},
|
|
352
|
+
height: {
|
|
353
|
+
classPropertyName: "height",
|
|
354
|
+
publicName: "height",
|
|
355
|
+
isSignal: true,
|
|
356
|
+
isRequired: false,
|
|
357
|
+
transformFunction: null
|
|
358
|
+
},
|
|
359
|
+
showLabels: {
|
|
360
|
+
classPropertyName: "showLabels",
|
|
361
|
+
publicName: "showLabels",
|
|
362
|
+
isSignal: true,
|
|
363
|
+
isRequired: false,
|
|
364
|
+
transformFunction: null
|
|
365
|
+
},
|
|
366
|
+
showValues: {
|
|
367
|
+
classPropertyName: "showValues",
|
|
368
|
+
publicName: "showValues",
|
|
369
|
+
isSignal: true,
|
|
370
|
+
isRequired: false,
|
|
371
|
+
transformFunction: null
|
|
372
|
+
},
|
|
373
|
+
tooltip: {
|
|
374
|
+
classPropertyName: "tooltip",
|
|
375
|
+
publicName: "tooltip",
|
|
376
|
+
isSignal: true,
|
|
377
|
+
isRequired: false,
|
|
378
|
+
transformFunction: null
|
|
379
|
+
},
|
|
380
|
+
valueFormat: {
|
|
381
|
+
classPropertyName: "valueFormat",
|
|
382
|
+
publicName: "valueFormat",
|
|
383
|
+
isSignal: true,
|
|
384
|
+
isRequired: false,
|
|
385
|
+
transformFunction: null
|
|
386
|
+
},
|
|
387
|
+
percentFormat: {
|
|
388
|
+
classPropertyName: "percentFormat",
|
|
389
|
+
publicName: "percentFormat",
|
|
390
|
+
isSignal: true,
|
|
391
|
+
isRequired: false,
|
|
392
|
+
transformFunction: null
|
|
393
|
+
},
|
|
394
|
+
dataTable: {
|
|
395
|
+
classPropertyName: "dataTable",
|
|
396
|
+
publicName: "dataTable",
|
|
397
|
+
isSignal: true,
|
|
398
|
+
isRequired: false,
|
|
399
|
+
transformFunction: null
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
host: { classAttribute: "wr-treemap-chart" },
|
|
403
|
+
viewQueries: [{
|
|
404
|
+
propertyName: "plot",
|
|
405
|
+
first: true,
|
|
406
|
+
predicate: ["plot"],
|
|
407
|
+
descendants: true,
|
|
408
|
+
isSignal: true
|
|
409
|
+
}, {
|
|
410
|
+
propertyName: "tileEls",
|
|
411
|
+
predicate: ["tile"],
|
|
412
|
+
descendants: true,
|
|
413
|
+
isSignal: true
|
|
414
|
+
}],
|
|
415
|
+
ngImport: i0,
|
|
416
|
+
template: "@let active = tip.active();\n<!-- The drawing: one named image, every tile inside it positioned by percentages of it.\n The tiles are siblings rather than nested, parents first, so a child is drawn over\n its parent and leaving it for the parent's edge is a `mouseleave` like any other. -->\n<div\n #plot\n class=\"wr-treemap-chart__plot\"\n role=\"img\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [style.height.px]=\"height()\"\n (mousemove)=\"onPointerMove($event)\"\n (mouseleave)=\"tip.leave($event)\"\n>\n <!-- `inset-inline-start`, not `left`: the layout starts at the inline-start edge, and\n under RTL the whole drawing mirrors with it. `data-index` is what the pointer\n handler reads the tile off. -->\n @for (tile of tiles(); track tile.key) {\n <div\n #tile\n class=\"wr-treemap-chart__tile\"\n [class.wr-treemap-chart__tile--group]=\"tile.group\"\n [class.wr-treemap-chart__tile--leaf]=\"!tile.group\"\n [class.wr-treemap-chart__tile--active]=\"$index === active\"\n [attr.data-index]=\"$index\"\n [style.--wr-treemap-chart-tile-color]=\"tile.node.color\"\n [style.inset-inline-start.%]=\"tile.start\"\n [style.top.%]=\"tile.top\"\n [style.width.%]=\"tile.width\"\n [style.height.%]=\"tile.height\"\n >\n <!-- A name takes its direction from its own text (`dir=\"auto\"`), so a Latin name in an\n RTL tile is cut at its end, not its start, and a Hebrew one in an LTR tile too. A\n value does the same, so `$120K` reads in its own order beside a Hebrew name. -->\n @if (tile.header) {\n <!-- As tall as the strip the layout left above the children, written here so the\n stylesheet and the layout cannot disagree about it. -->\n <span class=\"wr-treemap-chart__header\" [style.height.px]=\"headerHeight\">\n <span class=\"wr-treemap-chart__label\" dir=\"auto\">{{ tile.node.label }}</span>\n @if (showValues() && tile.text) {\n <span class=\"wr-treemap-chart__value\" dir=\"auto\">{{ tile.text }}</span>\n }\n </span>\n } @else if (tile.labelled) {\n <span class=\"wr-treemap-chart__label\" dir=\"auto\">{{ tile.node.label }}</span>\n @if (tile.valued && tile.text) {\n <span class=\"wr-treemap-chart__value\" dir=\"auto\">{{ tile.text }}</span>\n }\n }\n </div>\n }\n</div>\n\n@if (dataTable()) {\n <!-- The figures for a screen reader, beside the drawing's `img` and never inside it:\n `img` makes everything it holds presentational. Clipped to nothing by its own\n stylesheet, so it takes no room and draws nothing. -->\n <wr-chart-table [data]=\"tableData()\" />\n}\n",
|
|
417
|
+
dependencies: [{
|
|
418
|
+
kind: "component",
|
|
419
|
+
type: WrChartTable,
|
|
420
|
+
selector: "wr-chart-table",
|
|
421
|
+
inputs: ["data"]
|
|
422
|
+
}],
|
|
423
|
+
encapsulation: i0.ViewEncapsulation.None
|
|
424
|
+
});
|
|
425
|
+
};
|
|
426
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
427
|
+
minVersion: "12.0.0",
|
|
428
|
+
version: "22.2.4",
|
|
429
|
+
ngImport: i0,
|
|
430
|
+
type: WrTreemapChart,
|
|
431
|
+
decorators: [{
|
|
432
|
+
type: Component,
|
|
433
|
+
args: [{
|
|
434
|
+
selector: "wr-treemap-chart",
|
|
435
|
+
encapsulation: ViewEncapsulation.None,
|
|
436
|
+
host: { class: "wr-treemap-chart" },
|
|
437
|
+
imports: [WrChartTable],
|
|
438
|
+
template: "@let active = tip.active();\n<!-- The drawing: one named image, every tile inside it positioned by percentages of it.\n The tiles are siblings rather than nested, parents first, so a child is drawn over\n its parent and leaving it for the parent's edge is a `mouseleave` like any other. -->\n<div\n #plot\n class=\"wr-treemap-chart__plot\"\n role=\"img\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [style.height.px]=\"height()\"\n (mousemove)=\"onPointerMove($event)\"\n (mouseleave)=\"tip.leave($event)\"\n>\n <!-- `inset-inline-start`, not `left`: the layout starts at the inline-start edge, and\n under RTL the whole drawing mirrors with it. `data-index` is what the pointer\n handler reads the tile off. -->\n @for (tile of tiles(); track tile.key) {\n <div\n #tile\n class=\"wr-treemap-chart__tile\"\n [class.wr-treemap-chart__tile--group]=\"tile.group\"\n [class.wr-treemap-chart__tile--leaf]=\"!tile.group\"\n [class.wr-treemap-chart__tile--active]=\"$index === active\"\n [attr.data-index]=\"$index\"\n [style.--wr-treemap-chart-tile-color]=\"tile.node.color\"\n [style.inset-inline-start.%]=\"tile.start\"\n [style.top.%]=\"tile.top\"\n [style.width.%]=\"tile.width\"\n [style.height.%]=\"tile.height\"\n >\n <!-- A name takes its direction from its own text (`dir=\"auto\"`), so a Latin name in an\n RTL tile is cut at its end, not its start, and a Hebrew one in an LTR tile too. A\n value does the same, so `$120K` reads in its own order beside a Hebrew name. -->\n @if (tile.header) {\n <!-- As tall as the strip the layout left above the children, written here so the\n stylesheet and the layout cannot disagree about it. -->\n <span class=\"wr-treemap-chart__header\" [style.height.px]=\"headerHeight\">\n <span class=\"wr-treemap-chart__label\" dir=\"auto\">{{ tile.node.label }}</span>\n @if (showValues() && tile.text) {\n <span class=\"wr-treemap-chart__value\" dir=\"auto\">{{ tile.text }}</span>\n }\n </span>\n } @else if (tile.labelled) {\n <span class=\"wr-treemap-chart__label\" dir=\"auto\">{{ tile.node.label }}</span>\n @if (tile.valued && tile.text) {\n <span class=\"wr-treemap-chart__value\" dir=\"auto\">{{ tile.text }}</span>\n }\n }\n </div>\n }\n</div>\n\n@if (dataTable()) {\n <!-- The figures for a screen reader, beside the drawing's `img` and never inside it:\n `img` makes everything it holds presentational. Clipped to nothing by its own\n stylesheet, so it takes no room and draws nothing. -->\n <wr-chart-table [data]=\"tableData()\" />\n}\n"
|
|
439
|
+
}]
|
|
440
|
+
}],
|
|
441
|
+
ctorParameters: () => [],
|
|
442
|
+
propDecorators: {
|
|
443
|
+
data: [{
|
|
444
|
+
type: i0.Input,
|
|
445
|
+
args: [{
|
|
446
|
+
isSignal: true,
|
|
447
|
+
alias: "data",
|
|
448
|
+
required: false
|
|
449
|
+
}]
|
|
450
|
+
}],
|
|
451
|
+
ariaLabel: [{
|
|
452
|
+
type: i0.Input,
|
|
453
|
+
args: [{
|
|
454
|
+
isSignal: true,
|
|
455
|
+
alias: "ariaLabel",
|
|
456
|
+
required: false
|
|
457
|
+
}]
|
|
458
|
+
}],
|
|
459
|
+
valueLabel: [{
|
|
460
|
+
type: i0.Input,
|
|
461
|
+
args: [{
|
|
462
|
+
isSignal: true,
|
|
463
|
+
alias: "valueLabel",
|
|
464
|
+
required: false
|
|
465
|
+
}]
|
|
466
|
+
}],
|
|
467
|
+
height: [{
|
|
468
|
+
type: i0.Input,
|
|
469
|
+
args: [{
|
|
470
|
+
isSignal: true,
|
|
471
|
+
alias: "height",
|
|
472
|
+
required: false
|
|
473
|
+
}]
|
|
474
|
+
}],
|
|
475
|
+
showLabels: [{
|
|
476
|
+
type: i0.Input,
|
|
477
|
+
args: [{
|
|
478
|
+
isSignal: true,
|
|
479
|
+
alias: "showLabels",
|
|
480
|
+
required: false
|
|
481
|
+
}]
|
|
482
|
+
}],
|
|
483
|
+
showValues: [{
|
|
484
|
+
type: i0.Input,
|
|
485
|
+
args: [{
|
|
486
|
+
isSignal: true,
|
|
487
|
+
alias: "showValues",
|
|
488
|
+
required: false
|
|
489
|
+
}]
|
|
490
|
+
}],
|
|
491
|
+
tooltip: [{
|
|
492
|
+
type: i0.Input,
|
|
493
|
+
args: [{
|
|
494
|
+
isSignal: true,
|
|
495
|
+
alias: "tooltip",
|
|
496
|
+
required: false
|
|
497
|
+
}]
|
|
498
|
+
}],
|
|
499
|
+
valueFormat: [{
|
|
500
|
+
type: i0.Input,
|
|
501
|
+
args: [{
|
|
502
|
+
isSignal: true,
|
|
503
|
+
alias: "valueFormat",
|
|
504
|
+
required: false
|
|
505
|
+
}]
|
|
506
|
+
}],
|
|
507
|
+
percentFormat: [{
|
|
508
|
+
type: i0.Input,
|
|
509
|
+
args: [{
|
|
510
|
+
isSignal: true,
|
|
511
|
+
alias: "percentFormat",
|
|
512
|
+
required: false
|
|
513
|
+
}]
|
|
514
|
+
}],
|
|
515
|
+
dataTable: [{
|
|
516
|
+
type: i0.Input,
|
|
517
|
+
args: [{
|
|
518
|
+
isSignal: true,
|
|
519
|
+
alias: "dataTable",
|
|
520
|
+
required: false
|
|
521
|
+
}]
|
|
522
|
+
}],
|
|
523
|
+
plot: [{
|
|
524
|
+
type: i0.ViewChild,
|
|
525
|
+
args: ["plot", { isSignal: true }]
|
|
526
|
+
}],
|
|
527
|
+
tileEls: [{
|
|
528
|
+
type: i0.ViewChildren,
|
|
529
|
+
args: ["tile", { isSignal: true }]
|
|
530
|
+
}]
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
export { WrTreemapChart };
|
|
534
|
+
|
|
535
|
+
//# sourceMappingURL=ngwr-charts-treemap-chart.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngwr-charts-treemap-chart.mjs","names":[],"sources":["../../../projects/lib/charts/treemap-chart/internal/squarify.ts","../../../projects/lib/charts/treemap-chart/treemap-chart.ts","../../../projects/lib/charts/treemap-chart/treemap-chart.html"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\n/**\n * A rectangle in the layout's own units: `x` from the inline-start edge, `y` from the\n * top. The treemap chart lays out in pixels and draws in percentages of its plot.\n *\n * @internal\n */\ninterface WrTreemapRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\n/** One value to place, by its position in the caller's list, with its share of the box as an area. */\ninterface Item {\n readonly index: number;\n readonly area: number;\n}\n\n/**\n * The worst aspect ratio in a row of `items[start..end)` laid along a side `side` long,\n * `sum` being their total area: the row is `sum / side` deep, and each item as long as\n * its area over that depth. The ratio is the longer side over the shorter, so a square\n * scores 1 and every other shape more.\n */\nfunction worst(items: readonly Item[], start: number, end: number, sum: number, side: number): number {\n let largest = 0;\n let smallest = Number.POSITIVE_INFINITY;\n for (let k = start; k < end; k++) {\n largest = Math.max(largest, items[k].area);\n smallest = Math.min(smallest, items[k].area);\n }\n const s2 = sum * sum;\n const w2 = side * side;\n return Math.max((w2 * largest) / s2, s2 / (w2 * smallest));\n}\n\n/**\n * Cuts `box` into one rectangle per value, each with an area in proportion to its value,\n * by the squarified algorithm — Bruls, Huizing and van Wijk, \"Squarified Treemaps\"\n * (2000) — which keeps every rectangle as close to a square as it can, so that areas are\n * easy to compare and labels have room.\n *\n * The values are placed IN THE ORDER GIVEN, and the result is in that order too: the\n * algorithm assumes the largest first, so sort them descending for the squarest result.\n * It fills the box in rows. A row runs along the shorter side of the space still free,\n * starting at its inline-start or top edge, and takes values while adding one does not\n * make its worst aspect ratio worse; then it is fixed, and the space beyond it is the\n * next row's. So the first value sits in the inline-start top corner — mirrored with the\n * writing direction when the caller positions by `inset-inline-start`.\n *\n * The last rectangle of every row, and the whole of the last row, take what is left of\n * the space exactly, so floating point leaves no hairline uncovered: the rectangles tile\n * the box with nothing over and nothing under.\n *\n * A value that is not a finite number above zero has no area and gets `null`, as does\n * every value when the box has no area or nothing has a value.\n *\n * @example\n * ```ts\n * squarify([1, 1], { x: 0, y: 0, width: 2, height: 1 });\n * // [{ x: 0, y: 0, width: 1, height: 1 }, { x: 1, y: 0, width: 1, height: 1 }]\n * ```\n *\n * @internal\n */\nexport function squarify(values: readonly number[], box: WrTreemapRect): (WrTreemapRect | null)[] {\n const out: (WrTreemapRect | null)[] = values.map(() => null);\n const positive = values.flatMap((value, index) => (Number.isFinite(value) && value > 0 ? [{ index, value }] : []));\n const total = positive.reduce((sum, item) => sum + item.value, 0);\n if (positive.length === 0 || !(total > 0) || !(box.width > 0) || !(box.height > 0)) return out;\n\n const scale = (box.width * box.height) / total;\n const items: Item[] = positive.map(({ index, value }) => ({ index, area: value * scale }));\n\n let { x, y, width, height } = box;\n let start = 0;\n while (start < items.length) {\n const side = Math.min(width, height);\n // Grow the row while the next value does not make its worst ratio worse.\n let end = start + 1;\n let sum = items[start].area;\n let ratio = worst(items, start, end, sum, side);\n while (end < items.length) {\n const next = worst(items, start, end + 1, sum + items[end].area, side);\n if (next > ratio) break;\n ratio = next;\n sum += items[end].area;\n end++;\n }\n\n const last = end === items.length;\n if (width >= height) {\n // The shorter side is the height: the row is a column at the inline-start edge.\n const depth = last ? width : Math.min(width, sum / height);\n let top = y;\n for (let k = start; k < end; k++) {\n const length = k === end - 1 ? y + height - top : items[k].area / depth;\n out[items[k].index] = { x, y: top, width: depth, height: length };\n top += length;\n }\n x += depth;\n width = Math.max(0, width - depth);\n } else {\n // The shorter side is the width: the row is a strip along the top.\n const depth = last ? height : Math.min(height, sum / width);\n let left = x;\n for (let k = start; k < end; k++) {\n const length = k === end - 1 ? x + width - left : items[k].area / depth;\n out[items[k].index] = { x: left, y, width: length, height: depth };\n left += length;\n }\n y += depth;\n height = Math.max(0, height - depth);\n }\n start = end;\n }\n return out;\n}\n\nexport type { WrTreemapRect };\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n DestroyRef,\n type ElementRef,\n LOCALE_ID,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n isDevMode,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\n\nimport { WrChartTable, type WrChartTableData, chartColor, useChartNumbers } from 'ngwr/charts/core';\nimport { readI18nText, useI18nText } from 'ngwr/i18n';\nimport { useChartTooltip } from 'ngwr/popover';\n\nimport { type WrTreemapRect, squarify } from './internal/squarify';\nimport type { WrTreemapNode } from './types';\n\n/**\n * The width the layout assumes until the plot has been measured — on the server, and\n * in the first render in a browser. The tiles are drawn in percentages of the plot, so\n * they fill it either way; only their shapes are squarer once the real width is known.\n */\nconst FALLBACK_WIDTH = 640;\n\n/**\n * The height of the strip a group's name is written in, in px: one line of the label's\n * type and a little room. The stylesheet sizes the strip from the same number, written\n * on it inline, so the two cannot disagree; a larger type than the default's is clipped\n * rather than spilling into the tiles under it.\n */\nconst HEADER = 20;\n\n/** The space between a group's edge and the tiles inside it, in px, on the sides and below. */\nconst PAD = 3;\n\n/** The smallest room, in px either way, that a group draws its children in. Smaller, it is drawn as one block. */\nconst MIN_INNER = 12;\n\n/** The smallest tile, in px, that a name is written in: about three letters and an ellipsis on one line. */\nconst LABEL_MIN_WIDTH = 36;\nconst LABEL_MIN_HEIGHT = 22;\n\n/** The smallest tile height, in px, that holds the value under the name. */\nconst VALUE_MIN_HEIGHT = 38;\n\n/** Between the names of a path, in the tooltip and the data table. */\nconst SEPARATOR = ' / ';\n\n/**\n * The relative difference below which a group's value and its children's sum are the same\n * number. Decimal data rarely adds up exactly in binary — 0.1 + 0.2 + 0.3 is\n * 0.6000000000000001 — so an exact comparison would call a group of 0.6 smaller than its\n * children and leave a remainder of a few ulps to lay out.\n */\nconst SUM_TOLERANCE = 1e-9;\n\n/** A percentage to three decimals, so a style stays short. */\nconst percent = (value: number): number => Math.round(value * 1000) / 1000;\n\n/** A node of the data, resolved: where it sits in the tree, its colour, its figure and its area. */\ninterface ResolvedNode {\n /** Its position in the tree, `0.2.1`: unique, and stable while the data keeps its shape. */\n readonly key: string;\n readonly label: string;\n /** Every name from the top-level node down to this one. */\n readonly path: readonly string[];\n readonly color: string;\n /** Its own `value`, when that is a finite number. */\n readonly own: number | null;\n /**\n * The figure the tooltip and the data table show: its own value, or for a group with\n * none the sum of its children's areas. `null` for a leaf with no value.\n */\n readonly value: number | null;\n /** The weight its rectangle is drawn with. `0` draws nothing. */\n readonly size: number;\n /** What its children's areas add up to. */\n readonly childSize: number;\n readonly children: readonly ResolvedNode[];\n}\n\n/** A node as drawn: its rectangle in px and what it has room to show. */\ninterface PlacedTile {\n readonly node: ResolvedNode;\n readonly rect: WrTreemapRect;\n /** Its children are drawn inside it. */\n readonly group: boolean;\n /** A strip at its top carries its name and, with `showValues`, its figure. */\n readonly header: boolean;\n /** Its name is written inside it, as on a leaf. */\n readonly labelled: boolean;\n /** Its figure is written under its name. */\n readonly valued: boolean;\n}\n\n/** The fit rules {@link placeTiles} applies. */\ninterface PlaceOptions {\n readonly labels: boolean;\n readonly values: boolean;\n}\n\n/**\n * Every node of `nodes`, resolved: paths and colours handed down, values summed up. A\n * top-level node with no `color` takes the palette colour of its position, and a nested\n * one its parent's.\n */\nfunction resolveNodes(\n nodes: readonly WrTreemapNode[],\n path: readonly string[],\n inherited: string | null,\n key: string\n): ResolvedNode[] {\n return nodes.map((node, i) => {\n const color = node.color ?? inherited ?? chartColor(i);\n const own = typeof node.value === 'number' && Number.isFinite(node.value) ? node.value : null;\n const ownSize = own !== null && own > 0 ? own : 0;\n const nodePath = [...path, node.label];\n const children = resolveNodes(node.children ?? [], nodePath, color, `${key}${i}.`);\n const childSize = children.reduce((sum, child) => sum + child.size, 0);\n const group = children.length > 0;\n return {\n key: `${key}${i}`,\n label: node.label,\n path: nodePath,\n color,\n own,\n value: group ? (own ?? childSize) : own,\n // A group is never smaller than its children, whatever it is given: they have to fit.\n size: group ? Math.max(ownSize, childSize) : ownSize,\n childSize,\n children,\n };\n });\n}\n\n/** Every node, parents before their children, in the data's own order: the data table's rows. */\nfunction flatten(nodes: readonly ResolvedNode[]): ResolvedNode[] {\n return nodes.flatMap(node => [node, ...flatten(node.children)]);\n}\n\n/**\n * The tiles for `nodes` inside `box`, parents before their children so a child is drawn\n * over its parent. Siblings are squarified largest first, ties in the data's order, and a\n * group's `remainder` — the part of its value its children do not account for — is laid\n * out last and left empty.\n */\nfunction placeTiles(\n nodes: readonly ResolvedNode[],\n remainder: number,\n box: WrTreemapRect,\n options: PlaceOptions,\n out: PlacedTile[]\n): void {\n const order = nodes\n .map((node, index) => ({ node, index }))\n .filter(({ node }) => node.size > 0)\n .sort((a, b) => b.node.size - a.node.size || a.index - b.index);\n const sizes = order.map(({ node }) => node.size);\n if (remainder > 0) sizes.push(remainder);\n const rects = squarify(sizes, box);\n\n order.forEach(({ node }, k) => {\n const rect = rects[k];\n if (!rect) return;\n const roomForHeader = options.labels && rect.height >= HEADER * 2 && rect.width >= LABEL_MIN_WIDTH;\n const top = roomForHeader ? HEADER : PAD;\n const inner: WrTreemapRect = {\n x: rect.x + PAD,\n y: rect.y + top,\n width: rect.width - 2 * PAD,\n height: rect.height - top - PAD,\n };\n const group = node.childSize > 0 && inner.width >= MIN_INNER && inner.height >= MIN_INNER;\n const labelled = !group && options.labels && rect.width >= LABEL_MIN_WIDTH && rect.height >= LABEL_MIN_HEIGHT;\n out.push({\n node,\n rect,\n group,\n header: group && roomForHeader,\n labelled,\n valued: labelled && options.values && rect.height >= VALUE_MIN_HEIGHT,\n });\n if (group) {\n const rest = node.size - node.childSize;\n placeTiles(node.children, rest > node.size * SUM_TOLERANCE ? rest : 0, inner, options, out);\n }\n });\n}\n\n/**\n * Treemap chart: a hierarchy as nested rectangles, each with an area in proportion to its\n * value. For the parts of a whole when there are too many for a donut, or when they come\n * in groups — a budget by department and team, a disk by folder. HTML only — no external\n * dependency.\n *\n * @example\n * ```html\n * <wr-treemap-chart\n * ariaLabel=\"Budget by department\"\n * [data]=\"[\n * { label: 'Engineering', children: [{ label: 'Web', value: 310 }, { label: 'Mobile', value: 260 }] },\n * { label: 'Sales', children: [{ label: 'EMEA', value: 280 }, { label: 'APAC', value: 150 }] },\n * { label: 'Legal', value: 60 }\n * ]\"\n * />\n * ```\n *\n * **The layout** is the squarified algorithm (Bruls, Huizing and van Wijk, 2000): each\n * set of siblings is cut largest first into rectangles as close to square as it allows,\n * so areas can be compared and names have room. It starts in the inline-start top corner,\n * so under RTL the largest node sits at the top right — the tiles are positioned by\n * `inset-inline-start`, and the whole drawing mirrors with the writing direction.\n *\n * **Groups.** A node with children is drawn as a rectangle with its children inside it,\n * a few pixels in from its edge, under a strip carrying its name when it is tall enough.\n * Its value is the sum of its children's unless it is given one, and a value above that\n * sum leaves the rest of its rectangle empty: what the children do not account for. A\n * group too small to hold its children is drawn as one block.\n *\n * **Colour is the top-level node's**, from the chart's palette, and every node inside it\n * takes it unless it has a `color` of its own. It is never the only thing that tells two\n * groups apart: each carries its name where there is room, and its tiles sit inside its\n * own rectangle; the tooltip and the data table name the ones too small to write in. The\n * gap round every tile is a faint separator in the surface colour, not a boundary drawn\n * to be read on its own; under `prefers-contrast: more` it is a line at 3:1 or more\n * against the tints, and under forced colours an outline in the text colour. With more\n * than five top-level nodes the palette repeats, and the names are what tell neighbours\n * of one colour apart.\n *\n * **Names are written inside the tiles that have room** — a group's in its strip, a\n * leaf's in its corner with its value under it — and ellipsised past the tile's width.\n * A tile smaller than about 36 × 22 px writes nothing; the tooltip and the data table\n * name every node in full, with its whole path. A value is never cut: one wider than its\n * tile, or than the room its group's name leaves in the strip, is left out, since `$12…`\n * reads as another number, and the tooltip and the data table carry it whole.\n *\n * **What a screen reader gets.** The drawing is one named `role=\"img\"`, and nothing in it\n * is announced. The tooltip is pointer only, so say what the chart shows in `ariaLabel`,\n * or turn on `dataTable`, which lists every node by its path with its value and its share\n * of the whole. No part of the chart is a tab stop.\n *\n * **No drill-down.** Every level is drawn at once and nothing zooms into a group; a\n * deep tree is better split into several charts, or given one level at a time by the host.\n *\n * The tiles are laid out for the plot's measured size, so on the server and in the first\n * render they are cut for an assumed width and squared up once the plot is measured.\n *\n * @see https://ngwr.dev/charts/treemap-chart\n */\n@Component({\n selector: 'wr-treemap-chart',\n templateUrl: './treemap-chart.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-treemap-chart' },\n imports: [WrChartTable],\n})\nexport class WrTreemapChart {\n /**\n * The nodes, top level first. A node with `children` is a group drawn round them, and\n * one without is a leaf drawn at its `value`. Top-level nodes with no `color` take the\n * palette's colours in order.\n */\n readonly data = input<readonly WrTreemapNode[]>([]);\n\n /**\n * Accessible name of the drawing. The tiles carry no text a screen reader reaches, so\n * this is where to say what the chart shows — or turn on `dataTable`. Falls back to\n * `treemapChart.label`, which is also the data table's caption.\n */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'treemapChart.label', 'Treemap chart');\n\n /**\n * What the values measure — revenue, size on disk — as the heading of the data table's\n * value column. Falls back to `treemapChart.value` (\"Value\").\n */\n readonly valueLabel = input<string | null>(null);\n\n protected readonly valueName = useI18nText(this.valueLabel, 'treemapChart.value', 'Value');\n\n /** The heading of the share column and the name of the tooltip's share row. */\n protected readonly shareName = readI18nText('treemapChart.share', 'Share');\n\n /** The plot's height in px, at least 80. Its width is the container's. @default 280 */\n readonly height = input(280, {\n transform: (v: unknown): number => {\n const value = coerceNumberProperty(v, 280);\n return Number.isFinite(value) ? Math.max(80, value) : 280;\n },\n });\n\n /**\n * Write the names inside the tiles that have room for them, a group's in a strip along\n * its top. Off, no tile carries text and no group reserves a strip. @default true\n */\n readonly showLabels = input(true, { transform: coerceBooleanProperty });\n\n /** Write each value under its name, and each group's beside its name, where there is room. @default true */\n readonly showValues = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Show a tooltip for the tile under the pointer: its path from the top-level node, its\n * value, and its share of the whole. Pointer only — the data table is where the same\n * figures are for a keyboard or a screen reader. @default true\n */\n readonly tooltip = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Writes every value the chart shows: inside the tiles, in the tooltip and in the data\n * table. `null` uses `Intl.NumberFormat` in `LOCALE_ID`, compact inside the tiles\n * (`1.2K`). A value wider than its tile is left out of it rather than cut. Shares are\n * `percentFormat`'s.\n */\n readonly valueFormat = input<((value: number) => string) | null>(null);\n\n /**\n * Writes every share the chart shows, given as a RATIO — `0.25` for a quarter — the\n * number `Intl.NumberFormat`'s `percent` style takes, so one of those can be passed as\n * it is: in the tooltip and in the data table. `null` uses that style in `LOCALE_ID`,\n * with up to one fraction digit, and two significant digits below 1% so a sliver is not\n * printed as `0%`.\n */\n readonly percentFormat = input<((ratio: number) => string) | null>(null);\n\n /**\n * Render the chart's figures as a table that only assistive technology reaches: a row\n * per node, parents before their children in the data's order, headed by its path —\n * `Engineering / Web` — with its value and its share of the whole. A node with no area\n * is listed with an empty share, and a leaf with no value with an empty value too.\n *\n * The drawing is one named `role=\"img\"`, which hides everything inside it, so without\n * the table the numbers are nowhere a screen reader can walk. It is rendered beside the\n * drawing, clipped to nothing: it takes no room, draws nothing and holds no tab stop.\n * @default false\n */\n readonly dataTable = input(false, { transform: coerceBooleanProperty });\n\n /** The exact figures and the tiles' compact ones, in `LOCALE_ID` unless `valueFormat` is given. */\n private readonly numbers = useChartNumbers(this.valueFormat);\n\n /** Shares from one percent up, to one decimal: `12.5 %`, `3 %`. */\n private readonly shares = new Intl.NumberFormat(inject(LOCALE_ID), { style: 'percent', maximumFractionDigits: 1 });\n\n /** Shares below one percent, to two significant digits, so a sliver does not read `0 %`. */\n private readonly smallShares = new Intl.NumberFormat(inject(LOCALE_ID), {\n style: 'percent',\n maximumSignificantDigits: 2,\n });\n\n private readonly plot = viewChild.required<ElementRef<HTMLElement>>('plot');\n private readonly tileEls = viewChildren<ElementRef<HTMLElement>>('tile');\n\n /** The plot's measured content box, once a browser has laid it out. */\n private readonly box = signal<{ readonly width: number; readonly height: number } | null>(null);\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n // The layout is cut for the plot's real proportions: squares at 640 × 280 are slabs\n // at 320 × 280. Measured after render, so the server and the first paint draw the\n // fallback and nothing here touches the DOM before a browser has one.\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n // A hidden chart measures nothing; keep the last layout rather than collapse it.\n if (width <= 0 || height <= 0) return;\n const last = this.box();\n if (last?.width === width && last.height === height) return;\n this.box.set({ width, height });\n });\n observer.observe(this.plot().nativeElement);\n destroyRef.onDestroy(() => observer.disconnect());\n });\n\n // Two things in the data the drawing cannot honour, and that look like nothing at all\n // on screen: a missing tile, and a group drawn larger than it was told to be.\n if (isDevMode()) {\n const warned = new Set<string>();\n effect(() => {\n for (const node of this.nodes()) {\n const path = node.path.join(SEPARATOR);\n let problem: string | null = null;\n if (node.own !== null && node.own < 0) {\n // A negative value adds no area of its own, so whatever such a node is drawn at\n // is its children's total — a group is still drawn round them.\n const drawn =\n node.size > 0\n ? `It is drawn at the ${node.childSize} its children add up to, which has to fit.`\n : 'It draws no tile, and the data table still lists it.';\n problem = `\"${path}\" has a negative value (${node.own}), which has no area. ${drawn}`;\n } else if (node.children.length > 0 && node.own !== null && node.own < node.childSize * (1 - SUM_TOLERANCE)) {\n problem =\n `\"${path}\" is given a value of ${node.own}, below the ${node.childSize} its children add up to. ` +\n 'It is drawn at its children’s total, which has to fit.';\n }\n if (problem === null || warned.has(problem)) continue;\n warned.add(problem);\n // eslint-disable-next-line no-console -- dev-mode validation\n console.warn(`[NGWR] <wr-treemap-chart>: ${problem}`);\n }\n });\n }\n }\n\n /** The data, resolved: top-level nodes with every node below them. */\n private readonly tree = computed(() => resolveNodes(this.data(), [], null, ''));\n\n /** Every node, parents before their children, in the data's order. */\n private readonly nodes = computed(() => flatten(this.tree()));\n\n /** The whole: the area of every top-level node together, which every share is of. */\n private readonly total = computed(() => this.tree().reduce((sum, node) => sum + node.size, 0));\n\n /** The size the layout is cut for: the measured plot, or the fallback width at `height`. */\n private readonly layoutBox = computed(() => this.box() ?? { width: FALLBACK_WIDTH, height: this.height() });\n\n /**\n * Every tile drawn, parents before their children, with its rectangle as percentages\n * of the plot — `start` from the inline-start edge — and its figure as the tile writes it.\n * Its position in this list is what the tooltip and the template know it by.\n */\n protected readonly tiles = computed(() => {\n const { width, height } = this.layoutBox();\n const placed: PlacedTile[] = [];\n placeTiles(\n this.tree(),\n 0,\n { x: 0, y: 0, width, height },\n { labels: this.showLabels(), values: this.showValues() },\n placed\n );\n return placed.map(tile => ({\n key: tile.node.key,\n node: tile.node,\n group: tile.group,\n header: tile.header,\n labelled: tile.labelled,\n valued: tile.valued,\n text: tile.node.value === null ? '' : this.numbers.label(tile.node.value),\n start: percent((tile.rect.x / width) * 100),\n top: percent((tile.rect.y / height) * 100),\n width: percent((tile.rect.width / width) * 100),\n height: percent((tile.rect.height / height) * 100),\n }));\n });\n\n /** The height of a group's name strip, in px, for the stylesheet. */\n protected readonly headerHeight = HEADER;\n\n /**\n * The figures for `dataTable`: the drawing's name as the caption, and a row per node with\n * its value and its share of the whole, written as the tooltip writes them.\n */\n protected readonly tableData = computed<WrChartTableData>(() => ({\n caption: this.resolvedAriaLabel(),\n columns: [this.valueName(), this.shareName()],\n groups: [\n {\n rows: this.nodes().map(node => ({\n header: node.path.join(SEPARATOR),\n cells: [node.value === null ? '' : this.numbers.value(node.value), this.share(node)],\n })),\n },\n ],\n }));\n\n /**\n * One tooltip for the whole chart, for the tile under the pointer: the node's swatch,\n * its path and its value as the heading, and its share of the whole under it. It points\n * at the tile from above. The pointer over a group's strip or its edge reads the group,\n * with its total.\n */\n protected readonly tip = useChartTooltip(this.tooltip, index => {\n const tile = this.tiles()[index];\n const el = this.tileEls()[index]?.nativeElement;\n if (!tile || !el) return null;\n const { node } = tile;\n const share = this.share(node);\n return {\n datum: {\n label: node.path.join(SEPARATOR),\n value: node.value === null ? '' : this.numbers.value(node.value),\n color: node.color,\n rows: share ? [{ label: this.shareName(), value: share }] : [],\n },\n anchor: el,\n };\n });\n\n /**\n * The tile under the pointer, heard once on the plot rather than on every tile: the\n * nearest tile up from the element the pointer is over. A MOUSE event, as every chart's\n * is: a tap fires the compatibility `mousemove` and no `pointermove`.\n */\n protected onPointerMove(event: MouseEvent): void {\n const tile = (event.target as Element | null)?.closest<HTMLElement>('.wr-treemap-chart__tile');\n const index = tile ? Number(tile.dataset['index']) : Number.NaN;\n if (Number.isInteger(index) && index >= 0) this.tip.enter(index);\n else this.tip.leave(event);\n }\n\n /** A node's share of the whole, through `percentFormat` or as a percentage in `LOCALE_ID`, or `''` for one with no area. */\n private share(node: ResolvedNode): string {\n const total = this.total();\n if (node.size <= 0 || total <= 0) return '';\n const share = node.size / total;\n const custom = this.percentFormat();\n if (custom) return custom(share);\n return (share < 0.01 ? this.smallShares : this.shares).format(share);\n }\n}\n\nexport type { WrTreemapNode } from './types';\n","@let active = tip.active();\n<!-- The drawing: one named image, every tile inside it positioned by percentages of it.\n The tiles are siblings rather than nested, parents first, so a child is drawn over\n its parent and leaving it for the parent's edge is a `mouseleave` like any other. -->\n<div\n #plot\n class=\"wr-treemap-chart__plot\"\n role=\"img\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [style.height.px]=\"height()\"\n (mousemove)=\"onPointerMove($event)\"\n (mouseleave)=\"tip.leave($event)\"\n>\n <!-- `inset-inline-start`, not `left`: the layout starts at the inline-start edge, and\n under RTL the whole drawing mirrors with it. `data-index` is what the pointer\n handler reads the tile off. -->\n @for (tile of tiles(); track tile.key) {\n <div\n #tile\n class=\"wr-treemap-chart__tile\"\n [class.wr-treemap-chart__tile--group]=\"tile.group\"\n [class.wr-treemap-chart__tile--leaf]=\"!tile.group\"\n [class.wr-treemap-chart__tile--active]=\"$index === active\"\n [attr.data-index]=\"$index\"\n [style.--wr-treemap-chart-tile-color]=\"tile.node.color\"\n [style.inset-inline-start.%]=\"tile.start\"\n [style.top.%]=\"tile.top\"\n [style.width.%]=\"tile.width\"\n [style.height.%]=\"tile.height\"\n >\n <!-- A name takes its direction from its own text (`dir=\"auto\"`), so a Latin name in an\n RTL tile is cut at its end, not its start, and a Hebrew one in an LTR tile too. A\n value does the same, so `$120K` reads in its own order beside a Hebrew name. -->\n @if (tile.header) {\n <!-- As tall as the strip the layout left above the children, written here so the\n stylesheet and the layout cannot disagree about it. -->\n <span class=\"wr-treemap-chart__header\" [style.height.px]=\"headerHeight\">\n <span class=\"wr-treemap-chart__label\" dir=\"auto\">{{ tile.node.label }}</span>\n @if (showValues() && tile.text) {\n <span class=\"wr-treemap-chart__value\" dir=\"auto\">{{ tile.text }}</span>\n }\n </span>\n } @else if (tile.labelled) {\n <span class=\"wr-treemap-chart__label\" dir=\"auto\">{{ tile.node.label }}</span>\n @if (tile.valued && tile.text) {\n <span class=\"wr-treemap-chart__value\" dir=\"auto\">{{ tile.text }}</span>\n }\n }\n </div>\n }\n</div>\n\n@if (dataTable()) {\n <!-- The figures for a screen reader, beside the drawing's `img` and never inside it:\n `img` makes everything it holds presentational. Clipped to nothing by its own\n stylesheet, so it takes no room and draws nothing. -->\n <wr-chart-table [data]=\"tableData()\" />\n}\n"],"mappings":"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"}
|