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
package/types/ngwr-window.d.ts
CHANGED
|
@@ -1,9 +1,35 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { ComponentRef, InjectionToken, Signal, WritableSignal } from "@angular/core";
|
|
3
|
-
import { WrClassInput } from "ngwr/utils";
|
|
2
|
+
import { ComponentRef, ElementRef, InjectionToken, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
3
|
+
import { WrClassInput, WrFeature } from "ngwr/utils";
|
|
4
4
|
import { ComponentType } from "@angular/cdk/portal";
|
|
5
5
|
import { OverlayRef } from "@angular/cdk/overlay";
|
|
6
|
-
import { ReplaySubject, Subject } from "rxjs";
|
|
6
|
+
import { Observable, ReplaySubject, Subject } from "rxjs";
|
|
7
|
+
import { WrDropdown } from "ngwr/dropdown";
|
|
8
|
+
/**
|
|
9
|
+
* Space to keep clear at each edge of the viewport, in CSS pixels — an app
|
|
10
|
+
* header, a side rail, a status strip. Physical edges, like every window
|
|
11
|
+
* coordinate: `x` and `left` are screen positions, not reading-order ones.
|
|
12
|
+
*/
|
|
13
|
+
interface WrWindowInsets {
|
|
14
|
+
readonly top?: number;
|
|
15
|
+
readonly right?: number;
|
|
16
|
+
readonly bottom?: number;
|
|
17
|
+
readonly left?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The work area: the rectangle that maximize, snapping, `keepInViewport` and
|
|
21
|
+
* the opening cascade all keep a window inside.
|
|
22
|
+
*
|
|
23
|
+
* - `'viewport'` (the default) — the whole viewport.
|
|
24
|
+
* - an inset object — the viewport minus that much at each edge.
|
|
25
|
+
* - an element (or an `ElementRef`) — that element's box, for a desktop that
|
|
26
|
+
* lives inside a panel. It is measured again when it resizes, when the
|
|
27
|
+
* viewport resizes and when the page scrolls.
|
|
28
|
+
*
|
|
29
|
+
* A `<wr-window-taskbar>` on the page reserves its own strip on top of any of
|
|
30
|
+
* these while it shows tabs, so a maximized window stops short of it.
|
|
31
|
+
*/
|
|
32
|
+
type WrWindowBounds = 'viewport' | WrWindowInsets | HTMLElement | ElementRef<HTMLElement>;
|
|
7
33
|
/**
|
|
8
34
|
* @license
|
|
9
35
|
*
|
|
@@ -38,17 +64,20 @@ type WrWindowChromeSize = 'sm' | 'md';
|
|
|
38
64
|
* - `auto` (default) — read the user's OS from the browser and pick
|
|
39
65
|
* `macos` / `windows` / `linux`. Unknown platforms fall back to
|
|
40
66
|
* `windows`. SSR-safe (resolves to `windows` on the server).
|
|
41
|
-
* - `macos` — traffic
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* - `
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
67
|
+
* - `macos` — traffic lights on the LEFT (red close, yellow minimize, green
|
|
68
|
+
* zoom). Their glyphs (×, −, and the full-screen arrows, pointing in once
|
|
69
|
+
* the window is maximized) appear while the cluster is hovered or focused.
|
|
70
|
+
* - `windows` — Windows 11 caption buttons on the RIGHT: full-height, 46px
|
|
71
|
+
* wide, flush with the frame, with a red close on hover.
|
|
72
|
+
* - `linux` — GNOME's round buttons on the right, close-only by convention.
|
|
73
|
+
* That is a DEFAULT and not a rule: `showMinimize` / `showMaximize` set to
|
|
74
|
+
* `true` put the buttons back, which is what a Linux user needs before a
|
|
75
|
+
* window can be minimized into `<wr-window-taskbar>`.
|
|
76
|
+
*
|
|
77
|
+
* Every preset moves to the other edge in a right-to-left page, as each of
|
|
78
|
+
* the three platforms does in a right-to-left UI.
|
|
48
79
|
*/
|
|
49
80
|
type WrWindowOs = 'auto' | 'macos' | 'windows' | 'linux';
|
|
50
|
-
/** Resolved OS — what `'auto'` collapses to. */
|
|
51
|
-
type WrWindowResolvedOs = Exclude<WrWindowOs, 'auto'>;
|
|
52
81
|
/**
|
|
53
82
|
* @license
|
|
54
83
|
*
|
|
@@ -64,6 +93,402 @@ type WrWindowResolvedOs = Exclude<WrWindowOs, 'auto'>;
|
|
|
64
93
|
* - `lg` — 720 × 480
|
|
65
94
|
*/
|
|
66
95
|
type WrWindowSize = 'sm' | 'md' | 'lg';
|
|
96
|
+
/**
|
|
97
|
+
* A rectangle in viewport pixels — the work area, a snap region, a window's box.
|
|
98
|
+
*
|
|
99
|
+
* @internal
|
|
100
|
+
*/
|
|
101
|
+
interface WrWindowRect {
|
|
102
|
+
readonly left: number;
|
|
103
|
+
readonly top: number;
|
|
104
|
+
readonly width: number;
|
|
105
|
+
readonly height: number;
|
|
106
|
+
}
|
|
107
|
+
/** @internal A window's free-floating geometry: where it is when it is neither maximized nor snapped. */
|
|
108
|
+
interface WrWindowGeometry {
|
|
109
|
+
readonly x: number;
|
|
110
|
+
readonly y: number;
|
|
111
|
+
readonly width: number;
|
|
112
|
+
readonly height: number;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Every option a window reads after it opens, with its default applied. The
|
|
116
|
+
* ones `WrWindowRef.update()` may change are signals of this object, so an
|
|
117
|
+
* update reaches the chrome and the drag code alike.
|
|
118
|
+
*
|
|
119
|
+
* @internal
|
|
120
|
+
*/
|
|
121
|
+
interface WrWindowOptions {
|
|
122
|
+
readonly os: WrWindowOs;
|
|
123
|
+
readonly chromeSize: WrWindowChromeSize;
|
|
124
|
+
readonly animations: boolean;
|
|
125
|
+
readonly minWidth: number;
|
|
126
|
+
readonly minHeight: number;
|
|
127
|
+
readonly maxWidth: number;
|
|
128
|
+
readonly maxHeight: number;
|
|
129
|
+
readonly movable: boolean;
|
|
130
|
+
readonly resizable: boolean;
|
|
131
|
+
readonly keepInViewport: boolean;
|
|
132
|
+
readonly snap: WrWindowSnap;
|
|
133
|
+
readonly restoreOnDrag: boolean;
|
|
134
|
+
readonly dragHandle: string | null;
|
|
135
|
+
readonly showMinimize: boolean | null;
|
|
136
|
+
readonly showMaximize: boolean | null;
|
|
137
|
+
readonly showClose: boolean;
|
|
138
|
+
readonly closeOnEscape: boolean;
|
|
139
|
+
readonly keyboard: boolean;
|
|
140
|
+
readonly keyboardStep: number;
|
|
141
|
+
}
|
|
142
|
+
/** @internal How a window was set up when it opened. */
|
|
143
|
+
interface WrWindowModelInit {
|
|
144
|
+
readonly options: WrWindowOptions;
|
|
145
|
+
readonly title?: string;
|
|
146
|
+
readonly geometry?: WrWindowGeometry;
|
|
147
|
+
readonly state?: WrWindowState;
|
|
148
|
+
readonly snap?: WrWindowSnapTarget | null;
|
|
149
|
+
readonly z?: number;
|
|
150
|
+
readonly workArea: Signal<WrWindowRect>;
|
|
151
|
+
}
|
|
152
|
+
/** @internal A half or a quarter: what `snap` can hold. `top` is the maximized state instead. */
|
|
153
|
+
type WrWindowSnapRegion = Exclude<WrWindowSnapTarget, 'top'>;
|
|
154
|
+
/** @internal What `startKeyboard` hands back for the announcement. */
|
|
155
|
+
type WrWindowKeyboardMode = 'move' | 'resize';
|
|
156
|
+
/**
|
|
157
|
+
* One window's state and geometry, and the rules for changing them.
|
|
158
|
+
*
|
|
159
|
+
* Created by `WrWindowManager.open()` before anything renders, so the ref's
|
|
160
|
+
* signals are right from the first read and a call made before the first render
|
|
161
|
+
* — `ref.maximize()` in the same tick as `open()`, `ref.setTitle()` from the
|
|
162
|
+
* body's constructor — lands instead of being dropped. The component only draws
|
|
163
|
+
* it and turns pointer and key events into calls on it.
|
|
164
|
+
*
|
|
165
|
+
* The raw `x` / `y` / `width` / `height` are the geometry the USER chose. A
|
|
166
|
+
* maximized or snapped window shows something else (`rect`), and goes back to
|
|
167
|
+
* the raw geometry when it leaves that state; nothing has to be saved on the
|
|
168
|
+
* way in, so a `moveTo()` made while maximized is where restore lands.
|
|
169
|
+
*
|
|
170
|
+
* @internal
|
|
171
|
+
*/
|
|
172
|
+
declare class WrWindowModel {
|
|
173
|
+
readonly options: WritableSignal<WrWindowOptions>;
|
|
174
|
+
readonly title: WritableSignal<string>;
|
|
175
|
+
readonly state: WritableSignal<WrWindowState>;
|
|
176
|
+
/** The half or quarter the window occupies while `normal`. `top` is never stored: it is `maximized`. */
|
|
177
|
+
readonly snap: WritableSignal<WrWindowSnapRegion | null>;
|
|
178
|
+
readonly x: WritableSignal<number>;
|
|
179
|
+
readonly y: WritableSignal<number>;
|
|
180
|
+
readonly width: WritableSignal<number>;
|
|
181
|
+
readonly height: WritableSignal<number>;
|
|
182
|
+
readonly z: WritableSignal<number>;
|
|
183
|
+
/** Written by the manager: whether this is the window that has the keyboard. */
|
|
184
|
+
readonly isActive: WritableSignal<boolean>;
|
|
185
|
+
readonly keyboardMode: WritableSignal<WrWindowKeyboardMode | null>;
|
|
186
|
+
/** The snap region a drag in progress would land in, for the hint. */
|
|
187
|
+
readonly dragTarget: WritableSignal<WrWindowSnapTarget | null>;
|
|
188
|
+
readonly workArea: Signal<WrWindowRect>;
|
|
189
|
+
readonly moved: Subject<{
|
|
190
|
+
readonly x: number;
|
|
191
|
+
readonly y: number;
|
|
192
|
+
}>;
|
|
193
|
+
readonly resized: Subject<{
|
|
194
|
+
readonly width: number;
|
|
195
|
+
readonly height: number;
|
|
196
|
+
}>;
|
|
197
|
+
readonly stateChanges: Subject<WrWindowState>;
|
|
198
|
+
/** Set by the component: the `<wr-window>` element, for the focus checks. */
|
|
199
|
+
element: HTMLElement | null;
|
|
200
|
+
/** Set by the container: the window was minimized while it held focus. */
|
|
201
|
+
onMinimizedWithFocus: (() => void) | null;
|
|
202
|
+
/** What leaving `minimized` goes back to — a window minimized while maximized comes back maximized. */
|
|
203
|
+
private restoreTo;
|
|
204
|
+
/** The geometry keyboard mode started from, after it restored the window: what a commit compares against. */
|
|
205
|
+
private keyboardStart;
|
|
206
|
+
/** Everything keyboard mode changed on entry, so Escape can put back a maximized or snapped window too. */
|
|
207
|
+
private keyboardOrigin;
|
|
208
|
+
/** The box on screen: the raw geometry, or what the state imposes on it. */
|
|
209
|
+
readonly rect: Signal<WrWindowRect>;
|
|
210
|
+
/** Where the drag in progress would land, for the snap hint. */
|
|
211
|
+
readonly previewRect: Signal<WrWindowRect | null>;
|
|
212
|
+
constructor(init: WrWindowModelInit);
|
|
213
|
+
/** The one place a state is written, so `stateChanges` hears every change and only real ones. */
|
|
214
|
+
setState(next: WrWindowState): void;
|
|
215
|
+
/** Toggle: minimize, or come back to the state it was minimized from. */
|
|
216
|
+
minimize(): void;
|
|
217
|
+
/** Leave `minimized` for the state the window was minimized from. A no-op otherwise. */
|
|
218
|
+
unminimize(): void;
|
|
219
|
+
/** Toggle: maximize, or restore down to where it was — a snapped half included. */
|
|
220
|
+
maximize(): void;
|
|
221
|
+
/** Back to the free-floating geometry: not minimized, not maximized, not snapped. */
|
|
222
|
+
restore(): void;
|
|
223
|
+
/** Snap to a region of the work area; `top` maximizes, `null` un-snaps. */
|
|
224
|
+
snapTo(target: WrWindowSnapTarget | null): void;
|
|
225
|
+
/** Write the raw geometry, in whole pixels — a touch drag hands out fractions. */
|
|
226
|
+
setRaw(g: Partial<WrWindowGeometry>): void;
|
|
227
|
+
/**
|
|
228
|
+
* A snapped window that is moved or resized by hand leaves the snap and
|
|
229
|
+
* keeps the box it had, the way a desktop does — otherwise the write would
|
|
230
|
+
* land in the raw geometry and nothing would visibly move.
|
|
231
|
+
*/
|
|
232
|
+
unsnapInPlace(): void;
|
|
233
|
+
moveTo(x: number, y: number): void;
|
|
234
|
+
resizeTo(width: number, height: number): void;
|
|
235
|
+
center(): void;
|
|
236
|
+
/**
|
|
237
|
+
* Keep enough of the window inside the work area to grab it again. Reads the
|
|
238
|
+
* work area, so a resized viewport pulls a window back into reach.
|
|
239
|
+
*/
|
|
240
|
+
clamp(): void;
|
|
241
|
+
/** Change options on an open window. New bounds re-clamp the size the window has now. */
|
|
242
|
+
update(patch: WrWindowUpdate): void;
|
|
243
|
+
/** The box a maximized window takes: the work area, capped at the maximum size and centred in it. */
|
|
244
|
+
maximizedRect(): WrWindowRect;
|
|
245
|
+
/**
|
|
246
|
+
* The box a half or a quarter takes, held to the window's own bounds: a
|
|
247
|
+
* window that cannot be that narrow keeps its minimum and stays against the
|
|
248
|
+
* edge it was snapped to, and the box is kept inside the work area.
|
|
249
|
+
*/
|
|
250
|
+
snapRect(target: WrWindowSnapRegion): WrWindowRect;
|
|
251
|
+
/** Where a snap target puts the window. */
|
|
252
|
+
targetRect(target: WrWindowSnapTarget): WrWindowRect;
|
|
253
|
+
/**
|
|
254
|
+
* Enter keyboard move or resize. A maximized window is restored down first
|
|
255
|
+
* and a snapped one keeps its box, so the arrows move what the user sees.
|
|
256
|
+
* Returns `false` when the option forbids it.
|
|
257
|
+
*/
|
|
258
|
+
startKeyboard(mode: WrWindowKeyboardMode): boolean;
|
|
259
|
+
/** One arrow key in keyboard move. */
|
|
260
|
+
nudge(dx: number, dy: number): void;
|
|
261
|
+
/**
|
|
262
|
+
* One arrow key in keyboard resize. The edge that moves is the inline END —
|
|
263
|
+
* the left one in a right-to-left page — so growing never moves the edge the
|
|
264
|
+
* window reads from.
|
|
265
|
+
*/
|
|
266
|
+
grow(dw: number, dh: number, rtl: boolean): void;
|
|
267
|
+
/** Keep what keyboard mode did. Returns the mode it ended, for the announcement and the stream. */
|
|
268
|
+
commitKeyboard(): WrWindowKeyboardMode | null;
|
|
269
|
+
/**
|
|
270
|
+
* Put the window back the way keyboard mode found it: the geometry, and the
|
|
271
|
+
* maximized state or the snapped half it restored on entry. Without the last
|
|
272
|
+
* two, Escape on a maximized window left it restored down.
|
|
273
|
+
*/
|
|
274
|
+
cancelKeyboard(): WrWindowKeyboardMode | null;
|
|
275
|
+
/** Whether focus is inside the window. */
|
|
276
|
+
hasFocus(): boolean;
|
|
277
|
+
/** The window closed: no stream may outlive it. */
|
|
278
|
+
complete(): void;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* What a ref needs from the manager that opened it.
|
|
282
|
+
*
|
|
283
|
+
* @internal
|
|
284
|
+
*/
|
|
285
|
+
interface WrWindowRefHost {
|
|
286
|
+
/** Raise the window, mark it active and, unless told otherwise, move focus into it. */
|
|
287
|
+
_activate(ref: WrWindowRef<unknown, unknown>, options?: {
|
|
288
|
+
readonly focus?: boolean;
|
|
289
|
+
}): void;
|
|
290
|
+
/** Raise the window without touching focus. */
|
|
291
|
+
_raise(ref: WrWindowRef<unknown, unknown>): void;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Handle returned by `WrWindowManager.open()`.
|
|
295
|
+
*
|
|
296
|
+
* Wraps the underlying overlay, exposes signals for the live geometry,
|
|
297
|
+
* and gives the consumer programmatic control over the window
|
|
298
|
+
* (focus, move, resize, minimize, maximize, close).
|
|
299
|
+
*
|
|
300
|
+
* Every signal is right from the moment `open()` returns, and every call works
|
|
301
|
+
* from then on too — including from the body component's constructor.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```ts
|
|
305
|
+
* const ref = manager.open(EditorComponent, {
|
|
306
|
+
* title: 'Untitled.md',
|
|
307
|
+
* storage: { key: 'editor', prefix: 'app' },
|
|
308
|
+
* });
|
|
309
|
+
*
|
|
310
|
+
* ref.beforeClose(async () => {
|
|
311
|
+
* if (!isDirty) return true;
|
|
312
|
+
* return await confirmDiscard();
|
|
313
|
+
* });
|
|
314
|
+
*
|
|
315
|
+
* const saved = await ref.afterClosed(); // resolves with whatever the
|
|
316
|
+
* // component passed to ref.close(value)
|
|
317
|
+
* ```
|
|
318
|
+
*/
|
|
319
|
+
export declare class WrWindowRef<C, R = unknown> {
|
|
320
|
+
readonly _overlayRef: OverlayRef;
|
|
321
|
+
/** Stable id — used by the taskbar, workspace save, and DI. */
|
|
322
|
+
readonly id: string;
|
|
323
|
+
/**
|
|
324
|
+
* @internal — emits the close result once and completes.
|
|
325
|
+
*
|
|
326
|
+
* A `ReplaySubject`, not a plain `Subject`, so the result survives a late
|
|
327
|
+
* subscriber — the same reasoning `WrDialogRef` already carries. A caller
|
|
328
|
+
* that holds the ref and awaits `afterClosed()` after any intervening
|
|
329
|
+
* `await` subscribes to an already-completed stream, and a plain Subject
|
|
330
|
+
* hands it nothing but `complete`: the promise resolved `undefined` and a
|
|
331
|
+
* saved result was indistinguishable from a dismissal.
|
|
332
|
+
*/
|
|
333
|
+
readonly _closed: ReplaySubject<R | undefined>;
|
|
334
|
+
/** @internal — the window's state and geometry; the signals below read through it. */
|
|
335
|
+
readonly _model: WrWindowModel;
|
|
336
|
+
/** @internal — emits whenever the state changes; `stateChanges` is its public face. */
|
|
337
|
+
readonly _stateChanged: Subject<WrWindowState>;
|
|
338
|
+
/** @internal — set by the container right after attach. */
|
|
339
|
+
componentRef: ComponentRef<C> | null;
|
|
340
|
+
/** @internal — whether this window opts into the taskbar list. */
|
|
341
|
+
taskbarVisible: boolean;
|
|
342
|
+
/** @internal — the manager that opened the window. */
|
|
343
|
+
_host: WrWindowRefHost | null;
|
|
344
|
+
/** @internal — close the overlay and settle the result; wired by the manager. */
|
|
345
|
+
_doClose: ((result: R | undefined) => void) | null;
|
|
346
|
+
/**
|
|
347
|
+
* @internal — move focus into the window after the next render: to the control
|
|
348
|
+
* it had last (`'last'`, falling back to the first one) or to the first one.
|
|
349
|
+
* Wired by the container once the window is on the page.
|
|
350
|
+
*/
|
|
351
|
+
_focusWindow: ((mode: 'initial' | 'last') => void) | null;
|
|
352
|
+
/** @internal — enter keyboard move / resize; wired by the container. */
|
|
353
|
+
_startKeyboard: ((mode: WrWindowKeyboardMode) => void) | null;
|
|
354
|
+
/** @internal — a keyboard mode asked for before the window was on the page. */
|
|
355
|
+
_pendingKeyboard: WrWindowKeyboardMode | null;
|
|
356
|
+
/**
|
|
357
|
+
* @internal — what had focus when `open()` was called, and where closing the
|
|
358
|
+
* window sends it back. `null` when focus was on nothing.
|
|
359
|
+
*/
|
|
360
|
+
_returnFocus: HTMLElement | null;
|
|
361
|
+
/** Window state. A snapped window is `normal`; read {@link snap} for which half. */
|
|
362
|
+
readonly state: Signal<WrWindowState>;
|
|
363
|
+
/** Left edge on screen, in px — the work area's while maximized. */
|
|
364
|
+
readonly x: Signal<number>;
|
|
365
|
+
/** Top edge on screen, in px. */
|
|
366
|
+
readonly y: Signal<number>;
|
|
367
|
+
/** Width on screen, in px. */
|
|
368
|
+
readonly width: Signal<number>;
|
|
369
|
+
/** Height on screen, in px. */
|
|
370
|
+
readonly height: Signal<number>;
|
|
371
|
+
/** Stack z-index. */
|
|
372
|
+
readonly z: Signal<number>;
|
|
373
|
+
/** Live title. */
|
|
374
|
+
readonly title: Signal<string>;
|
|
375
|
+
/** The half or quarter the window is snapped to, or `null` (since v15.1). Maximized reads `null`. */
|
|
376
|
+
readonly snap: Signal<WrWindowSnapTarget | null>;
|
|
377
|
+
/** Whether this is the active window — the one that has the keyboard (since v15.1). */
|
|
378
|
+
readonly isActive: Signal<boolean>;
|
|
379
|
+
/** Emits the close result once, then completes — the stream `WrDialogRef.closed` is (since v15.1). */
|
|
380
|
+
readonly closed: Observable<R | undefined>;
|
|
381
|
+
/**
|
|
382
|
+
* Emits where the user moved the window: once when a title-bar drag or a
|
|
383
|
+
* keyboard move ends, and when a drag snaps it. Calls from code are silent —
|
|
384
|
+
* the caller knows where it put the window (since v15.1).
|
|
385
|
+
*/
|
|
386
|
+
readonly moved: Observable<{
|
|
387
|
+
readonly x: number;
|
|
388
|
+
readonly y: number;
|
|
389
|
+
}>;
|
|
390
|
+
/**
|
|
391
|
+
* Emits the size the user gave the window: once when an edge drag or a
|
|
392
|
+
* keyboard resize ends, and when a drag snaps it to a half or a quarter.
|
|
393
|
+
* Calls from code are silent (since v15.1).
|
|
394
|
+
*/
|
|
395
|
+
readonly resized: Observable<{
|
|
396
|
+
readonly width: number;
|
|
397
|
+
readonly height: number;
|
|
398
|
+
}>;
|
|
399
|
+
/** Emits every state change, from the user or from code (since v15.1). */
|
|
400
|
+
readonly stateChanges: Observable<WrWindowState>;
|
|
401
|
+
private _beforeCloseHook;
|
|
402
|
+
/**
|
|
403
|
+
* A ref built by hand — a test double for `WR_WINDOW_REF`. It answers every
|
|
404
|
+
* call with a window of its own that nothing renders.
|
|
405
|
+
*/
|
|
406
|
+
constructor(id: string, _overlayRef: OverlayRef);
|
|
407
|
+
/** @internal The manager's form: the window's model, built before anything renders. */
|
|
408
|
+
constructor(id: string, _overlayRef: OverlayRef, model: WrWindowModel);
|
|
409
|
+
/** Resolved instance of the projected component. */
|
|
410
|
+
get componentInstance(): C;
|
|
411
|
+
private isClosed;
|
|
412
|
+
/**
|
|
413
|
+
* Close the window, optionally returning a result. If a `beforeClose`
|
|
414
|
+
* hook is registered it is consulted first — a falsy resolution
|
|
415
|
+
* cancels the close.
|
|
416
|
+
*/
|
|
417
|
+
close(result?: R): Promise<void>;
|
|
418
|
+
/** Toggle the minimized state. Leaving it returns to the state it was minimized from. */
|
|
419
|
+
minimize(): void;
|
|
420
|
+
/** Toggle the maximized state. Restoring down returns to where the window was, a snapped half included. */
|
|
421
|
+
maximize(): void;
|
|
422
|
+
/** Back to `normal` at the window's own geometry — from minimized, maximized or snapped. */
|
|
423
|
+
restore(): void;
|
|
424
|
+
/**
|
|
425
|
+
* Bring this window to the top of the stack. Only RAISES it: focus stays
|
|
426
|
+
* where it is. Use {@link activate} to switch to the window.
|
|
427
|
+
*/
|
|
428
|
+
focus(): void;
|
|
429
|
+
/**
|
|
430
|
+
* Switch to the window: bring it back from the taskbar if it is minimized,
|
|
431
|
+
* raise it, make it the active window, and move focus to the control it had
|
|
432
|
+
* last (its first control when it never had one) (since v15.1).
|
|
433
|
+
*/
|
|
434
|
+
activate(): void;
|
|
435
|
+
/**
|
|
436
|
+
* Move the window to `(x, y)`, held to the work area while `keepInViewport`.
|
|
437
|
+
* While maximized it moves the geometry restore lands on; a snapped window
|
|
438
|
+
* leaves the snap.
|
|
439
|
+
*/
|
|
440
|
+
moveTo(x: number, y: number): void;
|
|
441
|
+
/** Resize the window, held to `minWidth`…`maxWidth` and `minHeight`…`maxHeight`. */
|
|
442
|
+
resizeTo(width: number, height: number): void;
|
|
443
|
+
/** Re-position the window so it sits centered in its work area. */
|
|
444
|
+
center(): void;
|
|
445
|
+
/** Snap to a half or a quarter of the work area; `'top'` maximizes, `null` un-snaps (since v15.1). */
|
|
446
|
+
snapTo(target: WrWindowSnapTarget | null): void;
|
|
447
|
+
/** Update the title-bar text, and with it the window's accessible name. */
|
|
448
|
+
setTitle(title: string): void;
|
|
449
|
+
/**
|
|
450
|
+
* Change options on an open window — lock it while it saves, take its close
|
|
451
|
+
* button away while a task runs. New bounds re-clamp its current size
|
|
452
|
+
* (since v15.1).
|
|
453
|
+
*/
|
|
454
|
+
update(patch: WrWindowUpdate): void;
|
|
455
|
+
/**
|
|
456
|
+
* Move the window from the keyboard: the arrow keys step it, Shift by one
|
|
457
|
+
* pixel, Enter keeps the result and Escape puts it back. Moves focus into the
|
|
458
|
+
* window so the keys arrive. Bind it to a menu item or a button to offer
|
|
459
|
+
* moving without a drag (since v15.1).
|
|
460
|
+
*/
|
|
461
|
+
startMove(): void;
|
|
462
|
+
/** Resize the window from the keyboard, the same way as {@link startMove} (since v15.1). */
|
|
463
|
+
startResize(): void;
|
|
464
|
+
private startKeyboard;
|
|
465
|
+
/**
|
|
466
|
+
* Register a guard that runs before `close()`. Return `false` (or a
|
|
467
|
+
* Promise resolving to false) to veto. Only one hook per ref —
|
|
468
|
+
* subsequent calls replace the previous.
|
|
469
|
+
*/
|
|
470
|
+
beforeClose(hook: WrWindowBeforeCloseHook<R>): void;
|
|
471
|
+
/** Resolves with the result passed to `close()` (or `undefined`). */
|
|
472
|
+
afterClosed(): Promise<R | undefined>;
|
|
473
|
+
/** The same promise as {@link afterClosed}, under the name `WrDialogRef` uses (since v15.1). */
|
|
474
|
+
awaitClose(): Promise<R | undefined>;
|
|
475
|
+
/** Escape hatch — the underlying CDK overlay ref. */
|
|
476
|
+
get overlayRef(): OverlayRef;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* What a `titleExtra` or `statusBar` template receives: the window's own ref
|
|
480
|
+
* as `$implicit`, so `<ng-template let-ref>` can read its title, state or
|
|
481
|
+
* geometry.
|
|
482
|
+
*/
|
|
483
|
+
interface WrWindowSlotContext {
|
|
484
|
+
readonly $implicit: WrWindowRef<unknown, unknown>;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Content for one of the window's own slots: a template, or a component. A
|
|
488
|
+
* component is created with the window's injector, so it can
|
|
489
|
+
* `inject(WR_WINDOW_REF)` and `inject(WR_WINDOW_DATA)` like the body can.
|
|
490
|
+
*/
|
|
491
|
+
type WrWindowSlotContent = TemplateRef<WrWindowSlotContext> | ComponentType<unknown>;
|
|
67
492
|
/**
|
|
68
493
|
* @license
|
|
69
494
|
*
|
|
@@ -72,14 +497,17 @@ type WrWindowSize = 'sm' | 'md' | 'lg';
|
|
|
72
497
|
*/
|
|
73
498
|
/**
|
|
74
499
|
* Edge / corner snap behaviour. Activated by dragging the title bar
|
|
75
|
-
* close to
|
|
500
|
+
* close to an edge of the work area.
|
|
76
501
|
*
|
|
77
502
|
* - `none` — no snapping.
|
|
78
503
|
* - `edges` — left / right / top edges snap to halves; top snaps to maximise.
|
|
79
504
|
* - `all` — adds the four corners → quarter-screen snaps.
|
|
80
505
|
*/
|
|
81
506
|
type WrWindowSnap = 'none' | 'edges' | 'all';
|
|
82
|
-
/**
|
|
507
|
+
/**
|
|
508
|
+
* A region of the work area a window can snap to: a half, a quarter, or `top`,
|
|
509
|
+
* which maximizes. Read it from `WrWindowRef.snap()`, set it with `snapTo()`.
|
|
510
|
+
*/
|
|
83
511
|
type WrWindowSnapTarget = 'left' | 'right' | 'top' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
84
512
|
/** What slice of geometry the storage layer should keep in sync. */
|
|
85
513
|
type WrWindowPersistMode = 'position' | 'size' | 'all';
|
|
@@ -109,25 +537,59 @@ interface WrWindowStorageConfig {
|
|
|
109
537
|
* with the standard chrome at the cascaded position.
|
|
110
538
|
*/
|
|
111
539
|
interface WrWindowConfig<D = unknown> {
|
|
112
|
-
/**
|
|
540
|
+
/**
|
|
541
|
+
* Stable identifier — used by the taskbar, workspace save, and DI. A second
|
|
542
|
+
* `open()` with an id that is already open brings that window back instead of
|
|
543
|
+
* opening another. Generated when omitted.
|
|
544
|
+
*/
|
|
113
545
|
readonly id?: string;
|
|
546
|
+
/**
|
|
547
|
+
* Title-bar text, and the window's accessible name. A window without one is
|
|
548
|
+
* named by the catalog's "Untitled", in the title bar and in the taskbar.
|
|
549
|
+
* @default ''
|
|
550
|
+
*/
|
|
114
551
|
readonly title?: string;
|
|
552
|
+
/** Chrome style: `'auto'` follows the visitor's platform. @default 'auto' */
|
|
115
553
|
readonly os?: WrWindowOs;
|
|
116
|
-
/** Initial size preset. Ignored when `width` / `height` are passed. */
|
|
554
|
+
/** Initial size preset. Ignored when `width` / `height` are passed. @default 'md' */
|
|
117
555
|
readonly size?: WrWindowSize;
|
|
118
556
|
/** Title-bar density. @default 'md' */
|
|
119
557
|
readonly chromeSize?: WrWindowChromeSize;
|
|
558
|
+
/** Opening left edge, in viewport pixels. Omit to cascade from the work area's start edge. */
|
|
120
559
|
readonly x?: number;
|
|
560
|
+
/** Opening top edge, in viewport pixels. Omit to cascade. */
|
|
121
561
|
readonly y?: number;
|
|
562
|
+
/** Opening width in pixels, over the `size` preset. Capped at the work area while `keepInViewport`. */
|
|
122
563
|
readonly width?: number;
|
|
564
|
+
/** Opening height in pixels, over the `size` preset. Capped at the work area while `keepInViewport`. */
|
|
123
565
|
readonly height?: number;
|
|
566
|
+
/** Narrowest the window may be dragged, snapped or opened. @default 220 */
|
|
124
567
|
readonly minWidth?: number;
|
|
568
|
+
/** Shortest the window may be dragged, snapped or opened. @default 140 */
|
|
125
569
|
readonly minHeight?: number;
|
|
570
|
+
/** Widest the window may be dragged, snapped, maximized or opened. @default Infinity */
|
|
126
571
|
readonly maxWidth?: number;
|
|
572
|
+
/** Tallest the window may be dragged, snapped, maximized or opened. @default Infinity */
|
|
127
573
|
readonly maxHeight?: number;
|
|
574
|
+
/** Allow moving the window, by the title bar or from the keyboard. @default true */
|
|
128
575
|
readonly movable?: boolean;
|
|
576
|
+
/** Allow resizing the window, by its edges or from the keyboard. @default true */
|
|
129
577
|
readonly resizable?: boolean;
|
|
578
|
+
/**
|
|
579
|
+
* Keep enough of the window inside the work area to grab it again, and open
|
|
580
|
+
* it wholly inside when it fits. `false` lets it go anywhere. @default true
|
|
581
|
+
*/
|
|
130
582
|
readonly keepInViewport?: boolean;
|
|
583
|
+
/**
|
|
584
|
+
* The rectangle maximize, snapping, `keepInViewport` and the cascade keep the
|
|
585
|
+
* window inside. Falls back to `withWindows({ bounds })`, then the viewport.
|
|
586
|
+
* @default 'viewport'
|
|
587
|
+
*/
|
|
588
|
+
readonly bounds?: WrWindowBounds;
|
|
589
|
+
/**
|
|
590
|
+
* Close on Escape — when focus is inside the window, or when focus is on
|
|
591
|
+
* nothing and this is the active window. @default true
|
|
592
|
+
*/
|
|
131
593
|
readonly closeOnEscape?: boolean;
|
|
132
594
|
/**
|
|
133
595
|
* Move focus into the window when it opens (since v15): to the element
|
|
@@ -146,21 +608,59 @@ interface WrWindowConfig<D = unknown> {
|
|
|
146
608
|
/** Snap-on-drag mode. @default 'none' */
|
|
147
609
|
readonly snap?: WrWindowSnap;
|
|
148
610
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
611
|
+
* Dragging the title bar of a maximized or snapped window restores its own
|
|
612
|
+
* size under the pointer, as desktop window managers do. `false` keeps a
|
|
613
|
+
* maximized window still and moves a snapped one at its snapped size.
|
|
614
|
+
* @default true
|
|
615
|
+
*/
|
|
616
|
+
readonly restoreOnDrag?: boolean;
|
|
617
|
+
/**
|
|
618
|
+
* Keyboard move and resize: Alt+F7 moves the window and Alt+F8 resizes it
|
|
619
|
+
* with the arrow keys, Enter keeps the result and Escape puts it back. The
|
|
620
|
+
* same modes start from `WrWindowRef.startMove()` / `startResize()`.
|
|
621
|
+
* @default true
|
|
622
|
+
*/
|
|
623
|
+
readonly keyboard?: boolean;
|
|
624
|
+
/** Pixels per arrow key in keyboard move and resize; Shift steps 1px. @default 10 */
|
|
625
|
+
readonly keyboardStep?: number;
|
|
626
|
+
/**
|
|
627
|
+
* Show the minimize control. Omit to follow the chrome: every OS but Linux
|
|
628
|
+
* shows it, and the Linux chrome is close-only by convention. Pass `true` to
|
|
629
|
+
* show it there, which is what puts a Linux window within reach of
|
|
630
|
+
* `<wr-window-taskbar>`. A minimized window is hidden until something brings
|
|
631
|
+
* it back, so a page that offers minimize also needs the taskbar or a dock of
|
|
632
|
+
* its own over `WrWindowManager.minimized()`.
|
|
153
633
|
*/
|
|
154
634
|
readonly showMinimize?: boolean;
|
|
155
|
-
/** Show the maximize control. Omit to follow the chrome
|
|
635
|
+
/** Show the maximize control. Omit to follow the chrome: every OS but Linux shows it. */
|
|
156
636
|
readonly showMaximize?: boolean;
|
|
157
|
-
/** Show the close control. Every chrome closes, so this is not per-OS. */
|
|
637
|
+
/** Show the close control. Every chrome closes, so this is not per-OS. @default true */
|
|
158
638
|
readonly showClose?: boolean;
|
|
159
|
-
/**
|
|
639
|
+
/**
|
|
640
|
+
* Content for the title bar, between the title and the buttons — a badge, a
|
|
641
|
+
* menu button. A template receives the ref as `$implicit`.
|
|
642
|
+
*/
|
|
643
|
+
readonly titleExtra?: WrWindowSlotContent;
|
|
644
|
+
/** Content for a status bar under the body. A template receives the ref as `$implicit`. */
|
|
645
|
+
readonly statusBar?: WrWindowSlotContent;
|
|
646
|
+
/** List the window in `<wr-window-taskbar>`. @default true */
|
|
160
647
|
readonly taskbar?: boolean;
|
|
648
|
+
/**
|
|
649
|
+
* The window's own open animation and transitions. Off under
|
|
650
|
+
* `prefers-reduced-motion`; the body's own animations are never touched.
|
|
651
|
+
* @default true
|
|
652
|
+
*/
|
|
161
653
|
readonly animations?: boolean;
|
|
162
|
-
/**
|
|
654
|
+
/**
|
|
655
|
+
* CSS selector for the parts of the window that start a move. Matched in the
|
|
656
|
+
* body as well as the title bar, and replaces the title bar as the grab area —
|
|
657
|
+
* include `.wr-window__chrome` to keep it. A double-click on a match maximizes,
|
|
658
|
+
* as one on the title bar always does. Buttons, fields and links inside a match
|
|
659
|
+
* never start a drag. Give a body handle `touch-action: none` so a touch drag
|
|
660
|
+
* moves the window instead of scrolling the page.
|
|
661
|
+
*/
|
|
163
662
|
readonly dragHandle?: string;
|
|
663
|
+
/** Save the geometry to `WrStorage` as it changes and open there next time. */
|
|
164
664
|
readonly storage?: WrWindowStorageConfig;
|
|
165
665
|
/**
|
|
166
666
|
* Extra CSS classes for the window's overlay pane. The pane is only a mount
|
|
@@ -168,8 +668,17 @@ interface WrWindowConfig<D = unknown> {
|
|
|
168
668
|
* chrome reads `.my-class .wr-window`.
|
|
169
669
|
*/
|
|
170
670
|
readonly panelClass?: WrClassInput;
|
|
671
|
+
/** Payload for the body component, read with `inject(WR_WINDOW_DATA)`. */
|
|
171
672
|
readonly data?: D;
|
|
172
673
|
}
|
|
674
|
+
/** App-wide window defaults, passed to `provideWr(withWindows(...))`. */
|
|
675
|
+
interface WrWindowDefaults {
|
|
676
|
+
/**
|
|
677
|
+
* The work area every window keeps inside, unless its own
|
|
678
|
+
* `WrWindowConfig.bounds` says otherwise. @default 'viewport'
|
|
679
|
+
*/
|
|
680
|
+
readonly bounds?: WrWindowBounds;
|
|
681
|
+
}
|
|
173
682
|
/**
|
|
174
683
|
* @license
|
|
175
684
|
*
|
|
@@ -178,15 +687,15 @@ interface WrWindowConfig<D = unknown> {
|
|
|
178
687
|
*/
|
|
179
688
|
/**
|
|
180
689
|
* Visual state of a `<wr-window>`:
|
|
181
|
-
* - `normal` — free-floating, drag / resize allowed
|
|
182
|
-
* - `minimized` —
|
|
183
|
-
* - `maximized` —
|
|
690
|
+
* - `normal` — free-floating, drag / resize allowed (a snapped window is `normal` too; see `WrWindowRef.snap`)
|
|
691
|
+
* - `minimized` — hidden, and listed in `<wr-window-taskbar>` to come back from
|
|
692
|
+
* - `maximized` — fills the work area, up to `maxWidth` / `maxHeight`, with no resize handles
|
|
184
693
|
*/
|
|
185
694
|
type WrWindowState = 'normal' | 'minimized' | 'maximized';
|
|
186
695
|
/**
|
|
187
696
|
* One window as `WrWindowManager.saveLayout()` recorded it — the geometry the
|
|
188
|
-
* window really had, not the geometry it happens to be showing while maximized
|
|
189
|
-
* or minimized.
|
|
697
|
+
* window really had, not the geometry it happens to be showing while maximized,
|
|
698
|
+
* snapped or minimized.
|
|
190
699
|
*
|
|
191
700
|
* Public because `readLayout()` returns an array of these; a consumer that
|
|
192
701
|
* stores or forwards that result has to be able to name the element type.
|
|
@@ -199,162 +708,67 @@ interface WrWindowLayoutSnapshot {
|
|
|
199
708
|
readonly width: number;
|
|
200
709
|
readonly height: number;
|
|
201
710
|
readonly title: string;
|
|
711
|
+
/** The half or quarter the window was snapped to, if any (since v15.1). */
|
|
712
|
+
readonly snap?: WrWindowSnapTarget | null;
|
|
202
713
|
}
|
|
203
|
-
/** Hook signature for `WrWindowRef.beforeClose()`. Return falsy to veto. */
|
|
204
|
-
type WrWindowBeforeCloseHook<R> = (result: R | undefined) => boolean | Promise<boolean>;
|
|
205
714
|
/**
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* Wraps the underlying overlay, exposes signals for the live geometry,
|
|
209
|
-
* and gives the consumer programmatic control over the window
|
|
210
|
-
* (focus, move, resize, minimize, maximize, close).
|
|
211
|
-
*
|
|
212
|
-
* @example
|
|
213
|
-
* ```ts
|
|
214
|
-
* const ref = manager.open(EditorComponent, {
|
|
215
|
-
* title: 'Untitled.md',
|
|
216
|
-
* storage: { key: 'editor', prefix: 'app' },
|
|
217
|
-
* });
|
|
715
|
+
* @license
|
|
218
716
|
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
|
|
222
|
-
|
|
717
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
718
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
719
|
+
*/
|
|
720
|
+
/**
|
|
721
|
+
* Which windows `<wr-window-taskbar>` lists.
|
|
223
722
|
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
723
|
+
* - `minimized` (default) — only the minimized ones, as a strip of restore tabs.
|
|
724
|
+
* - `all` — every open window, with the active one marked: a tab switches to
|
|
725
|
+
* its window, and the active window's tab minimizes it.
|
|
227
726
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
* that holds the ref and awaits `afterClosed()` after any intervening
|
|
237
|
-
* `await` subscribes to an already-completed stream, and a plain Subject
|
|
238
|
-
* hands it nothing but `complete`: the promise resolved `undefined` and a
|
|
239
|
-
* saved result was indistinguishable from a dismissal.
|
|
240
|
-
*/
|
|
241
|
-
readonly _closed: ReplaySubject<R | undefined>;
|
|
242
|
-
/** @internal — emits whenever the visual state changes. */
|
|
243
|
-
readonly _stateChanged: Subject<WrWindowState>;
|
|
244
|
-
/** @internal — set by the container right after attach. */
|
|
245
|
-
componentRef: ComponentRef<C> | null;
|
|
246
|
-
/** @internal — whether this window opts into the taskbar list. */
|
|
247
|
-
taskbarVisible: boolean;
|
|
248
|
-
/**
|
|
249
|
-
* @internal — non-`normal` state to apply right after the container
|
|
250
|
-
* wires its bridges (so `restoreLayout` can land a window straight
|
|
251
|
-
* into `minimized` / `maximized` even though it just opened).
|
|
252
|
-
*/
|
|
253
|
-
pendingStateOnMount: WrWindowState | null;
|
|
254
|
-
/** @internal */ readonly _state: WritableSignal<WrWindowState>;
|
|
255
|
-
/** @internal */ readonly _x: WritableSignal<number>;
|
|
256
|
-
/** @internal */ readonly _y: WritableSignal<number>;
|
|
257
|
-
/** @internal */ readonly _width: WritableSignal<number>;
|
|
258
|
-
/** @internal */ readonly _height: WritableSignal<number>;
|
|
259
|
-
/** @internal */ readonly _z: WritableSignal<number>;
|
|
260
|
-
/**
|
|
261
|
-
* The geometry the USER chose, as opposed to the one the current state
|
|
262
|
-
* imposes. `_x` and friends mirror the window's EFFECTIVE values — a
|
|
263
|
-
* maximized window reports the viewport, a minimized one reports its
|
|
264
|
-
* collapsed header height — which is right for anything drawing the window
|
|
265
|
-
* and wrong for anything persisting it.
|
|
266
|
-
*
|
|
267
|
-
* @internal
|
|
268
|
-
*/
|
|
269
|
-
readonly _rawX: WritableSignal<number>;
|
|
270
|
-
/** @internal */ readonly _rawY: WritableSignal<number>;
|
|
271
|
-
/** @internal */ readonly _rawWidth: WritableSignal<number>;
|
|
272
|
-
/** @internal */ readonly _rawHeight: WritableSignal<number>;
|
|
273
|
-
/** @internal */ readonly _title: WritableSignal<string>;
|
|
274
|
-
/** Window state. */
|
|
275
|
-
readonly state: Signal<WrWindowState>;
|
|
276
|
-
/** Live X. */
|
|
277
|
-
readonly x: Signal<number>;
|
|
278
|
-
/** Live Y. */
|
|
279
|
-
readonly y: Signal<number>;
|
|
280
|
-
/** Live width. */
|
|
281
|
-
readonly width: Signal<number>;
|
|
282
|
-
/** Live height. */
|
|
283
|
-
readonly height: Signal<number>;
|
|
284
|
-
/** Stack z-index. */
|
|
285
|
-
readonly z: Signal<number>;
|
|
286
|
-
/** Live title. */
|
|
287
|
-
readonly title: Signal<string>;
|
|
288
|
-
private _beforeCloseHook;
|
|
289
|
-
/** @internal */ _doClose: ((result: R | undefined) => void) | null;
|
|
290
|
-
/** @internal */ _doMinimize: (() => void) | null;
|
|
291
|
-
/** @internal */ _doMaximize: (() => void) | null;
|
|
292
|
-
/** @internal */ _doRestore: (() => void) | null;
|
|
293
|
-
/** @internal */ _doFocus: (() => void) | null;
|
|
294
|
-
/** @internal */ _doMoveTo: ((x: number, y: number) => void) | null;
|
|
295
|
-
/** @internal */ _doResizeTo: ((w: number, h: number) => void) | null;
|
|
296
|
-
/** @internal */ _doCenter: (() => void) | null;
|
|
297
|
-
/** @internal */ _doSetTitle: ((title: string) => void) | null;
|
|
298
|
-
/** @internal — move focus into the window after the next render. */
|
|
299
|
-
_doFocusInitial: (() => void) | null;
|
|
300
|
-
/**
|
|
301
|
-
* @internal — what had focus when `open()` was called, and where closing the
|
|
302
|
-
* window sends it back. `null` when focus was on nothing.
|
|
303
|
-
*/
|
|
304
|
-
_returnFocus: HTMLElement | null;
|
|
305
|
-
constructor(id: string, _overlayRef: OverlayRef);
|
|
306
|
-
/** Resolved instance of the projected component. */
|
|
307
|
-
get componentInstance(): C;
|
|
308
|
-
private isClosed;
|
|
309
|
-
/**
|
|
310
|
-
* Close the window, optionally returning a result. If a `beforeClose`
|
|
311
|
-
* hook is registered it is consulted first — a falsy resolution
|
|
312
|
-
* cancels the close.
|
|
313
|
-
*/
|
|
314
|
-
close(result?: R): Promise<void>;
|
|
315
|
-
/** Toggle the minimized state. */
|
|
316
|
-
minimize(): void;
|
|
317
|
-
/** Toggle the maximized state. */
|
|
318
|
-
maximize(): void;
|
|
319
|
-
/** Force-restore from minimized / maximized to `normal`. */
|
|
320
|
-
restore(): void;
|
|
321
|
-
/** Bring this window to the top of the stack. */
|
|
322
|
-
focus(): void;
|
|
323
|
-
moveTo(x: number, y: number): void;
|
|
324
|
-
resizeTo(width: number, height: number): void;
|
|
325
|
-
/** Re-position the window so it sits centered in the current viewport. */
|
|
326
|
-
center(): void;
|
|
327
|
-
setTitle(title: string): void;
|
|
328
|
-
/**
|
|
329
|
-
* Register a guard that runs before `close()`. Return `false` (or a
|
|
330
|
-
* Promise resolving to false) to veto. Only one hook per ref —
|
|
331
|
-
* subsequent calls replace the previous.
|
|
332
|
-
*/
|
|
333
|
-
beforeClose(hook: WrWindowBeforeCloseHook<R>): void;
|
|
334
|
-
/** Resolves with the result passed to `close()` (or `undefined`). */
|
|
335
|
-
afterClosed(): Promise<R | undefined>;
|
|
336
|
-
/** Escape hatch — the underlying CDK overlay ref. */
|
|
337
|
-
get overlayRef(): OverlayRef;
|
|
338
|
-
}
|
|
727
|
+
type WrWindowTaskbarShow = 'minimized' | 'all';
|
|
728
|
+
/**
|
|
729
|
+
* The options `WrWindowRef.update()` can change on an open window. Everything
|
|
730
|
+
* else in `WrWindowConfig` is read once, when the window opens.
|
|
731
|
+
*/
|
|
732
|
+
type WrWindowUpdate = Partial<Pick<WrWindowConfig, 'title' | 'movable' | 'resizable' | 'snap' | 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight' | 'showMinimize' | 'showMaximize' | 'showClose' | 'closeOnEscape'>>;
|
|
733
|
+
/** Hook signature for `WrWindowRef.beforeClose()`. Return falsy to veto. */
|
|
734
|
+
type WrWindowBeforeCloseHook<R> = (result: R | undefined) => boolean | Promise<boolean>;
|
|
339
735
|
/** Resolves to the active `WrWindowRef` inside a programmatically-opened window's content tree. */
|
|
340
736
|
export declare const WR_WINDOW_REF: InjectionToken<WrWindowRef<unknown, unknown>>;
|
|
341
737
|
/** Resolves to the `data` passed in `WrWindowConfig.data`. */
|
|
342
738
|
export declare const WR_WINDOW_DATA: InjectionToken<unknown>;
|
|
739
|
+
type AnyRef$1 = WrWindowRef<unknown, unknown>;
|
|
343
740
|
/**
|
|
344
741
|
* What `WrWindowManager` needs from a `<wr-window-taskbar>` on the page: the
|
|
345
742
|
* row a window's tab sits in, so focus can land on it when the window is
|
|
346
|
-
* minimized and be recognised there when the window is closed from it
|
|
743
|
+
* minimized and be recognised there when the window is closed from it, and
|
|
744
|
+
* the strip it covers, so maximized windows stop short of it.
|
|
347
745
|
*
|
|
348
746
|
* @internal
|
|
349
747
|
*/
|
|
350
748
|
interface WrWindowTaskbarTabs {
|
|
351
|
-
/**
|
|
352
|
-
|
|
749
|
+
/**
|
|
750
|
+
* The `.wr-window-taskbar__tab` row for `ref`, the "+N" button when its tab is
|
|
751
|
+
* folded under one, or `null` when this taskbar does not list it.
|
|
752
|
+
*/
|
|
753
|
+
tabFor(ref: AnyRef$1): HTMLElement | null;
|
|
754
|
+
/**
|
|
755
|
+
* Whether `ref`'s place in the rail is still moving: its tab has not been
|
|
756
|
+
* measured yet, or the render that folds or unfolds it has not happened. Focus
|
|
757
|
+
* waits for it rather than landing on a tab about to hide or a "+N" not drawn.
|
|
758
|
+
*/
|
|
759
|
+
settling(ref: AnyRef$1): boolean;
|
|
760
|
+
/** Whether `node` is inside this taskbar. */
|
|
761
|
+
contains(node: Node): boolean;
|
|
762
|
+
/** The strip of the viewport this taskbar covers while it shows tabs, in px from each edge. */
|
|
763
|
+
readonly reserve: Signal<{
|
|
764
|
+
readonly top: number;
|
|
765
|
+
readonly bottom: number;
|
|
766
|
+
}>;
|
|
353
767
|
}
|
|
354
768
|
/**
|
|
355
|
-
* Owns the open
|
|
356
|
-
* default spawn position, and opens
|
|
357
|
-
*
|
|
769
|
+
* Owns the open window stack, hands out z-indexes, tracks the active window,
|
|
770
|
+
* cascades the default spawn position, and opens windows that wrap a consumer
|
|
771
|
+
* component.
|
|
358
772
|
*
|
|
359
773
|
* Inject the singleton and call `open(component, config)` for a
|
|
360
774
|
* dialog-style flow:
|
|
@@ -371,37 +785,65 @@ interface WrWindowTaskbarTabs {
|
|
|
371
785
|
* const saved = await ref.afterClosed();
|
|
372
786
|
* ```
|
|
373
787
|
*
|
|
374
|
-
*
|
|
375
|
-
*
|
|
788
|
+
* There is no declarative `<wr-window>`: `open()` is the only way in, so every
|
|
789
|
+
* window shares this one stack.
|
|
376
790
|
*/
|
|
377
|
-
export declare class WrWindowManager {
|
|
791
|
+
export declare class WrWindowManager implements WrWindowRefHost {
|
|
378
792
|
private readonly overlay;
|
|
379
793
|
private readonly parentInjector;
|
|
380
794
|
private readonly storage;
|
|
381
795
|
private readonly isBrowser;
|
|
382
796
|
private readonly dir;
|
|
797
|
+
private readonly defaults;
|
|
798
|
+
private readonly destroyRef;
|
|
383
799
|
private readonly baseZ;
|
|
384
800
|
private topZ;
|
|
385
801
|
private openCount;
|
|
386
|
-
/** All open windows
|
|
802
|
+
/** All open windows, in the order they opened. */
|
|
387
803
|
private readonly _windows;
|
|
804
|
+
/** The window that has the keyboard, or `null`. */
|
|
805
|
+
private readonly _active;
|
|
388
806
|
/**
|
|
389
807
|
* Filled by `restoreLayout` right before it invokes the consumer's
|
|
390
808
|
* opener callback. The next `open()` call with a matching `config.id`
|
|
391
|
-
* pops the entry and uses it as the initial geometry
|
|
392
|
-
* lands at the saved coords instead of the cascade default) and
|
|
393
|
-
* applies any non-`normal` state after the bridges are wired.
|
|
809
|
+
* pops the entry and uses it as the initial geometry and state.
|
|
394
810
|
*/
|
|
395
811
|
private readonly pendingRestores;
|
|
396
812
|
/** The taskbars on the page, registered by each `<wr-window-taskbar>` for its lifetime. */
|
|
397
813
|
private readonly taskbars;
|
|
398
|
-
/**
|
|
814
|
+
/**
|
|
815
|
+
* ONE viewport for every window, kept by one `resize` listener. Each window
|
|
816
|
+
* used to add its own — twenty listeners for twenty windows, each writing its
|
|
817
|
+
* own copy of the same two numbers.
|
|
818
|
+
*/
|
|
819
|
+
private readonly viewport;
|
|
820
|
+
/** Bumped when an element used as `bounds` may have moved: it resized, or something scrolled. */
|
|
821
|
+
private readonly layoutTick;
|
|
822
|
+
private listening;
|
|
823
|
+
private boundsObserver;
|
|
824
|
+
private readonly boundElements;
|
|
825
|
+
private readonly bumpLayout;
|
|
826
|
+
/** The strip the taskbars cover, edge by edge. */
|
|
827
|
+
private readonly reserve;
|
|
828
|
+
/** All currently-open windows, in the order they opened. */
|
|
399
829
|
readonly windows: Signal<readonly WrWindowRef<unknown, unknown>[]>;
|
|
400
|
-
/**
|
|
830
|
+
/**
|
|
831
|
+
* The active window — the one that has the keyboard: the last one focused,
|
|
832
|
+
* clicked, opened with focus or switched to (since v15.1). `null` once focus
|
|
833
|
+
* moves to something on the page outside every window, and while the active
|
|
834
|
+
* window is minimized.
|
|
835
|
+
*/
|
|
836
|
+
readonly active: Signal<WrWindowRef<unknown, unknown> | null>;
|
|
837
|
+
/** Windows that are minimized AND opted into the taskbar. */
|
|
401
838
|
readonly minimized: Signal<WrWindowRef<unknown, unknown>[]>;
|
|
402
839
|
/** Reserve the next z-index. Strictly increasing across the app's lifetime. */
|
|
403
840
|
bringToFront(): number;
|
|
404
|
-
/**
|
|
841
|
+
/**
|
|
842
|
+
* Cascade offset for new windows, so two opens don't perfectly overlap: 30px
|
|
843
|
+
* a step from the work area's start edge, back to the start after ten, and
|
|
844
|
+
* each lap of ten shifted 15px along so window eleven does not land exactly
|
|
845
|
+
* on window one.
|
|
846
|
+
*/
|
|
405
847
|
nextStartOffset(): {
|
|
406
848
|
readonly x: number;
|
|
407
849
|
readonly y: number;
|
|
@@ -412,31 +854,62 @@ export declare class WrWindowManager {
|
|
|
412
854
|
* its result.
|
|
413
855
|
*
|
|
414
856
|
* **Singleton by id** — if `config.id` is set and a window with that
|
|
415
|
-
* id is already open,
|
|
416
|
-
*
|
|
857
|
+
* id is already open, that window is switched to (back from the taskbar,
|
|
858
|
+
* raised, focused) and its ref returned. No duplicate window is
|
|
417
859
|
* created. Use this to coalesce repeated open() calls (e.g. a
|
|
418
860
|
* "Settings" menu item that should always re-focus the same window).
|
|
419
861
|
*/
|
|
420
862
|
open<C, R = unknown, D = unknown>(component: ComponentType<C>, config?: WrWindowConfig<D>): WrWindowRef<C, R>;
|
|
863
|
+
/**
|
|
864
|
+
* Switch to `ref`: back from the taskbar, raised, active, and — unless told
|
|
865
|
+
* otherwise — focused on the control it had last.
|
|
866
|
+
*
|
|
867
|
+
* @internal
|
|
868
|
+
*/
|
|
869
|
+
_activate(ref: AnyRef$1, options?: {
|
|
870
|
+
readonly focus?: boolean;
|
|
871
|
+
}): void;
|
|
872
|
+
/**
|
|
873
|
+
* Put `ref` on top of the stack. A window already on top keeps its z: every
|
|
874
|
+
* click in a window used to take a new one, so the number climbed with each
|
|
875
|
+
* press and every press re-wrote the host's style.
|
|
876
|
+
*
|
|
877
|
+
* @internal
|
|
878
|
+
*/
|
|
879
|
+
_raise(ref: AnyRef$1): void;
|
|
880
|
+
private setActive;
|
|
881
|
+
/**
|
|
882
|
+
* Focus decides the active window wherever it comes from: Tab into a window,
|
|
883
|
+
* a click on a field in it, a script calling `focus()`. A window that gains
|
|
884
|
+
* focus is raised too — a focused window hidden behind another is a window
|
|
885
|
+
* the user is typing into blind. Focus on a taskbar, or in another overlay,
|
|
886
|
+
* leaves the active window as it was; focus anywhere else on the page means
|
|
887
|
+
* none is.
|
|
888
|
+
*/
|
|
889
|
+
private readonly onFocusIn;
|
|
890
|
+
/** Install the shared listeners, once, on the first open in a browser. */
|
|
891
|
+
private listen;
|
|
892
|
+
private boundsElement;
|
|
893
|
+
/**
|
|
894
|
+
* The work area for one window: its bounds, cut to the viewport, minus the
|
|
895
|
+
* strip a taskbar covers.
|
|
896
|
+
*/
|
|
897
|
+
private workAreaFor;
|
|
898
|
+
/** Keep an element used as `bounds` measured while a window uses it. Returns the release. */
|
|
899
|
+
private observeBounds;
|
|
421
900
|
/**
|
|
422
901
|
* Whether a keyboard event routed to `ref`'s overlay is actually meant for it.
|
|
423
902
|
*
|
|
424
|
-
* The window holding real DOM focus owns the key. When focus is
|
|
425
|
-
*
|
|
426
|
-
* the
|
|
427
|
-
*
|
|
428
|
-
*
|
|
429
|
-
*
|
|
903
|
+
* The window holding real DOM focus owns the key. When focus is on NOTHING —
|
|
904
|
+
* `<body>`, which is where a click on a window's own text used to leave it —
|
|
905
|
+
* the active window owns it if it is on screen, else the front-most window on
|
|
906
|
+
* screen. When focus is anywhere else on the page, no window owns it: an
|
|
907
|
+
* Escape pressed in the page's own search field closed a window the reader
|
|
908
|
+
* was not in. That is the rule the non-modal drawer has always followed.
|
|
430
909
|
*
|
|
431
910
|
* A MINIMIZED window never owns a key it did not receive through focus, and
|
|
432
|
-
* never counts as being in front: it is `display: none
|
|
433
|
-
* on the page
|
|
434
|
-
* taskbar entry with it — while the visible one stayed put.
|
|
435
|
-
*
|
|
436
|
-
* Focus on a taskbar tab is the minimized window's (as `holdsFocus` reads
|
|
437
|
-
* it), so NO window owns that key: a tab lists only minimized windows, and
|
|
438
|
-
* handing the key to the front-most one closed a window the reader was not
|
|
439
|
-
* in, right after minimizing had put them on the tab.
|
|
911
|
+
* never counts as being in front: it is `display: none`. Focus on a taskbar
|
|
912
|
+
* tab is on the page, so no window owns that key either.
|
|
440
913
|
*/
|
|
441
914
|
private ownsKeyboard;
|
|
442
915
|
/**
|
|
@@ -454,12 +927,41 @@ export declare class WrWindowManager {
|
|
|
454
927
|
*
|
|
455
928
|
* @internal
|
|
456
929
|
*/
|
|
457
|
-
_focusAfterMinimize(ref:
|
|
930
|
+
_focusAfterMinimize(ref: AnyRef$1, attempt?: number): void;
|
|
458
931
|
private taskbarTab;
|
|
459
932
|
/** The focused element, or `null` when that is `<body>` or nothing. */
|
|
460
933
|
private focusedElement;
|
|
461
934
|
/** Whether focus is `ref`'s to hand back: inside it, on its taskbar tab, or nowhere. */
|
|
462
935
|
private holdsFocus;
|
|
936
|
+
/** Windows on screen — not minimized. */
|
|
937
|
+
private onScreen;
|
|
938
|
+
/**
|
|
939
|
+
* Restore every window on screen and stack them down from the start edge of
|
|
940
|
+
* their work area, 30px apart, keeping each one's size and their order front
|
|
941
|
+
* to back (since v15.1).
|
|
942
|
+
*/
|
|
943
|
+
cascade(): void;
|
|
944
|
+
/**
|
|
945
|
+
* Restore every window on screen and share the work area between them, in
|
|
946
|
+
* the order they opened: a grid (the default), side by side in columns, or
|
|
947
|
+
* stacked in rows. A row of a grid with fewer windows spreads them across its
|
|
948
|
+
* whole width. In a right-to-left page the first window takes the right
|
|
949
|
+
* (since v15.1).
|
|
950
|
+
*/
|
|
951
|
+
tile(mode?: 'grid' | 'columns' | 'rows'): void;
|
|
952
|
+
/** Minimize every window on screen (since v15.1). */
|
|
953
|
+
minimizeAll(): void;
|
|
954
|
+
/** Bring every minimized window back, each to the state it was minimized from (since v15.1). */
|
|
955
|
+
restoreAll(): void;
|
|
956
|
+
/**
|
|
957
|
+
* Switch to the next window, in the order they opened, wrapping at the end —
|
|
958
|
+
* minimized windows included, which come back. Bind it to a hotkey from
|
|
959
|
+
* `ngwr/hotkey`, such as Ctrl+F6 (since v15.1).
|
|
960
|
+
*/
|
|
961
|
+
activateNext(): void;
|
|
962
|
+
/** Switch to the previous window, the other way round from {@link activateNext} (since v15.1). */
|
|
963
|
+
activatePrevious(): void;
|
|
964
|
+
private cycle;
|
|
463
965
|
/** Close every programmatically-opened window. */
|
|
464
966
|
closeAll(): void;
|
|
465
967
|
/** Look up an open window by its `config.id`. Returns `null` when no match. */
|
|
@@ -486,8 +988,9 @@ export declare class WrWindowManager {
|
|
|
486
988
|
* matches, the geometry / state / title is re-applied immediately.
|
|
487
989
|
* For misses, the optional `open` callback is invoked so the consumer
|
|
488
990
|
* can re-open the right component for that id — the freshly-opened
|
|
489
|
-
* window
|
|
490
|
-
*
|
|
991
|
+
* window opens straight at the saved geometry and in the saved state, with
|
|
992
|
+
* no cascade flicker — fitted into the work area when this viewport is
|
|
993
|
+
* smaller than the one the layout was saved on.
|
|
491
994
|
*
|
|
492
995
|
* ```ts
|
|
493
996
|
* manager.restoreLayout('default', (id, snap) => {
|
|
@@ -506,45 +1009,137 @@ export declare class WrWindowManager {
|
|
|
506
1009
|
static ɵfac: i0.ɵɵFactoryDeclaration<WrWindowManager, never>;
|
|
507
1010
|
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
508
1011
|
}
|
|
1012
|
+
type AnyRef = WrWindowRef<unknown, unknown>;
|
|
509
1013
|
/**
|
|
510
1014
|
* OS-style window taskbar. Drop one anywhere in the app — typically
|
|
511
|
-
* fixed to the bottom of the viewport — and it lists
|
|
512
|
-
* `WrWindowManager.open()` has handed out
|
|
513
|
-
* `
|
|
514
|
-
*
|
|
1015
|
+
* fixed to the bottom of the viewport — and it lists the windows
|
|
1016
|
+
* `WrWindowManager.open()` has handed out: the minimized ones by default,
|
|
1017
|
+
* every open one with `show="all"`. Clicking a tab switches to its window;
|
|
1018
|
+
* with `show="all"`, clicking the active window's tab minimizes it. The close
|
|
1019
|
+
* glyph dismisses a window without restoring it.
|
|
1020
|
+
*
|
|
1021
|
+
* The rail is one Tab stop, a toolbar: the arrow keys move between its
|
|
1022
|
+
* buttons, Home and End jump to the ends.
|
|
515
1023
|
*
|
|
516
1024
|
* Focus follows the window in and out of the rail: minimizing a window
|
|
517
1025
|
* that holds focus puts focus on its tab here, and restoring it from the
|
|
518
1026
|
* tab moves focus into the window.
|
|
519
1027
|
*
|
|
1028
|
+
* While it shows tabs, the rail reserves its strip of the viewport, so a
|
|
1029
|
+
* maximized or snapped window stops short of it.
|
|
1030
|
+
*
|
|
1031
|
+
* The rail stays one row. A tab is as wide as its title, up to
|
|
1032
|
+
* `--wr-window-taskbar-tab-max-width`, and the tabs that do not fit — or every
|
|
1033
|
+
* one past `maxTabs` — fold under a "+N" button at the end, which opens them as
|
|
1034
|
+
* a menu. In `show="all"` the active window's tab is never folded.
|
|
1035
|
+
*
|
|
520
1036
|
* Windows opted out via `config.taskbar = false` never show up here.
|
|
521
1037
|
*
|
|
522
1038
|
* @example
|
|
523
1039
|
* ```html
|
|
524
1040
|
* <wr-window-taskbar />
|
|
525
1041
|
* <wr-window-taskbar position="top" />
|
|
1042
|
+
* <wr-window-taskbar show="all" />
|
|
1043
|
+
* <wr-window-taskbar show="all" [maxTabs]="6" />
|
|
526
1044
|
* ```
|
|
527
1045
|
*
|
|
528
1046
|
* @see https://ngwr.dev/reference/components/window
|
|
529
1047
|
*/
|
|
530
1048
|
export declare class WrWindowTaskbar {
|
|
531
|
-
|
|
1049
|
+
private readonly minimizedLabel;
|
|
1050
|
+
private readonly allLabel;
|
|
532
1051
|
/** @internal */ protected readonly closeLabel: import("@angular/core").Signal<string>;
|
|
533
1052
|
/** @internal */ protected readonly untitled: import("@angular/core").Signal<string>;
|
|
534
1053
|
/** @internal */ protected readonly restoreLabel: (params?: import("ngwr/i18n").WrI18nParams) => string;
|
|
1054
|
+
/** @internal */ protected readonly moreLabel: (params?: import("ngwr/i18n").WrI18nParams) => string;
|
|
535
1055
|
/** Edge the taskbar pins itself to. @default 'bottom' */
|
|
536
1056
|
readonly position: import("@angular/core").InputSignal<"top" | "bottom">;
|
|
1057
|
+
/**
|
|
1058
|
+
* Which windows the rail lists: the minimized ones, or every open one with
|
|
1059
|
+
* the active window marked (since v15.1). @default 'minimized'
|
|
1060
|
+
*/
|
|
1061
|
+
readonly show: import("@angular/core").InputSignal<WrWindowTaskbarShow>;
|
|
1062
|
+
/**
|
|
1063
|
+
* The most tabs the rail shows; the rest fold under a "+N" button that opens
|
|
1064
|
+
* them as a menu (since v15.1). The width folds tabs too, whatever this says:
|
|
1065
|
+
* the tabs that do not fit beside the button at their own width go under it.
|
|
1066
|
+
* `null` leaves it to the width alone.
|
|
1067
|
+
* @default null
|
|
1068
|
+
*/
|
|
1069
|
+
readonly maxTabs: import("@angular/core").InputSignalWithTransform<number | null, unknown>;
|
|
537
1070
|
private readonly manager;
|
|
538
|
-
|
|
1071
|
+
private readonly host;
|
|
1072
|
+
private readonly dir;
|
|
1073
|
+
/** @internal */ protected readonly railLabel: import("@angular/core").Signal<string>;
|
|
1074
|
+
/** @internal — the windows the rail lists, in the order they opened. */
|
|
539
1075
|
protected readonly items: import("@angular/core").Signal<WrWindowRef<unknown, unknown>[]>;
|
|
1076
|
+
/** What the rail has to fit its tabs into — see {@link Room}. */
|
|
1077
|
+
private readonly room;
|
|
1078
|
+
/**
|
|
1079
|
+
* The tabs the rail draws, in opening order: all of them while they fit and
|
|
1080
|
+
* `maxTabs` allows it, otherwise the most that fit beside the "+N" button,
|
|
1081
|
+
* never more than `maxTabs` and never fewer than one. The active window's tab
|
|
1082
|
+
* takes the last place when it would otherwise fold, so the one tab
|
|
1083
|
+
* `show="all"` marks is always in reach. A tab not measured yet counts as
|
|
1084
|
+
* nothing, and the pass after its first render corrects that.
|
|
1085
|
+
*/
|
|
1086
|
+
protected readonly visible: import("@angular/core").Signal<WrWindowRef<unknown, unknown>[]>;
|
|
1087
|
+
/** @internal — each listed window's place among the drawn tabs, absent while it is folded. */
|
|
1088
|
+
protected readonly slots: import("@angular/core").Signal<Map<WrWindowRef<unknown, unknown>, number>>;
|
|
1089
|
+
/** @internal — the windows under the "+N" button, in opening order. */
|
|
1090
|
+
protected readonly folded: import("@angular/core").Signal<WrWindowRef<unknown, unknown>[]>;
|
|
1091
|
+
/** The "+N" menu opens away from the edge the rail is pinned to. */
|
|
1092
|
+
protected readonly menuPosition: import("@angular/core").Signal<"top-end" | "bottom-end">;
|
|
540
1093
|
protected readonly classes: import("@angular/core").Signal<string>;
|
|
541
|
-
/**
|
|
1094
|
+
/**
|
|
1095
|
+
* One row per entry of `items()`, in the same order. A folded window keeps its
|
|
1096
|
+
* tab, laid out but hidden, which is how the rail knows its width.
|
|
1097
|
+
*/
|
|
542
1098
|
private readonly tabs;
|
|
1099
|
+
private readonly more;
|
|
1100
|
+
/**
|
|
1101
|
+
* The rail's one Tab stop, as an index into its buttons: two per drawn tab,
|
|
1102
|
+
* restore then close, and the "+N" button last.
|
|
1103
|
+
*/
|
|
1104
|
+
private readonly rovingIndex;
|
|
1105
|
+
private readonly stop;
|
|
1106
|
+
/** The strip of the viewport the rail covers while it shows tabs. */
|
|
1107
|
+
private readonly reserve;
|
|
543
1108
|
constructor();
|
|
544
1109
|
/** A window with no title still needs a name in the rail. */
|
|
545
|
-
protected tabTitle(ref:
|
|
546
|
-
|
|
547
|
-
protected
|
|
1110
|
+
protected tabTitle(ref: AnyRef): string;
|
|
1111
|
+
/** Whether `ref` is the active window and on screen — what `show="all"` marks. */
|
|
1112
|
+
protected isCurrent(ref: AnyRef): boolean;
|
|
1113
|
+
/** A minimized window's tab restores it; in `show="all"` the others' tabs switch to their window. */
|
|
1114
|
+
protected tabLabel(ref: AnyRef): string;
|
|
1115
|
+
protected tabIndex(button: number): number;
|
|
1116
|
+
protected press(ref: AnyRef): void;
|
|
1117
|
+
/** A window picked from the "+N" menu: the menu closes and the window comes forward, as from its tab. */
|
|
1118
|
+
protected pick(ref: AnyRef, menu: WrDropdown): void;
|
|
1119
|
+
protected close(ref: AnyRef, event: Event): void;
|
|
1120
|
+
/** The toolbar pattern: arrows between buttons, Home and End to the ends, mirrored in RTL. */
|
|
1121
|
+
protected onKeydown(event: KeyboardEvent): void;
|
|
1122
|
+
/** A click or a script that focuses a button moves the Tab stop with it. */
|
|
1123
|
+
protected onFocusIn(event: FocusEvent): void;
|
|
1124
|
+
/** The drawn buttons in order — a folded tab's are hidden and out of the toolbar. */
|
|
1125
|
+
private buttons;
|
|
1126
|
+
private measure;
|
|
1127
|
+
/**
|
|
1128
|
+
* Read what the rail has to fit into. The host spans the viewport between its
|
|
1129
|
+
* insets, so its width is the most the rail can take, and the gap comes from
|
|
1130
|
+
* the stylesheet, so a consumer's hook is what the arithmetic uses.
|
|
1131
|
+
*
|
|
1132
|
+
* A tab's width is the one its title asks for, capped by its `max-width`. Every
|
|
1133
|
+
* tab is laid out, a folded one too, so each can be read — and a tab drawn
|
|
1134
|
+
* narrower than its title, squeezed as the only one left, is as wide as it is
|
|
1135
|
+
* plus the part of the title it clips. That keeps the reading the same however
|
|
1136
|
+
* the row is drawn, so a pass never feeds the next one a different answer.
|
|
1137
|
+
*
|
|
1138
|
+
* The "+N" button is measured once it is drawn — until then a tab's height
|
|
1139
|
+
* stands in for its width, and the next pass corrects it. That converges: a
|
|
1140
|
+
* wider button folds more, which can only keep its count's digits or add one.
|
|
1141
|
+
*/
|
|
1142
|
+
private measureRoom;
|
|
548
1143
|
static ɵfac: i0.ɵɵFactoryDeclaration<WrWindowTaskbar, never>;
|
|
549
1144
|
static ɵcmp: i0.ɵɵComponentDeclaration<WrWindowTaskbar, "wr-window-taskbar", never, {
|
|
550
1145
|
"position": {
|
|
@@ -552,6 +1147,35 @@ export declare class WrWindowTaskbar {
|
|
|
552
1147
|
"required": false;
|
|
553
1148
|
"isSignal": true;
|
|
554
1149
|
};
|
|
1150
|
+
"show": {
|
|
1151
|
+
"alias": "show";
|
|
1152
|
+
"required": false;
|
|
1153
|
+
"isSignal": true;
|
|
1154
|
+
};
|
|
1155
|
+
"maxTabs": {
|
|
1156
|
+
"alias": "maxTabs";
|
|
1157
|
+
"required": false;
|
|
1158
|
+
"isSignal": true;
|
|
1159
|
+
};
|
|
555
1160
|
}, {}, never, never, true, never>;
|
|
556
1161
|
}
|
|
557
|
-
|
|
1162
|
+
/**
|
|
1163
|
+
* App-wide window defaults, as a feature of `provideWr()` — today the work area
|
|
1164
|
+
* every window keeps inside, so maximized windows stop short of an app header.
|
|
1165
|
+
* A window's own `WrWindowConfig.bounds` still wins.
|
|
1166
|
+
*
|
|
1167
|
+
* Bootstrap only: `WrWindowManager` is root-provided and reads it once, from
|
|
1168
|
+
* the root injector, so in a route's `providers` it changes nothing.
|
|
1169
|
+
*
|
|
1170
|
+
* @example
|
|
1171
|
+
* ```ts
|
|
1172
|
+
* import { provideWr } from 'ngwr';
|
|
1173
|
+
* import { withWindows } from 'ngwr/window';
|
|
1174
|
+
*
|
|
1175
|
+
* bootstrapApplication(App, {
|
|
1176
|
+
* providers: [provideWr(withWindows({ bounds: { top: 64 } }))],
|
|
1177
|
+
* });
|
|
1178
|
+
* ```
|
|
1179
|
+
*/
|
|
1180
|
+
export declare function withWindows(defaults: WrWindowDefaults): WrFeature<'windows'>;
|
|
1181
|
+
export type { WrWindowBeforeCloseHook, WrWindowBounds, WrWindowChromeSize, WrWindowConfig, WrWindowDefaults, WrWindowInsets, WrWindowLayoutSnapshot, WrWindowOs, WrWindowPersistMode, WrWindowSize, WrWindowSlotContent, WrWindowSlotContext, WrWindowSnap, WrWindowSnapTarget, WrWindowState, WrWindowStorageConfig, WrWindowTaskbarShow, WrWindowUpdate };
|