ngwr 14.7.0 → 14.9.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/README.md +66 -332
- package/alert/styles/_index.scss +10 -0
- package/avatar/styles/_index.scss +18 -7
- package/badge/styles/_index.scss +7 -0
- package/badge/styles/_tag.scss +7 -1
- package/bar-chart/styles/_index.scss +1 -0
- package/button/styles/_index.scss +6 -0
- package/calendar-heatmap/styles/_index.scss +1 -0
- package/cascader/styles/_rules.scss +87 -15
- package/checkbox/styles/_index.scss +4 -0
- package/command-palette/styles/_index.scss +1 -1
- package/date-picker/styles/_index.scss +30 -0
- package/density/styles/_index.scss +4 -2
- package/divider/styles/_index.scss +2 -0
- package/donut-chart/styles/_index.scss +10 -0
- package/dropdown/styles/_index.scss +67 -5
- package/editor/styles/_index.scss +441 -0
- package/event-calendar/styles/_index.scss +209 -35
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -1
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs.map +1 -1
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs.map +1 -1
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs.map +1 -1
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs.map +1 -1
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs.map +1 -1
- package/fesm2022/ngwr-badge.mjs +28 -13
- package/fesm2022/ngwr-badge.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +31 -6
- package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow.mjs +3 -3
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-burger.mjs.map +1 -1
- package/fesm2022/ngwr-button-testing.mjs.map +1 -1
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +61 -6
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +3 -3
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +9 -9
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +4 -4
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +18 -8
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +3 -3
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-click-spark.mjs +3 -3
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-clipboard.mjs.map +1 -1
- package/fesm2022/ngwr-collapse-testing.mjs.map +1 -1
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-collapse.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +6 -6
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +3 -3
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-compare.mjs.map +1 -1
- package/fesm2022/ngwr-confetti.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs.map +1 -1
- package/fesm2022/ngwr-config.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +12 -12
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-cookie.mjs.map +1 -1
- package/fesm2022/ngwr-counter.mjs +6 -6
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +721 -62
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-date.mjs +3 -3
- package/fesm2022/ngwr-date.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-density.mjs.map +1 -1
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs.map +1 -1
- package/fesm2022/ngwr-dialog-testing.mjs.map +1 -1
- package/fesm2022/ngwr-dialog.mjs +15 -15
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-directives.mjs.map +1 -1
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-divider.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart.mjs +48 -6
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +6 -6
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +18 -18
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +174 -25
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-editor-testing.mjs +568 -0
- package/fesm2022/ngwr-editor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-editor.mjs +2601 -0
- package/fesm2022/ngwr-editor.mjs.map +1 -0
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-empty.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar.mjs +14 -7
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text.mjs +3 -3
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-file-upload.mjs.map +1 -1
- package/fesm2022/ngwr-form-testing.mjs.map +1 -1
- package/fesm2022/ngwr-form.mjs +61 -10
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +35 -6
- package/fesm2022/ngwr-gauge.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +3 -3
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text.mjs +3 -3
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-graph-testing.mjs.map +1 -1
- package/fesm2022/ngwr-graph.mjs +6 -6
- package/fesm2022/ngwr-graph.mjs.map +1 -1
- package/fesm2022/ngwr-hotkey.mjs +6 -6
- package/fesm2022/ngwr-hotkey.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ar.mjs +31 -0
- package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-cs.mjs +31 -0
- package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-de.mjs +31 -0
- package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +39 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-es.mjs +31 -0
- package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-fr.mjs +31 -0
- package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-he.mjs +31 -0
- package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-hi.mjs +31 -0
- package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-id.mjs +31 -0
- package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-it.mjs +31 -0
- package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ja.mjs +31 -0
- package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ko.mjs +31 -0
- package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-nl.mjs +31 -0
- package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pl.mjs +31 -0
- package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pt.mjs +31 -0
- package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +31 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-sv.mjs +31 -0
- package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-tr.mjs +31 -0
- package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-uk.mjs +31 -0
- package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-vi.mjs +31 -0
- package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh-TW.mjs +31 -0
- package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh.mjs +31 -0
- package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
- package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-icon.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +15 -3
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +3 -3
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-keyboard.mjs.map +1 -1
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-layout.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox.mjs +3 -3
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +18 -7
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +6 -6
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +6 -6
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-markdown-testing.mjs.map +1 -1
- package/fesm2022/ngwr-markdown.mjs +798 -17
- package/fesm2022/ngwr-markdown.mjs.map +1 -1
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -1
- package/fesm2022/ngwr-marquee.mjs +3 -3
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-media.mjs.map +1 -1
- package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
- package/fesm2022/ngwr-mention.mjs +6 -6
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meta.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group-testing.mjs +7 -3
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +26 -6
- package/fesm2022/ngwr-meter-group.mjs.map +1 -1
- package/fesm2022/ngwr-overlay.mjs +6 -6
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +13 -5
- package/fesm2022/ngwr-page-header.mjs.map +1 -1
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-pipes.mjs.map +1 -1
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-platform.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +578 -16
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-progress.mjs.map +1 -1
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
- package/fesm2022/ngwr-qr.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio-testing.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-radio.mjs.map +1 -1
- package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-schema-form.mjs +3 -3
- package/fesm2022/ngwr-schema-form.mjs.map +1 -1
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select-testing.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +12 -12
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +6 -6
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +10 -3
- package/fesm2022/ngwr-sidebar.mjs.map +1 -1
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs.map +1 -1
- package/fesm2022/ngwr-slider-testing.mjs.map +1 -1
- package/fesm2022/ngwr-slider.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +84 -10
- package/fesm2022/ngwr-sparkline.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-split-text.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card.mjs +6 -6
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-squircle.mjs.map +1 -1
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +3 -3
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-stepper.mjs.map +1 -1
- package/fesm2022/ngwr-storage.mjs +3 -3
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch-testing.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-switch.mjs.map +1 -1
- package/fesm2022/ngwr-table-testing.mjs.map +1 -1
- package/fesm2022/ngwr-table.mjs +18 -18
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-router.mjs +3 -3
- package/fesm2022/ngwr-tabs-router.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +6 -6
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea-testing.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card.mjs +6 -6
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-timeline.mjs.map +1 -1
- package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
- package/fesm2022/ngwr-toast.mjs +9 -9
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +10 -3
- package/fesm2022/ngwr-toolbar.mjs.map +1 -1
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tour.mjs +6 -6
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer-testing.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-transfer.mjs.map +1 -1
- package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter.mjs +3 -3
- package/fesm2022/ngwr-typewriter.mjs.map +1 -1
- package/fesm2022/ngwr-typography.mjs +7 -3
- package/fesm2022/ngwr-typography.mjs.map +1 -1
- package/fesm2022/ngwr-utils.mjs.map +1 -1
- package/fesm2022/ngwr-validators.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-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -1
- package/fesm2022/ngwr-waves.mjs +3 -3
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window-testing.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +12 -12
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/form/styles/_index.scss +16 -1
- package/gauge/styles/_index.scss +1 -0
- package/i18n/ar.json +32 -1
- package/i18n/cs.json +32 -1
- package/i18n/de.json +32 -1
- package/i18n/en.json +32 -1
- package/i18n/es.json +32 -1
- package/i18n/fr.json +32 -1
- package/i18n/he.json +32 -1
- package/i18n/hi.json +32 -1
- package/i18n/id.json +32 -1
- package/i18n/it.json +32 -1
- package/i18n/ja.json +32 -1
- package/i18n/ko.json +32 -1
- package/i18n/nl.json +32 -1
- package/i18n/pl.json +32 -1
- package/i18n/pt.json +32 -1
- package/i18n/ru.json +32 -1
- package/i18n/sv.json +32 -1
- package/i18n/tr.json +32 -1
- package/i18n/uk.json +32 -1
- package/i18n/vi.json +32 -1
- package/i18n/zh-TW.json +32 -1
- package/i18n/zh.json +32 -1
- package/input/styles/_index.scss +24 -1
- package/input-number/styles/_index.scss +69 -0
- package/input-otp/styles/_index.scss +5 -5
- package/line-chart/styles/_index.scss +30 -2
- package/llms-full.txt +14 -4
- package/llms.txt +188 -132
- package/mcp/providers.js +2 -2
- package/mcp/server.js +1 -1
- package/meter-group/styles/_index.scss +1 -0
- package/overlay/styles/_arrow.scss +30 -2
- package/package.json +43 -2
- package/page-header/styles/_index.scss +37 -1
- package/pagination/styles/_index.scss +9 -5
- package/popover/styles/_index.scss +73 -5
- package/progress/styles/_index.scss +4 -0
- package/radio/styles/_index.scss +4 -1
- package/schematics/use/symbol-map.json +1 -0
- package/select/styles/_index.scss +51 -12
- package/sidebar/styles/_index.scss +44 -2
- package/skeleton/styles/_index.scss +3 -0
- package/skills/ngwr/SKILL.md +5 -5
- package/skills/ngwr/references/catalog.md +2 -0
- package/skills/ngwr/references/setup.md +3 -3
- package/sparkline/styles/_index.scss +19 -0
- package/styles.scss +1 -0
- package/table/styles/_index.scss +7 -0
- package/textarea/styles/_index.scss +12 -3
- package/theme/styles/_colors.scss +39 -13
- package/theme/styles/_contrast.scss +9 -7
- package/toast/styles/_index.scss +4 -0
- package/toolbar/styles/_index.scss +35 -1
- package/tree/styles/_index.scss +46 -7
- package/types/ngwr-badge.d.ts +22 -7
- package/types/ngwr-bar-chart.d.ts +19 -1
- package/types/ngwr-calendar-heatmap.d.ts +29 -1
- package/types/ngwr-checkbox.d.ts +2 -0
- package/types/ngwr-config.d.ts +12 -0
- package/types/ngwr-date-picker.d.ts +308 -43
- package/types/ngwr-donut-chart.d.ts +24 -1
- package/types/ngwr-dropdown.d.ts +22 -2
- package/types/ngwr-editor-testing.d.ts +378 -0
- package/types/ngwr-editor.d.ts +449 -0
- package/types/ngwr-event-calendar.d.ts +8 -0
- package/types/ngwr-form.d.ts +35 -5
- package/types/ngwr-gauge.d.ts +20 -1
- package/types/ngwr-input-number.d.ts +7 -0
- package/types/ngwr-line-chart.d.ts +9 -1
- package/types/ngwr-markdown.d.ts +61 -2
- package/types/ngwr-meter-group-testing.d.ts +3 -2
- package/types/ngwr-meter-group.d.ts +14 -1
- package/types/ngwr-page-header.d.ts +10 -2
- package/types/ngwr-popover.d.ts +154 -3
- package/types/ngwr-sidebar.d.ts +7 -0
- package/types/ngwr-sparkline.d.ts +43 -1
- package/types/ngwr-toolbar.d.ts +7 -0
- package/types/ngwr-typography.d.ts +4 -0
- package/types/ngwr-version.d.ts +1 -1
- package/typography/styles/_index.scss +16 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-popover.mjs","sources":["../../../projects/lib/popover/interfaces/popover-position.ts","../../../projects/lib/popover/internal/keystroke.ts","../../../projects/lib/popover/internal/text-panel.ts","../../../projects/lib/popover/popover.ts","../../../projects/lib/popover/ngwr-popover.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { ConnectedPosition } from '@angular/cdk/overlay';\n\nexport type WrPopoverPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\n/**\n * The CDK geometry for each placement — one position, no fallbacks.\n *\n * The 8px offset is the gap between the trigger and the panel, and it is the\n * reason a flip list matters rather than being a nicety: the flexible strategy\n * emits `offsetX` as a `transform` on the pane, AFTER `withPush` has already\n * decided the coordinate. Push therefore parks a right-anchored panel flush\n * against the viewport edge and the offset then shoves it 8px back out, so a\n * side placement that does not fit loses its border and corner off-screen no\n * matter how hard push works. Flipping to a placement that fits is the only\n * recovery, which is what `WR_POPOVER_FALLBACKS` is for.\n *\n * @internal\n */\nexport const WR_POPOVER_POSITIONS: Record<WrPopoverPosition, ConnectedPosition> = {\n top: { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -8 },\n 'top-start': { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -8 },\n 'top-end': { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -8 },\n bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 8 },\n 'bottom-start': { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 8 },\n 'bottom-end': { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 8 },\n left: { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8 },\n 'left-start': { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -8 },\n 'left-end': { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -8 },\n right: { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8 },\n 'right-start': { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 8 },\n 'right-end': { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: 8 },\n};\n\n/**\n * What each placement is allowed to flip to when it does not fit, best first.\n * The requested placement always leads, so a panel that fits never moves.\n *\n * Alignment is preserved down the whole chain — a `-start` popover stays\n * `-start` — because the alignment is the author's answer to \"which end of the\n * trigger does this belong to\", and a flip is about the side, not about that.\n *\n * The two axes are deliberately NOT symmetric. A block-axis placement (`top*` /\n * `bottom*`) flips only to its opposite, the classic behaviour, so a dropdown-ish\n * panel can never surprise anyone by appearing beside its trigger. An inline-axis\n * one (`left*` / `right*`) also gets the two block-axis sides, because on a phone\n * NEITHER side fits: at 375px a 233px panel beside a mid-page trigger overflows\n * by 109px to the right and 97px to the left, and only below/above has room.\n *\n * @internal\n */\nexport const WR_POPOVER_FALLBACKS: Record<WrPopoverPosition, readonly WrPopoverPosition[]> = {\n top: ['top', 'bottom'],\n 'top-start': ['top-start', 'bottom-start'],\n 'top-end': ['top-end', 'bottom-end'],\n bottom: ['bottom', 'top'],\n 'bottom-start': ['bottom-start', 'top-start'],\n 'bottom-end': ['bottom-end', 'top-end'],\n left: ['left', 'right', 'bottom', 'top'],\n 'left-start': ['left-start', 'right-start', 'bottom-start', 'top-start'],\n 'left-end': ['left-end', 'right-end', 'bottom-end', 'top-end'],\n right: ['right', 'left', 'bottom', 'top'],\n 'right-start': ['right-start', 'left-start', 'bottom-start', 'top-start'],\n 'right-end': ['right-end', 'left-end', 'bottom-end', 'top-end'],\n};\n\n/**\n * The list `withPositions()` wants, with every link tagged so the pane names the\n * placement it ACTUALLY took rather than the one that was asked for.\n *\n * The tag is what keeps the arrow honest. It is drawn by\n * `.wr-popover-overlay--<placement> > *::after`, so a panel that flipped while\n * the class stayed put would point at a side it no longer sits on. CDK applies a\n * position's own `panelClass` in `_applyPosition` and clears it again on the next\n * one, which is exactly the bookkeeping this needs — hence the class rather than\n * a `positionChanges` subscription.\n *\n * @param paneClass The pane's base class: `wr-popover-overlay` or\n * `wr-tooltip-overlay`. The two modes key their arrows off different\n * selectors, so the prefix cannot live in the table.\n *\n * @internal\n */\nexport function wrPopoverPositions(position: WrPopoverPosition, paneClass: string): ConnectedPosition[] {\n return WR_POPOVER_FALLBACKS[position].map(name => ({\n ...WR_POPOVER_POSITIONS[name],\n panelClass: `${paneClass}--${name}`,\n }));\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, PLATFORM_ID, Service, inject } from '@angular/core';\n\n/** `FocusMonitor._setOrigin`'s own window — see the class docs for why it matches. */\nconst KEYSTROKE_WINDOW_MS = 1;\n\n/**\n * The key of the keystroke being handled RIGHT NOW — `null` between them.\n *\n * `FocusMonitor` answers \"the most recent input modality was a keyboard\", which\n * is a weaker statement than \"the user's own key put focus here\", and the gap\n * between the two is exactly where a tooltip goes wrong. The origin is whatever\n * was pressed within the last millisecond (`_setOrigin` clears it on a 1ms\n * timer), and an overlay dismissed with Escape hands focus BACK to its trigger\n * synchronously, inside that same keystroke — CDK's keyboard dispatcher listens\n * on `<body>` in the bubble phase, the modality detector on `document` in\n * capture, so the modality is always already `keyboard` by the time the drawer\n * runs. Same for a ✕ activated with Enter. So the CDK reports `keyboard` for a\n * hand-back and a tooltip reading the origin alone still shows itself unbidden,\n * which is the whole failure it was meant to stop.\n *\n * The KEY separates them: `Tab` and the arrows are how a user moves focus,\n * `Escape` and `Enter` dismiss and activate. A focus that lands during one of\n * those was moved by a script.\n *\n * One passive capture listener for the whole app, constructed with the first\n * `[wrPopover]` and never before it — beside the three `InputModalityDetector`\n * already installs.\n *\n * The key expires on the CDK's own 1ms window rather than on a bare macrotask,\n * and matching it is the point: the key is only ever read to EXPLAIN a keyboard\n * origin, so it must not run out while the origin it explains is still live. A\n * `setTimeout(0)` close would land in exactly that gap — key already forgotten,\n * origin still `keyboard` — and read as a Tab. Everything a keystroke does\n * synchronously, its default action and the click Enter dispatches included,\n * happens long before either timer; anything that waits past them is judged\n * `program` by the CDK and never reaches this question.\n *\n * Popover-local on purpose; no other component in the catalog asks this yet.\n */\n@Service()\nexport class WrCurrentKeystroke {\n private readonly doc = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private current: string | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** `KeyboardEvent.key` for the keystroke in flight, `null` outside one. */\n get key(): string | null {\n return this.current;\n }\n\n constructor() {\n if (!this.isBrowser) return;\n\n const record = (event: KeyboardEvent): void => {\n this.current = event.key;\n if (this.clearTimer) clearTimeout(this.clearTimer);\n this.clearTimer = setTimeout(() => (this.current = null), KEYSTROKE_WINDOW_MS);\n };\n\n // Capture, so the key is on record before any handler deeper in the tree\n // gets to move focus with it.\n this.doc.addEventListener('keydown', record, { capture: true, passive: true });\n this.destroyRef.onDestroy(() => {\n if (this.clearTimer) clearTimeout(this.clearTimer);\n this.doc.removeEventListener('keydown', record, { capture: true });\n });\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * Internal floating label rendered when `<… [wrPopover]=\"'…'\" mode=\"tooltip\">`\n * receives a string instead of a template. Not part of the public template\n * API — use the `WrPopover` directive in tooltip mode instead.\n *\n * @internal\n */\n@Component({\n selector: 'wr-popover-text',\n template: '{{ text() }}',\n encapsulation: ViewEncapsulation.None,\n // No `role=\"tooltip\"` here on purpose: the overlay pane this is attached to\n // is the element `aria-describedby` resolves to, and it carries the role.\n // Setting it here too nested one tooltip inside another.\n host: { class: 'wr-tooltip' },\n})\nexport class WrPopoverTextPanel {\n readonly text = input.required<string>();\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { type BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\nimport type { ComponentRef, TemplateRef } from '@angular/core';\nimport {\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n ViewContainerRef,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { useI18nText } from 'ngwr/i18n';\nimport {\n WR_OVERLAY,\n WR_RESPONSIVE_OVERLAYS,\n WrOutsideClick,\n wrFollowDirection,\n wrMirrorOffsets,\n wrPresentAsSheet,\n} from 'ngwr/overlay';\nimport { KEYS, numAttr } from 'ngwr/utils';\n\nimport { type WrPopoverPosition, wrPopoverPositions } from './interfaces';\nimport { WrCurrentKeystroke } from './internal/keystroke';\nimport { WrPopoverTextPanel } from './internal/text-panel';\n\n/**\n * Keys the USER moves focus with: Tab through the page, the arrows / Home /\n * End through a composite that roves its own tabindex.\n *\n * A roving arrow move is a script `.focus()` call too — the difference from a\n * dismissal is not who called `focus()` but whether the keystroke was a\n * NAVIGATION or an action. Anything absent from this list (Escape, Enter,\n * Space, a character) does something else for a living, so focus that lands\n * during one of them was placed by a script and a tooltip stays shut.\n */\nconst NAVIGATION_KEYS = new Set<string>([\n KEYS.TAB,\n KEYS.ARROW_UP,\n KEYS.ARROW_DOWN,\n KEYS.ARROW_LEFT,\n KEYS.ARROW_RIGHT,\n KEYS.HOME,\n KEYS.END,\n KEYS.PAGE_UP,\n KEYS.PAGE_DOWN,\n]);\n\n/**\n * Anchored content panel. The same directive covers two shapes:\n *\n * - **Popover** (default, `mode=\"popover\"`) — `[wrPopover]` takes a\n * `TemplateRef`. Opens on click or hover. Use for rich anchored content:\n * forms, summaries, menus.\n *\n * - **Tooltip** (`mode=\"tooltip\"`) — `[wrPopover]` takes a plain string.\n * Shown on hover and when the KEYBOARD puts focus on the trigger — never for\n * a `.focus()` call, which is what a dialog or drawer does when it hands\n * focus back. Dismissed when focus leaves / on pointer-leave / Escape. Uses\n * `aria-describedby` instead of `aria-haspopup` and is rendered into a small\n * dark text panel.\n *\n * Built on CDK Overlay so it auto-flips, closes on outside-click and Escape.\n *\n * @example\n * ```html\n * <!-- Popover with template content -->\n * <button wr-btn [wrPopover]=\"info\">Details</button>\n * <ng-template #info>\n * <div style=\"padding: 1rem; max-width: 18rem\">Anything you can render.</div>\n * </ng-template>\n *\n * <!-- Tooltip with plain text -->\n * <button wr-btn [wrPopover]=\"'Save changes'\" mode=\"tooltip\" position=\"top\">\n * Save\n * </button>\n * ```\n *\n * @see https://ngwr.dev/reference/components/popover\n */\nlet popoverUid = 0;\n\n@Directive({\n selector: '[wrPopover]',\n exportAs: 'wrPopover',\n host: {\n // Marks the trigger the way `[wrDropdown]` marks its own. Popover-mode\n // content is a `TemplateRef`, so it is always bound as `[wrPopover]=\"…\"`,\n // which leaves no attribute in the DOM at all, and a closed tooltip\n // publishes no ARIA either — so without this there is nothing to find a\n // trigger by. (Only the static string form, `wrPopover=\"text\"`, would be.)\n class: 'wr-popover-trigger',\n '[attr.aria-haspopup]': 'isTooltip() ? null : \"dialog\"',\n '[attr.aria-expanded]': 'isTooltip() ? null : isOpen()',\n '[attr.aria-controls]': '!isTooltip() && isOpen() ? panelId : null',\n '[attr.aria-describedby]': 'isTooltip() && isOpen() ? panelId : null',\n '(click)': 'onClick($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave($event)',\n // No `(focus)` / `(blur)` here: a tooltip answers the KEYBOARD, and a plain\n // focus event cannot say where the focus came from. `FocusMonitor` can — see\n // the constructor.\n '(keydown.escape)': 'onEscape()',\n },\n})\nexport class WrPopover {\n /**\n * Content to render inside the panel.\n * - In **popover** mode (default): pass a `TemplateRef`.\n * - In **tooltip** mode: pass a plain string.\n */\n readonly content = input.required<TemplateRef<unknown> | string>({ alias: 'wrPopover' });\n\n /**\n * Shape preset.\n *\n * - `'popover'` (default) — template content, click trigger, dialog\n * semantics.\n * - `'tooltip'` — text content, hover / keyboard-focus trigger,\n * `role=\"tooltip\"`, `aria-describedby` on the host.\n */\n readonly mode = input<'popover' | 'tooltip'>('popover');\n\n /**\n * How the popover opens. Ignored in tooltip mode — a tooltip is always hover\n * plus keyboard focus. @default 'click'\n */\n readonly trigger = input<'click' | 'hover'>('click');\n\n /** Anchor side. @default 'bottom' for popover, 'top' for tooltip */\n readonly position = input<WrPopoverPosition | null>(null);\n\n /** Tooltip only — delay before showing, in ms. @default 120 */\n readonly showDelay = input(120, { transform: numAttr(120) });\n\n /** Tooltip only — delay before hiding, in ms. @default 60 */\n readonly hideDelay = input(60, { transform: numAttr(60) });\n\n /**\n * Popover mode only — present the panel as a full-width bottom-sheet on\n * small viewports instead of an anchored panel. `undefined` follows the\n * app-wide `provideWrResponsiveOverlays()` setting; `true`/`false`\n * overrides it. Tooltips never become sheets. @default undefined\n */\n readonly responsive = input<boolean | undefined, BooleanInput>(undefined, {\n transform: (v: BooleanInput): boolean | undefined => (v == null ? undefined : coerceBooleanProperty(v)),\n });\n\n /**\n * Popover mode only — accessible name of the panel. `role=\"dialog\"` with no\n * name announces as a bare \"dialog\", so the catalog's `popover.label` is used\n * when nothing is given. A popover has no universal name; whenever the panel\n * has a heading or a purpose, pass it.\n */\n readonly ariaLabel = input<string | null>(null);\n\n /** Fires after the panel opens. */\n readonly opened = output<void>();\n\n /** Fires after the panel closes. */\n readonly closed = output<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly keystroke = inject(WrCurrentKeystroke);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly responsiveConfig = inject(WR_RESPONSIVE_OVERLAYS);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n /** @internal */\n readonly isOpen = signal(false);\n\n /** @internal */\n protected readonly isTooltip = computed(() => this.mode() === 'tooltip');\n\n /** Auto-generated id for `aria-controls` / `aria-describedby`. */\n protected readonly panelId = `wr-popover-${++popoverUid}`;\n\n private readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'popover.label', 'Popover');\n\n private readonly resolvedPosition = computed<WrPopoverPosition>(\n () => this.position() ?? (this.isTooltip() ? 'top' : 'bottom')\n );\n\n private overlayRef: OverlayRef | null = null;\n private textPanelRef: ComponentRef<WrPopoverTextPanel> | null = null;\n /** Whether the HOST itself holds focus — not a descendant of it. */\n private hostFocused = false;\n private hoverCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.openOverlay();\n } else {\n this.closeOverlay();\n }\n });\n // The tooltip string is pushed into the panel when the panel is created, and\n // `openOverlay()` returns early while one is already up — so a `content()`\n // change with the tooltip on screen never reached it and the label stayed on\n // the string it opened with (hover a Copy button, click it, it still reads\n // \"Copy\"). Keeping the ref and pushing from an effect is how `wr-date-picker`\n // feeds its own panel refs.\n effect(() => {\n const content = this.content();\n this.textPanelRef?.setInput('text', typeof content === 'string' ? content : '');\n });\n // A tooltip answers the USER'S KEYBOARD, not every focus there is.\n //\n // `(focus)` fired for a programmatic one too, and something hands focus back\n // to a trigger constantly: `WrDrawer` and `WrDialog` restore the element that\n // was active when they opened, this directive does the same for its own\n // popover, and any app may call `.focus()`. So closing a drawer opened from a\n // button with a tooltip re-showed that tooltip with NOTHING left to dismiss\n // it — the pointer is elsewhere, so no `mouseleave`, and focus stays on the\n // button, so no blur. A pane stranded under the trigger, reported from a real\n // app. The event alone cannot tell those apart; `FocusMonitor` is the CDK's\n // answer to where a focus came from, and it is what Material's tooltip reads\n // for the same reason. Mouse and touch origins are deliberately ignored:\n // hover already drives both, and acting on them would show the tooltip twice\n // over.\n //\n // The origin alone is NOT enough, though, and reading it as if it were leaves\n // the reported bug half open: the CDK's `keyboard` means \"a key went down\n // within the last millisecond\", and the dismissal that hands focus back is\n // itself a keystroke — Escape on a drawer, Enter on its ✕. See\n // `WrCurrentKeystroke` for the key that tells a navigation from a dismissal.\n //\n // Monitored in EVERY mode rather than only under `mode=\"tooltip\"` — the mode\n // is an input and may flip after this runs, and a subscription that only\n // half-exists is the failure this fix is about. The handler asks instead. The\n // cost is the CDK's own `cdk-*-focused` classes on the host, which nothing in\n // ngwr styles.\n //\n // `afterNextRender` because monitoring binds document listeners: there is no\n // DOM to bind them to on the server.\n afterNextRender(() => {\n this.focusMonitor\n .monitor(this.host)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(origin => {\n if (origin) {\n this.hostFocused = true;\n if (this.isTooltip() && origin === 'keyboard' && this.fromNavigationKey()) this.scheduleShow();\n return;\n }\n // A null origin is a blur, and the CDK reports one for a DESCENDANT\n // too: `_onFocus` bails when the event target is not the monitored\n // element, `_onBlur` has no such guard. The old `(blur)` binding never\n // bubbled, so hiding on one is new — hover a wrapper, click the button\n // inside it, tab away, and the tooltip the POINTER opened vanished\n // while the pointer never moved. Only the host's own focus counts.\n if (!this.hostFocused) return;\n this.hostFocused = false;\n if (this.isTooltip()) this.scheduleHide();\n });\n });\n this.destroyRef.onDestroy(() => {\n this.clearTimers();\n this.closeOverlay(false);\n // Completes the subject `monitor()` handed out and drops the global\n // listeners it registered for this element; the pipe above unsubscribes\n // either way, but the CDK's own bookkeeping only clears from here.\n this.focusMonitor.stopMonitoring(this.host);\n });\n }\n\n open(): void {\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n this.isOpen.update(v => !v);\n }\n\n // Host listeners\n\n /** @internal */\n protected onClick(event: MouseEvent): void {\n if (this.isTooltip() || this.trigger() !== 'click') return;\n event.stopPropagation();\n this.toggle();\n }\n\n /** @internal */\n protected onMouseEnter(): void {\n if (this.isTooltip()) {\n this.scheduleShow();\n return;\n }\n if (this.trigger() !== 'hover') return;\n this.clearHoverClose();\n this.isOpen.set(true);\n }\n\n /** @internal */\n protected onMouseLeave(event: MouseEvent): void {\n const related = event.relatedTarget as Node | null;\n if (this.isTooltip()) {\n // Crossing straight from the trigger onto the panel does not even arm the\n // hide, the same bail-out the popover arm below has had. The panel's own\n // `mouseenter` would cancel it a moment later anyway; not arming it is\n // what removes the race.\n if (related && this.overlayRef?.overlayElement.contains(related)) return;\n this.scheduleHide();\n return;\n }\n if (this.trigger() !== 'hover') return;\n if (related && this.overlayRef?.overlayElement.contains(related)) return;\n // Delay so the pointer can cross the gap between trigger and panel —\n // entering the panel cancels the close (see attach listeners).\n this.scheduleHoverClose();\n }\n\n /** @internal */\n protected onEscape(): void {\n if (!this.isTooltip()) return;\n this.clearTimers();\n this.isOpen.set(false);\n }\n\n /**\n * Whether the keystroke in flight is one the user moves focus with.\n *\n * Asked only of a `keyboard` origin, which the CDK grants to any focus landing\n * within a millisecond of a keydown — including the hand-back a drawer\n * performs while Escape is still being handled. That is the reported bug's\n * keyboard half, and the origin cannot see it.\n *\n * NO key on record answers `true`, and that polarity is chosen rather than\n * inherited: a keyboard modality with no keystroke behind it is a screen\n * reader's virtual cursor (the CDK reads its synthetic mousedown as\n * `keyboard`) or a deliberate `focusVia(el, 'keyboard')`, and both are the\n * user. Refusing wants positive evidence of a key that does something other\n * than navigate — silence must not cost an AT user the hint. The two windows\n * are aligned so that \"keyboard origin, no key\" cannot mean \"the key just\n * expired\"; what it does still admit is a `FocusMonitorDetectionMode.EVENTUAL`\n * app, where the CDK never expires an origin at all.\n */\n private fromNavigationKey(): boolean {\n const key = this.keystroke.key;\n return key === null || NAVIGATION_KEYS.has(key);\n }\n\n // Tooltip timers\n\n private scheduleShow(): void {\n if (this.isOpen()) {\n this.clearTimers();\n return;\n }\n const text = this.content();\n if (typeof text === 'string' && !text) return;\n this.clearTimers();\n this.showTimer = setTimeout(() => this.isOpen.set(true), this.showDelay());\n }\n\n private scheduleHide(): void {\n this.clearTimers();\n this.hideTimer = setTimeout(() => this.isOpen.set(false), this.hideDelay());\n }\n\n private clearTimers(): void {\n if (this.showTimer) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n // Overlay\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n\n const tooltip = this.isTooltip();\n const position = this.resolvedPosition();\n\n // Sheet presentation is popover-only — tooltips are transient labels and\n // never dock to the bottom. On small viewports (when opted in) detach\n // from the trigger and slide the panel up from the bottom edge.\n const asSheet = !tooltip && wrPresentAsSheet(this.responsive(), this.responsiveConfig);\n const paneClass = tooltip ? 'wr-tooltip-overlay' : 'wr-popover-overlay';\n\n // Kept as its own binding rather than inlined into the ternary: it is the\n // half a direction flip has to rebuild, and a sheet — anchored to nothing —\n // has no list at all, which is what `null` says here.\n const connected = asSheet\n ? null\n : this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(wrMirrorOffsets(wrPopoverPositions(position, paneClass), this.isRtl()))\n .withPush(true);\n\n const positionStrategy = connected ?? this.overlay.position().global().centerHorizontally().bottom('0');\n\n // The `--<placement>` half is no longer set here: each fallback position\n // carries its own, so the pane names the placement it landed on instead of\n // the one that was requested, and the arrow follows a flip. A sheet has no\n // anchor and so no placement class at all.\n const overlayClass = asSheet ? [paneClass, 'wr-overlay-sheet'] : [paneClass];\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: asSheet ? this.scrollStrategies.block() : this.scrollStrategies.reposition(),\n width: asSheet ? '100%' : undefined,\n hasBackdrop: asSheet,\n backdropClass: asSheet ? 'wr-overlay-backdrop' : undefined,\n panelClass: overlayClass,\n });\n\n // The CDK read the direction once, just now, and will never look again — so\n // an app that flips while this panel is up mirrors the page around a pane\n // still rendering `ltr`, with `wr-segmented` and friends inside it already\n // laying themselves out the other way. Rebuilding the list matters as much\n // as the attribute: `wrMirrorOffsets` turned the 8px gap around at open, and\n // an unmirrored offset puts a side-placed panel back on top of its trigger.\n // A sheet has no list, and `connected?.` is what says so — the arguments are\n // never evaluated for one.\n wrFollowDirection(this.overlayRef, this.dir, this.injector, direction =>\n connected?.withPositions(wrMirrorOffsets(wrPopoverPositions(position, paneClass), direction === 'rtl'))\n );\n\n if (asSheet) {\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isOpen.set(false));\n }\n\n const content = this.content();\n\n if (tooltip) {\n // Text content rendered via the internal text panel — accepts a\n // string and wraps it in the `.wr-tooltip` shell.\n const text = typeof content === 'string' ? content : '';\n const ref = this.overlayRef.attach(new ComponentPortal(WrPopoverTextPanel, this.vcr));\n ref.setInput('text', text);\n this.textPanelRef = ref;\n // The pane is the element `aria-describedby` points at (it carries\n // `panelId`), so this is the role that has to be `tooltip` — the inner\n // `wr-popover-text` host deliberately carries none, or the description\n // would be a tooltip nested inside a tooltip.\n this.overlayRef.overlayElement.setAttribute('role', 'tooltip');\n } else if (typeof content !== 'string') {\n const view = this.overlayRef.attach(new TemplatePortal(content, this.vcr));\n const pane = this.overlayRef.overlayElement;\n // Popover mode is a non-modal dialog: the docstring promised dialog\n // semantics but nothing ever set a role, so a screen reader met an\n // unnamed generic container. `aria-modal=\"false\"` is explicit — focus is\n // deliberately NOT trapped, the panel closes on outside click / Escape.\n pane.setAttribute('role', 'dialog');\n pane.setAttribute('aria-modal', 'false');\n // A named dialog: `role=\"dialog\"` with no name announces as a bare\n // \"dialog\" and trips axe's `aria-dialog-name`.\n pane.setAttribute('aria-label', this.resolvedAriaLabel());\n\n if (this.trigger() === 'click') {\n // Render the projected content before focus moves, the way\n // `wr-popconfirm` does — a reader announcing the dialog reads what is in\n // it, and on an empty pane that is nothing.\n view.detectChanges();\n // Focus has to ENTER the panel. The overlay container sits at the end of\n // `<body>`, so Tab from the trigger went to the next control on the page\n // and left the dialog stranded behind it (WCAG F85). The pane takes it\n // rather than the first control inside: a popover's content is\n // arbitrary, and landing on a text field would raise the on-screen\n // keyboard and skip whatever the panel says above it. Tab from the pane\n // reaches that first control anyway, since the pane precedes its own\n // content in document order.\n //\n // Click-triggered only — a hover popover must not pull the caret out of\n // what the user is typing in, and `scheduleHoverClose()` would then\n // dispose the pane out from under the focused element.\n pane.tabIndex = -1;\n pane.focus();\n }\n }\n this.overlayRef.overlayElement.id = this.panelId;\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.isOpen.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.isOpen.set(false);\n }\n });\n\n // Both hover shapes keep the panel up while the pointer is on it: for a\n // popover so the pointer can cross the gap, for a tooltip because WCAG\n // 1.4.13 requires it (Hoverable).\n if (tooltip || this.trigger() === 'hover') {\n this.overlayRef.overlayElement.addEventListener('mouseenter', this.onOverlayEnter);\n this.overlayRef.overlayElement.addEventListener('mouseleave', this.onOverlayLeave);\n }\n\n this.opened.emit();\n }\n\n /**\n * Tear the overlay down, and tell the host — unless the host is going away\n * with it.\n *\n * `notify: false` is the DESTROY path, and it is not a nicety. An `output()`\n * belongs to the view that declares it, so emitting from `onDestroy` is\n * refused: Angular logs `NG0953: Unexpected emit for destroyed OutputRef` and\n * the listener never runs. Measured — a `(closed)` handler on a dropdown whose\n * host view is removed while the menu is open fired zero times and left a\n * console error behind. There is nobody to notify at that point, because the\n * consumer's own view is being torn down in the same pass; `wr-popconfirm`\n * already disposes without emitting, and this brings the other two into line.\n *\n * The focus hand-back is skipped for the same reason — the host element is on\n * its way out of the document.\n */\n private closeOverlay(notify = true): void {\n if (!this.overlayRef) return;\n if (this.isTooltip() || this.trigger() === 'hover') {\n this.overlayRef.overlayElement.removeEventListener('mouseenter', this.onOverlayEnter);\n this.overlayRef.overlayElement.removeEventListener('mouseleave', this.onOverlayLeave);\n }\n this.clearHoverClose();\n // Take the focus back before the pane goes, and only if it was in there.\n //\n // A popover is not a tooltip: it attaches a `TemplatePortal` under\n // `role=\"dialog\"`, so a form or a menu inside it is the point, and Escape\n // arrives through the overlay's `keydownEvents()` no matter where the caret\n // is. Disposing with focus inside dropped it on `<body>`, and the next Tab\n // restarted from the top of the document. `wr-date-picker` and\n // `wr-popconfirm` already guard it exactly this way; leaving focus alone\n // when it had already moved is what stops the close from fighting the user\n // for the caret.\n const pane = this.overlayRef.overlayElement;\n const focusWasInside = pane.contains(this.host.nativeElement.ownerDocument.activeElement);\n this.overlayRef.dispose();\n this.overlayRef = null;\n // Disposing destroys the panel component; a retained ref would pin its view.\n this.textPanelRef = null;\n if (notify) {\n if (focusWasInside) this.host.nativeElement.focus();\n this.closed.emit();\n }\n }\n\n private readonly onOverlayLeave = (event: MouseEvent): void => {\n const related = event.relatedTarget as Node | null;\n if (related && this.host.nativeElement.contains(related)) return;\n // A tooltip leaves on its own `hideDelay`, the same one the trigger uses; a\n // hover popover has the longer grace period for crossing the gap back.\n if (this.isTooltip()) this.scheduleHide();\n else this.scheduleHoverClose();\n };\n\n private readonly onOverlayEnter = (): void => {\n // Two different timers can be in flight: `hideTimer`, armed by the trigger's\n // own `mouseleave` in tooltip mode, and `hoverCloseTimer` in popover mode.\n // Cancelling only the second would leave a tooltip disappearing `hideDelay`\n // after the pointer arrived on it.\n this.clearTimers();\n this.clearHoverClose();\n };\n\n private scheduleHoverClose(): void {\n this.clearHoverClose();\n this.hoverCloseTimer = setTimeout(() => this.isOpen.set(false), 120);\n }\n\n private clearHoverClose(): void {\n if (this.hoverCloseTimer) {\n clearTimeout(this.hoverCloseTimer);\n this.hoverCloseTimer = null;\n }\n }\n\n /**\n * Whether the app reads right-to-left.\n *\n * Optional inject: `Directionality` is root-provided, so this is never null in\n * an app — but a bare `TestBed` that provides nothing should still get a\n * component that works, and defaulting to LTR is the honest fallback.\n */\n private isRtl(): boolean {\n return this.dir?.value === 'rtl';\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngwr-popover.mjs","sources":["../../../projects/lib/popover/internal/chart-tooltip-panel.ts","../../../projects/lib/popover/internal/chart-tooltip-panel.html","../../../projects/lib/popover/chart-tooltip.ts","../../../projects/lib/popover/interfaces/popover-position.ts","../../../projects/lib/popover/internal/keystroke.ts","../../../projects/lib/popover/internal/text-panel.ts","../../../projects/lib/popover/popover.ts","../../../projects/lib/popover/ngwr-popover.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\nimport type { WrChartTooltipDatum } from '../interfaces';\n\n/**\n * The chip a chart's hover tooltip renders into. Not part of the template API —\n * `useChartTooltip()` attaches it.\n *\n * It wears `.wr-tooltip` as well as its own class, so it IS the library's\n * tooltip: the same surface, border, radius, type and arrow as\n * `[wrPopover] mode=\"tooltip\"`, and an app that retints `--wr-tooltip-bg`\n * retints this one with the rest. Only the inside is its own — a swatch, a\n * label and a value, laid out rather than joined into one string, so no\n * separator has to be translated.\n *\n * @internal\n */\n@Component({\n selector: 'wr-chart-tooltip',\n templateUrl: './chart-tooltip-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-tooltip wr-chart-tooltip' },\n})\nexport class WrChartTooltipPanel {\n readonly datum = input.required<WrChartTooltipDatum>();\n}\n","@let d = datum();\n@if (d.color) {\n <span class=\"wr-chart-tooltip__swatch\" [style.background]=\"d.color\"></span>\n}\n@if (d.label) {\n <span class=\"wr-chart-tooltip__label\">{{ d.label }}</span>\n}\n<span class=\"wr-chart-tooltip__value\">{{ d.value }}</span>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport type { ConnectedPosition, FlexibleConnectedPositionStrategy, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { DOCUMENT } from '@angular/common';\nimport {\n type ComponentRef,\n DestroyRef,\n ElementRef,\n Injector,\n type Signal,\n afterRenderEffect,\n computed,\n inject,\n signal,\n untracked,\n} from '@angular/core';\n\nimport type { Subscription } from 'rxjs';\n\nimport { WR_OVERLAY, wrFollowDirection } from 'ngwr/overlay';\n\nimport type { WrChartTooltip, WrChartTooltipTarget } from './interfaces';\nimport { WrChartTooltipPanel } from './internal/chart-tooltip-panel';\n\n/**\n * How long the tooltip outlives the pointer leaving a section, or reporting another\n * one on its way to the chip, in ms.\n *\n * Long enough to cross the 8px gap onto the chip, which is what keeps it hoverable,\n * and to pass through the gutter between two bars or two heatmap days without a\n * flash. The same order as `[wrPopover]`'s `hideDelay`.\n */\nconst GRACE = 100;\n\n/**\n * How close the arrow's middle may come to the end of the chip's edge, in px from the\n * padding box: the chip's inner corner radius (5px) plus half the rotated square's\n * diagonal (4.24px), rounded up. An anchor further out than that — a chip pushed flush\n * against the viewport by a section on its very edge — keeps the arrow on the straight\n * part of the chip rather than off its corner.\n */\nconst ARROW_INSET = 10;\n\n/**\n * How far back past its anchor a chip that runs AWAY from the anchor starts: far enough\n * for the arrow to sit on the anchor without meeting `ARROW_INSET`.\n */\nconst REACH_BACK = ARROW_INSET + 4;\n\ntype Side = NonNullable<WrChartTooltipTarget['side']>;\ntype Anchor = NonNullable<WrChartTooltipTarget['anchor']>;\n\ninterface Box {\n readonly left: number;\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n}\n\ntype Edge = 'left' | 'center' | 'right';\ntype Rise = 'top' | 'center' | 'bottom';\n\n/** A placement in PHYSICAL terms: which chip edge the arrow hangs off, and the geometry. */\ninterface Physical {\n readonly originX: Edge;\n readonly originY: Rise;\n readonly overlayX: Edge;\n readonly overlayY: Rise;\n readonly offsetX?: number;\n readonly offsetY?: number;\n readonly arrow: Side;\n}\n\nconst ABOVE: Physical = {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n arrow: 'bottom',\n};\nconst BELOW: Physical = {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n arrow: 'top',\n};\n\n/**\n * Every placement a side may take, best first.\n *\n * `top` and `bottom` flip to each other, the way every tooltip does. A side placement\n * never flips to the far side: its anchor is a point on a donut's outer arc, and the far\n * side of that point is the donut. Where there is no room beside the anchor — a 200px\n * ring on a phone leaves about 85px either side — the chip goes above it, then below,\n * running AWAY from the ring with the anchor just inside its near end. Measured in\n * Chromium at 375px, a chip centred on the nine o'clock point lay 40px deep over the\n * ring, and one running away from it 13px. Centred above and below come last, and when\n * nothing fits `withPush` slides the best of them into view.\n */\nconst FALLBACKS: Record<Side, readonly Physical[]> = {\n top: [ABOVE, BELOW],\n bottom: [BELOW, ABOVE],\n right: [\n { originX: 'right', originY: 'center', overlayX: 'left', overlayY: 'center', offsetX: 8, arrow: 'left' },\n { ...ABOVE, overlayX: 'left', offsetX: -REACH_BACK },\n { ...BELOW, overlayX: 'left', offsetX: -REACH_BACK },\n ABOVE,\n BELOW,\n ],\n left: [\n { originX: 'left', originY: 'center', overlayX: 'right', overlayY: 'center', offsetX: -8, arrow: 'right' },\n { ...ABOVE, overlayX: 'right', offsetX: REACH_BACK },\n { ...BELOW, overlayX: 'right', offsetX: REACH_BACK },\n ABOVE,\n BELOW,\n ],\n};\n\n/**\n * The position list for a side, in the logical vocabulary the CDK and the arrow\n * stylesheet speak.\n *\n * A chart's geometry does not mirror — an SVG arc at three o'clock is on the right in\n * both directions — so the list is written physically and translated here. The CDK\n * resolves `start` / `end` against the overlay's direction, and applies `offsetX` as a\n * physical translate, so under RTL the edges swap and the offsets stay as they are. The\n * pane class names the edge the arrow hangs off in the stylesheet's terms: its side\n * placements hang the arrow off an INLINE edge, so the chip's physical left edge is\n * `--right` in LTR and `--left` in RTL. Along that edge the arrow is placed by\n * measurement, so a chip that runs away from its anchor needs no class of its own.\n */\nfunction chartTooltipPositions(side: Side, rtl: boolean): ConnectedPosition[] {\n const x = (edge: Edge): 'start' | 'center' | 'end' =>\n edge === 'center' ? 'center' : (edge === 'left') !== rtl ? 'start' : 'end';\n const arrowClass: Record<Side, string> = {\n top: 'bottom',\n bottom: 'top',\n left: rtl ? 'left' : 'right',\n right: rtl ? 'right' : 'left',\n };\n return FALLBACKS[side].map(place => ({\n originX: x(place.originX),\n originY: place.originY,\n overlayX: x(place.overlayX),\n overlayY: place.overlayY,\n offsetX: place.offsetX,\n offsetY: place.offsetY,\n panelClass: `wr-tooltip-overlay--${arrowClass[place.arrow]}`,\n }));\n}\n\n/** Where an anchor is right now, in viewport pixels. */\nfunction boxOf(anchor: Anchor): Box {\n if (anchor instanceof Element) return anchor.getBoundingClientRect();\n const width = anchor.width ?? 0;\n const height = anchor.height ?? 0;\n return { left: anchor.x, top: anchor.y, right: anchor.x + width, bottom: anchor.y + height };\n}\n\n/**\n * A hover tooltip for a chart's sections, with ONE overlay per chart.\n *\n * **Why not `[wrPopover] mode=\"tooltip\"` on every section.** It fits the look\n * and not the shape. A year of `wr-calendar-heatmap` is 371 days, and a directive\n * per day is 371 focus monitors and 371 overlays-in-waiting for a tooltip only\n * one of them can show; and most sections are not an element a directive could\n * point at — a donut's slice is a `<path>` whose box is most of the ring, a\n * sparkline's point is a coordinate. So the chart says which section is under\n * the pointer and where to point, and this owns the single overlay, the timers\n * and the teardown. What IS shared with the directive is everything a reader\n * sees: the `.wr-tooltip` chip, its arrow, the placements with their flip, and\n * Escape.\n *\n * **The chip points AT the section it describes**, with its arrow on the anchor:\n * above a heatmap's day, above a bar's top edge, off the outside of a donut's arc.\n * The arrow is placed from a measurement rather than centred, because the chip is\n * not always centred on its anchor — `withPush` slides it along the viewport edge\n * for the first and last week of a year — and an arrow at the chip's middle would\n * then point at a neighbour. The measurement is written to\n * `--wr-chart-tooltip-arrow` on the chip, and the stylesheet puts the arrow there.\n *\n * **A chip at its section sits over the sections beside it**, and it is hoverable\n * (below), so the way onto it can cross another section: straight up from a heatmap\n * day runs through the day above. Switching the moment that day reported itself\n * would move the chip away from a pointer on its way to it — WCAG 1.4.13 with extra\n * steps. So the strip between the anchor and the chip is a bridge: another section\n * reported from inside it waits out the same grace a leave does, a pointer still\n * closing in on the chip starts that grace again however slowly it moves, and\n * landing on the chip cancels the switch. Anywhere else a new section switches at\n * once, so scanning a row of days does not lag. The cost is in the other direction: a\n * pointer that keeps on going up a heatmap's column is moving onto the chip, so it\n * passes over it and the days under it read out only once it comes out the far side.\n *\n * **Why an overlay and not a positioned child, the way `wr-line-chart` draws its\n * own.** A child is clipped by every `overflow` between it and the page, and a\n * chart sits inside those constantly: `wr-calendar-heatmap` IS a scroll\n * container, and a sparkline in a `wr-table` cell sits under two more.\n *\n * **Pointer only, deliberately.** No section of any chart is a tab stop, and\n * this does not make one — a year of days in the tab order would be the defect.\n * The pane is `aria-hidden`: every value it shows is already the section's\n * accessible name or the chart's own, and an orphan tooltip nothing describes\n * reads as a stray line at the end of the document. It is never the only way to\n * a value.\n *\n * SSR-safe: nothing here touches the DOM until a pointer event has moved a\n * section, and the render effect that opens the overlay never runs on a server.\n *\n * Call from an injection context — a chart's field initialiser.\n *\n * @param enabled The chart's `tooltip` input. Turning it off closes an open tooltip.\n * @param resolve What to show for section `index`, and where. It runs after\n * render, so it may read the DOM the section just drew; the signals it reads\n * are tracked, so a data change under an open tooltip re-reads it, and a\n * section that no longer exists (`null`) closes it. It runs again whenever the\n * chart may have moved under an open chip — a scroll anywhere, a viewport\n * resize, the chart or its anchor element changing size.\n * @param sectionAt For a chart whose sections are chosen by POSITION rather than by\n * element — a sparkline picks the point nearest the pointer's x, anywhere over the\n * drawing — the section at a viewport point, or `null` off the drawing. The chip\n * points at the point from inside the drawing, so without this a pointer scrubbing\n * above the line lands on the chip and the chart stops hearing it: measured in\n * Chromium, a scrub along the top of a sparkline showed 9 of its 12 values. Asked on\n * every pointer event while a chip is up, wherever the pointer is over the chart or its\n * own chip; straight up from a point onto its chip stays on that point, so the chip is\n * still hoverable. Anywhere else the chip closes after the usual grace.\n *\n * @internal\n */\nexport function useChartTooltip(\n enabled: Signal<boolean>,\n resolve: (index: number) => WrChartTooltipTarget | null,\n sectionAt?: (x: number, y: number) => number | null\n): WrChartTooltip {\n const overlay = inject(WR_OVERLAY);\n const doc = inject(DOCUMENT);\n const dir = inject(Directionality, { optional: true });\n const viewport = inject(ViewportRuler);\n const host = inject(ElementRef).nativeElement as Element;\n const injector = inject(Injector);\n\n const hovered = signal<number | null>(null);\n const active = computed(() => (enabled() ? hovered() : null));\n\n /**\n * The section Escape dismissed. It stays shut for as long as the pointer stays\n * on that section — WCAG 1.4.13 asks for dismissal WITHOUT moving the pointer,\n * and a sparkline re-reports its section on every `mousemove`, so a plain\n * close would reopen on the next pixel.\n */\n let dismissed: number | null = null;\n\n let overlayRef: OverlayRef | null = null;\n let strategy: FlexibleConnectedPositionStrategy | null = null;\n let panel: ComponentRef<WrChartTooltipPanel> | null = null;\n let side: Side = 'top';\n let anchor: Anchor | null = null;\n let resized: Subscription | null = null;\n let observer: ResizeObserver | null = null;\n let observed: Element | null = null;\n\n /** Where the pointer last was, while a chip is up. `null` until it moves. */\n let pointer: { readonly x: number; readonly y: number } | null = null;\n\n /**\n * What the grace period settles on when it runs out: another section, `null` for\n * none, or `undefined` for nothing pending — the chip stays as it is.\n */\n let pending: number | null | undefined;\n let graceTimer: ReturnType<typeof setTimeout> | null = null;\n /** The pointer's distance from the chip when the grace last (re)started. */\n let approach = Number.POSITIVE_INFINITY;\n\n const chipBox = (): DOMRect | null => {\n const box = overlayRef?.overlayElement.getBoundingClientRect();\n // Nothing laid out (a unit test, a pane not attached yet) is no chip to reach.\n return box && box.width > 0 && box.height > 0 ? box : null;\n };\n\n /**\n * Whether the pointer is in the strip between the anchor and the chip — as wide\n * as the chip along the edge it hangs off, so a diagonal approach counts too.\n */\n const inBridge = (): boolean => {\n const chip = chipBox();\n if (!pointer || !chip || !anchor) return false;\n const at = boxOf(anchor);\n const { x, y } = pointer;\n const across = x >= chip.left && x <= chip.right;\n const along = y >= chip.top && y <= chip.bottom;\n if (chip.bottom <= at.top) return across && y >= chip.bottom && y <= at.top;\n if (chip.top >= at.bottom) return across && y >= at.bottom && y <= chip.top;\n if (chip.right <= at.left) return along && x >= chip.right && x <= at.left;\n if (chip.left >= at.right) return along && x >= at.right && x <= chip.left;\n return false;\n };\n\n const distanceToChip = (): number => {\n const chip = chipBox();\n if (!pointer || !chip) return Number.POSITIVE_INFINITY;\n const dx = Math.max(chip.left - pointer.x, 0, pointer.x - chip.right);\n const dy = Math.max(chip.top - pointer.y, 0, pointer.y - chip.bottom);\n return Math.hypot(dx, dy);\n };\n\n const cancelGrace = (): void => {\n pending = undefined;\n if (graceTimer === null) return;\n clearTimeout(graceTimer);\n graceTimer = null;\n };\n\n const settle = (): void => {\n const next = pending;\n cancelGrace();\n if (next !== undefined) hovered.set(next);\n };\n\n const restartGrace = (): void => {\n if (graceTimer !== null) clearTimeout(graceTimer);\n graceTimer = setTimeout(settle, GRACE);\n };\n\n // An armed grace is left to run rather than restarted: a grid reports the gap\n // between two squares on every `mousemove`, and restarting would keep a tooltip\n // up for as long as the pointer kept moving through it. Only closing in on the\n // chip restarts it — see `track`.\n const defer = (next: number | null): void => {\n pending = next;\n if (graceTimer !== null) return;\n approach = distanceToChip();\n restartGrace();\n };\n\n const enter = (index: number): void => {\n if (!enabled()) return;\n if (index === dismissed) {\n cancelGrace();\n return;\n }\n dismissed = null;\n const showing = hovered();\n if (index === showing) {\n cancelGrace();\n return;\n }\n if (showing !== null && inBridge()) {\n defer(index);\n return;\n }\n cancelGrace();\n hovered.set(index);\n };\n\n /**\n * Put the arrow on the anchor, wherever the chip landed along it. Measured off the\n * PANE, which is exactly the chip's box: the chip itself scales in from 96% and\n * would read short for the length of its entry animation.\n */\n const aim = (): void => {\n if (!overlayRef || !panel || !anchor) return;\n const pane = overlayRef.overlayElement;\n const chip = panel.location.nativeElement as HTMLElement;\n const at = boxOf(anchor);\n const box = pane.getBoundingClientRect();\n const across =\n pane.classList.contains('wr-tooltip-overlay--top') || pane.classList.contains('wr-tooltip-overlay--bottom');\n // The arrow is positioned inside the chip's padding box, so its border comes off.\n const border = across ? chip.clientLeft : chip.clientTop;\n const inner = (across ? box.width : box.height) - 2 * border;\n if (inner <= 2 * ARROW_INSET) return;\n const target = across ? (at.left + at.right) / 2 - box.left : (at.top + at.bottom) / 2 - box.top;\n const offset = Math.min(inner - ARROW_INSET, Math.max(ARROW_INSET, target - border));\n chip.style.setProperty('--wr-chart-tooltip-arrow', `${Math.round(offset * 100) / 100}px`);\n };\n\n const place = (): void => {\n if (!overlayRef || !strategy || !anchor) return;\n strategy.setOrigin(anchor);\n overlayRef.updatePosition();\n aim();\n };\n\n /** Watch whatever can move the anchor without a scroll or a viewport resize. */\n const observe = (): void => {\n const next = anchor instanceof Element ? anchor : null;\n if (!observer || next === observed) return;\n if (observed) observer.unobserve(observed);\n observed = next;\n if (next) observer.observe(next);\n };\n\n /**\n * Point the open chip at wherever its section is NOW. A box anchor is a set of\n * viewport numbers, so it goes stale the moment anything scrolls, and the CDK's\n * own reposition listens to the window and to registered `cdkScrollable`s only —\n * not to `wr-calendar-heatmap`, which is a scroll container of its own, nor to a\n * `wr-table` a sparkline sits in. One capture listener on the document hears\n * every one of them; a viewport resize and a `ResizeObserver` on the chart cover\n * the rest.\n */\n const reanchor = (): void => {\n const index = untracked(active);\n if (!overlayRef || index === null) return;\n const target = untracked(() => resolve(index));\n if (!target?.anchor) return;\n anchor = target.anchor;\n observe();\n place();\n };\n\n /**\n * The pointer, wherever it goes while a chip is up. Captured on the document, so it\n * is current before any section's own `mouseenter` / `mousemove` handler runs.\n */\n const track = (event: MouseEvent): void => {\n const { clientX: x, clientY: y } = event;\n pointer = { x, y };\n // A chart scrubbed by position hears the pointer wherever it is over the drawing,\n // chip or not — see `sectionAt` — but only where what is under the pointer is the\n // chart or its own chip. A box says nothing about what covers it: a chip from the\n // chart beside it can lie over this drawing, and the drawing's edge is a fraction of\n // a pixel wider than what hit-tests as it. A `mouseout` goes to the element left, so\n // the one under the pointer is its `relatedTarget`.\n const under = event.type === 'mouseout' ? event.relatedTarget : event.target;\n const ours = under instanceof Node && (host.contains(under) || !!overlayRef?.overlayElement.contains(under));\n const scrubbed = sectionAt && ours ? sectionAt(x, y) : null;\n if (scrubbed !== null) {\n enter(scrubbed);\n return;\n }\n // On the chip: its own `mouseenter` cancels whatever is pending. Asked of the\n // geometry rather than of the event, because the first event of that move is the\n // section's `mouseout`, whose target is the section being left.\n const chip = chipBox();\n const onChip = chip !== null && x >= chip.left && x <= chip.right && y >= chip.top && y <= chip.bottom;\n // Off the drawing of a chart scrubbed by position, nothing is hovered, whatever the\n // drawing's own `mouseleave` did — it only fires once, and a chip can move over or\n // off a resting pointer without any. Measured in Chromium before this: a pointer\n // leaving a sparkline across its right edge re-entered the last point in the capture\n // phase of the same move, cancelled the grace the leave was about to arm, and left\n // the chip up for good beside the next chart's own.\n if (sectionAt && !onChip && graceTimer === null) defer(null);\n if (graceTimer === null || onChip) return;\n if (inBridge()) {\n const distance = distanceToChip();\n if (distance < approach) {\n approach = distance;\n restartGrace();\n }\n } else if (pending !== undefined && pending !== null) {\n // Out of the bridge while a section waits: nothing is on its way to the chip.\n settle();\n }\n };\n\n const close = (): void => {\n if (!overlayRef) return;\n doc.removeEventListener('scroll', reanchor, true);\n for (const type of ['mousemove', 'mouseover', 'mouseout'] as const) {\n doc.removeEventListener(type, track, true);\n }\n resized?.unsubscribe();\n observer?.disconnect();\n // Disposing detaches the pane with its listeners and completes\n // `keydownEvents()`, so nothing registered in `open()` outlives it.\n overlayRef.dispose();\n overlayRef = null;\n strategy = null;\n panel = null;\n anchor = null;\n resized = null;\n observer = null;\n observed = null;\n pointer = null;\n };\n\n const open = (target: WrChartTooltipTarget & { readonly anchor: Anchor }): void => {\n const wanted = target.side ?? 'top';\n anchor = target.anchor;\n if (!overlayRef) {\n side = wanted;\n const direction = dir?.value ?? 'ltr';\n // `withGrowAfterOpen`: past its first pass the CDK never gives the pane a box\n // larger than the last one, and this pane is passed from section to section. A\n // chip once pushed against the viewport edge — a donut's nine o'clock on a phone —\n // left every later chip that box, so the next one overflowed its pane and the arrow,\n // measured off the pane, pointed 9–13px wide of its slice. `wr-dropdown` hit the same.\n strategy = overlay\n .position()\n .flexibleConnectedTo(anchor)\n .withPositions(chartTooltipPositions(side, direction === 'rtl'))\n .withPush(true)\n .withGrowAfterOpen(true);\n overlayRef = overlay.create({\n positionStrategy: strategy,\n // No scroll strategy: `reanchor` repositions, for every scroll container.\n panelClass: 'wr-tooltip-overlay',\n // The direction the list above was translated for — the CDK would otherwise\n // take the document's, and a chart under a `[dir]` would open on the wrong side.\n direction,\n });\n doc.addEventListener('scroll', reanchor, { capture: true, passive: true });\n for (const type of ['mousemove', 'mouseover', 'mouseout'] as const) {\n doc.addEventListener(type, track, { capture: true, passive: true });\n }\n // After the CDK's own subscription, which re-applies against the stale anchor.\n resized = viewport.change().subscribe(reanchor);\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(reanchor);\n observer.observe(host);\n }\n // The chip lands on the same PHYSICAL side in both directions, so the list is\n // translated again rather than the side changed, and the arrow's measurement holds.\n wrFollowDirection(overlayRef, dir, injector, direction =>\n strategy?.withPositions(chartTooltipPositions(side, direction === 'rtl'))\n );\n\n const pane = overlayRef.overlayElement;\n pane.setAttribute('aria-hidden', 'true');\n // Hoverable: the pointer may move onto the chip without losing it, and a switch\n // or a hide it was racing is off. Leaving it starts the same grace a section\n // does; landing back on a section decides through `enter()`.\n pane.addEventListener('mouseenter', cancelGrace);\n pane.addEventListener('mouseleave', () => defer(null));\n\n // Escape reaches the topmost overlay wherever focus is — the CDK's keyboard\n // dispatcher routes it — which is what makes a tooltip nothing can focus\n // dismissible at all.\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key !== 'Escape') return;\n dismissed = hovered();\n cancelGrace();\n hovered.set(null);\n });\n\n panel = overlayRef.attach(new ComponentPortal(WrChartTooltipPanel, null, injector));\n } else if (wanted !== side) {\n side = wanted;\n strategy?.withPositions(chartTooltipPositions(side, overlayRef.getDirection() === 'rtl'));\n }\n observe();\n\n panel?.setInput('datum', target.datum);\n // Rendered NOW rather than on the next pass: the position is centred on the\n // anchor, so it has to be measured against the text it is about to show, not\n // the previous section's.\n panel?.changeDetectorRef.detectChanges();\n place();\n };\n\n afterRenderEffect(() => {\n const index = active();\n const target = index === null ? null : resolve(index);\n // Untracked: the overlay's own construction reads signals (the direction\n // follower creates an effect), and none of them should re-run this.\n untracked(() => {\n if (target?.anchor) open({ ...target, anchor: target.anchor });\n else close();\n });\n });\n\n inject(DestroyRef).onDestroy(() => {\n cancelGrace();\n close();\n });\n\n return {\n active,\n enter,\n leave(event?: MouseEvent): void {\n dismissed = null;\n // Straight onto the chip: its own `mouseenter` would cancel the grace a\n // moment later anyway, and not arming it is what removes the race.\n const to = event?.relatedTarget;\n if (to instanceof Node && overlayRef?.overlayElement.contains(to)) return;\n defer(null);\n },\n };\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { ConnectedPosition } from '@angular/cdk/overlay';\n\nexport type WrPopoverPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end';\n\n/**\n * The CDK geometry for each placement — one position, no fallbacks.\n *\n * The 8px offset is the gap between the trigger and the panel, and it is the\n * reason a flip list matters rather than being a nicety: the flexible strategy\n * emits `offsetX` as a `transform` on the pane, AFTER `withPush` has already\n * decided the coordinate. Push therefore parks a right-anchored panel flush\n * against the viewport edge and the offset then shoves it 8px back out, so a\n * side placement that does not fit loses its border and corner off-screen no\n * matter how hard push works. Flipping to a placement that fits is the only\n * recovery, which is what `WR_POPOVER_FALLBACKS` is for.\n *\n * @internal\n */\nexport const WR_POPOVER_POSITIONS: Record<WrPopoverPosition, ConnectedPosition> = {\n top: { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -8 },\n 'top-start': { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -8 },\n 'top-end': { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -8 },\n bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 8 },\n 'bottom-start': { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 8 },\n 'bottom-end': { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 8 },\n left: { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8 },\n 'left-start': { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -8 },\n 'left-end': { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -8 },\n right: { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8 },\n 'right-start': { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 8 },\n 'right-end': { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: 8 },\n};\n\n/**\n * What each placement is allowed to flip to when it does not fit, best first.\n * The requested placement always leads, so a panel that fits never moves.\n *\n * Alignment is preserved down the whole chain — a `-start` popover stays\n * `-start` — because the alignment is the author's answer to \"which end of the\n * trigger does this belong to\", and a flip is about the side, not about that.\n *\n * The two axes are deliberately NOT symmetric. A block-axis placement (`top*` /\n * `bottom*`) flips only to its opposite, the classic behaviour, so a dropdown-ish\n * panel can never surprise anyone by appearing beside its trigger. An inline-axis\n * one (`left*` / `right*`) also gets the two block-axis sides, because on a phone\n * NEITHER side fits: at 375px a 233px panel beside a mid-page trigger overflows\n * by 109px to the right and 97px to the left, and only below/above has room.\n *\n * @internal\n */\nexport const WR_POPOVER_FALLBACKS: Record<WrPopoverPosition, readonly WrPopoverPosition[]> = {\n top: ['top', 'bottom'],\n 'top-start': ['top-start', 'bottom-start'],\n 'top-end': ['top-end', 'bottom-end'],\n bottom: ['bottom', 'top'],\n 'bottom-start': ['bottom-start', 'top-start'],\n 'bottom-end': ['bottom-end', 'top-end'],\n left: ['left', 'right', 'bottom', 'top'],\n 'left-start': ['left-start', 'right-start', 'bottom-start', 'top-start'],\n 'left-end': ['left-end', 'right-end', 'bottom-end', 'top-end'],\n right: ['right', 'left', 'bottom', 'top'],\n 'right-start': ['right-start', 'left-start', 'bottom-start', 'top-start'],\n 'right-end': ['right-end', 'left-end', 'bottom-end', 'top-end'],\n};\n\n/**\n * The list `withPositions()` wants, with every link tagged so the pane names the\n * placement it ACTUALLY took rather than the one that was asked for.\n *\n * The tag is what keeps the arrow honest. It is drawn by\n * `.wr-popover-overlay--<placement> > *::after`, so a panel that flipped while\n * the class stayed put would point at a side it no longer sits on. CDK applies a\n * position's own `panelClass` in `_applyPosition` and clears it again on the next\n * one, which is exactly the bookkeeping this needs — hence the class rather than\n * a `positionChanges` subscription.\n *\n * @param paneClass The pane's base class: `wr-popover-overlay` or\n * `wr-tooltip-overlay`. The two modes key their arrows off different\n * selectors, so the prefix cannot live in the table.\n *\n * @internal\n */\nexport function wrPopoverPositions(position: WrPopoverPosition, paneClass: string): ConnectedPosition[] {\n return WR_POPOVER_FALLBACKS[position].map(name => ({\n ...WR_POPOVER_POSITIONS[name],\n panelClass: `${paneClass}--${name}`,\n }));\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, PLATFORM_ID, Service, inject } from '@angular/core';\n\n/** `FocusMonitor._setOrigin`'s own window — see the class docs for why it matches. */\nconst KEYSTROKE_WINDOW_MS = 1;\n\n/**\n * The key of the keystroke being handled RIGHT NOW — `null` between them.\n *\n * `FocusMonitor` answers \"the most recent input modality was a keyboard\", which\n * is a weaker statement than \"the user's own key put focus here\", and the gap\n * between the two is exactly where a tooltip goes wrong. The origin is whatever\n * was pressed within the last millisecond (`_setOrigin` clears it on a 1ms\n * timer), and an overlay dismissed with Escape hands focus BACK to its trigger\n * synchronously, inside that same keystroke — CDK's keyboard dispatcher listens\n * on `<body>` in the bubble phase, the modality detector on `document` in\n * capture, so the modality is always already `keyboard` by the time the drawer\n * runs. Same for a ✕ activated with Enter. So the CDK reports `keyboard` for a\n * hand-back and a tooltip reading the origin alone still shows itself unbidden,\n * which is the whole failure it was meant to stop.\n *\n * The KEY separates them: `Tab` and the arrows are how a user moves focus,\n * `Escape` and `Enter` dismiss and activate. A focus that lands during one of\n * those was moved by a script.\n *\n * One passive capture listener for the whole app, constructed with the first\n * `[wrPopover]` and never before it — beside the three `InputModalityDetector`\n * already installs.\n *\n * The key expires on the CDK's own 1ms window rather than on a bare macrotask,\n * and matching it is the point: the key is only ever read to EXPLAIN a keyboard\n * origin, so it must not run out while the origin it explains is still live. A\n * `setTimeout(0)` close would land in exactly that gap — key already forgotten,\n * origin still `keyboard` — and read as a Tab. Everything a keystroke does\n * synchronously, its default action and the click Enter dispatches included,\n * happens long before either timer; anything that waits past them is judged\n * `program` by the CDK and never reaches this question.\n *\n * Popover-local on purpose; no other component in the catalog asks this yet.\n */\n@Service()\nexport class WrCurrentKeystroke {\n private readonly doc = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private current: string | null = null;\n private clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** `KeyboardEvent.key` for the keystroke in flight, `null` outside one. */\n get key(): string | null {\n return this.current;\n }\n\n constructor() {\n if (!this.isBrowser) return;\n\n const record = (event: KeyboardEvent): void => {\n this.current = event.key;\n if (this.clearTimer) clearTimeout(this.clearTimer);\n this.clearTimer = setTimeout(() => (this.current = null), KEYSTROKE_WINDOW_MS);\n };\n\n // Capture, so the key is on record before any handler deeper in the tree\n // gets to move focus with it.\n this.doc.addEventListener('keydown', record, { capture: true, passive: true });\n this.destroyRef.onDestroy(() => {\n if (this.clearTimer) clearTimeout(this.clearTimer);\n this.doc.removeEventListener('keydown', record, { capture: true });\n });\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * Internal floating label rendered when `<… [wrPopover]=\"'…'\" mode=\"tooltip\">`\n * receives a string instead of a template. Not part of the public template\n * API — use the `WrPopover` directive in tooltip mode instead.\n *\n * @internal\n */\n@Component({\n selector: 'wr-popover-text',\n template: '{{ text() }}',\n encapsulation: ViewEncapsulation.None,\n // No `role=\"tooltip\"` here on purpose: the overlay pane this is attached to\n // is the element `aria-describedby` resolves to, and it carries the role.\n // Setting it here too nested one tooltip inside another.\n host: { class: 'wr-tooltip' },\n})\nexport class WrPopoverTextPanel {\n readonly text = input.required<string>();\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { type BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\nimport type { ComponentRef, TemplateRef } from '@angular/core';\nimport {\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n ViewContainerRef,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { useI18nText } from 'ngwr/i18n';\nimport {\n WR_OVERLAY,\n WR_RESPONSIVE_OVERLAYS,\n WrOutsideClick,\n wrFollowDirection,\n wrMirrorOffsets,\n wrPresentAsSheet,\n} from 'ngwr/overlay';\nimport { KEYS, numAttr } from 'ngwr/utils';\n\nimport { type WrPopoverPosition, wrPopoverPositions } from './interfaces';\nimport { WrCurrentKeystroke } from './internal/keystroke';\nimport { WrPopoverTextPanel } from './internal/text-panel';\n\n/**\n * Keys the USER moves focus with: Tab through the page, the arrows / Home /\n * End through a composite that roves its own tabindex.\n *\n * A roving arrow move is a script `.focus()` call too — the difference from a\n * dismissal is not who called `focus()` but whether the keystroke was a\n * NAVIGATION or an action. Anything absent from this list (Escape, Enter,\n * Space, a character) does something else for a living, so focus that lands\n * during one of them was placed by a script and a tooltip stays shut.\n */\nconst NAVIGATION_KEYS = new Set<string>([\n KEYS.TAB,\n KEYS.ARROW_UP,\n KEYS.ARROW_DOWN,\n KEYS.ARROW_LEFT,\n KEYS.ARROW_RIGHT,\n KEYS.HOME,\n KEYS.END,\n KEYS.PAGE_UP,\n KEYS.PAGE_DOWN,\n]);\n\n/**\n * Anchored content panel. The same directive covers two shapes:\n *\n * - **Popover** (default, `mode=\"popover\"`) — `[wrPopover]` takes a\n * `TemplateRef`. Opens on click or hover. Use for rich anchored content:\n * forms, summaries, menus.\n *\n * - **Tooltip** (`mode=\"tooltip\"`) — `[wrPopover]` takes a plain string.\n * Shown on hover and when the KEYBOARD puts focus on the trigger — never for\n * a `.focus()` call, which is what a dialog or drawer does when it hands\n * focus back. Dismissed when focus leaves / on pointer-leave / Escape. Uses\n * `aria-describedby` instead of `aria-haspopup` and is rendered into a small\n * dark text panel.\n *\n * Built on CDK Overlay so it auto-flips, closes on outside-click and Escape.\n *\n * @example\n * ```html\n * <!-- Popover with template content -->\n * <button wr-btn [wrPopover]=\"info\">Details</button>\n * <ng-template #info>\n * <div style=\"padding: 1rem; max-width: 18rem\">Anything you can render.</div>\n * </ng-template>\n *\n * <!-- Tooltip with plain text -->\n * <button wr-btn [wrPopover]=\"'Save changes'\" mode=\"tooltip\" position=\"top\">\n * Save\n * </button>\n * ```\n *\n * @see https://ngwr.dev/reference/components/popover\n */\nlet popoverUid = 0;\n\n@Directive({\n selector: '[wrPopover]',\n exportAs: 'wrPopover',\n host: {\n // Marks the trigger the way `[wrDropdown]` marks its own. Popover-mode\n // content is a `TemplateRef`, so it is always bound as `[wrPopover]=\"…\"`,\n // which leaves no attribute in the DOM at all, and a closed tooltip\n // publishes no ARIA either — so without this there is nothing to find a\n // trigger by. (Only the static string form, `wrPopover=\"text\"`, would be.)\n class: 'wr-popover-trigger',\n '[attr.aria-haspopup]': 'isTooltip() ? null : \"dialog\"',\n '[attr.aria-expanded]': 'isTooltip() ? null : isOpen()',\n '[attr.aria-controls]': '!isTooltip() && isOpen() ? panelId : null',\n '[attr.aria-describedby]': 'isTooltip() && isOpen() ? panelId : null',\n '(click)': 'onClick($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave($event)',\n // No `(focus)` / `(blur)` here: a tooltip answers the KEYBOARD, and a plain\n // focus event cannot say where the focus came from. `FocusMonitor` can — see\n // the constructor.\n '(keydown.escape)': 'onEscape()',\n },\n})\nexport class WrPopover {\n /**\n * Content to render inside the panel.\n * - In **popover** mode (default): pass a `TemplateRef`.\n * - In **tooltip** mode: pass a plain string.\n */\n readonly content = input.required<TemplateRef<unknown> | string>({ alias: 'wrPopover' });\n\n /**\n * Shape preset.\n *\n * - `'popover'` (default) — template content, click trigger, dialog\n * semantics.\n * - `'tooltip'` — text content, hover / keyboard-focus trigger,\n * `role=\"tooltip\"`, `aria-describedby` on the host.\n */\n readonly mode = input<'popover' | 'tooltip'>('popover');\n\n /**\n * How the popover opens. Ignored in tooltip mode — a tooltip is always hover\n * plus keyboard focus. @default 'click'\n */\n readonly trigger = input<'click' | 'hover'>('click');\n\n /** Anchor side. @default 'bottom' for popover, 'top' for tooltip */\n readonly position = input<WrPopoverPosition | null>(null);\n\n /** Tooltip only — delay before showing, in ms. @default 120 */\n readonly showDelay = input(120, { transform: numAttr(120) });\n\n /** Tooltip only — delay before hiding, in ms. @default 60 */\n readonly hideDelay = input(60, { transform: numAttr(60) });\n\n /**\n * Popover mode only — present the panel as a full-width bottom-sheet on\n * small viewports instead of an anchored panel. `undefined` follows the\n * app-wide `provideWrResponsiveOverlays()` setting; `true`/`false`\n * overrides it. Tooltips never become sheets. @default undefined\n */\n readonly responsive = input<boolean | undefined, BooleanInput>(undefined, {\n transform: (v: BooleanInput): boolean | undefined => (v == null ? undefined : coerceBooleanProperty(v)),\n });\n\n /**\n * Popover mode only — accessible name of the panel. `role=\"dialog\"` with no\n * name announces as a bare \"dialog\", so the catalog's `popover.label` is used\n * when nothing is given. A popover has no universal name; whenever the panel\n * has a heading or a purpose, pass it.\n */\n readonly ariaLabel = input<string | null>(null);\n\n /** Fires after the panel opens. */\n readonly opened = output<void>();\n\n /** Fires after the panel closes. */\n readonly closed = output<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly keystroke = inject(WrCurrentKeystroke);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly responsiveConfig = inject(WR_RESPONSIVE_OVERLAYS);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n /** @internal */\n readonly isOpen = signal(false);\n\n /** @internal */\n protected readonly isTooltip = computed(() => this.mode() === 'tooltip');\n\n /** Auto-generated id for `aria-controls` / `aria-describedby`. */\n protected readonly panelId = `wr-popover-${++popoverUid}`;\n\n private readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'popover.label', 'Popover');\n\n private readonly resolvedPosition = computed<WrPopoverPosition>(\n () => this.position() ?? (this.isTooltip() ? 'top' : 'bottom')\n );\n\n private overlayRef: OverlayRef | null = null;\n private textPanelRef: ComponentRef<WrPopoverTextPanel> | null = null;\n /** Whether the HOST itself holds focus — not a descendant of it. */\n private hostFocused = false;\n private hoverCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.openOverlay();\n } else {\n this.closeOverlay();\n }\n });\n // The tooltip string is pushed into the panel when the panel is created, and\n // `openOverlay()` returns early while one is already up — so a `content()`\n // change with the tooltip on screen never reached it and the label stayed on\n // the string it opened with (hover a Copy button, click it, it still reads\n // \"Copy\"). Keeping the ref and pushing from an effect is how `wr-date-picker`\n // feeds its own panel refs.\n effect(() => {\n const content = this.content();\n this.textPanelRef?.setInput('text', typeof content === 'string' ? content : '');\n });\n // A tooltip answers the USER'S KEYBOARD, not every focus there is.\n //\n // `(focus)` fired for a programmatic one too, and something hands focus back\n // to a trigger constantly: `WrDrawer` and `WrDialog` restore the element that\n // was active when they opened, this directive does the same for its own\n // popover, and any app may call `.focus()`. So closing a drawer opened from a\n // button with a tooltip re-showed that tooltip with NOTHING left to dismiss\n // it — the pointer is elsewhere, so no `mouseleave`, and focus stays on the\n // button, so no blur. A pane stranded under the trigger, reported from a real\n // app. The event alone cannot tell those apart; `FocusMonitor` is the CDK's\n // answer to where a focus came from, and it is what Material's tooltip reads\n // for the same reason. Mouse and touch origins are deliberately ignored:\n // hover already drives both, and acting on them would show the tooltip twice\n // over.\n //\n // The origin alone is NOT enough, though, and reading it as if it were leaves\n // the reported bug half open: the CDK's `keyboard` means \"a key went down\n // within the last millisecond\", and the dismissal that hands focus back is\n // itself a keystroke — Escape on a drawer, Enter on its ✕. See\n // `WrCurrentKeystroke` for the key that tells a navigation from a dismissal.\n //\n // Monitored in EVERY mode rather than only under `mode=\"tooltip\"` — the mode\n // is an input and may flip after this runs, and a subscription that only\n // half-exists is the failure this fix is about. The handler asks instead. The\n // cost is the CDK's own `cdk-*-focused` classes on the host, which nothing in\n // ngwr styles.\n //\n // `afterNextRender` because monitoring binds document listeners: there is no\n // DOM to bind them to on the server.\n afterNextRender(() => {\n this.focusMonitor\n .monitor(this.host)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(origin => {\n if (origin) {\n this.hostFocused = true;\n if (this.isTooltip() && origin === 'keyboard' && this.fromNavigationKey()) this.scheduleShow();\n return;\n }\n // A null origin is a blur, and the CDK reports one for a DESCENDANT\n // too: `_onFocus` bails when the event target is not the monitored\n // element, `_onBlur` has no such guard. The old `(blur)` binding never\n // bubbled, so hiding on one is new — hover a wrapper, click the button\n // inside it, tab away, and the tooltip the POINTER opened vanished\n // while the pointer never moved. Only the host's own focus counts.\n if (!this.hostFocused) return;\n this.hostFocused = false;\n if (this.isTooltip()) this.scheduleHide();\n });\n });\n this.destroyRef.onDestroy(() => {\n this.clearTimers();\n this.closeOverlay(false);\n // Completes the subject `monitor()` handed out and drops the global\n // listeners it registered for this element; the pipe above unsubscribes\n // either way, but the CDK's own bookkeeping only clears from here.\n this.focusMonitor.stopMonitoring(this.host);\n });\n }\n\n open(): void {\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n this.isOpen.update(v => !v);\n }\n\n // Host listeners\n\n /** @internal */\n protected onClick(event: MouseEvent): void {\n if (this.isTooltip() || this.trigger() !== 'click') return;\n event.stopPropagation();\n this.toggle();\n }\n\n /** @internal */\n protected onMouseEnter(): void {\n if (this.isTooltip()) {\n this.scheduleShow();\n return;\n }\n if (this.trigger() !== 'hover') return;\n this.clearHoverClose();\n this.isOpen.set(true);\n }\n\n /** @internal */\n protected onMouseLeave(event: MouseEvent): void {\n const related = event.relatedTarget as Node | null;\n if (this.isTooltip()) {\n // Crossing straight from the trigger onto the panel does not even arm the\n // hide, the same bail-out the popover arm below has had. The panel's own\n // `mouseenter` would cancel it a moment later anyway; not arming it is\n // what removes the race.\n if (related && this.overlayRef?.overlayElement.contains(related)) return;\n this.scheduleHide();\n return;\n }\n if (this.trigger() !== 'hover') return;\n if (related && this.overlayRef?.overlayElement.contains(related)) return;\n // Delay so the pointer can cross the gap between trigger and panel —\n // entering the panel cancels the close (see attach listeners).\n this.scheduleHoverClose();\n }\n\n /** @internal */\n protected onEscape(): void {\n if (!this.isTooltip()) return;\n this.clearTimers();\n this.isOpen.set(false);\n }\n\n /**\n * Whether the keystroke in flight is one the user moves focus with.\n *\n * Asked only of a `keyboard` origin, which the CDK grants to any focus landing\n * within a millisecond of a keydown — including the hand-back a drawer\n * performs while Escape is still being handled. That is the reported bug's\n * keyboard half, and the origin cannot see it.\n *\n * NO key on record answers `true`, and that polarity is chosen rather than\n * inherited: a keyboard modality with no keystroke behind it is a screen\n * reader's virtual cursor (the CDK reads its synthetic mousedown as\n * `keyboard`) or a deliberate `focusVia(el, 'keyboard')`, and both are the\n * user. Refusing wants positive evidence of a key that does something other\n * than navigate — silence must not cost an AT user the hint. The two windows\n * are aligned so that \"keyboard origin, no key\" cannot mean \"the key just\n * expired\"; what it does still admit is a `FocusMonitorDetectionMode.EVENTUAL`\n * app, where the CDK never expires an origin at all.\n */\n private fromNavigationKey(): boolean {\n const key = this.keystroke.key;\n return key === null || NAVIGATION_KEYS.has(key);\n }\n\n // Tooltip timers\n\n private scheduleShow(): void {\n if (this.isOpen()) {\n this.clearTimers();\n return;\n }\n const text = this.content();\n if (typeof text === 'string' && !text) return;\n this.clearTimers();\n this.showTimer = setTimeout(() => this.isOpen.set(true), this.showDelay());\n }\n\n private scheduleHide(): void {\n this.clearTimers();\n this.hideTimer = setTimeout(() => this.isOpen.set(false), this.hideDelay());\n }\n\n private clearTimers(): void {\n if (this.showTimer) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n // Overlay\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n\n const tooltip = this.isTooltip();\n const position = this.resolvedPosition();\n\n // Sheet presentation is popover-only — tooltips are transient labels and\n // never dock to the bottom. On small viewports (when opted in) detach\n // from the trigger and slide the panel up from the bottom edge.\n const asSheet = !tooltip && wrPresentAsSheet(this.responsive(), this.responsiveConfig);\n const paneClass = tooltip ? 'wr-tooltip-overlay' : 'wr-popover-overlay';\n\n // Kept as its own binding rather than inlined into the ternary: it is the\n // half a direction flip has to rebuild, and a sheet — anchored to nothing —\n // has no list at all, which is what `null` says here.\n const connected = asSheet\n ? null\n : this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(wrMirrorOffsets(wrPopoverPositions(position, paneClass), this.isRtl()))\n .withPush(true);\n\n const positionStrategy = connected ?? this.overlay.position().global().centerHorizontally().bottom('0');\n\n // The `--<placement>` half is no longer set here: each fallback position\n // carries its own, so the pane names the placement it landed on instead of\n // the one that was requested, and the arrow follows a flip. A sheet has no\n // anchor and so no placement class at all.\n const overlayClass = asSheet ? [paneClass, 'wr-overlay-sheet'] : [paneClass];\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: asSheet ? this.scrollStrategies.block() : this.scrollStrategies.reposition(),\n width: asSheet ? '100%' : undefined,\n hasBackdrop: asSheet,\n backdropClass: asSheet ? 'wr-overlay-backdrop' : undefined,\n panelClass: overlayClass,\n });\n\n // The CDK read the direction once, just now, and will never look again — so\n // an app that flips while this panel is up mirrors the page around a pane\n // still rendering `ltr`, with `wr-segmented` and friends inside it already\n // laying themselves out the other way. Rebuilding the list matters as much\n // as the attribute: `wrMirrorOffsets` turned the 8px gap around at open, and\n // an unmirrored offset puts a side-placed panel back on top of its trigger.\n // A sheet has no list, and `connected?.` is what says so — the arguments are\n // never evaluated for one.\n wrFollowDirection(this.overlayRef, this.dir, this.injector, direction =>\n connected?.withPositions(wrMirrorOffsets(wrPopoverPositions(position, paneClass), direction === 'rtl'))\n );\n\n if (asSheet) {\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isOpen.set(false));\n }\n\n const content = this.content();\n\n if (tooltip) {\n // Text content rendered via the internal text panel — accepts a\n // string and wraps it in the `.wr-tooltip` shell.\n const text = typeof content === 'string' ? content : '';\n const ref = this.overlayRef.attach(new ComponentPortal(WrPopoverTextPanel, this.vcr));\n ref.setInput('text', text);\n this.textPanelRef = ref;\n // The pane is the element `aria-describedby` points at (it carries\n // `panelId`), so this is the role that has to be `tooltip` — the inner\n // `wr-popover-text` host deliberately carries none, or the description\n // would be a tooltip nested inside a tooltip.\n this.overlayRef.overlayElement.setAttribute('role', 'tooltip');\n } else if (typeof content !== 'string') {\n const view = this.overlayRef.attach(new TemplatePortal(content, this.vcr));\n const pane = this.overlayRef.overlayElement;\n // Popover mode is a non-modal dialog: the docstring promised dialog\n // semantics but nothing ever set a role, so a screen reader met an\n // unnamed generic container. `aria-modal=\"false\"` is explicit — focus is\n // deliberately NOT trapped, the panel closes on outside click / Escape.\n pane.setAttribute('role', 'dialog');\n pane.setAttribute('aria-modal', 'false');\n // A named dialog: `role=\"dialog\"` with no name announces as a bare\n // \"dialog\" and trips axe's `aria-dialog-name`.\n pane.setAttribute('aria-label', this.resolvedAriaLabel());\n\n if (this.trigger() === 'click') {\n // Render the projected content before focus moves, the way\n // `wr-popconfirm` does — a reader announcing the dialog reads what is in\n // it, and on an empty pane that is nothing.\n view.detectChanges();\n // Focus has to ENTER the panel. The overlay container sits at the end of\n // `<body>`, so Tab from the trigger went to the next control on the page\n // and left the dialog stranded behind it (WCAG F85). The pane takes it\n // rather than the first control inside: a popover's content is\n // arbitrary, and landing on a text field would raise the on-screen\n // keyboard and skip whatever the panel says above it. Tab from the pane\n // reaches that first control anyway, since the pane precedes its own\n // content in document order.\n //\n // Click-triggered only — a hover popover must not pull the caret out of\n // what the user is typing in, and `scheduleHoverClose()` would then\n // dispose the pane out from under the focused element.\n pane.tabIndex = -1;\n pane.focus();\n }\n }\n this.overlayRef.overlayElement.id = this.panelId;\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.isOpen.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.isOpen.set(false);\n }\n });\n\n // Both hover shapes keep the panel up while the pointer is on it: for a\n // popover so the pointer can cross the gap, for a tooltip because WCAG\n // 1.4.13 requires it (Hoverable).\n if (tooltip || this.trigger() === 'hover') {\n this.overlayRef.overlayElement.addEventListener('mouseenter', this.onOverlayEnter);\n this.overlayRef.overlayElement.addEventListener('mouseleave', this.onOverlayLeave);\n }\n\n this.opened.emit();\n }\n\n /**\n * Tear the overlay down, and tell the host — unless the host is going away\n * with it.\n *\n * `notify: false` is the DESTROY path, and it is not a nicety. An `output()`\n * belongs to the view that declares it, so emitting from `onDestroy` is\n * refused: Angular logs `NG0953: Unexpected emit for destroyed OutputRef` and\n * the listener never runs. Measured — a `(closed)` handler on a dropdown whose\n * host view is removed while the menu is open fired zero times and left a\n * console error behind. There is nobody to notify at that point, because the\n * consumer's own view is being torn down in the same pass; `wr-popconfirm`\n * already disposes without emitting, and this brings the other two into line.\n *\n * The focus hand-back is skipped for the same reason — the host element is on\n * its way out of the document.\n */\n private closeOverlay(notify = true): void {\n if (!this.overlayRef) return;\n if (this.isTooltip() || this.trigger() === 'hover') {\n this.overlayRef.overlayElement.removeEventListener('mouseenter', this.onOverlayEnter);\n this.overlayRef.overlayElement.removeEventListener('mouseleave', this.onOverlayLeave);\n }\n this.clearHoverClose();\n // Take the focus back before the pane goes, and only if it was in there.\n //\n // A popover is not a tooltip: it attaches a `TemplatePortal` under\n // `role=\"dialog\"`, so a form or a menu inside it is the point, and Escape\n // arrives through the overlay's `keydownEvents()` no matter where the caret\n // is. Disposing with focus inside dropped it on `<body>`, and the next Tab\n // restarted from the top of the document. `wr-date-picker` and\n // `wr-popconfirm` already guard it exactly this way; leaving focus alone\n // when it had already moved is what stops the close from fighting the user\n // for the caret.\n const pane = this.overlayRef.overlayElement;\n const focusWasInside = pane.contains(this.host.nativeElement.ownerDocument.activeElement);\n this.overlayRef.dispose();\n this.overlayRef = null;\n // Disposing destroys the panel component; a retained ref would pin its view.\n this.textPanelRef = null;\n if (notify) {\n if (focusWasInside) this.host.nativeElement.focus();\n this.closed.emit();\n }\n }\n\n private readonly onOverlayLeave = (event: MouseEvent): void => {\n const related = event.relatedTarget as Node | null;\n if (related && this.host.nativeElement.contains(related)) return;\n // A tooltip leaves on its own `hideDelay`, the same one the trigger uses; a\n // hover popover has the longer grace period for crossing the gap back.\n if (this.isTooltip()) this.scheduleHide();\n else this.scheduleHoverClose();\n };\n\n private readonly onOverlayEnter = (): void => {\n // Two different timers can be in flight: `hideTimer`, armed by the trigger's\n // own `mouseleave` in tooltip mode, and `hoverCloseTimer` in popover mode.\n // Cancelling only the second would leave a tooltip disappearing `hideDelay`\n // after the pointer arrived on it.\n this.clearTimers();\n this.clearHoverClose();\n };\n\n private scheduleHoverClose(): void {\n this.clearHoverClose();\n this.hoverCloseTimer = setTimeout(() => this.isOpen.set(false), 120);\n }\n\n private clearHoverClose(): void {\n if (this.hoverCloseTimer) {\n clearTimeout(this.hoverCloseTimer);\n this.hoverCloseTimer = null;\n }\n }\n\n /**\n * Whether the app reads right-to-left.\n *\n * Optional inject: `Directionality` is root-provided, so this is never null in\n * an app — but a bare `TestBed` that provides nothing should still get a\n * component that works, and defaulting to LTR is the honest fallback.\n */\n private isRtl(): boolean {\n return this.dir?.value === 'rtl';\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -42,10 +42,10 @@ class WrProgress {
|
|
|
42
42
|
...(ngDevMode ? [{ debugName: "clamped" }] : /* istanbul ignore next */ []));
|
|
43
43
|
classes = computed(() => `wr-progress wr-progress--${this.color()}`, /* @ts-ignore */
|
|
44
44
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
45
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
46
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
45
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrProgress, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
46
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: WrProgress, isStandalone: true, selector: "wr-progress", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar", "aria-valuemin": "0", "aria-valuemax": "100" }, properties: { "attr.aria-valuenow": "clamped()", "attr.aria-label": "resolvedAriaLabel()", "class": "classes()" } }, ngImport: i0, template: `<div class="wr-progress__bar" [style.width.%]="clamped()"></div>`, isInline: true, encapsulation: i0.ViewEncapsulation.None });
|
|
47
47
|
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrProgress, decorators: [{
|
|
49
49
|
type: Component,
|
|
50
50
|
args: [{
|
|
51
51
|
selector: 'wr-progress',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-progress.mjs","sources":["../../../projects/lib/progress/progress.ts","../../../projects/lib/progress/ngwr-progress.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\n\nimport { useI18nText } from 'ngwr/i18n';\nimport type { WrColor } from 'ngwr/theme';\n\n/**\n * Horizontal progress bar.\n *\n * @example\n * ```html\n * <wr-progress [value]=\"42\" />\n * <wr-progress color=\"success\" [value]=\"80\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/progress\n */\n@Component({\n selector: 'wr-progress',\n template: `<div class=\"wr-progress__bar\" [style.width.%]=\"clamped()\"></div>`,\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[attr.aria-valuenow]': 'clamped()',\n '[attr.aria-label]': 'resolvedAriaLabel()',\n '[class]': 'classes()',\n },\n})\nexport class WrProgress {\n /** Accessible name — `role=\"progressbar\"` needs one. Falls back to `progress.label`. */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'progress.label', 'Progress');\n\n /**\n * Bar color.\n *\n * @default 'primary'\n */\n readonly color = input<WrColor>('primary');\n\n /**\n * Progress value, clamped to `[0, 100]`.\n *\n * @default 0\n */\n readonly value = input(0, { transform: (v: unknown): number => coerceNumberProperty(v, 0) });\n\n protected readonly clamped = computed(() => Math.max(0, Math.min(100, this.value())));\n\n protected readonly classes = computed(() => `wr-progress wr-progress--${this.color()}`);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA;;;;;AAKG;AAQH;;;;;;;;;;AAUG;MAcU,UAAU,CAAA;;IAEZ,SAAS,GAAG,KAAK,CAAgB,IAAI;kFAAC;IAE5B,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,CAAC;AAEhG;;;;AAIG;IACM,KAAK,GAAG,KAAK,CAAU,SAAS;8EAAC;AAE1C;;;;AAIG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,OAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAEzE,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gFAAC;IAElE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,yBAAA,EAA4B,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;gFAAC;uGAtB5E,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,ypBAXX,CAAA,gEAAA,CAAkE,EAAA,QAAA,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAWjE,UAAU,EAAA,UAAA,EAAA,CAAA;kBAbtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,QAAQ,EAAE,CAAA,gEAAA,CAAkE;oBAC5E,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,eAAe,EAAE,GAAG;AACpB,wBAAA,eAAe,EAAE,KAAK;AACtB,wBAAA,sBAAsB,EAAE,WAAW;AACnC,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;;ACpCD;;AAEG
|
|
1
|
+
{"version":3,"file":"ngwr-progress.mjs","sources":["../../../projects/lib/progress/progress.ts","../../../projects/lib/progress/ngwr-progress.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\n\nimport { useI18nText } from 'ngwr/i18n';\nimport type { WrColor } from 'ngwr/theme';\n\n/**\n * Horizontal progress bar.\n *\n * @example\n * ```html\n * <wr-progress [value]=\"42\" />\n * <wr-progress color=\"success\" [value]=\"80\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/progress\n */\n@Component({\n selector: 'wr-progress',\n template: `<div class=\"wr-progress__bar\" [style.width.%]=\"clamped()\"></div>`,\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[attr.aria-valuenow]': 'clamped()',\n '[attr.aria-label]': 'resolvedAriaLabel()',\n '[class]': 'classes()',\n },\n})\nexport class WrProgress {\n /** Accessible name — `role=\"progressbar\"` needs one. Falls back to `progress.label`. */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'progress.label', 'Progress');\n\n /**\n * Bar color.\n *\n * @default 'primary'\n */\n readonly color = input<WrColor>('primary');\n\n /**\n * Progress value, clamped to `[0, 100]`.\n *\n * @default 0\n */\n readonly value = input(0, { transform: (v: unknown): number => coerceNumberProperty(v, 0) });\n\n protected readonly clamped = computed(() => Math.max(0, Math.min(100, this.value())));\n\n protected readonly classes = computed(() => `wr-progress wr-progress--${this.color()}`);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA;;;;;AAKG;AAQH;;;;;;;;;;AAUG;MAcU,UAAU,CAAA;;IAEZ,SAAS,GAAG,KAAK,CAAgB,IAAI;kFAAC;IAE5B,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,CAAC;AAEhG;;;;AAIG;IACM,KAAK,GAAG,KAAK,CAAU,SAAS;8EAAC;AAE1C;;;;AAIG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,OAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAEzE,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gFAAC;IAElE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,yBAAA,EAA4B,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;gFAAC;uGAtB5E,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,ypBAXX,CAAA,gEAAA,CAAkE,EAAA,QAAA,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAWjE,UAAU,EAAA,UAAA,EAAA,CAAA;kBAbtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,QAAQ,EAAE,CAAA,gEAAA,CAAkE;oBAC5E,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,eAAe,EAAE,GAAG;AACpB,wBAAA,eAAe,EAAE,KAAK;AACtB,wBAAA,sBAAsB,EAAE,WAAW;AACnC,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;;ACpCD;;AAEG;;"}
|
|
@@ -164,10 +164,10 @@ class WrPullToRefresh {
|
|
|
164
164
|
this.refresh.emit();
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
168
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
167
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrPullToRefresh, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
168
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: WrPullToRefresh, isStandalone: true, selector: "wr-pull-to-refresh", inputs: { refreshing: { classPropertyName: "refreshing", publicName: "refreshing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { refresh: "refresh" }, host: { listeners: { "touchstart": "onTouchStart($event)", "touchmove": "onTouchMove($event)", "touchend": "onTouchEnd()", "touchcancel": "onTouchCancel()" }, properties: { "class.wr-pull-to-refresh--animating": "!dragging()" }, classAttribute: "wr-pull-to-refresh" }, ngImport: i0, template: "@if (distance() > 0 || refreshing()) {\n <div class=\"wr-pull-to-refresh__indicator\" [style.height.px]=\"distance()\" aria-hidden=\"true\">\n <wr-spinner class=\"wr-pull-to-refresh__spinner\" size=\"sm\" [style.opacity]=\"progress()\" />\n </div>\n}\n<div class=\"wr-pull-to-refresh__content\" [style.transform]=\"contentTransform()\">\n <ng-content />\n</div>\n", dependencies: [{ kind: "component", type: WrSpinner, selector: "wr-spinner", inputs: ["size", "ariaLabel"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
169
169
|
}
|
|
170
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
170
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrPullToRefresh, decorators: [{
|
|
171
171
|
type: Component,
|
|
172
172
|
args: [{ selector: 'wr-pull-to-refresh', encapsulation: ViewEncapsulation.None, host: {
|
|
173
173
|
class: 'wr-pull-to-refresh',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-pull-to-refresh.mjs","sources":["../../../projects/lib/pull-to-refresh/pull-to-refresh.ts","../../../projects/lib/pull-to-refresh/pull-to-refresh.html","../../../projects/lib/pull-to-refresh/ngwr-pull-to-refresh.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nimport { WrHaptics } from 'ngwr/platform';\nimport { WrSpinner } from 'ngwr/spinner';\nimport { numAttr } from 'ngwr/utils';\n\n/**\n * Pull-to-refresh wrapper. Make its own content scrollable (give it a height /\n * `max-height`), and when the user drags down from the very top past\n * `threshold` and lets go, `refresh` fires.\n *\n * It is a **controlled** spinner: bind `refreshing` — set it `true` in your\n * `refresh` handler and `false` once the async work settles, and the indicator\n * holds open until then. Setting `refreshing` `true` yourself (without a pull)\n * shows the spinner too, so it doubles as a programmatic \"reloading\" state.\n *\n * Touch-only by design (the gesture is meaningless with a mouse); it lives\n * beside native scrolling — a pull only starts at `scrollTop === 0`, otherwise\n * the list scrolls as usual. Fires a light {@link WrHaptics} tap when the pull\n * arms. `overscroll-behavior` stops the browser's own pull-to-refresh from\n * fighting it.\n *\n * @example\n * ```html\n * <wr-pull-to-refresh style=\"height: 20rem\" [refreshing]=\"loading()\" (refresh)=\"reload()\">\n * @for (item of items(); track item.id) {\n * <div class=\"row\">{{ item.label }}</div>\n * }\n * </wr-pull-to-refresh>\n * ```\n * ```ts\n * reload(): void {\n * this.loading.set(true);\n * this.api.fetch().subscribe((rows) => {\n * this.items.set(rows);\n * this.loading.set(false); // closes the indicator\n * });\n * }\n * ```\n *\n * @see https://ngwr.dev/reference/components/pull-to-refresh\n */\n@Component({\n selector: 'wr-pull-to-refresh',\n templateUrl: './pull-to-refresh.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-pull-to-refresh',\n '[class.wr-pull-to-refresh--animating]': '!dragging()',\n '(touchstart)': 'onTouchStart($event)',\n '(touchmove)': 'onTouchMove($event)',\n '(touchend)': 'onTouchEnd()',\n '(touchcancel)': 'onTouchCancel()',\n },\n imports: [WrSpinner],\n})\nexport class WrPullToRefresh {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly haptics = inject(WrHaptics);\n\n /**\n * Whether the refresh is in flight — drives the spinner. Set `true` in your\n * `refresh` handler and `false` when the work resolves. @default false\n */\n readonly refreshing = input(false, { transform: coerceBooleanProperty });\n\n /** Disable the gesture entirely. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Distance (px) the pull must reach for a release to trigger `refresh`. @default 64 */\n readonly threshold = input(64, { transform: numAttr(64) });\n\n /** Fires once each time the user pulls past `threshold` and releases. */\n readonly refresh = output<void>();\n\n protected readonly distance = signal(0);\n protected readonly dragging = signal(false);\n\n protected readonly thresholdPx = computed(() => Math.max(24, this.threshold()));\n protected readonly armed = computed(() => this.distance() >= this.thresholdPx());\n protected readonly progress = computed(() => Math.min(1, this.distance() / this.thresholdPx()));\n protected readonly contentTransform = computed(() =>\n this.distance() > 0 ? `translateY(${this.distance()}px)` : null\n );\n\n private startY = 0;\n private canPull = false;\n\n constructor() {\n // Resting height is DERIVED from `refreshing`, not latched on an edge: held\n // open at the threshold while a refresh is in flight (including a purely\n // programmatic `refreshing = true`), closed otherwise. An active drag owns\n // `distance` directly, so the effect yields while `dragging`. Deriving from\n // the current value — rather than waiting to observe a true -> false\n // transition — means a synchronous refresh (one that never keeps\n // `refreshing` truthy for a change-detection cycle) still settles closed\n // instead of sticking open.\n effect(() => {\n const refreshing = this.refreshing();\n const dragging = this.dragging();\n if (dragging) return;\n untracked(() => this.distance.set(refreshing ? this.thresholdPx() : 0));\n });\n }\n\n protected onTouchStart(event: TouchEvent): void {\n if (this.disabled() || this.refreshing()) return;\n // A second finger arriving mid-pull would re-read `touches[0]` — the first\n // finger, at its CURRENT position — as the new origin, collapsing the pull\n // the user is halfway through.\n if (event.touches.length > 1) return;\n const touch = event.touches[0];\n if (!touch) return;\n // A pull only begins when the scroller is already at the top.\n this.canPull = this.el.nativeElement.scrollTop <= 0;\n this.startY = touch.clientY;\n }\n\n protected onTouchMove(event: TouchEvent): void {\n // Turned off or a refresh started mid-gesture: abort the drag and let the\n // effect settle the indicator (otherwise the drag is left frozen).\n if (this.disabled() || this.refreshing()) {\n if (this.dragging()) this.dragging.set(false);\n this.canPull = false;\n return;\n }\n if (!this.canPull) return;\n const touch = event.touches[0];\n if (!touch) return;\n const dy = touch.clientY - this.startY;\n // Pulling up, or the content has scrolled off the top — hand back to\n // native scrolling and drop any partial pull.\n if (dy <= 0 || this.el.nativeElement.scrollTop > 0) {\n if (this.dragging()) this.dragging.set(false);\n this.distance.set(0);\n this.canPull = this.el.nativeElement.scrollTop <= 0;\n return;\n }\n // Actively pulling down at the top: take over from native scroll.\n event.preventDefault();\n const wasArmed = this.armed();\n this.dragging.set(true);\n // Halve the finger travel for a rubber-band feel, capped past threshold.\n this.distance.set(Math.min(dy * 0.5, this.thresholdPx() * 1.75));\n // A light tap the instant the pull arms, so it's felt without looking.\n if (!wasArmed && this.armed()) this.haptics.impact('light');\n }\n\n /**\n * A cancelled touch is an ABANDONED pull, not a completed one — the system took\n * the gesture away (a call, a notification, a palm on the bezel). Routing it\n * through `onTouchEnd` refreshed the list on an interruption the user did not\n * ask for and could not take back.\n */\n protected onTouchCancel(): void {\n this.dragging.set(false);\n this.canPull = false;\n }\n\n protected onTouchEnd(): void {\n if (!this.dragging()) return;\n // Capture the arm state before releasing — `distance` still holds the pull.\n const armed = this.armed();\n this.dragging.set(false);\n this.canPull = false;\n // Only a genuine armed release on an enabled, idle control refreshes.\n // Either way the effect settles `distance` (open iff `refreshing`).\n if (armed && !this.disabled() && !this.refreshing()) {\n this.refresh.emit();\n }\n }\n}\n","@if (distance() > 0 || refreshing()) {\n <div class=\"wr-pull-to-refresh__indicator\" [style.height.px]=\"distance()\" aria-hidden=\"true\">\n <wr-spinner class=\"wr-pull-to-refresh__spinner\" size=\"sm\" [style.opacity]=\"progress()\" />\n </div>\n}\n<div class=\"wr-pull-to-refresh__content\" [style.transform]=\"contentTransform()\">\n <ng-content />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAAA;;;;;AAKG;AAoBH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MAeU,eAAe,CAAA;AACT,IAAA,EAAE,GAAG,MAAM,CAA0B,UAAU,CAAC;AAChD,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAE5C;;;AAGG;IACM,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;;IAG/D,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;;AAG7D,IAAA,SAAS,GAAG,KAAK,CAAC,EAAE,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,EAAA,CAAG;;IAGjD,OAAO,GAAG,MAAM,EAAQ;IAEd,QAAQ,GAAG,MAAM,CAAC,CAAC;iFAAC;IACpB,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;AAExB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;oFAAC;AAC5D,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;8EAAC;IAC7D,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;iFAAC;IAC5E,gBAAgB,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,EAAE,CAAA,GAAA,CAAK,GAAG,IAAI;yFAChE;IAEO,MAAM,GAAG,CAAC;IACV,OAAO,GAAG,KAAK;AAEvB,IAAA,WAAA,GAAA;;;;;;;;;QASE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,IAAI,QAAQ;gBAAE;YACd,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;AACzE,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,YAAY,CAAC,KAAiB,EAAA;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;;;;AAI1C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK;YAAE;;AAEZ,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,IAAI,CAAC;AACnD,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;IAC7B;AAEU,IAAA,WAAW,CAAC,KAAiB,EAAA;;;QAGrC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACxC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB;QACF;QACA,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;;;AAGtC,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC,EAAE;YAClD,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,IAAI,CAAC;YACnD;QACF;;QAEA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;QAEvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC;;AAEhE,QAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7D;AAEA;;;;;AAKG;IACO,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;IACtB;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;;AAEtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;;AAGpB,QAAA,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACnD,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB;IACF;uGAlHW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qCAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3E5B,mXAQA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDiEY,SAAS,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAER,eAAe,EAAA,UAAA,EAAA,CAAA;kBAd3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,aAAA,EAEf,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,uCAAuC,EAAE,aAAa;AACtD,wBAAA,cAAc,EAAE,sBAAsB;AACtC,wBAAA,aAAa,EAAE,qBAAqB;AACpC,wBAAA,YAAY,EAAE,cAAc;AAC5B,wBAAA,eAAe,EAAE,iBAAiB;qBACnC,EAAA,OAAA,EACQ,CAAC,SAAS,CAAC,EAAA,QAAA,EAAA,mXAAA,EAAA;;;AEzEtB;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ngwr-pull-to-refresh.mjs","sources":["../../../projects/lib/pull-to-refresh/pull-to-refresh.ts","../../../projects/lib/pull-to-refresh/pull-to-refresh.html","../../../projects/lib/pull-to-refresh/ngwr-pull-to-refresh.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nimport { WrHaptics } from 'ngwr/platform';\nimport { WrSpinner } from 'ngwr/spinner';\nimport { numAttr } from 'ngwr/utils';\n\n/**\n * Pull-to-refresh wrapper. Make its own content scrollable (give it a height /\n * `max-height`), and when the user drags down from the very top past\n * `threshold` and lets go, `refresh` fires.\n *\n * It is a **controlled** spinner: bind `refreshing` — set it `true` in your\n * `refresh` handler and `false` once the async work settles, and the indicator\n * holds open until then. Setting `refreshing` `true` yourself (without a pull)\n * shows the spinner too, so it doubles as a programmatic \"reloading\" state.\n *\n * Touch-only by design (the gesture is meaningless with a mouse); it lives\n * beside native scrolling — a pull only starts at `scrollTop === 0`, otherwise\n * the list scrolls as usual. Fires a light {@link WrHaptics} tap when the pull\n * arms. `overscroll-behavior` stops the browser's own pull-to-refresh from\n * fighting it.\n *\n * @example\n * ```html\n * <wr-pull-to-refresh style=\"height: 20rem\" [refreshing]=\"loading()\" (refresh)=\"reload()\">\n * @for (item of items(); track item.id) {\n * <div class=\"row\">{{ item.label }}</div>\n * }\n * </wr-pull-to-refresh>\n * ```\n * ```ts\n * reload(): void {\n * this.loading.set(true);\n * this.api.fetch().subscribe((rows) => {\n * this.items.set(rows);\n * this.loading.set(false); // closes the indicator\n * });\n * }\n * ```\n *\n * @see https://ngwr.dev/reference/components/pull-to-refresh\n */\n@Component({\n selector: 'wr-pull-to-refresh',\n templateUrl: './pull-to-refresh.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-pull-to-refresh',\n '[class.wr-pull-to-refresh--animating]': '!dragging()',\n '(touchstart)': 'onTouchStart($event)',\n '(touchmove)': 'onTouchMove($event)',\n '(touchend)': 'onTouchEnd()',\n '(touchcancel)': 'onTouchCancel()',\n },\n imports: [WrSpinner],\n})\nexport class WrPullToRefresh {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly haptics = inject(WrHaptics);\n\n /**\n * Whether the refresh is in flight — drives the spinner. Set `true` in your\n * `refresh` handler and `false` when the work resolves. @default false\n */\n readonly refreshing = input(false, { transform: coerceBooleanProperty });\n\n /** Disable the gesture entirely. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Distance (px) the pull must reach for a release to trigger `refresh`. @default 64 */\n readonly threshold = input(64, { transform: numAttr(64) });\n\n /** Fires once each time the user pulls past `threshold` and releases. */\n readonly refresh = output<void>();\n\n protected readonly distance = signal(0);\n protected readonly dragging = signal(false);\n\n protected readonly thresholdPx = computed(() => Math.max(24, this.threshold()));\n protected readonly armed = computed(() => this.distance() >= this.thresholdPx());\n protected readonly progress = computed(() => Math.min(1, this.distance() / this.thresholdPx()));\n protected readonly contentTransform = computed(() =>\n this.distance() > 0 ? `translateY(${this.distance()}px)` : null\n );\n\n private startY = 0;\n private canPull = false;\n\n constructor() {\n // Resting height is DERIVED from `refreshing`, not latched on an edge: held\n // open at the threshold while a refresh is in flight (including a purely\n // programmatic `refreshing = true`), closed otherwise. An active drag owns\n // `distance` directly, so the effect yields while `dragging`. Deriving from\n // the current value — rather than waiting to observe a true -> false\n // transition — means a synchronous refresh (one that never keeps\n // `refreshing` truthy for a change-detection cycle) still settles closed\n // instead of sticking open.\n effect(() => {\n const refreshing = this.refreshing();\n const dragging = this.dragging();\n if (dragging) return;\n untracked(() => this.distance.set(refreshing ? this.thresholdPx() : 0));\n });\n }\n\n protected onTouchStart(event: TouchEvent): void {\n if (this.disabled() || this.refreshing()) return;\n // A second finger arriving mid-pull would re-read `touches[0]` — the first\n // finger, at its CURRENT position — as the new origin, collapsing the pull\n // the user is halfway through.\n if (event.touches.length > 1) return;\n const touch = event.touches[0];\n if (!touch) return;\n // A pull only begins when the scroller is already at the top.\n this.canPull = this.el.nativeElement.scrollTop <= 0;\n this.startY = touch.clientY;\n }\n\n protected onTouchMove(event: TouchEvent): void {\n // Turned off or a refresh started mid-gesture: abort the drag and let the\n // effect settle the indicator (otherwise the drag is left frozen).\n if (this.disabled() || this.refreshing()) {\n if (this.dragging()) this.dragging.set(false);\n this.canPull = false;\n return;\n }\n if (!this.canPull) return;\n const touch = event.touches[0];\n if (!touch) return;\n const dy = touch.clientY - this.startY;\n // Pulling up, or the content has scrolled off the top — hand back to\n // native scrolling and drop any partial pull.\n if (dy <= 0 || this.el.nativeElement.scrollTop > 0) {\n if (this.dragging()) this.dragging.set(false);\n this.distance.set(0);\n this.canPull = this.el.nativeElement.scrollTop <= 0;\n return;\n }\n // Actively pulling down at the top: take over from native scroll.\n event.preventDefault();\n const wasArmed = this.armed();\n this.dragging.set(true);\n // Halve the finger travel for a rubber-band feel, capped past threshold.\n this.distance.set(Math.min(dy * 0.5, this.thresholdPx() * 1.75));\n // A light tap the instant the pull arms, so it's felt without looking.\n if (!wasArmed && this.armed()) this.haptics.impact('light');\n }\n\n /**\n * A cancelled touch is an ABANDONED pull, not a completed one — the system took\n * the gesture away (a call, a notification, a palm on the bezel). Routing it\n * through `onTouchEnd` refreshed the list on an interruption the user did not\n * ask for and could not take back.\n */\n protected onTouchCancel(): void {\n this.dragging.set(false);\n this.canPull = false;\n }\n\n protected onTouchEnd(): void {\n if (!this.dragging()) return;\n // Capture the arm state before releasing — `distance` still holds the pull.\n const armed = this.armed();\n this.dragging.set(false);\n this.canPull = false;\n // Only a genuine armed release on an enabled, idle control refreshes.\n // Either way the effect settles `distance` (open iff `refreshing`).\n if (armed && !this.disabled() && !this.refreshing()) {\n this.refresh.emit();\n }\n }\n}\n","@if (distance() > 0 || refreshing()) {\n <div class=\"wr-pull-to-refresh__indicator\" [style.height.px]=\"distance()\" aria-hidden=\"true\">\n <wr-spinner class=\"wr-pull-to-refresh__spinner\" size=\"sm\" [style.opacity]=\"progress()\" />\n </div>\n}\n<div class=\"wr-pull-to-refresh__content\" [style.transform]=\"contentTransform()\">\n <ng-content />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/fesm2022/ngwr-qr.mjs
CHANGED
|
@@ -1106,10 +1106,10 @@ class WrQr {
|
|
|
1106
1106
|
drawQrCode(el, opts);
|
|
1107
1107
|
});
|
|
1108
1108
|
}
|
|
1109
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
1110
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.
|
|
1109
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrQr, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1110
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.7", type: WrQr, isStandalone: true, selector: "wr-qr", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, bgColor: { classPropertyName: "bgColor", publicName: "bgColor", isSignal: true, isRequired: false, transformFunction: null }, iconUrl: { classPropertyName: "iconUrl", publicName: "iconUrl", isSignal: true, isRequired: false, transformFunction: null }, iconSize: { classPropertyName: "iconSize", publicName: "iconSize", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.background": "bgColor()" }, classAttribute: "wr-qr" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true, isSignal: true }], ngImport: i0, template: "<!--\n Always emit the canvas \u2014 painting is guarded in the effect instead. Gating\n the element itself on the platform makes the server and client render\n different structures, which breaks hydration; a bare canvas costs nothing\n and matches how the other canvas-backed components behave.\n-->\n<canvas #canvas role=\"img\" [attr.aria-label]=\"resolvedAriaLabel()\"></canvas>\n", encapsulation: i0.ViewEncapsulation.None });
|
|
1111
1111
|
}
|
|
1112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
1112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrQr, decorators: [{
|
|
1113
1113
|
type: Component,
|
|
1114
1114
|
args: [{ selector: 'wr-qr', encapsulation: ViewEncapsulation.None, host: { class: 'wr-qr', '[style.background]': 'bgColor()' }, template: "<!--\n Always emit the canvas \u2014 painting is guarded in the effect instead. Gating\n the element itself on the platform makes the server and client render\n different structures, which breaks hydration; a bare canvas costs nothing\n and matches how the other canvas-backed components behave.\n-->\n<canvas #canvas role=\"img\" [attr.aria-label]=\"resolvedAriaLabel()\"></canvas>\n" }]
|
|
1115
1115
|
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], bgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgColor", required: false }] }], iconUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconUrl", required: false }] }], iconSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconSize", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], canvas: [{ type: i0.ViewChild, args: ['canvas', { isSignal: true }] }] } });
|