ngwr 6.1.1 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -3
- package/README.md +179 -32
- package/affix/styles/_index.scss +12 -0
- package/alert/styles/_index.scss +75 -32
- package/anchor/styles/_index.scss +59 -0
- package/aurora/aurora.scss +1 -0
- package/aurora/styles/_index.scss +30 -0
- package/avatar/styles/_index.scss +30 -14
- package/back-top/styles/_index.scss +42 -0
- package/badge/styles/_index.scss +80 -0
- package/badge/styles/_tag.scss +81 -0
- package/bar-chart/styles/_index.scss +56 -0
- package/blur-text/blur-text.scss +1 -0
- package/blur-text/styles/_index.scss +14 -0
- package/border-glow/border-glow.scss +4 -0
- package/border-glow/styles/_index.scss +228 -0
- package/breadcrumbs/breadcrumbs.scss +1 -0
- package/breadcrumbs/styles/_index.scss +76 -0
- package/burger/styles/_index.scss +101 -0
- package/button/styles/_index.scss +148 -125
- package/calendar/styles/_index.scss +252 -0
- package/calendar-heatmap/styles/_index.scss +69 -0
- package/card/card.scss +1 -0
- package/card/styles/_index.scss +96 -0
- package/carousel/styles/_index.scss +102 -0
- package/cascader/cascader.scss +1 -0
- package/cascader/styles/_index.scss +174 -0
- package/checkbox/styles/_index.scss +76 -60
- package/circular-text/circular-text.scss +1 -0
- package/circular-text/styles/_index.scss +45 -0
- package/click-spark/click-spark.scss +1 -0
- package/click-spark/styles/_index.scss +16 -0
- package/collapse/styles/_index.scss +92 -0
- package/color-picker/styles/_index.scss +247 -0
- package/command-palette/styles/_index.scss +188 -0
- package/compare/styles/_index.scss +100 -0
- package/context-menu/styles/_index.scss +112 -0
- package/counter/styles/_index.scss +44 -0
- package/date-picker/styles/_index.scss +204 -0
- package/decrypt-text/decrypt-text.scss +1 -0
- package/decrypt-text/styles/_index.scss +26 -0
- package/density/styles/_index.scss +37 -0
- package/descriptions/styles/_index.scss +104 -0
- package/dialog/styles/_index.scss +101 -27
- package/divider/styles/_index.scss +43 -24
- package/donut-chart/styles/_index.scss +76 -0
- package/drag-drop/sortable-list.scss +1 -0
- package/drag-drop/styles/_index.scss +99 -0
- package/drawer/styles/_index.scss +164 -0
- package/dropdown/styles/_index.scss +76 -56
- package/empty/styles/_index.scss +49 -0
- package/falling-text/falling-text.scss +1 -0
- package/falling-text/styles/_index.scss +30 -0
- package/fesm2022/ngwr-affix.mjs +102 -0
- package/fesm2022/ngwr-affix.mjs.map +1 -0
- package/fesm2022/ngwr-alert.mjs +70 -52
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +103 -0
- package/fesm2022/ngwr-anchor.mjs.map +1 -0
- package/fesm2022/ngwr-aurora.mjs +309 -0
- package/fesm2022/ngwr-aurora.mjs.map +1 -0
- package/fesm2022/ngwr-avatar.mjs +81 -71
- package/fesm2022/ngwr-avatar.mjs.map +1 -1
- package/fesm2022/ngwr-back-top.mjs +81 -0
- package/fesm2022/ngwr-back-top.mjs.map +1 -0
- package/fesm2022/ngwr-badge.mjs +192 -0
- package/fesm2022/ngwr-badge.mjs.map +1 -0
- package/fesm2022/ngwr-bar-chart.mjs +69 -0
- package/fesm2022/ngwr-bar-chart.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text.mjs +181 -0
- package/fesm2022/ngwr-blur-text.mjs.map +1 -0
- package/fesm2022/ngwr-border-glow.mjs +278 -0
- package/fesm2022/ngwr-border-glow.mjs.map +1 -0
- package/fesm2022/ngwr-breadcrumbs.mjs +101 -0
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -0
- package/fesm2022/ngwr-burger.mjs +60 -0
- package/fesm2022/ngwr-burger.mjs.map +1 -0
- package/fesm2022/ngwr-button.mjs +179 -104
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +145 -0
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -0
- package/fesm2022/ngwr-calendar.mjs +402 -0
- package/fesm2022/ngwr-calendar.mjs.map +1 -0
- package/fesm2022/ngwr-card.mjs +100 -0
- package/fesm2022/ngwr-card.mjs.map +1 -0
- package/fesm2022/ngwr-carousel.mjs +128 -0
- package/fesm2022/ngwr-carousel.mjs.map +1 -0
- package/fesm2022/ngwr-cascader.mjs +280 -0
- package/fesm2022/ngwr-cascader.mjs.map +1 -0
- package/fesm2022/ngwr-checkbox.mjs +214 -54
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +168 -0
- package/fesm2022/ngwr-circular-text.mjs.map +1 -0
- package/fesm2022/ngwr-click-spark.mjs +163 -0
- package/fesm2022/ngwr-click-spark.mjs.map +1 -0
- package/fesm2022/ngwr-clipboard.mjs +130 -0
- package/fesm2022/ngwr-clipboard.mjs.map +1 -0
- package/fesm2022/ngwr-collapse.mjs +232 -0
- package/fesm2022/ngwr-collapse.mjs.map +1 -0
- package/fesm2022/ngwr-color-picker.mjs +646 -0
- package/fesm2022/ngwr-color-picker.mjs.map +1 -0
- package/fesm2022/ngwr-command-palette.mjs +259 -0
- package/fesm2022/ngwr-command-palette.mjs.map +1 -0
- package/fesm2022/ngwr-compare.mjs +137 -0
- package/fesm2022/ngwr-compare.mjs.map +1 -0
- package/fesm2022/ngwr-confetti.mjs +160 -0
- package/fesm2022/ngwr-confetti.mjs.map +1 -0
- package/fesm2022/ngwr-context-menu.mjs +653 -0
- package/fesm2022/ngwr-context-menu.mjs.map +1 -0
- package/fesm2022/ngwr-cookie.mjs +127 -0
- package/fesm2022/ngwr-cookie.mjs.map +1 -0
- package/fesm2022/ngwr-counter.mjs +415 -0
- package/fesm2022/ngwr-counter.mjs.map +1 -0
- package/fesm2022/ngwr-date-adapter-fns.mjs +180 -0
- package/fesm2022/ngwr-date-adapter-fns.mjs.map +1 -0
- package/fesm2022/ngwr-date-adapter-luxon.mjs +201 -0
- package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -0
- package/fesm2022/ngwr-date-adapter.mjs +419 -0
- package/fesm2022/ngwr-date-adapter.mjs.map +1 -0
- package/fesm2022/ngwr-date-picker.mjs +624 -0
- package/fesm2022/ngwr-date-picker.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text.mjs +396 -0
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -0
- package/fesm2022/ngwr-density.mjs +157 -0
- package/fesm2022/ngwr-density.mjs.map +1 -0
- package/fesm2022/ngwr-descriptions.mjs +83 -0
- package/fesm2022/ngwr-descriptions.mjs.map +1 -0
- package/fesm2022/ngwr-dialog.mjs +249 -377
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +315 -0
- package/fesm2022/ngwr-directives.mjs.map +1 -0
- package/fesm2022/ngwr-divider.mjs +74 -59
- package/fesm2022/ngwr-divider.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart.mjs +131 -0
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -0
- package/fesm2022/ngwr-drag-drop.mjs +117 -0
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -0
- package/fesm2022/ngwr-drawer.mjs +315 -0
- package/fesm2022/ngwr-drawer.mjs.map +1 -0
- package/fesm2022/ngwr-dropdown.mjs +276 -229
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +57 -0
- package/fesm2022/ngwr-empty.mjs.map +1 -0
- package/fesm2022/ngwr-falling-text.mjs +316 -0
- package/fesm2022/ngwr-falling-text.mjs.map +1 -0
- package/fesm2022/ngwr-file-upload.mjs +260 -0
- package/fesm2022/ngwr-file-upload.mjs.map +1 -0
- package/fesm2022/ngwr-form.mjs +133 -48
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +373 -0
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -0
- package/fesm2022/ngwr-gauge.mjs +83 -0
- package/fesm2022/ngwr-gauge.mjs.map +1 -0
- package/fesm2022/ngwr-glitch-text.mjs +67 -0
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -0
- package/fesm2022/ngwr-gradient-text.mjs +109 -0
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -0
- package/fesm2022/ngwr-hotkey.mjs +263 -0
- package/fesm2022/ngwr-hotkey.mjs.map +1 -0
- package/fesm2022/ngwr-i18n-en.mjs +168 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -0
- package/fesm2022/ngwr-i18n-ru.mjs +156 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -0
- package/fesm2022/ngwr-i18n.mjs +478 -0
- package/fesm2022/ngwr-i18n.mjs.map +1 -0
- package/fesm2022/ngwr-icon-adapters-feather.mjs +74 -0
- package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -0
- package/fesm2022/ngwr-icon-adapters-lucide.mjs +88 -0
- package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -0
- package/fesm2022/ngwr-icon.mjs +189 -649
- package/fesm2022/ngwr-icon.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +299 -0
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -0
- package/fesm2022/ngwr-input-number.mjs +239 -0
- package/fesm2022/ngwr-input-number.mjs.map +1 -0
- package/fesm2022/ngwr-input-otp.mjs +216 -0
- package/fesm2022/ngwr-input-otp.mjs.map +1 -0
- package/fesm2022/ngwr-input.mjs +183 -104
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-keyboard.mjs +47 -0
- package/fesm2022/ngwr-keyboard.mjs.map +1 -0
- package/fesm2022/ngwr-knob.mjs +227 -0
- package/fesm2022/ngwr-knob.mjs.map +1 -0
- package/fesm2022/ngwr-layout.mjs +197 -0
- package/fesm2022/ngwr-layout.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox.mjs +131 -0
- package/fesm2022/ngwr-lightbox.mjs.map +1 -0
- package/fesm2022/ngwr-line-chart.mjs +176 -0
- package/fesm2022/ngwr-line-chart.mjs.map +1 -0
- package/fesm2022/ngwr-list.mjs +132 -0
- package/fesm2022/ngwr-list.mjs.map +1 -0
- package/fesm2022/ngwr-loading-bar.mjs +160 -0
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -0
- package/fesm2022/ngwr-marquee.mjs +224 -0
- package/fesm2022/ngwr-marquee.mjs.map +1 -0
- package/fesm2022/ngwr-media.mjs +132 -0
- package/fesm2022/ngwr-media.mjs.map +1 -0
- package/fesm2022/ngwr-mention.mjs +374 -0
- package/fesm2022/ngwr-mention.mjs.map +1 -0
- package/fesm2022/ngwr-meta.mjs +323 -0
- package/fesm2022/ngwr-meta.mjs.map +1 -0
- package/fesm2022/ngwr-meter-group.mjs +73 -0
- package/fesm2022/ngwr-meter-group.mjs.map +1 -0
- package/fesm2022/ngwr-overlay.mjs +145 -0
- package/fesm2022/ngwr-overlay.mjs.map +1 -0
- package/fesm2022/ngwr-page-header.mjs +53 -0
- package/fesm2022/ngwr-page-header.mjs.map +1 -0
- package/fesm2022/ngwr-pagination.mjs +152 -96
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +290 -11
- package/fesm2022/ngwr-pipes.mjs.map +1 -1
- package/fesm2022/ngwr-platform.mjs +63 -0
- package/fesm2022/ngwr-platform.mjs.map +1 -0
- package/fesm2022/ngwr-popconfirm.mjs +188 -0
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -0
- package/fesm2022/ngwr-popover.mjs +365 -0
- package/fesm2022/ngwr-popover.mjs.map +1 -0
- package/fesm2022/ngwr-progress.mjs +47 -39
- package/fesm2022/ngwr-progress.mjs.map +1 -1
- package/fesm2022/ngwr-qr.mjs +160 -179
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +204 -0
- package/fesm2022/ngwr-radio.mjs.map +1 -0
- package/fesm2022/ngwr-rating.mjs +180 -0
- package/fesm2022/ngwr-rating.mjs.map +1 -0
- package/fesm2022/ngwr-result.mjs +119 -0
- package/fesm2022/ngwr-result.mjs.map +1 -0
- package/fesm2022/ngwr-rotating-text.mjs +256 -0
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -0
- package/fesm2022/ngwr-scramble-text.mjs +165 -0
- package/fesm2022/ngwr-scramble-text.mjs.map +1 -0
- package/fesm2022/ngwr-scroll.mjs +107 -0
- package/fesm2022/ngwr-scroll.mjs.map +1 -0
- package/fesm2022/ngwr-segmented.mjs +96 -0
- package/fesm2022/ngwr-segmented.mjs.map +1 -0
- package/fesm2022/ngwr-select.mjs +844 -309
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +127 -0
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -0
- package/fesm2022/ngwr-sidebar.mjs +134 -0
- package/fesm2022/ngwr-sidebar.mjs.map +1 -0
- package/fesm2022/ngwr-skeleton.mjs +59 -34
- package/fesm2022/ngwr-skeleton.mjs.map +1 -1
- package/fesm2022/ngwr-slider.mjs +234 -0
- package/fesm2022/ngwr-slider.mjs.map +1 -0
- package/fesm2022/ngwr-sparkline.mjs +104 -0
- package/fesm2022/ngwr-sparkline.mjs.map +1 -0
- package/fesm2022/ngwr-speed-dial.mjs +79 -0
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -0
- package/fesm2022/ngwr-spinner.mjs +34 -28
- package/fesm2022/ngwr-spinner.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor.mjs +970 -0
- package/fesm2022/ngwr-splash-cursor.mjs.map +1 -0
- package/fesm2022/ngwr-split-text.mjs +200 -0
- package/fesm2022/ngwr-split-text.mjs.map +1 -0
- package/fesm2022/ngwr-splitter.mjs +125 -0
- package/fesm2022/ngwr-splitter.mjs.map +1 -0
- package/fesm2022/ngwr-spotlight-card.mjs +138 -0
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -0
- package/fesm2022/ngwr-squircle.mjs +320 -0
- package/fesm2022/ngwr-squircle.mjs.map +1 -0
- package/fesm2022/ngwr-star-border.mjs +72 -0
- package/fesm2022/ngwr-star-border.mjs.map +1 -0
- package/fesm2022/ngwr-statistic.mjs +220 -0
- package/fesm2022/ngwr-statistic.mjs.map +1 -0
- package/fesm2022/ngwr-stepper.mjs +186 -0
- package/fesm2022/ngwr-stepper.mjs.map +1 -0
- package/fesm2022/ngwr-storage.mjs +317 -0
- package/fesm2022/ngwr-storage.mjs.map +1 -0
- package/fesm2022/ngwr-switch.mjs +99 -0
- package/fesm2022/ngwr-switch.mjs.map +1 -0
- package/fesm2022/ngwr-table.mjs +217 -206
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +217 -0
- package/fesm2022/ngwr-tabs.mjs.map +1 -0
- package/fesm2022/ngwr-textarea.mjs +106 -120
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +152 -0
- package/fesm2022/ngwr-theme.mjs.map +1 -0
- package/fesm2022/ngwr-tilt-card.mjs +137 -0
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -0
- package/fesm2022/ngwr-timeline.mjs +73 -0
- package/fesm2022/ngwr-timeline.mjs.map +1 -0
- package/fesm2022/ngwr-toast.mjs +446 -0
- package/fesm2022/ngwr-toast.mjs.map +1 -0
- package/fesm2022/ngwr-toolbar.mjs +46 -0
- package/fesm2022/ngwr-toolbar.mjs.map +1 -0
- package/fesm2022/ngwr-tree.mjs +483 -0
- package/fesm2022/ngwr-tree.mjs.map +1 -0
- package/fesm2022/ngwr-typewriter.mjs +229 -0
- package/fesm2022/ngwr-typewriter.mjs.map +1 -0
- package/fesm2022/ngwr-typography.mjs +79 -0
- package/fesm2022/ngwr-typography.mjs.map +1 -0
- package/fesm2022/ngwr-utils.mjs +535 -0
- package/fesm2022/ngwr-utils.mjs.map +1 -0
- package/fesm2022/ngwr-validators.mjs +214 -0
- package/fesm2022/ngwr-validators.mjs.map +1 -0
- package/fesm2022/ngwr-version.mjs +51 -0
- package/fesm2022/ngwr-version.mjs.map +1 -0
- package/fesm2022/ngwr-virtual-scroll.mjs +99 -0
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -0
- package/fesm2022/ngwr-waves.mjs +356 -0
- package/fesm2022/ngwr-waves.mjs.map +1 -0
- package/fesm2022/ngwr-window.mjs +1141 -0
- package/fesm2022/ngwr-window.mjs.map +1 -0
- package/fesm2022/ngwr.mjs +0 -3
- package/fesm2022/ngwr.mjs.map +1 -1
- package/file-upload/styles/_index.scss +152 -0
- package/form/styles/_index.scss +85 -42
- package/gauge/styles/_index.scss +37 -0
- package/glitch-text/glitch-text.scss +1 -0
- package/glitch-text/styles/_index.scss +144 -0
- package/gradient-text/gradient-text.scss +1 -0
- package/gradient-text/styles/_index.scss +113 -0
- package/icon/styles/_index.scss +21 -15
- package/image-cropper/styles/_index.scss +114 -0
- package/input/styles/_index.scss +133 -93
- package/input-number/styles/_index.scss +75 -0
- package/input-otp/styles/_index.scss +53 -0
- package/keyboard/styles/_index.scss +55 -0
- package/knob/styles/_index.scss +54 -0
- package/layout/styles/_index.scss +65 -0
- package/lightbox/lightbox.scss +1 -0
- package/lightbox/styles/_index.scss +144 -0
- package/line-chart/styles/_index.scss +93 -0
- package/list/list.scss +1 -0
- package/list/styles/_index.scss +101 -0
- package/loading-bar/loading-bar.scss +1 -0
- package/loading-bar/styles/_index.scss +29 -0
- package/marquee/marquee.scss +1 -0
- package/marquee/styles/_index.scss +138 -0
- package/mention/styles/_index.scss +47 -0
- package/meter-group/styles/_index.scss +61 -0
- package/package.json +586 -104
- package/page-header/styles/_index.scss +78 -0
- package/pagination/styles/_index.scss +89 -34
- package/popconfirm/styles/_index.scss +32 -0
- package/popover/styles/_index.scss +99 -0
- package/progress/styles/_index.scss +29 -14
- package/qr/styles/_index.scss +6 -3
- package/radio/styles/_index.scss +111 -0
- package/rating/styles/_index.scss +63 -0
- package/result/styles/_index.scss +69 -0
- package/rotating-text/rotating-text.scss +1 -0
- package/rotating-text/styles/_index.scss +39 -0
- package/schematics/collection.json +37 -0
- package/schematics/component-style/index.js +49 -0
- package/{cdk/utils/index.d.ts → schematics/component-style/schema.js} +2 -8
- package/schematics/component-style/schema.json +20 -0
- package/schematics/icon-set/index.js +96 -0
- package/schematics/icon-set/schema.js +8 -0
- package/schematics/icon-set/schema.json +39 -0
- package/schematics/migrations/v7/index.js +187 -0
- package/schematics/migrations.json +10 -0
- package/schematics/ng-add/index.js +180 -0
- package/schematics/ng-add/schema.js +8 -0
- package/schematics/ng-add/schema.json +80 -0
- package/schematics/page/index.js +63 -0
- package/schematics/page/schema.js +8 -0
- package/schematics/page/schema.json +39 -0
- package/schematics/page/templates.js +198 -0
- package/schematics/provider/index.js +126 -0
- package/schematics/provider/schema.js +8 -0
- package/schematics/provider/schema.json +52 -0
- package/schematics/use/index.js +143 -0
- package/schematics/use/schema.js +8 -0
- package/schematics/use/schema.json +25 -0
- package/schematics/use/symbol-map.json +357 -0
- package/scramble-text/scramble-text.scss +1 -0
- package/scramble-text/styles/_index.scss +8 -0
- package/segmented/styles/_index.scss +92 -0
- package/select/styles/_index.scss +245 -159
- package/shiny-text/shiny-text.scss +1 -0
- package/shiny-text/styles/_index.scss +101 -0
- package/sidebar/styles/_index.scss +208 -0
- package/skeleton/styles/_index.scss +33 -33
- package/slider/styles/_index.scss +77 -0
- package/sparkline/styles/_index.scss +9 -0
- package/speed-dial/styles/_index.scss +158 -0
- package/spinner/styles/_index.scss +38 -22
- package/splash-cursor/splash-cursor.scss +1 -0
- package/splash-cursor/styles/_index.scss +27 -0
- package/split-text/split-text.scss +1 -0
- package/split-text/styles/_index.scss +22 -0
- package/splitter/styles/_index.scss +85 -0
- package/spotlight-card/spotlight-card.scss +1 -0
- package/spotlight-card/styles/_index.scss +43 -0
- package/squircle/styles/_index.scss +34 -0
- package/star-border/star-border.scss +1 -0
- package/star-border/styles/_index.scss +118 -0
- package/statistic/styles/_index.scss +54 -0
- package/stepper/styles/_index.scss +162 -0
- package/styles/_animations.scss +198 -0
- package/styles/_breakpoints.scss +75 -0
- package/styles/_grid.scss +71 -0
- package/styles/_reset.scss +123 -0
- package/styles/_typography.scss +122 -0
- package/styles.scss +103 -13
- package/switch/styles/_index.scss +82 -0
- package/table/styles/_index.scss +255 -4
- package/tabs/styles/_index.scss +71 -0
- package/textarea/styles/_index.scss +47 -56
- package/theme/styles/_colors.scss +83 -0
- package/theme/styles/_dark.scss +85 -0
- package/theme/styles/_focus.scss +93 -0
- package/theme/styles/_index.scss +5 -0
- package/theme/styles/_mixins.scss +57 -0
- package/theme/styles/_variables.scss +118 -0
- package/tilt-card/styles/_index.scss +40 -0
- package/tilt-card/tilt-card.scss +1 -0
- package/timeline/styles/_index.scss +127 -0
- package/toast/styles/_index.scss +263 -0
- package/toolbar/styles/_index.scss +65 -0
- package/tree/styles/_index.scss +271 -0
- package/types/ngwr-affix.d.ts +43 -0
- package/types/ngwr-alert.d.ts +68 -0
- package/types/ngwr-anchor.d.ts +53 -0
- package/types/ngwr-aurora.d.ts +52 -0
- package/types/ngwr-avatar.d.ts +90 -0
- package/types/ngwr-back-top.d.ts +37 -0
- package/types/ngwr-badge.d.ts +158 -0
- package/types/ngwr-bar-chart.d.ts +47 -0
- package/types/ngwr-blur-text.d.ts +62 -0
- package/types/ngwr-border-glow.d.ts +66 -0
- package/types/ngwr-breadcrumbs.d.ts +61 -0
- package/types/ngwr-burger.d.ts +36 -0
- package/types/ngwr-button.d.ts +176 -0
- package/types/ngwr-calendar-heatmap.d.ts +58 -0
- package/types/ngwr-calendar.d.ts +116 -0
- package/types/ngwr-card.d.ts +50 -0
- package/types/ngwr-carousel.d.ts +57 -0
- package/types/ngwr-cascader.d.ts +107 -0
- package/types/ngwr-checkbox.d.ts +139 -0
- package/types/ngwr-circular-text.d.ts +49 -0
- package/types/ngwr-click-spark.d.ts +52 -0
- package/types/ngwr-clipboard.d.ts +53 -0
- package/types/ngwr-collapse.d.ts +139 -0
- package/types/ngwr-color-picker.d.ts +302 -0
- package/types/ngwr-command-palette.d.ts +113 -0
- package/types/ngwr-compare.d.ts +55 -0
- package/types/ngwr-confetti.d.ts +70 -0
- package/types/ngwr-context-menu.d.ts +207 -0
- package/types/ngwr-cookie.d.ts +60 -0
- package/types/ngwr-counter.d.ts +182 -0
- package/types/ngwr-date-adapter-fns.d.ts +73 -0
- package/types/ngwr-date-adapter-luxon.d.ts +73 -0
- package/types/ngwr-date-adapter.d.ts +198 -0
- package/types/ngwr-date-picker.d.ts +117 -0
- package/types/ngwr-decrypt-text.d.ts +85 -0
- package/types/ngwr-density.d.ts +97 -0
- package/types/ngwr-descriptions.d.ts +41 -0
- package/types/ngwr-dialog.d.ts +210 -0
- package/types/ngwr-directives.d.ts +125 -0
- package/types/ngwr-divider.d.ts +73 -0
- package/types/ngwr-donut-chart.d.ts +53 -0
- package/types/ngwr-drag-drop.d.ts +83 -0
- package/types/ngwr-drawer.d.ts +155 -0
- package/types/ngwr-dropdown.d.ts +124 -0
- package/types/ngwr-empty.d.ts +38 -0
- package/types/ngwr-falling-text.d.ts +63 -0
- package/types/ngwr-file-upload.d.ts +94 -0
- package/types/ngwr-form.d.ts +95 -0
- package/types/ngwr-fuzzy-text.d.ts +74 -0
- package/types/ngwr-gauge.d.ts +39 -0
- package/types/ngwr-glitch-text.d.ts +31 -0
- package/types/ngwr-gradient-text.d.ts +46 -0
- package/types/ngwr-hotkey.d.ts +142 -0
- package/types/ngwr-i18n-en.d.ts +18 -0
- package/types/ngwr-i18n-ru.d.ts +6 -0
- package/types/ngwr-i18n.d.ts +336 -0
- package/types/ngwr-icon-adapters-feather.d.ts +44 -0
- package/types/ngwr-icon-adapters-lucide.d.ts +54 -0
- package/types/ngwr-icon.d.ts +180 -0
- package/types/ngwr-image-cropper.d.ts +110 -0
- package/types/ngwr-input-number.d.ts +77 -0
- package/types/ngwr-input-otp.d.ts +78 -0
- package/types/ngwr-input.d.ts +131 -0
- package/types/ngwr-keyboard.d.ts +34 -0
- package/types/ngwr-knob.d.ts +77 -0
- package/types/ngwr-layout.d.ts +89 -0
- package/types/ngwr-lightbox.d.ts +50 -0
- package/types/ngwr-line-chart.d.ts +90 -0
- package/types/ngwr-list.d.ts +71 -0
- package/types/ngwr-loading-bar.d.ts +79 -0
- package/types/ngwr-marquee.d.ts +95 -0
- package/types/ngwr-media.d.ts +74 -0
- package/types/ngwr-mention.d.ts +110 -0
- package/types/ngwr-meta.d.ts +188 -0
- package/types/ngwr-meter-group.d.ts +57 -0
- package/types/ngwr-overlay.d.ts +110 -0
- package/types/ngwr-page-header.d.ts +35 -0
- package/types/ngwr-pagination.d.ts +119 -0
- package/types/ngwr-pipes.d.ts +177 -0
- package/types/ngwr-platform.d.ts +38 -0
- package/types/ngwr-popconfirm.d.ts +79 -0
- package/types/ngwr-popover.d.ts +90 -0
- package/types/ngwr-progress.d.ts +33 -0
- package/types/ngwr-qr.d.ts +56 -0
- package/types/ngwr-radio.d.ts +120 -0
- package/types/ngwr-rating.d.ts +62 -0
- package/types/ngwr-result.d.ts +64 -0
- package/types/ngwr-rotating-text.d.ts +72 -0
- package/types/ngwr-scramble-text.d.ts +49 -0
- package/types/ngwr-scroll.d.ts +65 -0
- package/types/ngwr-segmented.d.ts +65 -0
- package/types/ngwr-select.d.ts +413 -0
- package/types/ngwr-shiny-text.d.ts +70 -0
- package/types/ngwr-sidebar.d.ts +83 -0
- package/types/ngwr-skeleton.d.ts +41 -0
- package/types/ngwr-slider.d.ts +86 -0
- package/types/ngwr-sparkline.d.ts +48 -0
- package/types/ngwr-speed-dial.d.ts +51 -0
- package/types/ngwr-spinner.d.ts +41 -0
- package/types/ngwr-splash-cursor.d.ts +94 -0
- package/types/ngwr-split-text.d.ts +83 -0
- package/types/ngwr-splitter.d.ts +52 -0
- package/types/ngwr-spotlight-card.d.ts +71 -0
- package/types/ngwr-squircle.d.ts +132 -0
- package/types/ngwr-star-border.d.ts +40 -0
- package/types/ngwr-statistic.d.ts +88 -0
- package/types/ngwr-stepper.d.ts +99 -0
- package/types/ngwr-storage.d.ts +178 -0
- package/types/ngwr-switch.d.ts +39 -0
- package/types/ngwr-table.d.ts +237 -0
- package/types/ngwr-tabs.d.ts +125 -0
- package/types/ngwr-textarea.d.ts +60 -0
- package/types/ngwr-theme.d.ts +124 -0
- package/types/ngwr-tilt-card.d.ts +63 -0
- package/types/ngwr-timeline.d.ts +40 -0
- package/types/ngwr-toast.d.ts +230 -0
- package/types/ngwr-toolbar.d.ts +30 -0
- package/types/ngwr-tree.d.ts +150 -0
- package/types/ngwr-typewriter.d.ts +84 -0
- package/types/ngwr-typography.d.ts +56 -0
- package/types/ngwr-utils.d.ts +447 -0
- package/types/ngwr-validators.d.ts +70 -0
- package/types/ngwr-version.d.ts +44 -0
- package/types/ngwr-virtual-scroll.d.ts +64 -0
- package/types/ngwr-waves.d.ts +71 -0
- package/types/ngwr-window.d.ts +437 -0
- package/typewriter/styles/_index.scss +33 -0
- package/typewriter/typewriter.scss +1 -0
- package/typography/styles/_index.scss +211 -0
- package/virtual-scroll/styles/_index.scss +27 -0
- package/virtual-scroll/virtual-scroll.scss +1 -0
- package/waves/styles/_index.scss +24 -0
- package/waves/waves.scss +1 -0
- package/window/styles/_index.scss +430 -0
- package/alert/index.d.ts +0 -32
- package/alert/styles/theming.scss +0 -26
- package/alert/styles/vars.scss +0 -11
- package/avatar/index.d.ts +0 -30
- package/button/index.d.ts +0 -45
- package/button/styles/vars.scss +0 -13
- package/cdk/index.d.ts +0 -24
- package/cdk/rxjs/index.d.ts +0 -40
- package/cdk/types/index.d.ts +0 -27
- package/checkbox/index.d.ts +0 -31
- package/checkbox/styles/vars.scss +0 -16
- package/dialog/index.d.ts +0 -193
- package/dialog/styles/vars.scss +0 -7
- package/divider/index.d.ts +0 -16
- package/dropdown/index.d.ts +0 -68
- package/dropdown/styles/vars.scss +0 -18
- package/fesm2022/ngwr-cdk-rxjs.mjs +0 -53
- package/fesm2022/ngwr-cdk-rxjs.mjs.map +0 -1
- package/fesm2022/ngwr-cdk-types.mjs +0 -44
- package/fesm2022/ngwr-cdk-types.mjs.map +0 -1
- package/fesm2022/ngwr-cdk-utils.mjs +0 -30
- package/fesm2022/ngwr-cdk-utils.mjs.map +0 -1
- package/fesm2022/ngwr-cdk.mjs +0 -46
- package/fesm2022/ngwr-cdk.mjs.map +0 -1
- package/fesm2022/ngwr-tag.mjs +0 -87
- package/fesm2022/ngwr-tag.mjs.map +0 -1
- package/form/index.d.ts +0 -28
- package/icon/index.d.ts +0 -830
- package/icon/styles/vars.scss +0 -3
- package/input/index.d.ts +0 -43
- package/input/styles/vars.scss +0 -17
- package/pagination/index.d.ts +0 -34
- package/pagination/styles/vars.scss +0 -14
- package/pipes/index.d.ts +0 -17
- package/progress/index.d.ts +0 -13
- package/progress/styles/theming.scss +0 -8
- package/progress/styles/vars.scss +0 -6
- package/qr/index.d.ts +0 -127
- package/select/index.d.ts +0 -121
- package/select/styles/vars.scss +0 -32
- package/skeleton/index.d.ts +0 -13
- package/spinner/index.d.ts +0 -23
- package/styles/animations.scss +0 -92
- package/styles/cdk.scss +0 -5
- package/styles/colors.scss +0 -72
- package/styles/grid.scss +0 -99
- package/styles/maps.scss +0 -31
- package/styles/reset.scss +0 -112
- package/styles/variables.scss +0 -72
- package/table/index.d.ts +0 -101
- package/table/styles/table-filter.scss +0 -202
- package/table/styles/table-sort.scss +0 -47
- package/table/styles/table.scss +0 -232
- package/table/styles/vars.scss +0 -21
- package/tag/index.d.ts +0 -24
- package/tag/styles/_index.scss +0 -32
- package/tag/styles/theming.scss +0 -21
- package/tag/styles/vars.scss +0 -12
- package/textarea/index.d.ts +0 -47
- package/textarea/styles/vars.scss +0 -17
- /package/{index.d.ts → types/ngwr.d.ts} +0 -0
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Type guard that checks if a value is neither `null` nor `undefined`.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const maybeValue: Maybe<number> = getValue();
|
|
15
|
+
*
|
|
16
|
+
* if (isDefined(maybeValue)) {
|
|
17
|
+
* // here maybeValue is number
|
|
18
|
+
* console.log(maybeValue.toFixed(2));
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @see {@link Maybe}
|
|
23
|
+
*/
|
|
24
|
+
function isDefined(value) {
|
|
25
|
+
return value !== null && value !== undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @license
|
|
30
|
+
*
|
|
31
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
32
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Type guard that checks if a value is an array with at least one element.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const items: Maybe<string[]> = getItems();
|
|
40
|
+
*
|
|
41
|
+
* if (isNonEmptyArray(items)) {
|
|
42
|
+
* // items is string[]
|
|
43
|
+
* console.log(items[0]);
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
function isNonEmptyArray(value) {
|
|
48
|
+
return Array.isArray(value) && value.length > 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @license
|
|
53
|
+
*
|
|
54
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
55
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* Type guard that checks whether a value looks like an RxJS `Observable`.
|
|
59
|
+
*
|
|
60
|
+
* Uses duck-typing: verifies that the object has a `subscribe` function.
|
|
61
|
+
* Does not require an actual `Observable` instance.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* if (isObservable(stream)) {
|
|
66
|
+
* stream.subscribe(value => console.log(value));
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
function isObservable(value) {
|
|
71
|
+
return !!value && typeof value.subscribe === 'function';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Clamps `value` into the inclusive `[min, max]` range.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* clamp(140, 0, 100); // 100
|
|
80
|
+
* clamp(-3, 0, 100); // 0
|
|
81
|
+
* clamp(42, 0, 100); // 42
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
function clamp(value, min, max) {
|
|
85
|
+
return Math.min(max, Math.max(min, value));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Rounds `value` to `decimals` fraction digits, compensating the usual
|
|
90
|
+
* floating point drift (`0.1 + 0.2` rounds to `0.3`, not `0.30000000000000004`).
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* round(0.1 + 0.2, 2); // 0.3
|
|
95
|
+
* round(1.005, 2); // 1.01
|
|
96
|
+
* round(7.4); // 7
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
function round(value, decimals = 0) {
|
|
100
|
+
const factor = 10 ** decimals;
|
|
101
|
+
return Math.round((value + Number.EPSILON) * factor) / factor;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Input-transform factory: coerces any bound value to a number, falling
|
|
106
|
+
* back to `fallback` for `null` / `undefined` / unparsable input. The
|
|
107
|
+
* standard transform for numeric `input()`s across ngwr.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* readonly speed = input(4, { transform: numAttr(4) });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
const numAttr = (fallback) => (value) => coerceNumberProperty(value, fallback);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @license
|
|
118
|
+
*
|
|
119
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
120
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
121
|
+
*/
|
|
122
|
+
/**
|
|
123
|
+
* Reads the root font size (in pixels) from
|
|
124
|
+
* `getComputedStyle(document.documentElement).fontSize`.
|
|
125
|
+
*
|
|
126
|
+
* Typical use case: converting `rem` values to pixels for layout calculations.
|
|
127
|
+
*
|
|
128
|
+
* Falls back to the provided value when:
|
|
129
|
+
* - DOM is not available (SSR);
|
|
130
|
+
* - `getComputedStyle` fails or returns an unparseable value.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* const rootFontSize = getRootFontSize(); // e.g. 16
|
|
135
|
+
* const customFallback = getRootFontSize(14); // uses 14 if DOM is unavailable
|
|
136
|
+
* ```
|
|
137
|
+
*
|
|
138
|
+
* @param fallback - Value in pixels when DOM is unavailable. Defaults to `16`.
|
|
139
|
+
* @returns Root font size in pixels.
|
|
140
|
+
*/
|
|
141
|
+
function getRootFontSize(fallback = 16) {
|
|
142
|
+
try {
|
|
143
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
144
|
+
return fallback;
|
|
145
|
+
}
|
|
146
|
+
const raw = window.getComputedStyle(document.documentElement).fontSize;
|
|
147
|
+
const parsed = Number.parseFloat(raw);
|
|
148
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return fallback;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @license
|
|
157
|
+
*
|
|
158
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
159
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
160
|
+
*/
|
|
161
|
+
const FOCUSABLE_SELECTOR = [
|
|
162
|
+
'a[href]',
|
|
163
|
+
'area[href]',
|
|
164
|
+
'button:not([disabled])',
|
|
165
|
+
'input:not([disabled]):not([type="hidden"])',
|
|
166
|
+
'select:not([disabled])',
|
|
167
|
+
'textarea:not([disabled])',
|
|
168
|
+
'iframe',
|
|
169
|
+
'object',
|
|
170
|
+
'embed',
|
|
171
|
+
'audio[controls]',
|
|
172
|
+
'video[controls]',
|
|
173
|
+
'[contenteditable]:not([contenteditable="false"])',
|
|
174
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
175
|
+
].join(',');
|
|
176
|
+
/** Return every focusable descendant of `root` in DOM order. */
|
|
177
|
+
function getFocusableElements(root) {
|
|
178
|
+
return Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR)).filter(el => el.offsetParent !== null || el === document.activeElement);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Trap Tab navigation inside `root` for a keyboard event — call from a
|
|
182
|
+
* `keydown` handler. Cycles focus from first ↔ last focusable element.
|
|
183
|
+
* Returns `true` when focus was redirected (event was handled).
|
|
184
|
+
*/
|
|
185
|
+
function trapFocus(root, event) {
|
|
186
|
+
if (event.key !== 'Tab')
|
|
187
|
+
return false;
|
|
188
|
+
const focusable = getFocusableElements(root);
|
|
189
|
+
if (focusable.length === 0)
|
|
190
|
+
return false;
|
|
191
|
+
const first = focusable[0];
|
|
192
|
+
const last = focusable[focusable.length - 1];
|
|
193
|
+
const active = document.activeElement;
|
|
194
|
+
if (event.shiftKey && active === first) {
|
|
195
|
+
event.preventDefault();
|
|
196
|
+
last.focus();
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
if (!event.shiftKey && active === last) {
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
first.focus();
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @license
|
|
209
|
+
*
|
|
210
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
211
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
212
|
+
*/
|
|
213
|
+
/**
|
|
214
|
+
* Resolves a raw size value into a CSS string and an optional pixel equivalent.
|
|
215
|
+
*
|
|
216
|
+
* Supported formats:
|
|
217
|
+
* - `number` → pixels (`48` → `"48px"`)
|
|
218
|
+
* - `"12px"` → pixels (`"12px"` → `"12px"`)
|
|
219
|
+
* - `"3rem"` → rems via root (`"3rem"` → `"3rem"`, pxValue = 3 × root font size)
|
|
220
|
+
* - `"80%"` → percentage (`"80%"` → `"80%"`, pxValue = null)
|
|
221
|
+
* - `"15"` → pixels (`"15"` → `"15px"`)
|
|
222
|
+
* - anything else → passed through as-is, pxValue = null
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts
|
|
226
|
+
* const size = resolveCssSize('3rem', { defaultValue: '6rem' });
|
|
227
|
+
* // size.cssValue === '3rem'
|
|
228
|
+
* // size.pxValue === 3 * getRootFontSize()
|
|
229
|
+
* ```
|
|
230
|
+
*
|
|
231
|
+
* @param raw - Value to resolve. Accepts numbers, pixel/rem/percent strings, or `null`/`undefined`.
|
|
232
|
+
* @param options - Optional configuration.
|
|
233
|
+
* @returns Resolved CSS value and its pixel equivalent when computable.
|
|
234
|
+
*
|
|
235
|
+
* @see {@link ResolvedCssSize}
|
|
236
|
+
* @see {@link ResolveCssSizeOptions}
|
|
237
|
+
*/
|
|
238
|
+
function resolveCssSize(raw, options = {}) {
|
|
239
|
+
const rootFontSize = getRootFontSize();
|
|
240
|
+
const value = raw ?? options.defaultValue;
|
|
241
|
+
if (value == null) {
|
|
242
|
+
return { cssValue: '0px', pxValue: 0 };
|
|
243
|
+
}
|
|
244
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
245
|
+
return { cssValue: `${value}px`, pxValue: value };
|
|
246
|
+
}
|
|
247
|
+
if (typeof value !== 'string') {
|
|
248
|
+
return { cssValue: '0px', pxValue: 0 };
|
|
249
|
+
}
|
|
250
|
+
const trimmed = value.trim();
|
|
251
|
+
const remMatch = /^([\d.]+)\s*rem$/i.exec(trimmed);
|
|
252
|
+
if (remMatch) {
|
|
253
|
+
const rem = Number.parseFloat(remMatch[1]);
|
|
254
|
+
const px = rem * rootFontSize;
|
|
255
|
+
return { cssValue: `${rem}rem`, pxValue: Number.isFinite(px) ? px : null };
|
|
256
|
+
}
|
|
257
|
+
const pxMatch = /^([\d.]+)\s*px$/i.exec(trimmed);
|
|
258
|
+
if (pxMatch) {
|
|
259
|
+
const px = Number.parseFloat(pxMatch[1]);
|
|
260
|
+
return { cssValue: `${px}px`, pxValue: Number.isFinite(px) ? px : null };
|
|
261
|
+
}
|
|
262
|
+
const percentMatch = /^([\d.]+)\s*%$/.exec(trimmed);
|
|
263
|
+
if (percentMatch) {
|
|
264
|
+
return { cssValue: `${percentMatch[1]}%`, pxValue: null };
|
|
265
|
+
}
|
|
266
|
+
const numberMatch = /^([\d.]+)$/.exec(trimmed);
|
|
267
|
+
if (numberMatch) {
|
|
268
|
+
const px = Number.parseFloat(numberMatch[1]);
|
|
269
|
+
return { cssValue: `${px}px`, pxValue: Number.isFinite(px) ? px : null };
|
|
270
|
+
}
|
|
271
|
+
return { cssValue: trimmed, pxValue: null };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* @license
|
|
276
|
+
*
|
|
277
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
278
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
279
|
+
*/
|
|
280
|
+
const ALPHABET = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
281
|
+
const MIN_LENGTH = 4;
|
|
282
|
+
const MAX_LENGTH = 64;
|
|
283
|
+
const DEFAULT_LENGTH = 12;
|
|
284
|
+
/**
|
|
285
|
+
* Returns random bytes using the best available source.
|
|
286
|
+
*
|
|
287
|
+
* @internal
|
|
288
|
+
*/
|
|
289
|
+
function defaultRandomBytes(count) {
|
|
290
|
+
// Covers: all browsers, Node ≥ 18, Deno, Bun, Cloudflare Workers
|
|
291
|
+
if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
|
|
292
|
+
return crypto.getRandomValues(new Uint8Array(count));
|
|
293
|
+
}
|
|
294
|
+
// Fallback: Node < 18 or exotic runtimes
|
|
295
|
+
const buf = new Uint8Array(count);
|
|
296
|
+
for (let i = 0; i < count; i++) {
|
|
297
|
+
buf[i] = Math.floor(Math.random() * 256);
|
|
298
|
+
}
|
|
299
|
+
return buf;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Generates a pseudo-random, DOM-safe identifier.
|
|
303
|
+
*
|
|
304
|
+
* Produced ids:
|
|
305
|
+
* - are prefixed to avoid collisions with host-application ids;
|
|
306
|
+
* - contain only `[a-z0-9-]` characters;
|
|
307
|
+
* - use `crypto.getRandomValues` when available, falling back to `Math.random`.
|
|
308
|
+
*
|
|
309
|
+
* **Not suitable for cryptographic or security-sensitive purposes** —
|
|
310
|
+
* intended only for UI element identifiers (`id`, `for`, `aria-*`, etc.).
|
|
311
|
+
*
|
|
312
|
+
* @example
|
|
313
|
+
* ```ts
|
|
314
|
+
* randomId();
|
|
315
|
+
* // → "wr-a8f2bx1k9q4z"
|
|
316
|
+
*
|
|
317
|
+
* randomId('ng', 8);
|
|
318
|
+
* // → "ng-k2f9mbeo"
|
|
319
|
+
*
|
|
320
|
+
* randomId('wr', 24);
|
|
321
|
+
* // → "wr-a8f2bx1k9q4zmneo73wplr"
|
|
322
|
+
* ```
|
|
323
|
+
*
|
|
324
|
+
* @param prefix - Namespace prefix prepended before the random segment. Defaults to `'wr'`.
|
|
325
|
+
* @param length - Length of the random segment. Clamped to `[4, 64]`. Defaults to `12`.
|
|
326
|
+
* @param random - Custom random byte source `(byteLength) => Uint8Array`.
|
|
327
|
+
* When omitted, uses `crypto.getRandomValues` with a `Math.random` fallback.
|
|
328
|
+
* @returns A pseudo-random id string matching `/^[a-z]+-[a-z0-9]+$/`.
|
|
329
|
+
*/
|
|
330
|
+
function randomId(prefix = 'wr', length = DEFAULT_LENGTH, random) {
|
|
331
|
+
const safeLength = Math.min(Math.max(Math.trunc(length), MIN_LENGTH), MAX_LENGTH);
|
|
332
|
+
const bytes = random ? random(safeLength) : defaultRandomBytes(safeLength);
|
|
333
|
+
let result = '';
|
|
334
|
+
for (let i = 0; i < safeLength; i++) {
|
|
335
|
+
result += ALPHABET[bytes[i] % ALPHABET.length];
|
|
336
|
+
}
|
|
337
|
+
return `${prefix}-${result}`;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* @license
|
|
342
|
+
*
|
|
343
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
344
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
345
|
+
*/
|
|
346
|
+
/**
|
|
347
|
+
* A function that does nothing.
|
|
348
|
+
*
|
|
349
|
+
* Useful as a default callback, placeholder event handler,
|
|
350
|
+
* or to explicitly signal intentional no-ops.
|
|
351
|
+
*
|
|
352
|
+
* @example
|
|
353
|
+
* ```ts
|
|
354
|
+
* @Component({ ... })
|
|
355
|
+
* export class MyComponent {
|
|
356
|
+
* onTouched: () => void = noop;
|
|
357
|
+
* }
|
|
358
|
+
* ```
|
|
359
|
+
*/
|
|
360
|
+
const noop = () => undefined;
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* @license
|
|
364
|
+
*
|
|
365
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
366
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
367
|
+
*/
|
|
368
|
+
/**
|
|
369
|
+
* Wrap `fn` so it only fires `waitMs` after the last invocation.
|
|
370
|
+
* Useful for resize / scroll / input handlers.
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* ```ts
|
|
374
|
+
* const onResize = debounce(() => recalcLayout(), 150);
|
|
375
|
+
* window.addEventListener('resize', onResize);
|
|
376
|
+
* ```
|
|
377
|
+
*/
|
|
378
|
+
function debounce(fn, waitMs) {
|
|
379
|
+
let timer = null;
|
|
380
|
+
const debounced = (...args) => {
|
|
381
|
+
if (timer !== null)
|
|
382
|
+
clearTimeout(timer);
|
|
383
|
+
timer = setTimeout(() => {
|
|
384
|
+
timer = null;
|
|
385
|
+
fn(...args);
|
|
386
|
+
}, waitMs);
|
|
387
|
+
};
|
|
388
|
+
debounced.cancel = () => {
|
|
389
|
+
if (timer !== null) {
|
|
390
|
+
clearTimeout(timer);
|
|
391
|
+
timer = null;
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
return debounced;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* @license
|
|
399
|
+
*
|
|
400
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
401
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
402
|
+
*/
|
|
403
|
+
/**
|
|
404
|
+
* Wrap `fn` so it fires at most once every `waitMs`. Leading-edge call
|
|
405
|
+
* fires immediately; trailing-edge call fires once at the end of the window
|
|
406
|
+
* if there were further invocations.
|
|
407
|
+
*/
|
|
408
|
+
function throttle(fn, waitMs) {
|
|
409
|
+
let lastInvoke = 0;
|
|
410
|
+
let trailingTimer = null;
|
|
411
|
+
let pendingArgs = null;
|
|
412
|
+
const throttled = (...args) => {
|
|
413
|
+
const now = Date.now();
|
|
414
|
+
const remaining = waitMs - (now - lastInvoke);
|
|
415
|
+
if (remaining <= 0) {
|
|
416
|
+
if (trailingTimer !== null) {
|
|
417
|
+
clearTimeout(trailingTimer);
|
|
418
|
+
trailingTimer = null;
|
|
419
|
+
}
|
|
420
|
+
lastInvoke = now;
|
|
421
|
+
fn(...args);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
pendingArgs = args;
|
|
425
|
+
trailingTimer ??= setTimeout(() => {
|
|
426
|
+
lastInvoke = Date.now();
|
|
427
|
+
trailingTimer = null;
|
|
428
|
+
if (pendingArgs)
|
|
429
|
+
fn(...pendingArgs);
|
|
430
|
+
pendingArgs = null;
|
|
431
|
+
}, remaining);
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
throttled.cancel = () => {
|
|
435
|
+
if (trailingTimer !== null) {
|
|
436
|
+
clearTimeout(trailingTimer);
|
|
437
|
+
trailingTimer = null;
|
|
438
|
+
}
|
|
439
|
+
pendingArgs = null;
|
|
440
|
+
lastInvoke = 0;
|
|
441
|
+
};
|
|
442
|
+
return throttled;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* @license
|
|
447
|
+
*
|
|
448
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
449
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
450
|
+
*/
|
|
451
|
+
/**
|
|
452
|
+
* Canonical `KeyboardEvent.key` values used across ngwr components.
|
|
453
|
+
* Use these constants instead of magic strings so refactors are searchable.
|
|
454
|
+
*/
|
|
455
|
+
const KEYS = {
|
|
456
|
+
ENTER: 'Enter',
|
|
457
|
+
ESCAPE: 'Escape',
|
|
458
|
+
TAB: 'Tab',
|
|
459
|
+
SPACE: ' ',
|
|
460
|
+
BACKSPACE: 'Backspace',
|
|
461
|
+
DELETE: 'Delete',
|
|
462
|
+
ARROW_UP: 'ArrowUp',
|
|
463
|
+
ARROW_DOWN: 'ArrowDown',
|
|
464
|
+
ARROW_LEFT: 'ArrowLeft',
|
|
465
|
+
ARROW_RIGHT: 'ArrowRight',
|
|
466
|
+
HOME: 'Home',
|
|
467
|
+
END: 'End',
|
|
468
|
+
PAGE_UP: 'PageUp',
|
|
469
|
+
PAGE_DOWN: 'PageDown',
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* @license
|
|
474
|
+
*
|
|
475
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
476
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
477
|
+
*/
|
|
478
|
+
/** True when any modifier key (Ctrl / Cmd / Alt / Shift / Meta) is held. */
|
|
479
|
+
function hasModifier(event) {
|
|
480
|
+
return event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* True when the key is a single printable character (letters, digits,
|
|
484
|
+
* punctuation, etc.). Skips function keys, arrows, modifiers, and named
|
|
485
|
+
* keys like `Backspace` or `Tab`.
|
|
486
|
+
*/
|
|
487
|
+
function isPrintableKey(event) {
|
|
488
|
+
return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* @license
|
|
493
|
+
*
|
|
494
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
495
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
496
|
+
*/
|
|
497
|
+
/**
|
|
498
|
+
* Logs a coloured pill to the browser console followed by a payload.
|
|
499
|
+
*
|
|
500
|
+
* Useful when you need to scan a noisy console for a specific subsystem's
|
|
501
|
+
* messages. The pill is rendered with the CSS `%c` console formatting trick.
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
* ```ts
|
|
505
|
+
* badgeLog('icons', '#3969e2', { name: 'plus', registered: true });
|
|
506
|
+
* // → [icons] { name: 'plus', registered: true }
|
|
507
|
+
* ```
|
|
508
|
+
*
|
|
509
|
+
* @param badgeText Short label shown inside the pill.
|
|
510
|
+
* @param color CSS colour applied to the pill border and text.
|
|
511
|
+
* @param message Anything you'd pass to `console.log` as the second argument.
|
|
512
|
+
*
|
|
513
|
+
* @internal
|
|
514
|
+
*/
|
|
515
|
+
function badgeLog(badgeText, color, message) {
|
|
516
|
+
const style = `
|
|
517
|
+
display: inline-block;
|
|
518
|
+
border: 1px solid ${color};
|
|
519
|
+
color: ${color};
|
|
520
|
+
padding: 1px 3px;
|
|
521
|
+
border-radius: 4px;
|
|
522
|
+
margin-right: 0
|
|
523
|
+
`;
|
|
524
|
+
// eslint-disable-next-line no-console -- this helper exists to log
|
|
525
|
+
console.log(`%c${badgeText}`, style, message);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Guards
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Generated bundle index. Do not edit.
|
|
532
|
+
*/
|
|
533
|
+
|
|
534
|
+
export { KEYS, badgeLog, clamp, debounce, getFocusableElements, getRootFontSize, hasModifier, isDefined, isNonEmptyArray, isObservable, isPrintableKey, noop, numAttr, randomId, resolveCssSize, round, throttle, trapFocus };
|
|
535
|
+
//# sourceMappingURL=ngwr-utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngwr-utils.mjs","sources":["../../../projects/lib/utils/guards/is-defined.ts","../../../projects/lib/utils/guards/is-non-empty-array.ts","../../../projects/lib/utils/guards/is-observable.ts","../../../projects/lib/utils/math/clamp.ts","../../../projects/lib/utils/math/round.ts","../../../projects/lib/utils/coercion/num-attr.ts","../../../projects/lib/utils/dom/get-root-font-size.ts","../../../projects/lib/utils/dom/focus.ts","../../../projects/lib/utils/css-size/resolve-css-size.ts","../../../projects/lib/utils/id/random-id.ts","../../../projects/lib/utils/fn/noop.ts","../../../projects/lib/utils/fn/debounce.ts","../../../projects/lib/utils/fn/throttle.ts","../../../projects/lib/utils/keyboard/keys.ts","../../../projects/lib/utils/keyboard/predicates.ts","../../../projects/lib/utils/log/badge-log.ts","../../../projects/lib/utils/public-api.ts","../../../projects/lib/utils/ngwr-utils.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 type { Maybe } from '../interfaces';\n\n/**\n * Type guard that checks if a value is neither `null` nor `undefined`.\n *\n * @example\n * ```ts\n * const maybeValue: Maybe<number> = getValue();\n *\n * if (isDefined(maybeValue)) {\n * // here maybeValue is number\n * console.log(maybeValue.toFixed(2));\n * }\n * ```\n *\n * @see {@link Maybe}\n */\nexport function isDefined<T>(value: Maybe<T>): value is T {\n return value !== null && value !== undefined;\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 { Maybe } from '../interfaces';\n\n/**\n * Type guard that checks if a value is an array with at least one element.\n *\n * @example\n * ```ts\n * const items: Maybe<string[]> = getItems();\n *\n * if (isNonEmptyArray(items)) {\n * // items is string[]\n * console.log(items[0]);\n * }\n * ```\n */\nexport function isNonEmptyArray<T>(value: Maybe<T[]>): value is [T, ...T[]] {\n return Array.isArray(value) && value.length > 0;\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 { Observable } from 'rxjs';\n\n/**\n * Type guard that checks whether a value looks like an RxJS `Observable`.\n *\n * Uses duck-typing: verifies that the object has a `subscribe` function.\n * Does not require an actual `Observable` instance.\n *\n * @example\n * ```ts\n * if (isObservable(stream)) {\n * stream.subscribe(value => console.log(value));\n * }\n * ```\n */\nexport function isObservable<T = unknown>(value: unknown): value is Observable<T> {\n return !!value && typeof (value as { subscribe?: unknown }).subscribe === 'function';\n}\n","/**\n * Clamps `value` into the inclusive `[min, max]` range.\n *\n * @example\n * ```ts\n * clamp(140, 0, 100); // 100\n * clamp(-3, 0, 100); // 0\n * clamp(42, 0, 100); // 42\n * ```\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n","/**\n * Rounds `value` to `decimals` fraction digits, compensating the usual\n * floating point drift (`0.1 + 0.2` rounds to `0.3`, not `0.30000000000000004`).\n *\n * @example\n * ```ts\n * round(0.1 + 0.2, 2); // 0.3\n * round(1.005, 2); // 1.01\n * round(7.4); // 7\n * ```\n */\nexport function round(value: number, decimals = 0): number {\n const factor = 10 ** decimals;\n return Math.round((value + Number.EPSILON) * factor) / factor;\n}\n","import { coerceNumberProperty } from '@angular/cdk/coercion';\n\n/**\n * Input-transform factory: coerces any bound value to a number, falling\n * back to `fallback` for `null` / `undefined` / unparsable input. The\n * standard transform for numeric `input()`s across ngwr.\n *\n * @example\n * ```ts\n * readonly speed = input(4, { transform: numAttr(4) });\n * ```\n */\nexport const numAttr =\n (fallback: number) =>\n (value: unknown): number =>\n coerceNumberProperty(value, fallback);\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\n/**\n * Reads the root font size (in pixels) from\n * `getComputedStyle(document.documentElement).fontSize`.\n *\n * Typical use case: converting `rem` values to pixels for layout calculations.\n *\n * Falls back to the provided value when:\n * - DOM is not available (SSR);\n * - `getComputedStyle` fails or returns an unparseable value.\n *\n * @example\n * ```ts\n * const rootFontSize = getRootFontSize(); // e.g. 16\n * const customFallback = getRootFontSize(14); // uses 14 if DOM is unavailable\n * ```\n *\n * @param fallback - Value in pixels when DOM is unavailable. Defaults to `16`.\n * @returns Root font size in pixels.\n */\nexport function getRootFontSize(fallback = 16): number {\n try {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return fallback;\n }\n\n const raw = window.getComputedStyle(document.documentElement).fontSize;\n const parsed = Number.parseFloat(raw);\n\n return Number.isFinite(parsed) ? parsed : fallback;\n } catch {\n return fallback;\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\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/** Return every focusable descendant of `root` in DOM order. */\nexport function getFocusableElements(root: HTMLElement): readonly HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n el => el.offsetParent !== null || el === document.activeElement\n );\n}\n\n/**\n * Trap Tab navigation inside `root` for a keyboard event — call from a\n * `keydown` handler. Cycles focus from first ↔ last focusable element.\n * Returns `true` when focus was redirected (event was handled).\n */\nexport function trapFocus(root: HTMLElement, event: KeyboardEvent): boolean {\n if (event.key !== 'Tab') return false;\n const focusable = getFocusableElements(root);\n if (focusable.length === 0) return false;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last.focus();\n return true;\n }\n if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n return true;\n }\n return false;\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 { getRootFontSize } from '../dom';\n\nimport type { ResolveCssSizeOptions } from './resolve-css-size-options';\nimport type { ResolvedCssSize } from './resolved-css-size';\n\n/**\n * Resolves a raw size value into a CSS string and an optional pixel equivalent.\n *\n * Supported formats:\n * - `number` → pixels (`48` → `\"48px\"`)\n * - `\"12px\"` → pixels (`\"12px\"` → `\"12px\"`)\n * - `\"3rem\"` → rems via root (`\"3rem\"` → `\"3rem\"`, pxValue = 3 × root font size)\n * - `\"80%\"` → percentage (`\"80%\"` → `\"80%\"`, pxValue = null)\n * - `\"15\"` → pixels (`\"15\"` → `\"15px\"`)\n * - anything else → passed through as-is, pxValue = null\n *\n * @example\n * ```ts\n * const size = resolveCssSize('3rem', { defaultValue: '6rem' });\n * // size.cssValue === '3rem'\n * // size.pxValue === 3 * getRootFontSize()\n * ```\n *\n * @param raw - Value to resolve. Accepts numbers, pixel/rem/percent strings, or `null`/`undefined`.\n * @param options - Optional configuration.\n * @returns Resolved CSS value and its pixel equivalent when computable.\n *\n * @see {@link ResolvedCssSize}\n * @see {@link ResolveCssSizeOptions}\n */\nexport function resolveCssSize(raw: unknown, options: ResolveCssSizeOptions = {}): ResolvedCssSize {\n const rootFontSize = getRootFontSize();\n const value: unknown = raw ?? options.defaultValue;\n\n if (value == null) {\n return { cssValue: '0px', pxValue: 0 };\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return { cssValue: `${value}px`, pxValue: value };\n }\n\n if (typeof value !== 'string') {\n return { cssValue: '0px', pxValue: 0 };\n }\n\n const trimmed = value.trim();\n\n const remMatch = /^([\\d.]+)\\s*rem$/i.exec(trimmed);\n if (remMatch) {\n const rem = Number.parseFloat(remMatch[1]);\n const px = rem * rootFontSize;\n return { cssValue: `${rem}rem`, pxValue: Number.isFinite(px) ? px : null };\n }\n\n const pxMatch = /^([\\d.]+)\\s*px$/i.exec(trimmed);\n if (pxMatch) {\n const px = Number.parseFloat(pxMatch[1]);\n return { cssValue: `${px}px`, pxValue: Number.isFinite(px) ? px : null };\n }\n\n const percentMatch = /^([\\d.]+)\\s*%$/.exec(trimmed);\n if (percentMatch) {\n return { cssValue: `${percentMatch[1]}%`, pxValue: null };\n }\n\n const numberMatch = /^([\\d.]+)$/.exec(trimmed);\n if (numberMatch) {\n const px = Number.parseFloat(numberMatch[1]);\n return { cssValue: `${px}px`, pxValue: Number.isFinite(px) ? px : null };\n }\n\n return { cssValue: trimmed, pxValue: 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\nconst ALPHABET = 'abcdefghijklmnopqrstuvwxyz0123456789';\nconst MIN_LENGTH = 4;\nconst MAX_LENGTH = 64;\nconst DEFAULT_LENGTH = 12;\n\n/**\n * Returns random bytes using the best available source.\n *\n * @internal\n */\nfunction defaultRandomBytes(count: number): Uint8Array {\n // Covers: all browsers, Node ≥ 18, Deno, Bun, Cloudflare Workers\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(count));\n }\n\n // Fallback: Node < 18 or exotic runtimes\n const buf = new Uint8Array(count);\n for (let i = 0; i < count; i++) {\n buf[i] = Math.floor(Math.random() * 256);\n }\n return buf;\n}\n\n/**\n * Generates a pseudo-random, DOM-safe identifier.\n *\n * Produced ids:\n * - are prefixed to avoid collisions with host-application ids;\n * - contain only `[a-z0-9-]` characters;\n * - use `crypto.getRandomValues` when available, falling back to `Math.random`.\n *\n * **Not suitable for cryptographic or security-sensitive purposes** —\n * intended only for UI element identifiers (`id`, `for`, `aria-*`, etc.).\n *\n * @example\n * ```ts\n * randomId();\n * // → \"wr-a8f2bx1k9q4z\"\n *\n * randomId('ng', 8);\n * // → \"ng-k2f9mbeo\"\n *\n * randomId('wr', 24);\n * // → \"wr-a8f2bx1k9q4zmneo73wplr\"\n * ```\n *\n * @param prefix - Namespace prefix prepended before the random segment. Defaults to `'wr'`.\n * @param length - Length of the random segment. Clamped to `[4, 64]`. Defaults to `12`.\n * @param random - Custom random byte source `(byteLength) => Uint8Array`.\n * When omitted, uses `crypto.getRandomValues` with a `Math.random` fallback.\n * @returns A pseudo-random id string matching `/^[a-z]+-[a-z0-9]+$/`.\n */\nexport function randomId(prefix = 'wr', length = DEFAULT_LENGTH, random?: (byteLength: number) => Uint8Array): string {\n const safeLength = Math.min(Math.max(Math.trunc(length), MIN_LENGTH), MAX_LENGTH);\n\n const bytes = random ? random(safeLength) : defaultRandomBytes(safeLength);\n\n let result = '';\n for (let i = 0; i < safeLength; i++) {\n result += ALPHABET[bytes[i] % ALPHABET.length];\n }\n\n return `${prefix}-${result}`;\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\n/**\n * A function that does nothing.\n *\n * Useful as a default callback, placeholder event handler,\n * or to explicitly signal intentional no-ops.\n *\n * @example\n * ```ts\n * @Component({ ... })\n * export class MyComponent {\n * onTouched: () => void = noop;\n * }\n * ```\n */\nexport const noop = (): void => undefined;\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\n/** A debounced function — same signature as the original plus `cancel`. */\nexport type WrDebouncedFn<TArgs extends readonly unknown[]> = ((...args: TArgs) => void) & {\n readonly cancel: () => void;\n};\n\n/**\n * Wrap `fn` so it only fires `waitMs` after the last invocation.\n * Useful for resize / scroll / input handlers.\n *\n * @example\n * ```ts\n * const onResize = debounce(() => recalcLayout(), 150);\n * window.addEventListener('resize', onResize);\n * ```\n */\nexport function debounce<TArgs extends readonly unknown[]>(\n fn: (...args: TArgs) => void,\n waitMs: number\n): WrDebouncedFn<TArgs> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = (...args: TArgs): void => {\n if (timer !== null) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n fn(...args);\n }, waitMs);\n };\n\n debounced.cancel = (): void => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n return debounced;\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\n/** A throttled function — same signature as the original plus `cancel`. */\nexport type WrThrottledFn<TArgs extends readonly unknown[]> = ((...args: TArgs) => void) & {\n readonly cancel: () => void;\n};\n\n/**\n * Wrap `fn` so it fires at most once every `waitMs`. Leading-edge call\n * fires immediately; trailing-edge call fires once at the end of the window\n * if there were further invocations.\n */\nexport function throttle<TArgs extends readonly unknown[]>(\n fn: (...args: TArgs) => void,\n waitMs: number\n): WrThrottledFn<TArgs> {\n let lastInvoke = 0;\n let trailingTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingArgs: TArgs | null = null;\n\n const throttled = (...args: TArgs): void => {\n const now = Date.now();\n const remaining = waitMs - (now - lastInvoke);\n\n if (remaining <= 0) {\n if (trailingTimer !== null) {\n clearTimeout(trailingTimer);\n trailingTimer = null;\n }\n lastInvoke = now;\n fn(...args);\n } else {\n pendingArgs = args;\n trailingTimer ??= setTimeout(() => {\n lastInvoke = Date.now();\n trailingTimer = null;\n if (pendingArgs) fn(...pendingArgs);\n pendingArgs = null;\n }, remaining);\n }\n };\n\n throttled.cancel = (): void => {\n if (trailingTimer !== null) {\n clearTimeout(trailingTimer);\n trailingTimer = null;\n }\n pendingArgs = null;\n lastInvoke = 0;\n };\n\n return throttled;\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\n/**\n * Canonical `KeyboardEvent.key` values used across ngwr components.\n * Use these constants instead of magic strings so refactors are searchable.\n */\nexport const KEYS = {\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n TAB: 'Tab',\n SPACE: ' ',\n BACKSPACE: 'Backspace',\n DELETE: 'Delete',\n ARROW_UP: 'ArrowUp',\n ARROW_DOWN: 'ArrowDown',\n ARROW_LEFT: 'ArrowLeft',\n ARROW_RIGHT: 'ArrowRight',\n HOME: 'Home',\n END: 'End',\n PAGE_UP: 'PageUp',\n PAGE_DOWN: 'PageDown',\n} as const;\n\nexport type WrKey = (typeof KEYS)[keyof typeof KEYS];\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\n/** True when any modifier key (Ctrl / Cmd / Alt / Shift / Meta) is held. */\nexport function hasModifier(event: KeyboardEvent): boolean {\n return event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;\n}\n\n/**\n * True when the key is a single printable character (letters, digits,\n * punctuation, etc.). Skips function keys, arrows, modifiers, and named\n * keys like `Backspace` or `Tab`.\n */\nexport function isPrintableKey(event: KeyboardEvent): boolean {\n return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;\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\n/**\n * Logs a coloured pill to the browser console followed by a payload.\n *\n * Useful when you need to scan a noisy console for a specific subsystem's\n * messages. The pill is rendered with the CSS `%c` console formatting trick.\n *\n * @example\n * ```ts\n * badgeLog('icons', '#3969e2', { name: 'plus', registered: true });\n * // → [icons] { name: 'plus', registered: true }\n * ```\n *\n * @param badgeText Short label shown inside the pill.\n * @param color CSS colour applied to the pill border and text.\n * @param message Anything you'd pass to `console.log` as the second argument.\n *\n * @internal\n */\nexport function badgeLog(badgeText: string, color: string, message: unknown): void {\n const style = `\n display: inline-block;\n border: 1px solid ${color};\n color: ${color};\n padding: 1px 3px;\n border-radius: 4px;\n margin-right: 0\n `;\n // eslint-disable-next-line no-console -- this helper exists to log\n console.log(`%c${badgeText}`, style, message);\n}\n","// Types\nexport type { Maybe, SafeAny } from './interfaces';\n\n// Guards\nexport { isDefined, isNonEmptyArray, isObservable } from './guards';\n\n// Math\nexport { clamp, round } from './math';\n\n// Coercion\nexport { numAttr } from './coercion';\n\n// CSS size\nexport { resolveCssSize } from './css-size';\nexport type { ResolveCssSizeOptions, ResolvedCssSize } from './css-size';\n\n// DOM\nexport { getRootFontSize, getFocusableElements, trapFocus } from './dom';\n\n// ID\nexport { randomId } from './id';\n\n// Fn\nexport { noop, debounce, throttle } from './fn';\nexport type { WrDebouncedFn, WrThrottledFn } from './fn';\n\n// Keyboard\nexport { KEYS, hasModifier, isPrintableKey } from './keyboard';\nexport type { WrKey } from './keyboard';\n\n// Log\nexport { badgeLog } from './log';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAIH;;;;;;;;;;;;;;AAcG;AACG,SAAU,SAAS,CAAI,KAAe,EAAA;AAC1C,IAAA,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAC9C;;AC1BA;;;;;AAKG;AAIH;;;;;;;;;;;;AAYG;AACG,SAAU,eAAe,CAAI,KAAiB,EAAA;AAClD,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;AACjD;;ACxBA;;;;;AAKG;AAIH;;;;;;;;;;;;AAYG;AACG,SAAU,YAAY,CAAc,KAAc,EAAA;IACtD,OAAO,CAAC,CAAC,KAAK,IAAI,OAAQ,KAAiC,CAAC,SAAS,KAAK,UAAU;AACtF;;ACxBA;;;;;;;;;AASG;SACa,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AAC3D,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5C;;ACZA;;;;;;;;;;AAUG;SACa,KAAK,CAAC,KAAa,EAAE,QAAQ,GAAG,CAAC,EAAA;AAC/C,IAAA,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ;AAC7B,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,MAAM;AAC/D;;ACZA;;;;;;;;;AASG;MACU,OAAO,GAClB,CAAC,QAAgB,KACjB,CAAC,KAAc,KACb,oBAAoB,CAAC,KAAK,EAAE,QAAQ;;ACfxC;;;;;AAKG;AAEH;;;;;;;;;;;;;;;;;;AAkBG;AACG,SAAU,eAAe,CAAC,QAAQ,GAAG,EAAE,EAAA;AAC3C,IAAA,IAAI;QACF,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACpE,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,QAAQ;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;AAErC,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ;IACpD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,QAAQ;IACjB;AACF;;ACvCA;;;;;AAKG;AAEH,MAAM,kBAAkB,GAAG;IACzB,SAAS;IACT,YAAY;IACZ,wBAAwB;IACxB,4CAA4C;IAC5C,wBAAwB;IACxB,0BAA0B;IAC1B,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,iBAAiB;IACjB,iBAAiB;IACjB,kDAAkD;IAClD,iCAAiC;AAClC,CAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AAEX;AACM,SAAU,oBAAoB,CAAC,IAAiB,EAAA;AACpD,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAC9E,EAAE,IAAI,EAAE,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,KAAK,QAAQ,CAAC,aAAa,CAChE;AACH;AAEA;;;;AAIG;AACG,SAAU,SAAS,CAAC,IAAiB,EAAE,KAAoB,EAAA;AAC/D,IAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;AAAE,QAAA,OAAO,KAAK;AACrC,IAAA,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC;AAC5C,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AAExC,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC;IAE3D,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE;QACtC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,OAAO,IAAI;IACb;IACA,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;QACtC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,KAAK,EAAE;AACb,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAK;AACd;;ACvDA;;;;;AAKG;AAOH;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,cAAc,CAAC,GAAY,EAAE,UAAiC,EAAE,EAAA;AAC9E,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE;AACtC,IAAA,MAAM,KAAK,GAAY,GAAG,IAAI,OAAO,CAAC,YAAY;AAElD,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACxC;AAEA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACvD,OAAO,EAAE,QAAQ,EAAE,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI,EAAE,OAAO,EAAE,KAAK,EAAE;IACnD;AAEA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACxC;AAEA,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;IAE5B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;IAClD,IAAI,QAAQ,EAAE;QACZ,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1C,QAAA,MAAM,EAAE,GAAG,GAAG,GAAG,YAAY;QAC7B,OAAO,EAAE,QAAQ,EAAE,CAAA,EAAG,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;IAC5E;IAEA,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;IAChD,IAAI,OAAO,EAAE;QACX,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,EAAE,QAAQ,EAAE,CAAA,EAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;IAC1E;IAEA,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;IACnD,IAAI,YAAY,EAAE;AAChB,QAAA,OAAO,EAAE,QAAQ,EAAE,CAAA,EAAG,YAAY,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3D;IAEA,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9C,IAAI,WAAW,EAAE;QACf,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,CAAA,EAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;IAC1E;IAEA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;AAC7C;;AChFA;;;;;AAKG;AAEH,MAAM,QAAQ,GAAG,sCAAsC;AACvD,MAAM,UAAU,GAAG,CAAC;AACpB,MAAM,UAAU,GAAG,EAAE;AACrB,MAAM,cAAc,GAAG,EAAE;AAEzB;;;;AAIG;AACH,SAAS,kBAAkB,CAAC,KAAa,EAAA;;AAEvC,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE;QACjF,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACtD;;AAGA,IAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;AACjC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC9B,QAAA,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;IAC1C;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;AACG,SAAU,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,MAA2C,EAAA;IAC1G,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC;AAEjF,IAAA,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC,UAAU,CAAC;IAE1E,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;AACnC,QAAA,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChD;AAEA,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,EAAE;AAC9B;;ACvEA;;;;;AAKG;AAEH;;;;;;;;;;;;;AAaG;MACU,IAAI,GAAG,MAAY;;ACrBhC;;;;;AAKG;AAOH;;;;;;;;;AASG;AACG,SAAU,QAAQ,CACtB,EAA4B,EAC5B,MAAc,EAAA;IAEd,IAAI,KAAK,GAAyC,IAAI;AAEtD,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAW,KAAU;QACzC,IAAI,KAAK,KAAK,IAAI;YAAE,YAAY,CAAC,KAAK,CAAC;AACvC,QAAA,KAAK,GAAG,UAAU,CAAC,MAAK;YACtB,KAAK,GAAG,IAAI;AACZ,YAAA,EAAE,CAAC,GAAG,IAAI,CAAC;QACb,CAAC,EAAE,MAAM,CAAC;AACZ,IAAA,CAAC;AAED,IAAA,SAAS,CAAC,MAAM,GAAG,MAAW;AAC5B,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,YAAY,CAAC,KAAK,CAAC;YACnB,KAAK,GAAG,IAAI;QACd;AACF,IAAA,CAAC;AAED,IAAA,OAAO,SAAS;AAClB;;AC5CA;;;;;AAKG;AAOH;;;;AAIG;AACG,SAAU,QAAQ,CACtB,EAA4B,EAC5B,MAAc,EAAA;IAEd,IAAI,UAAU,GAAG,CAAC;IAClB,IAAI,aAAa,GAAyC,IAAI;IAC9D,IAAI,WAAW,GAAiB,IAAI;AAEpC,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAW,KAAU;AACzC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,MAAM,SAAS,GAAG,MAAM,IAAI,GAAG,GAAG,UAAU,CAAC;AAE7C,QAAA,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,YAAA,IAAI,aAAa,KAAK,IAAI,EAAE;gBAC1B,YAAY,CAAC,aAAa,CAAC;gBAC3B,aAAa,GAAG,IAAI;YACtB;YACA,UAAU,GAAG,GAAG;AAChB,YAAA,EAAE,CAAC,GAAG,IAAI,CAAC;QACb;aAAO;YACL,WAAW,GAAG,IAAI;AAClB,YAAA,aAAa,KAAK,UAAU,CAAC,MAAK;AAChC,gBAAA,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;gBACvB,aAAa,GAAG,IAAI;AACpB,gBAAA,IAAI,WAAW;AAAE,oBAAA,EAAE,CAAC,GAAG,WAAW,CAAC;gBACnC,WAAW,GAAG,IAAI;YACpB,CAAC,EAAE,SAAS,CAAC;QACf;AACF,IAAA,CAAC;AAED,IAAA,SAAS,CAAC,MAAM,GAAG,MAAW;AAC5B,QAAA,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,YAAY,CAAC,aAAa,CAAC;YAC3B,aAAa,GAAG,IAAI;QACtB;QACA,WAAW,GAAG,IAAI;QAClB,UAAU,GAAG,CAAC;AAChB,IAAA,CAAC;AAED,IAAA,OAAO,SAAS;AAClB;;ACzDA;;;;;AAKG;AAEH;;;AAGG;AACI,MAAM,IAAI,GAAG;AAClB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,UAAU;;;ACzBvB;;;;;AAKG;AAEH;AACM,SAAU,WAAW,CAAC,KAAoB,EAAA;AAC9C,IAAA,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ;AACzE;AAEA;;;;AAIG;AACG,SAAU,cAAc,CAAC,KAAoB,EAAA;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;AACpF;;ACnBA;;;;;AAKG;AAEH;;;;;;;;;;;;;;;;;AAiBG;SACa,QAAQ,CAAC,SAAiB,EAAE,KAAa,EAAE,OAAgB,EAAA;AACzE,IAAA,MAAM,KAAK,GAAG;;wBAEQ,KAAK,CAAA;aAChB,KAAK,CAAA;;;;GAIf;;IAED,OAAO,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,EAAE,KAAK,EAAE,OAAO,CAAC;AAC/C;;ACjCA;;ACHA;;AAEG;;;;"}
|