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
|
@@ -146,10 +146,11 @@ bootstrapApplication(App, {
|
|
|
146
146
|
- `withTheme({ defaultMode: 'dark' })` from `ngwr/theme` — the default
|
|
147
147
|
scheme and its storage key, and `WrTheme` created at boot.
|
|
148
148
|
- `withToast({ … })` from `ngwr/toast`, `withStorage({ … })` from
|
|
149
|
-
`ngwr/storage
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
`ngwr/storage`, `withMeta({ … })` from `ngwr/meta` and
|
|
150
|
+
`withWindows({ bounds })` from `ngwr/window` — toast defaults, the storage
|
|
151
|
+
engine, prefix and TTL, `<head>` defaults for every route, and the work area
|
|
152
|
+
floating windows keep inside. Like density and theme they configure a root
|
|
153
|
+
service, so they belong at bootstrap.
|
|
153
154
|
- A `validation` namespace in your own i18n catalog — ngwr ships no validation
|
|
154
155
|
copy. `<wr-form-field>` reads `validation.<key>` for an error whose validator
|
|
155
156
|
carries no `{ message }`, with the error payload as params.
|
package/theme/styles/_focus.scss
CHANGED
|
@@ -199,6 +199,14 @@
|
|
|
199
199
|
@include focus-ring;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
// Chart legend rows — with `toggleable` each row is a `<button aria-pressed>`, in
|
|
203
|
+
// a standalone `ul[wr-chart-legend]` and in the legend every chart draws with one.
|
|
204
|
+
// Safe as an OUTSET ring: neither the legend nor the charts that render it set
|
|
205
|
+
// `overflow` on anything around the rows.
|
|
206
|
+
.wr-chart-legend__toggle:focus-visible {
|
|
207
|
+
@include focus-ring;
|
|
208
|
+
}
|
|
209
|
+
|
|
202
210
|
// Pull to refresh — the host is the scroller, and a list of plain rows leaves
|
|
203
211
|
// it the only thing a keyboard user can focus to scroll. An element's own
|
|
204
212
|
// `overflow` does not clip its outline, so the ring stays OUTSET.
|
package/toast/styles/_index.scss
CHANGED
|
@@ -82,9 +82,33 @@ $toast-colors: (
|
|
|
82
82
|
opacity: 0;
|
|
83
83
|
pointer-events: none;
|
|
84
84
|
}
|
|
85
|
+
|
|
86
|
+
// Only the front card shows its content while the stack is collapsed,
|
|
87
|
+
// and the cards behind take its height, so what peeks out under it is an
|
|
88
|
+
// even edge per level. Not an 8px one: each card behind is moved 8px per
|
|
89
|
+
// level and scaled by 5% per level about its anchored edge, so the edge
|
|
90
|
+
// is 8px less 5% of the front card's height — about 6px under a one-line
|
|
91
|
+
// toast, and nothing once the front card is 160px tall. Each card used to
|
|
92
|
+
// keep its own height, so a
|
|
93
|
+
// short front toast — a title alone, a one-line message — left the taller
|
|
94
|
+
// card behind it hanging past its bottom edge, with that card's last line
|
|
95
|
+
// reading through underneath at 70% opacity. The front toast is the last
|
|
96
|
+
// one in the DOM, whichever way the stack grows, and the host measures it
|
|
97
|
+
// into `--wr-toast-front-height`; until it has, each card keeps its own.
|
|
98
|
+
&:not(:last-of-type) {
|
|
99
|
+
block-size: var(--wr-toast-front-height, auto);
|
|
100
|
+
|
|
101
|
+
> * {
|
|
102
|
+
opacity: 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
85
105
|
}
|
|
86
106
|
}
|
|
87
107
|
|
|
108
|
+
&--stack .wr-toast > * {
|
|
109
|
+
transition: opacity 240ms ease;
|
|
110
|
+
}
|
|
111
|
+
|
|
88
112
|
// Bottom-anchored hosts: stack grows UPWARD (newest at the bottom).
|
|
89
113
|
&--stack:not(.wr-toast-host--expanded).wr-toast-host--bottom,
|
|
90
114
|
&--stack:not(.wr-toast-host--expanded).wr-toast-host--bottom-start,
|
|
@@ -148,6 +172,10 @@ $toast-colors: (
|
|
|
148
172
|
--wr-toast-title-margin-bottom: var(--wr-space-xs);
|
|
149
173
|
--wr-toast-title-font-size: var(--wr-text-sm);
|
|
150
174
|
--wr-toast-title-font-weight: var(--wr-font-weight-semibold);
|
|
175
|
+
// The two line heights take a LENGTH. The glyph's offset and the actions
|
|
176
|
+
// row's height are `calc()`s over them, and a unitless value — valid for
|
|
177
|
+
// `line-height` itself — makes both invalid when the browser computes them:
|
|
178
|
+
// the glyph drops to the top of the line and the row to its buttons' height.
|
|
151
179
|
--wr-toast-title-line-height: var(--wr-text-sm-leading);
|
|
152
180
|
--wr-toast-message-font-size: var(--wr-text-sm);
|
|
153
181
|
--wr-toast-message-line-height: var(--wr-text-sm-leading);
|
|
@@ -171,14 +199,18 @@ $toast-colors: (
|
|
|
171
199
|
animation: wr-toast-in 0.18s ease-out;
|
|
172
200
|
overflow: hidden;
|
|
173
201
|
|
|
174
|
-
// The status glyph.
|
|
175
|
-
//
|
|
202
|
+
// The status glyph. Centred on the first line's box so it reads as part of
|
|
203
|
+
// that line rather than floating above it, and inked with the accent the
|
|
176
204
|
// type already carries — the SHAPE is the channel, the colour reinforces it.
|
|
205
|
+
// The offset is derived from the line height rather than written as the 1px
|
|
206
|
+
// it comes to by default, so a toast whose first line is the message (see
|
|
207
|
+
// `--untitled` below) or whose line height was re-hooked to another length
|
|
208
|
+
// still lines up. A unitless one does not; see the hooks above.
|
|
177
209
|
&__icon {
|
|
178
210
|
flex: 0 0 auto;
|
|
179
211
|
width: 1.125rem;
|
|
180
212
|
height: 1.125rem;
|
|
181
|
-
margin-block-start:
|
|
213
|
+
margin-block-start: calc((var(--wr-toast-title-line-height) - 1.125rem) / 2);
|
|
182
214
|
color: var(--wr-toast-accent);
|
|
183
215
|
}
|
|
184
216
|
|
|
@@ -193,6 +225,17 @@ $toast-colors: (
|
|
|
193
225
|
font-size: var(--wr-toast-title-font-size);
|
|
194
226
|
font-weight: var(--wr-toast-title-font-weight);
|
|
195
227
|
line-height: var(--wr-toast-title-line-height);
|
|
228
|
+
// A filename or a URL as a title wraps, the way it does as a message.
|
|
229
|
+
// Without it the word ran on under the copy and close buttons and was cut
|
|
230
|
+
// off at the card's edge by its `overflow: hidden`.
|
|
231
|
+
overflow-wrap: break-word;
|
|
232
|
+
|
|
233
|
+
// The margin separates the title FROM the message, so a title with nothing
|
|
234
|
+
// under it carries none — left in, the card was 4px deeper below its one
|
|
235
|
+
// line than above it.
|
|
236
|
+
&:last-child {
|
|
237
|
+
margin-block-end: 0;
|
|
238
|
+
}
|
|
196
239
|
}
|
|
197
240
|
|
|
198
241
|
&__message {
|
|
@@ -203,21 +246,50 @@ $toast-colors: (
|
|
|
203
246
|
overflow-wrap: break-word;
|
|
204
247
|
}
|
|
205
248
|
|
|
249
|
+
// The buttons sit on the FIRST line: the row is exactly one line box tall and
|
|
250
|
+
// the buttons are centred in it, overflowing into the padding when they are
|
|
251
|
+
// taller than the line. Before, the row took the buttons' own height, so a
|
|
252
|
+
// one-line toast grew from 46px to 56.5px, its text sat 13px from the top and
|
|
253
|
+
// 23.5px from the bottom, and the × hung 5px below the line it closes.
|
|
206
254
|
&__actions {
|
|
207
255
|
flex: 0 0 auto;
|
|
208
256
|
display: inline-flex;
|
|
209
257
|
align-items: center;
|
|
210
258
|
gap: var(--wr-toast-actions-gap);
|
|
259
|
+
block-size: var(--wr-toast-title-line-height);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// A toast with no title opens on its message, so that is the line the glyph
|
|
263
|
+
// and the buttons centre on.
|
|
264
|
+
&--untitled &__icon {
|
|
265
|
+
margin-block-start: calc((var(--wr-toast-message-line-height) - 1.125rem) / 2);
|
|
211
266
|
}
|
|
212
267
|
|
|
268
|
+
&--untitled &__actions {
|
|
269
|
+
block-size: var(--wr-toast-message-line-height);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// A square, the way the alert's, dialog's and drawer's × are: the glyph plus
|
|
273
|
+
// the padding on every side, centred by flex. As an inline box the button
|
|
274
|
+
// took its height from the line box around an inline `<svg>` — glyph, strut
|
|
275
|
+
// and descender — and measured 23x30.5, so its hover tint was a tall pill.
|
|
276
|
+
// The 1.5rem floor is WCAG 2.5.8's 24px target, which the glyph alone missed
|
|
277
|
+
// by a pixel on a 15px page.
|
|
213
278
|
&__action {
|
|
214
279
|
appearance: none;
|
|
280
|
+
display: inline-flex;
|
|
281
|
+
align-items: center;
|
|
282
|
+
justify-content: center;
|
|
283
|
+
flex: 0 0 auto;
|
|
284
|
+
min-inline-size: 1.5rem;
|
|
285
|
+
min-block-size: 1.5rem;
|
|
215
286
|
background: transparent;
|
|
216
287
|
border: 0;
|
|
217
288
|
padding: var(--wr-toast-action-padding);
|
|
218
289
|
color: var(--wr-color-on-surface-muted);
|
|
219
290
|
cursor: pointer;
|
|
220
291
|
border-radius: var(--wr-toast-action-radius);
|
|
292
|
+
line-height: 0;
|
|
221
293
|
transition:
|
|
222
294
|
color var(--wr-transition-base),
|
|
223
295
|
background var(--wr-transition-base);
|
|
@@ -231,10 +303,25 @@ $toast-colors: (
|
|
|
231
303
|
// pill from 12px to 20px when it was tried there.
|
|
232
304
|
font-size: inherit;
|
|
233
305
|
|
|
306
|
+
// A 44px hit area on a coarse pointer, from the shared mixin the alert's,
|
|
307
|
+
// dialog's and drawer's × use. The pair stays clear of each other through
|
|
308
|
+
// the touch gap at the end of this file.
|
|
309
|
+
@include theme.touch-target;
|
|
310
|
+
|
|
234
311
|
&:hover {
|
|
235
312
|
color: var(--wr-color-on-surface);
|
|
236
313
|
background: var(--wr-color-hover);
|
|
237
314
|
}
|
|
315
|
+
|
|
316
|
+
// The shared ring, as on the alert's, dialog's and drawer's ×. These two
|
|
317
|
+
// had no focus style at all, so a keyboard user landing on Close — which
|
|
318
|
+
// the host does on purpose after a dismissal — saw whatever the UA drew.
|
|
319
|
+
// OUTSET is safe: the button sits inside the toast's padding, which is
|
|
320
|
+
// wider than the ring's reach, so the toast's `overflow: hidden` does not
|
|
321
|
+
// cut it.
|
|
322
|
+
&:focus-visible {
|
|
323
|
+
@include theme.focus-ring;
|
|
324
|
+
}
|
|
238
325
|
}
|
|
239
326
|
|
|
240
327
|
&__progress {
|
|
@@ -359,19 +446,23 @@ $toast-colors: (
|
|
|
359
446
|
align-self: stretch;
|
|
360
447
|
}
|
|
361
448
|
|
|
362
|
-
// Touch pointers: grow the per-toast action buttons (copy / dismiss) to
|
|
363
|
-
// with
|
|
364
|
-
//
|
|
365
|
-
//
|
|
449
|
+
// Touch pointers: grow the per-toast action buttons (copy / dismiss) to 32px,
|
|
450
|
+
// each with the shared 44px hit area, and give the dismiss-all bar a taller
|
|
451
|
+
// one. Fine pointers keep the compact desktop sizing above.
|
|
452
|
+
//
|
|
453
|
+
// The gap defaults to 0.75rem because that is what keeps two 44px halos on
|
|
454
|
+
// 32px buttons from overlapping: centres 44px apart, so at rest they abut
|
|
455
|
+
// exactly. It is the HOOK's default that moves, not the row's `gap`, so an
|
|
456
|
+
// app's own `--wr-toast-actions-gap` still applies on a touch screen. Before,
|
|
457
|
+
// this block re-declared the hook as the 4px it already was, under a comment
|
|
458
|
+
// promising a wider gap, and there was no halo at all: the hit area was the
|
|
459
|
+
// 32px button.
|
|
366
460
|
@media (pointer: coarse) {
|
|
367
|
-
.wr-
|
|
368
|
-
|
|
461
|
+
.wr-toast {
|
|
462
|
+
--wr-toast-actions-gap: 0.75rem;
|
|
369
463
|
}
|
|
370
464
|
|
|
371
465
|
.wr-toast__action {
|
|
372
|
-
display: inline-flex;
|
|
373
|
-
align-items: center;
|
|
374
|
-
justify-content: center;
|
|
375
466
|
width: 2rem;
|
|
376
467
|
height: 2rem;
|
|
377
468
|
padding: 0;
|
|
@@ -7,6 +7,10 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
* Under `prefers-reduced-motion` a single static frame is drawn, and drawn
|
|
8
8
|
* again in the new colours when the page's colour scheme switches.
|
|
9
9
|
*
|
|
10
|
+
* Under forced colours the canvas is hidden and its loop stops with it, leaving the
|
|
11
|
+
* box on the palette's own ground, which is what forced text and marks are chosen
|
|
12
|
+
* against. The loop also stops off screen and with no box to draw on.
|
|
13
|
+
*
|
|
10
14
|
* @example
|
|
11
15
|
* ```html
|
|
12
16
|
* <div style="position: relative; min-height: 24rem; overflow: hidden">
|
|
@@ -40,10 +44,17 @@ export declare class WrAurora {
|
|
|
40
44
|
private gl;
|
|
41
45
|
private uniforms;
|
|
42
46
|
private rafId;
|
|
47
|
+
/** The shader time last drawn, so a resize can repaint the frame it just cleared. */
|
|
48
|
+
private time;
|
|
43
49
|
/** Flips once `boot()` has a context and a program — the loop waits for it. */
|
|
44
50
|
private readonly booted;
|
|
45
51
|
/** Whether the host is in the viewport; stays `true` without an observer. */
|
|
46
52
|
private readonly onScreen;
|
|
53
|
+
/**
|
|
54
|
+
* Whether the box has an area. The intersection observer calls a zero-area canvas
|
|
55
|
+
* intersecting and sends no entry when it gains a size, so this reads the box instead.
|
|
56
|
+
*/
|
|
57
|
+
private readonly hasBox;
|
|
47
58
|
constructor();
|
|
48
59
|
private boot;
|
|
49
60
|
private pushUniforms;
|
|
@@ -32,11 +32,10 @@ interface WrBorderGlowHarnessFilters extends BaseHarnessFilters {
|
|
|
32
32
|
* {@link parseInlineDeclarations} for why a computed read would be a different, and
|
|
33
33
|
* wrong, question.
|
|
34
34
|
*
|
|
35
|
-
* **A colour getter answering `null` means
|
|
36
|
-
*
|
|
37
|
-
* default takes over.
|
|
38
|
-
*
|
|
39
|
-
* "never set", not "not set now".
|
|
35
|
+
* **A colour getter answering `null` means that variable is not on the host now**, which
|
|
36
|
+
* is the contract when the input is unset or its value was refused: the stylesheet's
|
|
37
|
+
* per-theme default takes over. An input set and then put back to `null` comes off the
|
|
38
|
+
* host, so `null` says nothing about whether it was ever set.
|
|
40
39
|
*
|
|
41
40
|
* There is deliberately no `getGlowOpacity()`, `isGlowVisible()` or `isHovered()`: the
|
|
42
41
|
* visible strength is a `calc()` in the stylesheet gated behind `:not(:hover)`, and
|
|
@@ -103,7 +102,7 @@ export declare class WrBorderGlowHarness extends ComponentHarness {
|
|
|
103
102
|
getGlowColor(): Promise<string | null>;
|
|
104
103
|
/**
|
|
105
104
|
* The seven halo alphas in percent, brightest first, or `null` when no glow colour
|
|
106
|
-
*
|
|
105
|
+
* is set.
|
|
107
106
|
*
|
|
108
107
|
* This is the whole of `[glowIntensity]`: the steps are `[100, 60, 50, 40, 30, 20,
|
|
109
108
|
* 10]` multiplied by the intensity and clamped at 100, so `0.5` gives
|
|
@@ -23,7 +23,11 @@ import * as i0 from "@angular/core";
|
|
|
23
23
|
* @see https://www.reactbits.dev/components/border-glow (visual reference)
|
|
24
24
|
*/
|
|
25
25
|
export declare class WrBorderGlow {
|
|
26
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Card background fill. When unset, uses the theme surface token. A hook set inline on
|
|
28
|
+
* the same element is replaced by this input and does not come back when it is unset,
|
|
29
|
+
* so set it from a stylesheet rule. The same goes for `glowColor` and `colors`.
|
|
30
|
+
*/
|
|
27
31
|
readonly backgroundColor: import("@angular/core").InputSignal<string | null>;
|
|
28
32
|
/** Corner radius in pixels. @default 28 */
|
|
29
33
|
readonly borderRadius: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from "@angular/cdk/testing";
|
|
2
|
+
/** Narrows which `<wr-dot-grid>` a harness query matches. */
|
|
3
|
+
interface WrDotGridHarnessFilters extends BaseHarnessFilters {
|
|
4
|
+
/**
|
|
5
|
+
* Match only grids whose canvas has drawn (`true`) or only grids still showing the
|
|
6
|
+
* stand-in dots (`false`). A dot grid has no name of its own, so this is the one
|
|
7
|
+
* state that tells two of them apart — see `WrDotGridHarness.isPainted`, which
|
|
8
|
+
* explains why the answer is always `false` in a unit test.
|
|
9
|
+
*/
|
|
10
|
+
readonly painted?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Test harness for `<wr-dot-grid>` — a field of dots that light up and move aside
|
|
14
|
+
* near the pointer.
|
|
15
|
+
*
|
|
16
|
+
* **The dots themselves are unreadable and always will be.** They are fills on a 2D
|
|
17
|
+
* canvas, laid out from the host's measured box; a unit test has no box and no
|
|
18
|
+
* drawing context, so there is nothing to count and nothing to compare. What the
|
|
19
|
+
* component publishes to the DOM is small and deliberate: the handover flag
|
|
20
|
+
* {@link isPainted}, the pitch {@link getGapPx} and size {@link getDotSizePx} the CSS
|
|
21
|
+
* stand-in grid draws at before the canvas takes over, and the surface itself.
|
|
22
|
+
*
|
|
23
|
+
* Both numbers are read from the host's inline declaration, never computed: the
|
|
24
|
+
* stylesheet declares `--wr-dot-grid-gap` and `--wr-dot-grid-dot-size` too, as the
|
|
25
|
+
* stand-in's own defaults, so a computed read would answer `24` and `3` on a
|
|
26
|
+
* component that had stopped publishing anything — the break the methods exist to
|
|
27
|
+
* catch.
|
|
28
|
+
*
|
|
29
|
+
* There is no `getDotCount()`, `getDotPositions()` or `getCanvasSize()`: the grid is
|
|
30
|
+
* laid out from `getBoundingClientRect()`, which is 0×0 here, and what falls out of
|
|
31
|
+
* that describes nothing. No `getDotColor()` or `getActiveColor()` — they are canvas
|
|
32
|
+
* fills resolved from themed custom properties that only a stylesheet supplies. No
|
|
33
|
+
* `hover()` or `moveTo()`: the pointer listeners go on only once a context exists,
|
|
34
|
+
* and what they move is canvas pixels. And no `isReducedMotion()`: the still grid is
|
|
35
|
+
* drawn through the same code and sets the same flag, so the DOM is identical either
|
|
36
|
+
* way and any answer would be a guess.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* const grid = await loader.getHarness(WrDotGridHarness);
|
|
41
|
+
*
|
|
42
|
+
* expect(await grid.hasCanvas()).toBe(true);
|
|
43
|
+
* expect(await grid.isDecorative()).toBe(true);
|
|
44
|
+
* expect(await grid.getGapPx()).toBe(24);
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @see https://ngwr.dev/guides/testing
|
|
48
|
+
*/
|
|
49
|
+
export declare class WrDotGridHarness extends ComponentHarness {
|
|
50
|
+
static hostSelector: string;
|
|
51
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
52
|
+
static with(options?: WrDotGridHarnessFilters): HarnessPredicate<WrDotGridHarness>;
|
|
53
|
+
private readonly canvas;
|
|
54
|
+
/**
|
|
55
|
+
* Whether the canvas has drawn a frame and retired the CSS stand-in grid.
|
|
56
|
+
*
|
|
57
|
+
* **In a unit test this is always `false`, and asserting exactly that is the point.**
|
|
58
|
+
* jsdom hands back no 2D context, so the component must leave the stand-in up rather
|
|
59
|
+
* than declare itself painted over a blank box — the flag is set inside the draw for
|
|
60
|
+
* that reason, not at the end of the boot. A spec that waits for this to turn `true`
|
|
61
|
+
* waits forever.
|
|
62
|
+
*/
|
|
63
|
+
isPainted(): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* The distance between dot centres, in pixels, as the component publishes it —
|
|
66
|
+
* `[gap]`, floored at the 4px the canvas lays the grid out at.
|
|
67
|
+
*
|
|
68
|
+
* The canvas half of `[gap]` is invisible here, but the stand-in half is not, and a
|
|
69
|
+
* stand-in drawing at one pitch while the canvas arrives at another changes the
|
|
70
|
+
* grid under the reader on hydration.
|
|
71
|
+
*/
|
|
72
|
+
getGapPx(): Promise<number>;
|
|
73
|
+
/** The dot diameter, in pixels, as the component publishes it for the stand-in — `[dotSize]`. */
|
|
74
|
+
getDotSizePx(): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Whether the grid is hidden from assistive tech.
|
|
77
|
+
*
|
|
78
|
+
* A background canvas has nothing to announce, so losing this leaves a screen reader
|
|
79
|
+
* stopping on a nameless graphic in front of the section's actual content.
|
|
80
|
+
*/
|
|
81
|
+
isDecorative(): Promise<boolean>;
|
|
82
|
+
/**
|
|
83
|
+
* Whether the drawing surface is in the markup.
|
|
84
|
+
*
|
|
85
|
+
* It is there in every state, including the ones where nothing is ever drawn on it —
|
|
86
|
+
* prerendered, no 2D context, reduced motion — so the stand-in has something to sit
|
|
87
|
+
* behind and {@link isPainted} has something to answer about.
|
|
88
|
+
*/
|
|
89
|
+
hasCanvas(): Promise<boolean>;
|
|
90
|
+
private publishedPx;
|
|
91
|
+
}
|
|
92
|
+
export type { WrDotGridHarnessFilters };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
/**
|
|
3
|
+
* Dot-grid background — evenly spaced dots on a 2D canvas that light up in the
|
|
4
|
+
* active colour near the pointer and are pushed away from it, both by the same
|
|
5
|
+
* falloff, then spring back. Fills its nearest positioned ancestor; put it
|
|
6
|
+
* behind hero copy or section content.
|
|
7
|
+
*
|
|
8
|
+
* The pointer is followed on the host's PARENT, with passive listeners, so the
|
|
9
|
+
* dots answer a pointer that is over the content in front of them rather than
|
|
10
|
+
* over the canvas — the host itself takes no pointer events and never steals a
|
|
11
|
+
* click. Placed directly in a shadow root, where it has no parent element, it
|
|
12
|
+
* follows the pointer on the shadow host; with neither it listens nowhere and
|
|
13
|
+
* the grid stays unlit. Content placed after it needs `position: relative` (or
|
|
14
|
+
* any z-index) to paint above it, as with any absolutely positioned layer.
|
|
15
|
+
*
|
|
16
|
+
* The grid is laid out in the host's own box, before transforms, so one that
|
|
17
|
+
* boots inside a scaling-in panel (a dialog opening) is not stretched when the
|
|
18
|
+
* animation ends, and the pointer is mapped back through the transform.
|
|
19
|
+
*
|
|
20
|
+
* Decorative: the canvas is `aria-hidden`, the host has no role and nothing in
|
|
21
|
+
* it takes focus. The frame loop runs only while something moves — a still
|
|
22
|
+
* grid asks for no frames at all — and never while the host is off screen.
|
|
23
|
+
*
|
|
24
|
+
* Under `prefers-reduced-motion` one still grid is drawn, in the resting
|
|
25
|
+
* colour, and nothing follows the pointer; it is drawn again when the colours
|
|
26
|
+
* or the page's colour scheme change. The preference is read live.
|
|
27
|
+
*
|
|
28
|
+
* Colours are theme tokens by default — the dots `--wr-border-strong`, the lit
|
|
29
|
+
* ones `--wr-color-primary` — through the `--wr-dot-grid-dot-color` and
|
|
30
|
+
* `--wr-dot-grid-active-color` hooks, and resolved before they reach the
|
|
31
|
+
* canvas, which reads neither a `var()` nor a `light-dark()`.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```html
|
|
35
|
+
* <section style="position: relative; min-height: 24rem; overflow: hidden">
|
|
36
|
+
* <wr-dot-grid />
|
|
37
|
+
* <h1 style="position: relative">Hero copy above the dots</h1>
|
|
38
|
+
* </section>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @see https://ngwr.dev/bits/dot-grid
|
|
42
|
+
*/
|
|
43
|
+
export declare class WrDotGrid {
|
|
44
|
+
/** Dot diameter in px. @default 3 */
|
|
45
|
+
readonly dotSize: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
46
|
+
/** Distance between dot centres in px, never under 4. @default 24 */
|
|
47
|
+
readonly gap: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
48
|
+
/** Resting dot colour, any CSS colour. When unset, empty or blank, `--wr-dot-grid-dot-color` decides. */
|
|
49
|
+
readonly dotColor: import("@angular/core").InputSignal<string | null>;
|
|
50
|
+
/** Colour a dot takes near the pointer, any CSS colour. When unset, empty or blank, `--wr-dot-grid-active-color` decides. */
|
|
51
|
+
readonly activeColor: import("@angular/core").InputSignal<string | null>;
|
|
52
|
+
/** How far from the pointer a dot still reacts, in px. @default 120 */
|
|
53
|
+
readonly radius: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
54
|
+
/**
|
|
55
|
+
* How far a dot right by the pointer is pushed, in px; the push fades out
|
|
56
|
+
* toward `radius`. `0` keeps the dots in place and only lights them, and a
|
|
57
|
+
* negative value pulls them in. @default 12
|
|
58
|
+
*/
|
|
59
|
+
readonly strength: import("@angular/core").InputSignalWithTransform<number, unknown>;
|
|
60
|
+
/** The pitch the grid is laid out at: `gap`, floored. */
|
|
61
|
+
protected readonly pitch: import("@angular/core").Signal<number>;
|
|
62
|
+
/** The dot diameter drawn: `dotSize`, never negative. */
|
|
63
|
+
protected readonly size: import("@angular/core").Signal<number>;
|
|
64
|
+
/** A colour the author chose, published so the stand-in draws in it too; `null` while the hook decides. */
|
|
65
|
+
protected readonly standInColor: import("@angular/core").Signal<string | null>;
|
|
66
|
+
/** The colours the canvas resolves: an input that is unset, empty or blank leaves the hook in charge. */
|
|
67
|
+
private readonly dotExpression;
|
|
68
|
+
private readonly activeExpression;
|
|
69
|
+
/**
|
|
70
|
+
* Flips once the canvas has drawn, which retires the CSS stand-in grid.
|
|
71
|
+
*
|
|
72
|
+
* A canvas cannot be prerendered, so on an SSR'd page it is blank until the
|
|
73
|
+
* bundle has loaded and hydrated. The stylesheet paints the same dots at the
|
|
74
|
+
* same pitch from the prerendered HTML in the meantime, and this hands over.
|
|
75
|
+
*/
|
|
76
|
+
protected readonly painted: import("@angular/core").WritableSignal<boolean>;
|
|
77
|
+
private readonly canvasRef;
|
|
78
|
+
private readonly host;
|
|
79
|
+
private readonly zone;
|
|
80
|
+
private readonly destroyRef;
|
|
81
|
+
private readonly platform;
|
|
82
|
+
private readonly isBrowser;
|
|
83
|
+
private ctx;
|
|
84
|
+
/** The host's layout box, in CSS pixels before any transform: what the grid is laid out in. */
|
|
85
|
+
private box;
|
|
86
|
+
/** Bitmap pixels per CSS pixel the canvas is backed at; 0 until the first fit. */
|
|
87
|
+
private ratio;
|
|
88
|
+
private dots;
|
|
89
|
+
/** Lit dots by alpha step, reused frame to frame. */
|
|
90
|
+
private readonly lit;
|
|
91
|
+
/** The pointer, in viewport coordinates, and whether it is over the parent at all. */
|
|
92
|
+
private readonly pointer;
|
|
93
|
+
private rafId;
|
|
94
|
+
private lastTime;
|
|
95
|
+
/** Schedules a frame while motion is allowed; `null` under reduced motion. */
|
|
96
|
+
private wake;
|
|
97
|
+
/** Flips once `boot()` has a context and a grid — everything after waits for it. */
|
|
98
|
+
private readonly booted;
|
|
99
|
+
constructor();
|
|
100
|
+
private boot;
|
|
101
|
+
/** Follow the pointer and draw on demand; returns what stops both. */
|
|
102
|
+
private interact;
|
|
103
|
+
/** Draw the grid as it should look now: a frame while motion is allowed, at once under reduced motion. */
|
|
104
|
+
private requestDraw;
|
|
105
|
+
/** Fit the canvas to a new box or pixel ratio and, when that cleared it, repaint at once. */
|
|
106
|
+
private resize;
|
|
107
|
+
/**
|
|
108
|
+
* Back the canvas for a `width` × `height` box, in CSS pixels, at the screen's
|
|
109
|
+
* pixel ratio. Returns whether anything changed: writing `canvas.width` clears
|
|
110
|
+
* the bitmap even to the value it already has, so an unchanged box is left alone.
|
|
111
|
+
*/
|
|
112
|
+
private fit;
|
|
113
|
+
/** Lay the dots out over the box, every one at rest. */
|
|
114
|
+
private placeDots;
|
|
115
|
+
/** Positions along one side of `length`: the centre, then every `gap` out to one step past each edge. */
|
|
116
|
+
private axis;
|
|
117
|
+
/** Every dot back at rest and unlit, and the pointer gone. */
|
|
118
|
+
private rest;
|
|
119
|
+
private tick;
|
|
120
|
+
/** Advance every dot by `step` frames; returns whether any is still moving. */
|
|
121
|
+
private move;
|
|
122
|
+
private draw;
|
|
123
|
+
/** One path for every dot in `dots`, filled once. */
|
|
124
|
+
private fillDots;
|
|
125
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WrDotGrid, never>;
|
|
126
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<WrDotGrid, "wr-dot-grid", never, {
|
|
127
|
+
"dotSize": {
|
|
128
|
+
"alias": "dotSize";
|
|
129
|
+
"required": false;
|
|
130
|
+
"isSignal": true;
|
|
131
|
+
};
|
|
132
|
+
"gap": {
|
|
133
|
+
"alias": "gap";
|
|
134
|
+
"required": false;
|
|
135
|
+
"isSignal": true;
|
|
136
|
+
};
|
|
137
|
+
"dotColor": {
|
|
138
|
+
"alias": "dotColor";
|
|
139
|
+
"required": false;
|
|
140
|
+
"isSignal": true;
|
|
141
|
+
};
|
|
142
|
+
"activeColor": {
|
|
143
|
+
"alias": "activeColor";
|
|
144
|
+
"required": false;
|
|
145
|
+
"isSignal": true;
|
|
146
|
+
};
|
|
147
|
+
"radius": {
|
|
148
|
+
"alias": "radius";
|
|
149
|
+
"required": false;
|
|
150
|
+
"isSignal": true;
|
|
151
|
+
};
|
|
152
|
+
"strength": {
|
|
153
|
+
"alias": "strength";
|
|
154
|
+
"required": false;
|
|
155
|
+
"isSignal": true;
|
|
156
|
+
};
|
|
157
|
+
}, {}, never, never, true, never>;
|
|
158
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from "@angular/cdk/testing";
|
|
2
|
+
/** Narrows which `<wr-iridescence>` a harness query matches. */
|
|
3
|
+
interface WrIridescenceHarnessFilters extends BaseHarnessFilters {
|
|
4
|
+
/**
|
|
5
|
+
* Match only hosts whose canvas has drawn (`true`) or only hosts still showing the
|
|
6
|
+
* stand-in alone (`false`). The background has no name of its own, so this is the one
|
|
7
|
+
* state that tells two of them apart — see `WrIridescenceHarness.isPainted`, which
|
|
8
|
+
* says when each answer is the right one in a unit test.
|
|
9
|
+
*/
|
|
10
|
+
readonly painted?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Test harness for `<wr-iridescence>` — folded silk on a WebGL2 canvas.
|
|
14
|
+
*
|
|
15
|
+
* **The picture is unreadable and always will be.** It is a fragment shader's output,
|
|
16
|
+
* and jsdom has no WebGL2 to run one. What the component publishes to the DOM is small
|
|
17
|
+
* and deliberate: the handover flag {@link isPainted}, the colour {@link getColor} it
|
|
18
|
+
* hands the CSS stand-in, and the surface itself.
|
|
19
|
+
*
|
|
20
|
+
* The colour is read from the host's inline declaration, a variable of the component's
|
|
21
|
+
* own. The `--wr-iridescence-color` hook belongs to the author and the stylesheet, so it
|
|
22
|
+
* says nothing about what the component published.
|
|
23
|
+
*
|
|
24
|
+
* There is no `getPhase()`: the phases live in a frame loop, step by the real frame
|
|
25
|
+
* delta and leave the component only as a uniform, so any number would be a stale copy
|
|
26
|
+
* of an implementation detail. No pixel reads: a stub context paints nothing, and with
|
|
27
|
+
* no stub there is no context. No `isAnimating()`: a loop that is running and a loop
|
|
28
|
+
* that was never started look the same from the DOM, and a frame that would repeat the
|
|
29
|
+
* last one draws nothing either way. And no `stir()`: the pointer's easing runs on
|
|
30
|
+
* frames and its result goes to a uniform, so a method that moved it could report
|
|
31
|
+
* nothing it had done.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const silk = await loader.getHarness(WrIridescenceHarness);
|
|
36
|
+
*
|
|
37
|
+
* expect(await silk.hasCanvas()).toBe(true);
|
|
38
|
+
* expect(await silk.isDecorative()).toBe(true);
|
|
39
|
+
* expect(await silk.getColor()).toBe('var(--wr-color-primary)');
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @see https://ngwr.dev/guides/testing
|
|
43
|
+
*/
|
|
44
|
+
export declare class WrIridescenceHarness extends ComponentHarness {
|
|
45
|
+
static hostSelector: string;
|
|
46
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
47
|
+
static with(options?: WrIridescenceHarnessFilters): HarnessPredicate<WrIridescenceHarness>;
|
|
48
|
+
private readonly canvas;
|
|
49
|
+
/**
|
|
50
|
+
* Whether the canvas has drawn a frame and is fading in over the CSS stand-in.
|
|
51
|
+
*
|
|
52
|
+
* **In a plain unit test this is `false`, and asserting exactly that is the point.**
|
|
53
|
+
* jsdom hands back no WebGL2 context, so the component must leave the stand-in up
|
|
54
|
+
* rather than declare itself painted over a blank box: the flag is set inside the draw
|
|
55
|
+
* for that reason, not at the end of the boot. A spec that stubs a context and runs a
|
|
56
|
+
* frame gets `true`, and a lost context takes it back to `false`.
|
|
57
|
+
*/
|
|
58
|
+
isPainted(): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* The colour published on the host's own `--wr-iridescence-input-color` for the stand-in,
|
|
61
|
+
* or `null` when none is: `[color]` unset, empty or blank, which leaves the stylesheet's
|
|
62
|
+
* value in charge.
|
|
63
|
+
*
|
|
64
|
+
* It is the input as authored, a `var()` or a `light-dark()` included, not what it
|
|
65
|
+
* resolves to: what reaches the shader is a uniform, which the DOM does not carry. A
|
|
66
|
+
* stand-in tinted one colour while the canvas arrives in another is what this catches.
|
|
67
|
+
*/
|
|
68
|
+
getColor(): Promise<string | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Whether the background is hidden from assistive tech.
|
|
71
|
+
*
|
|
72
|
+
* A background canvas has nothing to announce, so losing this leaves a screen reader
|
|
73
|
+
* stopping on a nameless graphic in front of the section's actual content.
|
|
74
|
+
*/
|
|
75
|
+
isDecorative(): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Whether the drawing surface is in the markup.
|
|
78
|
+
*
|
|
79
|
+
* It is there in every state, including the ones where nothing is ever drawn on it
|
|
80
|
+
* (prerendered, no WebGL2, a shader the driver refused), so the stand-in has something
|
|
81
|
+
* to sit behind and {@link isPainted} has something to answer about.
|
|
82
|
+
*/
|
|
83
|
+
hasCanvas(): Promise<boolean>;
|
|
84
|
+
}
|
|
85
|
+
export type { WrIridescenceHarnessFilters };
|