ngwr 7.0.0 → 7.2.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.
Files changed (170) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -4
  3. package/alert/styles/_index.scss +2 -0
  4. package/back-top/styles/_index.scss +4 -2
  5. package/burger/styles/_index.scss +101 -0
  6. package/cascader/styles/_index.scss +16 -0
  7. package/command-palette/styles/_index.scss +28 -0
  8. package/descriptions/styles/_index.scss +59 -0
  9. package/dialog/styles/_index.scss +2 -0
  10. package/dropdown/styles/_index.scss +1 -0
  11. package/fesm2022/ngwr-affix.mjs +3 -3
  12. package/fesm2022/ngwr-alert.mjs +3 -3
  13. package/fesm2022/ngwr-anchor.mjs +3 -3
  14. package/fesm2022/ngwr-aurora.mjs +3 -3
  15. package/fesm2022/ngwr-avatar.mjs +3 -3
  16. package/fesm2022/ngwr-back-top.mjs +3 -3
  17. package/fesm2022/ngwr-badge.mjs +6 -6
  18. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  19. package/fesm2022/ngwr-blur-text.mjs +3 -3
  20. package/fesm2022/ngwr-border-glow.mjs +3 -3
  21. package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
  22. package/fesm2022/ngwr-burger.mjs +60 -0
  23. package/fesm2022/ngwr-burger.mjs.map +1 -0
  24. package/fesm2022/ngwr-button.mjs +6 -6
  25. package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
  26. package/fesm2022/ngwr-calendar.mjs +3 -3
  27. package/fesm2022/ngwr-card.mjs +9 -9
  28. package/fesm2022/ngwr-carousel.mjs +6 -6
  29. package/fesm2022/ngwr-cascader.mjs +5 -5
  30. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  31. package/fesm2022/ngwr-checkbox.mjs +6 -6
  32. package/fesm2022/ngwr-circular-text.mjs +3 -3
  33. package/fesm2022/ngwr-click-spark.mjs +3 -3
  34. package/fesm2022/ngwr-clipboard.mjs +3 -3
  35. package/fesm2022/ngwr-collapse.mjs +9 -9
  36. package/fesm2022/ngwr-color-picker.mjs +6 -6
  37. package/fesm2022/ngwr-command-palette.mjs +19 -5
  38. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  39. package/fesm2022/ngwr-compare.mjs +3 -3
  40. package/fesm2022/ngwr-confetti.mjs +3 -3
  41. package/fesm2022/ngwr-context-menu.mjs +12 -12
  42. package/fesm2022/ngwr-cookie.mjs +3 -3
  43. package/fesm2022/ngwr-counter.mjs +6 -6
  44. package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
  45. package/fesm2022/ngwr-date-adapter-luxon.mjs +3 -3
  46. package/fesm2022/ngwr-date-adapter.mjs +3 -3
  47. package/fesm2022/ngwr-date-picker.mjs +9 -9
  48. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  49. package/fesm2022/ngwr-density.mjs +6 -6
  50. package/fesm2022/ngwr-descriptions.mjs +16 -7
  51. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  52. package/fesm2022/ngwr-dialog.mjs +26 -19
  53. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  54. package/fesm2022/ngwr-directives.mjs +15 -15
  55. package/fesm2022/ngwr-divider.mjs +3 -3
  56. package/fesm2022/ngwr-donut-chart.mjs +3 -3
  57. package/fesm2022/ngwr-drag-drop.mjs +6 -6
  58. package/fesm2022/ngwr-drawer.mjs +15 -15
  59. package/fesm2022/ngwr-dropdown.mjs +43 -19
  60. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  61. package/fesm2022/ngwr-empty.mjs +3 -3
  62. package/fesm2022/ngwr-falling-text.mjs +3 -3
  63. package/fesm2022/ngwr-file-upload.mjs +3 -3
  64. package/fesm2022/ngwr-form.mjs +9 -9
  65. package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
  66. package/fesm2022/ngwr-gauge.mjs +3 -3
  67. package/fesm2022/ngwr-glitch-text.mjs +3 -3
  68. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  69. package/fesm2022/ngwr-hotkey.mjs +6 -6
  70. package/fesm2022/ngwr-i18n.mjs +9 -9
  71. package/fesm2022/ngwr-icon.mjs +3 -3
  72. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  73. package/fesm2022/ngwr-input-number.mjs +3 -3
  74. package/fesm2022/ngwr-input-otp.mjs +3 -3
  75. package/fesm2022/ngwr-input.mjs +15 -15
  76. package/fesm2022/ngwr-keyboard.mjs +3 -3
  77. package/fesm2022/ngwr-knob.mjs +3 -3
  78. package/fesm2022/ngwr-layout.mjs +15 -15
  79. package/fesm2022/ngwr-lightbox.mjs +4 -4
  80. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  81. package/fesm2022/ngwr-line-chart.mjs +3 -3
  82. package/fesm2022/ngwr-list.mjs +6 -6
  83. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  84. package/fesm2022/ngwr-marquee.mjs +3 -3
  85. package/fesm2022/ngwr-media.mjs +3 -3
  86. package/fesm2022/ngwr-mention.mjs +6 -6
  87. package/fesm2022/ngwr-meta.mjs +64 -7
  88. package/fesm2022/ngwr-meta.mjs.map +1 -1
  89. package/fesm2022/ngwr-meter-group.mjs +3 -3
  90. package/fesm2022/ngwr-overlay.mjs +73 -4
  91. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  92. package/fesm2022/ngwr-page-header.mjs +13 -5
  93. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  94. package/fesm2022/ngwr-pagination.mjs +3 -3
  95. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  96. package/fesm2022/ngwr-pipes.mjs +21 -21
  97. package/fesm2022/ngwr-platform.mjs +3 -3
  98. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  99. package/fesm2022/ngwr-popover.mjs +45 -15
  100. package/fesm2022/ngwr-popover.mjs.map +1 -1
  101. package/fesm2022/ngwr-progress.mjs +3 -3
  102. package/fesm2022/ngwr-qr.mjs +3 -3
  103. package/fesm2022/ngwr-radio.mjs +6 -6
  104. package/fesm2022/ngwr-rating.mjs +3 -3
  105. package/fesm2022/ngwr-result.mjs +12 -12
  106. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  107. package/fesm2022/ngwr-scramble-text.mjs +3 -3
  108. package/fesm2022/ngwr-scroll.mjs +3 -3
  109. package/fesm2022/ngwr-segmented.mjs +3 -3
  110. package/fesm2022/ngwr-select.mjs +43 -22
  111. package/fesm2022/ngwr-select.mjs.map +1 -1
  112. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  113. package/fesm2022/ngwr-sidebar.mjs +3 -3
  114. package/fesm2022/ngwr-skeleton.mjs +3 -3
  115. package/fesm2022/ngwr-slider.mjs +3 -3
  116. package/fesm2022/ngwr-sparkline.mjs +3 -3
  117. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  118. package/fesm2022/ngwr-spinner.mjs +3 -3
  119. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  120. package/fesm2022/ngwr-split-text.mjs +3 -3
  121. package/fesm2022/ngwr-splitter.mjs +3 -3
  122. package/fesm2022/ngwr-spotlight-card.mjs +6 -6
  123. package/fesm2022/ngwr-squircle.mjs +6 -6
  124. package/fesm2022/ngwr-star-border.mjs +3 -3
  125. package/fesm2022/ngwr-statistic.mjs +6 -6
  126. package/fesm2022/ngwr-stepper.mjs +16 -7
  127. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  128. package/fesm2022/ngwr-storage.mjs +3 -3
  129. package/fesm2022/ngwr-switch.mjs +3 -3
  130. package/fesm2022/ngwr-table.mjs +12 -12
  131. package/fesm2022/ngwr-table.mjs.map +1 -1
  132. package/fesm2022/ngwr-tabs.mjs +6 -6
  133. package/fesm2022/ngwr-textarea.mjs +3 -3
  134. package/fesm2022/ngwr-theme.mjs +3 -3
  135. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  136. package/fesm2022/ngwr-timeline.mjs +6 -6
  137. package/fesm2022/ngwr-toast.mjs +9 -9
  138. package/fesm2022/ngwr-toolbar.mjs +3 -3
  139. package/fesm2022/ngwr-tree.mjs +3 -3
  140. package/fesm2022/ngwr-typewriter.mjs +3 -3
  141. package/fesm2022/ngwr-typography.mjs +3 -3
  142. package/fesm2022/ngwr-version.mjs +1 -1
  143. package/fesm2022/ngwr-version.mjs.map +1 -1
  144. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  145. package/fesm2022/ngwr-waves.mjs +3 -3
  146. package/fesm2022/ngwr-window.mjs +12 -12
  147. package/lightbox/styles/_index.scss +2 -0
  148. package/overlay/styles/_index.scss +31 -0
  149. package/package.json +11 -5
  150. package/page-header/styles/_index.scss +16 -0
  151. package/popover/styles/_index.scss +17 -0
  152. package/schematics/use/symbol-map.json +1 -0
  153. package/select/styles/_index.scss +27 -0
  154. package/stepper/styles/_index.scss +30 -0
  155. package/styles.scss +2 -0
  156. package/theme/styles/_mixins.scss +47 -0
  157. package/toast/styles/_index.scss +30 -1
  158. package/tree/styles/_index.scss +15 -0
  159. package/types/ngwr-burger.d.ts +36 -0
  160. package/types/ngwr-command-palette.d.ts +13 -1
  161. package/types/ngwr-descriptions.d.ts +8 -1
  162. package/types/ngwr-dialog.d.ts +7 -0
  163. package/types/ngwr-dropdown.d.ts +10 -1
  164. package/types/ngwr-meta.d.ts +24 -0
  165. package/types/ngwr-overlay.d.ts +69 -1
  166. package/types/ngwr-page-header.d.ts +8 -1
  167. package/types/ngwr-popover.d.ts +11 -2
  168. package/types/ngwr-select.d.ts +10 -1
  169. package/types/ngwr-stepper.d.ts +8 -1
  170. package/types/ngwr-version.d.ts +1 -1
@@ -160,10 +160,10 @@ class WrLineChart {
160
160
  ...(ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []));
161
161
  // Convenience accessor so the host can be referenced from the template.
162
162
  hostEl = this.host.nativeElement;
163
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrLineChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
164
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: WrLineChart, isStandalone: true, selector: "wr-line-chart", inputs: { series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, xLabels: { classPropertyName: "xLabels", publicName: "xLabels", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showDots: { classPropertyName: "showDots", publicName: "showDots", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-line-chart" }, ngImport: i0, template: "@let hovered = hoveredIndex();\n@if (showLegend() && resolvedSeries().length > 0) {\n <ul class=\"wr-line-chart__legend\">\n @for (s of resolvedSeries(); track s.label) {\n <li class=\"wr-line-chart__legend-item\">\n <span class=\"wr-line-chart__swatch\" [style.background]=\"s.color\"></span>\n <span>{{ s.label }}</span>\n </li>\n }\n </ul>\n}\n\n<div class=\"wr-line-chart__plot\" [style.height.px]=\"height()\">\n <svg\n [attr.viewBox]=\"viewBox()\"\n preserveAspectRatio=\"none\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n >\n @if (showGrid()) {\n @for (tick of yTicks(); track tick.value) {\n <line\n [attr.x1]=\"padding.left\"\n [attr.x2]=\"vbW - padding.right\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n stroke=\"rgba(var(--wr-color-light-rgb), 0.7)\"\n stroke-width=\"1\"\n vector-effect=\"non-scaling-stroke\"\n />\n <text\n [attr.x]=\"padding.left - 6\"\n [attr.y]=\"tick.y + 4\"\n text-anchor=\"end\"\n fill=\"var(--wr-color-medium)\"\n font-size=\"10\"\n font-family=\"var(--wr-font-family-base)\"\n >\n {{ formatTick(tick.value) }}\n </text>\n }\n }\n\n @for (s of resolvedSeries(); track s.label) {\n <path\n [attr.d]=\"pathFor(s)\"\n fill=\"none\"\n [attr.stroke]=\"s.color\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n vector-effect=\"non-scaling-stroke\"\n />\n @if (showDots()) {\n @for (v of s.data; track $index; let i = $index) {\n <circle [attr.cx]=\"pointX(i)\" [attr.cy]=\"pointY(v)\" r=\"3\" [attr.fill]=\"s.color\" />\n }\n }\n }\n\n @if (hovered !== null && hoverPoints().length > 0) {\n <line\n [attr.x1]=\"pointX(hovered)\"\n [attr.x2]=\"pointX(hovered)\"\n [attr.y1]=\"padding.top\"\n [attr.y2]=\"vbH - padding.bottom\"\n stroke=\"var(--wr-color-medium)\"\n stroke-width=\"1\"\n stroke-dasharray=\"3 3\"\n vector-effect=\"non-scaling-stroke\"\n />\n @for (p of hoverPoints(); track p.label) {\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"5\"\n fill=\"var(--wr-color-white)\"\n [attr.stroke]=\"p.color\"\n stroke-width=\"2\"\n />\n }\n }\n </svg>\n\n @if (hovered !== null && hoverPoints().length > 0) {\n <div class=\"wr-line-chart__tooltip\" [style.left.%]=\"(pointX(hovered) / vbW) * 100\" [style.top.px]=\"padding.top\">\n <div class=\"wr-line-chart__tooltip-label\">{{ hoverLabel() }}</div>\n @for (p of hoverPoints(); track p.label) {\n <div class=\"wr-line-chart__tooltip-row\">\n <span class=\"wr-line-chart__swatch\" [style.background]=\"p.color\"></span>\n <span class=\"wr-line-chart__tooltip-name\">{{ p.label }}</span>\n <span class=\"wr-line-chart__tooltip-value\">{{ p.value }}</span>\n </div>\n }\n </div>\n }\n</div>\n\n@if (xLabels().length > 0) {\n <div class=\"wr-line-chart__x-labels\">\n @for (label of xLabels(); track $index) {\n <span class=\"wr-line-chart__x-label\">{{ label }}</span>\n }\n </div>\n}\n", encapsulation: i0.ViewEncapsulation.None });
163
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrLineChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
164
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrLineChart, isStandalone: true, selector: "wr-line-chart", inputs: { series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, xLabels: { classPropertyName: "xLabels", publicName: "xLabels", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showDots: { classPropertyName: "showDots", publicName: "showDots", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-line-chart" }, ngImport: i0, template: "@let hovered = hoveredIndex();\n@if (showLegend() && resolvedSeries().length > 0) {\n <ul class=\"wr-line-chart__legend\">\n @for (s of resolvedSeries(); track s.label) {\n <li class=\"wr-line-chart__legend-item\">\n <span class=\"wr-line-chart__swatch\" [style.background]=\"s.color\"></span>\n <span>{{ s.label }}</span>\n </li>\n }\n </ul>\n}\n\n<div class=\"wr-line-chart__plot\" [style.height.px]=\"height()\">\n <svg\n [attr.viewBox]=\"viewBox()\"\n preserveAspectRatio=\"none\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n >\n @if (showGrid()) {\n @for (tick of yTicks(); track tick.value) {\n <line\n [attr.x1]=\"padding.left\"\n [attr.x2]=\"vbW - padding.right\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n stroke=\"rgba(var(--wr-color-light-rgb), 0.7)\"\n stroke-width=\"1\"\n vector-effect=\"non-scaling-stroke\"\n />\n <text\n [attr.x]=\"padding.left - 6\"\n [attr.y]=\"tick.y + 4\"\n text-anchor=\"end\"\n fill=\"var(--wr-color-medium)\"\n font-size=\"10\"\n font-family=\"var(--wr-font-family-base)\"\n >\n {{ formatTick(tick.value) }}\n </text>\n }\n }\n\n @for (s of resolvedSeries(); track s.label) {\n <path\n [attr.d]=\"pathFor(s)\"\n fill=\"none\"\n [attr.stroke]=\"s.color\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n vector-effect=\"non-scaling-stroke\"\n />\n @if (showDots()) {\n @for (v of s.data; track $index; let i = $index) {\n <circle [attr.cx]=\"pointX(i)\" [attr.cy]=\"pointY(v)\" r=\"3\" [attr.fill]=\"s.color\" />\n }\n }\n }\n\n @if (hovered !== null && hoverPoints().length > 0) {\n <line\n [attr.x1]=\"pointX(hovered)\"\n [attr.x2]=\"pointX(hovered)\"\n [attr.y1]=\"padding.top\"\n [attr.y2]=\"vbH - padding.bottom\"\n stroke=\"var(--wr-color-medium)\"\n stroke-width=\"1\"\n stroke-dasharray=\"3 3\"\n vector-effect=\"non-scaling-stroke\"\n />\n @for (p of hoverPoints(); track p.label) {\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"5\"\n fill=\"var(--wr-color-white)\"\n [attr.stroke]=\"p.color\"\n stroke-width=\"2\"\n />\n }\n }\n </svg>\n\n @if (hovered !== null && hoverPoints().length > 0) {\n <div class=\"wr-line-chart__tooltip\" [style.left.%]=\"(pointX(hovered) / vbW) * 100\" [style.top.px]=\"padding.top\">\n <div class=\"wr-line-chart__tooltip-label\">{{ hoverLabel() }}</div>\n @for (p of hoverPoints(); track p.label) {\n <div class=\"wr-line-chart__tooltip-row\">\n <span class=\"wr-line-chart__swatch\" [style.background]=\"p.color\"></span>\n <span class=\"wr-line-chart__tooltip-name\">{{ p.label }}</span>\n <span class=\"wr-line-chart__tooltip-value\">{{ p.value }}</span>\n </div>\n }\n </div>\n }\n</div>\n\n@if (xLabels().length > 0) {\n <div class=\"wr-line-chart__x-labels\">\n @for (label of xLabels(); track $index) {\n <span class=\"wr-line-chart__x-label\">{{ label }}</span>\n }\n </div>\n}\n", encapsulation: i0.ViewEncapsulation.None });
165
165
  }
166
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrLineChart, decorators: [{
166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrLineChart, decorators: [{
167
167
  type: Component,
168
168
  args: [{ selector: 'wr-line-chart', encapsulation: ViewEncapsulation.None, host: { class: 'wr-line-chart' }, template: "@let hovered = hoveredIndex();\n@if (showLegend() && resolvedSeries().length > 0) {\n <ul class=\"wr-line-chart__legend\">\n @for (s of resolvedSeries(); track s.label) {\n <li class=\"wr-line-chart__legend-item\">\n <span class=\"wr-line-chart__swatch\" [style.background]=\"s.color\"></span>\n <span>{{ s.label }}</span>\n </li>\n }\n </ul>\n}\n\n<div class=\"wr-line-chart__plot\" [style.height.px]=\"height()\">\n <svg\n [attr.viewBox]=\"viewBox()\"\n preserveAspectRatio=\"none\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n >\n @if (showGrid()) {\n @for (tick of yTicks(); track tick.value) {\n <line\n [attr.x1]=\"padding.left\"\n [attr.x2]=\"vbW - padding.right\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n stroke=\"rgba(var(--wr-color-light-rgb), 0.7)\"\n stroke-width=\"1\"\n vector-effect=\"non-scaling-stroke\"\n />\n <text\n [attr.x]=\"padding.left - 6\"\n [attr.y]=\"tick.y + 4\"\n text-anchor=\"end\"\n fill=\"var(--wr-color-medium)\"\n font-size=\"10\"\n font-family=\"var(--wr-font-family-base)\"\n >\n {{ formatTick(tick.value) }}\n </text>\n }\n }\n\n @for (s of resolvedSeries(); track s.label) {\n <path\n [attr.d]=\"pathFor(s)\"\n fill=\"none\"\n [attr.stroke]=\"s.color\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n vector-effect=\"non-scaling-stroke\"\n />\n @if (showDots()) {\n @for (v of s.data; track $index; let i = $index) {\n <circle [attr.cx]=\"pointX(i)\" [attr.cy]=\"pointY(v)\" r=\"3\" [attr.fill]=\"s.color\" />\n }\n }\n }\n\n @if (hovered !== null && hoverPoints().length > 0) {\n <line\n [attr.x1]=\"pointX(hovered)\"\n [attr.x2]=\"pointX(hovered)\"\n [attr.y1]=\"padding.top\"\n [attr.y2]=\"vbH - padding.bottom\"\n stroke=\"var(--wr-color-medium)\"\n stroke-width=\"1\"\n stroke-dasharray=\"3 3\"\n vector-effect=\"non-scaling-stroke\"\n />\n @for (p of hoverPoints(); track p.label) {\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"5\"\n fill=\"var(--wr-color-white)\"\n [attr.stroke]=\"p.color\"\n stroke-width=\"2\"\n />\n }\n }\n </svg>\n\n @if (hovered !== null && hoverPoints().length > 0) {\n <div class=\"wr-line-chart__tooltip\" [style.left.%]=\"(pointX(hovered) / vbW) * 100\" [style.top.px]=\"padding.top\">\n <div class=\"wr-line-chart__tooltip-label\">{{ hoverLabel() }}</div>\n @for (p of hoverPoints(); track p.label) {\n <div class=\"wr-line-chart__tooltip-row\">\n <span class=\"wr-line-chart__swatch\" [style.background]=\"p.color\"></span>\n <span class=\"wr-line-chart__tooltip-name\">{{ p.label }}</span>\n <span class=\"wr-line-chart__tooltip-value\">{{ p.value }}</span>\n </div>\n }\n </div>\n }\n</div>\n\n@if (xLabels().length > 0) {\n <div class=\"wr-line-chart__x-labels\">\n @for (label of xLabels(); track $index) {\n <span class=\"wr-line-chart__x-label\">{{ label }}</span>\n }\n </div>\n}\n" }]
169
169
  }], propDecorators: { series: [{ type: i0.Input, args: [{ isSignal: true, alias: "series", required: false }] }], xLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "xLabels", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showLegend: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLegend", required: false }] }], showDots: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDots", required: false }] }] } });
@@ -51,10 +51,10 @@ class WrList {
51
51
  return parts.join(' ');
52
52
  }, /* @ts-ignore */
53
53
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
54
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrList, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: WrList, isStandalone: true, selector: "wr-list", inputs: { bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-label": "ariaLabel() || null" } }, ngImport: i0, template: '<ul class="wr-list__items" role="list"><ng-content /></ul>', isInline: true, styles: [":root{--wr-color-white: #ffffff;--wr-color-white-rgb: 255, 255, 255;--wr-color-black: #000000;--wr-color-black-rgb: 0, 0, 0;--wr-color-backdrop-rgb: 0, 0, 0;--wr-color-primary: #3969e2;--wr-color-primary-rgb: 57, 105, 226;--wr-color-primary-contrast: #ffffff;--wr-color-primary-dark: rgb(34.7577092511, 88.1497797357, 222.7422907489);--wr-color-primary-darker: rgb(29.6387665198, 78.6960352423, 202.3612334802);--wr-color-primary-light: rgb(79.2422907489, 121.8502202643, 229.2577092511);--wr-color-primary-lighter: rgb(101.4845814978, 138.7004405286, 232.5154185022);--wr-color-secondary: #f51c6a;--wr-color-secondary-rgb: 245, 28, 106;--wr-color-secondary-contrast: #ffffff;--wr-color-secondary-dark: rgb(237.0569620253, 10.4430379747, 91.8987341772);--wr-color-secondary-darker: rgb(212.6329113924, 9.3670886076, 82.4303797468);--wr-color-secondary-light: rgb(246.0759493671, 52.4240506329, 122.0316455696);--wr-color-secondary-lighter: rgb(247.1518987342, 76.8481012658, 138.0632911392);--wr-color-success: #00a400;--wr-color-success-rgb: 0, 164, 0;--wr-color-success-contrast: #ffffff;--wr-color-success-dark: rgb(0, 138.5, 0);--wr-color-success-darker: #007100;--wr-color-success-light: rgb(0, 189.5, 0);--wr-color-success-lighter: #00d700;--wr-color-warning: #ffba00;--wr-color-warning-rgb: 255, 186, 0;--wr-color-warning-contrast: #171616;--wr-color-warning-dark: rgb(229.5, 167.4, 0);--wr-color-warning-darker: rgb(204, 148.8, 0);--wr-color-warning-light: rgb(255, 192.9, 25.5);--wr-color-warning-lighter: rgb(255, 199.8, 51);--wr-color-danger: #fa383e;--wr-color-danger-rgb: 250, 56, 62;--wr-color-danger-contrast: #ffffff;--wr-color-danger-dark: rgb(249.375, 31.125, 37.875);--wr-color-danger-darker: rgb(248.75, 6.25, 13.75);--wr-color-danger-light: rgb(250.625, 80.875, 86.125);--wr-color-danger-lighter: rgb(251.25, 105.75, 110.25);--wr-color-light: #cbd5e1;--wr-color-light-rgb: 203, 213, 225;--wr-color-light-contrast: #171616;--wr-color-light-dark: rgb(186.8292682927, 199.9390243902, 215.6707317073);--wr-color-light-darker: rgb(170.6585365854, 186.8780487805, 206.3414634146);--wr-color-light-light: rgb(219.1707317073, 226.0609756098, 234.3292682927);--wr-color-light-lighter: rgb(235.3414634146, 239.1219512195, 243.6585365854);--wr-color-medium: #8594a4;--wr-color-medium-rgb: 133, 148, 164;--wr-color-medium-contrast: #ffffff;--wr-color-medium-dark: rgb(118.3943661972, 135.1901408451, 153.1056338028);--wr-color-medium-darker: rgb(105.0985915493, 122.4225352113, 140.9014084507);--wr-color-medium-light: rgb(147.6056338028, 160.8098591549, 174.8943661972);--wr-color-medium-lighter: rgb(162.2112676056, 173.6197183099, 185.7887323944);--wr-color-dark: #0f172a;--wr-color-dark-rgb: 15, 23, 42;--wr-color-dark-contrast: #ffffff;--wr-color-dark-dark: rgb(8.2894736842, 12.7105263158, 23.2105263158);--wr-color-dark-darker: rgb(1.5789473684, 2.4210526316, 4.4210526316);--wr-color-dark-light: rgb(21.7105263158, 33.2894736842, 60.7894736842);--wr-color-dark-lighter: rgb(28.4210526316, 43.5789473684, 79.5789473684)}:root{--wr-border-radius-sm: .375rem;--wr-border-radius-base: .625rem;--wr-border-radius-lg: 1rem;--wr-border-radius-pill: 50rem;--wr-ease-linear: linear;--wr-ease-out: cubic-bezier(.16, 1, .3, 1);--wr-ease-in: cubic-bezier(.7, 0, .84, 0);--wr-ease-in-out: cubic-bezier(.65, 0, .35, 1);--wr-ease-spring: cubic-bezier(.34, 1.56, .64, 1);--wr-duration-fast: .1s;--wr-duration-base: .15s;--wr-duration-slow: .3s;--wr-duration-slower: .5s;--wr-transition-short: var(--wr-duration-fast) var(--wr-ease-out);--wr-transition-base: var(--wr-duration-base) var(--wr-ease-linear);--wr-transition-long: var(--wr-duration-slow) var(--wr-ease-out);--wr-shadow-xs: 0 1px 2px rgb(0 0 0 / 5%);--wr-shadow-sm: 0 2px 8px rgb(0 0 0 / 15%);--wr-shadow-overlay: 0 8px 24px rgb(0 0 0 / 12%), 0 2px 4px rgb(0 0 0 / 6%);--wr-shadow-float: 0 8px 24px rgb(0 0 0 / 18%);--wr-shadow-modal: 0 20px 48px rgb(0 0 0 / 25%);--wr-z-overlay: 1000;--wr-z-window: 1100;--wr-z-top: 9999;--wr-overlay-duration: var(--wr-duration-base);--wr-overlay-ease: var(--wr-ease-out);--wr-font-family-base: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;--wr-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;--wr-text-xs: .75rem;--wr-text-sm: .875rem;--wr-text-base: 1rem;--wr-text-lg: 1.125rem;--wr-text-xl: 1.25rem;--wr-text-2xl: 1.5rem;--wr-text-3xl: 1.875rem;--wr-text-4xl: 2.25rem;--wr-text-5xl: 3rem;--wr-font-weight-thin: 200;--wr-font-weight-light: 300;--wr-font-weight-regular: 400;--wr-font-weight-medium: 500;--wr-font-weight-semibold: 600;--wr-font-weight-bold: 700;--wr-font-weight-extrabold: 800;--wr-leading-none: 1;--wr-leading-tight: 1.25;--wr-leading-snug: 1.375;--wr-leading-normal: 1.5;--wr-leading-relaxed: 1.625;--wr-leading-loose: 2;--wr-tracking-tighter: -.05em;--wr-tracking-tight: -.025em;--wr-tracking-normal: 0;--wr-tracking-wide: .025em;--wr-tracking-wider: .05em;--wr-tracking-widest: .1em}@keyframes wr-overlay-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}[data-theme=dark]{--wr-color-white: #0b1120;--wr-color-white-rgb: 11, 17, 32;--wr-color-dark: #e6ebf3;--wr-color-dark-rgb: 230, 235, 243;--wr-color-dark-contrast: #0b1120;--wr-color-white-contrast: #e6ebf3;--wr-color-light: #262f44;--wr-color-light-rgb: 38, 47, 68;--wr-color-light-contrast: #e6ebf3;--wr-color-light-lighter: #1a2236;--wr-color-light-darker: #3a4661;--wr-color-medium: #9aa6b8;--wr-color-medium-rgb: 154, 166, 184;--wr-color-primary: #5b85ff;--wr-color-primary-rgb: 91, 133, 255;--wr-color-primary-light: #7a9eff;--wr-color-primary-dark: #2f56c9;--wr-color-primary-lighter: #99b6ff;--wr-color-primary-darker: #1f3a99;--wr-color-success: #34c759;--wr-color-success-rgb: 52, 199, 89;--wr-color-warning: #ffcc33;--wr-color-warning-rgb: 255, 204, 51;--wr-color-danger: #ff5c5c;--wr-color-danger-rgb: 255, 92, 92;--wr-shadow-xs: 0 1px 2px rgb(0 0 0 / 35%);--wr-shadow-sm: 0 2px 8px rgb(0 0 0 / 45%);--wr-shadow-overlay: 0 8px 24px rgb(0 0 0 / 50%), 0 2px 4px rgb(0 0 0 / 35%);--wr-shadow-float: 0 8px 24px rgb(0 0 0 / 55%);--wr-shadow-modal: 0 24px 56px rgb(0 0 0 / 60%);color-scheme:dark}.wr-tabs__tab:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-sidebar__entry:focus-visible,.wr-sidebar__item:focus-visible,.wr-sidebar__group-toggle:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-anchor__link:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-collapse__header:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-command-palette__option:focus-visible,.wr-command-palette__panel input:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-mention__option:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-segmented__option:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-back-top:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-carousel__nav:focus-visible,.wr-carousel__dot:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-speed-dial__trigger:focus-visible,.wr-speed-dial__action:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-stepper__step:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-toast__close:focus-visible,.wr-toast__copy:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-window__chrome-action:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-date-picker__trigger:focus-visible,.wr-time-picker__step:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-dropdown-item:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-list{--wr-list-item-padding-y: .625rem;--wr-list-item-padding-x: 1rem;--wr-list-item-gap: .75rem;--wr-list-divider-color: var(--wr-color-light);--wr-list-bg: transparent;--wr-list-hover-bg: rgba(var(--wr-color-light-rgb), .4);--wr-list-active-bg: rgba(var(--wr-color-primary-rgb), .08);display:block;font-family:var(--wr-font-family-base);font-size:.9375rem;color:var(--wr-color-dark);background:var(--wr-list-bg)}.wr-list__items{list-style:none;margin:0;padding:0}.wr-list--bordered{border:1px solid var(--wr-list-divider-color);border-radius:var(--wr-border-radius-base)}@supports (corner-shape: squircle){.wr-list--bordered{corner-shape:squircle;border-radius:calc(var(--wr-border-radius-base) * 1.85)}}.wr-list--bordered{overflow:hidden}.wr-list--dividers .wr-list__item:not(:last-child){border-bottom:1px solid var(--wr-list-divider-color)}.wr-list--dense{--wr-list-item-padding-y: .375rem}.wr-list__item{display:flex;align-items:center;gap:var(--wr-list-item-gap);padding:calc(var(--wr-list-item-padding-y) * var(--wr-density-y, 1)) calc(var(--wr-list-item-padding-x) * var(--wr-density-x, 1));color:inherit;transition:background .12s ease}.wr-list__item--interactive{cursor:pointer}.wr-list__item--interactive:hover{background:var(--wr-list-hover-bg)}.wr-list__item--interactive:active{background:var(--wr-list-active-bg)}.wr-list__item--interactive:focus-visible{outline:2px solid var(--wr-color-primary);outline-offset:-2px}.wr-list__item--disabled{opacity:.55;pointer-events:none;cursor:not-allowed}.wr-list__leading,.wr-list__trailing{display:inline-flex;align-items:center;flex:0 0 auto;color:rgba(var(--wr-color-dark-rgb),.65)}.wr-list__leading:empty,.wr-list__trailing:empty{display:none}.wr-list__body{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], encapsulation: i0.ViewEncapsulation.None });
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrList, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: WrList, isStandalone: true, selector: "wr-list", inputs: { bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-label": "ariaLabel() || null" } }, ngImport: i0, template: '<ul class="wr-list__items" role="list"><ng-content /></ul>', isInline: true, styles: [":root{--wr-color-white: #ffffff;--wr-color-white-rgb: 255, 255, 255;--wr-color-black: #000000;--wr-color-black-rgb: 0, 0, 0;--wr-color-backdrop-rgb: 0, 0, 0;--wr-color-primary: #3969e2;--wr-color-primary-rgb: 57, 105, 226;--wr-color-primary-contrast: #ffffff;--wr-color-primary-dark: rgb(34.7577092511, 88.1497797357, 222.7422907489);--wr-color-primary-darker: rgb(29.6387665198, 78.6960352423, 202.3612334802);--wr-color-primary-light: rgb(79.2422907489, 121.8502202643, 229.2577092511);--wr-color-primary-lighter: rgb(101.4845814978, 138.7004405286, 232.5154185022);--wr-color-secondary: #f51c6a;--wr-color-secondary-rgb: 245, 28, 106;--wr-color-secondary-contrast: #ffffff;--wr-color-secondary-dark: rgb(237.0569620253, 10.4430379747, 91.8987341772);--wr-color-secondary-darker: rgb(212.6329113924, 9.3670886076, 82.4303797468);--wr-color-secondary-light: rgb(246.0759493671, 52.4240506329, 122.0316455696);--wr-color-secondary-lighter: rgb(247.1518987342, 76.8481012658, 138.0632911392);--wr-color-success: #00a400;--wr-color-success-rgb: 0, 164, 0;--wr-color-success-contrast: #ffffff;--wr-color-success-dark: rgb(0, 138.5, 0);--wr-color-success-darker: #007100;--wr-color-success-light: rgb(0, 189.5, 0);--wr-color-success-lighter: #00d700;--wr-color-warning: #ffba00;--wr-color-warning-rgb: 255, 186, 0;--wr-color-warning-contrast: #171616;--wr-color-warning-dark: rgb(229.5, 167.4, 0);--wr-color-warning-darker: rgb(204, 148.8, 0);--wr-color-warning-light: rgb(255, 192.9, 25.5);--wr-color-warning-lighter: rgb(255, 199.8, 51);--wr-color-danger: #fa383e;--wr-color-danger-rgb: 250, 56, 62;--wr-color-danger-contrast: #ffffff;--wr-color-danger-dark: rgb(249.375, 31.125, 37.875);--wr-color-danger-darker: rgb(248.75, 6.25, 13.75);--wr-color-danger-light: rgb(250.625, 80.875, 86.125);--wr-color-danger-lighter: rgb(251.25, 105.75, 110.25);--wr-color-light: #cbd5e1;--wr-color-light-rgb: 203, 213, 225;--wr-color-light-contrast: #171616;--wr-color-light-dark: rgb(186.8292682927, 199.9390243902, 215.6707317073);--wr-color-light-darker: rgb(170.6585365854, 186.8780487805, 206.3414634146);--wr-color-light-light: rgb(219.1707317073, 226.0609756098, 234.3292682927);--wr-color-light-lighter: rgb(235.3414634146, 239.1219512195, 243.6585365854);--wr-color-medium: #8594a4;--wr-color-medium-rgb: 133, 148, 164;--wr-color-medium-contrast: #ffffff;--wr-color-medium-dark: rgb(118.3943661972, 135.1901408451, 153.1056338028);--wr-color-medium-darker: rgb(105.0985915493, 122.4225352113, 140.9014084507);--wr-color-medium-light: rgb(147.6056338028, 160.8098591549, 174.8943661972);--wr-color-medium-lighter: rgb(162.2112676056, 173.6197183099, 185.7887323944);--wr-color-dark: #0f172a;--wr-color-dark-rgb: 15, 23, 42;--wr-color-dark-contrast: #ffffff;--wr-color-dark-dark: rgb(8.2894736842, 12.7105263158, 23.2105263158);--wr-color-dark-darker: rgb(1.5789473684, 2.4210526316, 4.4210526316);--wr-color-dark-light: rgb(21.7105263158, 33.2894736842, 60.7894736842);--wr-color-dark-lighter: rgb(28.4210526316, 43.5789473684, 79.5789473684)}:root{--wr-border-radius-sm: .375rem;--wr-border-radius-base: .625rem;--wr-border-radius-lg: 1rem;--wr-border-radius-pill: 50rem;--wr-ease-linear: linear;--wr-ease-out: cubic-bezier(.16, 1, .3, 1);--wr-ease-in: cubic-bezier(.7, 0, .84, 0);--wr-ease-in-out: cubic-bezier(.65, 0, .35, 1);--wr-ease-spring: cubic-bezier(.34, 1.56, .64, 1);--wr-duration-fast: .1s;--wr-duration-base: .15s;--wr-duration-slow: .3s;--wr-duration-slower: .5s;--wr-transition-short: var(--wr-duration-fast) var(--wr-ease-out);--wr-transition-base: var(--wr-duration-base) var(--wr-ease-linear);--wr-transition-long: var(--wr-duration-slow) var(--wr-ease-out);--wr-shadow-xs: 0 1px 2px rgb(0 0 0 / 5%);--wr-shadow-sm: 0 2px 8px rgb(0 0 0 / 15%);--wr-shadow-overlay: 0 8px 24px rgb(0 0 0 / 12%), 0 2px 4px rgb(0 0 0 / 6%);--wr-shadow-float: 0 8px 24px rgb(0 0 0 / 18%);--wr-shadow-modal: 0 20px 48px rgb(0 0 0 / 25%);--wr-z-overlay: 1000;--wr-z-window: 1100;--wr-z-top: 9999;--wr-overlay-duration: var(--wr-duration-base);--wr-overlay-ease: var(--wr-ease-out);--wr-font-family-base: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;--wr-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;--wr-text-xs: .75rem;--wr-text-sm: .875rem;--wr-text-base: 1rem;--wr-text-lg: 1.125rem;--wr-text-xl: 1.25rem;--wr-text-2xl: 1.5rem;--wr-text-3xl: 1.875rem;--wr-text-4xl: 2.25rem;--wr-text-5xl: 3rem;--wr-font-weight-thin: 200;--wr-font-weight-light: 300;--wr-font-weight-regular: 400;--wr-font-weight-medium: 500;--wr-font-weight-semibold: 600;--wr-font-weight-bold: 700;--wr-font-weight-extrabold: 800;--wr-leading-none: 1;--wr-leading-tight: 1.25;--wr-leading-snug: 1.375;--wr-leading-normal: 1.5;--wr-leading-relaxed: 1.625;--wr-leading-loose: 2;--wr-tracking-tighter: -.05em;--wr-tracking-tight: -.025em;--wr-tracking-normal: 0;--wr-tracking-wide: .025em;--wr-tracking-wider: .05em;--wr-tracking-widest: .1em}@keyframes wr-overlay-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}[data-theme=dark]{--wr-color-white: #0b1120;--wr-color-white-rgb: 11, 17, 32;--wr-color-dark: #e6ebf3;--wr-color-dark-rgb: 230, 235, 243;--wr-color-dark-contrast: #0b1120;--wr-color-white-contrast: #e6ebf3;--wr-color-light: #262f44;--wr-color-light-rgb: 38, 47, 68;--wr-color-light-contrast: #e6ebf3;--wr-color-light-lighter: #1a2236;--wr-color-light-darker: #3a4661;--wr-color-medium: #9aa6b8;--wr-color-medium-rgb: 154, 166, 184;--wr-color-primary: #5b85ff;--wr-color-primary-rgb: 91, 133, 255;--wr-color-primary-light: #7a9eff;--wr-color-primary-dark: #2f56c9;--wr-color-primary-lighter: #99b6ff;--wr-color-primary-darker: #1f3a99;--wr-color-success: #34c759;--wr-color-success-rgb: 52, 199, 89;--wr-color-warning: #ffcc33;--wr-color-warning-rgb: 255, 204, 51;--wr-color-danger: #ff5c5c;--wr-color-danger-rgb: 255, 92, 92;--wr-shadow-xs: 0 1px 2px rgb(0 0 0 / 35%);--wr-shadow-sm: 0 2px 8px rgb(0 0 0 / 45%);--wr-shadow-overlay: 0 8px 24px rgb(0 0 0 / 50%), 0 2px 4px rgb(0 0 0 / 35%);--wr-shadow-float: 0 8px 24px rgb(0 0 0 / 55%);--wr-shadow-modal: 0 24px 56px rgb(0 0 0 / 60%);color-scheme:dark}.wr-tabs__tab:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-sidebar__entry:focus-visible,.wr-sidebar__item:focus-visible,.wr-sidebar__group-toggle:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-anchor__link:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-collapse__header:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-command-palette__option:focus-visible,.wr-command-palette__panel input:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-mention__option:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-segmented__option:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-back-top:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-carousel__nav:focus-visible,.wr-carousel__dot:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-speed-dial__trigger:focus-visible,.wr-speed-dial__action:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-stepper__step:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-toast__close:focus-visible,.wr-toast__copy:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-window__chrome-action:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-date-picker__trigger:focus-visible,.wr-time-picker__step:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-dropdown-item:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(var(--wr-color-primary-rgb),.25)}.wr-list{--wr-list-item-padding-y: .625rem;--wr-list-item-padding-x: 1rem;--wr-list-item-gap: .75rem;--wr-list-divider-color: var(--wr-color-light);--wr-list-bg: transparent;--wr-list-hover-bg: rgba(var(--wr-color-light-rgb), .4);--wr-list-active-bg: rgba(var(--wr-color-primary-rgb), .08);display:block;font-family:var(--wr-font-family-base);font-size:.9375rem;color:var(--wr-color-dark);background:var(--wr-list-bg)}.wr-list__items{list-style:none;margin:0;padding:0}.wr-list--bordered{border:1px solid var(--wr-list-divider-color);border-radius:var(--wr-border-radius-base)}@supports (corner-shape: squircle){.wr-list--bordered{corner-shape:squircle;border-radius:calc(var(--wr-border-radius-base) * 1.85)}}.wr-list--bordered{overflow:hidden}.wr-list--dividers .wr-list__item:not(:last-child){border-bottom:1px solid var(--wr-list-divider-color)}.wr-list--dense{--wr-list-item-padding-y: .375rem}.wr-list__item{display:flex;align-items:center;gap:var(--wr-list-item-gap);padding:calc(var(--wr-list-item-padding-y) * var(--wr-density-y, 1)) calc(var(--wr-list-item-padding-x) * var(--wr-density-x, 1));color:inherit;transition:background .12s ease}.wr-list__item--interactive{cursor:pointer}.wr-list__item--interactive:hover{background:var(--wr-list-hover-bg)}.wr-list__item--interactive:active{background:var(--wr-list-active-bg)}.wr-list__item--interactive:focus-visible{outline:2px solid var(--wr-color-primary);outline-offset:-2px}.wr-list__item--disabled{opacity:.55;pointer-events:none;cursor:not-allowed}.wr-list__leading,.wr-list__trailing{display:inline-flex;align-items:center;flex:0 0 auto;color:rgba(var(--wr-color-dark-rgb),.65)}.wr-list__leading:empty,.wr-list__trailing:empty{display:none}.wr-list__body{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], encapsulation: i0.ViewEncapsulation.None });
56
56
  }
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrList, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrList, decorators: [{
58
58
  type: Component,
59
59
  args: [{ selector: 'wr-list', template: '<ul class="wr-list__items" role="list"><ng-content /></ul>', encapsulation: ViewEncapsulation.None, host: {
60
60
  '[class]': 'classes()',
@@ -109,10 +109,10 @@ class WrListItem {
109
109
  event.preventDefault();
110
110
  event.currentTarget.click();
111
111
  }
112
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrListItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
113
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: WrListItem, isStandalone: true, selector: "wr-list-item", inputs: { interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, listeners: { "keydown.enter": "onActivate($event)", "keydown.space": "onActivate($event)" }, properties: { "class": "classes()", "attr.tabindex": "interactive() ? \"0\" : null", "attr.aria-disabled": "disabled() || null" } }, ngImport: i0, template: "<span class=\"wr-list__leading\"><ng-content select=\"[wrListItemLeading]\" /></span>\n<span class=\"wr-list__body\"><ng-content /></span>\n<span class=\"wr-list__trailing\"><ng-content select=\"[wrListItemTrailing]\" /></span>\n", encapsulation: i0.ViewEncapsulation.None });
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrListItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
113
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: WrListItem, isStandalone: true, selector: "wr-list-item", inputs: { interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, listeners: { "keydown.enter": "onActivate($event)", "keydown.space": "onActivate($event)" }, properties: { "class": "classes()", "attr.tabindex": "interactive() ? \"0\" : null", "attr.aria-disabled": "disabled() || null" } }, ngImport: i0, template: "<span class=\"wr-list__leading\"><ng-content select=\"[wrListItemLeading]\" /></span>\n<span class=\"wr-list__body\"><ng-content /></span>\n<span class=\"wr-list__trailing\"><ng-content select=\"[wrListItemTrailing]\" /></span>\n", encapsulation: i0.ViewEncapsulation.None });
114
114
  }
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrListItem, decorators: [{
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrListItem, decorators: [{
116
116
  type: Component,
117
117
  args: [{ selector: 'wr-list-item', encapsulation: ViewEncapsulation.None, host: {
118
118
  '[class]': 'classes()',
@@ -108,10 +108,10 @@ class WrLoadingBar {
108
108
  this._progress.set(0);
109
109
  }, 220);
110
110
  }
111
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrLoadingBar, deps: [], target: i0.ɵɵFactoryTarget.Service });
112
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.1", ngImport: i0, type: WrLoadingBar });
111
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrLoadingBar, deps: [], target: i0.ɵɵFactoryTarget.Service });
112
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: WrLoadingBar });
113
113
  }
114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrLoadingBar, decorators: [{
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrLoadingBar, decorators: [{
115
115
  type: Service
116
116
  }], ctorParameters: () => [] });
117
117
 
@@ -144,10 +144,10 @@ class WrLoadingBarComponent {
144
144
  bar = inject(WrLoadingBar);
145
145
  active = computed(() => this.bar.state() !== 'idle', /* @ts-ignore */
146
146
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrLoadingBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: WrLoadingBarComponent, isStandalone: true, selector: "wr-loading-bar", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-loading-bar" }, ngImport: i0, template: "<div class=\"wr-loading-bar__track\" [class.wr-loading-bar--active]=\"active()\">\n <div\n class=\"wr-loading-bar__fill\"\n [style.width.%]=\"bar.progress() * 100\"\n [style.background]=\"color()\"\n [style.height]=\"height()\"\n ></div>\n</div>\n", styles: [".wr-loading-bar{position:fixed;top:0;left:0;right:0;z-index:var(--wr-z-top, 9999);pointer-events:none}.wr-loading-bar__track{width:100%;overflow:hidden;opacity:0;transition:opacity .2s ease}.wr-loading-bar--active{opacity:1}.wr-loading-bar__fill{width:0;height:2px;background:var(--wr-color-primary);box-shadow:0 0 8px rgb(var(--wr-color-primary-rgb)/60%);transition:width .15s ease-out,opacity .2s ease}\n"], encapsulation: i0.ViewEncapsulation.None });
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrLoadingBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: WrLoadingBarComponent, isStandalone: true, selector: "wr-loading-bar", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-loading-bar" }, ngImport: i0, template: "<div class=\"wr-loading-bar__track\" [class.wr-loading-bar--active]=\"active()\">\n <div\n class=\"wr-loading-bar__fill\"\n [style.width.%]=\"bar.progress() * 100\"\n [style.background]=\"color()\"\n [style.height]=\"height()\"\n ></div>\n</div>\n", styles: [".wr-loading-bar{position:fixed;top:0;left:0;right:0;z-index:var(--wr-z-top, 9999);pointer-events:none}.wr-loading-bar__track{width:100%;overflow:hidden;opacity:0;transition:opacity .2s ease}.wr-loading-bar--active{opacity:1}.wr-loading-bar__fill{width:0;height:2px;background:var(--wr-color-primary);box-shadow:0 0 8px rgb(var(--wr-color-primary-rgb)/60%);transition:width .15s ease-out,opacity .2s ease}\n"], encapsulation: i0.ViewEncapsulation.None });
149
149
  }
150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrLoadingBarComponent, decorators: [{
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrLoadingBarComponent, decorators: [{
151
151
  type: Component,
152
152
  args: [{ selector: 'wr-loading-bar', encapsulation: ViewEncapsulation.None, host: { class: 'wr-loading-bar' }, template: "<div class=\"wr-loading-bar__track\" [class.wr-loading-bar--active]=\"active()\">\n <div\n class=\"wr-loading-bar__fill\"\n [style.width.%]=\"bar.progress() * 100\"\n [style.background]=\"color()\"\n [style.height]=\"height()\"\n ></div>\n</div>\n", styles: [".wr-loading-bar{position:fixed;top:0;left:0;right:0;z-index:var(--wr-z-top, 9999);pointer-events:none}.wr-loading-bar__track{width:100%;overflow:hidden;opacity:0;transition:opacity .2s ease}.wr-loading-bar--active{opacity:1}.wr-loading-bar__fill{width:0;height:2px;background:var(--wr-color-primary);box-shadow:0 0 8px rgb(var(--wr-color-primary-rgb)/60%);transition:width .15s ease-out,opacity .2s ease}\n"] }]
153
153
  }], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
@@ -199,10 +199,10 @@ class WrMarquee {
199
199
  raf = requestAnimationFrame(tick);
200
200
  this.destroyRef.onDestroy(() => cancelAnimationFrame(raf));
201
201
  }
202
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMarquee, deps: [], target: i0.ɵɵFactoryTarget.Component });
203
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: WrMarquee, isStandalone: true, selector: "wr-marquee", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null }, hoverSpeed: { classPropertyName: "hoverSpeed", publicName: "hoverSpeed", isSignal: true, isRequired: false, transformFunction: null }, fadeOut: { classPropertyName: "fadeOut", publicName: "fadeOut", isSignal: true, isRequired: false, transformFunction: null }, fadeOutColor: { classPropertyName: "fadeOutColor", publicName: "fadeOutColor", isSignal: true, isRequired: false, transformFunction: null }, scaleOnHover: { classPropertyName: "scaleOnHover", publicName: "scaleOnHover", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.wr-marquee--fade": "fadeOut()", "class.wr-marquee--scale-hover": "scaleOnHover()", "style.--wr-marquee-gap.px": "gap()", "style.--wr-marquee-height.px": "itemHeight()", "style.--wr-marquee-fade-color": "fadeOutColor() || null", "attr.role": "\"region\"", "attr.aria-label": "ariaLabel()" }, classAttribute: "wr-marquee" }, viewQueries: [{ propertyName: "trackEl", first: true, predicate: ["track"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"wr-marquee__track\" #track (mouseenter)=\"onEnter()\" (mouseleave)=\"onLeave()\">\n @for (copyIndex of copyIndices(); track copyIndex) {\n <ul class=\"wr-marquee__list\" role=\"list\" [attr.aria-hidden]=\"copyIndex > 0\" [attr.data-copy]=\"copyIndex\">\n @for (item of items(); track $index) {\n <li class=\"wr-marquee__item\" role=\"listitem\">\n @if (item.href) {\n <a\n class=\"wr-marquee__link\"\n [href]=\"item.href\"\n [attr.aria-label]=\"\n isNodeItem(item) ? item.ariaLabel || item.title || 'link' : item.alt || item.title || 'link'\n \"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </a>\n } @else {\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n }\n </li>\n }\n </ul>\n }\n</div>\n\n<ng-template #content let-item>\n @if (isNodeItem(item)) {\n <span class=\"wr-marquee__node\" [attr.aria-hidden]=\"!!item.href && !item.ariaLabel\">\n <ng-container *ngTemplateOutlet=\"item.node\" />\n </span>\n } @else {\n <img\n [src]=\"item.src\"\n [srcset]=\"item.srcSet || null\"\n [sizes]=\"item.sizes || null\"\n [width]=\"item.width || null\"\n [height]=\"item.height || null\"\n [alt]=\"item.alt || ''\"\n [title]=\"item.title || null\"\n loading=\"lazy\"\n decoding=\"async\"\n draggable=\"false\"\n />\n }\n</ng-template>\n", styles: [".wr-marquee{--wr-marquee-gap: 32px;--wr-marquee-height: 28px;--wr-marquee-fade-color-auto: var(--wr-color-white, #ffffff);position:relative;display:block;width:100%;overflow:hidden}.wr-marquee--scale-hover{padding-top:calc(var(--wr-marquee-height) * .1);padding-bottom:calc(var(--wr-marquee-height) * .1)}.wr-marquee__track{display:flex;width:max-content;will-change:transform;-webkit-user-select:none;user-select:none;position:relative;z-index:0}.wr-marquee__list{display:flex;align-items:center;margin:0;padding:0;list-style:none}.wr-marquee__item{flex:0 0 auto;margin-right:var(--wr-marquee-gap);font-size:var(--wr-marquee-height);line-height:1}.wr-marquee__item:last-child{margin-right:var(--wr-marquee-gap)}.wr-marquee__node{display:inline-flex;align-items:center}.wr-marquee__item img{height:var(--wr-marquee-height);width:auto;display:block;object-fit:contain;image-rendering:-webkit-optimize-contrast;-webkit-user-drag:none;pointer-events:none;transition:transform .3s cubic-bezier(.4,0,.2,1)}.wr-marquee--scale-hover .wr-marquee__item{overflow:visible}.wr-marquee--scale-hover .wr-marquee__item:hover img,.wr-marquee--scale-hover .wr-marquee__item:hover .wr-marquee__node{transform:scale(1.2);transform-origin:center center}.wr-marquee--scale-hover .wr-marquee__node{transition:transform .3s cubic-bezier(.4,0,.2,1)}.wr-marquee__link{display:inline-flex;align-items:center;text-decoration:none;border-radius:4px;transition:opacity .2s ease}.wr-marquee__link:hover{opacity:.8}.wr-marquee__link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.wr-marquee--fade:before,.wr-marquee--fade:after{content:\"\";position:absolute;top:0;bottom:0;width:clamp(24px,8%,120px);pointer-events:none;z-index:10}.wr-marquee--fade:before{left:0;background:linear-gradient(to right,var(--wr-marquee-fade-color, var(--wr-marquee-fade-color-auto)) 0%,rgba(0,0,0,0) 100%)}.wr-marquee--fade:after{right:0;background:linear-gradient(to left,var(--wr-marquee-fade-color, var(--wr-marquee-fade-color-auto)) 0%,rgba(0,0,0,0) 100%)}@media(prefers-reduced-motion:reduce){.wr-marquee .wr-marquee__track{transform:translateZ(0)!important}.wr-marquee .wr-marquee__item img,.wr-marquee .wr-marquee__node{transition:none!important}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None });
202
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMarquee, deps: [], target: i0.ɵɵFactoryTarget.Component });
203
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrMarquee, isStandalone: true, selector: "wr-marquee", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null }, hoverSpeed: { classPropertyName: "hoverSpeed", publicName: "hoverSpeed", isSignal: true, isRequired: false, transformFunction: null }, fadeOut: { classPropertyName: "fadeOut", publicName: "fadeOut", isSignal: true, isRequired: false, transformFunction: null }, fadeOutColor: { classPropertyName: "fadeOutColor", publicName: "fadeOutColor", isSignal: true, isRequired: false, transformFunction: null }, scaleOnHover: { classPropertyName: "scaleOnHover", publicName: "scaleOnHover", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.wr-marquee--fade": "fadeOut()", "class.wr-marquee--scale-hover": "scaleOnHover()", "style.--wr-marquee-gap.px": "gap()", "style.--wr-marquee-height.px": "itemHeight()", "style.--wr-marquee-fade-color": "fadeOutColor() || null", "attr.role": "\"region\"", "attr.aria-label": "ariaLabel()" }, classAttribute: "wr-marquee" }, viewQueries: [{ propertyName: "trackEl", first: true, predicate: ["track"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"wr-marquee__track\" #track (mouseenter)=\"onEnter()\" (mouseleave)=\"onLeave()\">\n @for (copyIndex of copyIndices(); track copyIndex) {\n <ul class=\"wr-marquee__list\" role=\"list\" [attr.aria-hidden]=\"copyIndex > 0\" [attr.data-copy]=\"copyIndex\">\n @for (item of items(); track $index) {\n <li class=\"wr-marquee__item\" role=\"listitem\">\n @if (item.href) {\n <a\n class=\"wr-marquee__link\"\n [href]=\"item.href\"\n [attr.aria-label]=\"\n isNodeItem(item) ? item.ariaLabel || item.title || 'link' : item.alt || item.title || 'link'\n \"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n </a>\n } @else {\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item }\" />\n }\n </li>\n }\n </ul>\n }\n</div>\n\n<ng-template #content let-item>\n @if (isNodeItem(item)) {\n <span class=\"wr-marquee__node\" [attr.aria-hidden]=\"!!item.href && !item.ariaLabel\">\n <ng-container *ngTemplateOutlet=\"item.node\" />\n </span>\n } @else {\n <img\n [src]=\"item.src\"\n [srcset]=\"item.srcSet || null\"\n [sizes]=\"item.sizes || null\"\n [width]=\"item.width || null\"\n [height]=\"item.height || null\"\n [alt]=\"item.alt || ''\"\n [title]=\"item.title || null\"\n loading=\"lazy\"\n decoding=\"async\"\n draggable=\"false\"\n />\n }\n</ng-template>\n", styles: [".wr-marquee{--wr-marquee-gap: 32px;--wr-marquee-height: 28px;--wr-marquee-fade-color-auto: var(--wr-color-white, #ffffff);position:relative;display:block;width:100%;overflow:hidden}.wr-marquee--scale-hover{padding-top:calc(var(--wr-marquee-height) * .1);padding-bottom:calc(var(--wr-marquee-height) * .1)}.wr-marquee__track{display:flex;width:max-content;will-change:transform;-webkit-user-select:none;user-select:none;position:relative;z-index:0}.wr-marquee__list{display:flex;align-items:center;margin:0;padding:0;list-style:none}.wr-marquee__item{flex:0 0 auto;margin-right:var(--wr-marquee-gap);font-size:var(--wr-marquee-height);line-height:1}.wr-marquee__item:last-child{margin-right:var(--wr-marquee-gap)}.wr-marquee__node{display:inline-flex;align-items:center}.wr-marquee__item img{height:var(--wr-marquee-height);width:auto;display:block;object-fit:contain;image-rendering:-webkit-optimize-contrast;-webkit-user-drag:none;pointer-events:none;transition:transform .3s cubic-bezier(.4,0,.2,1)}.wr-marquee--scale-hover .wr-marquee__item{overflow:visible}.wr-marquee--scale-hover .wr-marquee__item:hover img,.wr-marquee--scale-hover .wr-marquee__item:hover .wr-marquee__node{transform:scale(1.2);transform-origin:center center}.wr-marquee--scale-hover .wr-marquee__node{transition:transform .3s cubic-bezier(.4,0,.2,1)}.wr-marquee__link{display:inline-flex;align-items:center;text-decoration:none;border-radius:4px;transition:opacity .2s ease}.wr-marquee__link:hover{opacity:.8}.wr-marquee__link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.wr-marquee--fade:before,.wr-marquee--fade:after{content:\"\";position:absolute;top:0;bottom:0;width:clamp(24px,8%,120px);pointer-events:none;z-index:10}.wr-marquee--fade:before{left:0;background:linear-gradient(to right,var(--wr-marquee-fade-color, var(--wr-marquee-fade-color-auto)) 0%,rgba(0,0,0,0) 100%)}.wr-marquee--fade:after{right:0;background:linear-gradient(to left,var(--wr-marquee-fade-color, var(--wr-marquee-fade-color-auto)) 0%,rgba(0,0,0,0) 100%)}@media(prefers-reduced-motion:reduce){.wr-marquee .wr-marquee__track{transform:translateZ(0)!important}.wr-marquee .wr-marquee__item img,.wr-marquee .wr-marquee__node{transition:none!important}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None });
204
204
  }
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMarquee, decorators: [{
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMarquee, decorators: [{
206
206
  type: Component,
207
207
  args: [{ selector: 'wr-marquee', encapsulation: ViewEncapsulation.None, imports: [NgTemplateOutlet], host: {
208
208
  class: 'wr-marquee',
@@ -94,10 +94,10 @@ class WrMedia {
94
94
  this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));
95
95
  return sig.asReadonly();
96
96
  }
97
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMedia, deps: [], target: i0.ɵɵFactoryTarget.Service });
98
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.1", ngImport: i0, type: WrMedia });
97
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMedia, deps: [], target: i0.ɵɵFactoryTarget.Service });
98
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: WrMedia });
99
99
  }
100
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMedia, decorators: [{
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMedia, decorators: [{
101
101
  type: Service
102
102
  }] });
103
103
 
@@ -119,10 +119,10 @@ class WrMentionPanel {
119
119
  event.preventDefault();
120
120
  this.picked.emit(item);
121
121
  }
122
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMentionPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
123
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: WrMentionPanel, isStandalone: true, selector: "wr-mention-panel", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { picked: "picked", hovered: "hovered" }, host: { classAttribute: "wr-mention-panel" }, ngImport: i0, template: "@if (items().length === 0) {\n <div class=\"wr-mention-panel__empty\">No matches</div>\n} @else {\n <ul class=\"wr-mention-panel__list\" role=\"listbox\">\n @for (item of items(); track $index) {\n <li\n class=\"wr-mention-panel__option\"\n role=\"option\"\n [class.wr-mention-panel__option--active]=\"$index === activeIndex()\"\n [attr.aria-selected]=\"$index === activeIndex()\"\n (mouseenter)=\"hovered.emit($index)\"\n (mousedown)=\"onPick(item, $event)\"\n >\n {{ displayWith()(item) }}\n </li>\n }\n </ul>\n}\n", encapsulation: i0.ViewEncapsulation.None });
122
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMentionPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
123
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrMentionPanel, isStandalone: true, selector: "wr-mention-panel", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { picked: "picked", hovered: "hovered" }, host: { classAttribute: "wr-mention-panel" }, ngImport: i0, template: "@if (items().length === 0) {\n <div class=\"wr-mention-panel__empty\">No matches</div>\n} @else {\n <ul class=\"wr-mention-panel__list\" role=\"listbox\">\n @for (item of items(); track $index) {\n <li\n class=\"wr-mention-panel__option\"\n role=\"option\"\n [class.wr-mention-panel__option--active]=\"$index === activeIndex()\"\n [attr.aria-selected]=\"$index === activeIndex()\"\n (mouseenter)=\"hovered.emit($index)\"\n (mousedown)=\"onPick(item, $event)\"\n >\n {{ displayWith()(item) }}\n </li>\n }\n </ul>\n}\n", encapsulation: i0.ViewEncapsulation.None });
124
124
  }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMentionPanel, decorators: [{
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMentionPanel, decorators: [{
126
126
  type: Component,
127
127
  args: [{ selector: 'wr-mention-panel', encapsulation: ViewEncapsulation.None, host: { class: 'wr-mention-panel' }, template: "@if (items().length === 0) {\n <div class=\"wr-mention-panel__empty\">No matches</div>\n} @else {\n <ul class=\"wr-mention-panel__list\" role=\"listbox\">\n @for (item of items(); track $index) {\n <li\n class=\"wr-mention-panel__option\"\n role=\"option\"\n [class.wr-mention-panel__option--active]=\"$index === activeIndex()\"\n [attr.aria-selected]=\"$index === activeIndex()\"\n (mouseenter)=\"hovered.emit($index)\"\n (mousedown)=\"onPick(item, $event)\"\n >\n {{ displayWith()(item) }}\n </li>\n }\n </ul>\n}\n" }]
128
128
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], activeIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIndex", required: false }] }], displayWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayWith", required: false }] }], picked: [{ type: i0.Output, args: ["picked"] }], hovered: [{ type: i0.Output, args: ["hovered"] }] } });
@@ -349,10 +349,10 @@ class WrMention {
349
349
  this.wrMentionSelected.emit({ item, trigger: this.state.trigger, query: this.state.query });
350
350
  this.close();
351
351
  }
352
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMention, deps: [], target: i0.ɵɵFactoryTarget.Directive });
353
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: WrMention, isStandalone: true, selector: "[wrMention]", inputs: { wrMentionItems: { classPropertyName: "wrMentionItems", publicName: "wrMentionItems", isSignal: true, isRequired: false, transformFunction: null }, triggers: { classPropertyName: "triggers", publicName: "triggers", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null }, valueWith: { classPropertyName: "valueWith", publicName: "valueWith", isSignal: true, isRequired: false, transformFunction: null }, filterWith: { classPropertyName: "filterWith", publicName: "filterWith", isSignal: true, isRequired: false, transformFunction: null }, maxResults: { classPropertyName: "maxResults", publicName: "maxResults", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { wrMentionSelected: "wrMentionSelected" }, host: { listeners: { "input": "onInput()", "click": "onClick()", "keyup": "onCaretMove($event)", "keydown": "onKeydown($event)", "blur": "onBlur()" } }, ngImport: i0 });
352
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMention, deps: [], target: i0.ɵɵFactoryTarget.Directive });
353
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: WrMention, isStandalone: true, selector: "[wrMention]", inputs: { wrMentionItems: { classPropertyName: "wrMentionItems", publicName: "wrMentionItems", isSignal: true, isRequired: false, transformFunction: null }, triggers: { classPropertyName: "triggers", publicName: "triggers", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: true, isRequired: false, transformFunction: null }, valueWith: { classPropertyName: "valueWith", publicName: "valueWith", isSignal: true, isRequired: false, transformFunction: null }, filterWith: { classPropertyName: "filterWith", publicName: "filterWith", isSignal: true, isRequired: false, transformFunction: null }, maxResults: { classPropertyName: "maxResults", publicName: "maxResults", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { wrMentionSelected: "wrMentionSelected" }, host: { listeners: { "input": "onInput()", "click": "onClick()", "keyup": "onCaretMove($event)", "keydown": "onKeydown($event)", "blur": "onBlur()" } }, ngImport: i0 });
354
354
  }
355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMention, decorators: [{
355
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMention, decorators: [{
356
356
  type: Directive,
357
357
  args: [{
358
358
  selector: '[wrMention]',
@@ -1,6 +1,6 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { InjectionToken, inject, signal, computed, Service, input, effect, DestroyRef, Directive, makeEnvironmentProviders } from '@angular/core';
3
+ import { InjectionToken, inject, Injector, signal, computed, effect, untracked, Service, input, DestroyRef, Directive, makeEnvironmentProviders } from '@angular/core';
4
4
  import { Title, Meta } from '@angular/platform-browser';
5
5
 
6
6
  /**
@@ -57,6 +57,7 @@ class WrMeta {
57
57
  meta = inject(Meta);
58
58
  doc = inject(DOCUMENT);
59
59
  defaults = inject(WR_META_DEFAULTS);
60
+ injector = inject(Injector);
60
61
  /** Stack of meta layers. Bottom = defaults, top = currently applied. */
61
62
  stack = signal([this.defaults], /* @ts-ignore */
62
63
  ...(ngDevMode ? [{ debugName: "stack" }] : /* istanbul ignore next */ []));
@@ -99,6 +100,62 @@ class WrMeta {
99
100
  },
100
101
  };
101
102
  }
103
+ /**
104
+ * Reactive layer. Runs `factory` inside an effect and re-applies the
105
+ * resolved metadata whenever any signal it reads changes — so a title
106
+ * (or any field) built from {@link WrI18n}'s `t()` updates live on
107
+ * locale switch, with no manual re-`set()`.
108
+ *
109
+ * Returns a handle whose `.pop()` removes the layer and stops the effect.
110
+ * Safe to call outside an injection context.
111
+ *
112
+ * @example Locale-aware title
113
+ * ```ts
114
+ * const meta = inject(WrMeta);
115
+ * const i18n = inject(WrI18n);
116
+ *
117
+ * // `i18n.t(...)` tracks the active locale, so the title re-renders
118
+ * // every time `i18n.use(...)` switches languages.
119
+ * meta.bind(() => ({
120
+ * title: i18n.t('home.title'),
121
+ * description: i18n.t('home.description'),
122
+ * }));
123
+ * ```
124
+ */
125
+ bind(factory) {
126
+ let current = null;
127
+ const ref = effect(() => {
128
+ const next = factory();
129
+ // Recompute is reactive; the stack write + DOM apply are not, so
130
+ // the effect only re-runs on `factory`'s own dependencies.
131
+ untracked(() => {
132
+ this.stack.update(stack => {
133
+ if (current === null)
134
+ return [...stack, next];
135
+ const idx = stack.lastIndexOf(current);
136
+ return idx < 0 ? [...stack, next] : [...stack.slice(0, idx), next, ...stack.slice(idx + 1)];
137
+ });
138
+ current = next;
139
+ this.apply();
140
+ });
141
+ }, { ...(ngDevMode ? { debugName: "ref" } : /* istanbul ignore next */ {}), injector: this.injector });
142
+ return {
143
+ pop: () => {
144
+ ref.destroy();
145
+ if (current === null)
146
+ return;
147
+ const target = current;
148
+ current = null;
149
+ this.stack.update(stack => {
150
+ const idx = stack.lastIndexOf(target);
151
+ if (idx <= 0)
152
+ return stack;
153
+ return [...stack.slice(0, idx), ...stack.slice(idx + 1)];
154
+ });
155
+ this.apply();
156
+ },
157
+ };
158
+ }
102
159
  /** Pop the most recently pushed layer (defaults remain). */
103
160
  pop() {
104
161
  this.stack.update(stack => (stack.length <= 1 ? stack : stack.slice(0, -1)));
@@ -182,10 +239,10 @@ class WrMeta {
182
239
  link.remove();
183
240
  }
184
241
  }
185
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMeta, deps: [], target: i0.ɵɵFactoryTarget.Service });
186
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.1", ngImport: i0, type: WrMeta });
242
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMeta, deps: [], target: i0.ɵɵFactoryTarget.Service });
243
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: WrMeta });
187
244
  }
188
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMeta, decorators: [{
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMeta, decorators: [{
189
246
  type: Service
190
247
  }], ctorParameters: () => [] });
191
248
 
@@ -220,10 +277,10 @@ class WrMetaBinding {
220
277
  });
221
278
  inject(DestroyRef).onDestroy(() => this.handle?.pop());
222
279
  }
223
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMetaBinding, deps: [], target: i0.ɵɵFactoryTarget.Directive });
224
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: WrMetaBinding, isStandalone: true, selector: "[wrMeta]", inputs: { wrMeta: { classPropertyName: "wrMeta", publicName: "wrMeta", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
280
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMetaBinding, deps: [], target: i0.ɵɵFactoryTarget.Directive });
281
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: WrMetaBinding, isStandalone: true, selector: "[wrMeta]", inputs: { wrMeta: { classPropertyName: "wrMeta", publicName: "wrMeta", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
225
282
  }
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMetaBinding, decorators: [{
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMetaBinding, decorators: [{
227
284
  type: Directive,
228
285
  args: [{ selector: '[wrMeta]' }]
229
286
  }], ctorParameters: () => [], propDecorators: { wrMeta: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrMeta", required: true }] }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-meta.mjs","sources":["../../../projects/lib/meta/tokens.ts","../../../projects/lib/meta/wr-meta.ts","../../../projects/lib/meta/wr-meta-binding.ts","../../../projects/lib/meta/provide-wr-meta.ts","../../../projects/lib/meta/ngwr-meta.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { WrMetaConfig } from './interfaces';\n\n/** App-wide defaults registered via {@link provideWrMeta}. */\nexport const WR_META_DEFAULTS = new InjectionToken<WrMetaConfig>('WR_META_DEFAULTS', {\n factory: (): WrMetaConfig => ({}),\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 { DOCUMENT } from '@angular/common';\nimport { Service, computed, inject, signal } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\n\nimport type { WrMetaConfig, WrMetaHandle } from './interfaces';\nimport { WR_META_DEFAULTS } from './tokens';\n\n/** Deep-merge two `WrMetaConfig` layers — later wins for scalars + nested groups. */\nfunction merge(base: WrMetaConfig, top: WrMetaConfig): WrMetaConfig {\n return {\n ...base,\n ...top,\n og: { ...base.og, ...top.og },\n twitter: { ...base.twitter, ...top.twitter },\n };\n}\n\n/**\n * Centralised `<head>` metadata manager — title, description, keywords,\n * canonical, Open Graph and Twitter Card tags.\n *\n * Stack-based: `push(config)` adds a layer (returned handle pops it),\n * `set(config)` replaces the current top, `reset()` clears all overrides.\n * Layers merge via shallow merge for scalars and a one-level deep merge\n * for `og` / `twitter` groups.\n *\n * The resolved metadata is applied diff-style — only changed tags are\n * touched in the DOM, so reads of `document.head` stay cheap.\n *\n * @example\n * ```ts\n * const meta = inject(WrMeta);\n * meta.set({ title: 'Pricing', description: 'Plans for every team.' });\n *\n * // From a route component — auto-pop on destroy via the directive:\n * <div [wrMeta]=\"{ title: 'Pricing' }\">\n * ```\n *\n * @see https://ngwr.dev/services/meta\n */\n@Service()\nexport class WrMeta {\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly doc = inject(DOCUMENT);\n private readonly defaults = inject(WR_META_DEFAULTS);\n\n /** Stack of meta layers. Bottom = defaults, top = currently applied. */\n private readonly stack = signal<readonly WrMetaConfig[]>([this.defaults]);\n\n /** Resolved (merged) metadata at the top of the stack. */\n readonly resolved = computed(() => this.stack().reduce((acc, layer) => merge(acc, layer), {} as WrMetaConfig));\n\n /** Last applied snapshot — used to diff against the next resolution. */\n private applied: WrMetaConfig = {};\n\n constructor() {\n // Apply defaults immediately on construction.\n this.apply();\n }\n\n /** Snapshot of the resolved metadata currently in the DOM. */\n current(): Readonly<WrMetaConfig> {\n return this.applied;\n }\n\n /** Replace the top layer (or create one if only defaults are present). */\n set(config: WrMetaConfig): void {\n this.stack.update(stack => {\n if (stack.length <= 1) return [...stack, config];\n return [...stack.slice(0, -1), config];\n });\n this.apply();\n }\n\n /** Push a new layer. Returns a handle whose `.pop()` removes it. */\n push(config: WrMetaConfig): WrMetaHandle {\n this.stack.update(stack => [...stack, config]);\n this.apply();\n const target = config;\n return {\n pop: () => {\n this.stack.update(stack => {\n const idx = stack.lastIndexOf(target);\n if (idx <= 0) return stack;\n return [...stack.slice(0, idx), ...stack.slice(idx + 1)];\n });\n this.apply();\n },\n };\n }\n\n /** Pop the most recently pushed layer (defaults remain). */\n pop(): void {\n this.stack.update(stack => (stack.length <= 1 ? stack : stack.slice(0, -1)));\n this.apply();\n }\n\n /** Clear all overrides, restore the defaults registered via `provideWrMeta`. */\n reset(): void {\n this.stack.set([this.defaults]);\n this.apply();\n }\n\n // Internals\n\n private apply(): void {\n const next = this.resolved();\n this.diffTitle(next);\n this.diffMeta(next);\n this.diffLink(next);\n this.applied = next;\n }\n\n private diffTitle(next: WrMetaConfig): void {\n if (next.title === this.applied.title && next.titleTemplate === this.applied.titleTemplate) return;\n if (next.title) {\n // `{{ title }}` reads like Angular; `%s` stays for printf fans.\n const formatted = next.titleTemplate\n ? next.titleTemplate.replace(/\\{\\{\\s*title\\s*\\}\\}/g, next.title).replace('%s', next.title)\n : next.title;\n this.title.setTitle(formatted);\n } else if (this.applied.title) {\n this.title.setTitle('');\n }\n }\n\n private diffMeta(next: WrMetaConfig): void {\n this.updateName('description', next.description);\n this.updateName('keywords', next.keywords?.join(', '));\n this.updateName('theme-color', next.themeColor);\n\n // Open Graph.\n this.updateProp('og:title', next.og?.title ?? next.title);\n this.updateProp('og:description', next.og?.description ?? next.description);\n this.updateProp('og:image', next.og?.image);\n this.updateProp('og:url', next.og?.url ?? next.canonical);\n this.updateProp('og:type', next.og?.type);\n this.updateProp('og:site_name', next.og?.siteName);\n\n // Twitter.\n this.updateName('twitter:card', next.twitter?.card);\n this.updateName('twitter:title', next.twitter?.title ?? next.title);\n this.updateName('twitter:description', next.twitter?.description ?? next.description);\n this.updateName('twitter:image', next.twitter?.image ?? next.og?.image);\n this.updateName('twitter:creator', next.twitter?.creator);\n }\n\n private updateName(name: string, content: string | undefined): void {\n if (content) {\n this.meta.updateTag({ name, content }, `name='${name}'`);\n } else {\n this.meta.removeTag(`name='${name}'`);\n }\n }\n\n private updateProp(property: string, content: string | undefined): void {\n if (content) {\n this.meta.updateTag({ property, content }, `property='${property}'`);\n } else {\n this.meta.removeTag(`property='${property}'`);\n }\n }\n\n private diffLink(next: WrMetaConfig): void {\n if (next.canonical === this.applied.canonical) return;\n const head = this.doc.head;\n let link = head.querySelector<HTMLLinkElement>(\"link[rel='canonical']\");\n if (next.canonical) {\n if (!link) {\n link = this.doc.createElement('link');\n link.setAttribute('rel', 'canonical');\n head.appendChild(link);\n }\n link.setAttribute('href', next.canonical);\n } else if (link) {\n link.remove();\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 { DestroyRef, Directive, effect, inject, input } from '@angular/core';\n\nimport type { WrMetaConfig, WrMetaHandle } from './interfaces';\nimport { WrMeta } from './wr-meta';\n\n/**\n * Declarative wrapper around {@link WrMeta}.\n *\n * - Pushes the bound config on init.\n * - Re-pushes (replacing) when the config reference changes.\n * - Pops the layer on destroy — perfect for route-level meta overrides.\n *\n * @example\n * ```html\n * <div [wrMeta]=\"{ title: 'Pricing', description: 'Plans for every team.' }\">\n * ```\n */\n@Directive({ selector: '[wrMeta]' })\nexport class WrMetaBinding {\n readonly wrMeta = input.required<WrMetaConfig>();\n\n private readonly metaService = inject(WrMeta);\n private handle: WrMetaHandle | null = null;\n\n constructor() {\n effect(() => {\n const next = this.wrMeta();\n this.handle?.pop();\n this.handle = this.metaService.push(next);\n });\n inject(DestroyRef).onDestroy(() => this.handle?.pop());\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\n\nimport type { WrMetaConfig } from './interfaces';\nimport { WR_META_DEFAULTS } from './tokens';\n\n/**\n * Register app-wide defaults for {@link WrMeta}. Use to set a\n * consistent baseline `title` / `titleTemplate` / `og` / `twitter` for every\n * route — individual routes / components can override via\n * `metaService.push(...)` or the `[wrMeta]` directive.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideWrMeta({\n * titleTemplate: '{{ title }} · NGWR',\n * description: 'Angular UI components library',\n * og: { siteName: 'NGWR', type: 'website' },\n * twitter: { card: 'summary_large_image', creator: '@thekhegay' },\n * }),\n * ],\n * });\n * ```\n */\nexport function provideWrMeta(defaults: WrMetaConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: WR_META_DEFAULTS, useValue: defaults }]);\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-meta.mjs","sources":["../../../projects/lib/meta/tokens.ts","../../../projects/lib/meta/wr-meta.ts","../../../projects/lib/meta/wr-meta-binding.ts","../../../projects/lib/meta/provide-wr-meta.ts","../../../projects/lib/meta/ngwr-meta.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { WrMetaConfig } from './interfaces';\n\n/** App-wide defaults registered via {@link provideWrMeta}. */\nexport const WR_META_DEFAULTS = new InjectionToken<WrMetaConfig>('WR_META_DEFAULTS', {\n factory: (): WrMetaConfig => ({}),\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 { DOCUMENT } from '@angular/common';\nimport { Injector, Service, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\n\nimport type { WrMetaConfig, WrMetaHandle } from './interfaces';\nimport { WR_META_DEFAULTS } from './tokens';\n\n/** Deep-merge two `WrMetaConfig` layers — later wins for scalars + nested groups. */\nfunction merge(base: WrMetaConfig, top: WrMetaConfig): WrMetaConfig {\n return {\n ...base,\n ...top,\n og: { ...base.og, ...top.og },\n twitter: { ...base.twitter, ...top.twitter },\n };\n}\n\n/**\n * Centralised `<head>` metadata manager — title, description, keywords,\n * canonical, Open Graph and Twitter Card tags.\n *\n * Stack-based: `push(config)` adds a layer (returned handle pops it),\n * `set(config)` replaces the current top, `reset()` clears all overrides.\n * Layers merge via shallow merge for scalars and a one-level deep merge\n * for `og` / `twitter` groups.\n *\n * The resolved metadata is applied diff-style — only changed tags are\n * touched in the DOM, so reads of `document.head` stay cheap.\n *\n * @example\n * ```ts\n * const meta = inject(WrMeta);\n * meta.set({ title: 'Pricing', description: 'Plans for every team.' });\n *\n * // From a route component — auto-pop on destroy via the directive:\n * <div [wrMeta]=\"{ title: 'Pricing' }\">\n * ```\n *\n * @see https://ngwr.dev/services/meta\n */\n@Service()\nexport class WrMeta {\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly doc = inject(DOCUMENT);\n private readonly defaults = inject(WR_META_DEFAULTS);\n private readonly injector = inject(Injector);\n\n /** Stack of meta layers. Bottom = defaults, top = currently applied. */\n private readonly stack = signal<readonly WrMetaConfig[]>([this.defaults]);\n\n /** Resolved (merged) metadata at the top of the stack. */\n readonly resolved = computed(() => this.stack().reduce((acc, layer) => merge(acc, layer), {} as WrMetaConfig));\n\n /** Last applied snapshot — used to diff against the next resolution. */\n private applied: WrMetaConfig = {};\n\n constructor() {\n // Apply defaults immediately on construction.\n this.apply();\n }\n\n /** Snapshot of the resolved metadata currently in the DOM. */\n current(): Readonly<WrMetaConfig> {\n return this.applied;\n }\n\n /** Replace the top layer (or create one if only defaults are present). */\n set(config: WrMetaConfig): void {\n this.stack.update(stack => {\n if (stack.length <= 1) return [...stack, config];\n return [...stack.slice(0, -1), config];\n });\n this.apply();\n }\n\n /** Push a new layer. Returns a handle whose `.pop()` removes it. */\n push(config: WrMetaConfig): WrMetaHandle {\n this.stack.update(stack => [...stack, config]);\n this.apply();\n const target = config;\n return {\n pop: () => {\n this.stack.update(stack => {\n const idx = stack.lastIndexOf(target);\n if (idx <= 0) return stack;\n return [...stack.slice(0, idx), ...stack.slice(idx + 1)];\n });\n this.apply();\n },\n };\n }\n\n /**\n * Reactive layer. Runs `factory` inside an effect and re-applies the\n * resolved metadata whenever any signal it reads changes — so a title\n * (or any field) built from {@link WrI18n}'s `t()` updates live on\n * locale switch, with no manual re-`set()`.\n *\n * Returns a handle whose `.pop()` removes the layer and stops the effect.\n * Safe to call outside an injection context.\n *\n * @example Locale-aware title\n * ```ts\n * const meta = inject(WrMeta);\n * const i18n = inject(WrI18n);\n *\n * // `i18n.t(...)` tracks the active locale, so the title re-renders\n * // every time `i18n.use(...)` switches languages.\n * meta.bind(() => ({\n * title: i18n.t('home.title'),\n * description: i18n.t('home.description'),\n * }));\n * ```\n */\n bind(factory: () => WrMetaConfig): WrMetaHandle {\n let current: WrMetaConfig | null = null;\n\n const ref = effect(\n () => {\n const next = factory();\n // Recompute is reactive; the stack write + DOM apply are not, so\n // the effect only re-runs on `factory`'s own dependencies.\n untracked(() => {\n this.stack.update(stack => {\n if (current === null) return [...stack, next];\n const idx = stack.lastIndexOf(current);\n return idx < 0 ? [...stack, next] : [...stack.slice(0, idx), next, ...stack.slice(idx + 1)];\n });\n current = next;\n this.apply();\n });\n },\n { injector: this.injector }\n );\n\n return {\n pop: () => {\n ref.destroy();\n if (current === null) return;\n const target = current;\n current = null;\n this.stack.update(stack => {\n const idx = stack.lastIndexOf(target);\n if (idx <= 0) return stack;\n return [...stack.slice(0, idx), ...stack.slice(idx + 1)];\n });\n this.apply();\n },\n };\n }\n\n /** Pop the most recently pushed layer (defaults remain). */\n pop(): void {\n this.stack.update(stack => (stack.length <= 1 ? stack : stack.slice(0, -1)));\n this.apply();\n }\n\n /** Clear all overrides, restore the defaults registered via `provideWrMeta`. */\n reset(): void {\n this.stack.set([this.defaults]);\n this.apply();\n }\n\n // Internals\n\n private apply(): void {\n const next = this.resolved();\n this.diffTitle(next);\n this.diffMeta(next);\n this.diffLink(next);\n this.applied = next;\n }\n\n private diffTitle(next: WrMetaConfig): void {\n if (next.title === this.applied.title && next.titleTemplate === this.applied.titleTemplate) return;\n if (next.title) {\n // `{{ title }}` reads like Angular; `%s` stays for printf fans.\n const formatted = next.titleTemplate\n ? next.titleTemplate.replace(/\\{\\{\\s*title\\s*\\}\\}/g, next.title).replace('%s', next.title)\n : next.title;\n this.title.setTitle(formatted);\n } else if (this.applied.title) {\n this.title.setTitle('');\n }\n }\n\n private diffMeta(next: WrMetaConfig): void {\n this.updateName('description', next.description);\n this.updateName('keywords', next.keywords?.join(', '));\n this.updateName('theme-color', next.themeColor);\n\n // Open Graph.\n this.updateProp('og:title', next.og?.title ?? next.title);\n this.updateProp('og:description', next.og?.description ?? next.description);\n this.updateProp('og:image', next.og?.image);\n this.updateProp('og:url', next.og?.url ?? next.canonical);\n this.updateProp('og:type', next.og?.type);\n this.updateProp('og:site_name', next.og?.siteName);\n\n // Twitter.\n this.updateName('twitter:card', next.twitter?.card);\n this.updateName('twitter:title', next.twitter?.title ?? next.title);\n this.updateName('twitter:description', next.twitter?.description ?? next.description);\n this.updateName('twitter:image', next.twitter?.image ?? next.og?.image);\n this.updateName('twitter:creator', next.twitter?.creator);\n }\n\n private updateName(name: string, content: string | undefined): void {\n if (content) {\n this.meta.updateTag({ name, content }, `name='${name}'`);\n } else {\n this.meta.removeTag(`name='${name}'`);\n }\n }\n\n private updateProp(property: string, content: string | undefined): void {\n if (content) {\n this.meta.updateTag({ property, content }, `property='${property}'`);\n } else {\n this.meta.removeTag(`property='${property}'`);\n }\n }\n\n private diffLink(next: WrMetaConfig): void {\n if (next.canonical === this.applied.canonical) return;\n const head = this.doc.head;\n let link = head.querySelector<HTMLLinkElement>(\"link[rel='canonical']\");\n if (next.canonical) {\n if (!link) {\n link = this.doc.createElement('link');\n link.setAttribute('rel', 'canonical');\n head.appendChild(link);\n }\n link.setAttribute('href', next.canonical);\n } else if (link) {\n link.remove();\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 { DestroyRef, Directive, effect, inject, input } from '@angular/core';\n\nimport type { WrMetaConfig, WrMetaHandle } from './interfaces';\nimport { WrMeta } from './wr-meta';\n\n/**\n * Declarative wrapper around {@link WrMeta}.\n *\n * - Pushes the bound config on init.\n * - Re-pushes (replacing) when the config reference changes.\n * - Pops the layer on destroy — perfect for route-level meta overrides.\n *\n * @example\n * ```html\n * <div [wrMeta]=\"{ title: 'Pricing', description: 'Plans for every team.' }\">\n * ```\n */\n@Directive({ selector: '[wrMeta]' })\nexport class WrMetaBinding {\n readonly wrMeta = input.required<WrMetaConfig>();\n\n private readonly metaService = inject(WrMeta);\n private handle: WrMetaHandle | null = null;\n\n constructor() {\n effect(() => {\n const next = this.wrMeta();\n this.handle?.pop();\n this.handle = this.metaService.push(next);\n });\n inject(DestroyRef).onDestroy(() => this.handle?.pop());\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\n\nimport type { WrMetaConfig } from './interfaces';\nimport { WR_META_DEFAULTS } from './tokens';\n\n/**\n * Register app-wide defaults for {@link WrMeta}. Use to set a\n * consistent baseline `title` / `titleTemplate` / `og` / `twitter` for every\n * route — individual routes / components can override via\n * `metaService.push(...)` or the `[wrMeta]` directive.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideWrMeta({\n * titleTemplate: '{{ title }} · NGWR',\n * description: 'Angular UI components library',\n * og: { siteName: 'NGWR', type: 'website' },\n * twitter: { card: 'summary_large_image', creator: '@thekhegay' },\n * }),\n * ],\n * });\n * ```\n */\nexport function provideWrMeta(defaults: WrMetaConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: WR_META_DEFAULTS, useValue: defaults }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -57,10 +57,10 @@ class WrMeterGroup {
57
57
  percent: (Math.max(0, segment.value) / this.resolvedMax()) * 100,
58
58
  })), /* @ts-ignore */
59
59
  ...(ngDevMode ? [{ debugName: "slices" }] : /* istanbul ignore next */ []));
60
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMeterGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
61
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: WrMeterGroup, isStandalone: true, selector: "wr-meter-group", inputs: { segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showValues: { classPropertyName: "showValues", publicName: "showValues", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-meter-group" }, ngImport: i0, template: "<div class=\"wr-meter-group__bar\" role=\"progressbar\" [attr.aria-valuemin]=\"0\" [attr.aria-valuemax]=\"resolvedMax()\">\n @for (slice of slices(); track $index) {\n <span\n class=\"wr-meter-group__slice\"\n [title]=\"slice.label\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"\n ></span>\n }\n</div>\n\n@if (showLegend() && slices().length > 0) {\n <ul class=\"wr-meter-group__legend\">\n @for (slice of slices(); track $index) {\n <li class=\"wr-meter-group__legend-item\">\n <span class=\"wr-meter-group__swatch\" aria-hidden=\"true\" [style.background]=\"slice.color\"></span>\n <span class=\"wr-meter-group__legend-label\">{{ slice.label }}</span>\n @if (showValues()) {\n <span class=\"wr-meter-group__legend-value\">{{ slice.value }}</span>\n }\n </li>\n }\n </ul>\n}\n", encapsulation: i0.ViewEncapsulation.None });
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMeterGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrMeterGroup, isStandalone: true, selector: "wr-meter-group", inputs: { segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showValues: { classPropertyName: "showValues", publicName: "showValues", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "wr-meter-group" }, ngImport: i0, template: "<div class=\"wr-meter-group__bar\" role=\"progressbar\" [attr.aria-valuemin]=\"0\" [attr.aria-valuemax]=\"resolvedMax()\">\n @for (slice of slices(); track $index) {\n <span\n class=\"wr-meter-group__slice\"\n [title]=\"slice.label\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"\n ></span>\n }\n</div>\n\n@if (showLegend() && slices().length > 0) {\n <ul class=\"wr-meter-group__legend\">\n @for (slice of slices(); track $index) {\n <li class=\"wr-meter-group__legend-item\">\n <span class=\"wr-meter-group__swatch\" aria-hidden=\"true\" [style.background]=\"slice.color\"></span>\n <span class=\"wr-meter-group__legend-label\">{{ slice.label }}</span>\n @if (showValues()) {\n <span class=\"wr-meter-group__legend-value\">{{ slice.value }}</span>\n }\n </li>\n }\n </ul>\n}\n", encapsulation: i0.ViewEncapsulation.None });
62
62
  }
63
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrMeterGroup, decorators: [{
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrMeterGroup, decorators: [{
64
64
  type: Component,
65
65
  args: [{ selector: 'wr-meter-group', encapsulation: ViewEncapsulation.None, host: { class: 'wr-meter-group' }, template: "<div class=\"wr-meter-group__bar\" role=\"progressbar\" [attr.aria-valuemin]=\"0\" [attr.aria-valuemax]=\"resolvedMax()\">\n @for (slice of slices(); track $index) {\n <span\n class=\"wr-meter-group__slice\"\n [title]=\"slice.label\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"\n ></span>\n }\n</div>\n\n@if (showLegend() && slices().length > 0) {\n <ul class=\"wr-meter-group__legend\">\n @for (slice of slices(); track $index) {\n <li class=\"wr-meter-group__legend-item\">\n <span class=\"wr-meter-group__swatch\" aria-hidden=\"true\" [style.background]=\"slice.color\"></span>\n <span class=\"wr-meter-group__legend-label\">{{ slice.label }}</span>\n @if (showValues()) {\n <span class=\"wr-meter-group__legend-value\">{{ slice.value }}</span>\n }\n </li>\n }\n </ul>\n}\n" }]
66
66
  }], propDecorators: { segments: [{ type: i0.Input, args: [{ isSignal: true, alias: "segments", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], showLegend: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLegend", required: false }] }], showValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValues", required: false }] }] } });
@@ -29,10 +29,10 @@ class WrOverlayContainer extends OverlayContainer {
29
29
  super._createContainer();
30
30
  this._containerElement?.classList.add('wr-overlay-container');
31
31
  }
32
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrOverlayContainer, deps: [], target: i0.ɵɵFactoryTarget.Service });
33
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.1", ngImport: i0, type: WrOverlayContainer });
32
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrOverlayContainer, deps: [], target: i0.ɵɵFactoryTarget.Service });
33
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: WrOverlayContainer });
34
34
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrOverlayContainer, decorators: [{
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrOverlayContainer, decorators: [{
36
36
  type: Service
37
37
  }] });
38
38
 
@@ -79,6 +79,44 @@ const WR_OVERLAY_CONTAINER = new InjectionToken('WR_OVERLAY_CONTAINER', {
79
79
  factory: () => inject(OverlayContainer),
80
80
  });
81
81
 
82
+ /**
83
+ * @license
84
+ *
85
+ * Use of this source code is governed by an MIT-style license that can be
86
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
87
+ */
88
+ /**
89
+ * When set, overlay services (dialog, select, dropdown, …) present as a
90
+ * slide-up bottom-sheet on viewports at or below `breakpoint`. `null`
91
+ * (the default) keeps every overlay floating. Configure via
92
+ * {@link provideWrResponsiveOverlays}; override per call with a
93
+ * component's `responsive` option.
94
+ *
95
+ * @internal
96
+ */
97
+ const WR_RESPONSIVE_OVERLAYS = new InjectionToken('WR_RESPONSIVE_OVERLAYS', {
98
+ factory: () => null,
99
+ });
100
+ /**
101
+ * Decide whether an overlay should present as a bottom-sheet for the
102
+ * current viewport.
103
+ *
104
+ * - `responsive === true` — sheet on small viewports regardless of config.
105
+ * - `responsive === false` — never a sheet.
106
+ * - `responsive === undefined` — follow the global config (sheet when
107
+ * {@link provideWrResponsiveOverlays} is configured).
108
+ *
109
+ * SSR-safe: returns `false` when there's no `window`.
110
+ *
111
+ * @internal
112
+ */
113
+ function wrPresentAsSheet(responsive, config) {
114
+ const enabled = responsive ?? config !== null;
115
+ if (!enabled || typeof window === 'undefined')
116
+ return false;
117
+ return window.innerWidth <= (config?.breakpoint ?? 640);
118
+ }
119
+
82
120
  /**
83
121
  * @license
84
122
  *
@@ -137,9 +175,40 @@ function provideWrOverlay() {
137
175
  ]);
138
176
  }
139
177
 
178
+ /**
179
+ * @license
180
+ *
181
+ * Use of this source code is governed by an MIT-style license that can be
182
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
183
+ */
184
+ /**
185
+ * Opt every NGWR overlay into responsive presentation — on viewports at or
186
+ * below `breakpoint`, dialogs / selects / dropdowns and friends slide up as
187
+ * a full-width bottom-sheet instead of a floating panel. Built on the same
188
+ * overlay plumbing, so focus-trap, backdrop and scroll-blocking carry over.
189
+ *
190
+ * Individual components can still opt out (or in) per instance via their
191
+ * `responsive` option.
192
+ *
193
+ * @example
194
+ * ```ts
195
+ * bootstrapApplication(AppComponent, {
196
+ * providers: [provideWrOverlay(), provideWrResponsiveOverlays()],
197
+ * });
198
+ *
199
+ * // Custom breakpoint:
200
+ * provideWrResponsiveOverlays({ breakpoint: 768 });
201
+ * ```
202
+ */
203
+ function provideWrResponsiveOverlays(config) {
204
+ return makeEnvironmentProviders([
205
+ { provide: WR_RESPONSIVE_OVERLAYS, useValue: { breakpoint: config?.breakpoint ?? 640 } },
206
+ ]);
207
+ }
208
+
140
209
  /**
141
210
  * Generated bundle index. Do not edit.
142
211
  */
143
212
 
144
- export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WrOverlayContainer, provideWrOverlay };
213
+ export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, wrPresentAsSheet };
145
214
  //# sourceMappingURL=ngwr-overlay.mjs.map