ngwr 10.2.1 → 11.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 +39 -19
- package/anchor/styles/_index.scss +4 -4
- package/back-top/styles/_index.scss +6 -1
- package/blur-text/styles/_index.scss +13 -0
- package/button/styles/_index.scss +11 -6
- package/carousel/styles/_index.scss +13 -2
- package/cascader/styles/_index.scss +2 -2
- package/circular-text/styles/_index.scss +2 -0
- package/collapse/styles/_index.scss +1 -1
- package/color-picker/styles/_index.scss +6 -1
- package/compare/styles/_index.scss +1 -2
- package/context-menu/styles/_index.scss +6 -1
- package/descriptions/styles/_index.scss +2 -2
- package/dialog/styles/_index.scss +7 -0
- package/drawer/styles/_index.scss +20 -1
- package/dropdown/styles/_index.scss +19 -5
- package/empty/styles/_index.scss +10 -0
- package/fesm2022/ngwr-action-sheet.mjs +13 -3
- package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
- package/fesm2022/ngwr-affix.mjs +40 -13
- package/fesm2022/ngwr-affix.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +18 -6
- package/fesm2022/ngwr-anchor.mjs.map +1 -1
- package/fesm2022/ngwr-aurora.mjs +2 -2
- package/fesm2022/ngwr-aurora.mjs.map +1 -1
- package/fesm2022/ngwr-avatar.mjs +31 -7
- package/fesm2022/ngwr-avatar.mjs.map +1 -1
- package/fesm2022/ngwr-back-top.mjs +6 -2
- package/fesm2022/ngwr-back-top.mjs.map +1 -1
- package/fesm2022/ngwr-badge.mjs +1 -1
- package/fesm2022/ngwr-badge.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +30 -9
- package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text.mjs +2 -2
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow.mjs +2 -2
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +9 -4
- package/fesm2022/ngwr-burger.mjs.map +1 -1
- package/fesm2022/ngwr-button-testing.mjs +96 -0
- package/fesm2022/ngwr-button-testing.mjs.map +1 -0
- package/fesm2022/ngwr-button.mjs +31 -14
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +40 -8
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +20 -1
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +2 -2
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel-testing.mjs +377 -0
- package/fesm2022/ngwr-carousel-testing.mjs.map +1 -0
- package/fesm2022/ngwr-carousel.mjs +67 -13
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader-testing.mjs +534 -0
- package/fesm2022/ngwr-cascader-testing.mjs.map +1 -0
- package/fesm2022/ngwr-cascader.mjs +2 -2
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox-testing.mjs +90 -0
- package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -0
- package/fesm2022/ngwr-checkbox.mjs +9 -3
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +2 -2
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-click-spark.mjs +2 -2
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-collapse-testing.mjs +368 -0
- package/fesm2022/ngwr-collapse-testing.mjs.map +1 -0
- package/fesm2022/ngwr-color-picker.mjs +134 -14
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette-testing.mjs +589 -0
- package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -0
- package/fesm2022/ngwr-command-palette.mjs +58 -8
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +103 -13
- package/fesm2022/ngwr-compare.mjs.map +1 -1
- package/fesm2022/ngwr-config.mjs +106 -0
- package/fesm2022/ngwr-config.mjs.map +1 -0
- package/fesm2022/ngwr-context-menu-testing.mjs +631 -0
- package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -0
- package/fesm2022/ngwr-context-menu.mjs +94 -8
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +5 -1
- package/fesm2022/ngwr-cookie.mjs.map +1 -1
- package/fesm2022/ngwr-counter.mjs +11 -3
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapter-luxon.mjs +52 -4
- package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapter.mjs +54 -8
- package/fesm2022/ngwr-date-adapter.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker-testing.mjs +766 -0
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -0
- package/fesm2022/ngwr-date-picker.mjs +73 -3
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text.mjs +27 -9
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-dialog-testing.mjs +89 -0
- package/fesm2022/ngwr-dialog-testing.mjs.map +1 -0
- package/fesm2022/ngwr-directives.mjs +36 -12
- package/fesm2022/ngwr-directives.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart.mjs +22 -5
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +2 -2
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer-testing.mjs +250 -0
- package/fesm2022/ngwr-drawer-testing.mjs.map +1 -0
- package/fesm2022/ngwr-dropdown-testing.mjs +291 -0
- package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -0
- package/fesm2022/ngwr-dropdown.mjs +10 -2
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +24 -7
- package/fesm2022/ngwr-empty.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar.mjs +57 -10
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text.mjs +2 -2
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload-testing.mjs +332 -0
- package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -0
- package/fesm2022/ngwr-form-testing.mjs +451 -0
- package/fesm2022/ngwr-form-testing.mjs.map +1 -0
- package/fesm2022/ngwr-form.mjs +19 -3
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +9 -2
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +19 -5
- package/fesm2022/ngwr-gauge.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +2 -2
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text.mjs +2 -2
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +50 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +48 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +23 -0
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number-testing.mjs +306 -0
- package/fesm2022/ngwr-input-number-testing.mjs.map +1 -0
- package/fesm2022/ngwr-input-number.mjs +35 -3
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp-testing.mjs +419 -0
- package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -0
- package/fesm2022/ngwr-input-otp.mjs +36 -5
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input-testing.mjs +102 -0
- package/fesm2022/ngwr-input-testing.mjs.map +1 -0
- package/fesm2022/ngwr-input.mjs +47 -10
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +44 -8
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-layout.mjs +21 -5
- package/fesm2022/ngwr-layout.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox.mjs +33 -6
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +17 -4
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +2 -2
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +2 -2
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-markdown-testing.mjs +516 -0
- package/fesm2022/ngwr-markdown-testing.mjs.map +1 -0
- package/fesm2022/ngwr-markdown.mjs +1492 -0
- package/fesm2022/ngwr-markdown.mjs.map +1 -0
- package/fesm2022/ngwr-marquee.mjs +17 -6
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-mention-testing.mjs +513 -0
- package/fesm2022/ngwr-mention-testing.mjs.map +1 -0
- package/fesm2022/ngwr-mention.mjs +10 -1
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +22 -7
- package/fesm2022/ngwr-meta.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +19 -5
- package/fesm2022/ngwr-meter-group.mjs.map +1 -1
- package/fesm2022/ngwr-overlay.mjs +41 -1
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-pagination-testing.mjs +389 -0
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -0
- package/fesm2022/ngwr-pagination.mjs +14 -2
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm-testing.mjs +309 -0
- package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -0
- package/fesm2022/ngwr-popconfirm.mjs +95 -17
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover-testing.mjs +316 -0
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -0
- package/fesm2022/ngwr-popover.mjs +21 -3
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-pull-to-refresh.mjs +17 -2
- package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
- package/fesm2022/ngwr-qr.mjs +13 -3
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio-testing.mjs +392 -0
- package/fesm2022/ngwr-radio-testing.mjs.map +1 -0
- package/fesm2022/ngwr-radio.mjs +10 -3
- package/fesm2022/ngwr-radio.mjs.map +1 -1
- package/fesm2022/ngwr-rating-testing.mjs +384 -0
- package/fesm2022/ngwr-rating-testing.mjs.map +1 -0
- package/fesm2022/ngwr-rating.mjs +37 -2
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-segmented-testing.mjs +512 -0
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -0
- package/fesm2022/ngwr-select-testing.mjs +268 -0
- package/fesm2022/ngwr-select-testing.mjs.map +1 -0
- package/fesm2022/ngwr-select.mjs +87 -16
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +2 -2
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +65 -12
- package/fesm2022/ngwr-sidebar.mjs.map +1 -1
- package/fesm2022/ngwr-slider-testing.mjs +478 -0
- package/fesm2022/ngwr-slider-testing.mjs.map +1 -0
- package/fesm2022/ngwr-slider.mjs +57 -13
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +26 -6
- package/fesm2022/ngwr-sparkline.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial.mjs +37 -4
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spinner.mjs +12 -3
- package/fesm2022/ngwr-spinner.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor.mjs +2 -2
- package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
- package/fesm2022/ngwr-split-text.mjs +2 -2
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +70 -9
- package/fesm2022/ngwr-splitter.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card.mjs +2 -2
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +2 -2
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +24 -7
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper-testing.mjs +477 -0
- package/fesm2022/ngwr-stepper-testing.mjs.map +1 -0
- package/fesm2022/ngwr-switch-testing.mjs +77 -0
- package/fesm2022/ngwr-switch-testing.mjs.map +1 -0
- package/fesm2022/ngwr-switch.mjs +9 -3
- package/fesm2022/ngwr-switch.mjs.map +1 -1
- package/fesm2022/ngwr-table-testing.mjs +580 -0
- package/fesm2022/ngwr-table-testing.mjs.map +1 -0
- package/fesm2022/ngwr-table.mjs +87 -14
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-testing.mjs +617 -0
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tabs.mjs +38 -6
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea-testing.mjs +238 -0
- package/fesm2022/ngwr-textarea-testing.mjs.map +1 -0
- package/fesm2022/ngwr-textarea.mjs +32 -4
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card.mjs +2 -2
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-toast-testing.mjs +101 -0
- package/fesm2022/ngwr-toast-testing.mjs.map +1 -0
- package/fesm2022/ngwr-toast.mjs +2 -2
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-tour.mjs +61 -9
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer-testing.mjs +538 -0
- package/fesm2022/ngwr-transfer-testing.mjs.map +1 -0
- package/fesm2022/ngwr-transfer.mjs +45 -14
- package/fesm2022/ngwr-transfer.mjs.map +1 -1
- package/fesm2022/ngwr-tree-testing.mjs +734 -0
- package/fesm2022/ngwr-tree-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tree.mjs +73 -7
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter.mjs +5 -3
- package/fesm2022/ngwr-typewriter.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 +31 -5
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves.mjs +3 -3
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +8 -0
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/gauge/styles/_index.scss +1 -1
- package/glitch-text/styles/_index.scss +4 -0
- package/i18n/en.json +48 -0
- package/i18n/ru.json +48 -0
- package/image-cropper/styles/_index.scss +13 -1
- package/input/styles/_index.scss +2 -2
- package/input-number/styles/_index.scss +7 -2
- package/knob/styles/_index.scss +8 -1
- package/layout/styles/_index.scss +3 -3
- package/lightbox/styles/_index.scss +10 -2
- package/line-chart/styles/_index.scss +6 -0
- package/llms-full.txt +151 -4
- package/llms.txt +57 -8
- package/loading-bar/styles/_index.scss +1 -2
- package/markdown/styles/_index.scss +296 -0
- package/marquee/styles/_index.scss +12 -0
- package/mcp/api.js +512 -0
- package/mcp/catalog.js +157 -0
- package/mcp/server.js +273 -0
- package/mcp/tools.js +366 -0
- package/meter-group/styles/_index.scss +1 -1
- package/package.json +186 -35
- package/pagination/styles/_index.scss +6 -6
- package/popover/styles/_index.scss +37 -5
- package/rating/styles/_index.scss +10 -0
- package/schematics/use/symbol-map.json +2 -0
- package/segmented/styles/_index.scss +7 -0
- package/select/styles/_index.scss +29 -9
- package/sidebar/styles/_index.scss +30 -5
- package/slider/styles/_index.scss +15 -0
- package/speed-dial/styles/_index.scss +20 -0
- package/split-text/styles/_index.scss +13 -0
- package/star-border/styles/_index.scss +2 -0
- package/stepper/styles/_index.scss +1 -1
- package/styles/_grid.scss +4 -4
- package/styles.scss +1 -0
- package/switch/styles/_index.scss +5 -3
- package/table/styles/_index.scss +22 -11
- package/tabs/styles/_index.scss +11 -1
- package/textarea/styles/_index.scss +5 -0
- package/theme/styles/_colors.scss +29 -13
- package/theme/styles/_dark.scss +11 -3
- package/theme/styles/_mixins.scss +3 -0
- package/timeline/styles/_index.scss +2 -2
- package/toast/styles/_index.scss +17 -8
- package/toolbar/styles/_index.scss +3 -3
- package/tour/styles/_index.scss +7 -1
- package/tree/styles/_index.scss +5 -3
- package/types/ngwr-action-sheet.d.ts +9 -1
- package/types/ngwr-affix.d.ts +7 -1
- package/types/ngwr-anchor.d.ts +8 -1
- package/types/ngwr-avatar.d.ts +13 -3
- package/types/ngwr-bar-chart.d.ts +16 -0
- package/types/ngwr-burger.d.ts +6 -2
- package/types/ngwr-button-testing.d.ts +85 -0
- package/types/ngwr-button.d.ts +26 -10
- package/types/ngwr-calendar-heatmap.d.ts +16 -2
- package/types/ngwr-calendar.d.ts +10 -0
- package/types/ngwr-carousel-testing.d.ts +257 -0
- package/types/ngwr-carousel.d.ts +20 -4
- package/types/ngwr-cascader-testing.d.ts +392 -0
- package/types/ngwr-checkbox-testing.d.ts +77 -0
- package/types/ngwr-checkbox.d.ts +7 -2
- package/types/ngwr-collapse-testing.d.ts +290 -0
- package/types/ngwr-color-picker.d.ts +20 -11
- package/types/ngwr-command-palette-testing.d.ts +437 -0
- package/types/ngwr-command-palette.d.ts +25 -2
- package/types/ngwr-compare.d.ts +50 -2
- package/types/ngwr-config.d.ts +176 -0
- package/types/ngwr-context-menu-testing.d.ts +401 -0
- package/types/ngwr-context-menu.d.ts +65 -17
- package/types/ngwr-counter.d.ts +6 -1
- package/types/ngwr-date-adapter-luxon.d.ts +26 -0
- package/types/ngwr-date-picker-testing.d.ts +518 -0
- package/types/ngwr-date-picker.d.ts +4 -0
- package/types/ngwr-dialog-testing.d.ts +79 -0
- package/types/ngwr-directives.d.ts +10 -1
- package/types/ngwr-donut-chart.d.ts +8 -1
- package/types/ngwr-drawer-testing.d.ts +196 -0
- package/types/ngwr-dropdown-testing.d.ts +202 -0
- package/types/ngwr-dropdown.d.ts +7 -1
- package/types/ngwr-empty.d.ts +19 -4
- package/types/ngwr-event-calendar.d.ts +26 -1
- package/types/ngwr-file-upload-testing.d.ts +194 -0
- package/types/ngwr-form-testing.d.ts +379 -0
- package/types/ngwr-form.d.ts +17 -0
- package/types/ngwr-gauge.d.ts +13 -1
- package/types/ngwr-image-cropper.d.ts +10 -0
- package/types/ngwr-input-number-testing.d.ts +226 -0
- package/types/ngwr-input-number.d.ts +29 -1
- package/types/ngwr-input-otp-testing.d.ts +299 -0
- package/types/ngwr-input-otp.d.ts +23 -2
- package/types/ngwr-input-testing.d.ts +84 -0
- package/types/ngwr-input.d.ts +20 -6
- package/types/ngwr-knob.d.ts +18 -0
- package/types/ngwr-layout.d.ts +1 -0
- package/types/ngwr-lightbox.d.ts +17 -3
- package/types/ngwr-line-chart.d.ts +9 -2
- package/types/ngwr-markdown-testing.d.ts +462 -0
- package/types/ngwr-markdown.d.ts +534 -0
- package/types/ngwr-marquee.d.ts +12 -2
- package/types/ngwr-mention-testing.d.ts +359 -0
- package/types/ngwr-meta.d.ts +4 -2
- package/types/ngwr-meter-group.d.ts +11 -1
- package/types/ngwr-overlay.d.ts +33 -2
- package/types/ngwr-pagination-testing.d.ts +291 -0
- package/types/ngwr-pagination.d.ts +1 -0
- package/types/ngwr-popconfirm-testing.d.ts +235 -0
- package/types/ngwr-popconfirm.d.ts +31 -21
- package/types/ngwr-popover-testing.d.ts +221 -0
- package/types/ngwr-popover.d.ts +9 -0
- package/types/ngwr-pull-to-refresh.d.ts +7 -0
- package/types/ngwr-qr.d.ts +9 -1
- package/types/ngwr-radio-testing.d.ts +296 -0
- package/types/ngwr-radio.d.ts +8 -2
- package/types/ngwr-rating-testing.d.ts +291 -0
- package/types/ngwr-rating.d.ts +23 -0
- package/types/ngwr-segmented-testing.d.ts +401 -0
- package/types/ngwr-select-testing.d.ts +175 -0
- package/types/ngwr-select.d.ts +45 -4
- package/types/ngwr-sidebar.d.ts +17 -2
- package/types/ngwr-slider-testing.d.ts +329 -0
- package/types/ngwr-slider.d.ts +35 -1
- package/types/ngwr-sparkline.d.ts +12 -2
- package/types/ngwr-speed-dial.d.ts +17 -18
- package/types/ngwr-spinner.d.ts +8 -1
- package/types/ngwr-splitter.d.ts +24 -1
- package/types/ngwr-statistic.d.ts +12 -2
- package/types/ngwr-stepper-testing.d.ts +346 -0
- package/types/ngwr-switch-testing.d.ts +66 -0
- package/types/ngwr-switch.d.ts +7 -2
- package/types/ngwr-table-testing.d.ts +423 -0
- package/types/ngwr-table.d.ts +42 -0
- package/types/ngwr-tabs-testing.d.ts +470 -0
- package/types/ngwr-tabs.d.ts +9 -0
- package/types/ngwr-textarea-testing.d.ts +184 -0
- package/types/ngwr-textarea.d.ts +7 -2
- package/types/ngwr-toast-testing.d.ts +80 -0
- package/types/ngwr-tour.d.ts +27 -0
- package/types/ngwr-transfer-testing.d.ts +444 -0
- package/types/ngwr-transfer.d.ts +16 -1
- package/types/ngwr-tree-testing.d.ts +501 -0
- package/types/ngwr-tree.d.ts +33 -0
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-virtual-scroll.d.ts +13 -1
- package/typewriter/styles/_index.scss +1 -1
- package/typography/styles/_index.scss +1 -1
- package/window/styles/_index.scss +32 -9
package/types/ngwr-textarea.d.ts
CHANGED
|
@@ -35,8 +35,12 @@ declare class WrTextarea implements FormValueControl<string> {
|
|
|
35
35
|
*/
|
|
36
36
|
readonly ariaLabel: _angular_core.InputSignal<string | null>;
|
|
37
37
|
protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
|
|
38
|
-
/**
|
|
39
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Control size — shares the `--wr-control-*` contract. Unset, it falls back to
|
|
40
|
+
* `provideWrConfig({ textarea: { size } })`. @default 'md'
|
|
41
|
+
*/
|
|
42
|
+
readonly size: _angular_core.InputSignal<WrTextareaSize | null>;
|
|
43
|
+
protected readonly resolvedSize: _angular_core.Signal<"sm" | "md" | "lg">;
|
|
40
44
|
/** Visible row count. @default 3 */
|
|
41
45
|
readonly rows: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
42
46
|
/** Allow user resize via the corner grip. @default true */
|
|
@@ -83,6 +87,7 @@ declare class WrTextarea implements FormValueControl<string> {
|
|
|
83
87
|
protected startResize(event: PointerEvent): void;
|
|
84
88
|
protected onResize(event: PointerEvent): void;
|
|
85
89
|
protected endResize(event: PointerEvent): void;
|
|
90
|
+
private releaseHeight;
|
|
86
91
|
private autofit;
|
|
87
92
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTextarea, never>;
|
|
88
93
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTextarea, "wr-textarea", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "autosize": { "alias": "autosize"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
import { WrToastType } from 'ngwr/toast';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @license
|
|
6
|
+
*
|
|
7
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
8
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Narrows which toast a harness query matches. */
|
|
12
|
+
interface WrToastHarnessFilters extends BaseHarnessFilters {
|
|
13
|
+
/** Match the toast's message — a string is an exact match, a RegExp is tested. */
|
|
14
|
+
readonly message?: string | RegExp;
|
|
15
|
+
/** Match the toast's title. A toast with no title never matches. */
|
|
16
|
+
readonly title?: string | RegExp;
|
|
17
|
+
/** Match the intent: `info`, `success`, `warning` or `danger`. */
|
|
18
|
+
readonly type?: WrToastType;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @license
|
|
23
|
+
*
|
|
24
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
25
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Test harness for a toast shown with `WrToast.show()`.
|
|
30
|
+
*
|
|
31
|
+
* Toasts live in the overlay, so load this from
|
|
32
|
+
* `TestbedHarnessEnvironment.documentRootLoader()`. What is worth asserting on a
|
|
33
|
+
* toast is mostly what it ANNOUNCES: `getRole()` and `getLiveLevel()` are how a
|
|
34
|
+
* screen-reader user learns something happened, and they escalate with the
|
|
35
|
+
* intent — a `danger` toast interrupts, an `info` toast waits its turn.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture);
|
|
40
|
+
* const toast = await rootLoader.getHarness(WrToastHarness.with({ type: 'danger' }));
|
|
41
|
+
*
|
|
42
|
+
* expect(await toast.getMessage()).toBe('Could not save');
|
|
43
|
+
* expect(await toast.getRole()).toBe('alert');
|
|
44
|
+
* await toast.dismiss();
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @see https://ngwr.dev/guides/testing
|
|
48
|
+
*/
|
|
49
|
+
declare class WrToastHarness extends ComponentHarness {
|
|
50
|
+
static hostSelector: string;
|
|
51
|
+
/** Build a predicate that narrows the query — several toasts are usually stacked. */
|
|
52
|
+
static with(options?: WrToastHarnessFilters): HarnessPredicate<WrToastHarness>;
|
|
53
|
+
/** The toast's message line. */
|
|
54
|
+
getMessage(): Promise<string>;
|
|
55
|
+
/** The toast's title, or `null` when it was shown without one. */
|
|
56
|
+
getTitle(): Promise<string | null>;
|
|
57
|
+
/** The intent, read from the `wr-toast--*` modifier. */
|
|
58
|
+
getType(): Promise<WrToastType | null>;
|
|
59
|
+
/** `'alert'` for a danger toast, `'status'` otherwise — how urgently it interrupts. */
|
|
60
|
+
getRole(): Promise<string | null>;
|
|
61
|
+
/** `'assertive'` for danger and warning, `'polite'` otherwise. */
|
|
62
|
+
getLiveLevel(): Promise<string | null>;
|
|
63
|
+
/** Whether the toast offers a dismiss button. */
|
|
64
|
+
isDismissible(): Promise<boolean>;
|
|
65
|
+
/** Whether the toast offers a copy button. */
|
|
66
|
+
hasCopyAction(): Promise<boolean>;
|
|
67
|
+
/** Click the dismiss button. Throws on a toast shown `dismissible: false`. */
|
|
68
|
+
dismiss(): Promise<void>;
|
|
69
|
+
/** Click the copy button. Throws unless the toast was shown `showCopy: true`. */
|
|
70
|
+
copy(): Promise<void>;
|
|
71
|
+
/** Whether the auto-dismiss progress bar is showing. */
|
|
72
|
+
hasProgressBar(): Promise<boolean>;
|
|
73
|
+
/** Hover the toast — which is what pauses its auto-dismiss timer. */
|
|
74
|
+
hover(): Promise<void>;
|
|
75
|
+
/** Move the pointer away again, resuming the timer. */
|
|
76
|
+
mouseAway(): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { WrToastHarness };
|
|
80
|
+
export type { WrToastHarnessFilters };
|
package/types/ngwr-tour.d.ts
CHANGED
|
@@ -51,6 +51,7 @@ interface WrTourStep {
|
|
|
51
51
|
*/
|
|
52
52
|
declare class WrTour {
|
|
53
53
|
private readonly overlay;
|
|
54
|
+
private readonly dir;
|
|
54
55
|
private readonly scrollStrategies;
|
|
55
56
|
private readonly injector;
|
|
56
57
|
private readonly focusTrapFactory;
|
|
@@ -59,6 +60,7 @@ declare class WrTour {
|
|
|
59
60
|
private readonly steps;
|
|
60
61
|
private readonly cursor;
|
|
61
62
|
private overlayRef;
|
|
63
|
+
private focusTrap;
|
|
62
64
|
private spotlight;
|
|
63
65
|
private detachKeydown;
|
|
64
66
|
private detachReposition;
|
|
@@ -71,6 +73,15 @@ declare class WrTour {
|
|
|
71
73
|
readonly total: _angular_core.Signal<number>;
|
|
72
74
|
/** The step being shown, or `null` when idle. */
|
|
73
75
|
readonly step: _angular_core.Signal<WrTourStep | null>;
|
|
76
|
+
private readonly noStepAfter;
|
|
77
|
+
/**
|
|
78
|
+
* Whether this is the last step the user will see. Not `index() === total() - 1`:
|
|
79
|
+
* a trailing step whose target is missing is skipped, so comparing against the
|
|
80
|
+
* raw count left the primary button reading "Next" on the final card and then
|
|
81
|
+
* ending the tour when it was pressed.
|
|
82
|
+
*/
|
|
83
|
+
readonly isLast: _angular_core.Signal<boolean>;
|
|
84
|
+
constructor();
|
|
74
85
|
/**
|
|
75
86
|
* Begin a tour. Restarts if one is already running. A no-op under SSR — a
|
|
76
87
|
* tour is a client-side affordance and there is nothing to spotlight on the
|
|
@@ -89,10 +100,20 @@ declare class WrTour {
|
|
|
89
100
|
* between two dead ends.
|
|
90
101
|
*/
|
|
91
102
|
private goTo;
|
|
103
|
+
/** Whether the tour has a step past `index` that can actually be shown. */
|
|
104
|
+
private anyResolvableAfter;
|
|
92
105
|
private resolve;
|
|
93
106
|
private openStep;
|
|
94
107
|
private placeSpotlight;
|
|
95
108
|
private teardownStep;
|
|
109
|
+
/**
|
|
110
|
+
* Whether the app reads right-to-left.
|
|
111
|
+
*
|
|
112
|
+
* Optional inject: `Directionality` is root-provided, so this is never null in
|
|
113
|
+
* an app — but a bare `TestBed` that provides nothing should still get a
|
|
114
|
+
* component that works, and defaulting to LTR is the honest fallback.
|
|
115
|
+
*/
|
|
116
|
+
private isRtl;
|
|
96
117
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTour, never>;
|
|
97
118
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<WrTour>;
|
|
98
119
|
}
|
|
@@ -102,6 +123,12 @@ interface WrTourController {
|
|
|
102
123
|
readonly index: () => number;
|
|
103
124
|
readonly total: () => number;
|
|
104
125
|
readonly step: () => WrTourStep | null;
|
|
126
|
+
/**
|
|
127
|
+
* Whether this is the last step the user will actually see — the service looks
|
|
128
|
+
* ahead for a reachable one, because a trailing step whose target is missing gets
|
|
129
|
+
* skipped and the raw count would call the final card "Next".
|
|
130
|
+
*/
|
|
131
|
+
readonly isLast: () => boolean;
|
|
105
132
|
next(): void;
|
|
106
133
|
prev(): void;
|
|
107
134
|
stop(): void;
|
|
@@ -0,0 +1,444 @@
|
|
|
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
|
+
* Which pane of a `<wr-transfer>` a call is about — the left one (`'source'`, the
|
|
11
|
+
* rows NOT in the value) or the right one (`'target'`, the rows that are).
|
|
12
|
+
*
|
|
13
|
+
* These are the component's own two names for the panes, `[sourceTitle]` /
|
|
14
|
+
* `[targetTitle]` and the `wr-transfer__pane--target` modifier, rather than
|
|
15
|
+
* left / right: a pane's side is a fact about the value it stands for, and under
|
|
16
|
+
* `dir="rtl"` the left pane is on the right.
|
|
17
|
+
*/
|
|
18
|
+
type WrTransferSide = 'source' | 'target';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @license
|
|
22
|
+
*
|
|
23
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
24
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** Narrows which `<wr-transfer>` a harness query matches. */
|
|
28
|
+
interface WrTransferHarnessFilters extends BaseHarnessFilters {
|
|
29
|
+
/** Match the LEFT pane's heading. A string is an exact match, a RegExp is tested. */
|
|
30
|
+
readonly sourceTitle?: string | RegExp;
|
|
31
|
+
/** Match the RIGHT pane's heading. A string is an exact match, a RegExp is tested. */
|
|
32
|
+
readonly targetTitle?: string | RegExp;
|
|
33
|
+
/**
|
|
34
|
+
* Match a transfer SHOWING a row with this label, in either pane — the readable
|
|
35
|
+
* way to tell two transfers apart, since both headings fall back to the same
|
|
36
|
+
* built-in strings when a template sets neither. A row a pane's filter has hidden
|
|
37
|
+
* is not rendered and does not count.
|
|
38
|
+
*/
|
|
39
|
+
readonly itemLabel?: string | RegExp;
|
|
40
|
+
/** Match only transfers with a filter box above each pane (`true`) or without (`false`). */
|
|
41
|
+
readonly searchable?: boolean;
|
|
42
|
+
/** Match only disabled (`true`) or only enabled (`false`) transfers. */
|
|
43
|
+
readonly disabled?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** Narrows which pane of a transfer a harness query matches. */
|
|
46
|
+
interface WrTransferPaneHarnessFilters extends BaseHarnessFilters {
|
|
47
|
+
/** Match one side — what `WrTransferHarness.getPane()` narrows by. */
|
|
48
|
+
readonly side?: WrTransferSide;
|
|
49
|
+
/** Match the pane's heading. A string is an exact match, a RegExp is tested. */
|
|
50
|
+
readonly title?: string | RegExp;
|
|
51
|
+
}
|
|
52
|
+
/** Narrows which row inside a pane a harness query matches. */
|
|
53
|
+
interface WrTransferItemHarnessFilters extends BaseHarnessFilters {
|
|
54
|
+
/** Match the row's label — a string is an exact match, a RegExp is tested. */
|
|
55
|
+
readonly label?: string | RegExp;
|
|
56
|
+
/**
|
|
57
|
+
* Match only staged (`true`) or only unstaged (`false`) rows. Staged is the
|
|
58
|
+
* transient tick a move spends — NOT membership of the value, which is the pane
|
|
59
|
+
* the row sits in.
|
|
60
|
+
*/
|
|
61
|
+
readonly checked?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Match only rows that refuse staging (`true`) or only rows that accept it
|
|
64
|
+
* (`false`). Every row of a disabled TRANSFER refuses it, so `false` matches
|
|
65
|
+
* nothing there.
|
|
66
|
+
*/
|
|
67
|
+
readonly disabled?: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @license
|
|
72
|
+
*
|
|
73
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
74
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Test harness for one row of a `<wr-transfer>` pane.
|
|
79
|
+
*
|
|
80
|
+
* A row is a `<li>` holding a `<wr-checkbox>`, and the checkbox is the thing the
|
|
81
|
+
* user operates — so the state is read from the native `<input type="checkbox">`
|
|
82
|
+
* inside it, and {@link toggle} clicks that. The pane is deliberately NOT a
|
|
83
|
+
* `role="listbox"` of `role="option"` rows (an option may not contain an
|
|
84
|
+
* interactive control, and the axe gate says so), which is why there is no
|
|
85
|
+
* `aria-selected` here to read: the checkbox's own state IS the announcement.
|
|
86
|
+
*
|
|
87
|
+
* **Checked is not the value.** A tick stages the row for the next move and
|
|
88
|
+
* nothing more; which pane the row sits in is what `[(value)]` carries. Staging is
|
|
89
|
+
* spent — and cleared — by the move that commits it.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const source = await transfer.getPane('source');
|
|
94
|
+
* await (await source.getItem({ label: 'Read' })).check();
|
|
95
|
+
*
|
|
96
|
+
* await transfer.moveTo('target');
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* @see https://ngwr.dev/guides/testing
|
|
100
|
+
*/
|
|
101
|
+
declare class WrTransferItemHarness extends ComponentHarness {
|
|
102
|
+
/**
|
|
103
|
+
* `.wr-transfer__item` is a DATA row and nothing else.
|
|
104
|
+
*
|
|
105
|
+
* An empty pane renders an `<li class="wr-transfer__empty">` for its placeholder,
|
|
106
|
+
* so querying `li` would hand that back as a row with no checkbox to read.
|
|
107
|
+
*/
|
|
108
|
+
static hostSelector: string;
|
|
109
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
110
|
+
static with(options?: WrTransferItemHarnessFilters): HarnessPredicate<WrTransferItemHarness>;
|
|
111
|
+
private readonly input;
|
|
112
|
+
/** The row's label, trimmed — the `WrTransferItem.label` the pane shows and the search matches. */
|
|
113
|
+
getLabel(): Promise<string>;
|
|
114
|
+
/**
|
|
115
|
+
* Whether the row is STAGED for the next move.
|
|
116
|
+
*
|
|
117
|
+
* Not "selected": a row's pane is what the value says, and the tick is transient
|
|
118
|
+
* staging the move spends. `WrTransferPaneHarness.getCheckedLabels()` reads the
|
|
119
|
+
* whole staged set of a pane.
|
|
120
|
+
*/
|
|
121
|
+
isChecked(): Promise<boolean>;
|
|
122
|
+
/**
|
|
123
|
+
* Whether the row refuses staging.
|
|
124
|
+
*
|
|
125
|
+
* The native input's `disabled` — the state a screen reader is given and the one
|
|
126
|
+
* that decides whether a click does anything. It answers `true` for BOTH reasons a
|
|
127
|
+
* row can be inert: the item's own `disabled` flag, and a disabled transfer, which
|
|
128
|
+
* disables every row. The `wr-transfer__item--disabled` modifier only marks the
|
|
129
|
+
* first of those, so it is the narrower question and not the one that predicts
|
|
130
|
+
* behaviour.
|
|
131
|
+
*/
|
|
132
|
+
isDisabled(): Promise<boolean>;
|
|
133
|
+
/**
|
|
134
|
+
* Flip the row's staging.
|
|
135
|
+
*
|
|
136
|
+
* Refuses a disabled row rather than clicking into the void: the component drops
|
|
137
|
+
* the toggle outright, so the click would resolve having changed nothing and the
|
|
138
|
+
* failure would surface as an unexplained empty move two assertions later.
|
|
139
|
+
*/
|
|
140
|
+
toggle(): Promise<void>;
|
|
141
|
+
/** Stage the row if it is not already staged. */
|
|
142
|
+
check(): Promise<void>;
|
|
143
|
+
/** Unstage the row if it is staged. */
|
|
144
|
+
uncheck(): Promise<void>;
|
|
145
|
+
/** Move keyboard focus onto the row's checkbox — the row's only tab stop. */
|
|
146
|
+
focus(): Promise<void>;
|
|
147
|
+
/** Whether the row's checkbox has focus. */
|
|
148
|
+
isFocused(): Promise<boolean>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @license
|
|
153
|
+
*
|
|
154
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
155
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Test harness for ONE pane of a `<wr-transfer>` — reached with
|
|
160
|
+
* `WrTransferHarness.getPane('source' | 'target')`.
|
|
161
|
+
*
|
|
162
|
+
* The two panes are the same block rendered twice (the component's template
|
|
163
|
+
* iterates them), so they are one harness class keyed by side rather than two sets
|
|
164
|
+
* of `…Source` / `…Target` methods: the side is named once, at `getPane()`, and
|
|
165
|
+
* every question after that is asked of a pane without repeating which one. It also
|
|
166
|
+
* means the symmetry cannot rot — a method that only works on the left is
|
|
167
|
+
* impossible to write here.
|
|
168
|
+
*
|
|
169
|
+
* What a pane SHOWS is the honest scope of everything below. `[items]` minus the
|
|
170
|
+
* value on the left, the value on the right, and then the pane's own filter on top:
|
|
171
|
+
* rows a filter has hidden are not rendered at all, are not counted by the header,
|
|
172
|
+
* and — the component's own rule — are not moved either, however they were staged.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```ts
|
|
176
|
+
* const source = await transfer.getPane('source');
|
|
177
|
+
*
|
|
178
|
+
* await source.search('adm');
|
|
179
|
+
* await source.checkAll();
|
|
180
|
+
* expect(await source.getCheckedLabels()).toEqual(['Admin']);
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* @see https://ngwr.dev/guides/testing
|
|
184
|
+
*/
|
|
185
|
+
declare class WrTransferPaneHarness extends ComponentHarness {
|
|
186
|
+
/**
|
|
187
|
+
* The pane is a plain `<div>` with no role of its own — the heading names the
|
|
188
|
+
* list, and the checkbox in each row carries the semantics — so its BEM class is
|
|
189
|
+
* the only handle, and being `ViewEncapsulation.None` that class is public API.
|
|
190
|
+
*/
|
|
191
|
+
static hostSelector: string;
|
|
192
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
193
|
+
static with(options?: WrTransferPaneHarnessFilters): HarnessPredicate<WrTransferPaneHarness>;
|
|
194
|
+
private readonly list;
|
|
195
|
+
private readonly selectAllBox;
|
|
196
|
+
private readonly searchBox;
|
|
197
|
+
/**
|
|
198
|
+
* Which side this pane is.
|
|
199
|
+
*
|
|
200
|
+
* From the `--target` modifier rather than from DOM order: order is a layout fact
|
|
201
|
+
* that `dir="rtl"` and any future reflow are free to change, while the modifier is
|
|
202
|
+
* what the component says the pane MEANS.
|
|
203
|
+
*/
|
|
204
|
+
getSide(): Promise<WrTransferSide>;
|
|
205
|
+
/** The pane's heading — `[sourceTitle]` / `[targetTitle]`, or the i18n fallback. */
|
|
206
|
+
getTitle(): Promise<string>;
|
|
207
|
+
/**
|
|
208
|
+
* The count beside the heading, verbatim — `'1 / 4'` with the built-in copy.
|
|
209
|
+
*
|
|
210
|
+
* Deliberately not parsed into numbers: it is an i18n FORMAT
|
|
211
|
+
* (`transfer.count`) a consuming app can replace wholesale, so a harness that
|
|
212
|
+
* split it on `/` would answer for the default catalog and break on a translated
|
|
213
|
+
* one. Its two numbers are `(await getCheckedLabels()).length` and
|
|
214
|
+
* `(await getItems()).length` — both of which this harness reads from the rendered
|
|
215
|
+
* rows, so a spec can assert the header agrees with them.
|
|
216
|
+
*/
|
|
217
|
+
getCountText(): Promise<string>;
|
|
218
|
+
/**
|
|
219
|
+
* The list's accessible name — the `aria-label` on the `<ul>`, which repeats the
|
|
220
|
+
* heading so that a row announced in isolation still says which pane it is in.
|
|
221
|
+
*/
|
|
222
|
+
getListLabel(): Promise<string | null>;
|
|
223
|
+
/**
|
|
224
|
+
* The explicit `role` on the pane's list, which is `null` — and that `null` is the
|
|
225
|
+
* ANSWER, not a gap worth fixing.
|
|
226
|
+
*
|
|
227
|
+
* The pane is a plain `<ul>` of checkboxes on purpose. Dressing it as a
|
|
228
|
+
* `role="listbox"` of `role="option"` rows reads better in the abstract but is
|
|
229
|
+
* invalid: an option may not contain an interactive control, and the axe gate
|
|
230
|
+
* rejects it. Pinning this is what keeps that "improvement" from looking like a
|
|
231
|
+
* win.
|
|
232
|
+
*/
|
|
233
|
+
getListRole(): Promise<string | null>;
|
|
234
|
+
/** The rows the pane is showing, in render order. */
|
|
235
|
+
getItems(filters?: WrTransferItemHarnessFilters): Promise<WrTransferItemHarness[]>;
|
|
236
|
+
/**
|
|
237
|
+
* The labels the pane is showing, in render order.
|
|
238
|
+
*
|
|
239
|
+
* On the right that is the value, in the order the user built it — not `[items]`
|
|
240
|
+
* order, which the component deliberately does not impose.
|
|
241
|
+
*/
|
|
242
|
+
getItemLabels(): Promise<string[]>;
|
|
243
|
+
/** The first row matching the filters, or a failure that says what the pane is showing. */
|
|
244
|
+
getItem(filters: WrTransferItemHarnessFilters): Promise<WrTransferItemHarness>;
|
|
245
|
+
/**
|
|
246
|
+
* The labels of the rows STAGED for the next move, in render order.
|
|
247
|
+
*
|
|
248
|
+
* The staged set and the value are different things, and this is the one the pane
|
|
249
|
+
* shows: read from the rendered rows, so a row staged before a search hid it is
|
|
250
|
+
* absent — exactly as the header count and the move itself treat it.
|
|
251
|
+
*/
|
|
252
|
+
getCheckedLabels(): Promise<string[]>;
|
|
253
|
+
/** The placeholder shown in a pane with no rows, or `null` while it has some. */
|
|
254
|
+
getEmptyText(): Promise<string | null>;
|
|
255
|
+
/** Whether this pane has a filter box — `[searchable]` puts one above both panes. */
|
|
256
|
+
hasSearch(): Promise<boolean>;
|
|
257
|
+
/**
|
|
258
|
+
* Type into the pane's filter box, narrowing it to the rows whose label contains
|
|
259
|
+
* the query (case-insensitively).
|
|
260
|
+
*
|
|
261
|
+
* Pass `''` to clear it. No `change` is dispatched — `input` is the event the
|
|
262
|
+
* component listens for, and the one a real keystroke carries; a browser defers
|
|
263
|
+
* `change` on a text field to the commit, so nothing here depends on it. (The
|
|
264
|
+
* keystrokes themselves come with the `keydown` / `keypress` / `keyup` the CDK
|
|
265
|
+
* sends alongside, which this component ignores.)
|
|
266
|
+
*/
|
|
267
|
+
search(query: string): Promise<void>;
|
|
268
|
+
/** What is currently typed in the pane's filter box, or `''`. Throws when there is none. */
|
|
269
|
+
getSearchValue(): Promise<string>;
|
|
270
|
+
/** The filter box's placeholder — `[searchPlaceholder]`, or the i18n fallback. */
|
|
271
|
+
getSearchPlaceholder(): Promise<string>;
|
|
272
|
+
/**
|
|
273
|
+
* The filter box's accessible name.
|
|
274
|
+
*
|
|
275
|
+
* Composed with the pane heading by the component, and it has to be: both panes
|
|
276
|
+
* carry the same placeholder, so an unnamed pair announces as two identical
|
|
277
|
+
* "Search" fields with no way to tell which list either one filters.
|
|
278
|
+
*/
|
|
279
|
+
getSearchLabel(): Promise<string | null>;
|
|
280
|
+
/**
|
|
281
|
+
* The select-all box's accessible name.
|
|
282
|
+
*
|
|
283
|
+
* It has one of its own — the heading names the LIST, so reusing it here would
|
|
284
|
+
* leave a screen reader announcing two different controls identically.
|
|
285
|
+
*/
|
|
286
|
+
getSelectAllLabel(): Promise<string | null>;
|
|
287
|
+
/** Whether every row the pane is showing that CAN be staged is staged. */
|
|
288
|
+
isAllChecked(): Promise<boolean>;
|
|
289
|
+
/**
|
|
290
|
+
* Whether some of the pane's stageable rows are staged and others are not.
|
|
291
|
+
*
|
|
292
|
+
* `indeterminate` is a DOM PROPERTY, not an attribute — reading the attribute
|
|
293
|
+
* would report `null` for a box that is visibly dashed.
|
|
294
|
+
*/
|
|
295
|
+
isPartiallyChecked(): Promise<boolean>;
|
|
296
|
+
/**
|
|
297
|
+
* Whether the select-all box refuses interaction — a disabled transfer, or a pane
|
|
298
|
+
* with nothing stageable in it (empty, filtered to nothing, or showing only
|
|
299
|
+
* disabled rows).
|
|
300
|
+
*/
|
|
301
|
+
isSelectAllDisabled(): Promise<boolean>;
|
|
302
|
+
/**
|
|
303
|
+
* Click the select-all box once.
|
|
304
|
+
*
|
|
305
|
+
* Its scope is the rows the pane is SHOWING and can stage: a filtered-out row and
|
|
306
|
+
* a disabled row are both outside it. Worth knowing before asserting on a partial
|
|
307
|
+
* pane — the box reads UNchecked while the staging is partial, so one click there
|
|
308
|
+
* stages everything rather than clearing it. {@link uncheckAll} handles that.
|
|
309
|
+
*/
|
|
310
|
+
toggleSelectAll(): Promise<void>;
|
|
311
|
+
/** Stage every row the pane shows that can be staged. A pane already fully staged is left alone. */
|
|
312
|
+
checkAll(): Promise<void>;
|
|
313
|
+
/** Clear the pane's staging. */
|
|
314
|
+
uncheckAll(): Promise<void>;
|
|
315
|
+
/** The filter box, or a failure naming the input that turns it on. */
|
|
316
|
+
private searchOrThrow;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* @license
|
|
321
|
+
*
|
|
322
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
323
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Test harness for `<wr-transfer>` — the root of a small family, since a dual
|
|
328
|
+
* listbox is three things and not one control: {@link WrTransferPaneHarness} for one
|
|
329
|
+
* pane and {@link WrTransferItemHarness} for one row inside it.
|
|
330
|
+
*
|
|
331
|
+
* **Everything is keyed by SIDE, never duplicated per pane.** The two panes are the
|
|
332
|
+
* same block rendered twice, so a `…Source` / `…Target` method pair for each
|
|
333
|
+
* question would double the surface and let the halves drift; instead
|
|
334
|
+
* {@link getPane} takes the side once and the pane answers, and the two whole-
|
|
335
|
+
* control operations that are inherently directional — the move buttons — take the
|
|
336
|
+
* side they move rows INTO. `moveTo('target')` is the right-facing button in an LTR
|
|
337
|
+
* layout, and stays the correct one under `dir="rtl"`, where "right" is not.
|
|
338
|
+
*
|
|
339
|
+
* **The staged ticks are not the value.** `[(value)]` is the RIGHT pane's
|
|
340
|
+
* membership; a tick inside either pane is transient staging that the next move
|
|
341
|
+
* spends and clears. Conflating them is the failure this component invites, so the
|
|
342
|
+
* two are separate questions here: {@link WrTransferPaneHarness.getItemLabels} is
|
|
343
|
+
* what a pane HOLDS (the value, on the right) and
|
|
344
|
+
* {@link WrTransferPaneHarness.getCheckedLabels} is what it has STAGED.
|
|
345
|
+
*
|
|
346
|
+
* Both are scoped to what a pane is showing, which is also the component's own rule
|
|
347
|
+
* for a move: a row staged before a search hid it is no longer counted, no longer
|
|
348
|
+
* ticked, and does not travel.
|
|
349
|
+
*
|
|
350
|
+
* @example
|
|
351
|
+
* ```ts
|
|
352
|
+
* const transfer = await loader.getHarness(WrTransferHarness);
|
|
353
|
+
* const source = await transfer.getPane('source');
|
|
354
|
+
*
|
|
355
|
+
* await (await source.getItem({ label: 'Read' })).check();
|
|
356
|
+
* await transfer.moveTo('target');
|
|
357
|
+
*
|
|
358
|
+
* expect(await (await transfer.getPane('target')).getItemLabels()).toEqual(['Read']);
|
|
359
|
+
* ```
|
|
360
|
+
*
|
|
361
|
+
* @see https://ngwr.dev/guides/testing
|
|
362
|
+
*/
|
|
363
|
+
declare class WrTransferHarness extends ComponentHarness {
|
|
364
|
+
static hostSelector: string;
|
|
365
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
366
|
+
static with(options?: WrTransferHarnessFilters): HarnessPredicate<WrTransferHarness>;
|
|
367
|
+
/**
|
|
368
|
+
* One of the two panes — `'source'` is the left one (the rows outside the value),
|
|
369
|
+
* `'target'` the right one (the value).
|
|
370
|
+
*
|
|
371
|
+
* The side is named here and nowhere else; see the class note.
|
|
372
|
+
*/
|
|
373
|
+
getPane(side: WrTransferSide): Promise<WrTransferPaneHarness>;
|
|
374
|
+
/**
|
|
375
|
+
* Whether the whole control refuses interaction.
|
|
376
|
+
*
|
|
377
|
+
* From the host modifier, which is the only signal the host itself carries: a
|
|
378
|
+
* `<wr-transfer>` element is not a control and publishes no `aria-disabled` of its
|
|
379
|
+
* own — the state reaches assistive tech through the checkboxes, the buttons and
|
|
380
|
+
* the filter boxes it disables, which is where
|
|
381
|
+
* {@link WrTransferItemHarness.isDisabled} and {@link canMoveTo} read it.
|
|
382
|
+
*/
|
|
383
|
+
isDisabled(): Promise<boolean>;
|
|
384
|
+
/** Whether the panes have filter boxes — `[searchable]` gives both one or neither. */
|
|
385
|
+
isSearchable(): Promise<boolean>;
|
|
386
|
+
/**
|
|
387
|
+
* Whether the button that moves rows INTO `side` is offering itself.
|
|
388
|
+
*
|
|
389
|
+
* It is enabled only while the OTHER pane has something staged and showing, so
|
|
390
|
+
* this is also the readable way to assert that staging landed — and that a search
|
|
391
|
+
* which hid a staged row took the move away again.
|
|
392
|
+
*
|
|
393
|
+
* Read from the native `disabled` attribute: these are `button[wr-btn]`, the
|
|
394
|
+
* native shape, where that attribute is the state. (`wr-btn` adds `aria-disabled`
|
|
395
|
+
* only for its custom-element shape, on which `disabled` is inert.)
|
|
396
|
+
*/
|
|
397
|
+
canMoveTo(side: WrTransferSide): Promise<boolean>;
|
|
398
|
+
/**
|
|
399
|
+
* The accessible name of the button that moves rows INTO `side` —
|
|
400
|
+
* `[toTargetLabel]` / `[toSourceLabel]`, or the i18n fallback.
|
|
401
|
+
*
|
|
402
|
+
* Worth pinning: the button's only content is an `aria-hidden` chevron, so this
|
|
403
|
+
* `aria-label` is the entire announcement. Lose it and the pair becomes two
|
|
404
|
+
* unnamed buttons.
|
|
405
|
+
*/
|
|
406
|
+
getMoveLabel(side: WrTransferSide): Promise<string | null>;
|
|
407
|
+
/**
|
|
408
|
+
* Press the button that moves the staged rows INTO `side`, committing them to the
|
|
409
|
+
* value.
|
|
410
|
+
*
|
|
411
|
+
* Only the rows the other pane is SHOWING as staged travel, and the staging is
|
|
412
|
+
* cleared afterwards — the component's rule, not this harness's.
|
|
413
|
+
*
|
|
414
|
+
* Refuses a disabled button rather than pressing it: a native disabled `<button>`
|
|
415
|
+
* swallows the click before Angular's listener sees it, so the call would resolve
|
|
416
|
+
* having moved nothing at all.
|
|
417
|
+
*/
|
|
418
|
+
moveTo(side: WrTransferSide): Promise<void>;
|
|
419
|
+
/**
|
|
420
|
+
* Stage everything the other pane can stage, then move it INTO `side`.
|
|
421
|
+
*
|
|
422
|
+
* "Everything" is the pane's own scope: the rows it is SHOWING, disabled ones
|
|
423
|
+
* excluded. A search narrows it, and with a filter typed this moves what is
|
|
424
|
+
* visible rather than the whole pane.
|
|
425
|
+
*/
|
|
426
|
+
moveAllTo(side: WrTransferSide): Promise<void>;
|
|
427
|
+
/** The heading of one pane — the `sourceTitle` / `targetTitle` filters run through this. */
|
|
428
|
+
private paneTitle;
|
|
429
|
+
/** Every label rendered in either pane, for the `itemLabel` filter. */
|
|
430
|
+
private shownLabels;
|
|
431
|
+
/**
|
|
432
|
+
* The move button for a direction, addressed by its `--to-source` / `--to-target`
|
|
433
|
+
* modifier.
|
|
434
|
+
*
|
|
435
|
+
* Not by DOM order, and that is the point: two identically classed buttons whose
|
|
436
|
+
* only difference was their position would let a template reshuffle silently
|
|
437
|
+
* reverse every `moveTo()` in every consumer's suite, with both directions still
|
|
438
|
+
* green. Not by the `aria-label` either — that string is localizable.
|
|
439
|
+
*/
|
|
440
|
+
private moveButton;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export { WrTransferHarness, WrTransferItemHarness, WrTransferPaneHarness };
|
|
444
|
+
export type { WrTransferHarnessFilters, WrTransferItemHarnessFilters, WrTransferPaneHarnessFilters, WrTransferSide };
|
package/types/ngwr-transfer.d.ts
CHANGED
|
@@ -21,7 +21,15 @@ interface WrTransferItem<TValue = unknown> {
|
|
|
21
21
|
/** A pane's rows plus the header state derived from them. */
|
|
22
22
|
interface PaneState {
|
|
23
23
|
readonly rows: readonly WrTransferItem[];
|
|
24
|
+
/**
|
|
25
|
+
* The staged values this pane is actually SHOWING — visible and enabled. The
|
|
26
|
+
* staging signals can hold more than that (a filter change hides rows without
|
|
27
|
+
* unstaging them), and every consumer of the staged set has to agree on which
|
|
28
|
+
* one it means: the count, the header checkbox and the move all read this.
|
|
29
|
+
*/
|
|
30
|
+
readonly checked: readonly unknown[];
|
|
24
31
|
readonly checkedCount: number;
|
|
32
|
+
readonly enabledCount: number;
|
|
25
33
|
readonly allChecked: boolean;
|
|
26
34
|
readonly someChecked: boolean;
|
|
27
35
|
}
|
|
@@ -76,6 +84,11 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
|
|
|
76
84
|
readonly searchPlaceholder: _angular_core.InputSignal<string | null>;
|
|
77
85
|
/** Shown in a pane with no rows. Falls back to `transfer.empty`. */
|
|
78
86
|
readonly emptyText: _angular_core.InputSignal<string | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Accessible name of each pane's select-all checkbox, composed with the pane
|
|
89
|
+
* heading. Falls back to `transfer.selectAll`.
|
|
90
|
+
*/
|
|
91
|
+
readonly selectAllLabel: _angular_core.InputSignal<string | null>;
|
|
79
92
|
/** Accessible name of the move-right button. Falls back to `transfer.toTarget`. */
|
|
80
93
|
readonly toTargetLabel: _angular_core.InputSignal<string | null>;
|
|
81
94
|
/** Accessible name of the move-left button. Falls back to `transfer.toSource`. */
|
|
@@ -84,6 +97,7 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
|
|
|
84
97
|
protected readonly resolvedTargetTitle: _angular_core.Signal<string>;
|
|
85
98
|
protected readonly resolvedSearch: _angular_core.Signal<string>;
|
|
86
99
|
protected readonly resolvedEmpty: _angular_core.Signal<string>;
|
|
100
|
+
protected readonly resolvedSelectAll: _angular_core.Signal<string>;
|
|
87
101
|
protected readonly resolvedToTarget: _angular_core.Signal<string>;
|
|
88
102
|
protected readonly resolvedToSource: _angular_core.Signal<string>;
|
|
89
103
|
/** `{{checked}} / {{total}}` under each heading. @internal */
|
|
@@ -95,6 +109,7 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
|
|
|
95
109
|
/** Staged rows, per pane. Cleared as soon as a move commits them. */
|
|
96
110
|
private readonly sourceChecked;
|
|
97
111
|
private readonly targetChecked;
|
|
112
|
+
private readonly selected;
|
|
98
113
|
private readonly valueSet;
|
|
99
114
|
protected readonly source: _angular_core.Signal<PaneState>;
|
|
100
115
|
protected readonly target: _angular_core.Signal<PaneState>;
|
|
@@ -111,7 +126,7 @@ declare class WrTransfer implements FormValueControl<readonly unknown[]> {
|
|
|
111
126
|
/** Filter, then derive the header state from what survived. */
|
|
112
127
|
private pane;
|
|
113
128
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrTransfer, never>;
|
|
114
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTransfer, "wr-transfer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "sourceTitle": { "alias": "sourceTitle"; "required": false; "isSignal": true; }; "targetTitle": { "alias": "targetTitle"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "toTargetLabel": { "alias": "toTargetLabel"; "required": false; "isSignal": true; }; "toSourceLabel": { "alias": "toSourceLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
|
|
129
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrTransfer, "wr-transfer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "sourceTitle": { "alias": "sourceTitle"; "required": false; "isSignal": true; }; "targetTitle": { "alias": "targetTitle"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "toTargetLabel": { "alias": "toTargetLabel"; "required": false; "isSignal": true; }; "toSourceLabel": { "alias": "toSourceLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
|
|
115
130
|
}
|
|
116
131
|
|
|
117
132
|
export { WrTransfer };
|