ngwr 15.1.0 → 15.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 (206) hide show
  1. package/bits/aurora/styles/_rules.scss +11 -0
  2. package/bits/dot-grid/styles/_rules.scss +9 -1
  3. package/bits/iridescence/iridescence.scss +1 -0
  4. package/bits/iridescence/styles/_index.scss +8 -0
  5. package/bits/iridescence/styles/_rules.scss +72 -0
  6. package/bits/marquee/styles/_rules.scss +7 -3
  7. package/bits/ripple-grid/styles/_rules.scss +10 -2
  8. package/bits/spotlight-card/styles/_rules.scss +7 -4
  9. package/bits/star-border/styles/_rules.scss +5 -2
  10. package/bits/threads/styles/_rules.scss +9 -1
  11. package/bits/waves/styles/_rules.scss +8 -1
  12. package/charts/candlestick-chart/styles/_index.scss +2 -2
  13. package/fesm2022/ngwr-affix.mjs +3 -3
  14. package/fesm2022/ngwr-alert.mjs +3 -3
  15. package/fesm2022/ngwr-anchor.mjs +3 -3
  16. package/fesm2022/ngwr-avatar.mjs +3 -3
  17. package/fesm2022/ngwr-back-top.mjs +3 -3
  18. package/fesm2022/ngwr-badge.mjs +6 -6
  19. package/fesm2022/ngwr-bits-aurora.mjs +30 -38
  20. package/fesm2022/ngwr-bits-aurora.mjs.map +1 -1
  21. package/fesm2022/ngwr-bits-blur-text.mjs +3 -3
  22. package/fesm2022/ngwr-bits-border-glow-testing.mjs.map +1 -1
  23. package/fesm2022/ngwr-bits-border-glow.mjs +11 -5
  24. package/fesm2022/ngwr-bits-border-glow.mjs.map +1 -1
  25. package/fesm2022/ngwr-bits-circular-text.mjs +3 -3
  26. package/fesm2022/ngwr-bits-click-spark.mjs +3 -3
  27. package/fesm2022/ngwr-bits-confetti.mjs +3 -3
  28. package/fesm2022/ngwr-bits-decrypt-text.mjs +3 -3
  29. package/fesm2022/ngwr-bits-dot-grid.mjs +12 -9
  30. package/fesm2022/ngwr-bits-dot-grid.mjs.map +1 -1
  31. package/fesm2022/ngwr-bits-falling-text.mjs +3 -3
  32. package/fesm2022/ngwr-bits-fuzzy-text.mjs +3 -3
  33. package/fesm2022/ngwr-bits-glitch-text.mjs +3 -3
  34. package/fesm2022/ngwr-bits-gradient-text.mjs +3 -3
  35. package/fesm2022/ngwr-bits-iridescence-testing.mjs +31 -0
  36. package/fesm2022/ngwr-bits-iridescence-testing.mjs.map +1 -0
  37. package/fesm2022/ngwr-bits-iridescence.mjs +591 -0
  38. package/fesm2022/ngwr-bits-iridescence.mjs.map +1 -0
  39. package/fesm2022/ngwr-bits-marquee-testing.mjs +1 -1
  40. package/fesm2022/ngwr-bits-marquee-testing.mjs.map +1 -1
  41. package/fesm2022/ngwr-bits-marquee.mjs +7 -7
  42. package/fesm2022/ngwr-bits-marquee.mjs.map +1 -1
  43. package/fesm2022/ngwr-bits-ripple-grid.mjs +8 -11
  44. package/fesm2022/ngwr-bits-ripple-grid.mjs.map +1 -1
  45. package/fesm2022/ngwr-bits-rotating-text.mjs +3 -3
  46. package/fesm2022/ngwr-bits-shiny-text.mjs +6 -6
  47. package/fesm2022/ngwr-bits-splash-cursor.mjs +3 -3
  48. package/fesm2022/ngwr-bits-split-text.mjs +3 -3
  49. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs +1 -1
  50. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs.map +1 -1
  51. package/fesm2022/ngwr-bits-spotlight-card.mjs +10 -10
  52. package/fesm2022/ngwr-bits-spotlight-card.mjs.map +1 -1
  53. package/fesm2022/ngwr-bits-star-border-testing.mjs +1 -1
  54. package/fesm2022/ngwr-bits-star-border-testing.mjs.map +1 -1
  55. package/fesm2022/ngwr-bits-star-border.mjs +7 -7
  56. package/fesm2022/ngwr-bits-star-border.mjs.map +1 -1
  57. package/fesm2022/ngwr-bits-threads.mjs +17 -12
  58. package/fesm2022/ngwr-bits-threads.mjs.map +1 -1
  59. package/fesm2022/ngwr-bits-tilt-card.mjs +6 -6
  60. package/fesm2022/ngwr-bits-typewriter.mjs +3 -3
  61. package/fesm2022/ngwr-bits-waves.mjs +15 -11
  62. package/fesm2022/ngwr-bits-waves.mjs.map +1 -1
  63. package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
  64. package/fesm2022/ngwr-burger.mjs +3 -3
  65. package/fesm2022/ngwr-button.mjs +6 -6
  66. package/fesm2022/ngwr-calendar.mjs +3 -3
  67. package/fesm2022/ngwr-card.mjs +9 -9
  68. package/fesm2022/ngwr-carousel.mjs +6 -6
  69. package/fesm2022/ngwr-cascader.mjs +3 -3
  70. package/fesm2022/ngwr-charts-bar-chart.mjs +3 -3
  71. package/fesm2022/ngwr-charts-boxplot-chart.mjs +3 -3
  72. package/fesm2022/ngwr-charts-bullet-chart.mjs +3 -3
  73. package/fesm2022/ngwr-charts-calendar-heatmap.mjs +3 -3
  74. package/fesm2022/ngwr-charts-candlestick-chart.mjs +7 -7
  75. package/fesm2022/ngwr-charts-candlestick-chart.mjs.map +1 -1
  76. package/fesm2022/ngwr-charts-chart-legend.mjs +6 -6
  77. package/fesm2022/ngwr-charts-core.mjs +3 -3
  78. package/fesm2022/ngwr-charts-donut-chart.mjs +3 -3
  79. package/fesm2022/ngwr-charts-funnel-chart.mjs +3 -3
  80. package/fesm2022/ngwr-charts-gauge.mjs +3 -3
  81. package/fesm2022/ngwr-charts-heatmap-chart.mjs +3 -3
  82. package/fesm2022/ngwr-charts-line-chart.mjs +3 -3
  83. package/fesm2022/ngwr-charts-meter-group.mjs +3 -3
  84. package/fesm2022/ngwr-charts-radar-chart.mjs +3 -3
  85. package/fesm2022/ngwr-charts-scatter-chart.mjs +3 -3
  86. package/fesm2022/ngwr-charts-sparkline.mjs +3 -3
  87. package/fesm2022/ngwr-charts-treemap-chart.mjs +3 -3
  88. package/fesm2022/ngwr-charts-waterfall-chart.mjs +3 -3
  89. package/fesm2022/ngwr-checkbox.mjs +6 -6
  90. package/fesm2022/ngwr-clipboard.mjs +3 -3
  91. package/fesm2022/ngwr-collapse.mjs +9 -9
  92. package/fesm2022/ngwr-color-picker.mjs +6 -6
  93. package/fesm2022/ngwr-command-palette.mjs +3 -3
  94. package/fesm2022/ngwr-compare.mjs +3 -3
  95. package/fesm2022/ngwr-context-menu.mjs +12 -12
  96. package/fesm2022/ngwr-cookie.mjs +3 -3
  97. package/fesm2022/ngwr-counter.mjs +6 -6
  98. package/fesm2022/ngwr-date-picker.mjs +21 -21
  99. package/fesm2022/ngwr-date.mjs +6 -6
  100. package/fesm2022/ngwr-density.mjs +6 -6
  101. package/fesm2022/ngwr-descriptions.mjs +6 -6
  102. package/fesm2022/ngwr-dialog.mjs +15 -15
  103. package/fesm2022/ngwr-directives.mjs +12 -12
  104. package/fesm2022/ngwr-divider.mjs +3 -3
  105. package/fesm2022/ngwr-drawer.mjs +18 -18
  106. package/fesm2022/ngwr-dropdown.mjs +9 -9
  107. package/fesm2022/ngwr-editor.mjs +3 -3
  108. package/fesm2022/ngwr-empty.mjs +3 -3
  109. package/fesm2022/ngwr-event-calendar.mjs +6 -6
  110. package/fesm2022/ngwr-file-upload.mjs +3 -3
  111. package/fesm2022/ngwr-form.mjs +9 -9
  112. package/fesm2022/ngwr-graph.mjs +6 -6
  113. package/fesm2022/ngwr-hotkey.mjs +6 -6
  114. package/fesm2022/ngwr-i18n.mjs +9 -9
  115. package/fesm2022/ngwr-icon.mjs +6 -6
  116. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  117. package/fesm2022/ngwr-input-number.mjs +3 -3
  118. package/fesm2022/ngwr-input-otp.mjs +3 -3
  119. package/fesm2022/ngwr-input.mjs +15 -15
  120. package/fesm2022/ngwr-keyboard.mjs +3 -3
  121. package/fesm2022/ngwr-knob.mjs +3 -3
  122. package/fesm2022/ngwr-layout.mjs +15 -15
  123. package/fesm2022/ngwr-lightbox.mjs +3 -3
  124. package/fesm2022/ngwr-list.mjs +6 -6
  125. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  126. package/fesm2022/ngwr-mention.mjs +6 -6
  127. package/fesm2022/ngwr-meta.mjs +6 -6
  128. package/fesm2022/ngwr-overlay.mjs +6 -6
  129. package/fesm2022/ngwr-page-header.mjs +3 -3
  130. package/fesm2022/ngwr-pagination.mjs +3 -3
  131. package/fesm2022/ngwr-pipes.mjs +21 -21
  132. package/fesm2022/ngwr-platform.mjs +6 -6
  133. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  134. package/fesm2022/ngwr-popover.mjs +12 -12
  135. package/fesm2022/ngwr-progress.mjs +3 -3
  136. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  137. package/fesm2022/ngwr-qr.mjs +4 -3
  138. package/fesm2022/ngwr-qr.mjs.map +1 -1
  139. package/fesm2022/ngwr-radio.mjs +6 -6
  140. package/fesm2022/ngwr-rating.mjs +3 -3
  141. package/fesm2022/ngwr-result.mjs +12 -12
  142. package/fesm2022/ngwr-schema-form.mjs +3 -3
  143. package/fesm2022/ngwr-scroll.mjs +3 -3
  144. package/fesm2022/ngwr-segmented.mjs +3 -3
  145. package/fesm2022/ngwr-select.mjs +12 -12
  146. package/fesm2022/ngwr-sidebar.mjs +3 -3
  147. package/fesm2022/ngwr-skeleton.mjs +3 -3
  148. package/fesm2022/ngwr-slider.mjs +3 -3
  149. package/fesm2022/ngwr-sortable-list.mjs +9 -9
  150. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  151. package/fesm2022/ngwr-spinner.mjs +3 -3
  152. package/fesm2022/ngwr-splitter.mjs +3 -3
  153. package/fesm2022/ngwr-statistic.mjs +9 -9
  154. package/fesm2022/ngwr-stepper.mjs +6 -6
  155. package/fesm2022/ngwr-storage.mjs +3 -3
  156. package/fesm2022/ngwr-switch.mjs +3 -3
  157. package/fesm2022/ngwr-table.mjs +18 -18
  158. package/fesm2022/ngwr-tabs-router.mjs +3 -3
  159. package/fesm2022/ngwr-tabs.mjs +6 -6
  160. package/fesm2022/ngwr-textarea.mjs +3 -3
  161. package/fesm2022/ngwr-theme.mjs +3 -3
  162. package/fesm2022/ngwr-timeline.mjs +6 -6
  163. package/fesm2022/ngwr-toast.mjs +9 -9
  164. package/fesm2022/ngwr-toolbar.mjs +3 -3
  165. package/fesm2022/ngwr-tour.mjs +6 -6
  166. package/fesm2022/ngwr-transfer.mjs +3 -3
  167. package/fesm2022/ngwr-tree.mjs +3 -3
  168. package/fesm2022/ngwr-typography.mjs +3 -3
  169. package/fesm2022/ngwr-utils.mjs +31 -1
  170. package/fesm2022/ngwr-utils.mjs.map +1 -1
  171. package/fesm2022/ngwr-version.mjs +1 -1
  172. package/fesm2022/ngwr-version.mjs.map +1 -1
  173. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  174. package/fesm2022/ngwr-window.mjs +12 -12
  175. package/llms-full.txt +12 -1
  176. package/mcp/server.js +15 -1
  177. package/mcp/tools.js +3 -3
  178. package/package.json +10 -1
  179. package/schematics/ng-add/index.js +2 -2
  180. package/schematics/use/symbol-map.json +1 -0
  181. package/skills/ngwr/SKILL.md +1 -1
  182. package/skills/ngwr/references/catalog.md +2 -0
  183. package/types/ngwr-bits-aurora.d.ts +11 -0
  184. package/types/ngwr-bits-border-glow-testing.d.ts +5 -6
  185. package/types/ngwr-bits-border-glow.d.ts +5 -1
  186. package/types/ngwr-bits-dot-grid.d.ts +7 -2
  187. package/types/ngwr-bits-iridescence-testing.d.ts +85 -0
  188. package/types/ngwr-bits-iridescence.d.ts +244 -0
  189. package/types/ngwr-bits-ripple-grid.d.ts +4 -7
  190. package/types/ngwr-bits-splash-cursor.d.ts +0 -1
  191. package/types/ngwr-bits-spotlight-card-testing.d.ts +3 -1
  192. package/types/ngwr-bits-star-border-testing.d.ts +7 -7
  193. package/types/ngwr-bits-threads.d.ts +11 -8
  194. package/types/ngwr-bits-waves.d.ts +6 -3
  195. package/types/ngwr-charts-core.d.ts +0 -10
  196. package/types/ngwr-color-picker.d.ts +0 -21
  197. package/types/ngwr-dropdown.d.ts +0 -52
  198. package/types/ngwr-editor.d.ts +2 -84
  199. package/types/ngwr-i18n.d.ts +0 -15
  200. package/types/ngwr-mention.d.ts +0 -13
  201. package/types/ngwr-popconfirm.d.ts +0 -33
  202. package/types/ngwr-popover.d.ts +0 -51
  203. package/types/ngwr-tour.d.ts +0 -2
  204. package/types/ngwr-utils.d.ts +49 -7
  205. package/types/ngwr-version.d.ts +1 -1
  206. package/types/ngwr-window.d.ts +0 -56
@@ -88,7 +88,7 @@ var WrTilt = class WrTilt {
88
88
  }
89
89
  static ɵfac = i0.ɵɵngDeclareFactory({
90
90
  minVersion: "12.0.0",
91
- version: "22.2.3",
91
+ version: "22.2.4",
92
92
  ngImport: i0,
93
93
  type: WrTilt,
94
94
  deps: [],
@@ -96,7 +96,7 @@ var WrTilt = class WrTilt {
96
96
  });
97
97
  static ɵdir = i0.ɵɵngDeclareDirective({
98
98
  minVersion: "17.1.0",
99
- version: "22.2.3",
99
+ version: "22.2.4",
100
100
  type: WrTilt,
101
101
  isStandalone: true,
102
102
  selector: "[wrTilt]",
@@ -139,7 +139,7 @@ var WrTilt = class WrTilt {
139
139
  };
140
140
  i0.ɵɵngDeclareClassMetadata({
141
141
  minVersion: "12.0.0",
142
- version: "22.2.3",
142
+ version: "22.2.4",
143
143
  ngImport: i0,
144
144
  type: WrTilt,
145
145
  decorators: [{
@@ -197,7 +197,7 @@ i0.ɵɵngDeclareClassMetadata({
197
197
  var WrTiltCard = class WrTiltCard {
198
198
  static ɵfac = i0.ɵɵngDeclareFactory({
199
199
  minVersion: "12.0.0",
200
- version: "22.2.3",
200
+ version: "22.2.4",
201
201
  ngImport: i0,
202
202
  type: WrTiltCard,
203
203
  deps: [],
@@ -205,7 +205,7 @@ var WrTiltCard = class WrTiltCard {
205
205
  });
206
206
  static ɵcmp = i0.ɵɵngDeclareComponent({
207
207
  minVersion: "14.0.0",
208
- version: "22.2.3",
208
+ version: "22.2.4",
209
209
  type: WrTiltCard,
210
210
  isStandalone: true,
211
211
  selector: "wr-tilt-card",
@@ -232,7 +232,7 @@ var WrTiltCard = class WrTiltCard {
232
232
  };
233
233
  i0.ɵɵngDeclareClassMetadata({
234
234
  minVersion: "12.0.0",
235
- version: "22.2.3",
235
+ version: "22.2.4",
236
236
  ngImport: i0,
237
237
  type: WrTiltCard,
238
238
  decorators: [{
@@ -184,7 +184,7 @@ var WrTypewriter = class WrTypewriter {
184
184
  }
185
185
  static ɵfac = i0.ɵɵngDeclareFactory({
186
186
  minVersion: "12.0.0",
187
- version: "22.2.3",
187
+ version: "22.2.4",
188
188
  ngImport: i0,
189
189
  type: WrTypewriter,
190
190
  deps: [],
@@ -192,7 +192,7 @@ var WrTypewriter = class WrTypewriter {
192
192
  });
193
193
  static ɵcmp = i0.ɵɵngDeclareComponent({
194
194
  minVersion: "17.0.0",
195
- version: "22.2.3",
195
+ version: "22.2.4",
196
196
  type: WrTypewriter,
197
197
  isStandalone: true,
198
198
  selector: "wr-typewriter",
@@ -319,7 +319,7 @@ var WrTypewriter = class WrTypewriter {
319
319
  };
320
320
  i0.ɵɵngDeclareClassMetadata({
321
321
  minVersion: "12.0.0",
322
- version: "22.2.3",
322
+ version: "22.2.4",
323
323
  ngImport: i0,
324
324
  type: WrTypewriter,
325
325
  decorators: [{
@@ -388,7 +388,6 @@ var WrWaves = class WrWaves {
388
388
  height: 0
389
389
  };
390
390
  ratio = 0;
391
- lastTime = -1;
392
391
  mouse = {
393
392
  x: -10,
394
393
  y: 0,
@@ -404,6 +403,7 @@ var WrWaves = class WrWaves {
404
403
  rafId = 0;
405
404
  painted = signal(false, ...ngDevMode ? [{ debugName: "painted" }] : /* istanbul ignore next */ []);
406
405
  booted = signal(false, ...ngDevMode ? [{ debugName: "booted" }] : /* istanbul ignore next */ []);
406
+ hasBox = signal(false, ...ngDevMode ? [{ debugName: "hasBox" }] : /* istanbul ignore next */ []);
407
407
  constructor() {
408
408
  if (!this.isBrowser) return;
409
409
  afterNextRender(() => this.zone.runOutsideAngular(() => this.boot()));
@@ -427,6 +427,7 @@ var WrWaves = class WrWaves {
427
427
  });
428
428
  return;
429
429
  }
430
+ if (!this.hasBox()) return;
430
431
  onCleanup(this.zone.runOutsideAngular(() => this.animate()));
431
432
  });
432
433
  }
@@ -462,7 +463,11 @@ var WrWaves = class WrWaves {
462
463
  cancelAnimationFrame(this.rafId);
463
464
  this.rafId = 0;
464
465
  };
465
- const io = typeof IntersectionObserver === "undefined" ? null : new IntersectionObserver((entries) => entries[entries.length - 1].isIntersecting ? run() : halt());
466
+ const io = typeof IntersectionObserver === "undefined" ? null : new IntersectionObserver((entries) => {
467
+ const { isIntersecting, intersectionRatio } = entries[entries.length - 1];
468
+ if (isIntersecting && intersectionRatio > 0) run();
469
+ else halt();
470
+ }, { threshold: [0, 1e-9] });
466
471
  if (io) io.observe(this.host.nativeElement);
467
472
  else run();
468
473
  return () => {
@@ -470,7 +475,6 @@ var WrWaves = class WrWaves {
470
475
  window.removeEventListener("touchmove", onTouchMove);
471
476
  io?.disconnect();
472
477
  halt();
473
- this.lastTime = -1;
474
478
  };
475
479
  }
476
480
  resize(width, height) {
@@ -478,7 +482,7 @@ var WrWaves = class WrWaves {
478
482
  if (!this.fit(width, height)) return;
479
483
  if (moved) {
480
484
  this.setLines();
481
- if (this.lastTime >= 0) this.drift(this.lastTime);
485
+ if (!this.platform.prefersReducedMotion()) this.drift(performance.now());
482
486
  }
483
487
  this.drawLines();
484
488
  }
@@ -492,6 +496,7 @@ var WrWaves = class WrWaves {
492
496
  height
493
497
  };
494
498
  this.ratio = ratio;
499
+ this.hasBox.set(width > 0 && height > 0);
495
500
  const canvas = this.canvasRef().nativeElement;
496
501
  canvas.width = Math.round(width * ratio);
497
502
  canvas.height = Math.round(height * ratio);
@@ -541,7 +546,6 @@ var WrWaves = class WrWaves {
541
546
  mouse.lx = mouse.x;
542
547
  mouse.ly = mouse.y;
543
548
  mouse.a = Math.atan2(dy, dx);
544
- this.lastTime = time;
545
549
  this.movePoints(time);
546
550
  this.drawLines();
547
551
  this.rafId = requestAnimationFrame((t) => this.tick(t));
@@ -614,7 +618,7 @@ var WrWaves = class WrWaves {
614
618
  ctx.stroke();
615
619
  }
616
620
  resolveLineColor() {
617
- const expression = this.lineColor() ?? "var(--wr-waves-line-color)";
621
+ const expression = (this.lineColor() ?? "").trim() || "var(--wr-waves-line-color)";
618
622
  return resolveCssColor(this.canvasRef().nativeElement, expression, "rgba(15, 23, 42, 0.12)");
619
623
  }
620
624
  updateMouse(x, y) {
@@ -632,7 +636,7 @@ var WrWaves = class WrWaves {
632
636
  }
633
637
  static ɵfac = i0.ɵɵngDeclareFactory({
634
638
  minVersion: "12.0.0",
635
- version: "22.2.3",
639
+ version: "22.2.4",
636
640
  ngImport: i0,
637
641
  type: WrWaves,
638
642
  deps: [],
@@ -640,7 +644,7 @@ var WrWaves = class WrWaves {
640
644
  });
641
645
  static ɵcmp = i0.ɵɵngDeclareComponent({
642
646
  minVersion: "17.2.0",
643
- version: "22.2.3",
647
+ version: "22.2.4",
644
648
  type: WrWaves,
645
649
  isStandalone: true,
646
650
  selector: "wr-waves",
@@ -741,13 +745,13 @@ var WrWaves = class WrWaves {
741
745
  ngImport: i0,
742
746
  template: "<canvas #canvas class=\"wr-waves__canvas\" aria-hidden=\"true\"></canvas>",
743
747
  isInline: true,
744
- styles: [".wr-waves{--wr-waves-line-color: light-dark( color-mix(in srgb, var(--wr-color-on-surface) 12%, transparent), rgb(255 255 255 / 14%) );--wr-waves-x-gap: 10px;position:absolute;inset:0;display:block;margin:0;padding:0;overflow:hidden;background-image:repeating-linear-gradient(to right,var(--wr-waves-line-color) 0 1px,transparent 1px var(--wr-waves-x-gap))}.wr-waves--painted{background-image:none}.wr-waves__canvas{display:block;width:100%;height:100%}\n"],
748
+ styles: [".wr-waves{--wr-waves-line-color: light-dark( color-mix(in srgb, var(--wr-color-on-surface) 12%, transparent), rgb(255 255 255 / 14%) );--wr-waves-x-gap: 10px;position:absolute;inset:0;display:block;margin:0;padding:0;overflow:hidden;background-image:repeating-linear-gradient(to right,var(--wr-waves-line-color) 0 1px,transparent 1px var(--wr-waves-x-gap))}.wr-waves--painted{background-image:none}.wr-waves__canvas{display:block;width:100%;height:100%}@media(forced-colors:active){.wr-waves__canvas{forced-color-adjust:none}}\n"],
745
749
  encapsulation: i0.ViewEncapsulation.None
746
750
  });
747
751
  };
748
752
  i0.ɵɵngDeclareClassMetadata({
749
753
  minVersion: "12.0.0",
750
- version: "22.2.3",
754
+ version: "22.2.4",
751
755
  ngImport: i0,
752
756
  type: WrWaves,
753
757
  decorators: [{
@@ -762,7 +766,7 @@ i0.ɵɵngDeclareClassMetadata({
762
766
  "[style.--wr-waves-x-gap.px]": "xGap()",
763
767
  "[class.wr-waves--painted]": "painted()"
764
768
  },
765
- styles: [".wr-waves{--wr-waves-line-color: light-dark( color-mix(in srgb, var(--wr-color-on-surface) 12%, transparent), rgb(255 255 255 / 14%) );--wr-waves-x-gap: 10px;position:absolute;inset:0;display:block;margin:0;padding:0;overflow:hidden;background-image:repeating-linear-gradient(to right,var(--wr-waves-line-color) 0 1px,transparent 1px var(--wr-waves-x-gap))}.wr-waves--painted{background-image:none}.wr-waves__canvas{display:block;width:100%;height:100%}\n"]
769
+ styles: [".wr-waves{--wr-waves-line-color: light-dark( color-mix(in srgb, var(--wr-color-on-surface) 12%, transparent), rgb(255 255 255 / 14%) );--wr-waves-x-gap: 10px;position:absolute;inset:0;display:block;margin:0;padding:0;overflow:hidden;background-image:repeating-linear-gradient(to right,var(--wr-waves-line-color) 0 1px,transparent 1px var(--wr-waves-x-gap))}.wr-waves--painted{background-image:none}.wr-waves__canvas{display:block;width:100%;height:100%}@media(forced-colors:active){.wr-waves__canvas{forced-color-adjust:none}}\n"]
766
770
  }]
767
771
  }],
768
772
  ctorParameters: () => [],
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-bits-waves.mjs","names":[],"sources":["../../../projects/lib/bits/waves/waves.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 * Angular adaptation of the Waves background by David Haz / reactbits.dev.\n * Original: https://www.reactbits.dev/backgrounds/waves\n *\n * A grid of vertical lines drawn on a 2D canvas. Each point drifts on\n * perlin noise and is pushed around by the pointer with a spring\n * (tension + friction) pulling it back to rest. Each line is drawn as\n * quadratic curves through the points' midpoints, not as straight segments.\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n NgZone,\n PLATFORM_ID,\n ViewEncapsulation,\n afterNextRender,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\nimport { numAttr, resolveCssColor, watchColorScheme } from 'ngwr/utils';\n\n// Perlin noise (Stefan Gustavson's reference permutation)\n/* eslint-disable no-bitwise -- permutation-table hashing is inherently bitwise */\n\nclass Grad {\n constructor(\n private readonly x: number,\n private readonly y: number\n ) {}\n\n dot2(x: number, y: number): number {\n return this.x * x + this.y * y;\n }\n}\n\nconst GRAD3: readonly Grad[] = [\n new Grad(1, 1),\n new Grad(-1, 1),\n new Grad(1, -1),\n new Grad(-1, -1),\n new Grad(1, 0),\n new Grad(-1, 0),\n new Grad(1, 0),\n new Grad(-1, 0),\n new Grad(0, 1),\n new Grad(0, -1),\n new Grad(0, 1),\n new Grad(0, -1),\n];\n\n// prettier-ignore\nconst P: readonly number[] = [\n 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240,\n 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88,\n 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83,\n 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216,\n 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186,\n 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,\n 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9,\n 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193,\n 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157,\n 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128,\n 195, 78, 66, 215, 61, 156, 180,\n];\n\nclass Noise {\n private readonly perm = new Array<number>(512);\n private readonly gradP = new Array<Grad>(512);\n\n constructor(seed: number) {\n if (seed > 0 && seed < 1) seed *= 65536;\n seed = Math.floor(seed);\n if (seed < 256) seed |= seed << 8;\n for (let i = 0; i < 256; i++) {\n const v = i & 1 ? P[i] ^ (seed & 255) : P[i] ^ ((seed >> 8) & 255);\n this.perm[i] = this.perm[i + 256] = v;\n this.gradP[i] = this.gradP[i + 256] = GRAD3[v % 12];\n }\n }\n\n private fade(t: number): number {\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n\n private lerp(a: number, b: number, t: number): number {\n return (1 - t) * a + t * b;\n }\n\n perlin2(x: number, y: number): number {\n let gx = Math.floor(x);\n let gy = Math.floor(y);\n x -= gx;\n y -= gy;\n gx &= 255;\n gy &= 255;\n const n00 = this.gradP[gx + this.perm[gy]].dot2(x, y);\n const n01 = this.gradP[gx + this.perm[gy + 1]].dot2(x, y - 1);\n const n10 = this.gradP[gx + 1 + this.perm[gy]].dot2(x - 1, y);\n const n11 = this.gradP[gx + 1 + this.perm[gy + 1]].dot2(x - 1, y - 1);\n const u = this.fade(x);\n return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y));\n }\n}\n\n/* eslint-enable no-bitwise */\n// Component\n\ninterface WavePoint {\n x: number;\n y: number;\n wave: { x: number; y: number };\n cursor: { x: number; y: number; vx: number; vy: number };\n}\n\n/**\n * Wave-field background — a grid of lines drifting on perlin noise,\n * nudged by the pointer. Fills its nearest positioned ancestor; put it\n * behind hero copy or section content.\n *\n * Colours are theme-aware by default: a soft dark line on light surfaces,\n * a faint white line on dark — override with `[lineColor]`.\n *\n * @example\n * ```html\n * <section style=\"position: relative\">\n * <wr-waves />\n * <h1>Hero copy above the waves</h1>\n * </section>\n * ```\n *\n * @see https://ngwr.dev/bits/waves\n */\n/**\n * The most bitmap pixels the canvas is backed with. The field is redrawn every\n * frame, so the backing store is a per-frame cost: a 1280-wide hero keeps the\n * full 2x (about 2.3 MP), and a wider one steps down toward 1x instead of\n * growing to a 3456-pixel-wide bitmap on a large retina window.\n */\nconst MAX_CANVAS_PIXELS = 2_500_000;\n\n@Component({\n selector: 'wr-waves',\n template: '<canvas #canvas class=\"wr-waves__canvas\" aria-hidden=\"true\"></canvas>',\n styleUrl: './waves.scss',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-waves',\n '[style.background-color]': 'backgroundColor()',\n // Feeds the CSS stand-in grid (see waves.scss) so it matches the real\n // spacing, and switches it off the moment the canvas has painted.\n '[style.--wr-waves-x-gap.px]': 'xGap()',\n '[class.wr-waves--painted]': 'painted()',\n },\n})\nexport class WrWaves {\n /** Line stroke colour, any CSS colour. When unset, the theme decides. */\n readonly lineColor = input<string | null>(null);\n\n /** Background fill behind the lines. @default 'transparent' */\n readonly backgroundColor = input('transparent');\n\n /** Horizontal noise drift per ms. @default 0.0125 */\n readonly waveSpeedX = input(0.0125, { transform: numAttr(0.0125) });\n\n /** Vertical noise drift per ms. @default 0.005 */\n readonly waveSpeedY = input(0.005, { transform: numAttr(0.005) });\n\n /** Horizontal wave amplitude in px. @default 32 */\n readonly waveAmpX = input(32, { transform: numAttr(32) });\n\n /** Vertical wave amplitude in px. @default 16 */\n readonly waveAmpY = input(16, { transform: numAttr(16) });\n\n /** Horizontal gap between lines in px. @default 10 */\n readonly xGap = input(10, { transform: numAttr(10) });\n\n /** Vertical gap between points on a line in px. @default 32 */\n readonly yGap = input(32, { transform: numAttr(32) });\n\n /** Velocity damping of the cursor spring, 0..1. @default 0.925 */\n readonly friction = input(0.925, { transform: numAttr(0.925) });\n\n /** Pull-back strength of the cursor spring. @default 0.005 */\n readonly tension = input(0.005, { transform: numAttr(0.005) });\n\n /** Max px a point can be dragged from rest. @default 100 */\n readonly maxCursorMove = input(100, { transform: numAttr(100) });\n\n private readonly canvasRef = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly zone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platform = inject(WrPlatform);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private ctx: CanvasRenderingContext2D | null = null;\n private readonly noise = new Noise(Math.random());\n private lines: WavePoint[][] = [];\n /** The host's layout box, in CSS pixels before any transform: what the grid is laid out in. */\n private box = { width: 0, height: 0 };\n /** Bitmap pixels per CSS pixel the canvas is backed at; 0 until the first fit. */\n private ratio = 0;\n /** The time of the frame the loop last drew, or -1 while no loop has drawn. */\n private lastTime = -1;\n private readonly mouse = { x: -10, y: 0, lx: 0, ly: 0, sx: 0, sy: 0, v: 0, vs: 0, a: 0, set: false };\n private rafId = 0;\n\n /**\n * Flips once the canvas has drawn, which retires the CSS stand-in grid.\n *\n * A canvas cannot be prerendered, so on an SSR'd or prerendered page this\n * element is simply blank until the bundle has loaded and hydration has run —\n * measured at ~2.8s on ngwr.dev's own home page. The stylesheet paints a static\n * grid of the same colour and pitch in the meantime, straight from the\n * prerendered HTML, and this hands over to the real thing.\n */\n protected readonly painted = signal(false);\n\n /** Flips once `boot()` has a context and a grid — the motion half waits for it. */\n private readonly booted = signal(false);\n\n constructor() {\n if (!this.isBrowser) return;\n\n afterNextRender(() => this.zone.runOutsideAngular(() => this.boot()));\n\n // Re-seed the grid when geometry inputs change. The bitmap is left alone,\n // so the next frame draws over the old grid rather than over a blank canvas.\n effect(() => {\n this.xGap();\n this.yGap();\n if (!this.ctx) return;\n this.setLines();\n // And paint it, when there is no frame loop to. Under\n // `prefers-reduced-motion` the grid is drawn once and no frame follows,\n // so a later gap change rebuilt the grid and left it undrawn — with\n // `.wr-waves--painted` already on the host, so the element stayed\n // visible and empty.\n if (this.platform.prefersReducedMotion()) this.drawLines();\n });\n\n // The still grid keeps the line colour it was drawn with, so a scheme switch\n // under reduced motion re-resolves it and draws the grid again. The loop\n // needs no help: every frame it draws resolves the colour afresh.\n watchColorScheme(() => {\n if (this.booted() && this.platform.prefersReducedMotion()) this.drawLines();\n });\n\n // Motion or a still grid, decided live: a preference switched while the page\n // is open used to keep the field drifting until a reload, because `boot()`\n // read it once.\n effect(onCleanup => {\n if (!this.booted()) return;\n if (this.platform.prefersReducedMotion()) {\n // One static, undisturbed grid — no drift, no loop, no pointer\n // reactivity. Repainted when the line colour changes, since there is\n // no next frame to pick it up.\n this.lineColor();\n untracked(() => {\n this.setLines();\n this.drawLines();\n });\n return;\n }\n onCleanup(this.zone.runOutsideAngular(() => this.animate()));\n });\n }\n\n // Setup\n\n private boot(): void {\n const canvas = this.canvasRef().nativeElement;\n this.ctx = canvas.getContext('2d');\n if (!this.ctx) return;\n\n // `clientWidth` and not `getBoundingClientRect()`: the rect is the box after\n // transforms, and no observer hears of a transform, so a field booted inside\n // a dialog's scale-in kept a bitmap 96% of its box, stretched by CSS once\n // the animation ended. The observer's first entry follows with the exact,\n // sub-pixel size.\n const hostEl = this.host.nativeElement;\n this.fit(hostEl.clientWidth, hostEl.clientHeight);\n this.setLines();\n\n // The box is the observer's to follow, transforms excluded. A window resize\n // is for the pixel ratio, which browser zoom and a move to another screen\n // change with no box change at all.\n const onResize = (): void => this.resize(this.box.width, this.box.height);\n window.addEventListener('resize', onResize);\n const ro = new ResizeObserver(entries => {\n const rect = entries[entries.length - 1]?.contentRect;\n if (rect) this.resize(rect.width, rect.height);\n });\n ro.observe(hostEl);\n this.destroyRef.onDestroy(() => {\n window.removeEventListener('resize', onResize);\n ro.disconnect();\n });\n this.booted.set(true);\n }\n\n /** Start the drift and the pointer reactivity; returns what stops both. */\n private animate(): () => void {\n const onMouseMove = (e: MouseEvent): void => this.updateMouse(e.clientX, e.clientY);\n const onTouchMove = (e: TouchEvent): void => this.updateMouse(e.touches[0].clientX, e.touches[0].clientY);\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('touchmove', onTouchMove, { passive: true });\n\n const run = (): void => {\n if (this.rafId === 0) this.rafId = requestAnimationFrame(t => this.tick(t));\n };\n const halt = (): void => {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n };\n // Off screen the field stops asking for frames: it is decoration, and a\n // canvas redrawn out of sight still costs the browser a frame every frame.\n // Firefox on a wide retina window showed it: scrolled back up, the page\n // above the fold stayed blank for seconds until this loop and the pixel\n // budget below went in. Without an observer (jsdom) it simply runs.\n const io =\n typeof IntersectionObserver === 'undefined'\n ? null\n : new IntersectionObserver(entries => (entries[entries.length - 1].isIntersecting ? run() : halt()));\n if (io) io.observe(this.host.nativeElement);\n else run();\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('touchmove', onTouchMove);\n io?.disconnect();\n halt();\n // The still grid that follows is undisturbed: no drift to carry over.\n this.lastTime = -1;\n };\n }\n\n /** Fit the canvas to a new box or pixel ratio and, when that cleared it, repaint at once. */\n private resize(width: number, height: number): void {\n const moved = width !== this.box.width || height !== this.box.height;\n if (!this.fit(width, height)) return;\n if (moved) {\n this.setLines();\n // Re-seeded points sit at rest. A drifting field puts them where the last\n // frame had the drift, or the repaint below shows straight lines for a frame.\n if (this.lastTime >= 0) this.drift(this.lastTime);\n }\n // Observer entries arrive after the frame's own callbacks and before its\n // paint, and the fit cleared the bitmap, so a repaint left to the next frame\n // would leave this one blank: a resize drag flickered every frame.\n this.drawLines();\n }\n\n /**\n * Back the canvas for a `width` × `height` box, in CSS pixels, at the screen's\n * pixel ratio. Returns whether anything changed: writing `canvas.width` clears\n * the bitmap even to the value it already has, so an unchanged box is left alone.\n */\n private fit(width: number, height: number): boolean {\n // Backed at the screen's pixel ratio. A bitmap the size of the CSS box is\n // upscaled on a 2x screen, which smears every 1px line across two device\n // pixels and steps its curves. Capped at 2: the field repaints every frame,\n // and a 3x phone would push half as many pixels again for no visible gain.\n // Capped again by `MAX_CANVAS_PIXELS`, never below 1.\n const area = width * height;\n const budget = area > 0 ? Math.sqrt(MAX_CANVAS_PIXELS / area) : 2;\n const ratio = Math.max(1, Math.min(window.devicePixelRatio || 1, 2, budget));\n if (width === this.box.width && height === this.box.height && ratio === this.ratio) return false;\n\n this.box = { width, height };\n this.ratio = ratio;\n const canvas = this.canvasRef().nativeElement;\n canvas.width = Math.round(width * ratio);\n canvas.height = Math.round(height * ratio);\n // Resizing the bitmap resets the context, transform included, so the scale\n // goes on afterwards. Every coordinate below stays in CSS pixels.\n this.ctx?.setTransform(ratio, 0, 0, ratio, 0, 0);\n return true;\n }\n\n private setLines(): void {\n const { width, height } = this.box;\n this.lines = [];\n const oWidth = width + 200;\n const oHeight = height + 30;\n const xGap = this.xGap();\n const yGap = this.yGap();\n const totalLines = Math.ceil(oWidth / xGap);\n const totalPoints = Math.ceil(oHeight / yGap);\n const xStart = (width - xGap * totalLines) / 2;\n const yStart = (height - yGap * totalPoints) / 2;\n for (let i = 0; i <= totalLines; i++) {\n const pts: WavePoint[] = [];\n for (let j = 0; j <= totalPoints; j++) {\n pts.push({\n x: xStart + xGap * i,\n y: yStart + yGap * j,\n wave: { x: 0, y: 0 },\n cursor: { x: 0, y: 0, vx: 0, vy: 0 },\n });\n }\n this.lines.push(pts);\n }\n }\n\n // Frame loop\n\n private tick(time: number): void {\n const mouse = this.mouse;\n mouse.sx += (mouse.x - mouse.sx) * 0.1;\n mouse.sy += (mouse.y - mouse.sy) * 0.1;\n const dx = mouse.x - mouse.lx;\n const dy = mouse.y - mouse.ly;\n const d = Math.hypot(dx, dy);\n mouse.v = d;\n mouse.vs += (d - mouse.vs) * 0.1;\n mouse.vs = Math.min(100, mouse.vs);\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.a = Math.atan2(dy, dx);\n\n this.lastTime = time;\n this.movePoints(time);\n this.drawLines();\n this.rafId = requestAnimationFrame(t => this.tick(t));\n }\n\n /** Put every point where the noise drifts it at `time`. */\n private drift(time: number): void {\n const waveSpeedX = this.waveSpeedX();\n const waveSpeedY = this.waveSpeedY();\n const waveAmpX = this.waveAmpX();\n const waveAmpY = this.waveAmpY();\n\n for (const pts of this.lines) {\n for (const p of pts) {\n const move = this.noise.perlin2((p.x + time * waveSpeedX) * 0.002, (p.y + time * waveSpeedY) * 0.0015) * 12;\n p.wave.x = Math.cos(move) * waveAmpX;\n p.wave.y = Math.sin(move) * waveAmpY;\n }\n }\n }\n\n private movePoints(time: number): void {\n this.drift(time);\n\n const mouse = this.mouse;\n const friction = this.friction();\n const tension = this.tension();\n const maxCursorMove = this.maxCursorMove();\n\n for (const pts of this.lines) {\n for (const p of pts) {\n const dx = p.x - mouse.sx;\n const dy = p.y - mouse.sy;\n const dist = Math.hypot(dx, dy);\n const l = Math.max(175, mouse.vs);\n if (dist < l) {\n const s = 1 - dist / l;\n const f = Math.cos(dist * 0.001) * s;\n p.cursor.vx += Math.cos(mouse.a) * f * l * mouse.vs * 0.00065;\n p.cursor.vy += Math.sin(mouse.a) * f * l * mouse.vs * 0.00065;\n }\n\n p.cursor.vx += (0 - p.cursor.x) * tension;\n p.cursor.vy += (0 - p.cursor.y) * tension;\n p.cursor.vx *= friction;\n p.cursor.vy *= friction;\n p.cursor.x += p.cursor.vx * 2;\n p.cursor.y += p.cursor.vy * 2;\n p.cursor.x = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.x));\n p.cursor.y = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.y));\n }\n }\n }\n\n private moved(point: WavePoint, withCursor: boolean): { x: number; y: number } {\n const x = point.x + point.wave.x + (withCursor ? point.cursor.x : 0);\n const y = point.y + point.wave.y + (withCursor ? point.cursor.y : 0);\n return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 };\n }\n\n private drawLines(): void {\n const ctx = this.ctx;\n if (!ctx) return;\n // Retire the CSS stand-in: from here the canvas has real pixels. Set inside\n // the draw rather than at the end of `boot()` so it can never switch the\n // fallback off before something has actually been painted. Runs outside\n // Angular (the rAF loop does), so `signal.set` schedules the one host-binding\n // update it needs; every later call is a no-op on an unchanged value.\n if (!this.painted()) this.painted.set(true);\n const { width, height } = this.box;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n ctx.strokeStyle = this.resolveLineColor();\n for (const points of this.lines) {\n // Both ends stay where the grid put them, as they did when each line was\n // a polyline; only the interior follows the pointer.\n const last = points.length - 1;\n const path = points.map((p, idx) => this.moved(p, idx > 0 && idx < last));\n // A curve through the MIDPOINTS, with each grid point as its control.\n // Joining the points themselves with `lineTo` put a corner at every one,\n // and at the default 32px pitch they read as a jagged line. Consecutive\n // curves share a tangent at the midpoint between them, so the line bends\n // without a kink anywhere and still passes near every point.\n ctx.moveTo(path[0].x, path[0].y);\n for (let i = 1; i < last; i++) {\n const p = path[i];\n const next = path[i + 1];\n ctx.quadraticCurveTo(p.x, p.y, (p.x + next.x) / 2, (p.y + next.y) / 2);\n }\n ctx.lineTo(path[last].x, path[last].y);\n }\n ctx.stroke();\n }\n\n /**\n * Explicit input wins; otherwise the theme's `--wr-waves-line-color`. Either\n * is resolved through the cascade before it reaches `strokeStyle`, which\n * reads neither a custom property nor the `light-dark()` the hook holds.\n * Called on every draw, so a colour-scheme change lands on the next frame.\n */\n private resolveLineColor(): string {\n const expression = this.lineColor() ?? 'var(--wr-waves-line-color)';\n return resolveCssColor(this.canvasRef().nativeElement, expression, 'rgba(15, 23, 42, 0.12)');\n }\n\n private updateMouse(x: number, y: number): void {\n // Re-read the box each move — cheaper than tracking scroll, and the\n // host is usually a hero that rarely reflows mid-gesture. The rect is the\n // box as drawn, after any transform on the host or an ancestor, and the\n // grid is laid out in the box before them, so the pointer is scaled back.\n const rect = this.host.nativeElement.getBoundingClientRect();\n const mouse = this.mouse;\n mouse.x = (x - rect.left) * (rect.width > 0 ? this.box.width / rect.width : 1);\n mouse.y = (y - rect.top) * (rect.height > 0 ? this.box.height / rect.height : 1);\n if (!mouse.set) {\n mouse.sx = mouse.x;\n mouse.sy = mouse.y;\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.set = true;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-bits-waves.mjs","names":[],"sources":["../../../projects/lib/bits/waves/waves.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 * Angular adaptation of the Waves background by David Haz / reactbits.dev.\n * Original: https://www.reactbits.dev/backgrounds/waves\n *\n * A grid of vertical lines drawn on a 2D canvas. Each point drifts on\n * perlin noise and is pushed around by the pointer with a spring\n * (tension + friction) pulling it back to rest. Each line is drawn as\n * quadratic curves through the points' midpoints, not as straight segments.\n */\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n NgZone,\n PLATFORM_ID,\n ViewEncapsulation,\n afterNextRender,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\nimport { numAttr, resolveCssColor, watchColorScheme } from 'ngwr/utils';\n\n// Perlin noise (Stefan Gustavson's reference permutation)\n/* eslint-disable no-bitwise -- permutation-table hashing is inherently bitwise */\n\nclass Grad {\n constructor(\n private readonly x: number,\n private readonly y: number\n ) {}\n\n dot2(x: number, y: number): number {\n return this.x * x + this.y * y;\n }\n}\n\nconst GRAD3: readonly Grad[] = [\n new Grad(1, 1),\n new Grad(-1, 1),\n new Grad(1, -1),\n new Grad(-1, -1),\n new Grad(1, 0),\n new Grad(-1, 0),\n new Grad(1, 0),\n new Grad(-1, 0),\n new Grad(0, 1),\n new Grad(0, -1),\n new Grad(0, 1),\n new Grad(0, -1),\n];\n\n// prettier-ignore\nconst P: readonly number[] = [\n 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240,\n 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88,\n 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83,\n 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216,\n 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186,\n 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,\n 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9,\n 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193,\n 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157,\n 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128,\n 195, 78, 66, 215, 61, 156, 180,\n];\n\nclass Noise {\n private readonly perm = new Array<number>(512);\n private readonly gradP = new Array<Grad>(512);\n\n constructor(seed: number) {\n if (seed > 0 && seed < 1) seed *= 65536;\n seed = Math.floor(seed);\n if (seed < 256) seed |= seed << 8;\n for (let i = 0; i < 256; i++) {\n const v = i & 1 ? P[i] ^ (seed & 255) : P[i] ^ ((seed >> 8) & 255);\n this.perm[i] = this.perm[i + 256] = v;\n this.gradP[i] = this.gradP[i + 256] = GRAD3[v % 12];\n }\n }\n\n private fade(t: number): number {\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n\n private lerp(a: number, b: number, t: number): number {\n return (1 - t) * a + t * b;\n }\n\n perlin2(x: number, y: number): number {\n let gx = Math.floor(x);\n let gy = Math.floor(y);\n x -= gx;\n y -= gy;\n gx &= 255;\n gy &= 255;\n const n00 = this.gradP[gx + this.perm[gy]].dot2(x, y);\n const n01 = this.gradP[gx + this.perm[gy + 1]].dot2(x, y - 1);\n const n10 = this.gradP[gx + 1 + this.perm[gy]].dot2(x - 1, y);\n const n11 = this.gradP[gx + 1 + this.perm[gy + 1]].dot2(x - 1, y - 1);\n const u = this.fade(x);\n return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y));\n }\n}\n\n/* eslint-enable no-bitwise */\n// Component\n\ninterface WavePoint {\n x: number;\n y: number;\n wave: { x: number; y: number };\n cursor: { x: number; y: number; vx: number; vy: number };\n}\n\n/**\n * Wave-field background — a grid of lines drifting on perlin noise,\n * nudged by the pointer. Fills its nearest positioned ancestor; put it\n * behind hero copy or section content.\n *\n * Colours are theme-aware by default: a soft dark line on light surfaces,\n * a faint white line on dark — override with `[lineColor]`.\n *\n * @example\n * ```html\n * <section style=\"position: relative\">\n * <wr-waves />\n * <h1>Hero copy above the waves</h1>\n * </section>\n * ```\n *\n * @see https://ngwr.dev/bits/waves\n */\n/**\n * The most bitmap pixels the canvas is backed with. The field is redrawn every\n * frame, so the backing store is a per-frame cost: a 1280-wide hero keeps the\n * full 2x (about 2.3 MP), and a wider one steps down toward 1x instead of\n * growing to a 3456-pixel-wide bitmap on a large retina window.\n */\nconst MAX_CANVAS_PIXELS = 2_500_000;\n\n@Component({\n selector: 'wr-waves',\n template: '<canvas #canvas class=\"wr-waves__canvas\" aria-hidden=\"true\"></canvas>',\n styleUrl: './waves.scss',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-waves',\n '[style.background-color]': 'backgroundColor()',\n // Feeds the CSS stand-in grid (see waves.scss) so it matches the real\n // spacing, and switches it off the moment the canvas has painted.\n '[style.--wr-waves-x-gap.px]': 'xGap()',\n '[class.wr-waves--painted]': 'painted()',\n },\n})\nexport class WrWaves {\n /** Line stroke colour, any CSS colour. When unset, empty or blank, `--wr-waves-line-color` decides. */\n readonly lineColor = input<string | null>(null);\n\n /** Background fill behind the lines. @default 'transparent' */\n readonly backgroundColor = input('transparent');\n\n /** Horizontal noise drift per ms. @default 0.0125 */\n readonly waveSpeedX = input(0.0125, { transform: numAttr(0.0125) });\n\n /** Vertical noise drift per ms. @default 0.005 */\n readonly waveSpeedY = input(0.005, { transform: numAttr(0.005) });\n\n /** Horizontal wave amplitude in px. @default 32 */\n readonly waveAmpX = input(32, { transform: numAttr(32) });\n\n /** Vertical wave amplitude in px. @default 16 */\n readonly waveAmpY = input(16, { transform: numAttr(16) });\n\n /** Horizontal gap between lines in px. @default 10 */\n readonly xGap = input(10, { transform: numAttr(10) });\n\n /** Vertical gap between points on a line in px. @default 32 */\n readonly yGap = input(32, { transform: numAttr(32) });\n\n /** Velocity damping of the cursor spring, 0..1. @default 0.925 */\n readonly friction = input(0.925, { transform: numAttr(0.925) });\n\n /** Pull-back strength of the cursor spring. @default 0.005 */\n readonly tension = input(0.005, { transform: numAttr(0.005) });\n\n /** Max px a point can be dragged from rest. @default 100 */\n readonly maxCursorMove = input(100, { transform: numAttr(100) });\n\n private readonly canvasRef = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly zone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platform = inject(WrPlatform);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private ctx: CanvasRenderingContext2D | null = null;\n private readonly noise = new Noise(Math.random());\n private lines: WavePoint[][] = [];\n /** The host's layout box, in CSS pixels before any transform: what the grid is laid out in. */\n private box = { width: 0, height: 0 };\n /** Bitmap pixels per CSS pixel the canvas is backed at; 0 until the first fit. */\n private ratio = 0;\n private readonly mouse = { x: -10, y: 0, lx: 0, ly: 0, sx: 0, sy: 0, v: 0, vs: 0, a: 0, set: false };\n private rafId = 0;\n\n /**\n * Flips once the canvas has drawn, which retires the CSS stand-in grid.\n *\n * A canvas cannot be prerendered, so on an SSR'd or prerendered page this\n * element is simply blank until the bundle has loaded and hydration has run —\n * measured at ~2.8s on ngwr.dev's own home page. The stylesheet paints a static\n * grid of the same colour and pitch in the meantime, straight from the\n * prerendered HTML, and this hands over to the real thing.\n */\n protected readonly painted = signal(false);\n\n /** Flips once `boot()` has a context and a grid — the motion half waits for it. */\n private readonly booted = signal(false);\n\n /**\n * Whether the box has an area. The intersection observer calls a zero-area host\n * intersecting and sends no entry when it gains a size, so this reads the box instead.\n */\n private readonly hasBox = signal(false);\n\n constructor() {\n if (!this.isBrowser) return;\n\n afterNextRender(() => this.zone.runOutsideAngular(() => this.boot()));\n\n // Re-seed the grid when geometry inputs change. The bitmap is left alone,\n // so the next frame draws over the old grid rather than over a blank canvas.\n effect(() => {\n this.xGap();\n this.yGap();\n if (!this.ctx) return;\n this.setLines();\n // And paint it, when there is no frame loop to. Under\n // `prefers-reduced-motion` the grid is drawn once and no frame follows,\n // so a later gap change rebuilt the grid and left it undrawn — with\n // `.wr-waves--painted` already on the host, so the element stayed\n // visible and empty.\n if (this.platform.prefersReducedMotion()) this.drawLines();\n });\n\n // The still grid keeps the line colour it was drawn with, so a scheme switch\n // under reduced motion re-resolves it and draws the grid again. The loop\n // needs no help: every frame it draws resolves the colour afresh.\n watchColorScheme(() => {\n if (this.booted() && this.platform.prefersReducedMotion()) this.drawLines();\n });\n\n // Motion or a still grid, decided live: a preference switched while the page\n // is open used to keep the field drifting until a reload, because `boot()`\n // read it once.\n effect(onCleanup => {\n if (!this.booted()) return;\n if (this.platform.prefersReducedMotion()) {\n // One static, undisturbed grid — no drift, no loop, no pointer\n // reactivity. Repainted when the line colour changes, since there is\n // no next frame to pick it up.\n this.lineColor();\n untracked(() => {\n this.setLines();\n this.drawLines();\n });\n return;\n }\n if (!this.hasBox()) return;\n onCleanup(this.zone.runOutsideAngular(() => this.animate()));\n });\n }\n\n // Setup\n\n private boot(): void {\n const canvas = this.canvasRef().nativeElement;\n this.ctx = canvas.getContext('2d');\n if (!this.ctx) return;\n\n // `clientWidth` and not `getBoundingClientRect()`: the rect is the box after\n // transforms, and no observer hears of a transform, so a field booted inside\n // a dialog's scale-in kept a bitmap 96% of its box, stretched by CSS once\n // the animation ended. The observer's first entry follows with the exact,\n // sub-pixel size.\n const hostEl = this.host.nativeElement;\n this.fit(hostEl.clientWidth, hostEl.clientHeight);\n this.setLines();\n\n // The box is the observer's to follow, transforms excluded. A window resize\n // is for the pixel ratio, which browser zoom and a move to another screen\n // change with no box change at all.\n const onResize = (): void => this.resize(this.box.width, this.box.height);\n window.addEventListener('resize', onResize);\n const ro = new ResizeObserver(entries => {\n const rect = entries[entries.length - 1]?.contentRect;\n if (rect) this.resize(rect.width, rect.height);\n });\n ro.observe(hostEl);\n this.destroyRef.onDestroy(() => {\n window.removeEventListener('resize', onResize);\n ro.disconnect();\n });\n this.booted.set(true);\n }\n\n /** Start the drift and the pointer reactivity; returns what stops both. */\n private animate(): () => void {\n const onMouseMove = (e: MouseEvent): void => this.updateMouse(e.clientX, e.clientY);\n const onTouchMove = (e: TouchEvent): void => this.updateMouse(e.touches[0].clientX, e.touches[0].clientY);\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('touchmove', onTouchMove, { passive: true });\n\n const run = (): void => {\n if (this.rafId === 0) this.rafId = requestAnimationFrame(t => this.tick(t));\n };\n const halt = (): void => {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n };\n // Off screen the field stops asking for frames: it is decoration, and a\n // canvas redrawn out of sight still costs the browser a frame every frame.\n // Firefox on a wide retina window showed it: scrolled back up, the page\n // above the fold stayed blank for seconds until this loop and the pixel\n // budget below went in. Without an observer (jsdom) it simply runs. A box\n // flush against a zero-height clip intersects with nothing showing, and only a\n // second threshold reports the clip moving. It sits below any real ratio, or a\n // clip closing on a transition steps from under it to 0 without crossing anything.\n const io =\n typeof IntersectionObserver === 'undefined'\n ? null\n : new IntersectionObserver(\n entries => {\n const { isIntersecting, intersectionRatio } = entries[entries.length - 1];\n if (isIntersecting && intersectionRatio > 0) run();\n else halt();\n },\n { threshold: [0, 1e-9] }\n );\n if (io) io.observe(this.host.nativeElement);\n else run();\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('touchmove', onTouchMove);\n io?.disconnect();\n halt();\n };\n }\n\n /** Fit the canvas to a new box or pixel ratio and, when that cleared it, repaint at once. */\n private resize(width: number, height: number): void {\n const moved = width !== this.box.width || height !== this.box.height;\n if (!this.fit(width, height)) return;\n if (moved) {\n this.setLines();\n // Re-seeded points sit at rest. A drifting field puts them where the next\n // frame will, or the repaint below shows straight lines until it comes.\n if (!this.platform.prefersReducedMotion()) this.drift(performance.now());\n }\n // Observer entries arrive after the frame's own callbacks and before its\n // paint, and the fit cleared the bitmap, so a repaint left to the next frame\n // would leave this one blank: a resize drag flickered every frame.\n this.drawLines();\n }\n\n /**\n * Back the canvas for a `width` × `height` box, in CSS pixels, at the screen's\n * pixel ratio. Returns whether anything changed: writing `canvas.width` clears\n * the bitmap even to the value it already has, so an unchanged box is left alone.\n */\n private fit(width: number, height: number): boolean {\n // Backed at the screen's pixel ratio. A bitmap the size of the CSS box is\n // upscaled on a 2x screen, which smears every 1px line across two device\n // pixels and steps its curves. Capped at 2: the field repaints every frame,\n // and a 3x phone would push half as many pixels again for no visible gain.\n // Capped again by `MAX_CANVAS_PIXELS`, never below 1.\n const area = width * height;\n const budget = area > 0 ? Math.sqrt(MAX_CANVAS_PIXELS / area) : 2;\n const ratio = Math.max(1, Math.min(window.devicePixelRatio || 1, 2, budget));\n if (width === this.box.width && height === this.box.height && ratio === this.ratio) return false;\n\n this.box = { width, height };\n this.ratio = ratio;\n this.hasBox.set(width > 0 && height > 0);\n const canvas = this.canvasRef().nativeElement;\n canvas.width = Math.round(width * ratio);\n canvas.height = Math.round(height * ratio);\n // Resizing the bitmap resets the context, transform included, so the scale\n // goes on afterwards. Every coordinate below stays in CSS pixels.\n this.ctx?.setTransform(ratio, 0, 0, ratio, 0, 0);\n return true;\n }\n\n private setLines(): void {\n const { width, height } = this.box;\n this.lines = [];\n const oWidth = width + 200;\n const oHeight = height + 30;\n const xGap = this.xGap();\n const yGap = this.yGap();\n const totalLines = Math.ceil(oWidth / xGap);\n const totalPoints = Math.ceil(oHeight / yGap);\n const xStart = (width - xGap * totalLines) / 2;\n const yStart = (height - yGap * totalPoints) / 2;\n for (let i = 0; i <= totalLines; i++) {\n const pts: WavePoint[] = [];\n for (let j = 0; j <= totalPoints; j++) {\n pts.push({\n x: xStart + xGap * i,\n y: yStart + yGap * j,\n wave: { x: 0, y: 0 },\n cursor: { x: 0, y: 0, vx: 0, vy: 0 },\n });\n }\n this.lines.push(pts);\n }\n }\n\n // Frame loop\n\n private tick(time: number): void {\n const mouse = this.mouse;\n mouse.sx += (mouse.x - mouse.sx) * 0.1;\n mouse.sy += (mouse.y - mouse.sy) * 0.1;\n const dx = mouse.x - mouse.lx;\n const dy = mouse.y - mouse.ly;\n const d = Math.hypot(dx, dy);\n mouse.v = d;\n mouse.vs += (d - mouse.vs) * 0.1;\n mouse.vs = Math.min(100, mouse.vs);\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.a = Math.atan2(dy, dx);\n\n this.movePoints(time);\n this.drawLines();\n this.rafId = requestAnimationFrame(t => this.tick(t));\n }\n\n /** Put every point where the noise drifts it at `time`. */\n private drift(time: number): void {\n const waveSpeedX = this.waveSpeedX();\n const waveSpeedY = this.waveSpeedY();\n const waveAmpX = this.waveAmpX();\n const waveAmpY = this.waveAmpY();\n\n for (const pts of this.lines) {\n for (const p of pts) {\n const move = this.noise.perlin2((p.x + time * waveSpeedX) * 0.002, (p.y + time * waveSpeedY) * 0.0015) * 12;\n p.wave.x = Math.cos(move) * waveAmpX;\n p.wave.y = Math.sin(move) * waveAmpY;\n }\n }\n }\n\n private movePoints(time: number): void {\n this.drift(time);\n\n const mouse = this.mouse;\n const friction = this.friction();\n const tension = this.tension();\n const maxCursorMove = this.maxCursorMove();\n\n for (const pts of this.lines) {\n for (const p of pts) {\n const dx = p.x - mouse.sx;\n const dy = p.y - mouse.sy;\n const dist = Math.hypot(dx, dy);\n const l = Math.max(175, mouse.vs);\n if (dist < l) {\n const s = 1 - dist / l;\n const f = Math.cos(dist * 0.001) * s;\n p.cursor.vx += Math.cos(mouse.a) * f * l * mouse.vs * 0.00065;\n p.cursor.vy += Math.sin(mouse.a) * f * l * mouse.vs * 0.00065;\n }\n\n p.cursor.vx += (0 - p.cursor.x) * tension;\n p.cursor.vy += (0 - p.cursor.y) * tension;\n p.cursor.vx *= friction;\n p.cursor.vy *= friction;\n p.cursor.x += p.cursor.vx * 2;\n p.cursor.y += p.cursor.vy * 2;\n p.cursor.x = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.x));\n p.cursor.y = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.y));\n }\n }\n }\n\n private moved(point: WavePoint, withCursor: boolean): { x: number; y: number } {\n const x = point.x + point.wave.x + (withCursor ? point.cursor.x : 0);\n const y = point.y + point.wave.y + (withCursor ? point.cursor.y : 0);\n return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 };\n }\n\n private drawLines(): void {\n const ctx = this.ctx;\n if (!ctx) return;\n // Retire the CSS stand-in: from here the canvas has real pixels. Set inside\n // the draw rather than at the end of `boot()` so it can never switch the\n // fallback off before something has actually been painted. Runs outside\n // Angular (the rAF loop does), so `signal.set` schedules the one host-binding\n // update it needs; every later call is a no-op on an unchanged value.\n if (!this.painted()) this.painted.set(true);\n const { width, height } = this.box;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n ctx.strokeStyle = this.resolveLineColor();\n for (const points of this.lines) {\n // Both ends stay where the grid put them, as they did when each line was\n // a polyline; only the interior follows the pointer.\n const last = points.length - 1;\n const path = points.map((p, idx) => this.moved(p, idx > 0 && idx < last));\n // A curve through the MIDPOINTS, with each grid point as its control.\n // Joining the points themselves with `lineTo` put a corner at every one,\n // and at the default 32px pitch they read as a jagged line. Consecutive\n // curves share a tangent at the midpoint between them, so the line bends\n // without a kink anywhere and still passes near every point.\n ctx.moveTo(path[0].x, path[0].y);\n for (let i = 1; i < last; i++) {\n const p = path[i];\n const next = path[i + 1];\n ctx.quadraticCurveTo(p.x, p.y, (p.x + next.x) / 2, (p.y + next.y) / 2);\n }\n ctx.lineTo(path[last].x, path[last].y);\n }\n ctx.stroke();\n }\n\n /**\n * Explicit input wins; otherwise the theme's `--wr-waves-line-color`. Either\n * is resolved through the cascade before it reaches `strokeStyle`, which\n * reads neither a custom property nor the `light-dark()` the hook holds.\n * Called on every draw, so a colour-scheme change lands on the next frame.\n */\n private resolveLineColor(): string {\n const expression = (this.lineColor() ?? '').trim() || 'var(--wr-waves-line-color)';\n return resolveCssColor(this.canvasRef().nativeElement, expression, 'rgba(15, 23, 42, 0.12)');\n }\n\n private updateMouse(x: number, y: number): void {\n // Re-read the box each move — cheaper than tracking scroll, and the\n // host is usually a hero that rarely reflows mid-gesture. The rect is the\n // box as drawn, after any transform on the host or an ancestor, and the\n // grid is laid out in the box before them, so the pointer is scaled back.\n const rect = this.host.nativeElement.getBoundingClientRect();\n const mouse = this.mouse;\n mouse.x = (x - rect.left) * (rect.width > 0 ? this.box.width / rect.width : 1);\n mouse.y = (y - rect.top) * (rect.height > 0 ? this.box.height / rect.height : 1);\n if (!mouse.set) {\n mouse.sx = mouse.x;\n mouse.sy = mouse.y;\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.set = true;\n }\n }\n}\n"],"mappings":"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"}
@@ -20,7 +20,7 @@ var WrBreadcrumbs = class WrBreadcrumbs {
20
20
  separatorValue = computed(() => `"${cssString(this.separator())}"`, ...ngDevMode ? [{ debugName: "separatorValue" }] : /* istanbul ignore next */ []);
21
21
  static ɵfac = i0.ɵɵngDeclareFactory({
22
22
  minVersion: "12.0.0",
23
- version: "22.2.3",
23
+ version: "22.2.4",
24
24
  ngImport: i0,
25
25
  type: WrBreadcrumbs,
26
26
  deps: [],
@@ -28,7 +28,7 @@ var WrBreadcrumbs = class WrBreadcrumbs {
28
28
  });
29
29
  static ɵcmp = i0.ɵɵngDeclareComponent({
30
30
  minVersion: "17.1.0",
31
- version: "22.2.3",
31
+ version: "22.2.4",
32
32
  type: WrBreadcrumbs,
33
33
  isStandalone: true,
34
34
  selector: "wr-breadcrumbs",
@@ -60,7 +60,7 @@ var WrBreadcrumbs = class WrBreadcrumbs {
60
60
  };
61
61
  i0.ɵɵngDeclareClassMetadata({
62
62
  minVersion: "12.0.0",
63
- version: "22.2.3",
63
+ version: "22.2.4",
64
64
  ngImport: i0,
65
65
  type: WrBreadcrumbs,
66
66
  decorators: [{
@@ -111,7 +111,7 @@ var WrBreadcrumbsItem = class WrBreadcrumbsItem {
111
111
  rootClass = computed(() => this.isLink() ? "wr-breadcrumbs__link" : "wr-breadcrumbs__current", ...ngDevMode ? [{ debugName: "rootClass" }] : /* istanbul ignore next */ []);
112
112
  static ɵfac = i0.ɵɵngDeclareFactory({
113
113
  minVersion: "12.0.0",
114
- version: "22.2.3",
114
+ version: "22.2.4",
115
115
  ngImport: i0,
116
116
  type: WrBreadcrumbsItem,
117
117
  deps: [],
@@ -119,7 +119,7 @@ var WrBreadcrumbsItem = class WrBreadcrumbsItem {
119
119
  });
120
120
  static ɵcmp = i0.ɵɵngDeclareComponent({
121
121
  minVersion: "17.0.0",
122
- version: "22.2.3",
122
+ version: "22.2.4",
123
123
  type: WrBreadcrumbsItem,
124
124
  isStandalone: true,
125
125
  selector: "wr-breadcrumbs-item",
@@ -201,7 +201,7 @@ var WrBreadcrumbsItem = class WrBreadcrumbsItem {
201
201
  };
202
202
  i0.ɵɵngDeclareClassMetadata({
203
203
  minVersion: "12.0.0",
204
- version: "22.2.3",
204
+ version: "22.2.4",
205
205
  ngImport: i0,
206
206
  type: WrBreadcrumbsItem,
207
207
  decorators: [{
@@ -26,7 +26,7 @@ var WrBurger = class WrBurger {
26
26
  }
27
27
  static ɵfac = i0.ɵɵngDeclareFactory({
28
28
  minVersion: "12.0.0",
29
- version: "22.2.3",
29
+ version: "22.2.4",
30
30
  ngImport: i0,
31
31
  type: WrBurger,
32
32
  deps: [],
@@ -34,7 +34,7 @@ var WrBurger = class WrBurger {
34
34
  });
35
35
  static ɵcmp = i0.ɵɵngDeclareComponent({
36
36
  minVersion: "17.1.0",
37
- version: "22.2.3",
37
+ version: "22.2.4",
38
38
  type: WrBurger,
39
39
  isStandalone: true,
40
40
  selector: "wr-burger",
@@ -70,7 +70,7 @@ var WrBurger = class WrBurger {
70
70
  };
71
71
  i0.ɵɵngDeclareClassMetadata({
72
72
  minVersion: "12.0.0",
73
- version: "22.2.3",
73
+ version: "22.2.4",
74
74
  ngImport: i0,
75
75
  type: WrBurger,
76
76
  decorators: [{
@@ -115,7 +115,7 @@ var WrButton = class WrButton {
115
115
  }, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
116
116
  static ɵfac = i0.ɵɵngDeclareFactory({
117
117
  minVersion: "12.0.0",
118
- version: "22.2.3",
118
+ version: "22.2.4",
119
119
  ngImport: i0,
120
120
  type: WrButton,
121
121
  deps: [],
@@ -123,7 +123,7 @@ var WrButton = class WrButton {
123
123
  });
124
124
  static ɵcmp = i0.ɵɵngDeclareComponent({
125
125
  minVersion: "17.0.0",
126
- version: "22.2.3",
126
+ version: "22.2.4",
127
127
  type: WrButton,
128
128
  isStandalone: true,
129
129
  selector: "wr-btn, button[wr-btn], a[wr-btn]",
@@ -232,7 +232,7 @@ var WrButton = class WrButton {
232
232
  };
233
233
  i0.ɵɵngDeclareClassMetadata({
234
234
  minVersion: "12.0.0",
235
- version: "22.2.3",
235
+ version: "22.2.4",
236
236
  ngImport: i0,
237
237
  type: WrButton,
238
238
  decorators: [{
@@ -355,7 +355,7 @@ var WrButtonGroup = class WrButtonGroup {
355
355
  }, ...ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []);
356
356
  static ɵfac = i0.ɵɵngDeclareFactory({
357
357
  minVersion: "12.0.0",
358
- version: "22.2.3",
358
+ version: "22.2.4",
359
359
  ngImport: i0,
360
360
  type: WrButtonGroup,
361
361
  deps: [],
@@ -363,7 +363,7 @@ var WrButtonGroup = class WrButtonGroup {
363
363
  });
364
364
  static ɵcmp = i0.ɵɵngDeclareComponent({
365
365
  minVersion: "17.1.0",
366
- version: "22.2.3",
366
+ version: "22.2.4",
367
367
  type: WrButtonGroup,
368
368
  isStandalone: true,
369
369
  selector: "wr-btn-group",
@@ -390,7 +390,7 @@ var WrButtonGroup = class WrButtonGroup {
390
390
  };
391
391
  i0.ɵɵngDeclareClassMetadata({
392
392
  minVersion: "12.0.0",
393
- version: "22.2.3",
393
+ version: "22.2.4",
394
394
  ngImport: i0,
395
395
  type: WrButtonGroup,
396
396
  decorators: [{
@@ -454,7 +454,7 @@ var WrCalendar = class WrCalendar {
454
454
  }
455
455
  static ɵfac = i0.ɵɵngDeclareFactory({
456
456
  minVersion: "12.0.0",
457
- version: "22.2.3",
457
+ version: "22.2.4",
458
458
  ngImport: i0,
459
459
  type: WrCalendar,
460
460
  deps: [],
@@ -462,7 +462,7 @@ var WrCalendar = class WrCalendar {
462
462
  });
463
463
  static ɵcmp = i0.ɵɵngDeclareComponent({
464
464
  minVersion: "17.0.0",
465
- version: "22.2.3",
465
+ version: "22.2.4",
466
466
  type: WrCalendar,
467
467
  isStandalone: true,
468
468
  selector: "wr-calendar",
@@ -539,7 +539,7 @@ var WrCalendar = class WrCalendar {
539
539
  };
540
540
  i0.ɵɵngDeclareClassMetadata({
541
541
  minVersion: "12.0.0",
542
- version: "22.2.3",
542
+ version: "22.2.4",
543
543
  ngImport: i0,
544
544
  type: WrCalendar,
545
545
  decorators: [{
@@ -34,7 +34,7 @@ var WrCard = class WrCard {
34
34
  }, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
35
35
  static ɵfac = i0.ɵɵngDeclareFactory({
36
36
  minVersion: "12.0.0",
37
- version: "22.2.3",
37
+ version: "22.2.4",
38
38
  ngImport: i0,
39
39
  type: WrCard,
40
40
  deps: [],
@@ -42,7 +42,7 @@ var WrCard = class WrCard {
42
42
  });
43
43
  static ɵcmp = i0.ɵɵngDeclareComponent({
44
44
  minVersion: "17.0.0",
45
- version: "22.2.3",
45
+ version: "22.2.4",
46
46
  type: WrCard,
47
47
  isStandalone: true,
48
48
  selector: "wr-card",
@@ -88,7 +88,7 @@ var WrCard = class WrCard {
88
88
  };
89
89
  i0.ɵɵngDeclareClassMetadata({
90
90
  minVersion: "12.0.0",
91
- version: "22.2.3",
91
+ version: "22.2.4",
92
92
  ngImport: i0,
93
93
  type: WrCard,
94
94
  decorators: [{
@@ -142,7 +142,7 @@ i0.ɵɵngDeclareClassMetadata({
142
142
  var WrCardHeader = class WrCardHeader {
143
143
  static ɵfac = i0.ɵɵngDeclareFactory({
144
144
  minVersion: "12.0.0",
145
- version: "22.2.3",
145
+ version: "22.2.4",
146
146
  ngImport: i0,
147
147
  type: WrCardHeader,
148
148
  deps: [],
@@ -150,7 +150,7 @@ var WrCardHeader = class WrCardHeader {
150
150
  });
151
151
  static ɵcmp = i0.ɵɵngDeclareComponent({
152
152
  minVersion: "14.0.0",
153
- version: "22.2.3",
153
+ version: "22.2.4",
154
154
  type: WrCardHeader,
155
155
  isStandalone: true,
156
156
  selector: "wr-card-header",
@@ -163,7 +163,7 @@ var WrCardHeader = class WrCardHeader {
163
163
  };
164
164
  i0.ɵɵngDeclareClassMetadata({
165
165
  minVersion: "12.0.0",
166
- version: "22.2.3",
166
+ version: "22.2.4",
167
167
  ngImport: i0,
168
168
  type: WrCardHeader,
169
169
  decorators: [{
@@ -179,7 +179,7 @@ i0.ɵɵngDeclareClassMetadata({
179
179
  var WrCardFooter = class WrCardFooter {
180
180
  static ɵfac = i0.ɵɵngDeclareFactory({
181
181
  minVersion: "12.0.0",
182
- version: "22.2.3",
182
+ version: "22.2.4",
183
183
  ngImport: i0,
184
184
  type: WrCardFooter,
185
185
  deps: [],
@@ -187,7 +187,7 @@ var WrCardFooter = class WrCardFooter {
187
187
  });
188
188
  static ɵcmp = i0.ɵɵngDeclareComponent({
189
189
  minVersion: "14.0.0",
190
- version: "22.2.3",
190
+ version: "22.2.4",
191
191
  type: WrCardFooter,
192
192
  isStandalone: true,
193
193
  selector: "wr-card-footer",
@@ -200,7 +200,7 @@ var WrCardFooter = class WrCardFooter {
200
200
  };
201
201
  i0.ɵɵngDeclareClassMetadata({
202
202
  minVersion: "12.0.0",
203
- version: "22.2.3",
203
+ version: "22.2.4",
204
204
  ngImport: i0,
205
205
  type: WrCardFooter,
206
206
  decorators: [{