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
package/README.md
CHANGED
|
@@ -7,27 +7,81 @@
|
|
|
7
7
|
[](https://codecov.io/gh/thekhegay/ngwr)
|
|
8
8
|
[](https://github.com/thekhegay/ngwr/blob/main/LICENSE)
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
<!-- "Nineteen" is derived, not chosen: `grep -rn "implements .*Form\(Value\|Checkbox\)Control" projects/lib`
|
|
11
|
+
returns twenty class declarations, and the twentieth — `date-picker/internal/time-panel.ts` —
|
|
12
|
+
is exported by no `public-api.ts`. Seventeen implement `FormValueControl`; `wr-checkbox` and
|
|
13
|
+
`wr-switch` implement `FormCheckboxControl`. It is a count and not the word "every" on purpose:
|
|
14
|
+
`[wrColorPickerTrigger]` is public, carries its own `value` model, and implements neither.
|
|
15
|
+
Re-derive before editing the number. -->
|
|
16
|
+
|
|
17
|
+
**NGWR is an Angular UI library that binds straight to Signal Forms.** Nineteen
|
|
18
|
+
value controls implement `FormValueControl` / `FormCheckboxControl` themselves,
|
|
19
|
+
so `[formField]` writes the component's own `value` / `checked` model — there
|
|
20
|
+
is not one `ControlValueAccessor` in the library. Zoneless by construction, not
|
|
21
|
+
zoneless-compatible: signal inputs, signal state, `afterNextRender()` for DOM
|
|
22
|
+
work, and no `@NgModule` or `@Input()` decorator anywhere in the source. 202
|
|
23
|
+
tree-shakable entry points, on `@angular/cdk` for overlay, portal and a11y
|
|
24
|
+
primitives.
|
|
25
|
+
|
|
26
|
+
**[Try it in the browser](https://ngwr.dev/start/playground)** — no install.
|
|
27
|
+
**[How it compares](https://ngwr.dev/start/comparison)** — what the other
|
|
28
|
+
Angular UI libraries do about Signal Forms today, counted rather than asserted.
|
|
29
|
+
**[Docs and live demos](https://ngwr.dev)**.
|
|
13
30
|
|
|
14
|
-
|
|
31
|
+
```ts
|
|
32
|
+
import { Component, signal } from '@angular/core';
|
|
33
|
+
import { FormField, email, form, required } from '@angular/forms/signals';
|
|
34
|
+
import { WrCheckbox } from 'ngwr/checkbox';
|
|
35
|
+
import { WrFormField } from 'ngwr/form';
|
|
36
|
+
import { WrInput } from 'ngwr/input';
|
|
37
|
+
|
|
38
|
+
@Component({
|
|
39
|
+
selector: 'signup-card',
|
|
40
|
+
imports: [FormField, WrCheckbox, WrFormField, WrInput],
|
|
41
|
+
template: `
|
|
42
|
+
<wr-form-field label="Work email" required>
|
|
43
|
+
<input wrInput type="email" [formField]="signup.email" />
|
|
44
|
+
</wr-form-field>
|
|
45
|
+
|
|
46
|
+
<wr-checkbox [formField]="signup.agree">I agree to the terms</wr-checkbox>
|
|
47
|
+
`,
|
|
48
|
+
})
|
|
49
|
+
export class SignupCard {
|
|
50
|
+
private readonly model = signal({ email: '', agree: false });
|
|
51
|
+
|
|
52
|
+
// `[formField]` binds to the control's own `value` / `checked` model, and
|
|
53
|
+
// `<wr-form-field>` resolves the error copy from the i18n catalog — so
|
|
54
|
+
// neither an accessor nor a `<wr-form-error>` has to be written by hand.
|
|
55
|
+
readonly signup = form(this.model, path => {
|
|
56
|
+
required(path.email);
|
|
57
|
+
email(path.email);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Classic `[(ngModel)]` and reactive forms still work — Angular 22 synthesises the
|
|
63
|
+
accessor for a signal-forms control — and every control is usable standalone
|
|
64
|
+
through its two-way `[(value)]` / `[(checked)]` model.
|
|
65
|
+
|
|
66
|
+
> **Status:** active development. v12 is the current major line (Angular 22 peer).
|
|
15
67
|
> Public API is stable across patch releases and still evolving between majors.
|
|
16
68
|
> [Open an issue](https://github.com/thekhegay/ngwr/issues/new)
|
|
17
69
|
> if something breaks or feels wrong.
|
|
18
70
|
|
|
19
71
|
## Requirements
|
|
20
72
|
|
|
21
|
-
| Peer
|
|
22
|
-
|
|
|
23
|
-
| `@angular/core`
|
|
24
|
-
| `@angular/common`
|
|
25
|
-
| `@angular/
|
|
26
|
-
| `@angular/
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
73
|
+
| Peer | Range |
|
|
74
|
+
| ------------------------------ | -------------------- |
|
|
75
|
+
| `@angular/core` | `>= 22.0.0` |
|
|
76
|
+
| `@angular/common` | `>= 22.0.0` |
|
|
77
|
+
| `@angular/forms` | `>= 22.0.0` |
|
|
78
|
+
| `@angular/cdk` | `>= 22.0.0` |
|
|
79
|
+
| `@angular/platform-browser` | `>= 22.0.0` |
|
|
80
|
+
| `@angular/router` _(optional)_ | `>= 22.0.0` |
|
|
81
|
+
| `rxjs` | `^7.0.0` |
|
|
82
|
+
| `date-fns` _(optional)_ | `^3.0.0 \|\| ^4.0.0` |
|
|
83
|
+
| `luxon` _(optional)_ | `^3.0.0` |
|
|
84
|
+
| `lucide` _(optional)_ | `>= 1.0.0` |
|
|
31
85
|
|
|
32
86
|
TypeScript `~6.0.x` (Angular 22's compiler declares `typescript >=6.0 <6.1`) and
|
|
33
87
|
a Node version Angular 22 accepts — `^22.22.3 || ^24.15.0 || >=26`. Contributing
|
|
@@ -55,11 +109,16 @@ npm install ngwr @angular/cdk
|
|
|
55
109
|
yarn add ngwr @angular/cdk
|
|
56
110
|
```
|
|
57
111
|
|
|
58
|
-
`@angular/cdk`
|
|
59
|
-
|
|
60
|
-
`
|
|
61
|
-
|
|
62
|
-
it
|
|
112
|
+
Beyond Angular itself, `@angular/cdk` and `@angular/forms` are the required
|
|
113
|
+
peers — forms because the value controls implement its Signal Forms interfaces.
|
|
114
|
+
`@angular/router` is optional, needed only by the navigation components that
|
|
115
|
+
take a `routerLink`. A stock `ng new` app already ships forms and router, so
|
|
116
|
+
`@angular/cdk` is the only one you have to add — which is why it is on the
|
|
117
|
+
install lines above. Add an icon set and a date library only if you use them —
|
|
118
|
+
`lucide` (or `feather-icons`) for the icon adapters, and `date-fns` or `luxon`
|
|
119
|
+
for the calendar / date-picker, which otherwise runs on a built-in native
|
|
120
|
+
`Date` adapter. The Quick start below registers a lucide icon, so it needs
|
|
121
|
+
`lucide`:
|
|
63
122
|
|
|
64
123
|
```shell
|
|
65
124
|
pnpm add lucide
|
|
@@ -146,7 +205,7 @@ export class AppComponent {
|
|
|
146
205
|
}
|
|
147
206
|
```
|
|
148
207
|
|
|
149
|
-
|
|
208
|
+
Value controls are Signal Forms-native, so `[formField]` binds straight
|
|
150
209
|
through — no `ControlValueAccessor` anywhere in the chain:
|
|
151
210
|
|
|
152
211
|
```ts
|
|
@@ -201,7 +260,7 @@ Plus [icon](https://ngwr.dev/reference/components/icon), the experimental [squir
|
|
|
201
260
|
|
|
202
261
|
### Animations
|
|
203
262
|
|
|
204
|
-
Animated UI effects. Mix of in-house components + ports of [reactbits.dev](https://www.reactbits.dev) — each port carries a credit chip on its docs page. Defaults are theme-aware (light + dark), and every component honors `prefers-reduced-motion
|
|
263
|
+
Animated UI effects. Mix of in-house components + ports of [reactbits.dev](https://www.reactbits.dev) — each port carries a credit chip on its docs page. Defaults are theme-aware (light + dark), and every component honors `prefers-reduced-motion` — the one exception is `spotlight-card`, whose highlight only tracks the pointer.
|
|
205
264
|
|
|
206
265
|
[aurora](https://ngwr.dev/animations/aurora), [blur-text](https://ngwr.dev/animations/blur-text), [border-glow](https://ngwr.dev/animations/border-glow), [circular-text](https://ngwr.dev/animations/circular-text), [click-spark](https://ngwr.dev/animations/click-spark), [confetti](https://ngwr.dev/animations/confetti), [decrypt-text](https://ngwr.dev/animations/decrypt-text), [falling-text](https://ngwr.dev/animations/falling-text), [fuzzy-text](https://ngwr.dev/animations/fuzzy-text), [glitch-text](https://ngwr.dev/animations/glitch-text), [gradient-text](https://ngwr.dev/animations/gradient-text), [marquee](https://ngwr.dev/animations/marquee), [rotating-text](https://ngwr.dev/animations/rotating-text), [shiny-text](https://ngwr.dev/animations/shiny-text), [splash-cursor](https://ngwr.dev/animations/splash-cursor), [split-text](https://ngwr.dev/animations/split-text), [spotlight-card](https://ngwr.dev/animations/spotlight-card), [star-border](https://ngwr.dev/animations/star-border), [tilt-card](https://ngwr.dev/animations/tilt-card), [typewriter](https://ngwr.dev/animations/typewriter), [waves](https://ngwr.dev/animations/waves).
|
|
207
266
|
|
|
@@ -235,21 +294,21 @@ Math (`clamp`, `round`), coercion (`numAttr`), css helpers (`resolveCssSize`, `g
|
|
|
235
294
|
- [Mobile & responsive](https://ngwr.dev/guides/mobile) — responsive overlays, touch targets & density, swipe gestures, safe-area insets, container-query layouts.
|
|
236
295
|
- [Typography](https://ngwr.dev/guides/typography) — `wrTypography` directive: headings, paragraphs, lists, links, code.
|
|
237
296
|
- [Icons](https://ngwr.dev/icons) — `ngwr/icon` registry. Use `svgIcon()` for any set that ships raw SVG files (Tabler, Phosphor, Heroicons, Iconoir, Radix, Bootstrap, or your designer's own), plus thin adapters for Lucide (`ngwr/icon/adapters/lucide`) and Feather (`ngwr/icon/adapters/feather`), whose packages don't ship SVGs.
|
|
238
|
-
- **Date adapters** — `ngwr/date
|
|
297
|
+
- **Date adapters** — `ngwr/date` (native `Date`, no extra package), `ngwr/date/adapters/fns`, `ngwr/date/adapters/luxon`. Wire one with `provideWrDateAdapter()` — plus `{ adapter: WrDateFnsAdapter }` / `{ adapter: WrLuxonAdapter }` for the library-backed ones — to power calendar + every mode of date-picker.
|
|
239
298
|
- **Component defaults** — `ngwr/config`. `provideWrConfig({ button: { size: 'sm' } })` sets what a component falls back to when a template says nothing; a bound value always wins, and a bound `false` beats a configured `true`, so a config never has to be escaped. [Reference](https://ngwr.dev/start/configuration).
|
|
240
299
|
|
|
241
300
|
## Highlights
|
|
242
301
|
|
|
243
302
|
- **Standalone & signals-first.** Every component is standalone and uses `input()` / `model()` / `output()` / `signal()` / `computed()`. Zoneless-ready.
|
|
244
|
-
- **Signal Forms native.**
|
|
303
|
+
- **Signal Forms native.** Nineteen value controls implement `FormValueControl` / `FormCheckboxControl`, so `[formField]` binds straight through — there is no `ControlValueAccessor` in the library at all. `[(ngModel)]` and reactive forms keep working through Angular's bridge, and every control also works standalone via `[(value)]` / `[(checked)]`.
|
|
245
304
|
- **CDK-powered.** Overlays, portals, and a11y come from `@angular/cdk`. We add `provideWrOverlay()` so NGWR overlays never collide with other CDK consumers (Material, NG-ZORRO, etc.).
|
|
246
|
-
- **Mobile & responsive.** Overlays collapse to bottom-sheets on small screens (`provideWrResponsiveOverlays()`), touch targets grow to ≥44px on coarse pointers, a `touch` density preset enlarges
|
|
305
|
+
- **Mobile & responsive.** Overlays collapse to bottom-sheets on small screens (`provideWrResponsiveOverlays()`), touch targets grow to ≥44px on coarse pointers, a `touch` density preset enlarges the nine control families that read the multipliers, and drawer / lightbox / toast / carousel respond to swipe gestures. Fixed surfaces respect `env(safe-area-inset-*)`, and layout components (`descriptions`, `stepper`, `page-header`, `toolbar`, `pagination`, `table`) reflow to their container via container queries. [Guide](https://ngwr.dev/guides/mobile).
|
|
247
306
|
- **Table, batteries included.** `wr-table` covers column pinning / resizing / drag-reorder, row selection, expandable rows, grouping, tree rows (`childrenKey` — the forest flattens into the same `<tbody>`, so pinning and cell templates keep working at every depth, and the table announces a `treegrid`), summary rows, CSV export (`exportCsv()`, dependency-free RFC 4180) and a virtualized body — all opt-in inputs on the one component. Excel (`.xlsx`) export is deliberately not shipped: it would mean a third-party dependency.
|
|
248
|
-
- **Tree-shakable.**
|
|
307
|
+
- **Tree-shakable.** 202 separate ng-packagr entry points — import only what you use. Per-component FESM bundles are small: a median of ~4 KB gzipped, the heaviest (`ngwr/markdown`) ~23 KB. Every runtime bundle together gzips to ~690 KB — the 70 `ngwr/<name>/testing` harnesses aside, since they never reach an app bundle — but real apps pull a handful of entries. The only runtime dependency is `tslib`.
|
|
249
308
|
- **Modular SCSS.** Component styles are scoped through CSS custom properties. Theme tokens live in `ngwr/theme`; utilities (`grid`, `reset`) and the breakpoints SCSS API are opt-in.
|
|
250
309
|
- **Tree-shaken icons.** `provideWrIcons(lucideIcons({ plus: Plus }))` registers only the icons you actually import. Dev-mode validation warns about unregistered icons.
|
|
251
310
|
- **Reactbits ports, dependency-free.** All animation ports are reimplemented with vanilla DOM + Web Animations API / `IntersectionObserver` / `requestAnimationFrame` / raw WebGL — no GSAP, no `motion/react`, no `matter-js`, no `ogl`.
|
|
252
|
-
- **Motion respects the OS.** Every animation component short-circuits to its final state under `prefers-reduced-motion
|
|
311
|
+
- **Motion respects the OS.** Every animation component short-circuits to its final state under `prefers-reduced-motion`, except `spotlight-card`, which animates nothing on its own — its highlight follows the cursor.
|
|
253
312
|
- **Legible to agents.** Every docs page also serves as markdown at the same URL plus `.md` — [reference/components/select.md](https://ngwr.dev/reference/components/select.md) is that page's prose, code samples and API tables without the site chrome. The whole catalog is at [llms-full.txt](https://ngwr.dev/llms-full.txt), a quick-ref at [llms.txt](https://ngwr.dev/llms.txt).
|
|
254
313
|
|
|
255
314
|
### MCP server
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
&:active {
|
|
48
|
-
--wr-btn-bg:
|
|
48
|
+
--wr-btn-bg: var(--wr-color-fill-strong);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
&[disabled],
|
|
52
52
|
&:disabled {
|
|
53
53
|
cursor: default;
|
|
54
54
|
pointer-events: none;
|
|
55
|
-
opacity:
|
|
55
|
+
opacity: var(--wr-disabled-opacity);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
&__icon {
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
&:focus-visible {
|
|
64
|
-
outline:
|
|
65
|
-
|
|
64
|
+
outline: var(--wr-focus-ring-width) solid var(--wr-calendar-accent);
|
|
65
|
+
outline-offset: 2px;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
&:disabled {
|
|
@@ -93,13 +93,24 @@
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
&:focus-visible {
|
|
96
|
-
outline:
|
|
97
|
-
|
|
96
|
+
outline: var(--wr-focus-ring-width) solid var(--wr-calendar-accent);
|
|
97
|
+
outline-offset: 2px;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
&:disabled {
|
|
101
101
|
cursor: not-allowed;
|
|
102
|
-
opacity:
|
|
102
|
+
opacity: var(--wr-disabled-opacity);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// `__header` is a plain flex row, so it already mirrors: under `dir="rtl"`
|
|
106
|
+
// the prev button lays out at the right edge. Its chevron is drawn pointing
|
|
107
|
+
// physically left, though, so it ends up aiming at the month it moves AWAY
|
|
108
|
+
// from. Turn the glyphs around with the row, the same way the pagination and
|
|
109
|
+
// carousel arrows do — "previous" is the inline start in both directions.
|
|
110
|
+
// Scoped to `__nav`, the two icon-only buttons: `__label` sits between them
|
|
111
|
+
// and is text, which must not mirror.
|
|
112
|
+
[dir='rtl'] & svg {
|
|
113
|
+
transform: scaleX(-1);
|
|
103
114
|
}
|
|
104
115
|
}
|
|
105
116
|
|
|
@@ -163,8 +174,8 @@
|
|
|
163
174
|
}
|
|
164
175
|
|
|
165
176
|
&:focus-visible {
|
|
166
|
-
outline:
|
|
167
|
-
|
|
177
|
+
outline: var(--wr-focus-ring-width) solid var(--wr-calendar-accent);
|
|
178
|
+
outline-offset: -2px;
|
|
168
179
|
}
|
|
169
180
|
|
|
170
181
|
// States — order matters; later rules override earlier ones.
|
|
@@ -200,7 +211,16 @@
|
|
|
200
211
|
&:disabled {
|
|
201
212
|
color: var(--wr-calendar-muted);
|
|
202
213
|
cursor: not-allowed;
|
|
203
|
-
|
|
214
|
+
// Fainter than the shared token, and a neighbour is the reason: a day from
|
|
215
|
+
// the adjacent month is still navigable and sits at 0.55 just above, so a
|
|
216
|
+
// DISABLED day has to read as less available than that one or the two swap
|
|
217
|
+
// meanings. Deliberately an absolute, calibrated against that hard-coded
|
|
218
|
+
// 0.55 rather than scaled off the shared token — floating with a consumer
|
|
219
|
+
// retune is exactly what would let the two cross. Written as an override of
|
|
220
|
+
// the token anyway, because `_variables.scss` asks that exceptions take
|
|
221
|
+
// that form so they stay greppable and argued.
|
|
222
|
+
--wr-disabled-opacity: 0.45;
|
|
223
|
+
opacity: var(--wr-disabled-opacity);
|
|
204
224
|
}
|
|
205
225
|
}
|
|
206
226
|
|
|
@@ -239,8 +259,8 @@
|
|
|
239
259
|
}
|
|
240
260
|
|
|
241
261
|
&:focus-visible {
|
|
242
|
-
outline:
|
|
243
|
-
|
|
262
|
+
outline: var(--wr-focus-ring-width) solid var(--wr-calendar-accent);
|
|
263
|
+
outline-offset: -2px;
|
|
244
264
|
}
|
|
245
265
|
|
|
246
266
|
&--current:not(.wr-calendar__chip--selected) {
|
|
@@ -260,12 +280,12 @@
|
|
|
260
280
|
&:disabled {
|
|
261
281
|
color: var(--wr-calendar-muted);
|
|
262
282
|
cursor: not-allowed;
|
|
263
|
-
opacity:
|
|
283
|
+
opacity: var(--wr-disabled-opacity);
|
|
264
284
|
}
|
|
265
285
|
}
|
|
266
286
|
|
|
267
287
|
&--disabled {
|
|
268
288
|
pointer-events: none;
|
|
269
|
-
opacity:
|
|
289
|
+
opacity: var(--wr-disabled-opacity);
|
|
270
290
|
}
|
|
271
291
|
}
|
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
.wr-calendar-heatmap {
|
|
4
4
|
display: inline-block;
|
|
5
|
+
// A year is 53 columns of a FIXED cell size, so the grid has no reflow in it:
|
|
6
|
+
// its intrinsic width is ~731px whatever the container, and without a cap it
|
|
7
|
+
// escaped the card it sits in and gave the whole document a 397px horizontal
|
|
8
|
+
// scroll at 375px. Cap it and scroll the grid instead — the same answer
|
|
9
|
+
// `.wr-table__scroll` and `.wr-tabs__strip` already give. The cap also covers
|
|
10
|
+
// the plain block-parent case, where shrink-to-fit alone would still hand the
|
|
11
|
+
// element its full 731px.
|
|
12
|
+
max-width: 100%;
|
|
13
|
+
overflow-x: auto;
|
|
14
|
+
// `overflow-x: auto` alone reserves room for a vertical scrollbar in browsers
|
|
15
|
+
// without overlay bars — a stray bar down the side of a grid that is never
|
|
16
|
+
// taller than its content. Pin the y axis; the bottom row's `:hover` scale is
|
|
17
|
+
// given its room on `&__cells` below, since that is where the cell size is
|
|
18
|
+
// legible.
|
|
19
|
+
overflow-y: hidden;
|
|
5
20
|
font-family: var(--wr-font-family-base);
|
|
6
21
|
color: var(--wr-color-on-surface-muted);
|
|
7
22
|
|
|
@@ -54,6 +69,11 @@
|
|
|
54
69
|
&__cells {
|
|
55
70
|
grid-area: cells;
|
|
56
71
|
grid-template-rows: repeat(7, var(--wr-heatmap-cell-size));
|
|
72
|
+
// The bottom row sits on the host's own edge, and the host now clips its
|
|
73
|
+
// block axis (see above) — so the 40% a hovered cell grows by, half of it
|
|
74
|
+
// below the row, had nowhere to go. Reserve that half. Scaled from the cell
|
|
75
|
+
// size rather than written as a length, because the size is an input.
|
|
76
|
+
padding-block-end: calc(var(--wr-heatmap-cell-size) * 0.2);
|
|
57
77
|
}
|
|
58
78
|
|
|
59
79
|
&__cell {
|
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
overflow: hidden;
|
|
11
11
|
font-family: var(--wr-font-family-base);
|
|
12
12
|
|
|
13
|
+
// The host is the sized box — the documented recipe gives it a `height` or an
|
|
14
|
+
// `aspect-ratio` — but the height has to be HANDED DOWN, one definite parent
|
|
15
|
+
// at a time, or the chain collapses to the tallest slide's content and a
|
|
16
|
+
// `16 / 9` carousel paints a text-height strip over its own empty frame. The
|
|
17
|
+
// arrows and dots anchor to the host, so they kept floating in that void.
|
|
18
|
+
// Inert for an unsized carousel: a percentage against an auto-height parent
|
|
19
|
+
// resolves to auto, which is what these boxes already did.
|
|
13
20
|
&__viewport {
|
|
21
|
+
height: 100%;
|
|
14
22
|
overflow: hidden;
|
|
15
23
|
// Capture horizontal swipe-nav; let vertical scrolling pass through.
|
|
16
24
|
touch-action: pan-y;
|
|
@@ -18,6 +26,7 @@
|
|
|
18
26
|
|
|
19
27
|
&__track {
|
|
20
28
|
display: flex;
|
|
29
|
+
height: 100%;
|
|
21
30
|
transition: transform var(--wr-duration-slow) var(--wr-ease-out);
|
|
22
31
|
will-change: transform;
|
|
23
32
|
}
|
|
@@ -27,10 +36,15 @@
|
|
|
27
36
|
flex: 0 0 100%;
|
|
28
37
|
min-width: 0;
|
|
29
38
|
display: block;
|
|
39
|
+
height: 100%;
|
|
30
40
|
|
|
41
|
+
// The slide's own child is what a consumer writes `height: 100%` on (the
|
|
42
|
+
// library's demo does), and that only resolves once every box above it is
|
|
43
|
+
// definite — see the note on `__viewport`.
|
|
31
44
|
> * {
|
|
32
45
|
display: block;
|
|
33
46
|
width: 100%;
|
|
47
|
+
height: 100%;
|
|
34
48
|
}
|
|
35
49
|
|
|
36
50
|
img {
|
|
@@ -99,7 +113,15 @@
|
|
|
99
113
|
border: 0;
|
|
100
114
|
border-radius: 50%;
|
|
101
115
|
background: rgba(var(--wr-color-surface-rgb), 0.55);
|
|
102
|
-
|
|
116
|
+
// The dot's fill IS the surface, so this ring is the whole of its visible
|
|
117
|
+
// boundary — and WCAG 1.4.11 asks 3:1 of the thing that identifies a
|
|
118
|
+
// control and its state. Fixed black could never carry that in both
|
|
119
|
+
// themes: on the dark canvas it measured 1.02:1 (black on near-black) and
|
|
120
|
+
// even in light only 1.41:1. `on-surface` flips with the theme the way the
|
|
121
|
+
// `--wr-shadow-*` family does, and 0.55 is the alpha that clears the bar on
|
|
122
|
+
// the bare canvas in both — measured 4.00:1 light, 5.35:1 dark. Same shape
|
|
123
|
+
// as `.wr-color-picker__swatch`'s ring, which learned this first.
|
|
124
|
+
box-shadow: 0 0 0 1px rgba(var(--wr-color-on-surface-rgb), 0.55);
|
|
103
125
|
cursor: pointer;
|
|
104
126
|
transition:
|
|
105
127
|
width var(--wr-transition-base),
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
&--disabled {
|
|
23
23
|
--wr-cascader-color: var(--wr-color-on-surface-muted);
|
|
24
|
-
--wr-cascader-bg:
|
|
24
|
+
--wr-cascader-bg: var(--wr-color-fill);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// Sizes — trigger on the control contract (sm 22 / md 30 / lg 36).
|
|
@@ -52,7 +52,12 @@
|
|
|
52
52
|
color: var(--wr-cascader-color);
|
|
53
53
|
border: 1px solid var(--wr-cascader-border);
|
|
54
54
|
border-radius: var(--wr-cascader-radius);
|
|
55
|
-
|
|
55
|
+
// Density-multiplied like select / input / textarea / button: the trigger
|
|
56
|
+
// sources the same `--wr-control-padding-*` contract they do, so without
|
|
57
|
+
// the multiplier it held its md height (30px) while its neighbours grew —
|
|
58
|
+
// measured at 35.59px for input / select under `touch`.
|
|
59
|
+
padding: calc(var(--wr-cascader-padding-y) * var(--wr-density-y, 1))
|
|
60
|
+
calc(var(--wr-cascader-padding-x) * var(--wr-density-x, 1));
|
|
56
61
|
font-family: var(--wr-font-family-base);
|
|
57
62
|
font-size: var(--wr-cascader-font-size);
|
|
58
63
|
line-height: var(--wr-cascader-line-height);
|
|
@@ -193,7 +198,7 @@
|
|
|
193
198
|
&--disabled {
|
|
194
199
|
color: var(--wr-color-on-surface-muted);
|
|
195
200
|
cursor: not-allowed;
|
|
196
|
-
opacity:
|
|
201
|
+
opacity: var(--wr-disabled-opacity);
|
|
197
202
|
|
|
198
203
|
&:hover {
|
|
199
204
|
background: transparent;
|
|
@@ -213,6 +218,13 @@
|
|
|
213
218
|
flex: 0 0 auto;
|
|
214
219
|
color: var(--wr-color-on-surface-muted);
|
|
215
220
|
}
|
|
221
|
+
|
|
222
|
+
// The panel is a flex row, so its columns cascade toward the inline end —
|
|
223
|
+
// leftward under `dir="rtl"`. The branch arrow is drawn pointing physically
|
|
224
|
+
// right, so turn it around with them, the way the carousel's arrows do.
|
|
225
|
+
[dir='rtl'] & .wr-cascader__opt-arrow {
|
|
226
|
+
transform: scaleX(-1);
|
|
227
|
+
}
|
|
216
228
|
}
|
|
217
229
|
|
|
218
230
|
// Touch pointers: grow the clear button and make the column option rows ~44px
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
white-space: nowrap;
|
|
38
38
|
|
|
39
39
|
&:focus-visible + .wr-checkbox__box {
|
|
40
|
-
|
|
40
|
+
@include theme.focus-ring;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
&--disabled {
|
|
124
124
|
--wr-checkbox-color: var(--wr-color-on-surface-muted);
|
|
125
125
|
pointer-events: none;
|
|
126
|
-
opacity:
|
|
126
|
+
opacity: var(--wr-disabled-opacity);
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
transition: background var(--wr-transition-base);
|
|
36
36
|
|
|
37
37
|
&:hover:not(:disabled) {
|
|
38
|
-
background:
|
|
38
|
+
background: var(--wr-color-fill);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
&:disabled {
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
|
|
84
84
|
&--disabled {
|
|
85
85
|
--wr-collapse-color: var(--wr-color-on-surface-muted);
|
|
86
|
-
opacity:
|
|
86
|
+
opacity: var(--wr-disabled-opacity);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
&:disabled {
|
|
194
|
-
background:
|
|
194
|
+
background: var(--wr-color-fill);
|
|
195
195
|
color: var(--wr-color-on-surface-muted);
|
|
196
196
|
cursor: not-allowed;
|
|
197
197
|
}
|
|
@@ -247,13 +247,13 @@
|
|
|
247
247
|
|
|
248
248
|
&:disabled {
|
|
249
249
|
cursor: not-allowed;
|
|
250
|
-
opacity:
|
|
250
|
+
opacity: var(--wr-disabled-opacity);
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
|
|
254
254
|
&--disabled {
|
|
255
255
|
pointer-events: none;
|
|
256
|
-
opacity:
|
|
256
|
+
opacity: var(--wr-disabled-opacity);
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
|
|
@@ -12,9 +12,25 @@
|
|
|
12
12
|
height: 100%;
|
|
13
13
|
outline: 0;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
// The surface is `role="slider"` and the component's only keyboard
|
|
16
|
+
// affordance, but it is coterminous with the host — and rounding a
|
|
17
|
+
// before/after comparator means `overflow: hidden` there, which discards an
|
|
18
|
+
// outset ring whole. Insetting the offset is not enough either: the
|
|
19
|
+
// projected layers paint over the surface's own outline. So the ring is a
|
|
20
|
+
// pseudo-element stacked above `&__layers`, drawn inward from the edge.
|
|
21
|
+
&:focus-visible::after {
|
|
22
|
+
content: '';
|
|
23
|
+
position: absolute;
|
|
24
|
+
inset: 0;
|
|
25
|
+
z-index: 2;
|
|
26
|
+
pointer-events: none;
|
|
17
27
|
border-radius: var(--wr-border-radius-sm);
|
|
28
|
+
outline: var(--wr-focus-ring-width) solid var(--wr-focus-ring-color);
|
|
29
|
+
// A negative offset equal to the width puts the stroke flush inside the
|
|
30
|
+
// edge; the halo then sits just inside it, mirroring the outset ring.
|
|
31
|
+
outline-offset: calc(-1 * var(--wr-focus-ring-width));
|
|
32
|
+
box-shadow: inset 0 0 0 calc(var(--wr-focus-ring-width) + var(--wr-focus-ring-offset))
|
|
33
|
+
var(--wr-focus-ring-halo);
|
|
18
34
|
}
|
|
19
35
|
}
|
|
20
36
|
|
|
@@ -72,12 +72,22 @@
|
|
|
72
72
|
background: var(--wr-color-primary-soft);
|
|
73
73
|
// The item label inherits this, so it is text on the `-soft` tint: `-ink`.
|
|
74
74
|
color: var(--wr-color-primary-ink);
|
|
75
|
-
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Hover and focus paint the same tint, so the tint alone cannot say which row
|
|
78
|
+
// Enter fires — with the keyboard on one row and the pointer resting on
|
|
79
|
+
// another, both light up identically. And the menu focuses its first enabled
|
|
80
|
+
// row on open and roves with the arrows, so this is the ordinary keyboard
|
|
81
|
+
// state rather than an edge case. Same ring as `.wr-dropdown-item`, and it
|
|
82
|
+
// fits: the menu's 0.3125rem padding clears the 2px offset plus the 2px
|
|
83
|
+
// outline with a pixel to spare, so no negative offset is needed here.
|
|
84
|
+
&:focus-visible {
|
|
85
|
+
@include theme.focus-ring;
|
|
76
86
|
}
|
|
77
87
|
|
|
78
88
|
&--disabled {
|
|
79
89
|
color: var(--wr-color-on-surface-muted);
|
|
80
|
-
opacity:
|
|
90
|
+
opacity: var(--wr-disabled-opacity);
|
|
81
91
|
pointer-events: none;
|
|
82
92
|
}
|
|
83
93
|
|
|
@@ -107,6 +117,15 @@
|
|
|
107
117
|
&--has-submenu:focus-visible &__chevron {
|
|
108
118
|
color: var(--wr-color-primary);
|
|
109
119
|
}
|
|
120
|
+
|
|
121
|
+
// The submenu pane cascades toward the inline end, so under `dir="rtl"` it
|
|
122
|
+
// opens to the LEFT — `context-menu-item.ts` swaps the key that opens it for
|
|
123
|
+
// the same reason. The chevron is drawn pointing physically right, so turn it
|
|
124
|
+
// around with the panes, the way the cascader's branch arrow does. Scoped to
|
|
125
|
+
// the chevron: the label beside it must not mirror.
|
|
126
|
+
[dir='rtl'] &__chevron {
|
|
127
|
+
transform: scaleX(-1);
|
|
128
|
+
}
|
|
110
129
|
}
|
|
111
130
|
|
|
112
131
|
// Horizontal separator between groups of items.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
&:disabled {
|
|
24
24
|
cursor: not-allowed;
|
|
25
|
-
opacity:
|
|
25
|
+
opacity: var(--wr-disabled-opacity);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
|
|
47
47
|
&--disabled {
|
|
48
48
|
.wr-date-range-picker__separator {
|
|
49
|
-
opacity:
|
|
49
|
+
opacity: var(--wr-disabled-opacity);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
|
|
128
128
|
&:disabled {
|
|
129
129
|
cursor: not-allowed;
|
|
130
|
-
opacity:
|
|
130
|
+
opacity: var(--wr-disabled-opacity);
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
&:disabled {
|
|
165
|
-
background:
|
|
165
|
+
background: var(--wr-color-fill);
|
|
166
166
|
color: var(--wr-time-picker-muted);
|
|
167
167
|
cursor: not-allowed;
|
|
168
168
|
}
|
|
@@ -196,7 +196,7 @@
|
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
&--disabled {
|
|
199
|
-
opacity:
|
|
199
|
+
opacity: var(--wr-disabled-opacity);
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
|
|
@@ -39,6 +39,33 @@
|
|
|
39
39
|
&:active {
|
|
40
40
|
cursor: grabbing;
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
// Every row is a tab stop (the keyboard reorder path), so every row needs a
|
|
44
|
+
// ring. Included here rather than added to `theme/_focus.scss`, the same
|
|
45
|
+
// choice `wr-list` made for its own rows.
|
|
46
|
+
&:focus-visible {
|
|
47
|
+
@include theme.focus-ring;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Picked up by the keyboard — the standing counterpart of `:active`, which
|
|
51
|
+
// only lasts while a pointer is held down.
|
|
52
|
+
&--grabbed {
|
|
53
|
+
cursor: grabbing;
|
|
54
|
+
box-shadow: 0 6px 12px rgba(var(--wr-color-backdrop-rgb), 0.22);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The key model and the position announcements: read out, never drawn.
|
|
59
|
+
&__sr-only {
|
|
60
|
+
position: absolute;
|
|
61
|
+
width: 1px;
|
|
62
|
+
height: 1px;
|
|
63
|
+
padding: 0;
|
|
64
|
+
margin: -1px;
|
|
65
|
+
overflow: hidden;
|
|
66
|
+
clip: rect(0, 0, 0, 0);
|
|
67
|
+
white-space: nowrap;
|
|
68
|
+
border: 0;
|
|
42
69
|
}
|
|
43
70
|
}
|
|
44
71
|
|
|
@@ -96,7 +123,7 @@
|
|
|
96
123
|
.wr-sortable-list .cdk-drag-placeholder {
|
|
97
124
|
opacity: 0.35;
|
|
98
125
|
// Subtle dashed outline so users see where the item came from.
|
|
99
|
-
background:
|
|
126
|
+
background: var(--wr-color-fill-strong);
|
|
100
127
|
border-radius: var(--wr-border-radius-base);
|
|
101
128
|
outline: 1px dashed rgba(var(--wr-color-on-surface-rgb), 0.25);
|
|
102
129
|
outline-offset: -1px;
|