ngwr 11.2.0 → 12.1.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 +85 -26
- 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/collapse/styles/_index.scss +2 -2
- package/color-picker/styles/_index.scss +3 -3
- 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.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 +20 -2
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- 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.mjs +17 -5
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +187 -9
- 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 +48 -5
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +6 -6
- 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 +26 -6
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +98 -8
- 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 +333 -43
- 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 +11 -6
- 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.mjs +3 -3
- 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 +8 -4
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
- 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 +121 -58
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +26 -10
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar.mjs +28 -15
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
- 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.mjs +21 -11
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +7 -7
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
- 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 +73 -1
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +55 -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 +53 -9
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +150 -12
- 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 +17 -10
- 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.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +4 -4
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- 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.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 +26 -6
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +6 -6
- 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 +83 -16
- 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 +155 -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.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented-testing.mjs +85 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +123 -10
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +159 -34
- package/fesm2022/ngwr-select.mjs.map +1 -1
- 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 +100 -9
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
- 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.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs +17 -5
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +3 -3
- 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.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 +99 -39
- 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 +36 -10
- 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.mjs +7 -7
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +9 -9
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- 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 +28 -10
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
- 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.mjs +4 -4
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +94 -24
- 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 +56 -6
- package/i18n/ru.json +56 -6
- 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 +19 -24
- package/llms.txt +46 -8
- package/markdown/styles/_index.scss +3 -3
- package/mcp/api.js +6 -4
- package/mcp/catalog.js +40 -3
- package/mcp/providers.js +16 -3
- package/mcp/tools.js +21 -1
- package/meter-group/styles/_index.scss +1 -1
- package/overlay/styles/_index.scss +33 -1
- package/package.json +17 -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 +7 -5
- package/skills/ngwr/references/catalog.md +9 -9
- package/skills/ngwr/references/setup.md +10 -5
- 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-bar-chart-testing.d.ts +9 -1
- package/types/ngwr-blur-text.d.ts +8 -4
- package/types/ngwr-breadcrumbs.d.ts +17 -10
- package/types/ngwr-calendar-testing.d.ts +1 -1
- package/types/ngwr-calendar.d.ts +66 -0
- package/types/ngwr-carousel.d.ts +85 -6
- package/types/ngwr-cascader.d.ts +17 -0
- package/types/ngwr-click-spark.d.ts +4 -0
- package/types/ngwr-color-picker-testing.d.ts +8 -0
- package/types/ngwr-color-picker.d.ts +21 -1
- 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 +56 -0
- 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 +11 -6
- 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-dialog.d.ts +38 -1
- package/types/ngwr-divider.d.ts +25 -0
- package/types/ngwr-donut-chart-testing.d.ts +7 -3
- package/types/ngwr-donut-chart.d.ts +3 -3
- package/types/ngwr-drag-drop.d.ts +56 -2
- package/types/ngwr-drawer.d.ts +56 -5
- package/types/ngwr-event-calendar.d.ts +8 -2
- package/types/ngwr-falling-text-testing.d.ts +5 -3
- package/types/ngwr-falling-text.d.ts +1 -1
- package/types/ngwr-form.d.ts +12 -2
- package/types/ngwr-glitch-text-testing.d.ts +37 -8
- package/types/ngwr-gradient-text-testing.d.ts +16 -3
- package/types/ngwr-i18n.d.ts +13 -4
- package/types/ngwr-image-cropper-testing.d.ts +49 -10
- package/types/ngwr-image-cropper.d.ts +70 -5
- package/types/ngwr-input-number-testing.d.ts +15 -10
- package/types/ngwr-input-number.d.ts +11 -4
- package/types/ngwr-input-otp-testing.d.ts +12 -6
- package/types/ngwr-input-otp.d.ts +15 -1
- package/types/ngwr-line-chart.d.ts +20 -3
- package/types/ngwr-markdown.d.ts +11 -0
- package/types/ngwr-mention.d.ts +32 -0
- package/types/ngwr-meter-group-testing.d.ts +12 -2
- package/types/ngwr-overlay.d.ts +1 -0
- package/types/ngwr-pagination-testing.d.ts +4 -4
- package/types/ngwr-pagination.d.ts +11 -0
- 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-segmented-testing.d.ts +53 -0
- package/types/ngwr-segmented.d.ts +107 -5
- package/types/ngwr-select.d.ts +68 -6
- package/types/ngwr-shiny-text.d.ts +4 -2
- package/types/ngwr-sidebar.d.ts +14 -5
- package/types/ngwr-slider.d.ts +69 -1
- package/types/ngwr-speed-dial-testing.d.ts +15 -11
- package/types/ngwr-speed-dial.d.ts +22 -3
- package/types/ngwr-split-text.d.ts +9 -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 +104 -11
- 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-tour.d.ts +22 -4
- package/types/ngwr-tree.d.ts +5 -4
- package/types/ngwr-typewriter-testing.d.ts +10 -0
- package/types/ngwr-utils.d.ts +5 -2
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-window.d.ts +39 -11
- package/typography/styles/_index.scss +1 -1
- package/window/styles/_index.scss +72 -26
- 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
|
@@ -54,11 +54,11 @@ interface WrInputOtpHarnessFilters extends BaseHarnessFilters {
|
|
|
54
54
|
* single character.
|
|
55
55
|
*
|
|
56
56
|
* A box is more than the string it shows: it carries its own accessible name
|
|
57
|
-
* (`Digit 3`
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* box's, so a spec can hold on to
|
|
61
|
-
* four parallel arrays by index.
|
|
57
|
+
* (`Digit 3` on a numeric strip, `Character 3` on the others), its own
|
|
58
|
+
* emptiness, its own masking, and it is the thing that either has focus or does
|
|
59
|
+
* not. The root harness answers the control's questions (the assembled code,
|
|
60
|
+
* which index is focused); this one answers the box's, so a spec can hold on to
|
|
61
|
+
* "the box that has focus" instead of zipping four parallel arrays by index.
|
|
62
62
|
*
|
|
63
63
|
* @example
|
|
64
64
|
* ```ts
|
|
@@ -93,11 +93,17 @@ declare class WrInputOtpBoxHarness extends ComponentHarness {
|
|
|
93
93
|
/** Whether the box is still waiting for a character. */
|
|
94
94
|
isEmpty(): Promise<boolean>;
|
|
95
95
|
/**
|
|
96
|
-
* The box's accessible name — `Digit 1`, `Digit 2`, …
|
|
96
|
+
* The box's accessible name — `Digit 1`, `Digit 2`, … on a numeric strip.
|
|
97
97
|
*
|
|
98
98
|
* This is the whole of a box's identity for a screen-reader user: the boxes
|
|
99
99
|
* carry no visible label and no position in an `aria-*` set, so the name is
|
|
100
100
|
* how someone knows which one they are in.
|
|
101
|
+
*
|
|
102
|
+
* The word depends on `mode`, so an assertion has to follow it: the
|
|
103
|
+
* `alphanumeric` and `text` modes accept letters, and the component names
|
|
104
|
+
* their boxes `Character 1`, `Character 2`, … rather than call an `A` a digit.
|
|
105
|
+
* Both come from the `inputOtp.digit` / `inputOtp.character` catalog entries,
|
|
106
|
+
* so a localized app answers here in its own language.
|
|
101
107
|
*/
|
|
102
108
|
getLabel(): Promise<string | null>;
|
|
103
109
|
/** Whether the box hides what was typed, like a password field. */
|
|
@@ -42,6 +42,9 @@ type WrInputOtpSize = 'sm' | 'md' | 'lg';
|
|
|
42
42
|
*/
|
|
43
43
|
declare class WrInputOtp implements FormValueControl<string> {
|
|
44
44
|
private readonly dir;
|
|
45
|
+
/** Accessible name of the whole strip. Falls back to `inputOtp.label`. */
|
|
46
|
+
readonly ariaLabel: _angular_core.InputSignal<string | null>;
|
|
47
|
+
protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
|
|
45
48
|
/** Number of cells to render. Clamped to `[1, 20]`. @default 6 */
|
|
46
49
|
readonly length: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
47
50
|
/** Character set per cell. @default 'numeric' */
|
|
@@ -81,6 +84,8 @@ declare class WrInputOtp implements FormValueControl<string> {
|
|
|
81
84
|
protected readonly classes: _angular_core.Signal<string>;
|
|
82
85
|
protected readonly cellType: _angular_core.Signal<"text" | "password">;
|
|
83
86
|
protected readonly cellInputMode: _angular_core.Signal<"numeric" | "text">;
|
|
87
|
+
private readonly digitLabel;
|
|
88
|
+
private readonly characterLabel;
|
|
84
89
|
protected readonly cellRefs: _angular_core.Signal<readonly ElementRef<HTMLInputElement>[]>;
|
|
85
90
|
constructor();
|
|
86
91
|
protected onInput(event: Event, index: number): void;
|
|
@@ -88,6 +93,15 @@ declare class WrInputOtp implements FormValueControl<string> {
|
|
|
88
93
|
protected onPaste(event: ClipboardEvent): void;
|
|
89
94
|
protected onBlur(): void;
|
|
90
95
|
protected trackIndex(index: number): number;
|
|
96
|
+
/**
|
|
97
|
+
* A box's accessible name. It projects no text and carries no label of its own,
|
|
98
|
+
* so this string IS the name a screen reader reads for it.
|
|
99
|
+
*
|
|
100
|
+
* Keyed off `mode`, not fixed: `sanitiseChar` passes any letter through in
|
|
101
|
+
* `alphanumeric` and `text`, so the old literal announced "Digit 3" over a box
|
|
102
|
+
* holding `A` — wrong in a way translating it would not have fixed.
|
|
103
|
+
*/
|
|
104
|
+
protected cellLabel(index: number): string;
|
|
91
105
|
private update;
|
|
92
106
|
private emitChange;
|
|
93
107
|
private focusCell;
|
|
@@ -102,7 +116,7 @@ declare class WrInputOtp implements FormValueControl<string> {
|
|
|
102
116
|
*/
|
|
103
117
|
private inlineKey;
|
|
104
118
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInputOtp, never>;
|
|
105
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputOtp, "wr-input-otp", never, { "length": { "alias": "length"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "completed": "completed"; "touch": "touch"; }, never, never, true, never>;
|
|
119
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputOtp, "wr-input-otp", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "length": { "alias": "length"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "completed": "completed"; "touch": "touch"; }, never, never, true, never>;
|
|
106
120
|
}
|
|
107
121
|
|
|
108
122
|
export { WrInputOtp };
|
|
@@ -55,7 +55,7 @@ declare class WrLineChart {
|
|
|
55
55
|
protected readonly hoveredIndex: _angular_core.WritableSignal<number | null>;
|
|
56
56
|
protected readonly resolvedSeries: _angular_core.Signal<{
|
|
57
57
|
label: string;
|
|
58
|
-
data: number[];
|
|
58
|
+
data: (number | null)[];
|
|
59
59
|
color: string;
|
|
60
60
|
}[]>;
|
|
61
61
|
protected readonly bounds: _angular_core.Signal<{
|
|
@@ -70,12 +70,29 @@ declare class WrLineChart {
|
|
|
70
70
|
}[]>;
|
|
71
71
|
protected readonly plotWidth: () => number;
|
|
72
72
|
protected readonly plotHeight: () => number;
|
|
73
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* The SVG path for a series — one subpath per unbroken run, so a hole in the data
|
|
75
|
+
* leaves a hole in the line rather than a straight segment across it.
|
|
76
|
+
*/
|
|
74
77
|
protected pathFor(series: {
|
|
75
|
-
data: readonly number[];
|
|
78
|
+
data: readonly (number | null)[];
|
|
76
79
|
}): string;
|
|
77
80
|
protected pointX(index: number): number;
|
|
78
81
|
protected pointY(value: number): number;
|
|
82
|
+
/**
|
|
83
|
+
* A point's x as a percentage of the host's width. The x-label strip and the SVG share
|
|
84
|
+
* that width — the drawing stretches to it — so this is the same space the tooltip and
|
|
85
|
+
* the labels are placed in, at any size.
|
|
86
|
+
*/
|
|
87
|
+
protected xPercent(index: number): number;
|
|
88
|
+
/**
|
|
89
|
+
* How wide an x label may be, as a percentage of the host's width: its own slot — half
|
|
90
|
+
* the distance to a neighbour on each side — cut back to what is left between its point
|
|
91
|
+
* and the end of the strip. Centring a label on its point says nothing about its WIDTH,
|
|
92
|
+
* and with no bound at all twelve month names printed over each other and the last one
|
|
93
|
+
* hung outside the chart. Past this the stylesheet ellipsises.
|
|
94
|
+
*/
|
|
95
|
+
protected xMaxPercent(index: number): number;
|
|
79
96
|
protected readonly hoverPoints: _angular_core.Signal<{
|
|
80
97
|
label: string;
|
|
81
98
|
value: number;
|
package/types/ngwr-markdown.d.ts
CHANGED
|
@@ -387,6 +387,17 @@ declare class WrMarkdownHighlight {
|
|
|
387
387
|
private fill;
|
|
388
388
|
/** `Map` iterates in insertion order, and `linesFor` re-inserts on read. */
|
|
389
389
|
private evict;
|
|
390
|
+
/**
|
|
391
|
+
* The same bound, one dimension out. `request` re-inserts a bucket it already
|
|
392
|
+
* holds, so the outer map iterates least-recently-REQUESTED first — and the
|
|
393
|
+
* component's effect asks for every code block in the document it is showing,
|
|
394
|
+
* so a language that stops being requested is one nothing renders any more.
|
|
395
|
+
*
|
|
396
|
+
* Read is deliberately NOT a touch here, unlike {@link linesFor} for the inner
|
|
397
|
+
* map: with the effect re-asking for every block, request order already tracks
|
|
398
|
+
* what is rendered, and nothing has needed the finer signal.
|
|
399
|
+
*/
|
|
400
|
+
private evictLanguage;
|
|
390
401
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrMarkdownHighlight, never>;
|
|
391
402
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<WrMarkdownHighlight>;
|
|
392
403
|
}
|
package/types/ngwr-mention.d.ts
CHANGED
|
@@ -65,6 +65,12 @@ declare class WrMention<T extends WrMentionItem = WrMentionItem> {
|
|
|
65
65
|
private readonly isBrowser;
|
|
66
66
|
private overlayRef;
|
|
67
67
|
private panelRef;
|
|
68
|
+
/**
|
|
69
|
+
* Where the caret sits INSIDE the field — its offset from the field's
|
|
70
|
+
* top-left corner, plus the height of the line it is on. Mutated in place by
|
|
71
|
+
* `open()`, never replaced: `caretAnchor()` closes over this object.
|
|
72
|
+
*/
|
|
73
|
+
private readonly caretOffset;
|
|
68
74
|
private state;
|
|
69
75
|
private readonly activeIndex;
|
|
70
76
|
private readonly filteredItems;
|
|
@@ -113,6 +119,27 @@ declare class WrMention<T extends WrMentionItem = WrMentionItem> {
|
|
|
113
119
|
private activate;
|
|
114
120
|
private filter;
|
|
115
121
|
private setActive;
|
|
122
|
+
/**
|
|
123
|
+
* The overlay's anchor: the caret's line box, grown by the gap the panel
|
|
124
|
+
* keeps from the text, as a zero-WIDTH virtual origin in viewport
|
|
125
|
+
* coordinates. Inflating the rect rather than passing `offsetY` is what keeps
|
|
126
|
+
* `withPush` honest — CDK applies a position offset as a `transform` AFTER it
|
|
127
|
+
* has clamped, so a pushed panel would land the offset off the screen edge.
|
|
128
|
+
*
|
|
129
|
+
* Live getters, not a snapshot, and that is the whole of the scroll fix.
|
|
130
|
+
* `getCaretCoordinates` answers in viewport coordinates, which a
|
|
131
|
+
* `GlobalPositionStrategy` froze at the instant of the keystroke: the panel
|
|
132
|
+
* then stayed pinned to the screen while the page scrolled out from under it
|
|
133
|
+
* (150px of scroll, 150px of drift, ending up over unrelated content). CDK
|
|
134
|
+
* re-reads a virtual origin on every `apply()`, so pinning it to the FIELD's
|
|
135
|
+
* live rect is what turns `reposition()` into a real re-anchor.
|
|
136
|
+
*
|
|
137
|
+
* Only the caret's offset inside the field is captured up front. Measuring it
|
|
138
|
+
* runs the mirror-div pass in `caret.ts` — a full layout read, far too
|
|
139
|
+
* expensive to repeat per scroll event — and it cannot change without a
|
|
140
|
+
* keystroke, which re-enters `open()` anyway.
|
|
141
|
+
*/
|
|
142
|
+
private caretAnchor;
|
|
116
143
|
private open;
|
|
117
144
|
private close;
|
|
118
145
|
private commit;
|
|
@@ -123,6 +150,11 @@ declare class WrMention<T extends WrMentionItem = WrMentionItem> {
|
|
|
123
150
|
/**
|
|
124
151
|
* Overlay panel rendered by {@link WrMention}. Not intended for
|
|
125
152
|
* direct use — the directive instantiates it via a ComponentPortal.
|
|
153
|
+
*
|
|
154
|
+
* @internal — the same tag its twin `WrPopconfirmPanel` already carried. It says
|
|
155
|
+
* the intent; it does not by itself keep the class out of the generated API
|
|
156
|
+
* tables, because `WrTableFilter` and `WrTableSort` are tagged AND documented —
|
|
157
|
+
* see `EXPORTED_BUT_INTERNAL` in `scripts/lib/extract-api.ts`.
|
|
126
158
|
*/
|
|
127
159
|
declare class WrMentionPanel {
|
|
128
160
|
readonly items: _angular_core.InputSignal<readonly WrMentionItem[]>;
|
|
@@ -35,8 +35,16 @@ interface WrMeterGroupSlice {
|
|
|
35
35
|
* **The bar is a single `progressbar`, and its value is the TOTAL.** The bands
|
|
36
36
|
* themselves announce nothing: they carry a `title` for a mouse and their share as an
|
|
37
37
|
* inline width, and the legend is where their labels and values are readable. So a
|
|
38
|
-
* spec that wants "how much of each" reads {@link
|
|
39
|
-
*
|
|
38
|
+
* spec that wants "how much of each" reads {@link getSlices} for the shares or
|
|
39
|
+
* {@link getLegendLabels} / {@link getLegendValues} for what is printed, and one that
|
|
40
|
+
* wants "how full" reads {@link getValue}.
|
|
41
|
+
*
|
|
42
|
+
* **A band's share is read off the `style` ATTRIBUTE, not through `getCssValue()`**,
|
|
43
|
+
* and the difference is not cosmetic: `getCssValue()` is `getComputedStyle()`, and
|
|
44
|
+
* `width` resolves to the USED value — so the declared `30%` comes straight back in
|
|
45
|
+
* jsdom and arrives as `180px` on a 600px bar in a real browser, and the same harness
|
|
46
|
+
* answered 30 here and 180 under a browser runner with nothing to say which one you
|
|
47
|
+
* got.
|
|
40
48
|
*
|
|
41
49
|
* @see https://ngwr.dev/guides/testing
|
|
42
50
|
*/
|
|
@@ -55,6 +63,8 @@ declare class WrMeterGroupHarness extends ComponentHarness {
|
|
|
55
63
|
getMax(): Promise<number>;
|
|
56
64
|
/** The bands, in order, with the share of the bar each takes. */
|
|
57
65
|
getSlices(): Promise<WrMeterGroupSlice[]>;
|
|
66
|
+
/** Parse one band's declared share. See the class note on why this is not `getCssValue()`. */
|
|
67
|
+
private static percentOf;
|
|
58
68
|
/** Whether the legend is rendered (`showLegend`, and at least one band). */
|
|
59
69
|
hasLegend(): Promise<boolean>;
|
|
60
70
|
/** The legend's labels, in order. */
|
package/types/ngwr-overlay.d.ts
CHANGED
|
@@ -303,3 +303,4 @@ declare const WR_OVERLAY: InjectionToken<Overlay>;
|
|
|
303
303
|
declare const WR_OVERLAY_CONTAINER: InjectionToken<OverlayContainer>;
|
|
304
304
|
|
|
305
305
|
export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, WrOutsideClick, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, wrAppendOverlayClose, wrMirrorOffsets, wrPresentAsSheet };
|
|
306
|
+
export type { WrResponsiveOverlaysConfig };
|
|
@@ -179,10 +179,10 @@ declare class WrPaginationHarness extends ComponentHarness {
|
|
|
179
179
|
* The page the pager announces as current, from `aria-current="page"`.
|
|
180
180
|
*
|
|
181
181
|
* Throws when no cell claims it. The window always keeps the current page on the
|
|
182
|
-
* strip, so getting here means `currentPage` is not one of the pages at all
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* inactive to an assistive tech user.
|
|
182
|
+
* strip, so getting here means `currentPage` is not one of the pages at all. The
|
|
183
|
+
* component clamps a host write into `1..totalPages`, which leaves one survivor:
|
|
184
|
+
* a fractional page, which is in range and matches no cell — and which leaves
|
|
185
|
+
* every cell looking equally inactive to an assistive tech user.
|
|
186
186
|
*/
|
|
187
187
|
getCurrentPage(): Promise<number>;
|
|
188
188
|
/**
|
|
@@ -111,6 +111,17 @@ declare class WrPagination {
|
|
|
111
111
|
protected readonly navLabel: _angular_core.Signal<string>;
|
|
112
112
|
/** Internal: total page count. */
|
|
113
113
|
protected readonly totalPages: _angular_core.Signal<number>;
|
|
114
|
+
/**
|
|
115
|
+
* Internal: where the previous arrow goes. Clamped to the end of the valid
|
|
116
|
+
* range rather than being a plain `currentPage() - 1`, because the page can
|
|
117
|
+
* legitimately sit past that end while `total` is 0 (see the guard effect).
|
|
118
|
+
* From page 5 of one page, `goTo(4)` is refused as out of range, so the arrow
|
|
119
|
+
* was enabled and did nothing — and under `responsive` on a narrow box the
|
|
120
|
+
* numbered cells are hidden by a container query, which left no way back at
|
|
121
|
+
* all. `Math.min` only ever moves the target INWARD, so `goTo`'s own
|
|
122
|
+
* past-the-end refusal keeps working as the backstop it is.
|
|
123
|
+
*/
|
|
124
|
+
protected readonly prevPage: _angular_core.Signal<number>;
|
|
114
125
|
/** Internal: "X–Y of Z" string. */
|
|
115
126
|
protected readonly rangeLabel: _angular_core.Signal<string>;
|
|
116
127
|
/**
|
package/types/ngwr-pipes.d.ts
CHANGED
|
@@ -181,8 +181,13 @@ declare class WrPopoverHarness extends ContentContainerComponentHarness {
|
|
|
181
181
|
* Where the panel sits relative to the trigger, or `null` when it is presented
|
|
182
182
|
* as a sheet and has no anchor.
|
|
183
183
|
*
|
|
184
|
-
* The
|
|
185
|
-
*
|
|
184
|
+
* The APPLIED position, not the requested one: CDK flips a placement that does
|
|
185
|
+
* not fit to the next in its fallback chain and swaps the modifier class with
|
|
186
|
+
* it. Under a unit test that is always the requested placement — jsdom measures
|
|
187
|
+
* every box as 0×0, so the first candidate always "fits" — but in a browser the
|
|
188
|
+
* two can differ, and this answers what is on screen. The directive defaults
|
|
189
|
+
* the request per mode (`bottom` for a popover, `top` for a tooltip).
|
|
190
|
+
*
|
|
186
191
|
* The arrow itself is a `::after` pseudo-element, so it exists for no DOM query
|
|
187
192
|
* at all; this class is the placement, and it is what the arrow's own CSS keys
|
|
188
193
|
* off.
|
package/types/ngwr-popover.d.ts
CHANGED
package/types/ngwr-result.d.ts
CHANGED
|
@@ -40,6 +40,8 @@ declare class WrResult {
|
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
42
|
declare class WrResult404 {
|
|
43
|
+
/** Bound by the shared template; not an input — a preset IS its status. */
|
|
44
|
+
protected readonly status: WrResultStatus;
|
|
43
45
|
readonly title: _angular_core.InputSignal<string>;
|
|
44
46
|
/** Body text. Falls back to `result.notFound` from WrI18n. */
|
|
45
47
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
@@ -49,6 +51,8 @@ declare class WrResult404 {
|
|
|
49
51
|
}
|
|
50
52
|
/** Pre-set 403 result — forbidden / no access. */
|
|
51
53
|
declare class WrResult403 {
|
|
54
|
+
/** Bound by the shared template; not an input — a preset IS its status. */
|
|
55
|
+
protected readonly status: WrResultStatus;
|
|
52
56
|
readonly title: _angular_core.InputSignal<string>;
|
|
53
57
|
/** Body text. Falls back to `result.forbidden` from WrI18n. */
|
|
54
58
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
@@ -58,6 +62,8 @@ declare class WrResult403 {
|
|
|
58
62
|
}
|
|
59
63
|
/** Pre-set 500 result — internal server error. */
|
|
60
64
|
declare class WrResult500 {
|
|
65
|
+
/** Bound by the shared template; not an input — a preset IS its status. */
|
|
66
|
+
protected readonly status: WrResultStatus;
|
|
61
67
|
readonly title: _angular_core.InputSignal<string>;
|
|
62
68
|
/** Body text. Falls back to `result.serverError` from WrI18n. */
|
|
63
69
|
readonly description: _angular_core.InputSignal<string | null>;
|
|
@@ -194,6 +194,17 @@ declare class WrSegmentedOptionHarness extends ComponentHarness {
|
|
|
194
194
|
* - Activation is the browser's own default action on a button, which jsdom does not
|
|
195
195
|
* implement, so {@link select} clicks — see {@link WrSegmentedOptionHarness.select}.
|
|
196
196
|
*
|
|
197
|
+
* **It is a signal-forms control**, which adds two things to read here and one that
|
|
198
|
+
* cannot be read at all. `[formField]` binds the component's own `value` model, and a
|
|
199
|
+
* surrounding `<wr-form-field>` publishes its state onto the GROUP —
|
|
200
|
+
* {@link isInvalid} and {@link getDescriptionText} answer that, on the host rather
|
|
201
|
+
* than per segment, because the strip is one field and a description repeated on
|
|
202
|
+
* every segment would be announced once per Tab. What is NOT here is the field's
|
|
203
|
+
* `touched` flag: the component only emits `touch`, and whether anything listened is
|
|
204
|
+
* a fact about the form, not about this DOM — assert it on the field.
|
|
205
|
+
* {@link blur} is how a spec gets there, and it is the ONLY route: a click does not
|
|
206
|
+
* mark a field touched, and neither does moving from one segment to the next.
|
|
207
|
+
*
|
|
197
208
|
* **There is deliberately no `getValue()` and no selection by value.** `options` is
|
|
198
209
|
* a bound array of `{ value, label, … }` and the value is a generic `T` the component
|
|
199
210
|
* writes nowhere — not on the host, not on a segment. The single exception is an
|
|
@@ -339,6 +350,39 @@ declare class WrSegmentedHarness extends ComponentHarness {
|
|
|
339
350
|
* {@link getTabStopLabels} gives.
|
|
340
351
|
*/
|
|
341
352
|
getFocusedLabel(): Promise<string | null>;
|
|
353
|
+
/**
|
|
354
|
+
* Whether the surrounding `<wr-form-field>` is reporting this control invalid, from
|
|
355
|
+
* `aria-invalid` on the host.
|
|
356
|
+
*
|
|
357
|
+
* `false` for a control with no field around it, and `false` for a field that is
|
|
358
|
+
* invalid but has not shown its copy yet: the component keys the attribute on the
|
|
359
|
+
* MESSAGE existing rather than on the error, because announcing "invalid" while
|
|
360
|
+
* pointing at nothing is worse than staying quiet. So this and
|
|
361
|
+
* {@link getDescriptionText} move together, and a `true` with no description would
|
|
362
|
+
* be the finding.
|
|
363
|
+
*/
|
|
364
|
+
isInvalid(): Promise<boolean>;
|
|
365
|
+
/**
|
|
366
|
+
* The text `aria-describedby` points at — the validation copy a screen reader is
|
|
367
|
+
* given for this control — or `null` when the host describes nothing.
|
|
368
|
+
*
|
|
369
|
+
* Resolved from the document root, because the element named may sit anywhere on
|
|
370
|
+
* the page, and THROWS when the reference resolves to no element: a dangling
|
|
371
|
+
* `aria-describedby` renders exactly like a working one and is announced as
|
|
372
|
+
* nothing, so returning `null` for it would report the bug as the healthy state.
|
|
373
|
+
*/
|
|
374
|
+
getDescriptionText(): Promise<string | null>;
|
|
375
|
+
/**
|
|
376
|
+
* Take focus off the strip entirely — what marks a bound field touched, and the
|
|
377
|
+
* only thing that does.
|
|
378
|
+
*
|
|
379
|
+
* The component emits `touch` from a `focusout` that leaves the host, so a click
|
|
380
|
+
* does not reach it and neither does Tab from one segment to the next: a strip a
|
|
381
|
+
* user tabbed straight past has to end up untouched, which is the case `touched`
|
|
382
|
+
* exists for. Resolves quietly when nothing inside was focused, since that is
|
|
383
|
+
* already the state this asks for.
|
|
384
|
+
*/
|
|
385
|
+
blur(): Promise<void>;
|
|
342
386
|
/**
|
|
343
387
|
* The index the component publishes for the thumb, from the
|
|
344
388
|
* `--wr-segmented-thumb-index` custom property it sets inline.
|
|
@@ -393,6 +437,15 @@ declare class WrSegmentedHarness extends ComponentHarness {
|
|
|
393
437
|
/** Segment names for an error message, which must not throw on its way out. */
|
|
394
438
|
private describeOptions;
|
|
395
439
|
private describe;
|
|
440
|
+
/**
|
|
441
|
+
* One custom property off the host's `style` ATTRIBUTE.
|
|
442
|
+
*
|
|
443
|
+
* Not `getCssValue()`, which is `getComputedStyle`: with the entry point's own
|
|
444
|
+
* stylesheet loaded that resolves the sheet's declaration, so the method
|
|
445
|
+
* answers plausibly at exactly the moment the host binding — the thing under
|
|
446
|
+
* test — is what broke. The attribute holds only what the component wrote.
|
|
447
|
+
*/
|
|
448
|
+
private inlineVar;
|
|
396
449
|
/** One of the thumb's inline custom properties, as a number. */
|
|
397
450
|
private thumbVar;
|
|
398
451
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { FormValueControl } from '@angular/forms/signals';
|
|
2
3
|
import { WrIconName } from 'ngwr/icon';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -31,8 +32,25 @@ interface WrSegmentedOption<T = unknown> {
|
|
|
31
32
|
* Single-choice picker rendered as a segmented control. Two-way binds
|
|
32
33
|
* the selected `value`.
|
|
33
34
|
*
|
|
35
|
+
* A signal-forms native control: it implements `FormValueControl<T | null>`, so
|
|
36
|
+
* `[formField]` binds straight to its `value` model — no
|
|
37
|
+
* `ControlValueAccessor` in between. `[(value)]` works standalone, and classic
|
|
38
|
+
* `[(ngModel)]` / reactive forms keep working through Angular's bridge.
|
|
39
|
+
*
|
|
40
|
+
* It stays a `role="group"` of `aria-pressed` toggle buttons rather than
|
|
41
|
+
* becoming a `radiogroup`: being a form control changes what the value is bound
|
|
42
|
+
* to, not what the widget is, and a radiogroup would owe a roving tab stop and
|
|
43
|
+
* arrow-key selection — a different keyboard contract for every consumer who
|
|
44
|
+
* already ships this. The group is what the field describes (`aria-describedby`
|
|
45
|
+
* / `aria-invalid` land on the host), while the `<label for>` has to name a
|
|
46
|
+
* labelable element, so the id goes on the first segment.
|
|
47
|
+
*
|
|
34
48
|
* @example
|
|
35
49
|
* ```html
|
|
50
|
+
* <!-- signal forms -->
|
|
51
|
+
* <wr-segmented [options]="ranges" [formField]="form.range" />
|
|
52
|
+
*
|
|
53
|
+
* <!-- standalone two-way binding -->
|
|
36
54
|
* <wr-segmented
|
|
37
55
|
* [options]="[
|
|
38
56
|
* { value: 'day', label: 'Day' },
|
|
@@ -46,28 +64,112 @@ interface WrSegmentedOption<T = unknown> {
|
|
|
46
64
|
* @see https://ngwr.dev/reference/components/segmented
|
|
47
65
|
*/
|
|
48
66
|
type WrSegmentedSize = 'sm' | 'md' | 'lg';
|
|
49
|
-
declare class WrSegmented<T = unknown> {
|
|
67
|
+
declare class WrSegmented<T = unknown> implements FormValueControl<T | null> {
|
|
50
68
|
/** The segments to render. */
|
|
51
69
|
readonly options: _angular_core.InputSignal<readonly WrSegmentedOption<T>[]>;
|
|
52
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* The picked segment's `value`, `null` when nothing is selected. Bound by
|
|
72
|
+
* `[formField]`, or two-way via `[(value)]`.
|
|
73
|
+
*/
|
|
53
74
|
readonly value: _angular_core.ModelSignal<T | null>;
|
|
54
|
-
/**
|
|
75
|
+
/** Emitted when focus leaves the strip, so a bound field can mark itself touched. */
|
|
76
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Disable the whole control. Bound automatically from the field's disabled
|
|
79
|
+
* state when used with `[formField]`.
|
|
80
|
+
*
|
|
81
|
+
* @default false
|
|
82
|
+
*/
|
|
55
83
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
|
|
56
84
|
/** Control size — shares the `--wr-control-*` contract. @default 'md' */
|
|
57
85
|
readonly size: _angular_core.InputSignal<WrSegmentedSize>;
|
|
86
|
+
private readonly host;
|
|
87
|
+
private readonly field;
|
|
88
|
+
/**
|
|
89
|
+
* Id the surrounding `<wr-form-field>`'s `<label for>` points at, stamped on the
|
|
90
|
+
* FIRST segment.
|
|
91
|
+
*
|
|
92
|
+
* The field renders its label before it can see what was projected into it, so the
|
|
93
|
+
* id travels the other way and the control adopts it, exactly as `[wrInput]`,
|
|
94
|
+
* `wr-slider` and `wr-select` do. Without this the `for` named an element that was
|
|
95
|
+
* nowhere in the document: clicking the label did nothing.
|
|
96
|
+
*
|
|
97
|
+
* It cannot go on the host — only a labelable element can be a label's target, and
|
|
98
|
+
* `<wr-segmented>` is not one — and there is no single control to put it on, so it
|
|
99
|
+
* goes where clicking the label should land a user: the first segment, which is
|
|
100
|
+
* also the strip's first tab stop. The same choice `wr-slider` makes with its low
|
|
101
|
+
* thumb.
|
|
102
|
+
*
|
|
103
|
+
* What this does NOT change is that segment's NAME: it is named by its own label,
|
|
104
|
+
* and a `<label for>` cannot outrank text content in the accname order anyway.
|
|
105
|
+
*
|
|
106
|
+
* The one shape this reads wrong is a strip NESTED inside another control that is
|
|
107
|
+
* itself the field — `<wr-color-picker>`'s own format tabs are the only case in
|
|
108
|
+
* the library — where the id lands on a tab instead of on the picker. That is the
|
|
109
|
+
* same exposure `[wrInput]`, `wr-slider` and `wr-select` all carry, and the fix
|
|
110
|
+
* belongs to the outer control (shield its subtree by providing `WR_FORM_FIELD`
|
|
111
|
+
* as `null`), not to a strip that cannot tell whose field it is in.
|
|
112
|
+
*/
|
|
113
|
+
protected readonly controlId: _angular_core.Signal<string | null>;
|
|
114
|
+
/**
|
|
115
|
+
* The field's error message, wired to the GROUP rather than to a segment.
|
|
116
|
+
*
|
|
117
|
+
* A segmented control is one field made of several buttons, so the description
|
|
118
|
+
* belongs to the thing the field describes — repeated on every segment it would be
|
|
119
|
+
* announced once per Tab. `role="group"` supports neither state as a role-specific
|
|
120
|
+
* attribute, but both are ARIA globals, so this is valid where an `aria-checked`
|
|
121
|
+
* would not be.
|
|
122
|
+
*
|
|
123
|
+
* `aria-invalid` is keyed on the message EXISTING rather than on `errorKeys()`,
|
|
124
|
+
* because the field only publishes an id once it is showing something — announcing
|
|
125
|
+
* "invalid" while pointing at nothing is worse than staying quiet.
|
|
126
|
+
*/
|
|
127
|
+
protected readonly describedBy: _angular_core.Signal<string | null>;
|
|
128
|
+
protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
|
|
58
129
|
/** Index of the selected option, or `-1` when nothing is selected. */
|
|
59
130
|
protected readonly selectedIndex: _angular_core.Signal<number>;
|
|
60
131
|
/** Flips true after the first paint so the thumb only animates user-driven changes, not the initial snap. */
|
|
61
132
|
private readonly mounted;
|
|
62
133
|
constructor();
|
|
63
134
|
protected readonly classes: _angular_core.Signal<string>;
|
|
64
|
-
|
|
135
|
+
private readonly dir;
|
|
136
|
+
/**
|
|
137
|
+
* Reading direction of the strip. `Directionality` is root-provided, so this
|
|
138
|
+
* always resolves — `optional` only guards a consumer who has deliberately
|
|
139
|
+
* torn the provider out. A subtree that overrides the direction does it with
|
|
140
|
+
* the CDK's `Dir` directive, which writes `valueSignal`, so `thumbStyle`
|
|
141
|
+
* re-renders instead of leaving the thumb parked on the old segment.
|
|
142
|
+
*/
|
|
143
|
+
private readonly isRtl;
|
|
144
|
+
/**
|
|
145
|
+
* Inline CSS vars driving the sliding thumb position.
|
|
146
|
+
*
|
|
147
|
+
* `--wr-segmented-thumb-index` is the SLOT the thumb parks in, counted from the
|
|
148
|
+
* physical left, which is the selected index only in LTR. The stylesheet anchors
|
|
149
|
+
* the thumb with a physical `left` and slides it with `translateX` — neither has
|
|
150
|
+
* a logical form — while the options are a grid that mirrors, so under `dir="rtl"`
|
|
151
|
+
* the segment at logical index `i` occupies slot `count - 1 - i`. Left unsigned,
|
|
152
|
+
* the pill sat under a different label than the one it marks (the whole strip's
|
|
153
|
+
* worth of offset at the far end), which is the carousel's `trackStyle` problem
|
|
154
|
+
* one component over.
|
|
155
|
+
*/
|
|
65
156
|
protected readonly thumbStyle: _angular_core.Signal<Record<string, string>>;
|
|
66
157
|
protected isSelected(option: WrSegmentedOption<T>): boolean;
|
|
67
158
|
protected select(option: WrSegmentedOption<T>): void;
|
|
68
159
|
protected trackByValue(_: number, option: WrSegmentedOption<T>): unknown;
|
|
160
|
+
/**
|
|
161
|
+
* A bound field learns it may show its validation copy from `touch`, and a click
|
|
162
|
+
* cannot be the source: a strip tabbed into and out of without a pick left the
|
|
163
|
+
* field untouched forever — which is exactly the case `touched` exists for.
|
|
164
|
+
*
|
|
165
|
+
* `wr-knob` and `wr-rating` bind `(blur)` on the one element they own; this
|
|
166
|
+
* component owns one button per option, so it listens for the bubbling `focusout`
|
|
167
|
+
* on its host instead — and ignores the one that only moves focus from one segment
|
|
168
|
+
* to the next, the way `wr-slider` ignores the hop between its two thumbs.
|
|
169
|
+
*/
|
|
170
|
+
protected onFocusOut(event: FocusEvent): void;
|
|
69
171
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSegmented<any>, never>;
|
|
70
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSegmented<any>, "wr-segmented", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
172
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSegmented<any>, "wr-segmented", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
|
|
71
173
|
}
|
|
72
174
|
|
|
73
175
|
export { WrSegmented };
|