ngwr 7.3.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/alert/styles/_index.scss +44 -17
- package/avatar/styles/_index.scss +2 -2
- package/badge/styles/_index.scss +11 -7
- package/badge/styles/_tag.scss +1 -1
- package/bar-chart/styles/_index.scss +1 -2
- package/breadcrumbs/styles/_index.scss +4 -2
- package/burger/styles/_index.scss +2 -2
- package/button/styles/_index.scss +30 -20
- package/calendar/styles/_index.scss +11 -9
- package/calendar-heatmap/styles/_index.scss +2 -0
- package/card/styles/_index.scss +1 -1
- package/carousel/styles/_index.scss +1 -1
- package/cascader/styles/_index.scss +54 -14
- package/checkbox/styles/_index.scss +21 -4
- package/collapse/styles/_index.scss +1 -1
- package/color-picker/styles/_index.scss +11 -12
- package/command-palette/styles/_index.scss +3 -3
- package/compare/styles/_index.scss +3 -3
- package/context-menu/styles/_index.scss +1 -1
- package/date-picker/styles/_index.scss +5 -6
- package/density/styles/_index.scss +3 -3
- package/dialog/styles/_index.scss +3 -3
- package/divider/styles/_index.scss +1 -1
- package/drawer/styles/_index.scss +11 -11
- package/dropdown/styles/_index.scss +2 -2
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs +22 -10
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-border-glow.mjs +3 -3
- package/fesm2022/ngwr-breadcrumbs.mjs +7 -7
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
- package/fesm2022/ngwr-calendar.mjs +4 -4
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +10 -10
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-cascader.mjs +12 -35
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +13 -30
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +3 -3
- package/fesm2022/ngwr-click-spark.mjs +25 -6
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-clipboard.mjs +27 -6
- package/fesm2022/ngwr-clipboard.mjs.map +1 -1
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-color-picker.mjs +7 -7
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +3 -3
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs +3 -3
- package/fesm2022/ngwr-context-menu.mjs +40 -88
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-counter.mjs +12 -8
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
- package/fesm2022/ngwr-date-adapter-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-adapter.mjs +3 -3
- package/fesm2022/ngwr-date-picker.mjs +25 -11
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-density.mjs +14 -14
- package/fesm2022/ngwr-density.mjs.map +1 -1
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-dialog.mjs +15 -15
- package/fesm2022/ngwr-directives.mjs +15 -87
- package/fesm2022/ngwr-directives.mjs.map +1 -1
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-donut-chart.mjs +10 -4
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +6 -6
- package/fesm2022/ngwr-drawer.mjs +15 -15
- package/fesm2022/ngwr-dropdown.mjs +9 -9
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-falling-text.mjs +3 -3
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-form.mjs +9 -9
- package/fesm2022/ngwr-fuzzy-text.mjs +8 -7
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text.mjs +15 -7
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text.mjs +3 -3
- package/fesm2022/ngwr-hotkey.mjs +6 -6
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-icon.mjs +3 -3
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-input-number.mjs +4 -4
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +10 -4
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +25 -16
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +17 -5
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +3 -3
- package/fesm2022/ngwr-list.mjs +7 -7
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +6 -6
- package/fesm2022/ngwr-marquee.mjs +3 -3
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-mention.mjs +6 -6
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +3 -3
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs +5 -15
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-platform.mjs +3 -3
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popover.mjs +6 -6
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs +3 -3
- package/fesm2022/ngwr-radio.mjs +28 -26
- package/fesm2022/ngwr-radio.mjs.map +1 -1
- package/fesm2022/ngwr-rating.mjs +12 -23
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs +10 -22
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +26 -13
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +6 -6
- package/fesm2022/ngwr-sidebar.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +3 -3
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-spotlight-card.mjs +8 -8
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-star-border.mjs +3 -3
- package/fesm2022/ngwr-statistic.mjs +79 -10
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-storage.mjs +3 -3
- package/fesm2022/ngwr-switch.mjs +10 -14
- package/fesm2022/ngwr-switch.mjs.map +1 -1
- package/fesm2022/ngwr-table.mjs +12 -12
- package/fesm2022/ngwr-tabs.mjs +8 -6
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +84 -25
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-tilt-card.mjs +6 -6
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +46 -24
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs +3 -3
- package/fesm2022/ngwr-typewriter.mjs +3 -3
- package/fesm2022/ngwr-typography.mjs +3 -3
- package/fesm2022/ngwr-validators.mjs +41 -3
- 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-waves.mjs +3 -3
- package/fesm2022/ngwr-window.mjs +12 -12
- package/file-upload/styles/_index.scss +3 -3
- package/form/styles/_index.scss +5 -5
- package/glitch-text/styles/_index.scss +3 -6
- package/image-cropper/styles/_index.scss +3 -3
- package/input/styles/_index.scss +26 -7
- package/input-otp/styles/_index.scss +23 -5
- package/keyboard/styles/_index.scss +6 -4
- package/knob/styles/_index.scss +1 -1
- package/lightbox/styles/_index.scss +29 -10
- package/list/styles/_index.scss +3 -3
- package/llms-full.txt +14 -19
- package/mention/styles/_index.scss +2 -2
- package/overlay/styles/_index.scss +1 -1
- package/package.json +1 -6
- package/pagination/styles/_index.scss +3 -26
- package/popconfirm/styles/_index.scss +1 -1
- package/popover/styles/_index.scss +2 -2
- package/radio/styles/_index.scss +20 -5
- package/rating/styles/_index.scss +12 -1
- package/schematics/migrations/v8/index.js +122 -0
- package/schematics/migrations.json +5 -0
- package/schematics/ng-add/index.js +3 -3
- package/schematics/ng-add/schema.json +6 -6
- package/schematics/provider/schema.json +1 -1
- package/schematics/use/symbol-map.json +11 -2
- package/segmented/styles/_index.scss +31 -8
- package/select/styles/_index.scss +73 -25
- package/sidebar/styles/_index.scss +3 -3
- package/slider/styles/_index.scss +2 -3
- package/speed-dial/styles/_index.scss +1 -0
- package/splitter/styles/_index.scss +4 -4
- package/spotlight-card/styles/_index.scss +8 -4
- package/stepper/styles/_index.scss +4 -4
- package/styles/_animations.scss +0 -23
- package/styles.scss +0 -1
- package/switch/styles/_index.scss +25 -6
- package/table/styles/_index.scss +9 -9
- package/tabs/styles/_index.scss +22 -3
- package/textarea/styles/_index.scss +59 -4
- package/theme/styles/_colors.scss +57 -0
- package/theme/styles/_dark.scss +22 -8
- package/theme/styles/_focus.scss +5 -0
- package/theme/styles/_variables.scss +24 -0
- package/timeline/styles/_index.scss +11 -2
- package/toast/styles/_index.scss +13 -5
- package/toolbar/styles/_index.scss +1 -1
- package/tree/styles/_index.scss +18 -17
- package/types/ngwr-alert.d.ts +16 -6
- package/types/ngwr-cascader.d.ts +5 -2
- package/types/ngwr-checkbox.d.ts +5 -2
- package/types/ngwr-click-spark.d.ts +13 -1
- package/types/ngwr-clipboard.d.ts +12 -1
- package/types/ngwr-context-menu.d.ts +20 -25
- package/types/ngwr-date-picker.d.ts +3 -0
- package/types/ngwr-density.d.ts +7 -7
- package/types/ngwr-directives.d.ts +17 -49
- package/types/ngwr-fuzzy-text.d.ts +1 -1
- package/types/ngwr-glitch-text.d.ts +9 -3
- package/types/ngwr-input-otp.d.ts +6 -2
- package/types/ngwr-input.d.ts +27 -13
- package/types/ngwr-lightbox.d.ts +9 -1
- package/types/ngwr-pagination.d.ts +3 -9
- package/types/ngwr-radio.d.ts +14 -3
- package/types/ngwr-rating.d.ts +5 -1
- package/types/ngwr-segmented.d.ts +5 -2
- package/types/ngwr-select.d.ts +6 -2
- package/types/ngwr-spotlight-card.d.ts +1 -1
- package/types/ngwr-statistic.d.ts +35 -1
- package/types/ngwr-switch.d.ts +5 -1
- package/types/ngwr-textarea.d.ts +25 -3
- package/types/ngwr-toast.d.ts +7 -1
- package/types/ngwr-validators.d.ts +3 -1
- package/types/ngwr-version.d.ts +1 -1
- package/window/styles/_index.scss +8 -8
- package/fesm2022/ngwr-scramble-text.mjs +0 -165
- package/fesm2022/ngwr-scramble-text.mjs.map +0 -1
- package/scramble-text/scramble-text.scss +0 -1
- package/scramble-text/styles/_index.scss +0 -8
- package/types/ngwr-scramble-text.d.ts +0 -49
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-toast.mjs","sources":["../../../projects/lib/toast/toast-item.ts","../../../projects/lib/toast/toast-item.html","../../../projects/lib/toast/toast-host.ts","../../../projects/lib/toast/toast-host.html","../../../projects/lib/toast/toast-ref.ts","../../../projects/lib/toast/default-toast-config.ts","../../../projects/lib/toast/tokens/toast-config.token.ts","../../../projects/lib/toast/services/toast.ts","../../../projects/lib/toast/provide-wr-toast-config.ts","../../../projects/lib/toast/ngwr-toast.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 { Component, ElementRef, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\n\nimport type { WrToastConfig, WrToastType } from './interfaces';\n\n/**\n * One toast row inside the toast host. Not used directly — see\n * `WrToast.show()`.\n *\n * @internal\n */\n@Component({\n selector: 'wr-toast',\n templateUrl: './toast-item.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n '[style.--wr-toast-duration]': 'durationMs()',\n '[style.transform]': 'swipeTransform()',\n '[style.opacity]': 'swipeOpacity()',\n '[style.transition]': 'swiping() ? \"none\" : null',\n '[attr.role]': 'liveRole()',\n '[attr.aria-live]': 'liveLevel()',\n '(mouseenter)': 'pauseRequested.emit()',\n '(mouseleave)': 'resumeRequested.emit()',\n '(touchstart)': 'onSwipeStart($event)',\n '(touchmove)': 'onSwipeMove($event)',\n '(touchend)': 'onSwipeEnd()',\n '(touchcancel)': 'onSwipeEnd()',\n },\n})\nexport class WrToastItem {\n readonly type = input<WrToastType>('info');\n readonly title = input<string | null>(null);\n readonly message = input.required<string>();\n readonly dismissible = input<boolean>(true);\n readonly showProgress = input<boolean>(false);\n readonly showCopy = input<boolean>(false);\n /** Auto-dismiss duration in ms — used to scale the progress bar. `0` hides it. */\n readonly duration = input<number>(0);\n readonly labels = input.required<WrToastConfig['labels']>();\n\n readonly dismissed = output<void>();\n readonly pauseRequested = output<void>();\n readonly resumeRequested = output<void>();\n\n /** True for ~1.5s after a successful copy; flips the icon to a check. */\n protected readonly justCopied = signal(false);\n private copyResetTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly classes = computed(() => `wr-toast wr-toast--${this.type()}`);\n\n /** Escalate to `alert`/`assertive` for danger/warning toasts. */\n protected readonly liveRole = computed(() => (this.type() === 'danger' ? 'alert' : 'status'));\n protected readonly liveLevel = computed(() =>\n this.type() === 'danger' || this.type() === 'warning' ? 'assertive' : 'polite'\n );\n\n /** Inline CSS value for `--wr-toast-duration`. */\n protected readonly durationMs = computed(() => `${this.duration()}ms`);\n\n protected readonly progressVisible = computed(() => this.showProgress() && this.duration() > 0);\n\n protected async onCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.message());\n this.justCopied.set(true);\n if (this.copyResetTimer) clearTimeout(this.copyResetTimer);\n this.copyResetTimer = setTimeout(() => this.justCopied.set(false), 1500);\n } catch {\n // Clipboard unavailable (insecure context / permission denied) — silent.\n }\n }\n\n // Swipe-sideways-to-dismiss. The toast follows the finger and fades; releasing\n // past 40% of its width emits `dismissed`, otherwise it snaps back.\n private readonly elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private swipeStartX = 0;\n private swipeWidth = 0;\n protected readonly swipeX = signal(0);\n protected readonly swiping = signal(false);\n\n protected readonly swipeTransform = computed(() => (this.swipeX() === 0 ? null : `translateX(${this.swipeX()}px)`));\n protected readonly swipeOpacity = computed(() => {\n const dist = Math.abs(this.swipeX());\n return dist === 0 ? null : Math.max(0, 1 - dist / (this.swipeWidth || 1));\n });\n\n protected onSwipeStart(event: TouchEvent): void {\n if (!this.dismissible()) return;\n const touch = event.touches[0];\n if (!touch) return;\n this.swipeStartX = touch.clientX;\n this.swipeWidth = this.elRef.nativeElement.offsetWidth;\n this.swiping.set(true);\n }\n\n protected onSwipeMove(event: TouchEvent): void {\n if (!this.swiping()) return;\n const touch = event.touches[0];\n if (!touch) return;\n this.swipeX.set(touch.clientX - this.swipeStartX);\n }\n\n protected onSwipeEnd(): void {\n if (!this.swiping()) return;\n this.swiping.set(false);\n if (Math.abs(this.swipeX()) > (this.swipeWidth || 0) * 0.4) {\n this.dismissed.emit();\n } else {\n this.swipeX.set(0);\n }\n }\n}\n","<div class=\"wr-toast__body\">\n @if (title(); as text) {\n <p class=\"wr-toast__title\">{{ text }}</p>\n }\n <p class=\"wr-toast__message\">{{ message() }}</p>\n</div>\n\n<div class=\"wr-toast__actions\">\n @if (showCopy()) {\n <button\n type=\"button\"\n class=\"wr-toast__action\"\n [attr.aria-label]=\"justCopied() ? labels().copied : labels().copy\"\n [title]=\"justCopied() ? labels().copied : labels().copy\"\n (click)=\"onCopy()\"\n >\n @if (justCopied()) {\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n } @else {\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n }\n </button>\n }\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"wr-toast__action\"\n [attr.aria-label]=\"labels().close\"\n [title]=\"labels().close\"\n (click)=\"dismissed.emit()\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </button>\n }\n</div>\n\n@if (progressVisible()) {\n <span class=\"wr-toast__progress\" aria-hidden=\"true\"></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\nimport { Component, DestroyRef, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\n\nimport type { WrToastConfig, WrToastMode, WrToastOptions, WrToastPosition } from './interfaces';\nimport { WrToastItem } from './toast-item';\n\n/** ms before a mouseleave actually collapses the stack. Buffers the cursor\n * briefly leaving the host as toasts reflow underneath it. */\nconst COLLAPSE_DELAY_MS = 120;\n\n/** Active entry pushed by the service — adds the bookkeeping fields the host renders. */\ntype ActiveToast = WrToastOptions & {\n readonly id: number;\n readonly resolvedDuration: number;\n};\n\n/**\n * Internal host that lives inside the toast overlay and renders the\n * active stack. Owned by `WrToast`.\n *\n * @internal\n */\n@Component({\n selector: 'wr-toast-host',\n templateUrl: './toast-host.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n role: 'region',\n 'aria-label': 'Notifications',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n imports: [WrToastItem],\n})\nexport class WrToastHost {\n readonly position = input<WrToastPosition>('top-end');\n readonly config = input.required<WrToastConfig>();\n /** Layout mode. @default 'stack' (Sonner-style; hover to fan out) */\n readonly mode = input<WrToastMode>('stack');\n\n /** @internal — hover toggles this in stack mode. */\n protected readonly expanded = signal(false);\n\n private readonly destroyRef = inject(DestroyRef);\n private collapseTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.clearCollapseTimer());\n }\n\n /** @internal */\n protected onMouseEnter(): void {\n this.clearCollapseTimer();\n this.expanded.set(true);\n }\n\n /** @internal — delay the collapse so cursor briefly slipping off the host\n * during a layout reflow doesn't cause a flicker. */\n protected onMouseLeave(): void {\n this.clearCollapseTimer();\n this.collapseTimer = setTimeout(() => {\n this.expanded.set(false);\n this.collapseTimer = null;\n }, COLLAPSE_DELAY_MS);\n }\n\n private clearCollapseTimer(): void {\n if (this.collapseTimer !== null) {\n clearTimeout(this.collapseTimer);\n this.collapseTimer = null;\n }\n }\n\n /** @internal — pushed by the service. */\n readonly toasts = signal<readonly ActiveToast[]>([]);\n\n /** @internal — service listens to update its internal state. */\n readonly dismissed = output<number>();\n readonly pauseRequested = output<number>();\n readonly resumeRequested = output<number>();\n readonly dismissAllRequested = output<void>();\n\n protected readonly classes = computed(() => {\n const parts = ['wr-toast-host', `wr-toast-host--${this.position()}`, `wr-toast-host--${this.mode()}`];\n if (this.mode() === 'stack' && this.expanded()) parts.push('wr-toast-host--expanded');\n return parts.join(' ');\n });\n\n /** Distance from the front of the stack (0 = newest / fully visible). */\n protected stackIndex(i: number): number {\n return this.toasts().length - 1 - i;\n }\n\n protected readonly closeAllVisible = computed(() => {\n const cfg = this.config();\n // In stack mode the toasts cascade absolutely while collapsed, which\n // makes the close-all button jump between layout positions on hover\n // (button moves → cursor leaves → host collapses → cycle = blink).\n // Only show it once the stack is expanded, or always in list mode.\n if (this.mode() === 'stack' && !this.expanded()) return false;\n return cfg.showCloseAll && this.toasts().length >= cfg.closeAllThreshold;\n });\n\n protected showProgressFor(t: WrToastOptions): boolean {\n return t.showProgress ?? this.config().showProgress;\n }\n\n protected showCopyFor(t: WrToastOptions): boolean {\n return t.showCopy ?? this.config().showCopy;\n }\n}\n","@if (closeAllVisible()) {\n <button type=\"button\" class=\"wr-toast-host__close-all\" (click)=\"dismissAllRequested.emit()\">\n {{ config().labels.closeAll }} ({{ toasts().length }})\n </button>\n}\n\n@for (toast of toasts(); track toast.id) {\n <wr-toast\n [style.--wr-toast-stack-index]=\"stackIndex($index)\"\n [type]=\"toast.type ?? 'info'\"\n [title]=\"toast.title ?? null\"\n [message]=\"toast.message\"\n [dismissible]=\"toast.dismissible ?? true\"\n [showProgress]=\"showProgressFor(toast)\"\n [showCopy]=\"showCopyFor(toast)\"\n [duration]=\"toast.resolvedDuration\"\n [labels]=\"config().labels\"\n (dismissed)=\"dismissed.emit(toast.id)\"\n (pauseRequested)=\"pauseRequested.emit(toast.id)\"\n (resumeRequested)=\"resumeRequested.emit(toast.id)\"\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 { WrToastOptions } from './interfaces';\n\n/**\n * Handle returned by `WrToast.show()`. Call `dismiss()` to remove\n * the toast early. Inspect `options` to see what the caller requested.\n */\nexport class WrToastRef {\n constructor(\n public readonly id: number,\n public readonly options: WrToastOptions,\n private readonly onDismiss: (id: number) => void\n ) {}\n\n /** Remove this toast from the stack. */\n dismiss(): void {\n this.onDismiss(this.id);\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 { WrToastConfig } from './interfaces';\n\n/**\n * Library defaults applied when no {@link provideWrToastConfig} call is\n * registered. Merged shallowly with the consumer's overrides (the `labels`\n * sub-object is merged separately so callers can override one string at a\n * time).\n */\nexport const DEFAULT_TOAST_CONFIG: WrToastConfig = {\n position: 'top-end',\n mode: 'stack',\n duration: 4000,\n showProgress: true,\n showCopy: false,\n showCloseAll: true,\n closeAllThreshold: 2,\n maxStack: 5,\n labels: {\n close: 'Close',\n copy: 'Copy',\n copied: 'Copied',\n closeAll: 'Close all',\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 { InjectionToken } from '@angular/core';\n\nimport { DEFAULT_TOAST_CONFIG } from '../default-toast-config';\nimport type { WrToastConfig } from '../interfaces';\n\n/**\n * Holds the global {@link WrToastConfig} used by {@link WrToast}.\n * The default factory returns {@link DEFAULT_TOAST_CONFIG} so the service\n * works out of the box; override via {@link provideWrToastConfig}.\n */\nexport const WR_TOAST_CONFIG = new InjectionToken<WrToastConfig>('WR_TOAST_CONFIG', {\n providedIn: 'root',\n factory: () => DEFAULT_TOAST_CONFIG,\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 OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { type ComponentRef, Service, inject } from '@angular/core';\n\nimport { WR_OVERLAY } from 'ngwr/overlay';\n\nimport type { WrToastOptions, WrToastPosition } from '../interfaces';\nimport { WrToastHost } from '../toast-host';\nimport { WrToastRef } from '../toast-ref';\nimport { WR_TOAST_CONFIG } from '../tokens';\n\ntype ActiveEntry = WrToastOptions & {\n readonly id: number;\n /** Resolved auto-dismiss duration in ms after merging with global config. */\n readonly resolvedDuration: number;\n /** Resolved corner for this stack. */\n readonly resolvedPosition: WrToastPosition;\n /** Pending timeout handle. */\n timer?: ReturnType<typeof setTimeout>;\n /** Timestamp of the last timer (re)start, used to compute remaining on pause. */\n startedAt?: number;\n /** Milliseconds left when paused. */\n remaining: number;\n};\n\n/**\n * Opens toast notifications in a single shared overlay.\n *\n * Global defaults come from {@link WR_TOAST_CONFIG}; register\n * {@link provideWrToastConfig} once at bootstrap to customise. Each\n * `show()` call accepts per-toast overrides via {@link WrToastOptions}.\n *\n * @example\n * ```ts\n * const toast = inject(WrToast);\n *\n * toast.show({ type: 'success', title: 'Saved', message: 'Profile updated.' });\n * toast.show({ type: 'danger', message: 'Network error', duration: 0 });\n * toast.show({ message: 'Permalink copied', position: 'bottom', showCopy: true });\n * ```\n *\n * @see https://ngwr.dev/components/toast\n */\n@Service()\nexport class WrToast {\n private readonly overlay = inject(WR_OVERLAY);\n private readonly config = inject(WR_TOAST_CONFIG);\n\n private overlayRef: OverlayRef | null = null;\n private hostRef: ComponentRef<WrToastHost> | null = null;\n private currentPosition: WrToastPosition = this.config.position;\n private currentMode: 'stack' | 'list' = this.config.mode;\n private nextId = 1;\n private active: ActiveEntry[] = [];\n\n /** Open a toast. Returns a handle you can `dismiss()` early. */\n show(options: WrToastOptions): WrToastRef {\n const resolvedPosition = options.position ?? this.config.position;\n const resolvedDuration = options.duration ?? this.config.duration;\n\n this.ensureHost(resolvedPosition);\n\n const entry: ActiveEntry = {\n ...options,\n id: this.nextId++,\n resolvedDuration,\n resolvedPosition,\n remaining: resolvedDuration,\n };\n\n this.active = [...this.active, entry];\n this.enforceMaxStack();\n this.pushToHost();\n this.startTimer(entry);\n\n return new WrToastRef(entry.id, options, id => this.dismiss(id));\n }\n\n /** Dismiss a single toast by id. */\n dismiss(id: number): void {\n const entry = this.active.find(t => t.id === id);\n if (entry?.timer) clearTimeout(entry.timer);\n this.active = this.active.filter(t => t.id !== id);\n this.pushToHost();\n if (this.active.length === 0) this.disposeHost();\n }\n\n /** Dismiss every visible toast. Wired to the host's \"Close all\" button. */\n dismissAll(): void {\n for (const entry of this.active) {\n if (entry.timer) clearTimeout(entry.timer);\n }\n this.active = [];\n this.disposeHost();\n }\n\n /** Change the corner the stack opens in. Affects future toasts. */\n setPosition(position: WrToastPosition): void {\n this.currentPosition = position;\n if (this.hostRef) this.hostRef.setInput('position', position);\n }\n\n /** Switch the layout mode at runtime. Persists across host re-creation. */\n setMode(mode: 'stack' | 'list'): void {\n this.currentMode = mode;\n if (this.hostRef) this.hostRef.setInput('mode', mode);\n }\n\n // Timer\n\n private startTimer(entry: ActiveEntry): void {\n if (entry.remaining <= 0) return;\n entry.startedAt = Date.now();\n entry.timer = setTimeout(() => this.dismiss(entry.id), entry.remaining);\n }\n\n private pauseTimer(entry: ActiveEntry): void {\n if (!entry.timer) return;\n clearTimeout(entry.timer);\n entry.timer = undefined;\n if (entry.startedAt) {\n entry.remaining = Math.max(0, entry.remaining - (Date.now() - entry.startedAt));\n }\n }\n\n // Host plumbing\n\n private ensureHost(position: WrToastPosition): void {\n if (this.overlayRef) {\n if (position !== this.currentPosition) this.setPosition(position);\n return;\n }\n\n this.currentPosition = position;\n\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay.position().global(),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: ['wr-toast-overlay'],\n });\n\n const portal = new ComponentPortal(WrToastHost);\n this.hostRef = this.overlayRef.attach(portal);\n this.hostRef.setInput('position', position);\n this.hostRef.setInput('mode', this.currentMode);\n this.hostRef.setInput('config', this.config);\n\n const inst = this.hostRef.instance;\n inst.dismissed.subscribe(id => this.dismiss(id));\n inst.dismissAllRequested.subscribe(() => this.dismissAll());\n inst.pauseRequested.subscribe(id => {\n const entry = this.active.find(t => t.id === id);\n if (entry) this.pauseTimer(entry);\n });\n inst.resumeRequested.subscribe(id => {\n const entry = this.active.find(t => t.id === id);\n if (entry) this.startTimer(entry);\n });\n }\n\n private enforceMaxStack(): void {\n const max = this.config.maxStack;\n if (max <= 0 || this.active.length <= max) return;\n const overflow = this.active.slice(0, this.active.length - max);\n for (const entry of overflow) {\n if (entry.timer) clearTimeout(entry.timer);\n }\n this.active = this.active.slice(this.active.length - max);\n }\n\n private pushToHost(): void {\n this.hostRef?.instance.toasts.set([...this.active]);\n }\n\n private disposeHost(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n this.hostRef = null;\n }\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 { DEFAULT_TOAST_CONFIG } from './default-toast-config';\nimport type { WrToastConfig } from './interfaces';\nimport { WR_TOAST_CONFIG } from './tokens';\n\n/**\n * Registers a global {@link WrToastConfig} for {@link WrToast}. Any\n * field you omit falls back to {@link DEFAULT_TOAST_CONFIG}; the `labels`\n * sub-object is merged separately so you can override a single string at a\n * time (useful for i18n).\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideWrToastConfig({\n * position: 'bottom-end',\n * showCopy: true,\n * maxStack: 3,\n * labels: { close: 'Закрыть', copy: 'Копировать', copied: 'Скопировано', closeAll: 'Закрыть все' },\n * }),\n * ],\n * });\n * ```\n */\nexport function provideWrToastConfig(config: Partial<WrToastConfig>): EnvironmentProviders {\n const merged: WrToastConfig = {\n ...DEFAULT_TOAST_CONFIG,\n ...config,\n labels: { ...DEFAULT_TOAST_CONFIG.labels, ...config.labels },\n };\n return makeEnvironmentProviders([{ provide: WR_TOAST_CONFIG, useValue: merged }]);\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-toast.mjs","sources":["../../../projects/lib/toast/toast-item.ts","../../../projects/lib/toast/toast-item.html","../../../projects/lib/toast/toast-host.ts","../../../projects/lib/toast/toast-host.html","../../../projects/lib/toast/toast-ref.ts","../../../projects/lib/toast/default-toast-config.ts","../../../projects/lib/toast/tokens/toast-config.token.ts","../../../projects/lib/toast/services/toast.ts","../../../projects/lib/toast/provide-wr-toast-config.ts","../../../projects/lib/toast/ngwr-toast.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 { Component, ElementRef, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\n\nimport type { WrToastConfig, WrToastType } from './interfaces';\n\n/**\n * One toast row inside the toast host. Not used directly — see\n * `WrToast.show()`.\n *\n * @internal\n */\n@Component({\n selector: 'wr-toast',\n templateUrl: './toast-item.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n '[style.--wr-toast-duration]': 'durationMs()',\n '[style.transform]': 'swipeTransform()',\n '[style.opacity]': 'swipeOpacity()',\n '[style.transition]': 'swiping() ? \"none\" : null',\n '[attr.role]': 'liveRole()',\n '[attr.aria-live]': 'liveLevel()',\n '(mouseenter)': 'pauseRequested.emit()',\n '(mouseleave)': 'resumeRequested.emit()',\n '(touchstart)': 'onSwipeStart($event)',\n '(touchmove)': 'onSwipeMove($event)',\n '(touchend)': 'onSwipeEnd()',\n '(touchcancel)': 'onSwipeEnd()',\n },\n})\nexport class WrToastItem {\n readonly type = input<WrToastType>('info');\n readonly title = input<string | null>(null);\n readonly message = input.required<string>();\n readonly dismissible = input<boolean>(true);\n readonly showProgress = input<boolean>(false);\n readonly showCopy = input<boolean>(false);\n /** Auto-dismiss duration in ms — used to scale the progress bar. `0` hides it. */\n readonly duration = input<number>(0);\n readonly labels = input.required<WrToastConfig['labels']>();\n\n readonly dismissed = output<void>();\n readonly pauseRequested = output<void>();\n readonly resumeRequested = output<void>();\n\n /** True for ~1.5s after a successful copy; flips the icon to a check. */\n protected readonly justCopied = signal(false);\n private copyResetTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly classes = computed(() => `wr-toast wr-toast--${this.type()}`);\n\n /** Escalate to `alert`/`assertive` for danger/warning toasts. */\n protected readonly liveRole = computed(() => (this.type() === 'danger' ? 'alert' : 'status'));\n protected readonly liveLevel = computed(() =>\n this.type() === 'danger' || this.type() === 'warning' ? 'assertive' : 'polite'\n );\n\n /** Inline CSS value for `--wr-toast-duration`. */\n protected readonly durationMs = computed(() => `${this.duration()}ms`);\n\n protected readonly progressVisible = computed(() => this.showProgress() && this.duration() > 0);\n\n protected async onCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.message());\n this.justCopied.set(true);\n if (this.copyResetTimer) clearTimeout(this.copyResetTimer);\n this.copyResetTimer = setTimeout(() => this.justCopied.set(false), 1500);\n } catch {\n // Clipboard unavailable (insecure context / permission denied) — silent.\n }\n }\n\n // Swipe-sideways-to-dismiss. The toast follows the finger and fades; releasing\n // past 40% of its width emits `dismissed`, otherwise it snaps back.\n private readonly elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private swipeStartX = 0;\n private swipeWidth = 0;\n protected readonly swipeX = signal(0);\n protected readonly swiping = signal(false);\n\n protected readonly swipeTransform = computed(() => (this.swipeX() === 0 ? null : `translateX(${this.swipeX()}px)`));\n protected readonly swipeOpacity = computed(() => {\n const dist = Math.abs(this.swipeX());\n return dist === 0 ? null : Math.max(0, 1 - dist / (this.swipeWidth || 1));\n });\n\n protected onSwipeStart(event: TouchEvent): void {\n if (!this.dismissible()) return;\n const touch = event.touches[0];\n if (!touch) return;\n this.swipeStartX = touch.clientX;\n this.swipeWidth = this.elRef.nativeElement.offsetWidth;\n this.swiping.set(true);\n }\n\n protected onSwipeMove(event: TouchEvent): void {\n if (!this.swiping()) return;\n const touch = event.touches[0];\n if (!touch) return;\n this.swipeX.set(touch.clientX - this.swipeStartX);\n }\n\n protected onSwipeEnd(): void {\n if (!this.swiping()) return;\n this.swiping.set(false);\n if (Math.abs(this.swipeX()) > (this.swipeWidth || 0) * 0.4) {\n this.dismissed.emit();\n } else {\n this.swipeX.set(0);\n }\n }\n}\n","<div class=\"wr-toast__body\">\n @if (title(); as text) {\n <p class=\"wr-toast__title\">{{ text }}</p>\n }\n <p class=\"wr-toast__message\">{{ message() }}</p>\n</div>\n\n<div class=\"wr-toast__actions\">\n @if (showCopy()) {\n <button\n type=\"button\"\n class=\"wr-toast__action\"\n [attr.aria-label]=\"justCopied() ? labels().copied : labels().copy\"\n [title]=\"justCopied() ? labels().copied : labels().copy\"\n (click)=\"onCopy()\"\n >\n @if (justCopied()) {\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n } @else {\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n }\n </button>\n }\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"wr-toast__action\"\n [attr.aria-label]=\"labels().close\"\n [title]=\"labels().close\"\n (click)=\"dismissed.emit()\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </button>\n }\n</div>\n\n@if (progressVisible()) {\n <span class=\"wr-toast__progress\" aria-hidden=\"true\"></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\nimport { Component, DestroyRef, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\n\nimport type { WrToastConfig, WrToastMode, WrToastOptions, WrToastPosition } from './interfaces';\nimport { WrToastItem } from './toast-item';\n\n/** ms before a mouseleave actually collapses the stack. Buffers the cursor\n * briefly leaving the host as toasts reflow underneath it. */\nconst COLLAPSE_DELAY_MS = 120;\n\n/** Active entry pushed by the service — adds the bookkeeping fields the host renders. */\ntype ActiveToast = WrToastOptions & {\n readonly id: number;\n readonly resolvedDuration: number;\n};\n\n/**\n * Internal host that lives inside the toast overlay and renders the\n * active stack. Owned by `WrToast`.\n *\n * @internal\n */\n@Component({\n selector: 'wr-toast-host',\n templateUrl: './toast-host.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n role: 'region',\n 'aria-label': 'Notifications',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n imports: [WrToastItem],\n})\nexport class WrToastHost {\n readonly position = input<WrToastPosition>('top-end');\n readonly config = input.required<WrToastConfig>();\n /** Layout mode. @default 'stack' (Sonner-style; hover to fan out) */\n readonly mode = input<WrToastMode>('stack');\n\n /** @internal — hover toggles this in stack mode. */\n protected readonly expanded = signal(false);\n\n private readonly destroyRef = inject(DestroyRef);\n private collapseTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.clearCollapseTimer());\n }\n\n /** @internal */\n protected onMouseEnter(): void {\n this.clearCollapseTimer();\n this.expanded.set(true);\n }\n\n /** @internal — delay the collapse so cursor briefly slipping off the host\n * during a layout reflow doesn't cause a flicker. */\n protected onMouseLeave(): void {\n this.clearCollapseTimer();\n this.collapseTimer = setTimeout(() => {\n this.expanded.set(false);\n this.collapseTimer = null;\n }, COLLAPSE_DELAY_MS);\n }\n\n private clearCollapseTimer(): void {\n if (this.collapseTimer !== null) {\n clearTimeout(this.collapseTimer);\n this.collapseTimer = null;\n }\n }\n\n /** @internal — pushed by the service: the rendered (capped) stack. */\n readonly toasts = signal<readonly ActiveToast[]>([]);\n\n /** @internal — pushed by the service: count still queued behind the cap. */\n readonly queued = signal(0);\n\n /** Total outstanding toasts (visible + queued) — what \"Close all\" clears. */\n protected readonly totalCount = computed(() => this.toasts().length + this.queued());\n\n /** @internal — service listens to update its internal state. */\n readonly dismissed = output<number>();\n readonly pauseRequested = output<number>();\n readonly resumeRequested = output<number>();\n readonly dismissAllRequested = output<void>();\n\n protected readonly classes = computed(() => {\n const parts = ['wr-toast-host', `wr-toast-host--${this.position()}`, `wr-toast-host--${this.mode()}`];\n if (this.mode() === 'stack' && this.expanded()) parts.push('wr-toast-host--expanded');\n return parts.join(' ');\n });\n\n /** Distance from the front of the stack (0 = newest / fully visible). */\n protected stackIndex(i: number): number {\n return this.toasts().length - 1 - i;\n }\n\n protected readonly closeAllVisible = computed(() => {\n const cfg = this.config();\n // In stack mode the toasts cascade absolutely while collapsed, which\n // makes the close-all button jump between layout positions on hover\n // (button moves → cursor leaves → host collapses → cycle = blink).\n // Only show it once the stack is expanded, or always in list mode.\n if (this.mode() === 'stack' && !this.expanded()) return false;\n return cfg.showCloseAll && this.toasts().length >= cfg.closeAllThreshold;\n });\n\n protected showProgressFor(t: WrToastOptions): boolean {\n return t.showProgress ?? this.config().showProgress;\n }\n\n protected showCopyFor(t: WrToastOptions): boolean {\n return t.showCopy ?? this.config().showCopy;\n }\n}\n","@if (closeAllVisible()) {\n <button type=\"button\" class=\"wr-toast-host__close-all\" (click)=\"dismissAllRequested.emit()\">\n {{ config().labels.closeAll }} ({{ totalCount() }})\n </button>\n}\n\n@for (toast of toasts(); track toast.id) {\n <wr-toast\n [style.--wr-toast-stack-index]=\"stackIndex($index)\"\n [type]=\"toast.type ?? 'info'\"\n [title]=\"toast.title ?? null\"\n [message]=\"toast.message\"\n [dismissible]=\"toast.dismissible ?? true\"\n [showProgress]=\"showProgressFor(toast)\"\n [showCopy]=\"showCopyFor(toast)\"\n [duration]=\"toast.resolvedDuration\"\n [labels]=\"config().labels\"\n (dismissed)=\"dismissed.emit(toast.id)\"\n (pauseRequested)=\"pauseRequested.emit(toast.id)\"\n (resumeRequested)=\"resumeRequested.emit(toast.id)\"\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 { WrToastOptions } from './interfaces';\n\n/**\n * Handle returned by `WrToast.show()`. Call `dismiss()` to remove\n * the toast early. Inspect `options` to see what the caller requested.\n */\nexport class WrToastRef {\n constructor(\n public readonly id: number,\n public readonly options: WrToastOptions,\n private readonly onDismiss: (id: number) => void\n ) {}\n\n /** Remove this toast from the stack. */\n dismiss(): void {\n this.onDismiss(this.id);\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 { WrToastConfig } from './interfaces';\n\n/**\n * Library defaults applied when no {@link provideWrToastConfig} call is\n * registered. Merged shallowly with the consumer's overrides (the `labels`\n * sub-object is merged separately so callers can override one string at a\n * time).\n */\nexport const DEFAULT_TOAST_CONFIG: WrToastConfig = {\n position: 'top-end',\n mode: 'stack',\n duration: 4000,\n showProgress: true,\n showCopy: false,\n showCloseAll: true,\n closeAllThreshold: 2,\n maxStack: 5,\n labels: {\n close: 'Close',\n copy: 'Copy',\n copied: 'Copied',\n closeAll: 'Close all',\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 { InjectionToken } from '@angular/core';\n\nimport { DEFAULT_TOAST_CONFIG } from '../default-toast-config';\nimport type { WrToastConfig } from '../interfaces';\n\n/**\n * Holds the global {@link WrToastConfig} used by {@link WrToast}.\n * The default factory returns {@link DEFAULT_TOAST_CONFIG} so the service\n * works out of the box; override via {@link provideWrToastConfig}.\n */\nexport const WR_TOAST_CONFIG = new InjectionToken<WrToastConfig>('WR_TOAST_CONFIG', {\n providedIn: 'root',\n factory: () => DEFAULT_TOAST_CONFIG,\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 OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { type ComponentRef, Service, inject } from '@angular/core';\n\nimport { WR_OVERLAY } from 'ngwr/overlay';\n\nimport type { WrToastOptions, WrToastPosition } from '../interfaces';\nimport { WrToastHost } from '../toast-host';\nimport { WrToastRef } from '../toast-ref';\nimport { WR_TOAST_CONFIG } from '../tokens';\n\ntype ActiveEntry = WrToastOptions & {\n readonly id: number;\n /** Resolved auto-dismiss duration in ms after merging with global config. */\n readonly resolvedDuration: number;\n /** Resolved corner for this stack. */\n readonly resolvedPosition: WrToastPosition;\n /** Pending timeout handle. */\n timer?: ReturnType<typeof setTimeout>;\n /** Timestamp of the last timer (re)start, used to compute remaining on pause. */\n startedAt?: number;\n /** Milliseconds left when paused. */\n remaining: number;\n};\n\n/**\n * Opens toast notifications in a single shared overlay.\n *\n * Global defaults come from {@link WR_TOAST_CONFIG}; register\n * {@link provideWrToastConfig} once at bootstrap to customise. Each\n * `show()` call accepts per-toast overrides via {@link WrToastOptions}.\n *\n * @example\n * ```ts\n * const toast = inject(WrToast);\n *\n * toast.show({ type: 'success', title: 'Saved', message: 'Profile updated.' });\n * toast.show({ type: 'danger', message: 'Network error', duration: 0 });\n * toast.show({ message: 'Permalink copied', position: 'bottom', showCopy: true });\n * ```\n *\n * @see https://ngwr.dev/components/toast\n */\n@Service()\nexport class WrToast {\n private readonly overlay = inject(WR_OVERLAY);\n private readonly config = inject(WR_TOAST_CONFIG);\n\n private overlayRef: OverlayRef | null = null;\n private hostRef: ComponentRef<WrToastHost> | null = null;\n private currentPosition: WrToastPosition = this.config.position;\n private currentMode: 'stack' | 'list' = this.config.mode;\n private nextId = 1;\n /** Currently rendered toasts (capped at `config.maxStack`). */\n private active: ActiveEntry[] = [];\n /** Overflow waiting for a free slot — promoted FIFO as actives dismiss, so\n * nothing is ever silently dropped. */\n private queue: ActiveEntry[] = [];\n\n /** Open a toast. Returns a handle you can `dismiss()` early. */\n show(options: WrToastOptions): WrToastRef {\n const resolvedPosition = options.position ?? this.config.position;\n const resolvedDuration = options.duration ?? this.config.duration;\n\n this.ensureHost(resolvedPosition);\n\n const entry: ActiveEntry = {\n ...options,\n id: this.nextId++,\n resolvedDuration,\n resolvedPosition,\n remaining: resolvedDuration,\n };\n\n const max = this.config.maxStack;\n if (max > 0 && this.active.length >= max) {\n // Stack is full — hold this one in the queue (no timer until it's shown).\n this.queue = [...this.queue, entry];\n this.pushToHost();\n } else {\n this.active = [...this.active, entry];\n this.pushToHost();\n this.startTimer(entry);\n }\n\n return new WrToastRef(entry.id, options, id => this.dismiss(id));\n }\n\n /** Dismiss a single toast by id. */\n dismiss(id: number): void {\n const entry = this.active.find(t => t.id === id);\n if (entry?.timer) clearTimeout(entry.timer);\n this.active = this.active.filter(t => t.id !== id);\n // A dismiss can also target a still-queued toast.\n this.queue = this.queue.filter(t => t.id !== id);\n this.promoteFromQueue();\n this.pushToHost();\n if (this.active.length === 0 && this.queue.length === 0) this.disposeHost();\n }\n\n /** Dismiss every visible toast. Wired to the host's \"Close all\" button. */\n dismissAll(): void {\n for (const entry of this.active) {\n if (entry.timer) clearTimeout(entry.timer);\n }\n this.active = [];\n this.queue = [];\n this.disposeHost();\n }\n\n /** Change the corner the stack opens in. Affects future toasts. */\n setPosition(position: WrToastPosition): void {\n this.currentPosition = position;\n if (this.hostRef) this.hostRef.setInput('position', position);\n }\n\n /** Switch the layout mode at runtime. Persists across host re-creation. */\n setMode(mode: 'stack' | 'list'): void {\n this.currentMode = mode;\n if (this.hostRef) this.hostRef.setInput('mode', mode);\n }\n\n // Timer\n\n private startTimer(entry: ActiveEntry): void {\n if (entry.remaining <= 0) return;\n entry.startedAt = Date.now();\n entry.timer = setTimeout(() => this.dismiss(entry.id), entry.remaining);\n }\n\n private pauseTimer(entry: ActiveEntry): void {\n if (!entry.timer) return;\n clearTimeout(entry.timer);\n entry.timer = undefined;\n if (entry.startedAt) {\n entry.remaining = Math.max(0, entry.remaining - (Date.now() - entry.startedAt));\n }\n }\n\n // Host plumbing\n\n private ensureHost(position: WrToastPosition): void {\n if (this.overlayRef) {\n if (position !== this.currentPosition) this.setPosition(position);\n return;\n }\n\n this.currentPosition = position;\n\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay.position().global(),\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n hasBackdrop: false,\n panelClass: ['wr-toast-overlay'],\n });\n\n const portal = new ComponentPortal(WrToastHost);\n this.hostRef = this.overlayRef.attach(portal);\n this.hostRef.setInput('position', position);\n this.hostRef.setInput('mode', this.currentMode);\n this.hostRef.setInput('config', this.config);\n\n const inst = this.hostRef.instance;\n inst.dismissed.subscribe(id => this.dismiss(id));\n inst.dismissAllRequested.subscribe(() => this.dismissAll());\n inst.pauseRequested.subscribe(id => {\n const entry = this.active.find(t => t.id === id);\n if (entry) this.pauseTimer(entry);\n });\n inst.resumeRequested.subscribe(id => {\n const entry = this.active.find(t => t.id === id);\n if (entry) this.startTimer(entry);\n });\n }\n\n /** Fill any free stack slots from the queue (FIFO), starting each promoted\n * toast's auto-dismiss timer only as it becomes visible. */\n private promoteFromQueue(): void {\n const max = this.config.maxStack;\n while ((max <= 0 || this.active.length < max) && this.queue.length > 0) {\n const [next, ...rest] = this.queue;\n this.queue = rest;\n this.active = [...this.active, next];\n this.startTimer(next);\n }\n }\n\n private pushToHost(): void {\n this.hostRef?.instance.toasts.set([...this.active]);\n this.hostRef?.instance.queued.set(this.queue.length);\n }\n\n private disposeHost(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n this.hostRef = null;\n }\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 { DEFAULT_TOAST_CONFIG } from './default-toast-config';\nimport type { WrToastConfig } from './interfaces';\nimport { WR_TOAST_CONFIG } from './tokens';\n\n/**\n * Registers a global {@link WrToastConfig} for {@link WrToast}. Any\n * field you omit falls back to {@link DEFAULT_TOAST_CONFIG}; the `labels`\n * sub-object is merged separately so you can override a single string at a\n * time (useful for i18n).\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideWrToastConfig({\n * position: 'bottom-end',\n * showCopy: true,\n * maxStack: 3,\n * labels: { close: 'Закрыть', copy: 'Копировать', copied: 'Скопировано', closeAll: 'Закрыть все' },\n * }),\n * ],\n * });\n * ```\n */\nexport function provideWrToastConfig(config: Partial<WrToastConfig>): EnvironmentProviders {\n const merged: WrToastConfig = {\n ...DEFAULT_TOAST_CONFIG,\n ...config,\n labels: { ...DEFAULT_TOAST_CONFIG.labels, ...config.labels },\n };\n return makeEnvironmentProviders([{ provide: WR_TOAST_CONFIG, useValue: merged }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -37,10 +37,10 @@ class WrToolbar {
|
|
|
37
37
|
* adapts inside a narrow column or split pane). @default false
|
|
38
38
|
*/
|
|
39
39
|
responsive = input(false, { ...(ngDevMode ? { debugName: "responsive" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
40
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
41
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.
|
|
40
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrToolbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
41
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: WrToolbar, isStandalone: true, selector: "wr-toolbar", inputs: { responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "toolbar" }, properties: { "class.wr-toolbar--responsive": "responsive()" }, classAttribute: "wr-toolbar" }, ngImport: i0, template: "<div class=\"wr-toolbar__zone wr-toolbar__zone--start\">\n <ng-content select=\"[wrToolbarStart]\" />\n</div>\n<div class=\"wr-toolbar__zone wr-toolbar__zone--center\">\n <ng-content select=\"[wrToolbarCenter]\" />\n</div>\n<div class=\"wr-toolbar__zone wr-toolbar__zone--end\">\n <ng-content select=\"[wrToolbarEnd]\" />\n</div>\n", encapsulation: i0.ViewEncapsulation.None });
|
|
42
42
|
}
|
|
43
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrToolbar, decorators: [{
|
|
44
44
|
type: Component,
|
|
45
45
|
args: [{ selector: 'wr-toolbar', encapsulation: ViewEncapsulation.None, host: { class: 'wr-toolbar', role: 'toolbar', '[class.wr-toolbar--responsive]': 'responsive()' }, template: "<div class=\"wr-toolbar__zone wr-toolbar__zone--start\">\n <ng-content select=\"[wrToolbarStart]\" />\n</div>\n<div class=\"wr-toolbar__zone wr-toolbar__zone--center\">\n <ng-content select=\"[wrToolbarCenter]\" />\n</div>\n<div class=\"wr-toolbar__zone wr-toolbar__zone--end\">\n <ng-content select=\"[wrToolbarEnd]\" />\n</div>\n" }]
|
|
46
46
|
}], propDecorators: { responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }] } });
|
package/fesm2022/ngwr-tree.mjs
CHANGED
|
@@ -453,8 +453,8 @@ class WrTree {
|
|
|
453
453
|
this.overlayRef.dispose();
|
|
454
454
|
this.overlayRef = null;
|
|
455
455
|
}
|
|
456
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
457
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.
|
|
456
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrTree, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
457
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: WrTree, isStandalone: true, selector: "wr-tree", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, openOn: { classPropertyName: "openOn", publicName: "openOn", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, maxTagCount: { classPropertyName: "maxTagCount", publicName: "maxTagCount", isSignal: true, isRequired: false, transformFunction: null }, defaultExpandAll: { classPropertyName: "defaultExpandAll", publicName: "defaultExpandAll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", expanded: "expandedChange" }, host: { properties: { "class": "classes()" } }, providers: [
|
|
458
458
|
{
|
|
459
459
|
provide: NG_VALUE_ACCESSOR,
|
|
460
460
|
// eslint-disable-next-line @angular-eslint/no-forward-ref
|
|
@@ -463,7 +463,7 @@ class WrTree {
|
|
|
463
463
|
},
|
|
464
464
|
], viewQueries: [{ propertyName: "panelTpl", first: true, predicate: ["panelTpl"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "@if (isOverlay()) {\n <button\n type=\"button\"\n class=\"wr-tree__trigger\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'tree'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n (click)=\"onTriggerClick()\"\n (blur)=\"onTouched()\"\n >\n @if (isMulti()) {\n @if (hasSelection()) {\n <span class=\"wr-tree__chips\">\n @for (chip of visibleChips(); track chip.id) {\n <span class=\"wr-tree__chip\">\n <span class=\"wr-tree__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-tree__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.id, $event)\"\n (keydown.enter)=\"removeChip(chip.id, $event)\"\n (keydown.space)=\"removeChip(chip.id, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-tree__chip wr-tree__chip--more\">+{{ extra }} more</span>\n }\n </span>\n } @else {\n <span class=\"wr-tree__placeholder\">{{ placeholder() }}</span>\n }\n } @else {\n @if (singleLabel(); as label) {\n <span class=\"wr-tree__value\">{{ label }}</span>\n } @else {\n <span class=\"wr-tree__placeholder\">{{ placeholder() }}</span>\n }\n }\n\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-tree__clear\"\n role=\"button\"\n [attr.aria-label]=\"clearLabel\"\n tabindex=\"-1\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n\n <svg\n class=\"wr-icon__svg wr-tree__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Tree list lives inside the overlay panel. -->\n <ng-template #panelTpl>\n <div class=\"wr-tree-panel\" [attr.id]=\"panelId\">\n <ng-container [ngTemplateOutlet]=\"listTpl\" />\n </div>\n </ng-template>\n} @else {\n <ng-container [ngTemplateOutlet]=\"listTpl\" />\n}\n\n<!-- Shared row list \u2014 rendered inline (default) or projected into the\n overlay panel (when openOn=\"overlay\"). -->\n<ng-template #listTpl>\n <!-- Roving tabindex: the tree owns keyboard focus and routes arrow keys\n to its currently-focused row. -->\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <ul class=\"wr-tree__list\" role=\"tree\" (keydown)=\"onKeydown($event)\">\n @for (entry of flat(); track entry.node.id) {\n <!-- Click handler lives on focusable rows; keyboard handling is owned\n by the parent <ul> via the roving-tabindex pattern. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\n <li\n class=\"wr-tree__row\"\n role=\"treeitem\"\n [class.wr-tree__row--selected]=\"selectedSet().has(entry.node.id)\"\n [class.wr-tree__row--disabled]=\"entry.node.disabled\"\n [attr.aria-level]=\"entry.depth + 1\"\n [attr.aria-expanded]=\"entry.hasChildren ? expandedSet().has(entry.node.id) : null\"\n [attr.aria-selected]=\"selectionMode() === 'none' ? null : selectedSet().has(entry.node.id)\"\n [attr.aria-disabled]=\"entry.node.disabled || isDisabled() || null\"\n [attr.data-tree-index]=\"$index\"\n [attr.tabindex]=\"$index === focusedIndex() ? 0 : -1\"\n [style.--wr-tree-depth]=\"entry.depth\"\n (click)=\"onRowClick(entry, $event)\"\n >\n @if (entry.hasChildren) {\n <button\n type=\"button\"\n class=\"wr-tree__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"expandedSet().has(entry.node.id) ? collapseLabel : expandLabel\"\n (click)=\"onToggleClick(entry.node, $event)\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M3 1 L7 5 L3 9 Z\" fill=\"currentColor\" />\n </svg>\n </button>\n } @else {\n <span class=\"wr-tree__toggle wr-tree__toggle--leaf\" aria-hidden=\"true\"></span>\n }\n <span class=\"wr-tree__label\">{{ entry.node.label }}</span>\n </li>\n }\n </ul>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
465
465
|
}
|
|
466
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
466
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrTree, decorators: [{
|
|
467
467
|
type: Component,
|
|
468
468
|
args: [{ selector: 'wr-tree', encapsulation: ViewEncapsulation.None, host: { '[class]': 'classes()' }, imports: [NgTemplateOutlet], providers: [
|
|
469
469
|
{
|
|
@@ -209,10 +209,10 @@ class WrTypewriter {
|
|
|
209
209
|
this.phase.set('deleting');
|
|
210
210
|
this.scheduleNext(this.pauseDuration());
|
|
211
211
|
}
|
|
212
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
213
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.
|
|
212
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrTypewriter, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
213
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: WrTypewriter, isStandalone: true, selector: "wr-typewriter", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, typingSpeed: { classPropertyName: "typingSpeed", publicName: "typingSpeed", isSignal: true, isRequired: false, transformFunction: null }, initialDelay: { classPropertyName: "initialDelay", publicName: "initialDelay", isSignal: true, isRequired: false, transformFunction: null }, pauseDuration: { classPropertyName: "pauseDuration", publicName: "pauseDuration", isSignal: true, isRequired: false, transformFunction: null }, deletingSpeed: { classPropertyName: "deletingSpeed", publicName: "deletingSpeed", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, showCursor: { classPropertyName: "showCursor", publicName: "showCursor", isSignal: true, isRequired: false, transformFunction: null }, hideCursorWhileTyping: { classPropertyName: "hideCursorWhileTyping", publicName: "hideCursorWhileTyping", isSignal: true, isRequired: false, transformFunction: null }, cursorCharacter: { classPropertyName: "cursorCharacter", publicName: "cursorCharacter", isSignal: true, isRequired: false, transformFunction: null }, cursorBlinkDuration: { classPropertyName: "cursorBlinkDuration", publicName: "cursorBlinkDuration", isSignal: true, isRequired: false, transformFunction: null }, textColors: { classPropertyName: "textColors", publicName: "textColors", isSignal: true, isRequired: false, transformFunction: null }, variableSpeed: { classPropertyName: "variableSpeed", publicName: "variableSpeed", isSignal: true, isRequired: false, transformFunction: null }, reverseMode: { classPropertyName: "reverseMode", publicName: "reverseMode", isSignal: true, isRequired: false, transformFunction: null }, startOnVisible: { classPropertyName: "startOnVisible", publicName: "startOnVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sentenceComplete: "sentenceComplete" }, host: { properties: { "style.color": "activeColor()", "style.--wr-typewriter-cursor-blink": "cursorBlinkDuration() + 's'" }, classAttribute: "wr-typewriter" }, ngImport: i0, template: "<span class=\"wr-typewriter__content\">{{ displayed() }}</span>\n@if (cursorVisible()) {\n <span class=\"wr-typewriter__cursor\" aria-hidden=\"true\">{{ cursorCharacter() }}</span>\n}\n", styles: [".wr-typewriter{--wr-typewriter-cursor-blink: .5s;display:inline-flex;align-items:baseline}.wr-typewriter__content{white-space:pre}.wr-typewriter__cursor{display:inline-block;margin-left:1px;animation:wr-typewriter-blink var(--wr-typewriter-cursor-blink) ease-in-out infinite alternate}@keyframes wr-typewriter-blink{0%{opacity:1}to{opacity:0}}@media(prefers-reduced-motion:reduce){.wr-typewriter__cursor{animation:none;opacity:1}}\n"], encapsulation: i0.ViewEncapsulation.None });
|
|
214
214
|
}
|
|
215
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrTypewriter, decorators: [{
|
|
216
216
|
type: Component,
|
|
217
217
|
args: [{ selector: 'wr-typewriter', encapsulation: ViewEncapsulation.None, host: {
|
|
218
218
|
class: 'wr-typewriter',
|
|
@@ -60,10 +60,10 @@ class WrTypography {
|
|
|
60
60
|
return parts.join(' ');
|
|
61
61
|
}, /* @ts-ignore */
|
|
62
62
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
63
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
64
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.
|
|
63
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrTypography, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
64
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: WrTypography, isStandalone: true, selector: "[wrTypography]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, truncate: { classPropertyName: "truncate", publicName: "truncate", isSignal: true, isRequired: false, transformFunction: null }, mono: { classPropertyName: "mono", publicName: "mono", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
65
65
|
}
|
|
66
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrTypography, decorators: [{
|
|
67
67
|
type: Directive,
|
|
68
68
|
args: [{
|
|
69
69
|
selector: '[wrTypography]',
|
|
@@ -14,6 +14,17 @@ function stringValue(control) {
|
|
|
14
14
|
return String(v).trim();
|
|
15
15
|
return '';
|
|
16
16
|
}
|
|
17
|
+
/** Like {@link stringValue} but preserves whitespace — for checks that inspect spacing. */
|
|
18
|
+
function rawStringValue(control) {
|
|
19
|
+
const v = control.value;
|
|
20
|
+
if (v == null)
|
|
21
|
+
return '';
|
|
22
|
+
if (typeof v === 'string')
|
|
23
|
+
return v;
|
|
24
|
+
if (typeof v === 'number' || typeof v === 'boolean')
|
|
25
|
+
return String(v);
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
17
28
|
/** Luhn checksum. Returns true when the digit string is a valid card number. */
|
|
18
29
|
function luhn(digits) {
|
|
19
30
|
let sum = 0;
|
|
@@ -86,7 +97,7 @@ const WrValidators = {
|
|
|
86
97
|
// String shape
|
|
87
98
|
/** No whitespace anywhere in the value. */
|
|
88
99
|
noWhitespace: (control) => {
|
|
89
|
-
const v =
|
|
100
|
+
const v = rawStringValue(control);
|
|
90
101
|
if (v === '')
|
|
91
102
|
return null;
|
|
92
103
|
return /\s/.test(v) ? { noWhitespace: true } : null;
|
|
@@ -101,10 +112,12 @@ const WrValidators = {
|
|
|
101
112
|
// Network / payments
|
|
102
113
|
/**
|
|
103
114
|
* Valid URL. Accepts any scheme by default; pass `{ protocols: ['https'] }`
|
|
104
|
-
* to restrict.
|
|
115
|
+
* to restrict. A scheme is required by default; pass `{ requireProtocol: false }`
|
|
116
|
+
* to also accept bare domains (e.g. `ngwr.dev`), assuming `https`.
|
|
105
117
|
*/
|
|
106
118
|
url: (options = {}) => {
|
|
107
119
|
const allow = options.protocols?.map(p => p.replace(/:$/, '').toLowerCase());
|
|
120
|
+
const requireProtocol = options.requireProtocol ?? true;
|
|
108
121
|
return (control) => {
|
|
109
122
|
const v = stringValue(control);
|
|
110
123
|
if (v === '')
|
|
@@ -114,9 +127,34 @@ const WrValidators = {
|
|
|
114
127
|
parsed = new URL(v);
|
|
115
128
|
}
|
|
116
129
|
catch {
|
|
130
|
+
// Bare domain support: when protocols aren't required and the input has
|
|
131
|
+
// no scheme, retry assuming `https://`.
|
|
132
|
+
if (!requireProtocol && !/^[a-z][a-z0-9+.-]*:/i.test(v)) {
|
|
133
|
+
let retried;
|
|
134
|
+
try {
|
|
135
|
+
retried = new URL(`https://${v}`);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return { url: true };
|
|
139
|
+
}
|
|
140
|
+
if (retried.host === '') {
|
|
141
|
+
return { url: true };
|
|
142
|
+
}
|
|
143
|
+
if (allow && !allow.includes('https')) {
|
|
144
|
+
return { url: { allowed: allow } };
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
return { url: true };
|
|
149
|
+
}
|
|
150
|
+
const protocol = parsed.protocol.replace(/:$/, '').toLowerCase();
|
|
151
|
+
// WHATWG auto-inserts the authority for "special" schemes, so `http:host`
|
|
152
|
+
// (missing `//`) still parses. Require the explicit `//` for those.
|
|
153
|
+
const needsAuthority = ['http', 'https', 'ws', 'wss', 'ftp', 'file'].includes(protocol);
|
|
154
|
+
if (needsAuthority && !/^[a-z][a-z0-9+.-]*:\/\//i.test(v)) {
|
|
117
155
|
return { url: true };
|
|
118
156
|
}
|
|
119
|
-
if (allow && !allow.includes(
|
|
157
|
+
if (allow && !allow.includes(protocol)) {
|
|
120
158
|
return { url: { allowed: allow } };
|
|
121
159
|
}
|
|
122
160
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-validators.mjs","sources":["../../../projects/lib/validators/wr-validators.ts","../../../projects/lib/validators/ngwr-validators.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 AbstractControl, type ValidationErrors, type ValidatorFn } from '@angular/forms';\n\nfunction stringValue(control: AbstractControl): string {\n const v: unknown = control.value;\n if (v == null) return '';\n if (typeof v === 'string') return v.trim();\n if (typeof v === 'number' || typeof v === 'boolean') return String(v).trim();\n return '';\n}\n\n/** Luhn checksum. Returns true when the digit string is a valid card number. */\nfunction luhn(digits: string): boolean {\n let sum = 0;\n let dbl = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = digits.charCodeAt(i) - 48;\n if (dbl) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n dbl = !dbl;\n }\n return sum % 10 === 0;\n}\n\n/** ISO 13616 mod-97 check for IBANs. Returns the remainder; valid IBANs yield 1. */\nfunction mod97(iban: string): number {\n // Move first 4 chars to the end + convert letters to digits (A=10..Z=35).\n const rearranged = iban.slice(4) + iban.slice(0, 4);\n let expanded = '';\n for (let i = 0; i < rearranged.length; i++) {\n const code = rearranged.charCodeAt(i);\n if (code >= 65 && code <= 90) expanded += (code - 55).toString();\n else expanded += rearranged.charAt(i);\n }\n // Apply mod 97 in chunks — BigInt isn't necessary.\n let remainder = 0;\n for (let i = 0; i < expanded.length; i += 7) {\n const slice = remainder.toString() + expanded.substring(i, i + 7);\n remainder = Number.parseInt(slice, 10) % 97;\n }\n return remainder;\n}\n\nfunction toMs(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'string' || typeof value === 'number') return new Date(value).getTime();\n return Number.NaN;\n}\n\n/**\n * Bundled `ValidatorFn`s — pure functions, no DOM, no DI. Mirrors the\n * API shape of Angular's built-in `Validators` so it composes cleanly:\n *\n * ```ts\n * import { Validators } from '@angular/forms';\n * import { WrValidators } from 'ngwr/validators';\n *\n * new FormControl('', [\n * Validators.required,\n * WrValidators.cardNumber,\n * WrValidators.cvc(3),\n * WrValidators.match('password'),\n * WrValidators.oneOf(['xs', 'sm', 'md', 'lg', 'xl']),\n * ]);\n * ```\n *\n * Each error is keyed under the validator name (e.g. `cardNumber`,\n * `cvc`, `iban`) so consumers can branch in templates.\n *\n * Anything Angular already ships (`required`, `email`, `min`, `max`,\n * `pattern`, …) is deliberately NOT duplicated here.\n *\n * @see https://ngwr.dev/validators\n */\nexport const WrValidators = {\n // String shape\n\n /** No whitespace anywhere in the value. */\n noWhitespace: (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n return /\\s/.test(v) ? { noWhitespace: true } : null;\n },\n\n /** 3, 4, 6, or 8-digit hex colour (`#abc`, `#1a2b3c`, `#1a2b3c4d`). */\n hexColor: (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(v) ? null : { hexColor: true };\n },\n\n // Network / payments\n\n /**\n * Valid URL. Accepts any scheme by default; pass `{ protocols: ['https'] }`\n * to restrict.\n */\n url: (options: { readonly protocols?: readonly string[] } = {}): ValidatorFn => {\n const allow = options.protocols?.map(p => p.replace(/:$/, '').toLowerCase());\n return (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n let parsed: URL;\n try {\n parsed = new URL(v);\n } catch {\n return { url: true };\n }\n if (allow && !allow.includes(parsed.protocol.replace(/:$/, '').toLowerCase())) {\n return { url: { allowed: allow } };\n }\n return null;\n };\n },\n\n /** Credit card number — Luhn check + 13-19 digit length. Spaces and dashes are stripped first. */\n cardNumber: (control: AbstractControl): ValidationErrors | null => {\n const raw = stringValue(control).replace(/[\\s-]/g, '');\n if (raw === '') return null;\n if (!/^\\d{13,19}$/.test(raw)) return { cardNumber: true };\n return luhn(raw) ? null : { cardNumber: true };\n },\n\n /** CVC / CVV — N digits (default 3). Common: 3 for Visa/MC, 4 for Amex. */\n cvc: (length = 3): ValidatorFn => {\n const re = new RegExp(`^\\\\d{${length}}$`);\n return (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n return re.test(v) ? null : { cvc: { length } };\n };\n },\n\n /**\n * IBAN — basic structure (CC + 2 digits + up to 30 alphanumerics) +\n * the mod-97 check. Country-length tables not enforced.\n */\n iban: (control: AbstractControl): ValidationErrors | null => {\n const raw = stringValue(control).replace(/\\s/g, '').toUpperCase();\n if (raw === '') return null;\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{4,30}$/.test(raw)) return { iban: true };\n return mod97(raw) === 1 ? null : { iban: true };\n },\n\n // Cross-field\n\n /**\n * Value must equal a sibling control's value (e.g. confirm-password).\n * The target lookup uses `control.parent.get(name)`, so it works\n * inside `FormGroup` and nested groups.\n */\n match: (targetName: string): ValidatorFn => {\n return (control: AbstractControl): ValidationErrors | null => {\n const target = control.parent?.get(targetName);\n if (!target) return null;\n return control.value === target.value ? null : { match: { target: targetName } };\n };\n },\n\n // Choice\n\n /** Value must be one of the allowed entries (strict equality). */\n oneOf: <T>(allowed: readonly T[]): ValidatorFn => {\n return (control: AbstractControl): ValidationErrors | null => {\n const v = control.value as T;\n if (v == null || (v as unknown) === '') return null;\n return allowed.includes(v) ? null : { oneOf: { allowed } };\n };\n },\n\n // Date bounds\n\n /** Value (Date | parseable) must be ≥ `min`. */\n minDate: (min: Date | string | number): ValidatorFn => {\n const minMs = toMs(min);\n return (control: AbstractControl): ValidationErrors | null => {\n const v: unknown = control.value;\n if (v == null || v === '') return null;\n const got = toMs(v);\n if (Number.isNaN(got)) return { minDate: { min } };\n return got >= minMs ? null : { minDate: { min } };\n };\n },\n\n /** Value (Date | parseable) must be ≤ `max`. */\n maxDate: (max: Date | string | number): ValidatorFn => {\n const maxMs = toMs(max);\n return (control: AbstractControl): ValidationErrors | null => {\n const v: unknown = control.value;\n if (v == null || v === '') return null;\n const got = toMs(v);\n if (Number.isNaN(got)) return { maxDate: { max } };\n return got <= maxMs ? null : { maxDate: { max } };\n };\n },\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-validators.mjs","sources":["../../../projects/lib/validators/wr-validators.ts","../../../projects/lib/validators/ngwr-validators.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 AbstractControl, type ValidationErrors, type ValidatorFn } from '@angular/forms';\n\nfunction stringValue(control: AbstractControl): string {\n const v: unknown = control.value;\n if (v == null) return '';\n if (typeof v === 'string') return v.trim();\n if (typeof v === 'number' || typeof v === 'boolean') return String(v).trim();\n return '';\n}\n\n/** Like {@link stringValue} but preserves whitespace — for checks that inspect spacing. */\nfunction rawStringValue(control: AbstractControl): string {\n const v: unknown = control.value;\n if (v == null) return '';\n if (typeof v === 'string') return v;\n if (typeof v === 'number' || typeof v === 'boolean') return String(v);\n return '';\n}\n\n/** Luhn checksum. Returns true when the digit string is a valid card number. */\nfunction luhn(digits: string): boolean {\n let sum = 0;\n let dbl = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = digits.charCodeAt(i) - 48;\n if (dbl) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n dbl = !dbl;\n }\n return sum % 10 === 0;\n}\n\n/** ISO 13616 mod-97 check for IBANs. Returns the remainder; valid IBANs yield 1. */\nfunction mod97(iban: string): number {\n // Move first 4 chars to the end + convert letters to digits (A=10..Z=35).\n const rearranged = iban.slice(4) + iban.slice(0, 4);\n let expanded = '';\n for (let i = 0; i < rearranged.length; i++) {\n const code = rearranged.charCodeAt(i);\n if (code >= 65 && code <= 90) expanded += (code - 55).toString();\n else expanded += rearranged.charAt(i);\n }\n // Apply mod 97 in chunks — BigInt isn't necessary.\n let remainder = 0;\n for (let i = 0; i < expanded.length; i += 7) {\n const slice = remainder.toString() + expanded.substring(i, i + 7);\n remainder = Number.parseInt(slice, 10) % 97;\n }\n return remainder;\n}\n\nfunction toMs(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'string' || typeof value === 'number') return new Date(value).getTime();\n return Number.NaN;\n}\n\n/**\n * Bundled `ValidatorFn`s — pure functions, no DOM, no DI. Mirrors the\n * API shape of Angular's built-in `Validators` so it composes cleanly:\n *\n * ```ts\n * import { Validators } from '@angular/forms';\n * import { WrValidators } from 'ngwr/validators';\n *\n * new FormControl('', [\n * Validators.required,\n * WrValidators.cardNumber,\n * WrValidators.cvc(3),\n * WrValidators.match('password'),\n * WrValidators.oneOf(['xs', 'sm', 'md', 'lg', 'xl']),\n * ]);\n * ```\n *\n * Each error is keyed under the validator name (e.g. `cardNumber`,\n * `cvc`, `iban`) so consumers can branch in templates.\n *\n * Anything Angular already ships (`required`, `email`, `min`, `max`,\n * `pattern`, …) is deliberately NOT duplicated here.\n *\n * @see https://ngwr.dev/validators\n */\nexport const WrValidators = {\n // String shape\n\n /** No whitespace anywhere in the value. */\n noWhitespace: (control: AbstractControl): ValidationErrors | null => {\n const v = rawStringValue(control);\n if (v === '') return null;\n return /\\s/.test(v) ? { noWhitespace: true } : null;\n },\n\n /** 3, 4, 6, or 8-digit hex colour (`#abc`, `#1a2b3c`, `#1a2b3c4d`). */\n hexColor: (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(v) ? null : { hexColor: true };\n },\n\n // Network / payments\n\n /**\n * Valid URL. Accepts any scheme by default; pass `{ protocols: ['https'] }`\n * to restrict. A scheme is required by default; pass `{ requireProtocol: false }`\n * to also accept bare domains (e.g. `ngwr.dev`), assuming `https`.\n */\n url: (options: { readonly protocols?: readonly string[]; readonly requireProtocol?: boolean } = {}): ValidatorFn => {\n const allow = options.protocols?.map(p => p.replace(/:$/, '').toLowerCase());\n const requireProtocol = options.requireProtocol ?? true;\n return (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n let parsed: URL;\n try {\n parsed = new URL(v);\n } catch {\n // Bare domain support: when protocols aren't required and the input has\n // no scheme, retry assuming `https://`.\n if (!requireProtocol && !/^[a-z][a-z0-9+.-]*:/i.test(v)) {\n let retried: URL;\n try {\n retried = new URL(`https://${v}`);\n } catch {\n return { url: true };\n }\n if (retried.host === '') {\n return { url: true };\n }\n if (allow && !allow.includes('https')) {\n return { url: { allowed: allow } };\n }\n return null;\n }\n return { url: true };\n }\n const protocol = parsed.protocol.replace(/:$/, '').toLowerCase();\n // WHATWG auto-inserts the authority for \"special\" schemes, so `http:host`\n // (missing `//`) still parses. Require the explicit `//` for those.\n const needsAuthority = ['http', 'https', 'ws', 'wss', 'ftp', 'file'].includes(protocol);\n if (needsAuthority && !/^[a-z][a-z0-9+.-]*:\\/\\//i.test(v)) {\n return { url: true };\n }\n if (allow && !allow.includes(protocol)) {\n return { url: { allowed: allow } };\n }\n return null;\n };\n },\n\n /** Credit card number — Luhn check + 13-19 digit length. Spaces and dashes are stripped first. */\n cardNumber: (control: AbstractControl): ValidationErrors | null => {\n const raw = stringValue(control).replace(/[\\s-]/g, '');\n if (raw === '') return null;\n if (!/^\\d{13,19}$/.test(raw)) return { cardNumber: true };\n return luhn(raw) ? null : { cardNumber: true };\n },\n\n /** CVC / CVV — N digits (default 3). Common: 3 for Visa/MC, 4 for Amex. */\n cvc: (length = 3): ValidatorFn => {\n const re = new RegExp(`^\\\\d{${length}}$`);\n return (control: AbstractControl): ValidationErrors | null => {\n const v = stringValue(control);\n if (v === '') return null;\n return re.test(v) ? null : { cvc: { length } };\n };\n },\n\n /**\n * IBAN — basic structure (CC + 2 digits + up to 30 alphanumerics) +\n * the mod-97 check. Country-length tables not enforced.\n */\n iban: (control: AbstractControl): ValidationErrors | null => {\n const raw = stringValue(control).replace(/\\s/g, '').toUpperCase();\n if (raw === '') return null;\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{4,30}$/.test(raw)) return { iban: true };\n return mod97(raw) === 1 ? null : { iban: true };\n },\n\n // Cross-field\n\n /**\n * Value must equal a sibling control's value (e.g. confirm-password).\n * The target lookup uses `control.parent.get(name)`, so it works\n * inside `FormGroup` and nested groups.\n */\n match: (targetName: string): ValidatorFn => {\n return (control: AbstractControl): ValidationErrors | null => {\n const target = control.parent?.get(targetName);\n if (!target) return null;\n return control.value === target.value ? null : { match: { target: targetName } };\n };\n },\n\n // Choice\n\n /** Value must be one of the allowed entries (strict equality). */\n oneOf: <T>(allowed: readonly T[]): ValidatorFn => {\n return (control: AbstractControl): ValidationErrors | null => {\n const v = control.value as T;\n if (v == null || (v as unknown) === '') return null;\n return allowed.includes(v) ? null : { oneOf: { allowed } };\n };\n },\n\n // Date bounds\n\n /** Value (Date | parseable) must be ≥ `min`. */\n minDate: (min: Date | string | number): ValidatorFn => {\n const minMs = toMs(min);\n return (control: AbstractControl): ValidationErrors | null => {\n const v: unknown = control.value;\n if (v == null || v === '') return null;\n const got = toMs(v);\n if (Number.isNaN(got)) return { minDate: { min } };\n return got >= minMs ? null : { minDate: { min } };\n };\n },\n\n /** Value (Date | parseable) must be ≤ `max`. */\n maxDate: (max: Date | string | number): ValidatorFn => {\n const maxMs = toMs(max);\n return (control: AbstractControl): ValidationErrors | null => {\n const v: unknown = control.value;\n if (v == null || v === '') return null;\n const got = toMs(v);\n if (Number.isNaN(got)) return { maxDate: { max } };\n return got <= maxMs ? null : { maxDate: { max } };\n };\n },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
|
|
|
16
16
|
* Distinct from `Version` exported by `@angular/core`, which reports the
|
|
17
17
|
* loaded Angular runtime version (e.g. `'21.2.13'`), not ngwr's.
|
|
18
18
|
*/
|
|
19
|
-
const NGWR_VERSION = '
|
|
19
|
+
const NGWR_VERSION = '8.0.0';
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* @license
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-version.mjs","sources":["../../../projects/lib/version/version.ts","../../../projects/lib/version/version.token.ts","../../../projects/lib/version/ngwr-version.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\n/**\n * The ngwr library version string, kept in sync with\n * `projects/lib/package.json` by `scripts/release-prepare.ts`.\n *\n * Prefer this over reading `package.json` at runtime — that requires a JSON\n * import or `require`, neither of which tree-shakes well in Angular builds.\n *\n * Distinct from `Version` exported by `@angular/core`, which reports the\n * loaded Angular runtime version (e.g. `'21.2.13'`), not ngwr's.\n */\nexport const NGWR_VERSION = '
|
|
1
|
+
{"version":3,"file":"ngwr-version.mjs","sources":["../../../projects/lib/version/version.ts","../../../projects/lib/version/version.token.ts","../../../projects/lib/version/ngwr-version.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\n/**\n * The ngwr library version string, kept in sync with\n * `projects/lib/package.json` by `scripts/release-prepare.ts`.\n *\n * Prefer this over reading `package.json` at runtime — that requires a JSON\n * import or `require`, neither of which tree-shakes well in Angular builds.\n *\n * Distinct from `Version` exported by `@angular/core`, which reports the\n * loaded Angular runtime version (e.g. `'21.2.13'`), not ngwr's.\n */\nexport const NGWR_VERSION = '8.0.0';\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 { InjectionToken } from '@angular/core';\n\nimport { NGWR_VERSION } from './version';\n\n/**\n * Injection token holding the ngwr library version string.\n *\n * Default factory returns {@link NGWR_VERSION}. Override it in tests or in\n * apps that want to surface a custom build identifier.\n *\n * @example\n * ```ts\n * @Component({...})\n * export class FooterComponent {\n * readonly version = inject(NGWR_VERSION_TOKEN);\n * }\n * ```\n */\nexport const NGWR_VERSION_TOKEN = new InjectionToken<string>('NGWR_VERSION_TOKEN', {\n providedIn: 'root',\n factory: () => NGWR_VERSION,\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAEH;;;;;;;;;AASG;AACI,MAAM,YAAY,GAAG;;ACjB5B;;;;;AAKG;AAMH;;;;;;;;;;;;;AAaG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAS,oBAAoB,EAAE;AACjF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,YAAY;AAC5B,CAAA;;AC5BD;;AAEG;;;;"}
|
|
@@ -83,10 +83,10 @@ class WrVirtualScroll {
|
|
|
83
83
|
checkViewportSize() {
|
|
84
84
|
this.viewport().checkViewportSize();
|
|
85
85
|
}
|
|
86
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
87
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.
|
|
86
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrVirtualScroll, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
87
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.4", type: WrVirtualScroll, isStandalone: true, selector: "wr-virtual-scroll", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, minBufferPx: { classPropertyName: "minBufferPx", publicName: "minBufferPx", isSignal: true, isRequired: false, transformFunction: null }, maxBufferPx: { classPropertyName: "maxBufferPx", publicName: "maxBufferPx", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-virtual-scroll" }, queries: [{ propertyName: "rowTemplate", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: "<cdk-virtual-scroll-viewport\n class=\"wr-virtual-scroll__viewport\"\n [itemSize]=\"itemSize()\"\n [minBufferPx]=\"resolvedMinBuffer()\"\n [maxBufferPx]=\"resolvedMaxBuffer()\"\n [style.height]=\"resolvedHeight()\"\n>\n <ng-container *cdkVirtualFor=\"let item of items(); let i = index; trackBy: trackBy()\">\n <ng-container *ngTemplateOutlet=\"rowTemplate(); context: { $implicit: item, index: i }\" />\n </ng-container>\n</cdk-virtual-scroll-viewport>\n", styles: [".wr-virtual-scroll{display:block;width:100%;overflow:hidden}.wr-virtual-scroll__viewport{width:100%;height:100%;scrollbar-width:thin}.wr-virtual-scroll__viewport::-webkit-scrollbar{width:.5rem;height:.5rem}.wr-virtual-scroll__viewport::-webkit-scrollbar-thumb{background:rgba(var(--wr-color-dark-rgb),.2);border-radius:999px}\n"], dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
88
88
|
}
|
|
89
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrVirtualScroll, decorators: [{
|
|
90
90
|
type: Component,
|
|
91
91
|
args: [{ selector: 'wr-virtual-scroll', encapsulation: ViewEncapsulation.None, imports: [ScrollingModule, NgTemplateOutlet], host: { class: 'wr-virtual-scroll' }, template: "<cdk-virtual-scroll-viewport\n class=\"wr-virtual-scroll__viewport\"\n [itemSize]=\"itemSize()\"\n [minBufferPx]=\"resolvedMinBuffer()\"\n [maxBufferPx]=\"resolvedMaxBuffer()\"\n [style.height]=\"resolvedHeight()\"\n>\n <ng-container *cdkVirtualFor=\"let item of items(); let i = index; trackBy: trackBy()\">\n <ng-container *ngTemplateOutlet=\"rowTemplate(); context: { $implicit: item, index: i }\" />\n </ng-container>\n</cdk-virtual-scroll-viewport>\n", styles: [".wr-virtual-scroll{display:block;width:100%;overflow:hidden}.wr-virtual-scroll__viewport{width:100%;height:100%;scrollbar-width:thin}.wr-virtual-scroll__viewport::-webkit-scrollbar{width:.5rem;height:.5rem}.wr-virtual-scroll__viewport::-webkit-scrollbar-thumb{background:rgba(var(--wr-color-dark-rgb),.2);border-radius:999px}\n"] }]
|
|
92
92
|
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], minBufferPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "minBufferPx", required: false }] }], maxBufferPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxBufferPx", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], rowTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }], viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }] } });
|
package/fesm2022/ngwr-waves.mjs
CHANGED
|
@@ -337,10 +337,10 @@ class WrWaves {
|
|
|
337
337
|
mouse.set = true;
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
341
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.
|
|
340
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrWaves, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
341
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.4", type: WrWaves, isStandalone: true, selector: "wr-waves", inputs: { lineColor: { classPropertyName: "lineColor", publicName: "lineColor", isSignal: true, isRequired: false, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, waveSpeedX: { classPropertyName: "waveSpeedX", publicName: "waveSpeedX", isSignal: true, isRequired: false, transformFunction: null }, waveSpeedY: { classPropertyName: "waveSpeedY", publicName: "waveSpeedY", isSignal: true, isRequired: false, transformFunction: null }, waveAmpX: { classPropertyName: "waveAmpX", publicName: "waveAmpX", isSignal: true, isRequired: false, transformFunction: null }, waveAmpY: { classPropertyName: "waveAmpY", publicName: "waveAmpY", isSignal: true, isRequired: false, transformFunction: null }, xGap: { classPropertyName: "xGap", publicName: "xGap", isSignal: true, isRequired: false, transformFunction: null }, yGap: { classPropertyName: "yGap", publicName: "yGap", isSignal: true, isRequired: false, transformFunction: null }, friction: { classPropertyName: "friction", publicName: "friction", isSignal: true, isRequired: false, transformFunction: null }, tension: { classPropertyName: "tension", publicName: "tension", isSignal: true, isRequired: false, transformFunction: null }, maxCursorMove: { classPropertyName: "maxCursorMove", publicName: "maxCursorMove", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.background-color": "backgroundColor()" }, classAttribute: "wr-waves" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, isSignal: true }], ngImport: i0, template: '<canvas #canvas class="wr-waves__canvas"></canvas>', isInline: true, styles: [".wr-waves{--wr-waves-line-color: rgba(var(--wr-color-dark-rgb), .12);position:absolute;inset:0;display:block;margin:0;padding:0;overflow:hidden}.wr-waves__canvas{display:block;width:100%;height:100%}[data-theme=dark] .wr-waves{--wr-waves-line-color: rgb(255 255 255 / 14%)}\n"], encapsulation: i0.ViewEncapsulation.None });
|
|
342
342
|
}
|
|
343
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
343
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: WrWaves, decorators: [{
|
|
344
344
|
type: Component,
|
|
345
345
|
args: [{ selector: 'wr-waves', template: '<canvas #canvas class="wr-waves__canvas"></canvas>', encapsulation: ViewEncapsulation.None, host: {
|
|
346
346
|
class: 'wr-waves',
|