ngwr 11.1.0 → 12.0.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 +7 -7
- package/burger/styles/_index.scss +1 -1
- package/button/styles/_index.scss +2 -2
- package/calendar/styles/_index.scss +32 -12
- package/calendar-heatmap/styles/_index.scss +20 -0
- package/carousel/styles/_index.scss +23 -1
- package/cascader/styles/_index.scss +15 -3
- package/checkbox/styles/_index.scss +2 -2
- package/circular-text/styles/_index.scss +11 -0
- package/collapse/styles/_index.scss +2 -2
- package/color-picker/styles/_index.scss +3 -3
- package/command-palette/styles/_index.scss +12 -0
- package/compare/styles/_index.scss +18 -2
- package/context-menu/styles/_index.scss +21 -2
- package/date-picker/styles/_index.scss +5 -5
- package/descriptions/styles/_index.scss +1 -1
- package/drag-drop/styles/_index.scss +28 -1
- package/drawer/styles/_index.scss +37 -0
- package/dropdown/styles/_index.scss +2 -2
- package/event-calendar/styles/_index.scss +67 -10
- package/fesm2022/ngwr-action-sheet-testing.mjs +313 -0
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -0
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bar-chart-testing.mjs +107 -0
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text-testing.mjs +203 -0
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text.mjs +18 -4
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs +325 -0
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -0
- package/fesm2022/ngwr-border-glow.mjs +4 -4
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs +95 -0
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs +368 -0
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar.mjs +228 -10
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +10 -10
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +124 -24
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +60 -5
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +14 -6
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs +230 -0
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-circular-text.mjs +4 -4
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-click-spark.mjs +27 -7
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-color-picker-testing.mjs +452 -0
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -0
- package/fesm2022/ngwr-color-picker.mjs +126 -10
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +14 -5
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs +31 -6
- package/fesm2022/ngwr-confetti.mjs.map +1 -1
- package/fesm2022/ngwr-config.mjs +9 -0
- package/fesm2022/ngwr-config.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
- package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +358 -48
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-counter.mjs +25 -9
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
- package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
- package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
- package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
- package/fesm2022/ngwr-date-picker-testing.mjs +21 -85
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +119 -37
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
- package/fesm2022/ngwr-date.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text-testing.mjs +261 -0
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text.mjs +9 -4
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-dialog.mjs +73 -18
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-divider.mjs +52 -5
- package/fesm2022/ngwr-divider.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs +97 -0
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-donut-chart.mjs +7 -7
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +160 -11
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +156 -64
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +58 -12
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar-testing.mjs +446 -0
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-event-calendar.mjs +66 -28
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs +220 -0
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-falling-text.mjs +75 -46
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-form.mjs +32 -15
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text-testing.mjs +134 -0
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge-testing.mjs +86 -0
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text-testing.mjs +215 -0
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-glitch-text.mjs +7 -7
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs +258 -0
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gradient-text.mjs +4 -4
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-hotkey.mjs +24 -9
- package/fesm2022/ngwr-hotkey.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +87 -1
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +69 -1
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +26 -15
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-image-cropper-testing.mjs +200 -0
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -0
- package/fesm2022/ngwr-image-cropper.mjs +156 -11
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number-testing.mjs +15 -10
- package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +89 -15
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
- package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +24 -5
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob-testing.mjs +220 -0
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -0
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox-testing.mjs +223 -0
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox.mjs +11 -4
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs +119 -0
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-line-chart.mjs +73 -26
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +7 -7
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +7 -7
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-markdown.mjs +66 -8
- package/fesm2022/ngwr-markdown.mjs.map +1 -1
- package/fesm2022/ngwr-marquee-testing.mjs +336 -0
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -0
- package/fesm2022/ngwr-marquee.mjs +4 -4
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-mention.mjs +108 -13
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meter-group-testing.mjs +100 -0
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -0
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +34 -7
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination-testing.mjs +6 -6
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +17 -13
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +39 -26
- package/fesm2022/ngwr-pipes.mjs.map +1 -1
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popover-testing.mjs +7 -2
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +169 -33
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs +42 -5
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-result.mjs +21 -30
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs +220 -0
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-rotating-text.mjs +4 -4
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented-testing.mjs +14 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +29 -6
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +227 -43
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs +237 -0
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-shiny-text.mjs +11 -9
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +31 -16
- package/fesm2022/ngwr-sidebar.mjs.map +1 -1
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +143 -14
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs +76 -0
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -0
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial-testing.mjs +281 -0
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -0
- package/fesm2022/ngwr-speed-dial.mjs +27 -12
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor-testing.mjs +89 -0
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-split-text-testing.mjs +224 -0
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-split-text.mjs +31 -5
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs +245 -0
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-spotlight-card-testing.mjs +368 -0
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-spotlight-card.mjs +7 -7
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-star-border-testing.mjs +172 -0
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -0
- package/fesm2022/ngwr-star-border.mjs +4 -4
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-stepper-testing.mjs +8 -8
- package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +33 -8
- package/fesm2022/ngwr-stepper.mjs.map +1 -1
- package/fesm2022/ngwr-storage.mjs +17 -5
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-table.mjs +110 -40
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-testing.mjs +11 -10
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +51 -11
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs +181 -4
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs +190 -0
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tilt-card.mjs +26 -8
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +44 -15
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tour-testing.mjs +173 -0
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tour.mjs +34 -10
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs +36 -11
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs +242 -0
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-typewriter.mjs +13 -5
- package/fesm2022/ngwr-typewriter.mjs.map +1 -1
- package/fesm2022/ngwr-typography.mjs +3 -3
- package/fesm2022/ngwr-utils.mjs +5 -2
- package/fesm2022/ngwr-utils.mjs.map +1 -1
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves-testing.mjs +128 -0
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -0
- package/fesm2022/ngwr-waves.mjs +4 -4
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window-testing.mjs +361 -0
- package/fesm2022/ngwr-window-testing.mjs.map +1 -0
- package/fesm2022/ngwr-window.mjs +175 -31
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/file-upload/styles/_index.scss +2 -2
- package/glitch-text/styles/_index.scss +27 -12
- package/i18n/en.json +71 -7
- package/i18n/ru.json +71 -7
- package/image-cropper/styles/_index.scss +19 -0
- package/input/styles/_index.scss +2 -2
- package/input-number/styles/_index.scss +2 -2
- package/input-otp/styles/_index.scss +9 -2
- package/knob/styles/_index.scss +1 -1
- package/lightbox/styles/_index.scss +16 -2
- package/line-chart/styles/_index.scss +28 -14
- package/list/styles/_index.scss +1 -1
- package/llms-full.txt +161 -19
- package/llms.txt +45 -10
- package/markdown/styles/_index.scss +3 -3
- package/mcp/api.js +6 -4
- package/mcp/catalog.js +40 -3
- package/mcp/providers.js +42 -0
- package/mcp/tools.js +22 -30
- package/meter-group/styles/_index.scss +1 -1
- package/overlay/styles/_index.scss +33 -1
- package/package.json +161 -12
- package/pagination/styles/_index.scss +23 -1
- package/popover/styles/_index.scss +16 -7
- package/progress/styles/_index.scss +1 -1
- package/radio/styles/_index.scss +2 -2
- package/rating/styles/_index.scss +1 -1
- package/schematics/collection.json +1 -1
- package/schematics/migrations/v12/index.js +65 -0
- package/schematics/migrations/v7/index.js +12 -1
- package/schematics/migrations/v8/index.js +10 -1
- package/schematics/migrations.json +5 -0
- package/schematics/ng-add/index.js +8 -3
- package/schematics/provider/index.js +80 -13
- package/schematics/use/index.js +9 -129
- package/schematics/use/rule.js +206 -0
- package/schematics/use/symbol-map.json +4 -4
- package/segmented/styles/_index.scss +14 -3
- package/select/styles/_index.scss +14 -2
- package/sidebar/styles/_index.scss +12 -10
- package/skills/ngwr/SKILL.md +117 -0
- package/skills/ngwr/references/catalog.md +212 -0
- package/skills/ngwr/references/setup.md +78 -0
- package/slider/styles/_index.scss +1 -1
- package/speed-dial/styles/_index.scss +1 -1
- package/stepper/styles/_index.scss +12 -3
- package/switch/styles/_index.scss +2 -2
- package/table/styles/_index.scss +61 -12
- package/tabs/styles/_index.scss +1 -1
- package/textarea/styles/_index.scss +1 -1
- package/theme/styles/_colors.scss +142 -56
- package/theme/styles/_dark.scss +46 -3
- package/theme/styles/_focus.scss +28 -5
- package/theme/styles/_mixins.scss +1 -1
- package/theme/styles/_variables.scss +67 -0
- package/transfer/styles/_index.scss +26 -3
- package/tree/styles/_index.scss +29 -6
- package/types/ngwr-action-sheet-testing.d.ts +260 -0
- package/types/ngwr-bar-chart-testing.d.ts +85 -0
- package/types/ngwr-blur-text-testing.d.ts +180 -0
- package/types/ngwr-blur-text.d.ts +20 -4
- package/types/ngwr-border-glow-testing.d.ts +219 -0
- package/types/ngwr-breadcrumbs.d.ts +17 -10
- package/types/ngwr-calendar-heatmap-testing.d.ts +79 -0
- package/types/ngwr-calendar-testing.d.ts +277 -0
- package/types/ngwr-calendar.d.ts +76 -0
- package/types/ngwr-carousel.d.ts +85 -6
- package/types/ngwr-cascader.d.ts +17 -0
- package/types/ngwr-checkbox.d.ts +13 -0
- package/types/ngwr-circular-text-testing.d.ts +196 -0
- package/types/ngwr-click-spark.d.ts +4 -0
- package/types/ngwr-color-picker-testing.d.ts +299 -0
- package/types/ngwr-color-picker.d.ts +34 -2
- package/types/ngwr-confetti.d.ts +8 -0
- package/types/ngwr-config.d.ts +10 -1
- package/types/ngwr-context-menu-testing.d.ts +24 -11
- package/types/ngwr-context-menu.d.ts +71 -1
- package/types/ngwr-counter.d.ts +1 -0
- package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
- package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
- package/types/ngwr-date-picker-testing.d.ts +17 -72
- package/types/ngwr-date-picker.d.ts +8 -4
- package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
- package/types/ngwr-decrypt-text-testing.d.ts +222 -0
- package/types/ngwr-dialog.d.ts +38 -1
- package/types/ngwr-divider.d.ts +25 -0
- package/types/ngwr-donut-chart-testing.d.ts +83 -0
- package/types/ngwr-donut-chart.d.ts +3 -3
- package/types/ngwr-drag-drop.d.ts +56 -2
- package/types/ngwr-drawer.d.ts +68 -5
- package/types/ngwr-dropdown.d.ts +9 -0
- package/types/ngwr-event-calendar-testing.d.ts +301 -0
- package/types/ngwr-event-calendar.d.ts +17 -8
- package/types/ngwr-falling-text-testing.d.ts +188 -0
- package/types/ngwr-falling-text.d.ts +1 -1
- package/types/ngwr-form.d.ts +12 -2
- package/types/ngwr-fuzzy-text-testing.d.ts +130 -0
- package/types/ngwr-gauge-testing.d.ts +71 -0
- package/types/ngwr-glitch-text-testing.d.ts +201 -0
- package/types/ngwr-gradient-text-testing.d.ts +186 -0
- package/types/ngwr-i18n.d.ts +13 -4
- package/types/ngwr-image-cropper-testing.d.ts +173 -0
- package/types/ngwr-image-cropper.d.ts +71 -5
- package/types/ngwr-input-number-testing.d.ts +15 -10
- package/types/ngwr-input-number.d.ts +44 -5
- package/types/ngwr-input-otp-testing.d.ts +12 -6
- package/types/ngwr-input-otp.d.ts +15 -1
- package/types/ngwr-knob-testing.d.ts +150 -0
- package/types/ngwr-lightbox-testing.d.ts +154 -0
- package/types/ngwr-lightbox.d.ts +6 -0
- package/types/ngwr-line-chart-testing.d.ts +93 -0
- package/types/ngwr-line-chart.d.ts +20 -3
- package/types/ngwr-markdown.d.ts +11 -0
- package/types/ngwr-marquee-testing.d.ts +280 -0
- package/types/ngwr-mention.d.ts +32 -0
- package/types/ngwr-meter-group-testing.d.ts +77 -0
- package/types/ngwr-overlay.d.ts +20 -1
- package/types/ngwr-pagination-testing.d.ts +4 -4
- package/types/ngwr-pipes.d.ts +1 -1
- package/types/ngwr-popover-testing.d.ts +7 -2
- package/types/ngwr-popover.d.ts +1 -0
- package/types/ngwr-result.d.ts +6 -0
- package/types/ngwr-rotating-text-testing.d.ts +191 -0
- package/types/ngwr-segmented-testing.d.ts +9 -0
- package/types/ngwr-segmented.d.ts +21 -1
- package/types/ngwr-select.d.ts +100 -6
- package/types/ngwr-shiny-text-testing.d.ts +165 -0
- package/types/ngwr-shiny-text.d.ts +4 -2
- package/types/ngwr-sidebar.d.ts +14 -5
- package/types/ngwr-slider.d.ts +84 -1
- package/types/ngwr-sparkline-testing.d.ts +69 -0
- package/types/ngwr-speed-dial-testing.d.ts +199 -0
- package/types/ngwr-speed-dial.d.ts +22 -3
- package/types/ngwr-splash-cursor-testing.d.ts +95 -0
- package/types/ngwr-split-text-testing.d.ts +209 -0
- package/types/ngwr-split-text.d.ts +21 -0
- package/types/ngwr-splitter-testing.d.ts +174 -0
- package/types/ngwr-spotlight-card-testing.d.ts +303 -0
- package/types/ngwr-star-border-testing.d.ts +135 -0
- package/types/ngwr-stepper-testing.d.ts +5 -5
- package/types/ngwr-stepper.d.ts +8 -0
- package/types/ngwr-storage.d.ts +1 -0
- package/types/ngwr-table.d.ts +114 -12
- package/types/ngwr-tabs-testing.d.ts +11 -10
- package/types/ngwr-tabs.d.ts +2 -0
- package/types/ngwr-theme.d.ts +82 -1
- package/types/ngwr-tilt-card-testing.d.ts +158 -0
- package/types/ngwr-tilt-card.d.ts +2 -0
- package/types/ngwr-toast.d.ts +14 -5
- package/types/ngwr-tour-testing.d.ts +143 -0
- package/types/ngwr-tour.d.ts +22 -4
- package/types/ngwr-tree.d.ts +12 -4
- package/types/ngwr-typewriter-testing.d.ts +211 -0
- package/types/ngwr-utils.d.ts +5 -2
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-waves-testing.d.ts +121 -0
- package/types/ngwr-window-testing.d.ts +263 -0
- package/types/ngwr-window.d.ts +66 -21
- package/typography/styles/_index.scss +1 -1
- package/window/styles/_index.scss +116 -42
- package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
- package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
- package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Narrows which `<wr-meter-group>` a harness query matches. */
|
|
11
|
+
interface WrMeterGroupHarnessFilters extends BaseHarnessFilters {
|
|
12
|
+
/** Match the bar's accessible name. */
|
|
13
|
+
readonly ariaLabel?: string | RegExp;
|
|
14
|
+
/** Match a group whose legend holds this label. */
|
|
15
|
+
readonly sliceLabel?: string | RegExp;
|
|
16
|
+
}
|
|
17
|
+
/** One band of the bar, as it is drawn and titled. */
|
|
18
|
+
interface WrMeterGroupSlice {
|
|
19
|
+
/** The band's `title` — its only text, since the bar itself is one `progressbar`. */
|
|
20
|
+
readonly label: string | null;
|
|
21
|
+
/** The share of the bar it takes, in percent. */
|
|
22
|
+
readonly percent: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @license
|
|
27
|
+
*
|
|
28
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
29
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Test harness for `<wr-meter-group>` — one bar divided into labelled bands.
|
|
34
|
+
*
|
|
35
|
+
* **The bar is a single `progressbar`, and its value is the TOTAL.** The bands
|
|
36
|
+
* themselves announce nothing: they carry a `title` for a mouse and their share as an
|
|
37
|
+
* inline width, and the legend is where their labels and values are readable. So a
|
|
38
|
+
* spec that wants "how much of each" reads {@link getSlices} for the shares or
|
|
39
|
+
* {@link getLegendLabels} / {@link getLegendValues} for what is printed, and one that
|
|
40
|
+
* wants "how full" reads {@link getValue}.
|
|
41
|
+
*
|
|
42
|
+
* **A band's share is read off the `style` ATTRIBUTE, not through `getCssValue()`**,
|
|
43
|
+
* and the difference is not cosmetic: `getCssValue()` is `getComputedStyle()`, and
|
|
44
|
+
* `width` resolves to the USED value — so the declared `30%` comes straight back in
|
|
45
|
+
* jsdom and arrives as `180px` on a 600px bar in a real browser, and the same harness
|
|
46
|
+
* answered 30 here and 180 under a browser runner with nothing to say which one you
|
|
47
|
+
* got.
|
|
48
|
+
*
|
|
49
|
+
* @see https://ngwr.dev/guides/testing
|
|
50
|
+
*/
|
|
51
|
+
declare class WrMeterGroupHarness extends ComponentHarness {
|
|
52
|
+
static hostSelector: string;
|
|
53
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
54
|
+
static with(options?: WrMeterGroupHarnessFilters): HarnessPredicate<WrMeterGroupHarness>;
|
|
55
|
+
private readonly bar;
|
|
56
|
+
/** The role the bar announces — `progressbar`, for the total. */
|
|
57
|
+
getRole(): Promise<string | null>;
|
|
58
|
+
/** The bar's accessible name. */
|
|
59
|
+
getAccessibleName(): Promise<string | null>;
|
|
60
|
+
/** The total the bands add up to, from `aria-valuenow`. */
|
|
61
|
+
getValue(): Promise<number>;
|
|
62
|
+
/** The full capacity, from `aria-valuemax` — given, or the sum of the bands. */
|
|
63
|
+
getMax(): Promise<number>;
|
|
64
|
+
/** The bands, in order, with the share of the bar each takes. */
|
|
65
|
+
getSlices(): Promise<WrMeterGroupSlice[]>;
|
|
66
|
+
/** Parse one band's declared share. See the class note on why this is not `getCssValue()`. */
|
|
67
|
+
private static percentOf;
|
|
68
|
+
/** Whether the legend is rendered (`showLegend`, and at least one band). */
|
|
69
|
+
hasLegend(): Promise<boolean>;
|
|
70
|
+
/** The legend's labels, in order. */
|
|
71
|
+
getLegendLabels(): Promise<string[]>;
|
|
72
|
+
/** The legend's values, in order — empty when `showValues` is off. */
|
|
73
|
+
getLegendValues(): Promise<string[]>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export { WrMeterGroupHarness };
|
|
77
|
+
export type { WrMeterGroupHarnessFilters, WrMeterGroupSlice };
|
package/types/ngwr-overlay.d.ts
CHANGED
|
@@ -90,6 +90,7 @@ declare function wrMirrorOffsets(positions: readonly ConnectedPosition[], isRtl:
|
|
|
90
90
|
*
|
|
91
91
|
* Registration is per subscription: the document listeners go up with the first
|
|
92
92
|
* watcher and come down with the last, so an app with no open overlay has none.
|
|
93
|
+
* That sentence was aspirational until v11 — see {@link outsidePointerEvents}.
|
|
93
94
|
*/
|
|
94
95
|
declare class WrOutsideClick {
|
|
95
96
|
private readonly doc;
|
|
@@ -100,7 +101,24 @@ declare class WrOutsideClick {
|
|
|
100
101
|
private pressOrigin;
|
|
101
102
|
/**
|
|
102
103
|
* Emits every `click` / `auxclick` / `contextmenu` that lands outside the
|
|
103
|
-
* given overlay's pane, for as long as the
|
|
104
|
+
* given overlay's pane, for as long as the overlay is attached.
|
|
105
|
+
*
|
|
106
|
+
* **It completes when the overlay detaches, and that is load-bearing.** Every
|
|
107
|
+
* one of the ten call sites subscribes inside its own `openOverlay()` and
|
|
108
|
+
* pipes `takeUntilDestroyed(destroyRef)` — a DIRECTIVE lifetime, not an
|
|
109
|
+
* overlay one — and none of them unsubscribes on close, because the natural
|
|
110
|
+
* reading of that idiom is "this ends with the component". Without the
|
|
111
|
+
* completion below the teardown never ran: one watcher accumulated per OPEN
|
|
112
|
+
* for the life of the page, each pinning a disposed `OverlayRef` (and through
|
|
113
|
+
* it a detached pane, its portal outlet and their injectors), the four
|
|
114
|
+
* capture-phase document listeners could never come down because
|
|
115
|
+
* `watchers.length` never reached zero, and every click on the page walked a
|
|
116
|
+
* list that only grew. A `mode="tooltip"` popover made it unbounded — one
|
|
117
|
+
* permanent watcher per hover.
|
|
118
|
+
*
|
|
119
|
+
* Completing here rather than fixing ten call sites is deliberate: the next
|
|
120
|
+
* component to open an overlay would have made the same reasonable mistake.
|
|
121
|
+
* It is also what CDK's own `OverlayRef.outsidePointerEvents()` does.
|
|
104
122
|
*/
|
|
105
123
|
outsidePointerEvents(overlayRef: OverlayRef): Observable<MouseEvent>;
|
|
106
124
|
private readonly onPointerDown;
|
|
@@ -285,3 +303,4 @@ declare const WR_OVERLAY: InjectionToken<Overlay>;
|
|
|
285
303
|
declare const WR_OVERLAY_CONTAINER: InjectionToken<OverlayContainer>;
|
|
286
304
|
|
|
287
305
|
export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, WrOutsideClick, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, wrAppendOverlayClose, wrMirrorOffsets, wrPresentAsSheet };
|
|
306
|
+
export type { WrResponsiveOverlaysConfig };
|
|
@@ -179,10 +179,10 @@ declare class WrPaginationHarness extends ComponentHarness {
|
|
|
179
179
|
* The page the pager announces as current, from `aria-current="page"`.
|
|
180
180
|
*
|
|
181
181
|
* Throws when no cell claims it. The window always keeps the current page on the
|
|
182
|
-
* strip, so getting here means `currentPage` is not one of the pages at all
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* inactive to an assistive tech user.
|
|
182
|
+
* strip, so getting here means `currentPage` is not one of the pages at all. The
|
|
183
|
+
* component clamps a host write into `1..totalPages`, which leaves one survivor:
|
|
184
|
+
* a fractional page, which is in range and matches no cell — and which leaves
|
|
185
|
+
* every cell looking equally inactive to an assistive tech user.
|
|
186
186
|
*/
|
|
187
187
|
getCurrentPage(): Promise<number>;
|
|
188
188
|
/**
|
package/types/ngwr-pipes.d.ts
CHANGED
|
@@ -181,8 +181,13 @@ declare class WrPopoverHarness extends ContentContainerComponentHarness {
|
|
|
181
181
|
* Where the panel sits relative to the trigger, or `null` when it is presented
|
|
182
182
|
* as a sheet and has no anchor.
|
|
183
183
|
*
|
|
184
|
-
* The
|
|
185
|
-
*
|
|
184
|
+
* The APPLIED position, not the requested one: CDK flips a placement that does
|
|
185
|
+
* not fit to the next in its fallback chain and swaps the modifier class with
|
|
186
|
+
* it. Under a unit test that is always the requested placement — jsdom measures
|
|
187
|
+
* every box as 0×0, so the first candidate always "fits" — but in a browser the
|
|
188
|
+
* two can differ, and this answers what is on screen. The directive defaults
|
|
189
|
+
* the request per mode (`bottom` for a popover, `top` for a tooltip).
|
|
190
|
+
*
|
|
186
191
|
* The arrow itself is a `::after` pseudo-element, so it exists for no DOM query
|
|
187
192
|
* at all; this class is the placement, and it is what the arrow's own CSS keys
|
|
188
193
|
* off.
|
package/types/ngwr-popover.d.ts
CHANGED
package/types/ngwr-result.d.ts
CHANGED
|
@@ -40,6 +40,8 @@ declare class WrResult {
|
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
42
|
declare class WrResult404 {
|
|
43
|
+
/** Bound by the shared template; not an input — a preset IS its status. */
|
|
44
|
+
protected readonly status: WrResultStatus;
|
|
43
45
|
readonly title: _angular_core.InputSignal<string>;
|
|
44
46
|
/** Body text. Falls back to `result.notFound` from WrI18n. */
|
|
45
47
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
@@ -49,6 +51,8 @@ declare class WrResult404 {
|
|
|
49
51
|
}
|
|
50
52
|
/** Pre-set 403 result — forbidden / no access. */
|
|
51
53
|
declare class WrResult403 {
|
|
54
|
+
/** Bound by the shared template; not an input — a preset IS its status. */
|
|
55
|
+
protected readonly status: WrResultStatus;
|
|
52
56
|
readonly title: _angular_core.InputSignal<string>;
|
|
53
57
|
/** Body text. Falls back to `result.forbidden` from WrI18n. */
|
|
54
58
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
@@ -58,6 +62,8 @@ declare class WrResult403 {
|
|
|
58
62
|
}
|
|
59
63
|
/** Pre-set 500 result — internal server error. */
|
|
60
64
|
declare class WrResult500 {
|
|
65
|
+
/** Bound by the shared template; not an input — a preset IS its status. */
|
|
66
|
+
protected readonly status: WrResultStatus;
|
|
61
67
|
readonly title: _angular_core.InputSignal<string>;
|
|
62
68
|
/** Body text. Falls back to `result.serverError` from WrI18n. */
|
|
63
69
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Narrows which `<wr-rotating-text>` a harness query matches. */
|
|
11
|
+
interface WrRotatingTextHarnessFilters extends BaseHarnessFilters {
|
|
12
|
+
/**
|
|
13
|
+
* Match the string showing right now — the readable copy, not the animated pieces.
|
|
14
|
+
* A string is an exact match, a RegExp is tested.
|
|
15
|
+
*
|
|
16
|
+
* It matches a MOMENT, not a rotator: the component cycles, so a filter that hits today
|
|
17
|
+
* misses two seconds later. Use it to address the one that is currently showing a known
|
|
18
|
+
* word, and prefer `selector` for a rotator you need to hold on to.
|
|
19
|
+
*/
|
|
20
|
+
readonly text?: string | RegExp;
|
|
21
|
+
/**
|
|
22
|
+
* Match on how many word groups the split produced. Word boundaries survive every
|
|
23
|
+
* granularity — three words stay three groups even when each is exploded into
|
|
24
|
+
* characters — so this is stable across the split, unlike the piece count.
|
|
25
|
+
*/
|
|
26
|
+
readonly wordCount?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @license
|
|
31
|
+
*
|
|
32
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
33
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Test harness for `<wr-rotating-text>`.
|
|
38
|
+
*
|
|
39
|
+
* **What is announced and what is drawn are two questions, and this component is worth a
|
|
40
|
+
* harness mostly because it answers them separately.** The string showing now is carried
|
|
41
|
+
* verbatim in a visually-hidden span; the animated layer beside it is one span per
|
|
42
|
+
* grapheme, word or line and is `aria-hidden` as a whole, so a screen reader hears `one`
|
|
43
|
+
* rather than `o. n. e.` {@link getAccessibleText} is the first, {@link getRenderedText}
|
|
44
|
+
* and {@link getPieces} the second, and {@link isAnimatedLayerHidden} together with
|
|
45
|
+
* {@link hasAccessibleCopy} is the pairing that regresses silently when someone
|
|
46
|
+
* restructures the template — pieces hidden AND no readable copy is an element with no
|
|
47
|
+
* accessible text at all, which reads as a pass on either check alone.
|
|
48
|
+
*
|
|
49
|
+
* **The sr-only span is deliberately not a live region, and no method here implies
|
|
50
|
+
* otherwise.** `auto` advances every two seconds by default, and the APG's answer for
|
|
51
|
+
* self-advancing content is silence, not an announcement on a timer. What the harness
|
|
52
|
+
* pins is that the announced copy TRACKS the current word — nothing about it being
|
|
53
|
+
* spoken.
|
|
54
|
+
*
|
|
55
|
+
* **There is no `getIndex()`, and no `next()` / `previous()` / `jumpTo()` / `reset()`.**
|
|
56
|
+
* The index appears nowhere in the DOM — no attribute, no data hook — so deriving it
|
|
57
|
+
* would mean matching the shown string against a list the harness was never given, and
|
|
58
|
+
* guessing between duplicates. And the component renders no controls at all: rotation is
|
|
59
|
+
* a timer or a method call on the instance, so a harness "click" would have nothing to
|
|
60
|
+
* click and reaching into the component would make this a wrapper around the class rather
|
|
61
|
+
* than a reader of the DOM. Drive it from the spec — through the instance, or by
|
|
62
|
+
* advancing the interval — and assert the `nextChange` output for the index.
|
|
63
|
+
*
|
|
64
|
+
* **Nothing here reports the tween.** `duration`, `easing`, `staggerDuration` and
|
|
65
|
+
* `staggerFrom` are passed straight into Web Animation options and never written to the
|
|
66
|
+
* document; `delayFor()` is arithmetic with no rendered trace. So no `getDuration()`, no
|
|
67
|
+
* `getStagger()`, no `isAnimating()`. The pieces do carry inline `opacity` and
|
|
68
|
+
* `transform`, but on the animated path those are the FIRST keyframe — `opacity: 0` on
|
|
69
|
+
* text the user can see perfectly well — which is why the only reading offered is
|
|
70
|
+
* {@link isSettled}, and why it is spelled as a commitment rather than as a state of
|
|
71
|
+
* motion. The host's `overflow: hidden` clipping is layout, and every rect in a unit test
|
|
72
|
+
* is 0×0, so there is no `isClipped()` either.
|
|
73
|
+
*
|
|
74
|
+
* jsdom implements no Web Animations API, so the animated path throws on the first
|
|
75
|
+
* `el.animate` — before any assertion runs. Every spec supplies one half or the other:
|
|
76
|
+
*
|
|
77
|
+
* ```ts
|
|
78
|
+
* // Either: mount under reduced motion, where each swap is instant and nothing tweens.
|
|
79
|
+
* // (jsdom has no matchMedia, so WrPlatform must be provided as a value.)
|
|
80
|
+
* TestBed.configureTestingModule({ providers: [{ provide: WrPlatform, useValue: reducedMotion }] });
|
|
81
|
+
*
|
|
82
|
+
* // Or: stub the API — and remember a stub that never fires `onfinish` never resolves
|
|
83
|
+
* // the exit step, so the rotator stops after one swap.
|
|
84
|
+
* Reflect.set(Element.prototype, 'animate', () => ({ cancel: () => undefined, onfinish: null }));
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* const rotator = await loader.getHarness(WrRotatingTextHarness);
|
|
90
|
+
*
|
|
91
|
+
* expect(await rotator.getAccessibleText()).toBe('design');
|
|
92
|
+
* expect(await rotator.getPieces()).toEqual(['d', 'e', 's', 'i', 'g', 'n']);
|
|
93
|
+
* expect(await rotator.isAnimatedLayerHidden()).toBe(true);
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @see https://ngwr.dev/guides/testing
|
|
97
|
+
*/
|
|
98
|
+
declare class WrRotatingTextHarness extends ComponentHarness {
|
|
99
|
+
static hostSelector: string;
|
|
100
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
101
|
+
static with(options?: WrRotatingTextHarnessFilters): HarnessPredicate<WrRotatingTextHarness>;
|
|
102
|
+
private readonly chars;
|
|
103
|
+
/**
|
|
104
|
+
* The string showing right now, as the one readable copy holds it.
|
|
105
|
+
*
|
|
106
|
+
* Literally what a screen reader gets, the animated layer being out of the tree — and
|
|
107
|
+
* the thing to assert a rotation against, since it is where `next()`, `previous()`, a
|
|
108
|
+
* clamped `jumpTo()`, `reset()`, the wrap at either end, the stop when `loop` is off and
|
|
109
|
+
* the shrinking-list clamp all become visible.
|
|
110
|
+
*
|
|
111
|
+
* Throws when the copy is missing rather than answering with the pieces' text: an empty
|
|
112
|
+
* string is what a rotator holding an empty list correctly reports, so a plausible
|
|
113
|
+
* nothing here is indistinguishable from the component having lost its accessible name
|
|
114
|
+
* entirely. Ask {@link hasAccessibleCopy} when presence is the question.
|
|
115
|
+
*/
|
|
116
|
+
getAccessibleText(): Promise<string>;
|
|
117
|
+
/**
|
|
118
|
+
* Everything the animated layer draws, in document order, as one string.
|
|
119
|
+
*
|
|
120
|
+
* A different fact from {@link getAccessibleText}, and the comparison between them is
|
|
121
|
+
* the point: a split that drops its spacer renders `hellothere` while the readable copy
|
|
122
|
+
* stays perfect, and nothing else in the DOM says so.
|
|
123
|
+
*
|
|
124
|
+
* The spacer between words is a non-breaking space (` `), which is a rendering
|
|
125
|
+
* choice rather than a contract, so it is normalized to a plain space here — otherwise
|
|
126
|
+
* every round-trip assertion would have to spell U+00A0 out to pass against a working
|
|
127
|
+
* component. Note that `splitBy="lines"` genuinely does not round-trip: the newline the
|
|
128
|
+
* readable copy carries is drawn as that same spacer.
|
|
129
|
+
*/
|
|
130
|
+
getRenderedText(): Promise<string>;
|
|
131
|
+
/**
|
|
132
|
+
* The animated pieces, in document order.
|
|
133
|
+
*
|
|
134
|
+
* The granularity actually applied: one piece per grapheme for `splitBy="characters"`,
|
|
135
|
+
* one per word for `"words"`, one per line for `"lines"`. It is also where the grapheme
|
|
136
|
+
* contract shows — `a🚀b` must come back as three pieces, not four with two broken
|
|
137
|
+
* halves of a surrogate pair.
|
|
138
|
+
*/
|
|
139
|
+
getPieces(): Promise<string[]>;
|
|
140
|
+
/**
|
|
141
|
+
* How many word groups the split produced.
|
|
142
|
+
*
|
|
143
|
+
* Word boundaries survive every granularity: three words stay three groups even when
|
|
144
|
+
* each is exploded into characters, which is what keeps the line wrapping sane. A
|
|
145
|
+
* splitter that flattened the grouping would leave {@link getPieces} correct and break
|
|
146
|
+
* only this.
|
|
147
|
+
*/
|
|
148
|
+
getWordCount(): Promise<number>;
|
|
149
|
+
/**
|
|
150
|
+
* Whether the animated layer is out of the accessibility tree.
|
|
151
|
+
*
|
|
152
|
+
* ONE attribute answers it — `aria-hidden` sits on the `__inner` wrapper, so the pieces
|
|
153
|
+
* inherit it and none carries it itself, which keeps the attribute off the nodes the
|
|
154
|
+
* tween writes to. Asserting it per piece would fail on a component that is behaving.
|
|
155
|
+
*
|
|
156
|
+
* If it regresses, every rotation is spelled out letter by letter beside the copy that
|
|
157
|
+
* was already read, and nothing changes on screen — so no other check catches it.
|
|
158
|
+
*/
|
|
159
|
+
isAnimatedLayerHidden(): Promise<boolean>;
|
|
160
|
+
/**
|
|
161
|
+
* Whether the readable copy is rendered at all.
|
|
162
|
+
*
|
|
163
|
+
* The other half of {@link isAnimatedLayerHidden}, and it exists as a separate question
|
|
164
|
+
* because the failure the two catch together is invisible to each alone: a layer
|
|
165
|
+
* correctly hidden with no readable copy beside it is a control with no accessible text
|
|
166
|
+
* whatsoever, and `isAnimatedLayerHidden() === true` is exactly what it reports.
|
|
167
|
+
*/
|
|
168
|
+
hasAccessibleCopy(): Promise<boolean>;
|
|
169
|
+
/**
|
|
170
|
+
* Whether the enter step committed its end state on every piece — NOT whether an
|
|
171
|
+
* animation finished.
|
|
172
|
+
*
|
|
173
|
+
* The component writes `opacity: 1` inline on each piece when the swap settles: instantly
|
|
174
|
+
* under reduced motion, and from the tween's `onfinish` otherwise. So this answers "the
|
|
175
|
+
* new word was actually taken over", which is the bug the deferred enter exists to
|
|
176
|
+
* prevent — a swap that animates the OLD spans leaves the new ones staged at `opacity: 0`
|
|
177
|
+
* and the text invisible, while the readable copy reports the new word correctly.
|
|
178
|
+
*
|
|
179
|
+
* It is all-or-nothing: one piece left staged is one invisible glyph in the middle of a
|
|
180
|
+
* word. On the animated path it stays `false` until each tween finishes, which in a unit
|
|
181
|
+
* test means forever, since a stubbed `Element.animate` never fires anything — that is
|
|
182
|
+
* an honest answer about a swap that never landed, not a limitation to work around.
|
|
183
|
+
*
|
|
184
|
+
* Throws when there are no pieces: "every piece is settled" is true of none of them,
|
|
185
|
+
* and that is also what a component that stopped rendering its text would report.
|
|
186
|
+
*/
|
|
187
|
+
isSettled(): Promise<boolean>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export { WrRotatingTextHarness };
|
|
191
|
+
export type { WrRotatingTextHarnessFilters };
|
|
@@ -393,6 +393,15 @@ declare class WrSegmentedHarness extends ComponentHarness {
|
|
|
393
393
|
/** Segment names for an error message, which must not throw on its way out. */
|
|
394
394
|
private describeOptions;
|
|
395
395
|
private describe;
|
|
396
|
+
/**
|
|
397
|
+
* One custom property off the host's `style` ATTRIBUTE.
|
|
398
|
+
*
|
|
399
|
+
* Not `getCssValue()`, which is `getComputedStyle`: with the entry point's own
|
|
400
|
+
* stylesheet loaded that resolves the sheet's declaration, so the method
|
|
401
|
+
* answers plausibly at exactly the moment the host binding — the thing under
|
|
402
|
+
* test — is what broke. The attribute holds only what the component wrote.
|
|
403
|
+
*/
|
|
404
|
+
private inlineVar;
|
|
396
405
|
/** One of the thumb's inline custom properties, as a number. */
|
|
397
406
|
private thumbVar;
|
|
398
407
|
}
|
|
@@ -61,7 +61,27 @@ declare class WrSegmented<T = unknown> {
|
|
|
61
61
|
private readonly mounted;
|
|
62
62
|
constructor();
|
|
63
63
|
protected readonly classes: _angular_core.Signal<string>;
|
|
64
|
-
|
|
64
|
+
private readonly dir;
|
|
65
|
+
/**
|
|
66
|
+
* Reading direction of the strip. `Directionality` is root-provided, so this
|
|
67
|
+
* always resolves — `optional` only guards a consumer who has deliberately
|
|
68
|
+
* torn the provider out. A subtree that overrides the direction does it with
|
|
69
|
+
* the CDK's `Dir` directive, which writes `valueSignal`, so `thumbStyle`
|
|
70
|
+
* re-renders instead of leaving the thumb parked on the old segment.
|
|
71
|
+
*/
|
|
72
|
+
private readonly isRtl;
|
|
73
|
+
/**
|
|
74
|
+
* Inline CSS vars driving the sliding thumb position.
|
|
75
|
+
*
|
|
76
|
+
* `--wr-segmented-thumb-index` is the SLOT the thumb parks in, counted from the
|
|
77
|
+
* physical left, which is the selected index only in LTR. The stylesheet anchors
|
|
78
|
+
* the thumb with a physical `left` and slides it with `translateX` — neither has
|
|
79
|
+
* a logical form — while the options are a grid that mirrors, so under `dir="rtl"`
|
|
80
|
+
* the segment at logical index `i` occupies slot `count - 1 - i`. Left unsigned,
|
|
81
|
+
* the pill sat under a different label than the one it marks (the whole strip's
|
|
82
|
+
* worth of offset at the far end), which is the carousel's `trackStyle` problem
|
|
83
|
+
* one component over.
|
|
84
|
+
*/
|
|
65
85
|
protected readonly thumbStyle: _angular_core.Signal<Record<string, string>>;
|
|
66
86
|
protected isSelected(option: WrSegmentedOption<T>): boolean;
|
|
67
87
|
protected select(option: WrSegmentedOption<T>): void;
|
package/types/ngwr-select.d.ts
CHANGED
|
@@ -194,6 +194,48 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
194
194
|
protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
|
|
195
195
|
/** Per-chip ARIA label — interpolates `{{label}}`. @internal */
|
|
196
196
|
protected readonly chipRemoveLabel: (params?: ngwr_i18n.WrI18nParams) => string;
|
|
197
|
+
/**
|
|
198
|
+
* The overflow chip past `maxTagCount` — interpolates `{{count}}`. Through the
|
|
199
|
+
* catalog, like every other string here: printed as a bare `+{{ extra }} more`
|
|
200
|
+
* it stayed English in a fully localized app, beside an event-calendar cell
|
|
201
|
+
* reading "ещё 3" from the same string. @internal
|
|
202
|
+
*/
|
|
203
|
+
protected readonly moreLabel: (params?: ngwr_i18n.WrI18nParams) => string;
|
|
204
|
+
private readonly field;
|
|
205
|
+
/**
|
|
206
|
+
* Id the surrounding `<wr-form-field>`'s `<label for>` points at.
|
|
207
|
+
*
|
|
208
|
+
* The field renders its label before it can see what was projected into it, so
|
|
209
|
+
* the id travels the other way and the control adopts it, exactly as `[wrInput]`
|
|
210
|
+
* and `wr-slider` do. Without this the `for` named an element that was nowhere in
|
|
211
|
+
* the document: clicking the label did nothing, and the field's own text reached
|
|
212
|
+
* the control through no path at all.
|
|
213
|
+
*
|
|
214
|
+
* It lands on the ONE focusable element each trigger shape has — the button, the
|
|
215
|
+
* search input, or the tag input — never on the host, because only a labelable
|
|
216
|
+
* element can be a label's target and `<wr-select>` is not one.
|
|
217
|
+
*
|
|
218
|
+
* What this does NOT change is that element's NAME: `aria-label` outranks a
|
|
219
|
+
* `<label>` in the accname order, and the trigger keeps `resolvedAriaLabel()`
|
|
220
|
+
* because the field cannot promise it has a name to give — `<wr-form-field>`
|
|
221
|
+
* renders a label only when its `label` input is set, and a combobox that traded
|
|
222
|
+
* a generic name for no name would be the worse bug. `WrFormFieldContext`
|
|
223
|
+
* publishes no "do I have a visible label" signal to key that on. Until it does,
|
|
224
|
+
* set `[ariaLabel]` to the field's label where the two should read alike.
|
|
225
|
+
*/
|
|
226
|
+
protected readonly controlId: _angular_core.Signal<string | null>;
|
|
227
|
+
/**
|
|
228
|
+
* The field's error message, wired to the same element.
|
|
229
|
+
*
|
|
230
|
+
* Without it the messages `<wr-form-field>` renders are visible and nothing else:
|
|
231
|
+
* a screen reader on the trigger never learns the field is invalid, nor what the
|
|
232
|
+
* message says. `aria-invalid` is keyed on the message EXISTING rather than on
|
|
233
|
+
* `errorKeys()`, because the field only publishes an id once it is showing
|
|
234
|
+
* something — announcing "invalid" while pointing at nothing is worse than
|
|
235
|
+
* staying quiet.
|
|
236
|
+
*/
|
|
237
|
+
protected readonly describedBy: _angular_core.Signal<string | null>;
|
|
238
|
+
protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
|
|
197
239
|
/**
|
|
198
240
|
* Disable the select. Bound automatically from the field's disabled state
|
|
199
241
|
* when used with `[formField]`.
|
|
@@ -465,7 +507,17 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
465
507
|
protected readonly dynamicOptions: _angular_core.Signal<readonly unknown[]>;
|
|
466
508
|
private static readonly FALLBACK_ROW_PX;
|
|
467
509
|
private static readonly FALLBACK_VIEWPORT_PX;
|
|
468
|
-
/**
|
|
510
|
+
/**
|
|
511
|
+
* Consumer-projected `<wr-option>` children only (NOT the `@for`-rendered ones
|
|
512
|
+
* — those live in the panel's own view, which a content query never sees).
|
|
513
|
+
*
|
|
514
|
+
* `descendants: true` because a projected option is as often wrapped in a
|
|
515
|
+
* `<wr-option-group>` as it is a direct child, and the signal default is
|
|
516
|
+
* `false`. A grouped list therefore read as NO projected options: `virtualActive`
|
|
517
|
+
* engaged over the (empty) data array, so the panel rendered the group's rows
|
|
518
|
+
* with a virtual window beside them that owned the keyboard — no
|
|
519
|
+
* `aria-activedescendant`, no active row, and Enter committing nothing.
|
|
520
|
+
*/
|
|
469
521
|
private readonly projectedOptions;
|
|
470
522
|
/**
|
|
471
523
|
* `dynamicOptions()` narrowed to the current search query. `dynamicOptions()`
|
|
@@ -475,9 +527,18 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
475
527
|
*/
|
|
476
528
|
protected readonly filteredDynamicOptions: _angular_core.Signal<readonly unknown[]>;
|
|
477
529
|
/**
|
|
478
|
-
* Virtualization engaged: opt-in, search mode,
|
|
479
|
-
*
|
|
480
|
-
*
|
|
530
|
+
* Virtualization engaged: opt-in, search mode, and NO projected `<wr-option>`
|
|
531
|
+
* children — grouped ones included (those keep the full-render registry path so
|
|
532
|
+
* their DOM-derived labels / selection still work).
|
|
533
|
+
*
|
|
534
|
+
* NOT gated on there being matches. It used to also require
|
|
535
|
+
* `filteredDynamicOptions().length > 0`, which meant a query matching nothing
|
|
536
|
+
* fell back to the full-render path and mounted the ENTIRE unfiltered array —
|
|
537
|
+
* 2000 `<wr-option>` hosts, every one of them `--hidden`, behind a "No
|
|
538
|
+
* results" line — and then tore all of them down again on the next keystroke
|
|
539
|
+
* that matched. The empty window is handled where it belongs: `virtualWindow`
|
|
540
|
+
* already short-circuits on `total === 0`, and `firstEnabled` / `lastEnabled`
|
|
541
|
+
* already answer -1.
|
|
481
542
|
*/
|
|
482
543
|
protected readonly virtualActive: _angular_core.Signal<boolean>;
|
|
483
544
|
private readonly scrollTop;
|
|
@@ -537,6 +598,7 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
537
598
|
protected onChipsBlur(): void;
|
|
538
599
|
protected onSearchInput(event: Event): void;
|
|
539
600
|
protected onSearchFocus(): void;
|
|
601
|
+
protected onSearchBlur(): void;
|
|
540
602
|
protected onSearchKey(event: KeyboardEvent): void;
|
|
541
603
|
/**
|
|
542
604
|
* Display text for the search input. Shows the selected option's
|
|
@@ -544,6 +606,15 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
544
606
|
* @internal
|
|
545
607
|
*/
|
|
546
608
|
protected readonly searchDisplay: _angular_core.Signal<string>;
|
|
609
|
+
/**
|
|
610
|
+
* Whether the search field holds focus.
|
|
611
|
+
*
|
|
612
|
+
* Read by `searchDisplay`, so it has to be a signal — and it is also what
|
|
613
|
+
* lets the panel-close effect tell "the user walked away" (reset the query)
|
|
614
|
+
* from "the query dropped under `minChars` and they are still typing" (keep
|
|
615
|
+
* it).
|
|
616
|
+
*/
|
|
617
|
+
private readonly searchHasFocus;
|
|
547
618
|
private readonly host;
|
|
548
619
|
private readonly overlay;
|
|
549
620
|
private readonly outsideClick;
|
|
@@ -557,8 +628,18 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
557
628
|
isSelected(value: unknown): boolean;
|
|
558
629
|
selectOption(value: unknown): void;
|
|
559
630
|
registerOption(reg: WrSelectOptionRegistration): () => void;
|
|
560
|
-
/**
|
|
561
|
-
|
|
631
|
+
/**
|
|
632
|
+
* Remove one selection (chip × button) BY POSITION. Works for multi and tag
|
|
633
|
+
* modes.
|
|
634
|
+
*
|
|
635
|
+
* Positional, not by value: under `allowDuplicates` two chips carry the same
|
|
636
|
+
* string, and a filter on equality deleted every copy at once — one click on
|
|
637
|
+
* the second "red" took both reds with it. `visibleChips()` slices the HEAD
|
|
638
|
+
* of `selectedChips()`, which maps the value array one for one, so the
|
|
639
|
+
* `$index` a chip was rendered with indexes the value array directly. The
|
|
640
|
+
* multi-mode toggle in `selectOption` was already positional.
|
|
641
|
+
*/
|
|
642
|
+
protected removeChip(index: number, event: Event): void;
|
|
562
643
|
/** Clear every selection (× button). Multi/tag → empty array; search → null. */
|
|
563
644
|
protected clearAll(event: Event): void;
|
|
564
645
|
/** Capacity check used by tag mode to refuse the next add. */
|
|
@@ -573,6 +654,19 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
|
|
|
573
654
|
protected onTriggerKey(event: KeyboardEvent): void;
|
|
574
655
|
private seedActiveIndex;
|
|
575
656
|
private moveActive;
|
|
657
|
+
/**
|
|
658
|
+
* Both scan `orderedRegistry`, and that is not interchangeable with
|
|
659
|
+
* `registry`.
|
|
660
|
+
*
|
|
661
|
+
* They RETURN an index, and every reader of `activeIndex` — `activeOptionId`,
|
|
662
|
+
* `moveActive`, `seedActiveIndex`, the Enter branch of `onTriggerKey` —
|
|
663
|
+
* resolves it against DOM order. Scanning creation order here produced an
|
|
664
|
+
* index into the other list: with projected `<wr-option>` children next to
|
|
665
|
+
* `[options]` rows the two differ, so opening or searching left the cursor on
|
|
666
|
+
* a row the user was not looking at, and Enter committed whatever happened to
|
|
667
|
+
* sit at that position in DOM order — a filter-hidden option, which commits
|
|
668
|
+
* nothing at all.
|
|
669
|
+
*/
|
|
576
670
|
private firstEnabled;
|
|
577
671
|
private lastEnabled;
|
|
578
672
|
/** Coerce the multi-mode value into an array (tolerates a scalar or null write). */
|