ngwr 14.7.0 → 14.9.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 +66 -332
- package/alert/styles/_index.scss +10 -0
- package/avatar/styles/_index.scss +18 -7
- package/badge/styles/_index.scss +7 -0
- package/badge/styles/_tag.scss +7 -1
- package/bar-chart/styles/_index.scss +1 -0
- package/button/styles/_index.scss +6 -0
- package/calendar-heatmap/styles/_index.scss +1 -0
- package/cascader/styles/_rules.scss +87 -15
- package/checkbox/styles/_index.scss +4 -0
- package/command-palette/styles/_index.scss +1 -1
- package/date-picker/styles/_index.scss +30 -0
- package/density/styles/_index.scss +4 -2
- package/divider/styles/_index.scss +2 -0
- package/donut-chart/styles/_index.scss +10 -0
- package/dropdown/styles/_index.scss +67 -5
- package/editor/styles/_index.scss +441 -0
- package/event-calendar/styles/_index.scss +209 -35
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -1
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs.map +1 -1
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs.map +1 -1
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs.map +1 -1
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs.map +1 -1
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs.map +1 -1
- package/fesm2022/ngwr-badge.mjs +28 -13
- package/fesm2022/ngwr-badge.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +31 -6
- package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow.mjs +3 -3
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-burger.mjs.map +1 -1
- package/fesm2022/ngwr-button-testing.mjs.map +1 -1
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +61 -6
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +3 -3
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +9 -9
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +4 -4
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +18 -8
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +3 -3
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-click-spark.mjs +3 -3
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-clipboard.mjs.map +1 -1
- package/fesm2022/ngwr-collapse-testing.mjs.map +1 -1
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-collapse.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +6 -6
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +3 -3
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-compare.mjs.map +1 -1
- package/fesm2022/ngwr-confetti.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs.map +1 -1
- package/fesm2022/ngwr-config.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +12 -12
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-cookie.mjs.map +1 -1
- package/fesm2022/ngwr-counter.mjs +6 -6
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +721 -62
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-date.mjs +3 -3
- package/fesm2022/ngwr-date.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-density.mjs.map +1 -1
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs.map +1 -1
- package/fesm2022/ngwr-dialog-testing.mjs.map +1 -1
- package/fesm2022/ngwr-dialog.mjs +15 -15
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-directives.mjs.map +1 -1
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-divider.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart.mjs +48 -6
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +6 -6
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +18 -18
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +174 -25
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-editor-testing.mjs +568 -0
- package/fesm2022/ngwr-editor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-editor.mjs +2601 -0
- package/fesm2022/ngwr-editor.mjs.map +1 -0
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-empty.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar.mjs +14 -7
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text.mjs +3 -3
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-file-upload.mjs.map +1 -1
- package/fesm2022/ngwr-form-testing.mjs.map +1 -1
- package/fesm2022/ngwr-form.mjs +61 -10
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +35 -6
- package/fesm2022/ngwr-gauge.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +3 -3
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text.mjs +3 -3
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-graph-testing.mjs.map +1 -1
- package/fesm2022/ngwr-graph.mjs +6 -6
- package/fesm2022/ngwr-graph.mjs.map +1 -1
- package/fesm2022/ngwr-hotkey.mjs +6 -6
- package/fesm2022/ngwr-hotkey.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ar.mjs +31 -0
- package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-cs.mjs +31 -0
- package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-de.mjs +31 -0
- package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +39 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-es.mjs +31 -0
- package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-fr.mjs +31 -0
- package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-he.mjs +31 -0
- package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-hi.mjs +31 -0
- package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-id.mjs +31 -0
- package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-it.mjs +31 -0
- package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ja.mjs +31 -0
- package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ko.mjs +31 -0
- package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-nl.mjs +31 -0
- package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pl.mjs +31 -0
- package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pt.mjs +31 -0
- package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +31 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-sv.mjs +31 -0
- package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-tr.mjs +31 -0
- package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-uk.mjs +31 -0
- package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-vi.mjs +31 -0
- package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh-TW.mjs +31 -0
- package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh.mjs +31 -0
- package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
- package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-icon.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +15 -3
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +3 -3
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-keyboard.mjs.map +1 -1
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-layout.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox.mjs +3 -3
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +18 -7
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +6 -6
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +6 -6
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-markdown-testing.mjs.map +1 -1
- package/fesm2022/ngwr-markdown.mjs +798 -17
- package/fesm2022/ngwr-markdown.mjs.map +1 -1
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -1
- package/fesm2022/ngwr-marquee.mjs +3 -3
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-media.mjs.map +1 -1
- package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
- package/fesm2022/ngwr-mention.mjs +6 -6
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meta.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group-testing.mjs +7 -3
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +26 -6
- package/fesm2022/ngwr-meter-group.mjs.map +1 -1
- package/fesm2022/ngwr-overlay.mjs +6 -6
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +13 -5
- package/fesm2022/ngwr-page-header.mjs.map +1 -1
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-pipes.mjs.map +1 -1
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-platform.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +578 -16
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-progress.mjs.map +1 -1
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
- package/fesm2022/ngwr-qr.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio-testing.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-radio.mjs.map +1 -1
- package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-schema-form.mjs +3 -3
- package/fesm2022/ngwr-schema-form.mjs.map +1 -1
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select-testing.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +12 -12
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +6 -6
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +10 -3
- package/fesm2022/ngwr-sidebar.mjs.map +1 -1
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs.map +1 -1
- package/fesm2022/ngwr-slider-testing.mjs.map +1 -1
- package/fesm2022/ngwr-slider.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +84 -10
- package/fesm2022/ngwr-sparkline.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-split-text.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card.mjs +6 -6
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-squircle.mjs.map +1 -1
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +3 -3
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-stepper.mjs.map +1 -1
- package/fesm2022/ngwr-storage.mjs +3 -3
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch-testing.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-switch.mjs.map +1 -1
- package/fesm2022/ngwr-table-testing.mjs.map +1 -1
- package/fesm2022/ngwr-table.mjs +18 -18
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-router.mjs +3 -3
- package/fesm2022/ngwr-tabs-router.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +6 -6
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea-testing.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card.mjs +6 -6
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-timeline.mjs.map +1 -1
- package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
- package/fesm2022/ngwr-toast.mjs +9 -9
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +10 -3
- package/fesm2022/ngwr-toolbar.mjs.map +1 -1
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tour.mjs +6 -6
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer-testing.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-transfer.mjs.map +1 -1
- package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter.mjs +3 -3
- package/fesm2022/ngwr-typewriter.mjs.map +1 -1
- package/fesm2022/ngwr-typography.mjs +7 -3
- package/fesm2022/ngwr-typography.mjs.map +1 -1
- package/fesm2022/ngwr-utils.mjs.map +1 -1
- package/fesm2022/ngwr-validators.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 +3 -3
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -1
- package/fesm2022/ngwr-waves.mjs +3 -3
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window-testing.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +12 -12
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/form/styles/_index.scss +16 -1
- package/gauge/styles/_index.scss +1 -0
- package/i18n/ar.json +32 -1
- package/i18n/cs.json +32 -1
- package/i18n/de.json +32 -1
- package/i18n/en.json +32 -1
- package/i18n/es.json +32 -1
- package/i18n/fr.json +32 -1
- package/i18n/he.json +32 -1
- package/i18n/hi.json +32 -1
- package/i18n/id.json +32 -1
- package/i18n/it.json +32 -1
- package/i18n/ja.json +32 -1
- package/i18n/ko.json +32 -1
- package/i18n/nl.json +32 -1
- package/i18n/pl.json +32 -1
- package/i18n/pt.json +32 -1
- package/i18n/ru.json +32 -1
- package/i18n/sv.json +32 -1
- package/i18n/tr.json +32 -1
- package/i18n/uk.json +32 -1
- package/i18n/vi.json +32 -1
- package/i18n/zh-TW.json +32 -1
- package/i18n/zh.json +32 -1
- package/input/styles/_index.scss +24 -1
- package/input-number/styles/_index.scss +69 -0
- package/input-otp/styles/_index.scss +5 -5
- package/line-chart/styles/_index.scss +30 -2
- package/llms-full.txt +14 -4
- package/llms.txt +188 -132
- package/mcp/providers.js +2 -2
- package/mcp/server.js +1 -1
- package/meter-group/styles/_index.scss +1 -0
- package/overlay/styles/_arrow.scss +30 -2
- package/package.json +43 -2
- package/page-header/styles/_index.scss +37 -1
- package/pagination/styles/_index.scss +9 -5
- package/popover/styles/_index.scss +73 -5
- package/progress/styles/_index.scss +4 -0
- package/radio/styles/_index.scss +4 -1
- package/schematics/use/symbol-map.json +1 -0
- package/select/styles/_index.scss +51 -12
- package/sidebar/styles/_index.scss +44 -2
- package/skeleton/styles/_index.scss +3 -0
- package/skills/ngwr/SKILL.md +5 -5
- package/skills/ngwr/references/catalog.md +2 -0
- package/skills/ngwr/references/setup.md +3 -3
- package/sparkline/styles/_index.scss +19 -0
- package/styles.scss +1 -0
- package/table/styles/_index.scss +7 -0
- package/textarea/styles/_index.scss +12 -3
- package/theme/styles/_colors.scss +39 -13
- package/theme/styles/_contrast.scss +9 -7
- package/toast/styles/_index.scss +4 -0
- package/toolbar/styles/_index.scss +35 -1
- package/tree/styles/_index.scss +46 -7
- package/types/ngwr-badge.d.ts +22 -7
- package/types/ngwr-bar-chart.d.ts +19 -1
- package/types/ngwr-calendar-heatmap.d.ts +29 -1
- package/types/ngwr-checkbox.d.ts +2 -0
- package/types/ngwr-config.d.ts +12 -0
- package/types/ngwr-date-picker.d.ts +308 -43
- package/types/ngwr-donut-chart.d.ts +24 -1
- package/types/ngwr-dropdown.d.ts +22 -2
- package/types/ngwr-editor-testing.d.ts +378 -0
- package/types/ngwr-editor.d.ts +449 -0
- package/types/ngwr-event-calendar.d.ts +8 -0
- package/types/ngwr-form.d.ts +35 -5
- package/types/ngwr-gauge.d.ts +20 -1
- package/types/ngwr-input-number.d.ts +7 -0
- package/types/ngwr-line-chart.d.ts +9 -1
- package/types/ngwr-markdown.d.ts +61 -2
- package/types/ngwr-meter-group-testing.d.ts +3 -2
- package/types/ngwr-meter-group.d.ts +14 -1
- package/types/ngwr-page-header.d.ts +10 -2
- package/types/ngwr-popover.d.ts +154 -3
- package/types/ngwr-sidebar.d.ts +7 -0
- package/types/ngwr-sparkline.d.ts +43 -1
- package/types/ngwr-toolbar.d.ts +7 -0
- package/types/ngwr-typography.d.ts +4 -0
- package/types/ngwr-version.d.ts +1 -1
- package/typography/styles/_index.scss +16 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-counter.mjs","sources":["../../../projects/lib/counter/easing.ts","../../../projects/lib/counter/counter.ts","../../../projects/lib/counter/counter.html","../../../projects/lib/counter/count-up.ts","../../../projects/lib/counter/ngwr-counter.ts"],"sourcesContent":["/** Cubic ease-out — the shared tween curve for counter / count-up. */\nexport function easeOutCubic(t: number): number {\n return 1 - Math.pow(1 - t, 3);\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n LOCALE_ID,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\n\nimport { easeOutCubic } from './easing';\nimport type { WrCounterMode } from './interfaces';\n\n/** Visual cell in odometer mode — either a 0-9 column or a static glyph. */\ntype Cell = { readonly kind: 'digit'; readonly fraction: number } | { readonly kind: 'static'; readonly char: string };\n\n/**\n * Animated number display with two modes:\n *\n * - **`odometer`** (default) — each digit is a vertical strip of 0-9 that\n * rolls into place, continuously interpolated for smooth motion when the\n * value changes.\n * - **`tween`** — a single eased count-up between the previous and new value,\n * rendered through `Intl.NumberFormat`.\n *\n * Reacts to `[value]` changes — animate from any number to any number.\n *\n * @example\n * ```html\n * <wr-counter [value]=\"123456\" mode=\"odometer\" />\n * <wr-counter [value]=\"9.99\" mode=\"tween\" [decimals]=\"2\" prefix=\"$\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/counter\n */\n@Component({\n selector: 'wr-counter',\n templateUrl: './counter.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-counter' },\n})\nexport class WrCounter {\n /** Target value. */\n /**\n * The number to show. Coerced like every other numeric input here — it was the only one\n * without it, and `Intl.NumberFormat().format(NaN)` renders the literal text `NaN`.\n */\n readonly value = input.required<number, unknown>({\n transform: (v: unknown): number => coerceNumberProperty(v, 0),\n });\n\n /** Animation mode. @default 'odometer' */\n readonly mode = input<WrCounterMode>('odometer');\n\n /** Duration (ms). @default 900 */\n readonly duration = input(900, {\n transform: (v: unknown): number => Math.max(100, coerceNumberProperty(v, 900)),\n });\n\n /** Fixed number of decimals. @default 0 */\n readonly decimals = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /** Optional prefix (e.g. `'$'`). */\n readonly prefix = input<string>('');\n\n /** Optional suffix (e.g. `'%'`). */\n readonly suffix = input<string>('');\n\n /** Group thousands. @default true */\n readonly grouping = input<boolean>(true);\n\n /** Pad integer part to at least this many digits. @default 0 (no padding) */\n readonly minIntegerDigits = input(0, {\n transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)),\n });\n\n private readonly current = signal<number>(0);\n private readonly locale = inject(LOCALE_ID);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly platform = inject(WrPlatform);\n private rafId: number | null = null;\n\n /** Tween-mode formatted output. */\n protected readonly tweenText = computed(() => this.format(this.current()));\n\n /**\n * Odometer-mode text for assistive tech and prerendered output. The strip\n * renders every digit 0-9 per column and picks one with a transform, so its\n * markup carries no usable text — screen readers would announce all ten, and\n * static HTML would ship the same noise. This node holds the real value.\n */\n protected readonly odoText = computed(() => `${this.prefix()}${this.format(this.value())}${this.suffix()}`);\n\n /** Odometer cells — one per character in the formatted target string. */\n protected readonly cells = computed<readonly Cell[]>(() => {\n // Build the string with target sign + max length so we can interpolate\n // each digit position smoothly.\n const target = this.value();\n const live = this.current();\n const formattedTarget = this.format(target);\n const formattedLive = this.format(live);\n\n // Right-align so trailing digits line up.\n const maxLen = Math.max(formattedTarget.length, formattedLive.length);\n const padTarget = formattedTarget.padStart(maxLen, ' ');\n const padLive = formattedLive.padStart(maxLen, ' ');\n\n const cells: Cell[] = [];\n for (let i = 0; i < maxLen; i++) {\n const t = padTarget[i];\n const l = padLive[i];\n if (/[0-9]/.test(t) && /[0-9]/.test(l)) {\n // Interpolate the fractional digit so the strip rolls smoothly —\n // multi-digit rollover (9 → 0 carries 1) looks continuous.\n const fraction = this.digitFractionAt(live, target, i, maxLen);\n cells.push({ kind: 'digit', fraction });\n } else {\n cells.push({ kind: 'static', char: t === ' ' ? '' : t });\n }\n }\n return cells;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.cancel());\n\n effect(() => {\n const target = this.value();\n // Snapshot the current value WITHOUT tracking it — the RAF tick below\n // writes `current` every frame, and tracking it here would re-trigger\n // this effect each frame, cancelling + restarting the tween endlessly\n // (the wheels hang mid-roll and only snap once the restarts converge).\n const start = untracked(() => this.current());\n // Straight to the answer when there is nothing to animate for: no browser, or a\n // reader who asked for less motion. `wr-scroll` already falls back the same way, and a\n // component whose entire purpose is a count-up should be the first to honour it.\n if (!this.isBrowser || this.platform.prefersReducedMotion()) {\n this.current.set(target);\n return;\n }\n this.cancel();\n const startTs = performance.now();\n const dur = this.duration();\n const tick = (now: number): void => {\n const t = Math.min(1, (now - startTs) / dur);\n // Snap exactly to target on the final frame. Without this,\n // `start + (target - start) * 1` carries FP rounding (e.g.\n // 0.1 + (0.3 - 0.1) * 1 = 0.30000000000000004), so\n // `digitFractionAt`'s `live === target` rest-state check\n // fails — wheels visibly stop on a fractional position and\n // never settle to the clean integer glyph.\n const v = t >= 1 ? target : start + (target - start) * easeOutCubic(t);\n this.current.set(v);\n if (t < 1) this.rafId = requestAnimationFrame(tick);\n else this.rafId = null;\n };\n this.rafId = requestAnimationFrame(tick);\n });\n }\n\n private cancel(): void {\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n private format(n: number): string {\n return new Intl.NumberFormat(this.locale, {\n minimumFractionDigits: this.decimals(),\n maximumFractionDigits: this.decimals(),\n minimumIntegerDigits: this.minIntegerDigits() || 1,\n useGrouping: this.grouping(),\n }).format(n);\n }\n\n /**\n * Compute the smoothly-interpolated digit (0..10) at column `i` of the\n * formatted live string. Returns the integer digit + a fraction so the\n * strip CSS translate looks like a real rolling odometer.\n */\n private digitFractionAt(live: number, target: number, columnIndex: number, totalLen: number): number {\n // Determine the place value at this column. Account for grouping separators\n // and the decimal point by counting digits to the right of this column in\n // the formatted target.\n const formattedTarget = this.format(target);\n const padded = formattedTarget.padStart(totalLen, ' ');\n const tail = padded.slice(columnIndex + 1);\n const digitsRight = (tail.match(/[0-9]/g) ?? []).length;\n const placePower = digitsRight - this.decimals();\n const place = Math.pow(10, placePower);\n const absLive = Math.abs(live);\n const raw = absLive / place;\n // Modulo 10 gives the digit at this column with fractional rollover —\n // mid-animation this looks like a real wheel rolling between digits.\n const mod = raw - Math.floor(raw / 10) * 10;\n // At rest (live === target) every wheel must rest on an exact integer\n // — otherwise upper digits show as partial (e.g. tens reads \"5.6\"\n // for value 123456, visibly clipping between 5 and 6 in the\n // overflow:hidden window). The continuous-mechanical look is only\n // wanted DURING the tween, not after it settles.\n if (live === target) return Math.floor(mod + 1e-9);\n return mod;\n }\n}\n","@if (mode() === 'tween') {\n <span class=\"wr-counter__tween\">{{ prefix() }}{{ tweenText() }}{{ suffix() }}</span>\n} @else {\n <span class=\"wr-counter__sr-only\">{{ odoText() }}</span>\n <span class=\"wr-counter__odo\" aria-hidden=\"true\">\n @if (prefix()) {\n <span class=\"wr-counter__static\">{{ prefix() }}</span>\n }\n @for (cell of cells(); track $index) {\n @if (cell.kind === 'digit') {\n <span class=\"wr-counter__digit\">\n <span class=\"wr-counter__strip\" [style.transform]=\"`translateY(-${cell.fraction}em)`\">\n <span>0</span><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span\n ><span>7</span><span>8</span><span>9</span>\n </span>\n </span>\n } @else {\n <span class=\"wr-counter__static\">{{ cell.char }}</span>\n }\n }\n @if (suffix()) {\n <span class=\"wr-counter__static\">{{ suffix() }}</span>\n }\n </span>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n *\n * The spring-physics path is an adaptation of the CountUp effect by\n * David Haz / reactbits.dev (https://www.reactbits.dev/text-animations/count-up).\n * Same critically-damped formula, implemented inline with rAF — no\n * external dependency.\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n LOCALE_ID,\n PLATFORM_ID,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\nimport { numAttr } from 'ngwr/utils';\n\nimport { easeOutCubic } from './easing';\nimport type { WrCountUpDirection, WrCountUpEasing, WrCountUpTrigger } from './interfaces';\n\n/**\n * Animated number tick. Animates from `from` to the current `to`, formatting\n * via `Intl.NumberFormat`. Re-runs whenever `to` changes.\n *\n * @example Basic\n * ```html\n * <wr-count-up [to]=\"12345\" />\n * <wr-count-up [to]=\"9.99\" [decimals]=\"2\" prefix=\"$\" />\n * ```\n *\n * @example Reactbits-style — spring curve + viewport trigger\n * ```html\n * <wr-count-up [to]=\"100\" easing=\"spring\" trigger=\"visible\" [delay]=\"200\" />\n * ```\n *\n * @example Count down\n * ```html\n * <wr-count-up [from]=\"60\" [to]=\"0\" direction=\"down\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/counter\n */\n@Component({\n selector: 'wr-count-up',\n template: `{{ prefix() }}{{ formatted() }}{{ suffix() }}`,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-count-up' },\n})\nexport class WrCountUp {\n /** Starting value. @default 0 */\n readonly from = input(0, { transform: numAttr(0) });\n\n /** Target value. */\n readonly to = input.required<number>();\n\n /**\n * Animation duration. Units depend on `easing`:\n *\n * - `ease-out` — milliseconds (default 1200, min 100)\n * - `spring` — seconds (tunes spring stiffness; default 2)\n */\n readonly duration = input(1200, { transform: numAttr(1200) });\n\n /** Optional delay (ms) before the animation starts. @default 0 */\n readonly delay = input(0, { transform: numAttr(0) });\n\n /** Animation curve. @default 'ease-out' */\n readonly easing = input<WrCountUpEasing>('ease-out');\n\n /**\n * When to start the animation.\n *\n * - `'mount'` (default) — start as soon as the component is rendered.\n * - `'visible'` — wait for the host to enter the viewport\n * (IntersectionObserver). Useful for long pages or hero numbers\n * below the fold.\n */\n readonly trigger = input<WrCountUpTrigger>('mount');\n\n /** Counting direction. `'down'` swaps `from` ↔ `to`. @default 'up' */\n readonly direction = input<WrCountUpDirection>('up');\n\n /** Fixed number of decimals. @default 0 */\n readonly decimals = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /** Optional prefix (e.g. `'$'`). */\n readonly prefix = input<string>('');\n\n /** Optional suffix (e.g. `'%'`). */\n readonly suffix = input<string>('');\n\n /** Disable grouping separators (`1,234` → `1234`). @default true (grouping on) */\n readonly grouping = input<boolean>(true);\n\n /** Emits when the animation begins. */\n readonly started = output<void>();\n\n /** Emits when the animation settles. */\n readonly completed = output<void>();\n\n private readonly value = signal<number>(0);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly locale = inject(LOCALE_ID);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly platform = inject(WrPlatform);\n private readonly destroyRef = inject(DestroyRef);\n\n private rafId: number | null = null;\n private delayTimer: ReturnType<typeof setTimeout> | undefined;\n private observer: IntersectionObserver | null = null;\n private hasFiredForVisible = false;\n\n protected readonly formatted = computed(() => {\n return new Intl.NumberFormat(this.locale, {\n minimumFractionDigits: this.decimals(),\n maximumFractionDigits: this.decimals(),\n useGrouping: this.grouping(),\n }).format(this.value());\n });\n\n constructor() {\n if (!this.isBrowser) {\n // SSR: settle on the value the animation ENDS on. Seeding the start\n // instead would bake the placeholder (usually 0) into prerendered HTML,\n // so readers and crawlers would get 0 rather than the real figure. The\n // browser rewinds to the start and animates once it boots.\n effect(() => this.value.set(this.direction() === 'down' ? this.from() : this.to()));\n return;\n }\n\n // Seed the resting value so first paint shows the start, not 0 — except for a reader\n // who asked for less motion, who is seeded on the value the animation ENDS on, the\n // same way the server branch above is. Seeding the start for them would leave the\n // placeholder on screen, and with `trigger=\"visible\"` it would stay there until the\n // host scrolls into view and then never be animated off it.\n effect(() => {\n const down = this.direction() === 'down';\n const start = down ? this.to() : this.from();\n const end = down ? this.from() : this.to();\n this.value.set(this.platform.prefersReducedMotion() ? end : start);\n });\n\n // Run the animation whenever the `to` target changes (or on first mount).\n // For `trigger=\"visible\"` the first run waits for the IntersectionObserver\n // to fire; subsequent `to` changes re-run immediately.\n effect(() => {\n // Establish dependencies so the effect re-runs on `to` changes.\n this.to();\n this.from();\n this.direction();\n this.duration();\n this.easing();\n this.delay();\n\n if (this.trigger() === 'visible' && !this.hasFiredForVisible) return;\n this.scheduleRun();\n });\n\n afterNextRender(() => {\n if (this.trigger() === 'visible') this.setupViewportTrigger();\n });\n\n this.destroyRef.onDestroy(() => {\n this.cancel();\n // `cancel()` only stops timers and the rAF loop. The IntersectionObserver\n // disconnects itself from inside its callback, which never fires if the\n // host is destroyed before it ever scrolls into view — so it would keep\n // observing a detached element for the life of the page.\n this.observer?.disconnect();\n this.observer = null;\n });\n }\n\n // Scheduling\n\n private setupViewportTrigger(): void {\n this.observer = new IntersectionObserver(\n (entries, obs) => {\n for (const e of entries) {\n if (e.isIntersecting && !this.hasFiredForVisible) {\n obs.disconnect();\n this.hasFiredForVisible = true;\n this.scheduleRun();\n break;\n }\n }\n },\n { threshold: 0, rootMargin: '0px' }\n );\n this.observer.observe(this.host.nativeElement);\n }\n\n private scheduleRun(): void {\n this.cancel();\n const d = this.delay();\n if (d > 0) {\n this.delayTimer = setTimeout(() => this.run(), d);\n } else {\n this.run();\n }\n }\n\n private run(): void {\n const start = this.direction() === 'down' ? this.to() : this.from();\n const end = this.direction() === 'down' ? this.from() : this.to();\n this.started.emit();\n // Straight to the answer for a reader who asked for less motion — `wr-counter` in this\n // same folder already does this, and a component whose entire purpose is a count-up\n // should not be the one that ignores it. Both outputs still fire, in order, so a\n // consumer wired to `completed` is not left waiting on a tween that never ran.\n if (this.platform.prefersReducedMotion()) {\n this.value.set(end);\n this.completed.emit();\n return;\n }\n if (this.easing() === 'spring') this.tweenSpring(start, end);\n else this.tweenEaseOut(start, end);\n }\n\n // Tweens\n\n private tweenEaseOut(start: number, target: number): void {\n const duration = Math.max(100, this.duration());\n const startTs = performance.now();\n const tick = (now: number): void => {\n const t = Math.min(1, (now - startTs) / duration);\n const v = start + (target - start) * easeOutCubic(t);\n this.value.set(v);\n if (t < 1) {\n this.rafId = requestAnimationFrame(tick);\n } else {\n this.completed.emit();\n }\n };\n this.rafId = requestAnimationFrame(tick);\n }\n\n /**\n * Critically-damped spring tween. Same formula as `motion/react`'s\n * `useSpring` with mass = 1:\n *\n * damping = 20 + 40 / duration\n * stiffness = 100 / duration\n *\n * We integrate `(spring force − damping force)` each frame until both\n * displacement and velocity fall below epsilon.\n */\n private tweenSpring(start: number, target: number): void {\n const duration = Math.max(0.05, this.duration());\n const damping = 20 + 40 / duration;\n const stiffness = 100 / duration;\n let current = start;\n let velocity = 0;\n let lastTs = 0;\n const epsilon = 0.001 * Math.max(1, Math.abs(target - start));\n\n const step = (ts: number): void => {\n const dt = lastTs === 0 ? 1 / 60 : Math.min(0.05, (ts - lastTs) / 1000);\n lastTs = ts;\n\n const displacement = current - target;\n const accel = -stiffness * displacement - damping * velocity;\n velocity += accel * dt;\n current += velocity * dt;\n this.value.set(current);\n\n if (Math.abs(current - target) < epsilon && Math.abs(velocity) < epsilon * 10) {\n this.value.set(target);\n this.completed.emit();\n return;\n }\n this.rafId = requestAnimationFrame(step);\n };\n this.rafId = requestAnimationFrame(step);\n }\n\n // Cleanup\n\n private cancel(): void {\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.rafId = null;\n if (this.delayTimer !== undefined) {\n clearTimeout(this.delayTimer);\n this.delayTimer = undefined;\n }\n }\n}\n\nexport type { WrCountUpEasing, WrCountUpTrigger, WrCountUpDirection } from './interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAAA;AACM,SAAU,YAAY,CAAC,CAAS,EAAA;AACpC,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC/B;;ACHA;;;;;AAKG;AA0BH;;;;;;;;;;;;;;;;;;AAkBG;MAOU,SAAS,CAAA;;AAEpB;;;AAGG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,OAAA,EAAA,8BAAA,EAAA,CAAA,EAC7B,SAAS,EAAE,CAAC,CAAU,KAAa,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7D;;IAGO,IAAI,GAAG,KAAK,CAAgB,UAAU;6EAAC;;IAGvC,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAC3B,SAAS,EAAE,CAAC,CAAU,KAAa,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAA,CAC9E;;IAGO,QAAQ,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAA,CAAG;;IAGnG,MAAM,GAAG,KAAK,CAAS,EAAE;+EAAC;;IAG1B,MAAM,GAAG,KAAK,CAAS,EAAE;+EAAC;;IAG1B,QAAQ,GAAG,KAAK,CAAU,IAAI;iFAAC;;IAG/B,gBAAgB,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,8BAAA,EAAA,CAAA,EACjC,SAAS,EAAE,CAAC,CAAU,KAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAA,CAC1E;IAEe,OAAO,GAAG,MAAM,CAAS,CAAC;gFAAC;AAC3B,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;IAC1B,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,KAAK,GAAkB,IAAI;;AAGhB,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;kFAAC;AAE1E;;;;;AAKG;IACgB,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE;gFAAC;;AAGxF,IAAA,KAAK,GAAG,QAAQ,CAAkB,MAAK;;;AAGxD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;;AAGvC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;QACrE,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;QACvD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;QAEnD,MAAM,KAAK,GAAW,EAAE;AACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,YAAA,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;AACtB,YAAA,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AACpB,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;;;AAGtC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC;gBAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YACzC;iBAAO;gBACL,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1D;QACF;AACA,QAAA,OAAO,KAAK;IACd,CAAC;8EAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEjD,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;;;;;AAK3B,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;;;;AAI7C,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE;AAC3D,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxB;YACF;YACA,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;AACjC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,YAAA,MAAM,IAAI,GAAG,CAAC,GAAW,KAAU;AACjC,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,OAAO,IAAI,GAAG,CAAC;;;;;;;gBAO5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;AACtE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC;AAAE,oBAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;;AAC9C,oBAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACxB,YAAA,CAAC;AACD,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAC1C,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AACzD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;AAEQ,IAAA,MAAM,CAAC,CAAS,EAAA;QACtB,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;AACxC,YAAA,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE;AACtC,YAAA,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE;AACtC,YAAA,oBAAoB,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAClD,YAAA,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC7B,SAAA,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACd;AAEA;;;;AAIG;AACK,IAAA,eAAe,CAAC,IAAY,EAAE,MAAc,EAAE,WAAmB,EAAE,QAAgB,EAAA;;;;QAIzF,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;AAC1C,QAAA,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM;QACvD,MAAM,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK;;;AAG3B,QAAA,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE;;;;;;QAM3C,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;AAClD,QAAA,OAAO,GAAG;IACZ;uGAhKW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,wnCCxDtB,q9BAyBA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FD+Ba,SAAS,EAAA,UAAA,EAAA,CAAA;kBANrB,SAAS;+BACE,YAAY,EAAA,aAAA,EAEP,iBAAiB,CAAC,IAAI,QAC/B,EAAE,KAAK,EAAE,YAAY,EAAE,EAAA,QAAA,EAAA,q9BAAA,EAAA;;;AEtD/B;;;;;;;;;;AAUG;AA0BH;;;;;;;;;;;;;;;;;;;;;AAqBG;MAOU,SAAS,CAAA;;AAEX,IAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAA,CAAG;;IAG1C,EAAE,GAAG,KAAK,CAAC,QAAQ;2EAAU;AAEtC;;;;;AAKG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,EAAA,CAAG;;AAGpD,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,OAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAA,CAAG;;IAG3C,MAAM,GAAG,KAAK,CAAkB,UAAU;+EAAC;AAEpD;;;;;;;AAOG;IACM,OAAO,GAAG,KAAK,CAAmB,OAAO;gFAAC;;IAG1C,SAAS,GAAG,KAAK,CAAqB,IAAI;kFAAC;;IAG3C,QAAQ,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAA,CAAG;;IAGnG,MAAM,GAAG,KAAK,CAAS,EAAE;+EAAC;;IAG1B,MAAM,GAAG,KAAK,CAAS,EAAE;+EAAC;;IAG1B,QAAQ,GAAG,KAAK,CAAU,IAAI;iFAAC;;IAG/B,OAAO,GAAG,MAAM,EAAQ;;IAGxB,SAAS,GAAG,MAAM,EAAQ;IAElB,KAAK,GAAG,MAAM,CAAS,CAAC;8EAAC;AACzB,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;IAC1B,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AAC7B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAExC,KAAK,GAAkB,IAAI;AAC3B,IAAA,UAAU;IACV,QAAQ,GAAgC,IAAI;IAC5C,kBAAkB,GAAG,KAAK;AAEf,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QAC3C,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;AACxC,YAAA,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE;AACtC,YAAA,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE;AACtC,YAAA,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;kFAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;;;;;AAKnB,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF;QACF;;;;;;QAOA,MAAM,CAAC,MAAK;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,MAAM;AACxC,YAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5C,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;YAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AACpE,QAAA,CAAC,CAAC;;;;QAKF,MAAM,CAAC,MAAK;;YAEV,IAAI,CAAC,EAAE,EAAE;YACT,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,KAAK,EAAE;YAEZ,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,kBAAkB;gBAAE;YAC9D,IAAI,CAAC,WAAW,EAAE;AACpB,QAAA,CAAC,CAAC;QAEF,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS;gBAAE,IAAI,CAAC,oBAAoB,EAAE;AAC/D,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,MAAM,EAAE;;;;;AAKb,YAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;AAC3B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACtB,QAAA,CAAC,CAAC;IACJ;;IAIQ,oBAAoB,GAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CACtC,CAAC,OAAO,EAAE,GAAG,KAAI;AACf,YAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;gBACvB,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAChD,GAAG,CAAC,UAAU,EAAE;AAChB,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;oBAC9B,IAAI,CAAC,WAAW,EAAE;oBAClB;gBACF;YACF;QACF,CAAC,EACD,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CACpC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAChD;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,MAAM,EAAE;AACb,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,EAAE;AACT,YAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnD;aAAO;YACL,IAAI,CAAC,GAAG,EAAE;QACZ;IACF;IAEQ,GAAG,GAAA;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;AACjE,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;;;;AAKnB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE;AACxC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACrB;QACF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,QAAQ;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC;;AACvD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC;IACpC;;IAIQ,YAAY,CAAC,KAAa,EAAE,MAAc,EAAA;AAChD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC/C,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,CAAC,GAAW,KAAU;AACjC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,OAAO,IAAI,QAAQ,CAAC;AACjD,YAAA,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACjB,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE;AACT,gBAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;YAC1C;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACvB;AACF,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;IAC1C;AAEA;;;;;;;;;AASG;IACK,WAAW,CAAC,KAAa,EAAE,MAAc,EAAA;AAC/C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChD,QAAA,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ;AAClC,QAAA,MAAM,SAAS,GAAG,GAAG,GAAG,QAAQ;QAChC,IAAI,OAAO,GAAG,KAAK;QACnB,IAAI,QAAQ,GAAG,CAAC;QAChB,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AAE7D,QAAA,MAAM,IAAI,GAAG,CAAC,EAAU,KAAU;AAChC,YAAA,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC;YACvE,MAAM,GAAG,EAAE;AAEX,YAAA,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM;YACrC,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ;AAC5D,YAAA,QAAQ,IAAI,KAAK,GAAG,EAAE;AACtB,YAAA,OAAO,IAAI,QAAQ,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;YAEvB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,EAAE,EAAE;AAC7E,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACtB,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBACrB;YACF;AACA,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAC1C,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;IAC1C;;IAIQ,MAAM,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AACzD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC7B;IACF;uGA7OW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,sgDAJV,CAAA,6CAAA,CAA+C,EAAA,QAAA,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAI9C,SAAS,EAAA,UAAA,EAAA,CAAA;kBANrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,QAAQ,EAAE,CAAA,6CAAA,CAA+C;oBACzD,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;AAC/B,iBAAA;;;AC/DD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ngwr-counter.mjs","sources":["../../../projects/lib/counter/easing.ts","../../../projects/lib/counter/counter.ts","../../../projects/lib/counter/counter.html","../../../projects/lib/counter/count-up.ts","../../../projects/lib/counter/ngwr-counter.ts"],"sourcesContent":["/** Cubic ease-out — the shared tween curve for counter / count-up. */\nexport function easeOutCubic(t: number): number {\n return 1 - Math.pow(1 - t, 3);\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n LOCALE_ID,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\n\nimport { easeOutCubic } from './easing';\nimport type { WrCounterMode } from './interfaces';\n\n/** Visual cell in odometer mode — either a 0-9 column or a static glyph. */\ntype Cell = { readonly kind: 'digit'; readonly fraction: number } | { readonly kind: 'static'; readonly char: string };\n\n/**\n * Animated number display with two modes:\n *\n * - **`odometer`** (default) — each digit is a vertical strip of 0-9 that\n * rolls into place, continuously interpolated for smooth motion when the\n * value changes.\n * - **`tween`** — a single eased count-up between the previous and new value,\n * rendered through `Intl.NumberFormat`.\n *\n * Reacts to `[value]` changes — animate from any number to any number.\n *\n * @example\n * ```html\n * <wr-counter [value]=\"123456\" mode=\"odometer\" />\n * <wr-counter [value]=\"9.99\" mode=\"tween\" [decimals]=\"2\" prefix=\"$\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/counter\n */\n@Component({\n selector: 'wr-counter',\n templateUrl: './counter.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-counter' },\n})\nexport class WrCounter {\n /** Target value. */\n /**\n * The number to show. Coerced like every other numeric input here — it was the only one\n * without it, and `Intl.NumberFormat().format(NaN)` renders the literal text `NaN`.\n */\n readonly value = input.required<number, unknown>({\n transform: (v: unknown): number => coerceNumberProperty(v, 0),\n });\n\n /** Animation mode. @default 'odometer' */\n readonly mode = input<WrCounterMode>('odometer');\n\n /** Duration (ms). @default 900 */\n readonly duration = input(900, {\n transform: (v: unknown): number => Math.max(100, coerceNumberProperty(v, 900)),\n });\n\n /** Fixed number of decimals. @default 0 */\n readonly decimals = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /** Optional prefix (e.g. `'$'`). */\n readonly prefix = input<string>('');\n\n /** Optional suffix (e.g. `'%'`). */\n readonly suffix = input<string>('');\n\n /** Group thousands. @default true */\n readonly grouping = input<boolean>(true);\n\n /** Pad integer part to at least this many digits. @default 0 (no padding) */\n readonly minIntegerDigits = input(0, {\n transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)),\n });\n\n private readonly current = signal<number>(0);\n private readonly locale = inject(LOCALE_ID);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly platform = inject(WrPlatform);\n private rafId: number | null = null;\n\n /** Tween-mode formatted output. */\n protected readonly tweenText = computed(() => this.format(this.current()));\n\n /**\n * Odometer-mode text for assistive tech and prerendered output. The strip\n * renders every digit 0-9 per column and picks one with a transform, so its\n * markup carries no usable text — screen readers would announce all ten, and\n * static HTML would ship the same noise. This node holds the real value.\n */\n protected readonly odoText = computed(() => `${this.prefix()}${this.format(this.value())}${this.suffix()}`);\n\n /** Odometer cells — one per character in the formatted target string. */\n protected readonly cells = computed<readonly Cell[]>(() => {\n // Build the string with target sign + max length so we can interpolate\n // each digit position smoothly.\n const target = this.value();\n const live = this.current();\n const formattedTarget = this.format(target);\n const formattedLive = this.format(live);\n\n // Right-align so trailing digits line up.\n const maxLen = Math.max(formattedTarget.length, formattedLive.length);\n const padTarget = formattedTarget.padStart(maxLen, ' ');\n const padLive = formattedLive.padStart(maxLen, ' ');\n\n const cells: Cell[] = [];\n for (let i = 0; i < maxLen; i++) {\n const t = padTarget[i];\n const l = padLive[i];\n if (/[0-9]/.test(t) && /[0-9]/.test(l)) {\n // Interpolate the fractional digit so the strip rolls smoothly —\n // multi-digit rollover (9 → 0 carries 1) looks continuous.\n const fraction = this.digitFractionAt(live, target, i, maxLen);\n cells.push({ kind: 'digit', fraction });\n } else {\n cells.push({ kind: 'static', char: t === ' ' ? '' : t });\n }\n }\n return cells;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.cancel());\n\n effect(() => {\n const target = this.value();\n // Snapshot the current value WITHOUT tracking it — the RAF tick below\n // writes `current` every frame, and tracking it here would re-trigger\n // this effect each frame, cancelling + restarting the tween endlessly\n // (the wheels hang mid-roll and only snap once the restarts converge).\n const start = untracked(() => this.current());\n // Straight to the answer when there is nothing to animate for: no browser, or a\n // reader who asked for less motion. `wr-scroll` already falls back the same way, and a\n // component whose entire purpose is a count-up should be the first to honour it.\n if (!this.isBrowser || this.platform.prefersReducedMotion()) {\n this.current.set(target);\n return;\n }\n this.cancel();\n const startTs = performance.now();\n const dur = this.duration();\n const tick = (now: number): void => {\n const t = Math.min(1, (now - startTs) / dur);\n // Snap exactly to target on the final frame. Without this,\n // `start + (target - start) * 1` carries FP rounding (e.g.\n // 0.1 + (0.3 - 0.1) * 1 = 0.30000000000000004), so\n // `digitFractionAt`'s `live === target` rest-state check\n // fails — wheels visibly stop on a fractional position and\n // never settle to the clean integer glyph.\n const v = t >= 1 ? target : start + (target - start) * easeOutCubic(t);\n this.current.set(v);\n if (t < 1) this.rafId = requestAnimationFrame(tick);\n else this.rafId = null;\n };\n this.rafId = requestAnimationFrame(tick);\n });\n }\n\n private cancel(): void {\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n private format(n: number): string {\n return new Intl.NumberFormat(this.locale, {\n minimumFractionDigits: this.decimals(),\n maximumFractionDigits: this.decimals(),\n minimumIntegerDigits: this.minIntegerDigits() || 1,\n useGrouping: this.grouping(),\n }).format(n);\n }\n\n /**\n * Compute the smoothly-interpolated digit (0..10) at column `i` of the\n * formatted live string. Returns the integer digit + a fraction so the\n * strip CSS translate looks like a real rolling odometer.\n */\n private digitFractionAt(live: number, target: number, columnIndex: number, totalLen: number): number {\n // Determine the place value at this column. Account for grouping separators\n // and the decimal point by counting digits to the right of this column in\n // the formatted target.\n const formattedTarget = this.format(target);\n const padded = formattedTarget.padStart(totalLen, ' ');\n const tail = padded.slice(columnIndex + 1);\n const digitsRight = (tail.match(/[0-9]/g) ?? []).length;\n const placePower = digitsRight - this.decimals();\n const place = Math.pow(10, placePower);\n const absLive = Math.abs(live);\n const raw = absLive / place;\n // Modulo 10 gives the digit at this column with fractional rollover —\n // mid-animation this looks like a real wheel rolling between digits.\n const mod = raw - Math.floor(raw / 10) * 10;\n // At rest (live === target) every wheel must rest on an exact integer\n // — otherwise upper digits show as partial (e.g. tens reads \"5.6\"\n // for value 123456, visibly clipping between 5 and 6 in the\n // overflow:hidden window). The continuous-mechanical look is only\n // wanted DURING the tween, not after it settles.\n if (live === target) return Math.floor(mod + 1e-9);\n return mod;\n }\n}\n","@if (mode() === 'tween') {\n <span class=\"wr-counter__tween\">{{ prefix() }}{{ tweenText() }}{{ suffix() }}</span>\n} @else {\n <span class=\"wr-counter__sr-only\">{{ odoText() }}</span>\n <span class=\"wr-counter__odo\" aria-hidden=\"true\">\n @if (prefix()) {\n <span class=\"wr-counter__static\">{{ prefix() }}</span>\n }\n @for (cell of cells(); track $index) {\n @if (cell.kind === 'digit') {\n <span class=\"wr-counter__digit\">\n <span class=\"wr-counter__strip\" [style.transform]=\"`translateY(-${cell.fraction}em)`\">\n <span>0</span><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span\n ><span>7</span><span>8</span><span>9</span>\n </span>\n </span>\n } @else {\n <span class=\"wr-counter__static\">{{ cell.char }}</span>\n }\n }\n @if (suffix()) {\n <span class=\"wr-counter__static\">{{ suffix() }}</span>\n }\n </span>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n *\n * The spring-physics path is an adaptation of the CountUp effect by\n * David Haz / reactbits.dev (https://www.reactbits.dev/text-animations/count-up).\n * Same critically-damped formula, implemented inline with rAF — no\n * external dependency.\n */\n\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n LOCALE_ID,\n PLATFORM_ID,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\nimport { numAttr } from 'ngwr/utils';\n\nimport { easeOutCubic } from './easing';\nimport type { WrCountUpDirection, WrCountUpEasing, WrCountUpTrigger } from './interfaces';\n\n/**\n * Animated number tick. Animates from `from` to the current `to`, formatting\n * via `Intl.NumberFormat`. Re-runs whenever `to` changes.\n *\n * @example Basic\n * ```html\n * <wr-count-up [to]=\"12345\" />\n * <wr-count-up [to]=\"9.99\" [decimals]=\"2\" prefix=\"$\" />\n * ```\n *\n * @example Reactbits-style — spring curve + viewport trigger\n * ```html\n * <wr-count-up [to]=\"100\" easing=\"spring\" trigger=\"visible\" [delay]=\"200\" />\n * ```\n *\n * @example Count down\n * ```html\n * <wr-count-up [from]=\"60\" [to]=\"0\" direction=\"down\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/counter\n */\n@Component({\n selector: 'wr-count-up',\n template: `{{ prefix() }}{{ formatted() }}{{ suffix() }}`,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-count-up' },\n})\nexport class WrCountUp {\n /** Starting value. @default 0 */\n readonly from = input(0, { transform: numAttr(0) });\n\n /** Target value. */\n readonly to = input.required<number>();\n\n /**\n * Animation duration. Units depend on `easing`:\n *\n * - `ease-out` — milliseconds (default 1200, min 100)\n * - `spring` — seconds (tunes spring stiffness; default 2)\n */\n readonly duration = input(1200, { transform: numAttr(1200) });\n\n /** Optional delay (ms) before the animation starts. @default 0 */\n readonly delay = input(0, { transform: numAttr(0) });\n\n /** Animation curve. @default 'ease-out' */\n readonly easing = input<WrCountUpEasing>('ease-out');\n\n /**\n * When to start the animation.\n *\n * - `'mount'` (default) — start as soon as the component is rendered.\n * - `'visible'` — wait for the host to enter the viewport\n * (IntersectionObserver). Useful for long pages or hero numbers\n * below the fold.\n */\n readonly trigger = input<WrCountUpTrigger>('mount');\n\n /** Counting direction. `'down'` swaps `from` ↔ `to`. @default 'up' */\n readonly direction = input<WrCountUpDirection>('up');\n\n /** Fixed number of decimals. @default 0 */\n readonly decimals = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n /** Optional prefix (e.g. `'$'`). */\n readonly prefix = input<string>('');\n\n /** Optional suffix (e.g. `'%'`). */\n readonly suffix = input<string>('');\n\n /** Disable grouping separators (`1,234` → `1234`). @default true (grouping on) */\n readonly grouping = input<boolean>(true);\n\n /** Emits when the animation begins. */\n readonly started = output<void>();\n\n /** Emits when the animation settles. */\n readonly completed = output<void>();\n\n private readonly value = signal<number>(0);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly locale = inject(LOCALE_ID);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly platform = inject(WrPlatform);\n private readonly destroyRef = inject(DestroyRef);\n\n private rafId: number | null = null;\n private delayTimer: ReturnType<typeof setTimeout> | undefined;\n private observer: IntersectionObserver | null = null;\n private hasFiredForVisible = false;\n\n protected readonly formatted = computed(() => {\n return new Intl.NumberFormat(this.locale, {\n minimumFractionDigits: this.decimals(),\n maximumFractionDigits: this.decimals(),\n useGrouping: this.grouping(),\n }).format(this.value());\n });\n\n constructor() {\n if (!this.isBrowser) {\n // SSR: settle on the value the animation ENDS on. Seeding the start\n // instead would bake the placeholder (usually 0) into prerendered HTML,\n // so readers and crawlers would get 0 rather than the real figure. The\n // browser rewinds to the start and animates once it boots.\n effect(() => this.value.set(this.direction() === 'down' ? this.from() : this.to()));\n return;\n }\n\n // Seed the resting value so first paint shows the start, not 0 — except for a reader\n // who asked for less motion, who is seeded on the value the animation ENDS on, the\n // same way the server branch above is. Seeding the start for them would leave the\n // placeholder on screen, and with `trigger=\"visible\"` it would stay there until the\n // host scrolls into view and then never be animated off it.\n effect(() => {\n const down = this.direction() === 'down';\n const start = down ? this.to() : this.from();\n const end = down ? this.from() : this.to();\n this.value.set(this.platform.prefersReducedMotion() ? end : start);\n });\n\n // Run the animation whenever the `to` target changes (or on first mount).\n // For `trigger=\"visible\"` the first run waits for the IntersectionObserver\n // to fire; subsequent `to` changes re-run immediately.\n effect(() => {\n // Establish dependencies so the effect re-runs on `to` changes.\n this.to();\n this.from();\n this.direction();\n this.duration();\n this.easing();\n this.delay();\n\n if (this.trigger() === 'visible' && !this.hasFiredForVisible) return;\n this.scheduleRun();\n });\n\n afterNextRender(() => {\n if (this.trigger() === 'visible') this.setupViewportTrigger();\n });\n\n this.destroyRef.onDestroy(() => {\n this.cancel();\n // `cancel()` only stops timers and the rAF loop. The IntersectionObserver\n // disconnects itself from inside its callback, which never fires if the\n // host is destroyed before it ever scrolls into view — so it would keep\n // observing a detached element for the life of the page.\n this.observer?.disconnect();\n this.observer = null;\n });\n }\n\n // Scheduling\n\n private setupViewportTrigger(): void {\n this.observer = new IntersectionObserver(\n (entries, obs) => {\n for (const e of entries) {\n if (e.isIntersecting && !this.hasFiredForVisible) {\n obs.disconnect();\n this.hasFiredForVisible = true;\n this.scheduleRun();\n break;\n }\n }\n },\n { threshold: 0, rootMargin: '0px' }\n );\n this.observer.observe(this.host.nativeElement);\n }\n\n private scheduleRun(): void {\n this.cancel();\n const d = this.delay();\n if (d > 0) {\n this.delayTimer = setTimeout(() => this.run(), d);\n } else {\n this.run();\n }\n }\n\n private run(): void {\n const start = this.direction() === 'down' ? this.to() : this.from();\n const end = this.direction() === 'down' ? this.from() : this.to();\n this.started.emit();\n // Straight to the answer for a reader who asked for less motion — `wr-counter` in this\n // same folder already does this, and a component whose entire purpose is a count-up\n // should not be the one that ignores it. Both outputs still fire, in order, so a\n // consumer wired to `completed` is not left waiting on a tween that never ran.\n if (this.platform.prefersReducedMotion()) {\n this.value.set(end);\n this.completed.emit();\n return;\n }\n if (this.easing() === 'spring') this.tweenSpring(start, end);\n else this.tweenEaseOut(start, end);\n }\n\n // Tweens\n\n private tweenEaseOut(start: number, target: number): void {\n const duration = Math.max(100, this.duration());\n const startTs = performance.now();\n const tick = (now: number): void => {\n const t = Math.min(1, (now - startTs) / duration);\n const v = start + (target - start) * easeOutCubic(t);\n this.value.set(v);\n if (t < 1) {\n this.rafId = requestAnimationFrame(tick);\n } else {\n this.completed.emit();\n }\n };\n this.rafId = requestAnimationFrame(tick);\n }\n\n /**\n * Critically-damped spring tween. Same formula as `motion/react`'s\n * `useSpring` with mass = 1:\n *\n * damping = 20 + 40 / duration\n * stiffness = 100 / duration\n *\n * We integrate `(spring force − damping force)` each frame until both\n * displacement and velocity fall below epsilon.\n */\n private tweenSpring(start: number, target: number): void {\n const duration = Math.max(0.05, this.duration());\n const damping = 20 + 40 / duration;\n const stiffness = 100 / duration;\n let current = start;\n let velocity = 0;\n let lastTs = 0;\n const epsilon = 0.001 * Math.max(1, Math.abs(target - start));\n\n const step = (ts: number): void => {\n const dt = lastTs === 0 ? 1 / 60 : Math.min(0.05, (ts - lastTs) / 1000);\n lastTs = ts;\n\n const displacement = current - target;\n const accel = -stiffness * displacement - damping * velocity;\n velocity += accel * dt;\n current += velocity * dt;\n this.value.set(current);\n\n if (Math.abs(current - target) < epsilon && Math.abs(velocity) < epsilon * 10) {\n this.value.set(target);\n this.completed.emit();\n return;\n }\n this.rafId = requestAnimationFrame(step);\n };\n this.rafId = requestAnimationFrame(step);\n }\n\n // Cleanup\n\n private cancel(): void {\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.rafId = null;\n if (this.delayTimer !== undefined) {\n clearTimeout(this.delayTimer);\n this.delayTimer = undefined;\n }\n }\n}\n\nexport type { WrCountUpEasing, WrCountUpTrigger, WrCountUpDirection } from './interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -216,10 +216,10 @@ class WrDateFnsAdapter extends WrDateAdapter {
|
|
|
216
216
|
out.push(formatter.format(new Date(2024, i, 15)));
|
|
217
217
|
return out;
|
|
218
218
|
}
|
|
219
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
220
|
-
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.
|
|
219
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrDateFnsAdapter, deps: [], target: i0.ɵɵFactoryTarget.Service });
|
|
220
|
+
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.7", ngImport: i0, type: WrDateFnsAdapter });
|
|
221
221
|
}
|
|
222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrDateFnsAdapter, decorators: [{
|
|
223
223
|
type: Service
|
|
224
224
|
}], ctorParameters: () => [] });
|
|
225
225
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-date-adapters-fns.mjs","sources":["../../../projects/lib/date/adapters/fns/tokens.ts","../../../projects/lib/date/adapters/fns/wr-date-fns-adapter.ts","../../../projects/lib/date/adapters/fns/provide-wr-date-fns-adapter.ts","../../../projects/lib/date/adapters/fns/ngwr-date-adapters-fns.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { Locale } from 'date-fns';\n\n/**\n * The date-fns `Locale` OBJECT {@link WrDateFnsAdapter} formats and parses with.\n *\n * `WR_DATE_LOCALE` is a BCP 47 TAG, and date-fns cannot resolve a tag: its locales are\n * separate modules, so mapping `'ru-RU'` onto one would mean importing all of them and\n * defeating the tree-shaking that makes this an opt-in entry point. The consumer imports\n * the one they need and hands it over — which is what\n * {@link provideWrDateFnsAdapter}'s `dateFnsLocale` option sets.\n *\n * `null` (the default) passes nothing to date-fns, which leaves that library's own\n * module-level default in charge — so `setDefaultOptions({ locale })` keeps working for\n * apps that already use it.\n *\n * @example\n * ```ts\n * import { ru } from 'date-fns/locale/ru';\n *\n * provideWrDateFnsAdapter({ locale: 'ru-RU', dateFnsLocale: ru });\n * ```\n */\nexport const WR_DATE_FNS_LOCALE = new InjectionToken<Locale | null>('WR_DATE_FNS_LOCALE', {\n providedIn: 'root',\n factory: () => null,\n});\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Service, inject, isDevMode } from '@angular/core';\n\nimport type { Locale } from 'date-fns';\nimport {\n addDays as dfAddDays,\n addMonths as dfAddMonths,\n addYears as dfAddYears,\n compareAsc,\n format as dfFormat,\n getDate,\n getDay,\n getDaysInMonth,\n getHours,\n getMinutes,\n getMonth,\n getSeconds,\n getYear,\n isSameDay,\n isSameMonth,\n isValid,\n parse as dfParse,\n set as dfSet,\n startOfDay,\n} from 'date-fns';\nimport { WrDateAdapter, WR_DATE_LOCALE, type WrDateFormat, isNamedFormat } from 'ngwr/date';\n\nimport { WR_DATE_FNS_LOCALE } from './tokens';\n\nconst NAMED_PATTERNS: Readonly<Record<WrDateFormat, string>> = {\n shortDate: 'P',\n mediumDate: 'PP',\n longDate: 'PPP',\n time: 'p',\n shortDateTime: 'P p',\n mediumDateTime: 'PP p',\n};\n\n/**\n * {@link WrDateAdapter} backed by `date-fns`. Same `Date` value type as the\n * native adapter, but defers all math, formatting, and parsing to date-fns —\n * pick this when you want its long patterns (`P`, `PP`, `PPP`, `p`) without\n * writing them by hand.\n *\n * **Localising it takes TWO settings, and that is a property of date-fns rather\n * than a wart here.** `WR_DATE_LOCALE` is a BCP 47 tag; date-fns resolves its\n * patterns against a `Locale` OBJECT, and the objects are separate modules, so\n * mapping a tag onto one would mean importing all of them and defeating the\n * tree-shaking that is the reason this is an opt-in entry point. Pass the object\n * as `dateFnsLocale` and it reaches `format` and `parse`; leave it out and they\n * stay on date-fns's own module default, which is what keeps\n * `setDefaultOptions({ locale })` working for apps that already use it.\n *\n * Half-localising is the failure mode this is designed to make loud: with only a\n * tag, `getFirstDayOfWeek`, `getDayOfWeekNames` and `getMonthNames` go through\n * `Intl` and answer in the locale while the trigger beside them reads\n * `08/11/2025`, and READING is the sharper edge — `11/08/2025` typed by a user in\n * a dd/MM locale parses as 8 November, valid and wrong. A non-English tag with no\n * object warns once in dev mode for exactly that reason.\n *\n * @example\n * ```ts\n * import { ru } from 'date-fns/locale/ru';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrDateFnsAdapter({ locale: 'ru-RU', dateFnsLocale: ru })],\n * });\n * ```\n *\n * Peer dep: `date-fns@^3` (or `^4`).\n */\n@Service()\nexport class WrDateFnsAdapter extends WrDateAdapter<Date> {\n private readonly locale = inject(WR_DATE_LOCALE);\n private readonly dateFnsLocale = inject(WR_DATE_FNS_LOCALE);\n\n constructor() {\n super();\n if (isDevMode() && !this.dateFnsLocale && !this.locale.toLowerCase().startsWith('en')) {\n // eslint-disable-next-line no-console -- dev-mode validation\n console.warn(\n `[NGWR] provideWrDateFnsAdapter({ locale: '${this.locale}' }) localises the calendar ` +\n `headings but not the field: date-fns needs its own Locale OBJECT. Pass one — ` +\n `provideWrDateFnsAdapter({ locale: '${this.locale}', dateFnsLocale: <import from ` +\n `'date-fns/locale/…'> }) — or set date-fns's module default with setDefaultOptions().`\n );\n }\n }\n\n /** What date-fns is handed. `{}` leaves its module default in charge. */\n private get options(): { locale?: Locale } {\n return this.dateFnsLocale ? { locale: this.dateFnsLocale } : {};\n }\n\n // Construction & identity\n\n today(): Date {\n return new Date();\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n createDate(year: number, month: number, day: number): Date {\n const d = new Date(year, month, day);\n if (year >= 0 && year < 100) d.setFullYear(year);\n return d;\n }\n\n isValid(date: Date): boolean {\n return isValid(date);\n }\n\n // Accessors\n\n getYear(date: Date): number {\n return getYear(date);\n }\n getMonth(date: Date): number {\n return getMonth(date);\n }\n getDate(date: Date): number {\n return getDate(date);\n }\n getDayOfWeek(date: Date): number {\n return getDay(date);\n }\n getDaysInMonth(date: Date): number {\n return getDaysInMonth(date);\n }\n getHours(date: Date): number {\n return getHours(date);\n }\n getMinutes(date: Date): number {\n return getMinutes(date);\n }\n getSeconds(date: Date): number {\n return getSeconds(date);\n }\n\n // Immutable math\n\n addYears(date: Date, amount: number): Date {\n return dfAddYears(date, amount);\n }\n addMonths(date: Date, amount: number): Date {\n return dfAddMonths(date, amount);\n }\n addDays(date: Date, amount: number): Date {\n return dfAddDays(date, amount);\n }\n setTime(date: Date, hours: number, minutes: number, seconds: number): Date {\n return dfSet(date, { hours, minutes, seconds, milliseconds: 0 });\n }\n\n // Comparison\n\n isSameDay(a: Date, b: Date): boolean {\n return isSameDay(a, b);\n }\n isSameMonth(a: Date, b: Date): boolean {\n return isSameMonth(a, b);\n }\n compareDate(a: Date, b: Date): number {\n return compareAsc(startOfDay(a), startOfDay(b));\n }\n\n // Formatting / parsing\n\n format(date: Date, formatKeyOrString: WrDateFormat | (string & {})): string {\n const pattern = isNamedFormat(formatKeyOrString) ? NAMED_PATTERNS[formatKeyOrString] : formatKeyOrString;\n return dfFormat(date, pattern, this.options);\n }\n\n parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): Date | null {\n const raw = value?.trim();\n if (!raw) return null;\n const pattern = isNamedFormat(formatKeyOrString) ? NAMED_PATTERNS[formatKeyOrString] : formatKeyOrString;\n // The same options as `format`, so whatever the one wrote the other reads — the\n // pattern `P` means `MM/dd/y` in enUS and `dd.MM.y` in ru, and a picker that writes\n // one and reads the other is the native adapter's blocker wearing another hat.\n const result = dfParse(raw, pattern, new Date(), this.options);\n return isValid(result) ? result : null;\n }\n\n // Locale info\n\n getFirstDayOfWeek(): number {\n // The object wins where there is one: it is what `format` and `parse` compute with,\n // and a grid starting on a different day from the strings beside it is the same\n // half-localisation this adapter is trying to stop shipping.\n const fromLocale = this.dateFnsLocale?.options?.weekStartsOn;\n if (typeof fromLocale === 'number') return fromLocale;\n try {\n const locale = new Intl.Locale(this.locale) as unknown as { getWeekInfo?: () => { firstDay: number } };\n const info = locale.getWeekInfo?.();\n if (info && typeof info.firstDay === 'number') return info.firstDay % 7;\n } catch {\n // Intl.Locale unsupported — fall through.\n }\n return this.locale.toLowerCase().startsWith('en-us') ? 0 : 1;\n }\n\n getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n const formatter = new Intl.DateTimeFormat(this.locale, { weekday: style });\n const first = this.getFirstDayOfWeek();\n const base = new Date(2024, 0, 7); // Sunday\n const out: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(base);\n d.setDate(base.getDate() + ((first + i) % 7));\n out.push(formatter.format(d));\n }\n return out;\n }\n\n getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n const formatter = new Intl.DateTimeFormat(this.locale, { month: style });\n const out: string[] = [];\n for (let i = 0; i < 12; i++) out.push(formatter.format(new Date(2024, i, 15)));\n return out;\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\n\nimport type { Locale } from 'date-fns';\nimport { provideWrDateAdapter } from 'ngwr/date';\n\nimport { WR_DATE_FNS_LOCALE } from './tokens';\nimport { WrDateFnsAdapter } from './wr-date-fns-adapter';\n\n/**\n * Register the {@link WrDateFnsAdapter} so date-pickers / calendars in this\n * app use `date-fns` for all math and formatting.\n *\n * Two locale settings, because date-fns needs a `Locale` OBJECT where the rest of the\n * library needs a BCP 47 TAG:\n *\n * - `dateFnsLocale` — the imported object. It reaches `format` and `parse`, which is\n * where the field's own text comes from, and it also decides the first day of the\n * week. Leave it out and date-fns stays on its module default, so an existing\n * `setDefaultOptions({ locale })` keeps working.\n * - `locale` — the tag {@link WR_DATE_LOCALE} carries, read through `Intl` for the month\n * and weekday NAMES. Omit it and the object's own `code` supplies it, so one import is\n * enough for a fully localized picker.\n *\n * Passing only `locale` localizes the calendar headings and not the field, which is the\n * shape of a real defect rather than a preference — the adapter warns about it once in\n * dev mode.\n *\n * @example\n * ```ts\n * import { ru } from 'date-fns/locale/ru';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrDateFnsAdapter({ dateFnsLocale: ru })],\n * });\n * ```\n */\nexport function provideWrDateFnsAdapter(\n options: { readonly locale?: string; readonly dateFnsLocale?: Locale } = {}\n): EnvironmentProviders {\n // A date-fns `Locale` carries its own tag (`ru`, `en-GB`), so one setting is enough\n // and the two can never silently disagree about which language this picker is in.\n const tag = options.locale ?? options.dateFnsLocale?.code;\n\n return makeEnvironmentProviders([\n provideWrDateAdapter({ adapter: WrDateFnsAdapter, locale: tag }),\n ...(options.dateFnsLocale ? [{ provide: WR_DATE_FNS_LOCALE, useValue: options.dateFnsLocale }] : []),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["dfAddYears","dfAddMonths","dfAddDays","dfSet","dfFormat","dfParse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngwr-date-adapters-fns.mjs","sources":["../../../projects/lib/date/adapters/fns/tokens.ts","../../../projects/lib/date/adapters/fns/wr-date-fns-adapter.ts","../../../projects/lib/date/adapters/fns/provide-wr-date-fns-adapter.ts","../../../projects/lib/date/adapters/fns/ngwr-date-adapters-fns.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { Locale } from 'date-fns';\n\n/**\n * The date-fns `Locale` OBJECT {@link WrDateFnsAdapter} formats and parses with.\n *\n * `WR_DATE_LOCALE` is a BCP 47 TAG, and date-fns cannot resolve a tag: its locales are\n * separate modules, so mapping `'ru-RU'` onto one would mean importing all of them and\n * defeating the tree-shaking that makes this an opt-in entry point. The consumer imports\n * the one they need and hands it over — which is what\n * {@link provideWrDateFnsAdapter}'s `dateFnsLocale` option sets.\n *\n * `null` (the default) passes nothing to date-fns, which leaves that library's own\n * module-level default in charge — so `setDefaultOptions({ locale })` keeps working for\n * apps that already use it.\n *\n * @example\n * ```ts\n * import { ru } from 'date-fns/locale/ru';\n *\n * provideWrDateFnsAdapter({ locale: 'ru-RU', dateFnsLocale: ru });\n * ```\n */\nexport const WR_DATE_FNS_LOCALE = new InjectionToken<Locale | null>('WR_DATE_FNS_LOCALE', {\n providedIn: 'root',\n factory: () => null,\n});\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Service, inject, isDevMode } from '@angular/core';\n\nimport type { Locale } from 'date-fns';\nimport {\n addDays as dfAddDays,\n addMonths as dfAddMonths,\n addYears as dfAddYears,\n compareAsc,\n format as dfFormat,\n getDate,\n getDay,\n getDaysInMonth,\n getHours,\n getMinutes,\n getMonth,\n getSeconds,\n getYear,\n isSameDay,\n isSameMonth,\n isValid,\n parse as dfParse,\n set as dfSet,\n startOfDay,\n} from 'date-fns';\nimport { WrDateAdapter, WR_DATE_LOCALE, type WrDateFormat, isNamedFormat } from 'ngwr/date';\n\nimport { WR_DATE_FNS_LOCALE } from './tokens';\n\nconst NAMED_PATTERNS: Readonly<Record<WrDateFormat, string>> = {\n shortDate: 'P',\n mediumDate: 'PP',\n longDate: 'PPP',\n time: 'p',\n shortDateTime: 'P p',\n mediumDateTime: 'PP p',\n};\n\n/**\n * {@link WrDateAdapter} backed by `date-fns`. Same `Date` value type as the\n * native adapter, but defers all math, formatting, and parsing to date-fns —\n * pick this when you want its long patterns (`P`, `PP`, `PPP`, `p`) without\n * writing them by hand.\n *\n * **Localising it takes TWO settings, and that is a property of date-fns rather\n * than a wart here.** `WR_DATE_LOCALE` is a BCP 47 tag; date-fns resolves its\n * patterns against a `Locale` OBJECT, and the objects are separate modules, so\n * mapping a tag onto one would mean importing all of them and defeating the\n * tree-shaking that is the reason this is an opt-in entry point. Pass the object\n * as `dateFnsLocale` and it reaches `format` and `parse`; leave it out and they\n * stay on date-fns's own module default, which is what keeps\n * `setDefaultOptions({ locale })` working for apps that already use it.\n *\n * Half-localising is the failure mode this is designed to make loud: with only a\n * tag, `getFirstDayOfWeek`, `getDayOfWeekNames` and `getMonthNames` go through\n * `Intl` and answer in the locale while the trigger beside them reads\n * `08/11/2025`, and READING is the sharper edge — `11/08/2025` typed by a user in\n * a dd/MM locale parses as 8 November, valid and wrong. A non-English tag with no\n * object warns once in dev mode for exactly that reason.\n *\n * @example\n * ```ts\n * import { ru } from 'date-fns/locale/ru';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrDateFnsAdapter({ locale: 'ru-RU', dateFnsLocale: ru })],\n * });\n * ```\n *\n * Peer dep: `date-fns@^3` (or `^4`).\n */\n@Service()\nexport class WrDateFnsAdapter extends WrDateAdapter<Date> {\n private readonly locale = inject(WR_DATE_LOCALE);\n private readonly dateFnsLocale = inject(WR_DATE_FNS_LOCALE);\n\n constructor() {\n super();\n if (isDevMode() && !this.dateFnsLocale && !this.locale.toLowerCase().startsWith('en')) {\n // eslint-disable-next-line no-console -- dev-mode validation\n console.warn(\n `[NGWR] provideWrDateFnsAdapter({ locale: '${this.locale}' }) localises the calendar ` +\n `headings but not the field: date-fns needs its own Locale OBJECT. Pass one — ` +\n `provideWrDateFnsAdapter({ locale: '${this.locale}', dateFnsLocale: <import from ` +\n `'date-fns/locale/…'> }) — or set date-fns's module default with setDefaultOptions().`\n );\n }\n }\n\n /** What date-fns is handed. `{}` leaves its module default in charge. */\n private get options(): { locale?: Locale } {\n return this.dateFnsLocale ? { locale: this.dateFnsLocale } : {};\n }\n\n // Construction & identity\n\n today(): Date {\n return new Date();\n }\n\n clone(date: Date): Date {\n return new Date(date.getTime());\n }\n\n createDate(year: number, month: number, day: number): Date {\n const d = new Date(year, month, day);\n if (year >= 0 && year < 100) d.setFullYear(year);\n return d;\n }\n\n isValid(date: Date): boolean {\n return isValid(date);\n }\n\n // Accessors\n\n getYear(date: Date): number {\n return getYear(date);\n }\n getMonth(date: Date): number {\n return getMonth(date);\n }\n getDate(date: Date): number {\n return getDate(date);\n }\n getDayOfWeek(date: Date): number {\n return getDay(date);\n }\n getDaysInMonth(date: Date): number {\n return getDaysInMonth(date);\n }\n getHours(date: Date): number {\n return getHours(date);\n }\n getMinutes(date: Date): number {\n return getMinutes(date);\n }\n getSeconds(date: Date): number {\n return getSeconds(date);\n }\n\n // Immutable math\n\n addYears(date: Date, amount: number): Date {\n return dfAddYears(date, amount);\n }\n addMonths(date: Date, amount: number): Date {\n return dfAddMonths(date, amount);\n }\n addDays(date: Date, amount: number): Date {\n return dfAddDays(date, amount);\n }\n setTime(date: Date, hours: number, minutes: number, seconds: number): Date {\n return dfSet(date, { hours, minutes, seconds, milliseconds: 0 });\n }\n\n // Comparison\n\n isSameDay(a: Date, b: Date): boolean {\n return isSameDay(a, b);\n }\n isSameMonth(a: Date, b: Date): boolean {\n return isSameMonth(a, b);\n }\n compareDate(a: Date, b: Date): number {\n return compareAsc(startOfDay(a), startOfDay(b));\n }\n\n // Formatting / parsing\n\n format(date: Date, formatKeyOrString: WrDateFormat | (string & {})): string {\n const pattern = isNamedFormat(formatKeyOrString) ? NAMED_PATTERNS[formatKeyOrString] : formatKeyOrString;\n return dfFormat(date, pattern, this.options);\n }\n\n parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): Date | null {\n const raw = value?.trim();\n if (!raw) return null;\n const pattern = isNamedFormat(formatKeyOrString) ? NAMED_PATTERNS[formatKeyOrString] : formatKeyOrString;\n // The same options as `format`, so whatever the one wrote the other reads — the\n // pattern `P` means `MM/dd/y` in enUS and `dd.MM.y` in ru, and a picker that writes\n // one and reads the other is the native adapter's blocker wearing another hat.\n const result = dfParse(raw, pattern, new Date(), this.options);\n return isValid(result) ? result : null;\n }\n\n // Locale info\n\n getFirstDayOfWeek(): number {\n // The object wins where there is one: it is what `format` and `parse` compute with,\n // and a grid starting on a different day from the strings beside it is the same\n // half-localisation this adapter is trying to stop shipping.\n const fromLocale = this.dateFnsLocale?.options?.weekStartsOn;\n if (typeof fromLocale === 'number') return fromLocale;\n try {\n const locale = new Intl.Locale(this.locale) as unknown as { getWeekInfo?: () => { firstDay: number } };\n const info = locale.getWeekInfo?.();\n if (info && typeof info.firstDay === 'number') return info.firstDay % 7;\n } catch {\n // Intl.Locale unsupported — fall through.\n }\n return this.locale.toLowerCase().startsWith('en-us') ? 0 : 1;\n }\n\n getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n const formatter = new Intl.DateTimeFormat(this.locale, { weekday: style });\n const first = this.getFirstDayOfWeek();\n const base = new Date(2024, 0, 7); // Sunday\n const out: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(base);\n d.setDate(base.getDate() + ((first + i) % 7));\n out.push(formatter.format(d));\n }\n return out;\n }\n\n getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n const formatter = new Intl.DateTimeFormat(this.locale, { month: style });\n const out: string[] = [];\n for (let i = 0; i < 12; i++) out.push(formatter.format(new Date(2024, i, 15)));\n return out;\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\n\nimport type { Locale } from 'date-fns';\nimport { provideWrDateAdapter } from 'ngwr/date';\n\nimport { WR_DATE_FNS_LOCALE } from './tokens';\nimport { WrDateFnsAdapter } from './wr-date-fns-adapter';\n\n/**\n * Register the {@link WrDateFnsAdapter} so date-pickers / calendars in this\n * app use `date-fns` for all math and formatting.\n *\n * Two locale settings, because date-fns needs a `Locale` OBJECT where the rest of the\n * library needs a BCP 47 TAG:\n *\n * - `dateFnsLocale` — the imported object. It reaches `format` and `parse`, which is\n * where the field's own text comes from, and it also decides the first day of the\n * week. Leave it out and date-fns stays on its module default, so an existing\n * `setDefaultOptions({ locale })` keeps working.\n * - `locale` — the tag {@link WR_DATE_LOCALE} carries, read through `Intl` for the month\n * and weekday NAMES. Omit it and the object's own `code` supplies it, so one import is\n * enough for a fully localized picker.\n *\n * Passing only `locale` localizes the calendar headings and not the field, which is the\n * shape of a real defect rather than a preference — the adapter warns about it once in\n * dev mode.\n *\n * @example\n * ```ts\n * import { ru } from 'date-fns/locale/ru';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrDateFnsAdapter({ dateFnsLocale: ru })],\n * });\n * ```\n */\nexport function provideWrDateFnsAdapter(\n options: { readonly locale?: string; readonly dateFnsLocale?: Locale } = {}\n): EnvironmentProviders {\n // A date-fns `Locale` carries its own tag (`ru`, `en-GB`), so one setting is enough\n // and the two can never silently disagree about which language this picker is in.\n const tag = options.locale ?? options.dateFnsLocale?.code;\n\n return makeEnvironmentProviders([\n provideWrDateAdapter({ adapter: WrDateFnsAdapter, locale: tag }),\n ...(options.dateFnsLocale ? [{ provide: WR_DATE_FNS_LOCALE, useValue: options.dateFnsLocale }] : []),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["dfAddYears","dfAddMonths","dfAddDays","dfSet","dfFormat","dfParse"],"mappings":"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"}
|
|
@@ -212,10 +212,10 @@ class WrLuxonAdapter extends WrDateAdapter {
|
|
|
212
212
|
getMonthNames(style) {
|
|
213
213
|
return Info.months(style, { locale: this.locale });
|
|
214
214
|
}
|
|
215
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
216
|
-
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.
|
|
215
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrLuxonAdapter, deps: [], target: i0.ɵɵFactoryTarget.Service });
|
|
216
|
+
static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.7", ngImport: i0, type: WrLuxonAdapter });
|
|
217
217
|
}
|
|
218
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
218
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: WrLuxonAdapter, decorators: [{
|
|
219
219
|
type: Service
|
|
220
220
|
}] });
|
|
221
221
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-date-adapters-luxon.mjs","sources":["../../../projects/lib/date/adapters/luxon/wr-luxon-adapter.ts","../../../projects/lib/date/adapters/luxon/provide-wr-luxon-adapter.ts","../../../projects/lib/date/adapters/luxon/ngwr-date-adapters-luxon.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Service, inject } from '@angular/core';\n\nimport { DateTime, Info } from 'luxon';\nimport { WrDateAdapter, WR_DATE_LOCALE, type WrDateFormat, isNamedFormat } from 'ngwr/date';\n\nconst NAMED_PATTERNS: Readonly<Record<WrDateFormat, string>> = {\n shortDate: 'D',\n mediumDate: 'DD',\n longDate: 'DDD',\n time: 't',\n shortDateTime: 'f',\n mediumDateTime: 'ff',\n};\n\n/**\n * Token translation table — our token grammar (matches the native adapter)\n * mapped to luxon's. Notably `MMMM`/`MMM` (month names) become luxon's\n * standalone-month tokens `LLLL`/`LLL`.\n */\nconst TOKEN_MAP: Readonly<Record<string, string>> = {\n yyyy: 'yyyy',\n yy: 'yy',\n MMMM: 'LLLL',\n MMM: 'LLL',\n MM: 'MM',\n M: 'M',\n dd: 'dd',\n d: 'd',\n HH: 'HH',\n H: 'H',\n hh: 'hh',\n h: 'h',\n mm: 'mm',\n ss: 'ss',\n a: 'a',\n};\n\nconst TOKEN_RE = /yyyy|yy|MMMM|MMM|MM|M|dd|d|HH|H|hh|h|mm|ss|a/g;\n\n/**\n * A quoted literal, in Luxon's own syntax: text between single quotes, where\n * `''` is an escaped quote. Split on this and the odd-numbered pieces are the\n * literals — which must reach Luxon untouched.\n */\nconst QUOTED_RE = /('(?:[^']|'')*')/;\n\n/**\n * Rewrite the library's tokens into Luxon's, LEAVING QUOTED TEXT ALONE.\n *\n * The tokens are mostly shared, but a few are not — `MMMM` is Luxon's standalone\n * `LLLL`, for one — so the pattern is translated on the way in. Doing that over\n * the whole string also rewrote the caller's own literals: `\"MMMM 'MMMM'\"`, a\n * month name followed by the word, printed \"August LLLL\". Splitting on quotes\n * first keeps the substitution where it belongs.\n */\nfunction translatePattern(pattern: string): string {\n return pattern\n .split(QUOTED_RE)\n .map((part, index) => (index % 2 === 1 ? part : part.replace(TOKEN_RE, t => TOKEN_MAP[t] ?? t)))\n .join('');\n}\n\n/**\n * {@link WrDateAdapter} backed by Luxon `DateTime`. Use this when you need\n * proper timezone-aware math or IANA zone handling (the native + date-fns\n * adapters both work on plain `Date` and inherit JS quirks).\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrLuxonAdapter()],\n * });\n * ```\n *\n * Peer dep: `luxon@^3`.\n */\n@Service()\nexport class WrLuxonAdapter extends WrDateAdapter<DateTime> {\n private readonly locale = inject(WR_DATE_LOCALE);\n\n // Construction & identity\n\n today(): DateTime {\n return DateTime.now().setLocale(this.locale);\n }\n\n clone(date: DateTime): DateTime {\n return DateTime.fromMillis(date.toMillis(), { zone: date.zone, locale: this.locale });\n }\n\n createDate(year: number, month: number, day: number): DateTime {\n // `month` is 0-based on our API; luxon's months are 1-based.\n return DateTime.fromObject({ year, month: month + 1, day }, { locale: this.locale });\n }\n\n isValid(date: DateTime): boolean {\n return date.isValid;\n }\n\n // Accessors\n\n getYear(date: DateTime): number {\n return date.year;\n }\n getMonth(date: DateTime): number {\n return date.month - 1;\n }\n getDate(date: DateTime): number {\n return date.day;\n }\n getDayOfWeek(date: DateTime): number {\n // Luxon weekday: 1 (Mon) – 7 (Sun). Our API: 0 (Sun) – 6 (Sat).\n return date.weekday % 7;\n }\n getDaysInMonth(date: DateTime): number {\n return date.daysInMonth ?? 30;\n }\n getHours(date: DateTime): number {\n return date.hour;\n }\n getMinutes(date: DateTime): number {\n return date.minute;\n }\n getSeconds(date: DateTime): number {\n return date.second;\n }\n\n // Immutable math\n\n addYears(date: DateTime, amount: number): DateTime {\n return date.plus({ years: amount });\n }\n addMonths(date: DateTime, amount: number): DateTime {\n return date.plus({ months: amount });\n }\n addDays(date: DateTime, amount: number): DateTime {\n return date.plus({ days: amount });\n }\n setTime(date: DateTime, hours: number, minutes: number, seconds: number): DateTime {\n return date.set({ hour: hours, minute: minutes, second: seconds, millisecond: 0 });\n }\n\n // Comparison\n\n /**\n * The comparison trio, all three answering the same question: what CALENDAR DAY\n * does each value display?\n *\n * Field comparison rather than Luxon's own helpers, and deliberately. This\n * adapter exists for zone-aware apps, so its values do not all share a zone —\n * the grid is built with `createDate` in the app's zone while the selected value\n * may arrive as `DateTime.utc()`. Two things went wrong when the zone was left\n * in the answer:\n *\n * `compareDate` subtracted `startOf('day')` millis, and `startOf` respects each\n * value's OWN zone, so two values both reading \"1 August\" came out three hours\n * apart. Non-zero means \"different day\" to every caller — including\n * `isWithinRange`, which the base class documents as inclusive and which\n * therefore dropped its own endpoint.\n *\n * `hasSame` is the other tempting one-liner, and it asks a third question: it\n * re-expresses one side in the other's zone and tests that instant against the\n * day's bounds. That mostly agrees with a field comparison — but only mostly,\n * and only in this version of luxon, whose `hasSame` keeps the local time\n * while an earlier one kept the instant. Where a date's midnight is ambiguous\n * or missing (Cuba rewinds 01:00 to 00:00 on 2 November 2025) the bounds stop\n * lining up and it answers false for two values a user reads as the same date.\n * The native adapter compares fields; agreeing with it is what keeps a\n * calendar built on either adapter rendering the same thing.\n */\n isSameDay(a: DateTime, b: DateTime): boolean {\n return a.year === b.year && a.month === b.month && a.day === b.day;\n }\n isSameMonth(a: DateTime, b: DateTime): boolean {\n return a.year === b.year && a.month === b.month;\n }\n compareDate(a: DateTime, b: DateTime): number {\n if (a.year !== b.year) return a.year - b.year;\n if (a.month !== b.month) return a.month - b.month;\n return a.day - b.day;\n }\n\n // Formatting / parsing\n\n format(date: DateTime, formatKeyOrString: WrDateFormat | (string & {})): string {\n if (isNamedFormat(formatKeyOrString)) {\n return date.setLocale(this.locale).toFormat(NAMED_PATTERNS[formatKeyOrString]);\n }\n return date.setLocale(this.locale).toFormat(translatePattern(formatKeyOrString));\n }\n\n parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): DateTime | null {\n const raw = value?.trim();\n if (!raw) return null;\n const pattern = isNamedFormat(formatKeyOrString)\n ? NAMED_PATTERNS[formatKeyOrString]\n : translatePattern(formatKeyOrString);\n const parsed = DateTime.fromFormat(raw, pattern, { locale: this.locale });\n return parsed.isValid ? parsed : null;\n }\n\n // Locale info\n\n getFirstDayOfWeek(): number {\n try {\n const locale = new Intl.Locale(this.locale) as unknown as { getWeekInfo?: () => { firstDay: number } };\n const info = locale.getWeekInfo?.();\n if (info && typeof info.firstDay === 'number') return info.firstDay % 7;\n } catch {\n // Intl.Locale unsupported — fall through.\n }\n return this.locale.toLowerCase().startsWith('en-us') ? 0 : 1;\n }\n\n getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n // Luxon returns Mon-first; reorder according to our locale's first day.\n const names = Info.weekdays(style, { locale: this.locale });\n const first = this.getFirstDayOfWeek();\n // Convert Mon-first (index 0 = Mon) to our Sun-first then rotate.\n // Easier: pad to Sun-first using known offset (luxon Mon=0, Sun=6).\n const sunFirst = [names[6], ...names.slice(0, 6)];\n return [...sunFirst.slice(first), ...sunFirst.slice(0, first)];\n }\n\n getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n return Info.months(style, { locale: this.locale });\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { EnvironmentProviders } from '@angular/core';\n\nimport { provideWrDateAdapter } from 'ngwr/date';\n\nimport { WrLuxonAdapter } from './wr-luxon-adapter';\n\n/**\n * Register the {@link WrLuxonAdapter} so date-pickers / calendars in this\n * app use Luxon `DateTime` for all math and formatting. Pass `locale` to\n * override the BCP 47 tag.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrLuxonAdapter()],\n * });\n * ```\n */\nexport function provideWrLuxonAdapter(options: { readonly locale?: string } = {}): EnvironmentProviders {\n return provideWrDateAdapter({ adapter: WrLuxonAdapter, locale: options.locale });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngwr-date-adapters-luxon.mjs","sources":["../../../projects/lib/date/adapters/luxon/wr-luxon-adapter.ts","../../../projects/lib/date/adapters/luxon/provide-wr-luxon-adapter.ts","../../../projects/lib/date/adapters/luxon/ngwr-date-adapters-luxon.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Service, inject } from '@angular/core';\n\nimport { DateTime, Info } from 'luxon';\nimport { WrDateAdapter, WR_DATE_LOCALE, type WrDateFormat, isNamedFormat } from 'ngwr/date';\n\nconst NAMED_PATTERNS: Readonly<Record<WrDateFormat, string>> = {\n shortDate: 'D',\n mediumDate: 'DD',\n longDate: 'DDD',\n time: 't',\n shortDateTime: 'f',\n mediumDateTime: 'ff',\n};\n\n/**\n * Token translation table — our token grammar (matches the native adapter)\n * mapped to luxon's. Notably `MMMM`/`MMM` (month names) become luxon's\n * standalone-month tokens `LLLL`/`LLL`.\n */\nconst TOKEN_MAP: Readonly<Record<string, string>> = {\n yyyy: 'yyyy',\n yy: 'yy',\n MMMM: 'LLLL',\n MMM: 'LLL',\n MM: 'MM',\n M: 'M',\n dd: 'dd',\n d: 'd',\n HH: 'HH',\n H: 'H',\n hh: 'hh',\n h: 'h',\n mm: 'mm',\n ss: 'ss',\n a: 'a',\n};\n\nconst TOKEN_RE = /yyyy|yy|MMMM|MMM|MM|M|dd|d|HH|H|hh|h|mm|ss|a/g;\n\n/**\n * A quoted literal, in Luxon's own syntax: text between single quotes, where\n * `''` is an escaped quote. Split on this and the odd-numbered pieces are the\n * literals — which must reach Luxon untouched.\n */\nconst QUOTED_RE = /('(?:[^']|'')*')/;\n\n/**\n * Rewrite the library's tokens into Luxon's, LEAVING QUOTED TEXT ALONE.\n *\n * The tokens are mostly shared, but a few are not — `MMMM` is Luxon's standalone\n * `LLLL`, for one — so the pattern is translated on the way in. Doing that over\n * the whole string also rewrote the caller's own literals: `\"MMMM 'MMMM'\"`, a\n * month name followed by the word, printed \"August LLLL\". Splitting on quotes\n * first keeps the substitution where it belongs.\n */\nfunction translatePattern(pattern: string): string {\n return pattern\n .split(QUOTED_RE)\n .map((part, index) => (index % 2 === 1 ? part : part.replace(TOKEN_RE, t => TOKEN_MAP[t] ?? t)))\n .join('');\n}\n\n/**\n * {@link WrDateAdapter} backed by Luxon `DateTime`. Use this when you need\n * proper timezone-aware math or IANA zone handling (the native + date-fns\n * adapters both work on plain `Date` and inherit JS quirks).\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrLuxonAdapter()],\n * });\n * ```\n *\n * Peer dep: `luxon@^3`.\n */\n@Service()\nexport class WrLuxonAdapter extends WrDateAdapter<DateTime> {\n private readonly locale = inject(WR_DATE_LOCALE);\n\n // Construction & identity\n\n today(): DateTime {\n return DateTime.now().setLocale(this.locale);\n }\n\n clone(date: DateTime): DateTime {\n return DateTime.fromMillis(date.toMillis(), { zone: date.zone, locale: this.locale });\n }\n\n createDate(year: number, month: number, day: number): DateTime {\n // `month` is 0-based on our API; luxon's months are 1-based.\n return DateTime.fromObject({ year, month: month + 1, day }, { locale: this.locale });\n }\n\n isValid(date: DateTime): boolean {\n return date.isValid;\n }\n\n // Accessors\n\n getYear(date: DateTime): number {\n return date.year;\n }\n getMonth(date: DateTime): number {\n return date.month - 1;\n }\n getDate(date: DateTime): number {\n return date.day;\n }\n getDayOfWeek(date: DateTime): number {\n // Luxon weekday: 1 (Mon) – 7 (Sun). Our API: 0 (Sun) – 6 (Sat).\n return date.weekday % 7;\n }\n getDaysInMonth(date: DateTime): number {\n return date.daysInMonth ?? 30;\n }\n getHours(date: DateTime): number {\n return date.hour;\n }\n getMinutes(date: DateTime): number {\n return date.minute;\n }\n getSeconds(date: DateTime): number {\n return date.second;\n }\n\n // Immutable math\n\n addYears(date: DateTime, amount: number): DateTime {\n return date.plus({ years: amount });\n }\n addMonths(date: DateTime, amount: number): DateTime {\n return date.plus({ months: amount });\n }\n addDays(date: DateTime, amount: number): DateTime {\n return date.plus({ days: amount });\n }\n setTime(date: DateTime, hours: number, minutes: number, seconds: number): DateTime {\n return date.set({ hour: hours, minute: minutes, second: seconds, millisecond: 0 });\n }\n\n // Comparison\n\n /**\n * The comparison trio, all three answering the same question: what CALENDAR DAY\n * does each value display?\n *\n * Field comparison rather than Luxon's own helpers, and deliberately. This\n * adapter exists for zone-aware apps, so its values do not all share a zone —\n * the grid is built with `createDate` in the app's zone while the selected value\n * may arrive as `DateTime.utc()`. Two things went wrong when the zone was left\n * in the answer:\n *\n * `compareDate` subtracted `startOf('day')` millis, and `startOf` respects each\n * value's OWN zone, so two values both reading \"1 August\" came out three hours\n * apart. Non-zero means \"different day\" to every caller — including\n * `isWithinRange`, which the base class documents as inclusive and which\n * therefore dropped its own endpoint.\n *\n * `hasSame` is the other tempting one-liner, and it asks a third question: it\n * re-expresses one side in the other's zone and tests that instant against the\n * day's bounds. That mostly agrees with a field comparison — but only mostly,\n * and only in this version of luxon, whose `hasSame` keeps the local time\n * while an earlier one kept the instant. Where a date's midnight is ambiguous\n * or missing (Cuba rewinds 01:00 to 00:00 on 2 November 2025) the bounds stop\n * lining up and it answers false for two values a user reads as the same date.\n * The native adapter compares fields; agreeing with it is what keeps a\n * calendar built on either adapter rendering the same thing.\n */\n isSameDay(a: DateTime, b: DateTime): boolean {\n return a.year === b.year && a.month === b.month && a.day === b.day;\n }\n isSameMonth(a: DateTime, b: DateTime): boolean {\n return a.year === b.year && a.month === b.month;\n }\n compareDate(a: DateTime, b: DateTime): number {\n if (a.year !== b.year) return a.year - b.year;\n if (a.month !== b.month) return a.month - b.month;\n return a.day - b.day;\n }\n\n // Formatting / parsing\n\n format(date: DateTime, formatKeyOrString: WrDateFormat | (string & {})): string {\n if (isNamedFormat(formatKeyOrString)) {\n return date.setLocale(this.locale).toFormat(NAMED_PATTERNS[formatKeyOrString]);\n }\n return date.setLocale(this.locale).toFormat(translatePattern(formatKeyOrString));\n }\n\n parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): DateTime | null {\n const raw = value?.trim();\n if (!raw) return null;\n const pattern = isNamedFormat(formatKeyOrString)\n ? NAMED_PATTERNS[formatKeyOrString]\n : translatePattern(formatKeyOrString);\n const parsed = DateTime.fromFormat(raw, pattern, { locale: this.locale });\n return parsed.isValid ? parsed : null;\n }\n\n // Locale info\n\n getFirstDayOfWeek(): number {\n try {\n const locale = new Intl.Locale(this.locale) as unknown as { getWeekInfo?: () => { firstDay: number } };\n const info = locale.getWeekInfo?.();\n if (info && typeof info.firstDay === 'number') return info.firstDay % 7;\n } catch {\n // Intl.Locale unsupported — fall through.\n }\n return this.locale.toLowerCase().startsWith('en-us') ? 0 : 1;\n }\n\n getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n // Luxon returns Mon-first; reorder according to our locale's first day.\n const names = Info.weekdays(style, { locale: this.locale });\n const first = this.getFirstDayOfWeek();\n // Convert Mon-first (index 0 = Mon) to our Sun-first then rotate.\n // Easier: pad to Sun-first using known offset (luxon Mon=0, Sun=6).\n const sunFirst = [names[6], ...names.slice(0, 6)];\n return [...sunFirst.slice(first), ...sunFirst.slice(0, first)];\n }\n\n getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n return Info.months(style, { locale: this.locale });\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { EnvironmentProviders } from '@angular/core';\n\nimport { provideWrDateAdapter } from 'ngwr/date';\n\nimport { WrLuxonAdapter } from './wr-luxon-adapter';\n\n/**\n * Register the {@link WrLuxonAdapter} so date-pickers / calendars in this\n * app use Luxon `DateTime` for all math and formatting. Pass `locale` to\n * override the BCP 47 tag.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideWrLuxonAdapter()],\n * });\n * ```\n */\nexport function provideWrLuxonAdapter(options: { readonly locale?: string } = {}): EnvironmentProviders {\n return provideWrDateAdapter({ adapter: WrLuxonAdapter, locale: options.locale });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA;;;;;AAKG;AAOH,MAAM,cAAc,GAA2C;AAC7D,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,aAAa,EAAE,GAAG;AAClB,IAAA,cAAc,EAAE,IAAI;CACrB;AAED;;;;AAIG;AACH,MAAM,SAAS,GAAqC;AAClD,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,CAAC,EAAE,GAAG;AACN,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,CAAC,EAAE,GAAG;CACP;AAED,MAAM,QAAQ,GAAG,+CAA+C;AAEhE;;;;AAIG;AACH,MAAM,SAAS,GAAG,kBAAkB;AAEpC;;;;;;;;AAQG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAA;AACvC,IAAA,OAAO;SACJ,KAAK,CAAC,SAAS;AACf,SAAA,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC9F,IAAI,CAAC,EAAE,CAAC;AACb;AAEA;;;;;;;;;;;;;AAaG;AAEG,MAAO,cAAe,SAAQ,aAAuB,CAAA;AACxC,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;;IAIhD,KAAK,GAAA;QACH,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9C;AAEA,IAAA,KAAK,CAAC,IAAc,EAAA;QAClB,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACvF;AAEA,IAAA,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAA;;QAEjD,OAAO,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACtF;AAEA,IAAA,OAAO,CAAC,IAAc,EAAA;QACpB,OAAO,IAAI,CAAC,OAAO;IACrB;;AAIA,IAAA,OAAO,CAAC,IAAc,EAAA;QACpB,OAAO,IAAI,CAAC,IAAI;IAClB;AACA,IAAA,QAAQ,CAAC,IAAc,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC;IACvB;AACA,IAAA,OAAO,CAAC,IAAc,EAAA;QACpB,OAAO,IAAI,CAAC,GAAG;IACjB;AACA,IAAA,YAAY,CAAC,IAAc,EAAA;;AAEzB,QAAA,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC;IACzB;AACA,IAAA,cAAc,CAAC,IAAc,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,WAAW,IAAI,EAAE;IAC/B;AACA,IAAA,QAAQ,CAAC,IAAc,EAAA;QACrB,OAAO,IAAI,CAAC,IAAI;IAClB;AACA,IAAA,UAAU,CAAC,IAAc,EAAA;QACvB,OAAO,IAAI,CAAC,MAAM;IACpB;AACA,IAAA,UAAU,CAAC,IAAc,EAAA;QACvB,OAAO,IAAI,CAAC,MAAM;IACpB;;IAIA,QAAQ,CAAC,IAAc,EAAE,MAAc,EAAA;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACrC;IACA,SAAS,CAAC,IAAc,EAAE,MAAc,EAAA;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtC;IACA,OAAO,CAAC,IAAc,EAAE,MAAc,EAAA;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACpC;AACA,IAAA,OAAO,CAAC,IAAc,EAAE,KAAa,EAAE,OAAe,EAAE,OAAe,EAAA;QACrE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACpF;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;IACH,SAAS,CAAC,CAAW,EAAE,CAAW,EAAA;QAChC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG;IACpE;IACA,WAAW,CAAC,CAAW,EAAE,CAAW,EAAA;AAClC,QAAA,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;IACjD;IACA,WAAW,CAAC,CAAW,EAAE,CAAW,EAAA;AAClC,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;AAAE,YAAA,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAC7C,QAAA,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AACjD,QAAA,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;IACtB;;IAIA,MAAM,CAAC,IAAc,EAAE,iBAA+C,EAAA;AACpE,QAAA,IAAI,aAAa,CAAC,iBAAiB,CAAC,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAChF;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAClF;IAEA,KAAK,CAAC,KAAa,EAAE,iBAA+C,EAAA;AAClE,QAAA,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,iBAAiB;AAC7C,cAAE,cAAc,CAAC,iBAAiB;AAClC,cAAE,gBAAgB,CAAC,iBAAiB,CAAC;AACvC,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACzE,OAAO,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI;IACvC;;IAIA,iBAAiB,GAAA;AACf,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAA4D;AACtG,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI;AACnC,YAAA,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC;QACzE;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9D;AAEA,IAAA,iBAAiB,CAAC,KAAkC,EAAA;;AAElD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;;;AAGtC,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,QAAA,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChE;AAEA,IAAA,aAAa,CAAC,KAAkC,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACpD;uGArJW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAd,cAAc,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACnFD;;;;;AAKG;AAQH;;;;;;;;;;;AAWG;AACG,SAAU,qBAAqB,CAAC,OAAA,GAAwC,EAAE,EAAA;AAC9E,IAAA,OAAO,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AAClF;;AC3BA;;AAEG;;"}
|