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
|
@@ -66,7 +66,33 @@ declare class WrContextMenu {
|
|
|
66
66
|
*/
|
|
67
67
|
protected readonly openMenuId: _angular_core.WritableSignal<string | null>;
|
|
68
68
|
private overlayRef;
|
|
69
|
-
|
|
69
|
+
/**
|
|
70
|
+
* The open menu's subscription to CDK's keyboard dispatcher, held so that
|
|
71
|
+
* `closeOverlay()` can drop it — see the unsubscribe there for why the pane's
|
|
72
|
+
* own disposal is 220 ms too late.
|
|
73
|
+
*/
|
|
74
|
+
private rootKeys;
|
|
75
|
+
/**
|
|
76
|
+
* Where the keyboard was at the moment this menu took it, so a close can put
|
|
77
|
+
* it back there. Null when it was nowhere in particular (`<body>`) or already
|
|
78
|
+
* inside a menu pane, neither of which is a place to return to.
|
|
79
|
+
*/
|
|
80
|
+
private restoreFocusTo;
|
|
81
|
+
/**
|
|
82
|
+
* Panes waiting out their exit animation, keyed by the timer that disposes
|
|
83
|
+
* them.
|
|
84
|
+
*
|
|
85
|
+
* A SET, because one handle cannot hold two closings. It used to be a single
|
|
86
|
+
* `closingTimer`, and the second close inside the 220ms window cleared the
|
|
87
|
+
* first one's timer instead of its own — so the previous pane's `dispose()`
|
|
88
|
+
* never ran. `onContextMenu` closes and immediately re-opens, so right-clicking
|
|
89
|
+
* one target faster than the animation orphaned a pane per click: an
|
|
90
|
+
* `opacity: 0` box with `pointer-events: auto` eating clicks, a never-destroyed
|
|
91
|
+
* embedded view, a capture-phase document scroll listener still moving it, and
|
|
92
|
+
* an undetached ref still registered with CDK's keyboard dispatcher — which
|
|
93
|
+
* swallowed Escape for the whole page.
|
|
94
|
+
*/
|
|
95
|
+
private readonly closingPanes;
|
|
70
96
|
private leaveTimer;
|
|
71
97
|
private pressTimer;
|
|
72
98
|
private pressX;
|
|
@@ -135,6 +161,24 @@ declare class WrContextMenu {
|
|
|
135
161
|
close(): void;
|
|
136
162
|
private openOverlay;
|
|
137
163
|
private closeOverlay;
|
|
164
|
+
/**
|
|
165
|
+
* Put the keyboard back where it came from.
|
|
166
|
+
*
|
|
167
|
+
* The element that had it when the menu opened comes first: a context menu
|
|
168
|
+
* hangs on a REGION — a card, a table row — and Shift+F10 / the Menu key fires
|
|
169
|
+
* `contextmenu` at whatever control inside it the user was actually on, which
|
|
170
|
+
* is their place in the page.
|
|
171
|
+
*
|
|
172
|
+
* The trigger is the fallback, and it needs help to be one. `[wrContextMenu]`
|
|
173
|
+
* adds no `tabindex` and every shape the docs ship is a plain `<div>`, so
|
|
174
|
+
* `focus()` on it does nothing at all — the handback silently missed, leaving
|
|
175
|
+
* the caret in the disposing pane and then on `<body>`, which is the outcome
|
|
176
|
+
* the call is there to prevent. Lending it `tabindex="-1"` for the call and
|
|
177
|
+
* taking that back on blur keeps the consumer's DOM as they wrote it; a
|
|
178
|
+
* permanent `tabindex="0"` would make every right-clickable region a tab stop,
|
|
179
|
+
* which is their decision and not the library's.
|
|
180
|
+
*/
|
|
181
|
+
private handBackFocus;
|
|
138
182
|
private cancelLeaveTimer;
|
|
139
183
|
private scheduleLeave;
|
|
140
184
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrContextMenu, never>;
|
|
@@ -177,9 +221,17 @@ declare class WrContextMenuItem {
|
|
|
177
221
|
private readonly scrollStrategies;
|
|
178
222
|
private readonly destroyRef;
|
|
179
223
|
private submenuRef;
|
|
224
|
+
private submenuKeys;
|
|
180
225
|
private openTimer;
|
|
181
226
|
private closeTimer;
|
|
182
227
|
protected submenuOpen: boolean;
|
|
228
|
+
/**
|
|
229
|
+
* Whether the pending open was asked for by the keyboard (→ / Enter / Space)
|
|
230
|
+
* rather than by hover — only then does the submenu take focus, the same rule
|
|
231
|
+
* `wr-dropdown` applies to its own open. Sweeping the cursor across a row must
|
|
232
|
+
* show its submenu without yanking the caret out of it.
|
|
233
|
+
*/
|
|
234
|
+
private openedByKeyboard;
|
|
183
235
|
/**
|
|
184
236
|
* Id of the submenu's menu element while it is open, published on the item as
|
|
185
237
|
* `aria-controls` — the same contract the root trigger keeps (see
|
|
@@ -243,6 +295,24 @@ declare class WrContextMenuItem {
|
|
|
243
295
|
private cancelOpen;
|
|
244
296
|
private cancelClose;
|
|
245
297
|
private openSubmenu;
|
|
298
|
+
/**
|
|
299
|
+
* @internal Keys routed here while this submenu is the topmost overlay: the
|
|
300
|
+
* arrows walk the rows of the pane the caret is in, and Escape or the arrow
|
|
301
|
+
* pointing BACK the way the menu cascades steps out one level, returning the
|
|
302
|
+
* cursor to the row that owns the pane when the cursor was inside it.
|
|
303
|
+
*
|
|
304
|
+
* Escape closes this level only, not the whole chain — the APG's rule for a
|
|
305
|
+
* submenu. It reaches this handler rather than the root's because the
|
|
306
|
+
* dispatcher stops at the topmost overlay that listens, which is now this one.
|
|
307
|
+
*
|
|
308
|
+
* Which is also why the arrows are aimed at the pane holding the caret rather
|
|
309
|
+
* than at this one. The dispatcher routes by stacking order, not by focus, and
|
|
310
|
+
* a HOVER-opened submenu is topmost while focus is deliberately still on the
|
|
311
|
+
* root row the pointer swept off (see `openedByKeyboard`) — so ArrowDown used
|
|
312
|
+
* to jump into this pane's first row instead of moving down the menu the user
|
|
313
|
+
* is in. Same reason `wr-dropdown`'s menu handler checks ownership.
|
|
314
|
+
*/
|
|
315
|
+
private onSubmenuKeydown;
|
|
246
316
|
/** Bound handlers (= preserves identity for removeEventListener). */
|
|
247
317
|
private readonly onSubmenuEnter;
|
|
248
318
|
private readonly onSubmenuLeave;
|
package/types/ngwr-counter.d.ts
CHANGED
|
@@ -1,12 +1,34 @@
|
|
|
1
|
-
import { WrDateAdapter, WrDateFormat } from 'ngwr/date
|
|
1
|
+
import { WrDateAdapter, WrDateFormat } from 'ngwr/date';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { EnvironmentProviders } from '@angular/core';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* {@link WrDateAdapter} backed by `date-fns`. Same `Date` value type as the
|
|
7
|
-
* native adapter, but defers all math, formatting, and parsing to date-fns
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* native adapter, but defers all math, formatting, and parsing to date-fns —
|
|
8
|
+
* pick this when you want its long patterns (`P`, `PP`, `PPP`, `p`) without
|
|
9
|
+
* writing them by hand.
|
|
10
|
+
*
|
|
11
|
+
* **{@link WR_DATE_LOCALE} does not reach `format` or `parse`, and that is not
|
|
12
|
+
* an oversight.** date-fns resolves those patterns against a date-fns `Locale`
|
|
13
|
+
* OBJECT rather than a BCP 47 tag, and the objects are separate modules —
|
|
14
|
+
* mapping a tag onto one would mean importing all of them, which defeats the
|
|
15
|
+
* tree-shaking that is the reason this is an opt-in entry point. So the named
|
|
16
|
+
* formats render AND read in en-US whatever the tag says, while
|
|
17
|
+
* `getFirstDayOfWeek`, `getDayOfWeekNames` and `getMonthNames` go through `Intl`
|
|
18
|
+
* and do honour it: a calendar heads its columns `пн вт ср` beside a trigger
|
|
19
|
+
* reading `08/11/2025`. Reading is the sharper edge — `11/08/2025` typed by a
|
|
20
|
+
* user in a dd/MM locale parses as 8 November, valid and wrong.
|
|
21
|
+
*
|
|
22
|
+
* The lever is date-fns's own module default, and the adapter passing no locale
|
|
23
|
+
* is precisely what keeps it working. Set it once at bootstrap, or take
|
|
24
|
+
* `provideWrLuxonAdapter()`, which forwards the tag itself:
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { setDefaultOptions } from 'date-fns';
|
|
28
|
+
* import { ru } from 'date-fns/locale';
|
|
29
|
+
*
|
|
30
|
+
* setDefaultOptions({ locale: ru });
|
|
31
|
+
* ```
|
|
10
32
|
*
|
|
11
33
|
* @example
|
|
12
34
|
* ```ts
|
|
@@ -56,8 +78,13 @@ declare class WrDateFnsAdapter extends WrDateAdapter<Date> {
|
|
|
56
78
|
|
|
57
79
|
/**
|
|
58
80
|
* Register the {@link WrDateFnsAdapter} so date-pickers / calendars in this
|
|
59
|
-
* app use `date-fns` for all math and formatting.
|
|
60
|
-
*
|
|
81
|
+
* app use `date-fns` for all math and formatting.
|
|
82
|
+
*
|
|
83
|
+
* `locale` sets {@link WR_DATE_LOCALE}, which this adapter reads for the first
|
|
84
|
+
* day of the week and nothing else — its `format` and `parse` do not pass a
|
|
85
|
+
* locale to date-fns. For localized month names and patterns, set date-fns's own
|
|
86
|
+
* module default with `setDefaultOptions`, or use the luxon adapter, which does
|
|
87
|
+
* thread the tag through everything.
|
|
61
88
|
*
|
|
62
89
|
* @example
|
|
63
90
|
* ```ts
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WrCalendarDayHarness } from 'ngwr/calendar/testing';
|
|
2
|
+
export { WrCalendarDayHarness as WrDatePickerDayHarness } from 'ngwr/calendar/testing';
|
|
3
|
+
import { BaseHarnessFilters, ComponentHarness, TestElement, HarnessLoader, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* @license
|
|
@@ -77,68 +79,6 @@ interface WrDatePickerTimeFields {
|
|
|
77
79
|
readonly seconds?: number;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
|
-
/**
|
|
81
|
-
* @license
|
|
82
|
-
*
|
|
83
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
84
|
-
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
85
|
-
*/
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Test harness for one day cell of the calendar inside a date-picker popup.
|
|
89
|
-
*
|
|
90
|
-
* Reached through `WrDatePickerHarness.getDay()` / `getDays()` (or the range
|
|
91
|
-
* picker's), which scope it to ONE picker's panel — the cells are in the overlay
|
|
92
|
-
* container, so a bare query would answer with whichever picker opened first.
|
|
93
|
-
*
|
|
94
|
-
* State is read the way a screen reader reads it (`role`, `aria-selected`,
|
|
95
|
-
* `aria-disabled`) with the `.wr-calendar__day--*` modifiers filling in what
|
|
96
|
-
* ARIA has no word for: today, the spill days of the neighbouring months, and
|
|
97
|
-
* the interior of a picked range.
|
|
98
|
-
*
|
|
99
|
-
* @see https://ngwr.dev/guides/testing
|
|
100
|
-
*/
|
|
101
|
-
declare class WrDatePickerDayHarness extends ComponentHarness {
|
|
102
|
-
static hostSelector: string;
|
|
103
|
-
/** Build a predicate that narrows the query. */
|
|
104
|
-
static with(options?: WrDatePickerDayHarnessFilters): HarnessPredicate<WrDatePickerDayHarness>;
|
|
105
|
-
/** The day number as rendered. */
|
|
106
|
-
getText(): Promise<string>;
|
|
107
|
-
/** The day number as a number, for mapping a list of cells to dates. */
|
|
108
|
-
getDayOfMonth(): Promise<number>;
|
|
109
|
-
/** `'gridcell'` — the cell is a button, and the grid semantics are what a spec should assert. */
|
|
110
|
-
getRole(): Promise<string | null>;
|
|
111
|
-
/** Whether this day is (one end of) the current selection. */
|
|
112
|
-
isSelected(): Promise<boolean>;
|
|
113
|
-
/**
|
|
114
|
-
* Whether the day refuses selection — `min` / `max` or `dateFilter` ruled it
|
|
115
|
-
* out, or the whole calendar is disabled.
|
|
116
|
-
*/
|
|
117
|
-
isDisabled(): Promise<boolean>;
|
|
118
|
-
/** Whether the cell is today's date. */
|
|
119
|
-
isToday(): Promise<boolean>;
|
|
120
|
-
/**
|
|
121
|
-
* Whether the cell belongs to a neighbouring month. The grid is always 6x7, so
|
|
122
|
-
* every month is padded with days that are selectable but not "in" the month —
|
|
123
|
-
* which is why {@link WrDatePickerHarness.getDay} skips them.
|
|
124
|
-
*/
|
|
125
|
-
isOutOfMonth(): Promise<boolean>;
|
|
126
|
-
/** Whether the day lies strictly between the two ends of a picked range. */
|
|
127
|
-
isInRange(): Promise<boolean>;
|
|
128
|
-
/**
|
|
129
|
-
* Whether this is the roving cell — the grid's single tab stop, and where the
|
|
130
|
-
* arrow keys move from.
|
|
131
|
-
*
|
|
132
|
-
* At most ONE cell answers `true`, and it is not always one: the calendar's
|
|
133
|
-
* roving date does not follow `next()` / `previous()`, so a grid navigated away
|
|
134
|
-
* from that month has no active cell (and, deliberately or not, no tab stop)
|
|
135
|
-
* until a cell is clicked or the arrows move it.
|
|
136
|
-
*/
|
|
137
|
-
isActive(): Promise<boolean>;
|
|
138
|
-
/** Click the cell. A disabled cell swallows the click — assert, do not assume. */
|
|
139
|
-
click(): Promise<void>;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
82
|
/**
|
|
143
83
|
* @license
|
|
144
84
|
*
|
|
@@ -161,18 +101,23 @@ type Unit = (typeof UNITS)[number];
|
|
|
161
101
|
* independently instead of by CSS nth-of-type gymnastics.
|
|
162
102
|
*
|
|
163
103
|
* Units are addressed by position, not by the boxes' `aria-label`: every string
|
|
164
|
-
* in this panel
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* is the layout contract.
|
|
104
|
+
* in this panel now resolves through the i18n catalog (`datePicker.hours`,
|
|
105
|
+
* `datePicker.incrementHours`, `datePicker.am` …), so keying on them would make
|
|
106
|
+
* this harness answer in whatever locale the app under test is configured for.
|
|
107
|
+
* Column order is the layout contract.
|
|
168
108
|
*
|
|
169
109
|
* @internal
|
|
170
110
|
*/
|
|
171
111
|
declare class WrTimePanelHarness extends ComponentHarness {
|
|
172
112
|
static hostSelector: string;
|
|
173
|
-
/** The stepper's value as `HH:MM`, plus `:SS` and
|
|
113
|
+
/** The stepper's value as `HH:MM`, plus `:SS` and a space-joined {@link getMeridiem} when those columns exist. */
|
|
174
114
|
getTimeText(): Promise<string>;
|
|
175
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* The meridiem column's rendered text, or `null` when the stepper is in
|
|
117
|
+
* 24-hour mode. `'AM'` / `'PM'` on the built-in fallbacks — it reads whatever
|
|
118
|
+
* `datePicker.am` / `datePicker.pm` resolve to, so a configured catalog
|
|
119
|
+
* changes the answer.
|
|
120
|
+
*/
|
|
176
121
|
getMeridiem(): Promise<string | null>;
|
|
177
122
|
/**
|
|
178
123
|
* Type into the boxes named by `fields`, leaving the rest alone.
|
|
@@ -277,12 +222,12 @@ declare abstract class WrDatePickerHarnessBase extends ComponentHarness {
|
|
|
277
222
|
* them, since the grid is always six weeks and pads into the neighbouring
|
|
278
223
|
* months.
|
|
279
224
|
*/
|
|
280
|
-
getDays(filters?: WrDatePickerDayHarnessFilters): Promise<
|
|
225
|
+
getDays(filters?: WrDatePickerDayHarnessFilters): Promise<WrCalendarDayHarness[]>;
|
|
281
226
|
/**
|
|
282
227
|
* One day of the month on show. The padding days of the neighbouring months are
|
|
283
228
|
* skipped, so `getDay(1)` is the 1st of THIS month and never the 1st of the next.
|
|
284
229
|
*/
|
|
285
|
-
getDay(dayOfMonth: number): Promise<
|
|
230
|
+
getDay(dayOfMonth: number): Promise<WrCalendarDayHarness>;
|
|
286
231
|
/** Click a day of the month on show. */
|
|
287
232
|
selectDay(dayOfMonth: number): Promise<void>;
|
|
288
233
|
/** The trigger button. Both components render it with the same class. */
|
|
@@ -514,5 +459,5 @@ declare class WrDateRangePickerHarness extends WrDatePickerHarnessBase {
|
|
|
514
459
|
private timePanel;
|
|
515
460
|
}
|
|
516
461
|
|
|
517
|
-
export {
|
|
462
|
+
export { WrDatePickerHarness, WrDateRangePickerHarness };
|
|
518
463
|
export type { WrDatePickerDayHarnessFilters, WrDatePickerHarnessFilters, WrDatePickerTimeFields, WrDateRangePickerHarnessFilters };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { ElementRef } from '@angular/core';
|
|
3
3
|
import { FormValueControl } from '@angular/forms/signals';
|
|
4
|
-
import { WrDateFormat } from 'ngwr/date
|
|
4
|
+
import { WrDateFormat } from 'ngwr/date';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Unified date / time / date-time picker. Same `<input>` + popover skeleton
|
|
@@ -143,6 +143,10 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
|
|
|
143
143
|
* skip the echo of our own edits (so a live keystroke's raw text is never
|
|
144
144
|
* reformatted mid-type). */
|
|
145
145
|
private lastValue;
|
|
146
|
+
/** The format the sync effect last rendered with. Paired with `lastValue`
|
|
147
|
+
* because the echo guard has to answer "is the display still current", and a
|
|
148
|
+
* `[format]` / `[mode]` change makes it stale with the value untouched. */
|
|
149
|
+
private lastFormat;
|
|
146
150
|
constructor();
|
|
147
151
|
protected onInput(event: Event): void;
|
|
148
152
|
protected onBlur(): void;
|
|
@@ -320,9 +324,9 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
|
|
|
320
324
|
/** Resolved format — falls back to a mode-appropriate default. */
|
|
321
325
|
protected readonly resolvedFormat: _angular_core.Signal<string>;
|
|
322
326
|
protected readonly isDateTime: _angular_core.Signal<boolean>;
|
|
323
|
-
protected readonly triggerLabel: string
|
|
324
|
-
protected readonly startLabel: string
|
|
325
|
-
protected readonly endLabel: string
|
|
327
|
+
protected readonly triggerLabel: _angular_core.Signal<string>;
|
|
328
|
+
protected readonly startLabel: _angular_core.Signal<string>;
|
|
329
|
+
protected readonly endLabel: _angular_core.Signal<string>;
|
|
326
330
|
private readonly panelLabelRange;
|
|
327
331
|
private readonly panelLabelRangeDateTime;
|
|
328
332
|
/**
|
|
@@ -145,6 +145,18 @@ declare class WrNativeDateAdapter extends WrDateAdapter<Date> {
|
|
|
145
145
|
format(date: Date, formatKeyOrString: WrDateFormat | (string & {})): string;
|
|
146
146
|
parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): Date | null;
|
|
147
147
|
getFirstDayOfWeek(): number;
|
|
148
|
+
/**
|
|
149
|
+
* One `Intl.DateTimeFormat` per named format, built once.
|
|
150
|
+
*
|
|
151
|
+
* Constructing one is the expensive part of `format()`, and this adapter is
|
|
152
|
+
* called per CELL: `wr-event-calendar` builds an `aria-label` for every time
|
|
153
|
+
* slot on every day, so a week view asked for hundreds of identical
|
|
154
|
+
* formatters. `locale` is injected once and never changes for the life of the
|
|
155
|
+
* adapter, so the cache needs no invalidation — that is the whole reason it
|
|
156
|
+
* can be this simple.
|
|
157
|
+
*/
|
|
158
|
+
private readonly formatters;
|
|
159
|
+
private intl;
|
|
148
160
|
getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[];
|
|
149
161
|
getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[];
|
|
150
162
|
private formatWithTokens;
|
|
@@ -185,12 +197,19 @@ declare function provideWrDateAdapter(options?: WrDateAdapterOptions): Environme
|
|
|
185
197
|
*/
|
|
186
198
|
|
|
187
199
|
/**
|
|
188
|
-
* BCP 47 locale tag
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
* `'en-US'` on the server.
|
|
200
|
+
* BCP 47 locale tag the {@link WrDateAdapter} implementations read. Defaults to
|
|
201
|
+
* `navigator.language` in the browser and `'en-US'` on the server; override via
|
|
202
|
+
* {@link provideWrDateAdapter}'s `locale` option.
|
|
192
203
|
*
|
|
193
|
-
*
|
|
204
|
+
* **How far it reaches depends on the adapter, and the difference matters.**
|
|
205
|
+
* The luxon adapter threads it through everything — every `DateTime` is
|
|
206
|
+
* constructed with it, and `format` / `parse` call `setLocale`. The date-fns
|
|
207
|
+
* adapter reads it only for locale-DERIVED defaults (first day of week); its
|
|
208
|
+
* `format` and `parse` pass no locale to date-fns, so they stay on that
|
|
209
|
+
* library's module default. Setting this token and expecting French month names
|
|
210
|
+
* out of `WrDateFnsAdapter` gets English ones, and the parse side of that
|
|
211
|
+
* mismatch is silent rather than loud — see the adapter's own class docs for the
|
|
212
|
+
* lever (`setDefaultOptions`).
|
|
194
213
|
*/
|
|
195
214
|
declare const WR_DATE_LOCALE: InjectionToken<string>;
|
|
196
215
|
|
|
@@ -0,0 +1,222 @@
|
|
|
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-decrypt-text>` a harness query matches. */
|
|
11
|
+
interface WrDecryptTextHarnessFilters extends BaseHarnessFilters {
|
|
12
|
+
/**
|
|
13
|
+
* Match the string the component ANNOUNCES — the readable copy, never the scramble.
|
|
14
|
+
* A string is an exact match, a RegExp is tested.
|
|
15
|
+
*
|
|
16
|
+
* This is the only stable thing to address one of these by: the visible layer is a
|
|
17
|
+
* fresh random draw on every tick, so a filter written against it would match a
|
|
18
|
+
* different element each time it ran, or none at all.
|
|
19
|
+
*/
|
|
20
|
+
readonly text?: string | RegExp;
|
|
21
|
+
/**
|
|
22
|
+
* Match only settled (`true`) or only scrambled (`false`) instances — the way to pick
|
|
23
|
+
* out the one that has not been revealed yet on a page holding several.
|
|
24
|
+
*
|
|
25
|
+
* Read from the encrypted characters rather than from the glyphs, so it needs no
|
|
26
|
+
* `Math.random` stub. An instance that rendered no characters at all matches NEITHER
|
|
27
|
+
* value: "nothing is encrypted" is true of nothing, and a query is the last place that
|
|
28
|
+
* vacuity should quietly hand back a match.
|
|
29
|
+
*/
|
|
30
|
+
readonly revealed?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @license
|
|
35
|
+
*
|
|
36
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
37
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Test harness for `<wr-decrypt-text>`.
|
|
42
|
+
*
|
|
43
|
+
* **Two layers, two questions, and they are meant to disagree.** The component renders
|
|
44
|
+
* the real string once in a visually-hidden span and the scramble in a parallel
|
|
45
|
+
* `aria-hidden` layer, so {@link getAccessibleText} is what a screen reader hears and
|
|
46
|
+
* {@link getRenderedText} is what a sighted reader sees. Mid-reveal the second is
|
|
47
|
+
* literal gibberish while the first must be untouched — that is the contract, and it is
|
|
48
|
+
* the half nobody looks at. A spec asserting only the visible glyphs would pass on a
|
|
49
|
+
* component that announced `XQ#PZ`.
|
|
50
|
+
*
|
|
51
|
+
* **Prefer the class over the glyphs.** {@link getRevealedIndices},
|
|
52
|
+
* {@link getEncryptedCount} and {@link isFullyRevealed} read
|
|
53
|
+
* `.wr-decrypt-text__char--encrypted`, which is deterministic with no stubbing at all —
|
|
54
|
+
* they are what tell `revealDirection` `'start'` from `'end'` from `'center'`, one index
|
|
55
|
+
* per tick. {@link getRenderedText} reads the glyphs themselves, which are a fresh
|
|
56
|
+
* `Math.random()` draw per tick, so stub it (`vi.spyOn(Math, 'random')
|
|
57
|
+
* .mockReturnValue(0)`) before asserting a string.
|
|
58
|
+
*
|
|
59
|
+
* **The clock is the spec's, not the harness's.** The reveal is a `setInterval` this
|
|
60
|
+
* class does not own, so there is no `advance(ms)` and no `waitUntilRevealed()`: one
|
|
61
|
+
* would flake on a loaded machine and the other would silently require fake timers to
|
|
62
|
+
* have been installed. Fake `setInterval` / `clearInterval` and nothing else — faking
|
|
63
|
+
* the microtask queue freezes the stabilization every `await harness.*()` runs through —
|
|
64
|
+
* then advance the clock yourself between reads.
|
|
65
|
+
*
|
|
66
|
+
* **There is no keyboard path, and this harness does not pretend there is one.**
|
|
67
|
+
* {@link hover}, {@link mouseAway} and {@link click} are the component's only triggers;
|
|
68
|
+
* with `animateOn="click"` the host takes a click handler while carrying no role, no
|
|
69
|
+
* `tabindex` and no keydown handler, so a `focus()` / `sendKeys(Enter)` affordance here
|
|
70
|
+
* would make a spec pass while a keyboard or switch user could not reveal the text at
|
|
71
|
+
* all. There is no `enterViewport()` either: `'view'` and `'inViewHover'` hang off an
|
|
72
|
+
* `IntersectionObserver` jsdom does not implement, so the spec stubs the global and
|
|
73
|
+
* fires it.
|
|
74
|
+
*
|
|
75
|
+
* **Also deliberately absent:** `isAnimating()` — the component has such a signal and it
|
|
76
|
+
* never reaches the DOM, and deriving it from "something is encrypted" would be wrong in
|
|
77
|
+
* exactly the interesting case, since `animateOn="click"` rests fully encrypted and
|
|
78
|
+
* perfectly still. `getSpeed()` / `getMaxIterations()` / `getRevealDirection()` /
|
|
79
|
+
* `getClickMode()` / `getAnimateOn()` — inputs that are never reflected anywhere, so
|
|
80
|
+
* reporting them would mean reading the component instance rather than the rendered
|
|
81
|
+
* control; they are observable as behaviour, which is what the methods above measure.
|
|
82
|
+
* `getScrambleAlphabet()` — the pool is internal and each frame shows one random draw
|
|
83
|
+
* from it, so any reconstruction is a guess that gets worse the shorter the string.
|
|
84
|
+
* `getCharColors()` / `isDimmed()` — the `--encrypted` rule is deliberately EMPTY, a
|
|
85
|
+
* styling hook for consumers, so there is nothing painted to read in any environment.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* const secret = await loader.getHarness(WrDecryptTextHarness.with({ text: 'Hello' }));
|
|
90
|
+
*
|
|
91
|
+
* await secret.hover();
|
|
92
|
+
* vi.advanceTimersByTime(50);
|
|
93
|
+
*
|
|
94
|
+
* expect(await secret.getRevealedIndices()).toEqual([0]); // sequential, from the start
|
|
95
|
+
* expect(await secret.getAccessibleText()).toBe('Hello'); // untouched throughout
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @see https://ngwr.dev/guides/testing
|
|
99
|
+
*/
|
|
100
|
+
declare class WrDecryptTextHarness extends ComponentHarness {
|
|
101
|
+
static hostSelector: string;
|
|
102
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
103
|
+
static with(options?: WrDecryptTextHarnessFilters): HarnessPredicate<WrDecryptTextHarness>;
|
|
104
|
+
private readonly chars;
|
|
105
|
+
private readonly encrypted;
|
|
106
|
+
/**
|
|
107
|
+
* The real string, as the one readable copy holds it.
|
|
108
|
+
*
|
|
109
|
+
* The single highest-value assertion here: it must stay equal to the `text` input on
|
|
110
|
+
* every frame, while the visible layer is unreadable by design. Lose this span and the
|
|
111
|
+
* component announces nothing at all — every drawn character sits under `aria-hidden`,
|
|
112
|
+
* so no other part of the DOM would change.
|
|
113
|
+
*
|
|
114
|
+
* Untrimmed, so that it can be compared against {@link getRenderedText} without one
|
|
115
|
+
* side of the comparison quietly forgiving a lost leading space.
|
|
116
|
+
*/
|
|
117
|
+
getAccessibleText(): Promise<string>;
|
|
118
|
+
/**
|
|
119
|
+
* What is on screen this frame — scramble glyphs and all, in document order.
|
|
120
|
+
*
|
|
121
|
+
* Plain before anything triggers it, gibberish mid-reveal, and the real string once it
|
|
122
|
+
* settles; comparing it against {@link getAccessibleText} is how a spec says which of
|
|
123
|
+
* those it is looking at. `useOriginalCharsOnly` is visible only here — every glyph
|
|
124
|
+
* has to be one the text really contains.
|
|
125
|
+
*
|
|
126
|
+
* Nondeterministic unless the spec stubs `Math.random`, because each unrevealed
|
|
127
|
+
* position is an independent draw from the pool. When the assertion does not actually
|
|
128
|
+
* need the glyphs, {@link getRevealedIndices} answers the same progress question off
|
|
129
|
+
* the class and needs no stub.
|
|
130
|
+
*/
|
|
131
|
+
getRenderedText(): Promise<string>;
|
|
132
|
+
/**
|
|
133
|
+
* How many characters the animation walks.
|
|
134
|
+
*
|
|
135
|
+
* CODE POINTS, not UTF-16 units: `'a🚀b'` is 3 here, and the indices
|
|
136
|
+
* {@link getRevealedIndices} returns line up with `[...text]` rather than with plain
|
|
137
|
+
* `text[i]`. That distinction is not pedantry — counting units gave a sequential
|
|
138
|
+
* reveal extra ticks with no character to spend them on, and made "everything is
|
|
139
|
+
* revealed" disagree with what was on screen.
|
|
140
|
+
*/
|
|
141
|
+
getCharCount(): Promise<number>;
|
|
142
|
+
/**
|
|
143
|
+
* The positions that have settled on their real character, ascending.
|
|
144
|
+
*
|
|
145
|
+
* The payload method, and the deterministic one: it reads the `--encrypted` modifier
|
|
146
|
+
* rather than the glyphs, so no `Math.random` stub is involved. It is the only thing
|
|
147
|
+
* that separates `revealDirection` `'start'` (`[0]`, `[0, 1]`, …) from `'end'`
|
|
148
|
+
* (`[4]`, `[3, 4]`, …) from `'center'` (`[2]`, `[1, 2]`, …), and one index per tick is
|
|
149
|
+
* what makes a sequential reveal sequential.
|
|
150
|
+
*
|
|
151
|
+
* Ascending by position, NOT in the order the reveal visited them — the DOM records
|
|
152
|
+
* which characters have landed, never the path taken to them. Assert the set after
|
|
153
|
+
* each tick to pin an order.
|
|
154
|
+
*/
|
|
155
|
+
getRevealedIndices(): Promise<number[]>;
|
|
156
|
+
/**
|
|
157
|
+
* How many characters are still scrambled.
|
|
158
|
+
*
|
|
159
|
+
* The coarse progress read, and the cheapest way to say "scrambled on hover", "plain on
|
|
160
|
+
* leave", or "a reader who asked for less motion never saw a scramble at all". Class-
|
|
161
|
+
* based like {@link getRevealedIndices}, so it too is random-proof.
|
|
162
|
+
*/
|
|
163
|
+
getEncryptedCount(): Promise<number>;
|
|
164
|
+
/**
|
|
165
|
+
* Whether every character has settled.
|
|
166
|
+
*
|
|
167
|
+
* Deliberately does NOT also compare {@link getRenderedText} against
|
|
168
|
+
* {@link getAccessibleText}: folding two conditions into one boolean hides which of
|
|
169
|
+
* them broke, and a spec that wants both should write both lines.
|
|
170
|
+
*
|
|
171
|
+
* Throws when nothing was rendered. "No character is encrypted" is true of no
|
|
172
|
+
* characters, which is the same answer a component that stopped rendering its text
|
|
173
|
+
* would give — and this is the method most likely to be the only assertion in a test.
|
|
174
|
+
*/
|
|
175
|
+
isFullyRevealed(): Promise<boolean>;
|
|
176
|
+
/**
|
|
177
|
+
* Whether the scramble layer is out of the accessibility tree.
|
|
178
|
+
*
|
|
179
|
+
* The contract that keeps a screen reader from spelling out `XQ#PZ` beside the real
|
|
180
|
+
* string it already read. Worth a method rather than an assumption because the wrapper
|
|
181
|
+
* holding the characters carries NO class — it can only be addressed as the readable
|
|
182
|
+
* span's next sibling, which any template reshuffle breaks.
|
|
183
|
+
*
|
|
184
|
+
* Throws when that structural selector finds nothing, rather than returning `false`: a
|
|
185
|
+
* missing wrapper and an unhidden one are different failures, and the answer to
|
|
186
|
+
* "is the scramble hidden" when there is no scramble layer at all is not `false`.
|
|
187
|
+
*/
|
|
188
|
+
isAnimatedLayerHidden(): Promise<boolean>;
|
|
189
|
+
/**
|
|
190
|
+
* Point at it — the trigger for `animateOn` `'hover'` and `'inViewHover'`.
|
|
191
|
+
*
|
|
192
|
+
* Drives the component the way a user does, and works in a test because the trigger is
|
|
193
|
+
* an event rather than a gesture: `TestElement.hover()` dispatches `pointerenter`,
|
|
194
|
+
* `mouseover` and `mouseenter`, and the component listens for the last of those. A
|
|
195
|
+
* hand-rolled pointer-only dispatch would not reach it.
|
|
196
|
+
*
|
|
197
|
+
* Does nothing in the other two modes, exactly as a real pointer does nothing there.
|
|
198
|
+
*/
|
|
199
|
+
hover(): Promise<void>;
|
|
200
|
+
/**
|
|
201
|
+
* Move the pointer off — the other half of hover mode.
|
|
202
|
+
*
|
|
203
|
+
* Pins the promise that leaving mid-scramble restores the real text IMMEDIATELY rather
|
|
204
|
+
* than letting the reveal play out: the reader took the effect away, so the string has
|
|
205
|
+
* to come back at once.
|
|
206
|
+
*/
|
|
207
|
+
mouseAway(): Promise<void>;
|
|
208
|
+
/**
|
|
209
|
+
* Click the host — the `animateOn="click"` trigger, and the only way to tell
|
|
210
|
+
* `clickMode` `'once'` from `'toggle'`.
|
|
211
|
+
*
|
|
212
|
+
* There is no keyboard equivalent, and that is a statement about the component rather
|
|
213
|
+
* than about this harness: in click mode the host carries a click handler with no role,
|
|
214
|
+
* no `tabindex` and no keydown handler, so a keyboard or switch user cannot reveal the
|
|
215
|
+
* text at all. A `sendKeys(Enter)` here would invent an affordance that does not exist
|
|
216
|
+
* and let a spec pass over the top of it.
|
|
217
|
+
*/
|
|
218
|
+
click(): Promise<void>;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export { WrDecryptTextHarness };
|
|
222
|
+
export type { WrDecryptTextHarnessFilters };
|