ngwr 15.0.1 → 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 (420) hide show
  1. package/anchor/styles/_index.scss +13 -2
  2. package/bits/aurora/styles/_rules.scss +11 -0
  3. package/bits/dot-grid/dot-grid.scss +1 -0
  4. package/bits/dot-grid/styles/_index.scss +8 -0
  5. package/bits/dot-grid/styles/_rules.scss +54 -0
  6. package/bits/iridescence/iridescence.scss +1 -0
  7. package/bits/iridescence/styles/_index.scss +8 -0
  8. package/bits/iridescence/styles/_rules.scss +72 -0
  9. package/bits/marquee/styles/_rules.scss +7 -3
  10. package/bits/ripple-grid/ripple-grid.scss +1 -0
  11. package/bits/ripple-grid/styles/_index.scss +8 -0
  12. package/bits/ripple-grid/styles/_rules.scss +63 -0
  13. package/bits/spotlight-card/styles/_rules.scss +7 -4
  14. package/bits/star-border/styles/_rules.scss +5 -2
  15. package/bits/threads/styles/_index.scss +8 -0
  16. package/bits/threads/styles/_rules.scss +76 -0
  17. package/bits/threads/threads.scss +1 -0
  18. package/bits/waves/styles/_rules.scss +8 -1
  19. package/charts/bar-chart/styles/_index.scss +607 -7
  20. package/charts/boxplot-chart/styles/_index.scss +297 -0
  21. package/charts/bullet-chart/styles/_index.scss +268 -0
  22. package/charts/calendar-heatmap/styles/_index.scss +25 -3
  23. package/charts/candlestick-chart/styles/_index.scss +307 -0
  24. package/charts/chart-legend/styles/_index.scss +143 -0
  25. package/charts/core/styles/_index.scss +30 -0
  26. package/charts/donut-chart/styles/_index.scss +39 -3
  27. package/charts/funnel-chart/styles/_index.scss +237 -0
  28. package/charts/gauge/styles/_index.scss +4 -2
  29. package/charts/heatmap-chart/styles/_index.scss +329 -0
  30. package/charts/line-chart/styles/_index.scss +141 -8
  31. package/charts/meter-group/styles/_index.scss +44 -13
  32. package/charts/radar-chart/styles/_index.scss +206 -0
  33. package/charts/scatter-chart/styles/_index.scss +245 -0
  34. package/charts/sparkline/styles/_index.scss +10 -1
  35. package/charts/treemap-chart/styles/_index.scss +215 -0
  36. package/charts/waterfall-chart/styles/_index.scss +321 -0
  37. package/collapse/styles/_index.scss +6 -1
  38. package/fesm2022/ngwr-affix.mjs +3 -3
  39. package/fesm2022/ngwr-alert.mjs +3 -3
  40. package/fesm2022/ngwr-anchor.mjs +3 -3
  41. package/fesm2022/ngwr-avatar.mjs +3 -3
  42. package/fesm2022/ngwr-back-top.mjs +3 -3
  43. package/fesm2022/ngwr-badge.mjs +6 -6
  44. package/fesm2022/ngwr-bits-aurora.mjs +30 -38
  45. package/fesm2022/ngwr-bits-aurora.mjs.map +1 -1
  46. package/fesm2022/ngwr-bits-blur-text.mjs +3 -3
  47. package/fesm2022/ngwr-bits-border-glow-testing.mjs.map +1 -1
  48. package/fesm2022/ngwr-bits-border-glow.mjs +11 -5
  49. package/fesm2022/ngwr-bits-border-glow.mjs.map +1 -1
  50. package/fesm2022/ngwr-bits-circular-text.mjs +3 -3
  51. package/fesm2022/ngwr-bits-click-spark.mjs +3 -3
  52. package/fesm2022/ngwr-bits-confetti.mjs +3 -3
  53. package/fesm2022/ngwr-bits-decrypt-text.mjs +3 -3
  54. package/fesm2022/ngwr-bits-dot-grid-testing.mjs +40 -0
  55. package/fesm2022/ngwr-bits-dot-grid-testing.mjs.map +1 -0
  56. package/fesm2022/ngwr-bits-dot-grid.mjs +482 -0
  57. package/fesm2022/ngwr-bits-dot-grid.mjs.map +1 -0
  58. package/fesm2022/ngwr-bits-falling-text.mjs +3 -3
  59. package/fesm2022/ngwr-bits-fuzzy-text.mjs +3 -3
  60. package/fesm2022/ngwr-bits-glitch-text.mjs +3 -3
  61. package/fesm2022/ngwr-bits-gradient-text.mjs +3 -3
  62. package/fesm2022/ngwr-bits-iridescence-testing.mjs +31 -0
  63. package/fesm2022/ngwr-bits-iridescence-testing.mjs.map +1 -0
  64. package/fesm2022/ngwr-bits-iridescence.mjs +591 -0
  65. package/fesm2022/ngwr-bits-iridescence.mjs.map +1 -0
  66. package/fesm2022/ngwr-bits-marquee-testing.mjs +1 -1
  67. package/fesm2022/ngwr-bits-marquee-testing.mjs.map +1 -1
  68. package/fesm2022/ngwr-bits-marquee.mjs +7 -7
  69. package/fesm2022/ngwr-bits-marquee.mjs.map +1 -1
  70. package/fesm2022/ngwr-bits-ripple-grid-testing.mjs +40 -0
  71. package/fesm2022/ngwr-bits-ripple-grid-testing.mjs.map +1 -0
  72. package/fesm2022/ngwr-bits-ripple-grid.mjs +805 -0
  73. package/fesm2022/ngwr-bits-ripple-grid.mjs.map +1 -0
  74. package/fesm2022/ngwr-bits-rotating-text.mjs +3 -3
  75. package/fesm2022/ngwr-bits-shiny-text.mjs +6 -6
  76. package/fesm2022/ngwr-bits-splash-cursor.mjs +3 -3
  77. package/fesm2022/ngwr-bits-split-text.mjs +3 -3
  78. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs +1 -1
  79. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs.map +1 -1
  80. package/fesm2022/ngwr-bits-spotlight-card.mjs +10 -10
  81. package/fesm2022/ngwr-bits-spotlight-card.mjs.map +1 -1
  82. package/fesm2022/ngwr-bits-star-border-testing.mjs +1 -1
  83. package/fesm2022/ngwr-bits-star-border-testing.mjs.map +1 -1
  84. package/fesm2022/ngwr-bits-star-border.mjs +7 -7
  85. package/fesm2022/ngwr-bits-star-border.mjs.map +1 -1
  86. package/fesm2022/ngwr-bits-threads-testing.mjs +41 -0
  87. package/fesm2022/ngwr-bits-threads-testing.mjs.map +1 -0
  88. package/fesm2022/ngwr-bits-threads.mjs +482 -0
  89. package/fesm2022/ngwr-bits-threads.mjs.map +1 -0
  90. package/fesm2022/ngwr-bits-tilt-card.mjs +6 -6
  91. package/fesm2022/ngwr-bits-typewriter.mjs +3 -3
  92. package/fesm2022/ngwr-bits-waves-testing.mjs.map +1 -1
  93. package/fesm2022/ngwr-bits-waves.mjs +60 -41
  94. package/fesm2022/ngwr-bits-waves.mjs.map +1 -1
  95. package/fesm2022/ngwr-breadcrumbs.mjs +8 -8
  96. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  97. package/fesm2022/ngwr-burger.mjs +3 -3
  98. package/fesm2022/ngwr-button.mjs +6 -6
  99. package/fesm2022/ngwr-calendar.mjs +3 -3
  100. package/fesm2022/ngwr-card.mjs +9 -9
  101. package/fesm2022/ngwr-carousel.mjs +6 -6
  102. package/fesm2022/ngwr-cascader.mjs +5 -5
  103. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  104. package/fesm2022/ngwr-charts-bar-chart-testing.mjs +127 -3
  105. package/fesm2022/ngwr-charts-bar-chart-testing.mjs.map +1 -1
  106. package/fesm2022/ngwr-charts-bar-chart.mjs +683 -49
  107. package/fesm2022/ngwr-charts-bar-chart.mjs.map +1 -1
  108. package/fesm2022/ngwr-charts-boxplot-chart-testing.mjs +161 -0
  109. package/fesm2022/ngwr-charts-boxplot-chart-testing.mjs.map +1 -0
  110. package/fesm2022/ngwr-charts-boxplot-chart.mjs +517 -0
  111. package/fesm2022/ngwr-charts-boxplot-chart.mjs.map +1 -0
  112. package/fesm2022/ngwr-charts-bullet-chart-testing.mjs +68 -0
  113. package/fesm2022/ngwr-charts-bullet-chart-testing.mjs.map +1 -0
  114. package/fesm2022/ngwr-charts-bullet-chart.mjs +459 -0
  115. package/fesm2022/ngwr-charts-bullet-chart.mjs.map +1 -0
  116. package/fesm2022/ngwr-charts-calendar-heatmap-testing.mjs +27 -0
  117. package/fesm2022/ngwr-charts-calendar-heatmap-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-charts-calendar-heatmap.mjs +96 -17
  119. package/fesm2022/ngwr-charts-calendar-heatmap.mjs.map +1 -1
  120. package/fesm2022/ngwr-charts-candlestick-chart-testing.mjs +107 -0
  121. package/fesm2022/ngwr-charts-candlestick-chart-testing.mjs.map +1 -0
  122. package/fesm2022/ngwr-charts-candlestick-chart.mjs +508 -0
  123. package/fesm2022/ngwr-charts-candlestick-chart.mjs.map +1 -0
  124. package/fesm2022/ngwr-charts-chart-legend-testing.mjs +126 -0
  125. package/fesm2022/ngwr-charts-chart-legend-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-charts-chart-legend.mjs +251 -0
  127. package/fesm2022/ngwr-charts-chart-legend.mjs.map +1 -0
  128. package/fesm2022/ngwr-charts-core.mjs +383 -0
  129. package/fesm2022/ngwr-charts-core.mjs.map +1 -0
  130. package/fesm2022/ngwr-charts-donut-chart-testing.mjs +10 -1
  131. package/fesm2022/ngwr-charts-donut-chart-testing.mjs.map +1 -1
  132. package/fesm2022/ngwr-charts-donut-chart.mjs +187 -31
  133. package/fesm2022/ngwr-charts-donut-chart.mjs.map +1 -1
  134. package/fesm2022/ngwr-charts-funnel-chart-testing.mjs +100 -0
  135. package/fesm2022/ngwr-charts-funnel-chart-testing.mjs.map +1 -0
  136. package/fesm2022/ngwr-charts-funnel-chart.mjs +415 -0
  137. package/fesm2022/ngwr-charts-funnel-chart.mjs.map +1 -0
  138. package/fesm2022/ngwr-charts-gauge-testing.mjs +9 -3
  139. package/fesm2022/ngwr-charts-gauge-testing.mjs.map +1 -1
  140. package/fesm2022/ngwr-charts-gauge.mjs +9 -15
  141. package/fesm2022/ngwr-charts-gauge.mjs.map +1 -1
  142. package/fesm2022/ngwr-charts-heatmap-chart-testing.mjs +120 -0
  143. package/fesm2022/ngwr-charts-heatmap-chart-testing.mjs.map +1 -0
  144. package/fesm2022/ngwr-charts-heatmap-chart.mjs +519 -0
  145. package/fesm2022/ngwr-charts-heatmap-chart.mjs.map +1 -0
  146. package/fesm2022/ngwr-charts-line-chart-testing.mjs +43 -1
  147. package/fesm2022/ngwr-charts-line-chart-testing.mjs.map +1 -1
  148. package/fesm2022/ngwr-charts-line-chart.mjs +436 -122
  149. package/fesm2022/ngwr-charts-line-chart.mjs.map +1 -1
  150. package/fesm2022/ngwr-charts-meter-group-testing.mjs +14 -2
  151. package/fesm2022/ngwr-charts-meter-group-testing.mjs.map +1 -1
  152. package/fesm2022/ngwr-charts-meter-group.mjs +101 -32
  153. package/fesm2022/ngwr-charts-meter-group.mjs.map +1 -1
  154. package/fesm2022/ngwr-charts-radar-chart-testing.mjs +98 -0
  155. package/fesm2022/ngwr-charts-radar-chart-testing.mjs.map +1 -0
  156. package/fesm2022/ngwr-charts-radar-chart.mjs +720 -0
  157. package/fesm2022/ngwr-charts-radar-chart.mjs.map +1 -0
  158. package/fesm2022/ngwr-charts-scatter-chart-testing.mjs +132 -0
  159. package/fesm2022/ngwr-charts-scatter-chart-testing.mjs.map +1 -0
  160. package/fesm2022/ngwr-charts-scatter-chart.mjs +545 -0
  161. package/fesm2022/ngwr-charts-scatter-chart.mjs.map +1 -0
  162. package/fesm2022/ngwr-charts-sparkline-testing.mjs.map +1 -1
  163. package/fesm2022/ngwr-charts-sparkline.mjs +14 -16
  164. package/fesm2022/ngwr-charts-sparkline.mjs.map +1 -1
  165. package/fesm2022/ngwr-charts-treemap-chart-testing.mjs +103 -0
  166. package/fesm2022/ngwr-charts-treemap-chart-testing.mjs.map +1 -0
  167. package/fesm2022/ngwr-charts-treemap-chart.mjs +535 -0
  168. package/fesm2022/ngwr-charts-treemap-chart.mjs.map +1 -0
  169. package/fesm2022/ngwr-charts-waterfall-chart-testing.mjs +131 -0
  170. package/fesm2022/ngwr-charts-waterfall-chart-testing.mjs.map +1 -0
  171. package/fesm2022/ngwr-charts-waterfall-chart.mjs +462 -0
  172. package/fesm2022/ngwr-charts-waterfall-chart.mjs.map +1 -0
  173. package/fesm2022/ngwr-checkbox.mjs +6 -6
  174. package/fesm2022/ngwr-clipboard.mjs +3 -3
  175. package/fesm2022/ngwr-collapse.mjs +9 -9
  176. package/fesm2022/ngwr-color-picker.mjs +6 -6
  177. package/fesm2022/ngwr-command-palette.mjs +3 -3
  178. package/fesm2022/ngwr-compare.mjs +3 -3
  179. package/fesm2022/ngwr-context-menu.mjs +12 -12
  180. package/fesm2022/ngwr-cookie.mjs +3 -3
  181. package/fesm2022/ngwr-counter.mjs +6 -6
  182. package/fesm2022/ngwr-date-picker.mjs +21 -21
  183. package/fesm2022/ngwr-date.mjs +6 -6
  184. package/fesm2022/ngwr-density.mjs +6 -6
  185. package/fesm2022/ngwr-descriptions.mjs +6 -6
  186. package/fesm2022/ngwr-dialog.mjs +15 -15
  187. package/fesm2022/ngwr-directives.mjs +12 -12
  188. package/fesm2022/ngwr-divider.mjs +3 -3
  189. package/fesm2022/ngwr-drawer.mjs +18 -18
  190. package/fesm2022/ngwr-dropdown.mjs +9 -9
  191. package/fesm2022/ngwr-editor.mjs +3 -3
  192. package/fesm2022/ngwr-empty.mjs +3 -3
  193. package/fesm2022/ngwr-event-calendar.mjs +6 -6
  194. package/fesm2022/ngwr-file-upload.mjs +3 -3
  195. package/fesm2022/ngwr-form.mjs +9 -9
  196. package/fesm2022/ngwr-graph.mjs +6 -6
  197. package/fesm2022/ngwr-hotkey.mjs +6 -6
  198. package/fesm2022/ngwr-i18n-ar.mjs +90 -4
  199. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  200. package/fesm2022/ngwr-i18n-cs.mjs +90 -4
  201. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  202. package/fesm2022/ngwr-i18n-de.mjs +90 -4
  203. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  204. package/fesm2022/ngwr-i18n-en.mjs +90 -4
  205. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  206. package/fesm2022/ngwr-i18n-es.mjs +90 -4
  207. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  208. package/fesm2022/ngwr-i18n-fr.mjs +90 -4
  209. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  210. package/fesm2022/ngwr-i18n-he.mjs +90 -4
  211. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  212. package/fesm2022/ngwr-i18n-hi.mjs +90 -4
  213. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  214. package/fesm2022/ngwr-i18n-id.mjs +90 -4
  215. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  216. package/fesm2022/ngwr-i18n-it.mjs +90 -4
  217. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  218. package/fesm2022/ngwr-i18n-ja.mjs +90 -4
  219. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  220. package/fesm2022/ngwr-i18n-ko.mjs +90 -4
  221. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  222. package/fesm2022/ngwr-i18n-nl.mjs +90 -4
  223. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  224. package/fesm2022/ngwr-i18n-pl.mjs +90 -4
  225. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  226. package/fesm2022/ngwr-i18n-pt.mjs +90 -4
  227. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  228. package/fesm2022/ngwr-i18n-ru.mjs +90 -4
  229. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  230. package/fesm2022/ngwr-i18n-sv.mjs +90 -4
  231. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  232. package/fesm2022/ngwr-i18n-tr.mjs +90 -4
  233. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  234. package/fesm2022/ngwr-i18n-uk.mjs +90 -4
  235. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  236. package/fesm2022/ngwr-i18n-vi.mjs +90 -4
  237. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  238. package/fesm2022/ngwr-i18n-zh-tw.mjs +90 -4
  239. package/fesm2022/ngwr-i18n-zh-tw.mjs.map +1 -1
  240. package/fesm2022/ngwr-i18n-zh.mjs +90 -4
  241. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  242. package/fesm2022/ngwr-i18n.mjs +9 -9
  243. package/fesm2022/ngwr-icon.mjs +6 -6
  244. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  245. package/fesm2022/ngwr-input-number.mjs +3 -3
  246. package/fesm2022/ngwr-input-otp.mjs +3 -3
  247. package/fesm2022/ngwr-input.mjs +15 -15
  248. package/fesm2022/ngwr-keyboard.mjs +3 -3
  249. package/fesm2022/ngwr-knob.mjs +3 -3
  250. package/fesm2022/ngwr-layout.mjs +15 -15
  251. package/fesm2022/ngwr-lightbox.mjs +5 -5
  252. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  253. package/fesm2022/ngwr-list.mjs +8 -8
  254. package/fesm2022/ngwr-list.mjs.map +1 -1
  255. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  256. package/fesm2022/ngwr-mention.mjs +6 -6
  257. package/fesm2022/ngwr-meta.mjs +6 -6
  258. package/fesm2022/ngwr-overlay.mjs +6 -6
  259. package/fesm2022/ngwr-page-header.mjs +3 -3
  260. package/fesm2022/ngwr-pagination.mjs +3 -3
  261. package/fesm2022/ngwr-pipes.mjs +21 -21
  262. package/fesm2022/ngwr-platform.mjs +6 -6
  263. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  264. package/fesm2022/ngwr-popover.mjs +43 -20
  265. package/fesm2022/ngwr-popover.mjs.map +1 -1
  266. package/fesm2022/ngwr-progress.mjs +3 -3
  267. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  268. package/fesm2022/ngwr-qr.mjs +4 -3
  269. package/fesm2022/ngwr-qr.mjs.map +1 -1
  270. package/fesm2022/ngwr-radio.mjs +6 -6
  271. package/fesm2022/ngwr-rating.mjs +3 -3
  272. package/fesm2022/ngwr-result.mjs +12 -12
  273. package/fesm2022/ngwr-schema-form.mjs +3 -3
  274. package/fesm2022/ngwr-scroll.mjs +3 -3
  275. package/fesm2022/ngwr-segmented.mjs +3 -3
  276. package/fesm2022/ngwr-select.mjs +12 -12
  277. package/fesm2022/ngwr-sidebar.mjs +3 -3
  278. package/fesm2022/ngwr-skeleton.mjs +3 -3
  279. package/fesm2022/ngwr-slider.mjs +3 -3
  280. package/fesm2022/ngwr-sortable-list.mjs +11 -11
  281. package/fesm2022/ngwr-sortable-list.mjs.map +1 -1
  282. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  283. package/fesm2022/ngwr-spinner.mjs +3 -3
  284. package/fesm2022/ngwr-splitter.mjs +3 -3
  285. package/fesm2022/ngwr-statistic.mjs +9 -9
  286. package/fesm2022/ngwr-stepper.mjs +6 -6
  287. package/fesm2022/ngwr-storage.mjs +3 -3
  288. package/fesm2022/ngwr-switch.mjs +3 -3
  289. package/fesm2022/ngwr-table.mjs +18 -18
  290. package/fesm2022/ngwr-tabs-router.mjs +3 -3
  291. package/fesm2022/ngwr-tabs.mjs +6 -6
  292. package/fesm2022/ngwr-textarea.mjs +3 -3
  293. package/fesm2022/ngwr-theme.mjs +3 -3
  294. package/fesm2022/ngwr-timeline.mjs +6 -6
  295. package/fesm2022/ngwr-toast-testing.mjs +2 -1
  296. package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
  297. package/fesm2022/ngwr-toast.mjs +34 -15
  298. package/fesm2022/ngwr-toast.mjs.map +1 -1
  299. package/fesm2022/ngwr-toolbar.mjs +3 -3
  300. package/fesm2022/ngwr-tour.mjs +6 -6
  301. package/fesm2022/ngwr-transfer.mjs +3 -3
  302. package/fesm2022/ngwr-tree.mjs +3 -3
  303. package/fesm2022/ngwr-typography.mjs +3 -3
  304. package/fesm2022/ngwr-utils.mjs +31 -1
  305. package/fesm2022/ngwr-utils.mjs.map +1 -1
  306. package/fesm2022/ngwr-version.mjs +1 -1
  307. package/fesm2022/ngwr-version.mjs.map +1 -1
  308. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  309. package/fesm2022/ngwr-window-testing.mjs +61 -5
  310. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  311. package/fesm2022/ngwr-window.mjs +1538 -895
  312. package/fesm2022/ngwr-window.mjs.map +1 -1
  313. package/fesm2022/ngwr.mjs.map +1 -1
  314. package/i18n/ar.json +84 -4
  315. package/i18n/cs.json +84 -4
  316. package/i18n/de.json +84 -4
  317. package/i18n/en.json +84 -4
  318. package/i18n/es.json +84 -4
  319. package/i18n/fr.json +84 -4
  320. package/i18n/he.json +84 -4
  321. package/i18n/hi.json +84 -4
  322. package/i18n/id.json +84 -4
  323. package/i18n/it.json +84 -4
  324. package/i18n/ja.json +84 -4
  325. package/i18n/ko.json +84 -4
  326. package/i18n/nl.json +84 -4
  327. package/i18n/pl.json +84 -4
  328. package/i18n/pt.json +84 -4
  329. package/i18n/ru.json +84 -4
  330. package/i18n/sv.json +84 -4
  331. package/i18n/tr.json +84 -4
  332. package/i18n/uk.json +84 -4
  333. package/i18n/vi.json +84 -4
  334. package/i18n/zh-TW.json +84 -4
  335. package/i18n/zh.json +84 -4
  336. package/llms-full.txt +266 -9
  337. package/llms.txt +30 -7
  338. package/mcp/api.js +69 -1
  339. package/mcp/catalog.js +10 -1
  340. package/mcp/server.js +15 -1
  341. package/mcp/tools.js +122 -26
  342. package/package.json +132 -1
  343. package/popover/styles/_index.scss +75 -7
  344. package/schematics/component-style/index.js +3 -0
  345. package/schematics/migrations/v15/index.js +3 -26
  346. package/schematics/ng-add/index.js +2 -2
  347. package/schematics/use/symbol-map.json +14 -0
  348. package/schematics/utility/global-styles.js +19 -4
  349. package/schematics/utility/v15-moves.js +55 -0
  350. package/skills/ngwr/SKILL.md +8 -2
  351. package/skills/ngwr/references/catalog.md +28 -0
  352. package/skills/ngwr/references/setup.md +5 -4
  353. package/theme/styles/_focus.scss +8 -0
  354. package/toast/styles/_index.scss +103 -12
  355. package/types/ngwr-bits-aurora.d.ts +11 -0
  356. package/types/ngwr-bits-border-glow-testing.d.ts +5 -6
  357. package/types/ngwr-bits-border-glow.d.ts +5 -1
  358. package/types/ngwr-bits-dot-grid-testing.d.ts +92 -0
  359. package/types/ngwr-bits-dot-grid.d.ts +158 -0
  360. package/types/ngwr-bits-iridescence-testing.d.ts +85 -0
  361. package/types/ngwr-bits-iridescence.d.ts +244 -0
  362. package/types/ngwr-bits-ripple-grid-testing.d.ts +96 -0
  363. package/types/ngwr-bits-ripple-grid.d.ts +294 -0
  364. package/types/ngwr-bits-splash-cursor.d.ts +0 -1
  365. package/types/ngwr-bits-spotlight-card-testing.d.ts +3 -1
  366. package/types/ngwr-bits-star-border-testing.d.ts +7 -7
  367. package/types/ngwr-bits-threads-testing.d.ts +97 -0
  368. package/types/ngwr-bits-threads.d.ts +216 -0
  369. package/types/ngwr-bits-waves-testing.d.ts +1 -1
  370. package/types/ngwr-bits-waves.d.ts +20 -3
  371. package/types/ngwr-charts-bar-chart-testing.d.ts +193 -14
  372. package/types/ngwr-charts-bar-chart.d.ts +546 -38
  373. package/types/ngwr-charts-boxplot-chart-testing.d.ts +165 -0
  374. package/types/ngwr-charts-boxplot-chart.d.ts +308 -0
  375. package/types/ngwr-charts-bullet-chart-testing.d.ts +99 -0
  376. package/types/ngwr-charts-bullet-chart.d.ts +262 -0
  377. package/types/ngwr-charts-calendar-heatmap-testing.d.ts +32 -1
  378. package/types/ngwr-charts-calendar-heatmap.d.ts +55 -6
  379. package/types/ngwr-charts-candlestick-chart-testing.d.ts +135 -0
  380. package/types/ngwr-charts-candlestick-chart.d.ts +361 -0
  381. package/types/ngwr-charts-chart-legend-testing.d.ts +84 -0
  382. package/types/ngwr-charts-chart-legend.d.ts +178 -0
  383. package/types/ngwr-charts-core.d.ts +391 -0
  384. package/types/ngwr-charts-donut-chart-testing.d.ts +28 -5
  385. package/types/ngwr-charts-donut-chart.d.ts +124 -12
  386. package/types/ngwr-charts-funnel-chart-testing.d.ts +130 -0
  387. package/types/ngwr-charts-funnel-chart.d.ts +296 -0
  388. package/types/ngwr-charts-gauge-testing.d.ts +5 -0
  389. package/types/ngwr-charts-gauge.d.ts +6 -4
  390. package/types/ngwr-charts-heatmap-chart-testing.d.ts +148 -0
  391. package/types/ngwr-charts-heatmap-chart.d.ts +359 -0
  392. package/types/ngwr-charts-line-chart-testing.d.ts +72 -11
  393. package/types/ngwr-charts-line-chart.d.ts +291 -67
  394. package/types/ngwr-charts-meter-group-testing.d.ts +16 -2
  395. package/types/ngwr-charts-meter-group.d.ts +71 -11
  396. package/types/ngwr-charts-radar-chart-testing.d.ts +162 -0
  397. package/types/ngwr-charts-radar-chart.d.ts +461 -0
  398. package/types/ngwr-charts-scatter-chart-testing.d.ts +147 -0
  399. package/types/ngwr-charts-scatter-chart.d.ts +396 -0
  400. package/types/ngwr-charts-sparkline-testing.d.ts +4 -1
  401. package/types/ngwr-charts-sparkline.d.ts +8 -6
  402. package/types/ngwr-charts-treemap-chart-testing.d.ts +131 -0
  403. package/types/ngwr-charts-treemap-chart.d.ts +295 -0
  404. package/types/ngwr-charts-waterfall-chart-testing.d.ts +149 -0
  405. package/types/ngwr-charts-waterfall-chart.d.ts +338 -0
  406. package/types/ngwr-color-picker.d.ts +0 -21
  407. package/types/ngwr-dropdown.d.ts +0 -52
  408. package/types/ngwr-editor.d.ts +2 -84
  409. package/types/ngwr-i18n.d.ts +0 -15
  410. package/types/ngwr-mention.d.ts +0 -13
  411. package/types/ngwr-popconfirm.d.ts +0 -33
  412. package/types/ngwr-popover.d.ts +29 -53
  413. package/types/ngwr-toast-testing.d.ts +6 -1
  414. package/types/ngwr-tour.d.ts +0 -2
  415. package/types/ngwr-utils.d.ts +49 -7
  416. package/types/ngwr-version.d.ts +1 -1
  417. package/types/ngwr-window-testing.d.ts +65 -7
  418. package/types/ngwr-window.d.ts +831 -207
  419. package/types/ngwr.d.ts +1 -0
  420. package/window/styles/_index.scss +528 -82
@@ -1,9 +1,35 @@
1
1
  import * as i0 from "@angular/core";
2
- import { ComponentRef, InjectionToken, Signal, WritableSignal } from "@angular/core";
3
- import { WrClassInput } from "ngwr/utils";
2
+ import { ComponentRef, ElementRef, InjectionToken, Signal, TemplateRef, WritableSignal } from "@angular/core";
3
+ import { WrClassInput, WrFeature } from "ngwr/utils";
4
4
  import { ComponentType } from "@angular/cdk/portal";
5
5
  import { OverlayRef } from "@angular/cdk/overlay";
6
- import { ReplaySubject, Subject } from "rxjs";
6
+ import { Observable, ReplaySubject, Subject } from "rxjs";
7
+ import { WrDropdown } from "ngwr/dropdown";
8
+ /**
9
+ * Space to keep clear at each edge of the viewport, in CSS pixels — an app
10
+ * header, a side rail, a status strip. Physical edges, like every window
11
+ * coordinate: `x` and `left` are screen positions, not reading-order ones.
12
+ */
13
+ interface WrWindowInsets {
14
+ readonly top?: number;
15
+ readonly right?: number;
16
+ readonly bottom?: number;
17
+ readonly left?: number;
18
+ }
19
+ /**
20
+ * The work area: the rectangle that maximize, snapping, `keepInViewport` and
21
+ * the opening cascade all keep a window inside.
22
+ *
23
+ * - `'viewport'` (the default) — the whole viewport.
24
+ * - an inset object — the viewport minus that much at each edge.
25
+ * - an element (or an `ElementRef`) — that element's box, for a desktop that
26
+ * lives inside a panel. It is measured again when it resizes, when the
27
+ * viewport resizes and when the page scrolls.
28
+ *
29
+ * A `<wr-window-taskbar>` on the page reserves its own strip on top of any of
30
+ * these while it shows tabs, so a maximized window stops short of it.
31
+ */
32
+ type WrWindowBounds = 'viewport' | WrWindowInsets | HTMLElement | ElementRef<HTMLElement>;
7
33
  /**
8
34
  * @license
9
35
  *
@@ -38,17 +64,20 @@ type WrWindowChromeSize = 'sm' | 'md';
38
64
  * - `auto` (default) — read the user's OS from the browser and pick
39
65
  * `macos` / `windows` / `linux`. Unknown platforms fall back to
40
66
  * `windows`. SSR-safe (resolves to `windows` on the server).
41
- * - `macos` — traffic-light dots on the LEFT (red close, yellow minimize,
42
- * green maximize). Glyphs (×, −, +) appear when the cluster is hovered.
43
- * - `windows` — monochrome glyph buttons on the RIGHT.
44
- * - `linux` — close-only on the right, the GNOME convention. That is a DEFAULT
45
- * and not a rule: `showMinimize` / `showMaximize` set to `true` put the
46
- * buttons back, which is what a Linux user needs before a window can be
47
- * minimized into `<wr-window-taskbar>`.
67
+ * - `macos` — traffic lights on the LEFT (red close, yellow minimize, green
68
+ * zoom). Their glyphs (×, −, and the full-screen arrows, pointing in once
69
+ * the window is maximized) appear while the cluster is hovered or focused.
70
+ * - `windows` — Windows 11 caption buttons on the RIGHT: full-height, 46px
71
+ * wide, flush with the frame, with a red close on hover.
72
+ * - `linux` — GNOME's round buttons on the right, close-only by convention.
73
+ * That is a DEFAULT and not a rule: `showMinimize` / `showMaximize` set to
74
+ * `true` put the buttons back, which is what a Linux user needs before a
75
+ * window can be minimized into `<wr-window-taskbar>`.
76
+ *
77
+ * Every preset moves to the other edge in a right-to-left page, as each of
78
+ * the three platforms does in a right-to-left UI.
48
79
  */
49
80
  type WrWindowOs = 'auto' | 'macos' | 'windows' | 'linux';
50
- /** Resolved OS — what `'auto'` collapses to. */
51
- type WrWindowResolvedOs = Exclude<WrWindowOs, 'auto'>;
52
81
  /**
53
82
  * @license
54
83
  *
@@ -64,6 +93,402 @@ type WrWindowResolvedOs = Exclude<WrWindowOs, 'auto'>;
64
93
  * - `lg` — 720 × 480
65
94
  */
66
95
  type WrWindowSize = 'sm' | 'md' | 'lg';
96
+ /**
97
+ * A rectangle in viewport pixels — the work area, a snap region, a window's box.
98
+ *
99
+ * @internal
100
+ */
101
+ interface WrWindowRect {
102
+ readonly left: number;
103
+ readonly top: number;
104
+ readonly width: number;
105
+ readonly height: number;
106
+ }
107
+ /** @internal A window's free-floating geometry: where it is when it is neither maximized nor snapped. */
108
+ interface WrWindowGeometry {
109
+ readonly x: number;
110
+ readonly y: number;
111
+ readonly width: number;
112
+ readonly height: number;
113
+ }
114
+ /**
115
+ * Every option a window reads after it opens, with its default applied. The
116
+ * ones `WrWindowRef.update()` may change are signals of this object, so an
117
+ * update reaches the chrome and the drag code alike.
118
+ *
119
+ * @internal
120
+ */
121
+ interface WrWindowOptions {
122
+ readonly os: WrWindowOs;
123
+ readonly chromeSize: WrWindowChromeSize;
124
+ readonly animations: boolean;
125
+ readonly minWidth: number;
126
+ readonly minHeight: number;
127
+ readonly maxWidth: number;
128
+ readonly maxHeight: number;
129
+ readonly movable: boolean;
130
+ readonly resizable: boolean;
131
+ readonly keepInViewport: boolean;
132
+ readonly snap: WrWindowSnap;
133
+ readonly restoreOnDrag: boolean;
134
+ readonly dragHandle: string | null;
135
+ readonly showMinimize: boolean | null;
136
+ readonly showMaximize: boolean | null;
137
+ readonly showClose: boolean;
138
+ readonly closeOnEscape: boolean;
139
+ readonly keyboard: boolean;
140
+ readonly keyboardStep: number;
141
+ }
142
+ /** @internal How a window was set up when it opened. */
143
+ interface WrWindowModelInit {
144
+ readonly options: WrWindowOptions;
145
+ readonly title?: string;
146
+ readonly geometry?: WrWindowGeometry;
147
+ readonly state?: WrWindowState;
148
+ readonly snap?: WrWindowSnapTarget | null;
149
+ readonly z?: number;
150
+ readonly workArea: Signal<WrWindowRect>;
151
+ }
152
+ /** @internal A half or a quarter: what `snap` can hold. `top` is the maximized state instead. */
153
+ type WrWindowSnapRegion = Exclude<WrWindowSnapTarget, 'top'>;
154
+ /** @internal What `startKeyboard` hands back for the announcement. */
155
+ type WrWindowKeyboardMode = 'move' | 'resize';
156
+ /**
157
+ * One window's state and geometry, and the rules for changing them.
158
+ *
159
+ * Created by `WrWindowManager.open()` before anything renders, so the ref's
160
+ * signals are right from the first read and a call made before the first render
161
+ * — `ref.maximize()` in the same tick as `open()`, `ref.setTitle()` from the
162
+ * body's constructor — lands instead of being dropped. The component only draws
163
+ * it and turns pointer and key events into calls on it.
164
+ *
165
+ * The raw `x` / `y` / `width` / `height` are the geometry the USER chose. A
166
+ * maximized or snapped window shows something else (`rect`), and goes back to
167
+ * the raw geometry when it leaves that state; nothing has to be saved on the
168
+ * way in, so a `moveTo()` made while maximized is where restore lands.
169
+ *
170
+ * @internal
171
+ */
172
+ declare class WrWindowModel {
173
+ readonly options: WritableSignal<WrWindowOptions>;
174
+ readonly title: WritableSignal<string>;
175
+ readonly state: WritableSignal<WrWindowState>;
176
+ /** The half or quarter the window occupies while `normal`. `top` is never stored: it is `maximized`. */
177
+ readonly snap: WritableSignal<WrWindowSnapRegion | null>;
178
+ readonly x: WritableSignal<number>;
179
+ readonly y: WritableSignal<number>;
180
+ readonly width: WritableSignal<number>;
181
+ readonly height: WritableSignal<number>;
182
+ readonly z: WritableSignal<number>;
183
+ /** Written by the manager: whether this is the window that has the keyboard. */
184
+ readonly isActive: WritableSignal<boolean>;
185
+ readonly keyboardMode: WritableSignal<WrWindowKeyboardMode | null>;
186
+ /** The snap region a drag in progress would land in, for the hint. */
187
+ readonly dragTarget: WritableSignal<WrWindowSnapTarget | null>;
188
+ readonly workArea: Signal<WrWindowRect>;
189
+ readonly moved: Subject<{
190
+ readonly x: number;
191
+ readonly y: number;
192
+ }>;
193
+ readonly resized: Subject<{
194
+ readonly width: number;
195
+ readonly height: number;
196
+ }>;
197
+ readonly stateChanges: Subject<WrWindowState>;
198
+ /** Set by the component: the `<wr-window>` element, for the focus checks. */
199
+ element: HTMLElement | null;
200
+ /** Set by the container: the window was minimized while it held focus. */
201
+ onMinimizedWithFocus: (() => void) | null;
202
+ /** What leaving `minimized` goes back to — a window minimized while maximized comes back maximized. */
203
+ private restoreTo;
204
+ /** The geometry keyboard mode started from, after it restored the window: what a commit compares against. */
205
+ private keyboardStart;
206
+ /** Everything keyboard mode changed on entry, so Escape can put back a maximized or snapped window too. */
207
+ private keyboardOrigin;
208
+ /** The box on screen: the raw geometry, or what the state imposes on it. */
209
+ readonly rect: Signal<WrWindowRect>;
210
+ /** Where the drag in progress would land, for the snap hint. */
211
+ readonly previewRect: Signal<WrWindowRect | null>;
212
+ constructor(init: WrWindowModelInit);
213
+ /** The one place a state is written, so `stateChanges` hears every change and only real ones. */
214
+ setState(next: WrWindowState): void;
215
+ /** Toggle: minimize, or come back to the state it was minimized from. */
216
+ minimize(): void;
217
+ /** Leave `minimized` for the state the window was minimized from. A no-op otherwise. */
218
+ unminimize(): void;
219
+ /** Toggle: maximize, or restore down to where it was — a snapped half included. */
220
+ maximize(): void;
221
+ /** Back to the free-floating geometry: not minimized, not maximized, not snapped. */
222
+ restore(): void;
223
+ /** Snap to a region of the work area; `top` maximizes, `null` un-snaps. */
224
+ snapTo(target: WrWindowSnapTarget | null): void;
225
+ /** Write the raw geometry, in whole pixels — a touch drag hands out fractions. */
226
+ setRaw(g: Partial<WrWindowGeometry>): void;
227
+ /**
228
+ * A snapped window that is moved or resized by hand leaves the snap and
229
+ * keeps the box it had, the way a desktop does — otherwise the write would
230
+ * land in the raw geometry and nothing would visibly move.
231
+ */
232
+ unsnapInPlace(): void;
233
+ moveTo(x: number, y: number): void;
234
+ resizeTo(width: number, height: number): void;
235
+ center(): void;
236
+ /**
237
+ * Keep enough of the window inside the work area to grab it again. Reads the
238
+ * work area, so a resized viewport pulls a window back into reach.
239
+ */
240
+ clamp(): void;
241
+ /** Change options on an open window. New bounds re-clamp the size the window has now. */
242
+ update(patch: WrWindowUpdate): void;
243
+ /** The box a maximized window takes: the work area, capped at the maximum size and centred in it. */
244
+ maximizedRect(): WrWindowRect;
245
+ /**
246
+ * The box a half or a quarter takes, held to the window's own bounds: a
247
+ * window that cannot be that narrow keeps its minimum and stays against the
248
+ * edge it was snapped to, and the box is kept inside the work area.
249
+ */
250
+ snapRect(target: WrWindowSnapRegion): WrWindowRect;
251
+ /** Where a snap target puts the window. */
252
+ targetRect(target: WrWindowSnapTarget): WrWindowRect;
253
+ /**
254
+ * Enter keyboard move or resize. A maximized window is restored down first
255
+ * and a snapped one keeps its box, so the arrows move what the user sees.
256
+ * Returns `false` when the option forbids it.
257
+ */
258
+ startKeyboard(mode: WrWindowKeyboardMode): boolean;
259
+ /** One arrow key in keyboard move. */
260
+ nudge(dx: number, dy: number): void;
261
+ /**
262
+ * One arrow key in keyboard resize. The edge that moves is the inline END —
263
+ * the left one in a right-to-left page — so growing never moves the edge the
264
+ * window reads from.
265
+ */
266
+ grow(dw: number, dh: number, rtl: boolean): void;
267
+ /** Keep what keyboard mode did. Returns the mode it ended, for the announcement and the stream. */
268
+ commitKeyboard(): WrWindowKeyboardMode | null;
269
+ /**
270
+ * Put the window back the way keyboard mode found it: the geometry, and the
271
+ * maximized state or the snapped half it restored on entry. Without the last
272
+ * two, Escape on a maximized window left it restored down.
273
+ */
274
+ cancelKeyboard(): WrWindowKeyboardMode | null;
275
+ /** Whether focus is inside the window. */
276
+ hasFocus(): boolean;
277
+ /** The window closed: no stream may outlive it. */
278
+ complete(): void;
279
+ }
280
+ /**
281
+ * What a ref needs from the manager that opened it.
282
+ *
283
+ * @internal
284
+ */
285
+ interface WrWindowRefHost {
286
+ /** Raise the window, mark it active and, unless told otherwise, move focus into it. */
287
+ _activate(ref: WrWindowRef<unknown, unknown>, options?: {
288
+ readonly focus?: boolean;
289
+ }): void;
290
+ /** Raise the window without touching focus. */
291
+ _raise(ref: WrWindowRef<unknown, unknown>): void;
292
+ }
293
+ /**
294
+ * Handle returned by `WrWindowManager.open()`.
295
+ *
296
+ * Wraps the underlying overlay, exposes signals for the live geometry,
297
+ * and gives the consumer programmatic control over the window
298
+ * (focus, move, resize, minimize, maximize, close).
299
+ *
300
+ * Every signal is right from the moment `open()` returns, and every call works
301
+ * from then on too — including from the body component's constructor.
302
+ *
303
+ * @example
304
+ * ```ts
305
+ * const ref = manager.open(EditorComponent, {
306
+ * title: 'Untitled.md',
307
+ * storage: { key: 'editor', prefix: 'app' },
308
+ * });
309
+ *
310
+ * ref.beforeClose(async () => {
311
+ * if (!isDirty) return true;
312
+ * return await confirmDiscard();
313
+ * });
314
+ *
315
+ * const saved = await ref.afterClosed(); // resolves with whatever the
316
+ * // component passed to ref.close(value)
317
+ * ```
318
+ */
319
+ export declare class WrWindowRef<C, R = unknown> {
320
+ readonly _overlayRef: OverlayRef;
321
+ /** Stable id — used by the taskbar, workspace save, and DI. */
322
+ readonly id: string;
323
+ /**
324
+ * @internal — emits the close result once and completes.
325
+ *
326
+ * A `ReplaySubject`, not a plain `Subject`, so the result survives a late
327
+ * subscriber — the same reasoning `WrDialogRef` already carries. A caller
328
+ * that holds the ref and awaits `afterClosed()` after any intervening
329
+ * `await` subscribes to an already-completed stream, and a plain Subject
330
+ * hands it nothing but `complete`: the promise resolved `undefined` and a
331
+ * saved result was indistinguishable from a dismissal.
332
+ */
333
+ readonly _closed: ReplaySubject<R | undefined>;
334
+ /** @internal — the window's state and geometry; the signals below read through it. */
335
+ readonly _model: WrWindowModel;
336
+ /** @internal — emits whenever the state changes; `stateChanges` is its public face. */
337
+ readonly _stateChanged: Subject<WrWindowState>;
338
+ /** @internal — set by the container right after attach. */
339
+ componentRef: ComponentRef<C> | null;
340
+ /** @internal — whether this window opts into the taskbar list. */
341
+ taskbarVisible: boolean;
342
+ /** @internal — the manager that opened the window. */
343
+ _host: WrWindowRefHost | null;
344
+ /** @internal — close the overlay and settle the result; wired by the manager. */
345
+ _doClose: ((result: R | undefined) => void) | null;
346
+ /**
347
+ * @internal — move focus into the window after the next render: to the control
348
+ * it had last (`'last'`, falling back to the first one) or to the first one.
349
+ * Wired by the container once the window is on the page.
350
+ */
351
+ _focusWindow: ((mode: 'initial' | 'last') => void) | null;
352
+ /** @internal — enter keyboard move / resize; wired by the container. */
353
+ _startKeyboard: ((mode: WrWindowKeyboardMode) => void) | null;
354
+ /** @internal — a keyboard mode asked for before the window was on the page. */
355
+ _pendingKeyboard: WrWindowKeyboardMode | null;
356
+ /**
357
+ * @internal — what had focus when `open()` was called, and where closing the
358
+ * window sends it back. `null` when focus was on nothing.
359
+ */
360
+ _returnFocus: HTMLElement | null;
361
+ /** Window state. A snapped window is `normal`; read {@link snap} for which half. */
362
+ readonly state: Signal<WrWindowState>;
363
+ /** Left edge on screen, in px — the work area's while maximized. */
364
+ readonly x: Signal<number>;
365
+ /** Top edge on screen, in px. */
366
+ readonly y: Signal<number>;
367
+ /** Width on screen, in px. */
368
+ readonly width: Signal<number>;
369
+ /** Height on screen, in px. */
370
+ readonly height: Signal<number>;
371
+ /** Stack z-index. */
372
+ readonly z: Signal<number>;
373
+ /** Live title. */
374
+ readonly title: Signal<string>;
375
+ /** The half or quarter the window is snapped to, or `null` (since v15.1). Maximized reads `null`. */
376
+ readonly snap: Signal<WrWindowSnapTarget | null>;
377
+ /** Whether this is the active window — the one that has the keyboard (since v15.1). */
378
+ readonly isActive: Signal<boolean>;
379
+ /** Emits the close result once, then completes — the stream `WrDialogRef.closed` is (since v15.1). */
380
+ readonly closed: Observable<R | undefined>;
381
+ /**
382
+ * Emits where the user moved the window: once when a title-bar drag or a
383
+ * keyboard move ends, and when a drag snaps it. Calls from code are silent —
384
+ * the caller knows where it put the window (since v15.1).
385
+ */
386
+ readonly moved: Observable<{
387
+ readonly x: number;
388
+ readonly y: number;
389
+ }>;
390
+ /**
391
+ * Emits the size the user gave the window: once when an edge drag or a
392
+ * keyboard resize ends, and when a drag snaps it to a half or a quarter.
393
+ * Calls from code are silent (since v15.1).
394
+ */
395
+ readonly resized: Observable<{
396
+ readonly width: number;
397
+ readonly height: number;
398
+ }>;
399
+ /** Emits every state change, from the user or from code (since v15.1). */
400
+ readonly stateChanges: Observable<WrWindowState>;
401
+ private _beforeCloseHook;
402
+ /**
403
+ * A ref built by hand — a test double for `WR_WINDOW_REF`. It answers every
404
+ * call with a window of its own that nothing renders.
405
+ */
406
+ constructor(id: string, _overlayRef: OverlayRef);
407
+ /** @internal The manager's form: the window's model, built before anything renders. */
408
+ constructor(id: string, _overlayRef: OverlayRef, model: WrWindowModel);
409
+ /** Resolved instance of the projected component. */
410
+ get componentInstance(): C;
411
+ private isClosed;
412
+ /**
413
+ * Close the window, optionally returning a result. If a `beforeClose`
414
+ * hook is registered it is consulted first — a falsy resolution
415
+ * cancels the close.
416
+ */
417
+ close(result?: R): Promise<void>;
418
+ /** Toggle the minimized state. Leaving it returns to the state it was minimized from. */
419
+ minimize(): void;
420
+ /** Toggle the maximized state. Restoring down returns to where the window was, a snapped half included. */
421
+ maximize(): void;
422
+ /** Back to `normal` at the window's own geometry — from minimized, maximized or snapped. */
423
+ restore(): void;
424
+ /**
425
+ * Bring this window to the top of the stack. Only RAISES it: focus stays
426
+ * where it is. Use {@link activate} to switch to the window.
427
+ */
428
+ focus(): void;
429
+ /**
430
+ * Switch to the window: bring it back from the taskbar if it is minimized,
431
+ * raise it, make it the active window, and move focus to the control it had
432
+ * last (its first control when it never had one) (since v15.1).
433
+ */
434
+ activate(): void;
435
+ /**
436
+ * Move the window to `(x, y)`, held to the work area while `keepInViewport`.
437
+ * While maximized it moves the geometry restore lands on; a snapped window
438
+ * leaves the snap.
439
+ */
440
+ moveTo(x: number, y: number): void;
441
+ /** Resize the window, held to `minWidth`…`maxWidth` and `minHeight`…`maxHeight`. */
442
+ resizeTo(width: number, height: number): void;
443
+ /** Re-position the window so it sits centered in its work area. */
444
+ center(): void;
445
+ /** Snap to a half or a quarter of the work area; `'top'` maximizes, `null` un-snaps (since v15.1). */
446
+ snapTo(target: WrWindowSnapTarget | null): void;
447
+ /** Update the title-bar text, and with it the window's accessible name. */
448
+ setTitle(title: string): void;
449
+ /**
450
+ * Change options on an open window — lock it while it saves, take its close
451
+ * button away while a task runs. New bounds re-clamp its current size
452
+ * (since v15.1).
453
+ */
454
+ update(patch: WrWindowUpdate): void;
455
+ /**
456
+ * Move the window from the keyboard: the arrow keys step it, Shift by one
457
+ * pixel, Enter keeps the result and Escape puts it back. Moves focus into the
458
+ * window so the keys arrive. Bind it to a menu item or a button to offer
459
+ * moving without a drag (since v15.1).
460
+ */
461
+ startMove(): void;
462
+ /** Resize the window from the keyboard, the same way as {@link startMove} (since v15.1). */
463
+ startResize(): void;
464
+ private startKeyboard;
465
+ /**
466
+ * Register a guard that runs before `close()`. Return `false` (or a
467
+ * Promise resolving to false) to veto. Only one hook per ref —
468
+ * subsequent calls replace the previous.
469
+ */
470
+ beforeClose(hook: WrWindowBeforeCloseHook<R>): void;
471
+ /** Resolves with the result passed to `close()` (or `undefined`). */
472
+ afterClosed(): Promise<R | undefined>;
473
+ /** The same promise as {@link afterClosed}, under the name `WrDialogRef` uses (since v15.1). */
474
+ awaitClose(): Promise<R | undefined>;
475
+ /** Escape hatch — the underlying CDK overlay ref. */
476
+ get overlayRef(): OverlayRef;
477
+ }
478
+ /**
479
+ * What a `titleExtra` or `statusBar` template receives: the window's own ref
480
+ * as `$implicit`, so `<ng-template let-ref>` can read its title, state or
481
+ * geometry.
482
+ */
483
+ interface WrWindowSlotContext {
484
+ readonly $implicit: WrWindowRef<unknown, unknown>;
485
+ }
486
+ /**
487
+ * Content for one of the window's own slots: a template, or a component. A
488
+ * component is created with the window's injector, so it can
489
+ * `inject(WR_WINDOW_REF)` and `inject(WR_WINDOW_DATA)` like the body can.
490
+ */
491
+ type WrWindowSlotContent = TemplateRef<WrWindowSlotContext> | ComponentType<unknown>;
67
492
  /**
68
493
  * @license
69
494
  *
@@ -72,14 +497,17 @@ type WrWindowSize = 'sm' | 'md' | 'lg';
72
497
  */
73
498
  /**
74
499
  * Edge / corner snap behaviour. Activated by dragging the title bar
75
- * close to a viewport edge.
500
+ * close to an edge of the work area.
76
501
  *
77
502
  * - `none` — no snapping.
78
503
  * - `edges` — left / right / top edges snap to halves; top snaps to maximise.
79
504
  * - `all` — adds the four corners → quarter-screen snaps.
80
505
  */
81
506
  type WrWindowSnap = 'none' | 'edges' | 'all';
82
- /** Internal snap target — resolved by the drag handler. */
507
+ /**
508
+ * A region of the work area a window can snap to: a half, a quarter, or `top`,
509
+ * which maximizes. Read it from `WrWindowRef.snap()`, set it with `snapTo()`.
510
+ */
83
511
  type WrWindowSnapTarget = 'left' | 'right' | 'top' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
84
512
  /** What slice of geometry the storage layer should keep in sync. */
85
513
  type WrWindowPersistMode = 'position' | 'size' | 'all';
@@ -109,25 +537,59 @@ interface WrWindowStorageConfig {
109
537
  * with the standard chrome at the cascaded position.
110
538
  */
111
539
  interface WrWindowConfig<D = unknown> {
112
- /** Stable identifier — used by the taskbar, workspace save, and DI. */
540
+ /**
541
+ * Stable identifier — used by the taskbar, workspace save, and DI. A second
542
+ * `open()` with an id that is already open brings that window back instead of
543
+ * opening another. Generated when omitted.
544
+ */
113
545
  readonly id?: string;
546
+ /**
547
+ * Title-bar text, and the window's accessible name. A window without one is
548
+ * named by the catalog's "Untitled", in the title bar and in the taskbar.
549
+ * @default ''
550
+ */
114
551
  readonly title?: string;
552
+ /** Chrome style: `'auto'` follows the visitor's platform. @default 'auto' */
115
553
  readonly os?: WrWindowOs;
116
- /** Initial size preset. Ignored when `width` / `height` are passed. */
554
+ /** Initial size preset. Ignored when `width` / `height` are passed. @default 'md' */
117
555
  readonly size?: WrWindowSize;
118
556
  /** Title-bar density. @default 'md' */
119
557
  readonly chromeSize?: WrWindowChromeSize;
558
+ /** Opening left edge, in viewport pixels. Omit to cascade from the work area's start edge. */
120
559
  readonly x?: number;
560
+ /** Opening top edge, in viewport pixels. Omit to cascade. */
121
561
  readonly y?: number;
562
+ /** Opening width in pixels, over the `size` preset. Capped at the work area while `keepInViewport`. */
122
563
  readonly width?: number;
564
+ /** Opening height in pixels, over the `size` preset. Capped at the work area while `keepInViewport`. */
123
565
  readonly height?: number;
566
+ /** Narrowest the window may be dragged, snapped or opened. @default 220 */
124
567
  readonly minWidth?: number;
568
+ /** Shortest the window may be dragged, snapped or opened. @default 140 */
125
569
  readonly minHeight?: number;
570
+ /** Widest the window may be dragged, snapped, maximized or opened. @default Infinity */
126
571
  readonly maxWidth?: number;
572
+ /** Tallest the window may be dragged, snapped, maximized or opened. @default Infinity */
127
573
  readonly maxHeight?: number;
574
+ /** Allow moving the window, by the title bar or from the keyboard. @default true */
128
575
  readonly movable?: boolean;
576
+ /** Allow resizing the window, by its edges or from the keyboard. @default true */
129
577
  readonly resizable?: boolean;
578
+ /**
579
+ * Keep enough of the window inside the work area to grab it again, and open
580
+ * it wholly inside when it fits. `false` lets it go anywhere. @default true
581
+ */
130
582
  readonly keepInViewport?: boolean;
583
+ /**
584
+ * The rectangle maximize, snapping, `keepInViewport` and the cascade keep the
585
+ * window inside. Falls back to `withWindows({ bounds })`, then the viewport.
586
+ * @default 'viewport'
587
+ */
588
+ readonly bounds?: WrWindowBounds;
589
+ /**
590
+ * Close on Escape — when focus is inside the window, or when focus is on
591
+ * nothing and this is the active window. @default true
592
+ */
131
593
  readonly closeOnEscape?: boolean;
132
594
  /**
133
595
  * Move focus into the window when it opens (since v15): to the element
@@ -146,21 +608,59 @@ interface WrWindowConfig<D = unknown> {
146
608
  /** Snap-on-drag mode. @default 'none' */
147
609
  readonly snap?: WrWindowSnap;
148
610
  /**
149
- * Show the minimize control. Omit to follow the chrome — every OS but Linux
150
- * shows it, and the Linux preset is close-only by convention. Pass `true` to
151
- * override that, which is what a Linux user needs before a window can reach
152
- * `<wr-window-taskbar>`.
611
+ * Dragging the title bar of a maximized or snapped window restores its own
612
+ * size under the pointer, as desktop window managers do. `false` keeps a
613
+ * maximized window still and moves a snapped one at its snapped size.
614
+ * @default true
615
+ */
616
+ readonly restoreOnDrag?: boolean;
617
+ /**
618
+ * Keyboard move and resize: Alt+F7 moves the window and Alt+F8 resizes it
619
+ * with the arrow keys, Enter keeps the result and Escape puts it back. The
620
+ * same modes start from `WrWindowRef.startMove()` / `startResize()`.
621
+ * @default true
622
+ */
623
+ readonly keyboard?: boolean;
624
+ /** Pixels per arrow key in keyboard move and resize; Shift steps 1px. @default 10 */
625
+ readonly keyboardStep?: number;
626
+ /**
627
+ * Show the minimize control. Omit to follow the chrome: every OS but Linux
628
+ * shows it, and the Linux chrome is close-only by convention. Pass `true` to
629
+ * show it there, which is what puts a Linux window within reach of
630
+ * `<wr-window-taskbar>`. A minimized window is hidden until something brings
631
+ * it back, so a page that offers minimize also needs the taskbar or a dock of
632
+ * its own over `WrWindowManager.minimized()`.
153
633
  */
154
634
  readonly showMinimize?: boolean;
155
- /** Show the maximize control. Omit to follow the chrome, as with {@link showMinimize}. */
635
+ /** Show the maximize control. Omit to follow the chrome: every OS but Linux shows it. */
156
636
  readonly showMaximize?: boolean;
157
- /** Show the close control. Every chrome closes, so this is not per-OS. */
637
+ /** Show the close control. Every chrome closes, so this is not per-OS. @default true */
158
638
  readonly showClose?: boolean;
159
- /** Show in `<wr-window-taskbar>` when minimized. @default true */
639
+ /**
640
+ * Content for the title bar, between the title and the buttons — a badge, a
641
+ * menu button. A template receives the ref as `$implicit`.
642
+ */
643
+ readonly titleExtra?: WrWindowSlotContent;
644
+ /** Content for a status bar under the body. A template receives the ref as `$implicit`. */
645
+ readonly statusBar?: WrWindowSlotContent;
646
+ /** List the window in `<wr-window-taskbar>`. @default true */
160
647
  readonly taskbar?: boolean;
648
+ /**
649
+ * The window's own open animation and transitions. Off under
650
+ * `prefers-reduced-motion`; the body's own animations are never touched.
651
+ * @default true
652
+ */
161
653
  readonly animations?: boolean;
162
- /** CSS selector inside the projected content that restricts the move-grab area. */
654
+ /**
655
+ * CSS selector for the parts of the window that start a move. Matched in the
656
+ * body as well as the title bar, and replaces the title bar as the grab area —
657
+ * include `.wr-window__chrome` to keep it. A double-click on a match maximizes,
658
+ * as one on the title bar always does. Buttons, fields and links inside a match
659
+ * never start a drag. Give a body handle `touch-action: none` so a touch drag
660
+ * moves the window instead of scrolling the page.
661
+ */
163
662
  readonly dragHandle?: string;
663
+ /** Save the geometry to `WrStorage` as it changes and open there next time. */
164
664
  readonly storage?: WrWindowStorageConfig;
165
665
  /**
166
666
  * Extra CSS classes for the window's overlay pane. The pane is only a mount
@@ -168,8 +668,17 @@ interface WrWindowConfig<D = unknown> {
168
668
  * chrome reads `.my-class .wr-window`.
169
669
  */
170
670
  readonly panelClass?: WrClassInput;
671
+ /** Payload for the body component, read with `inject(WR_WINDOW_DATA)`. */
171
672
  readonly data?: D;
172
673
  }
674
+ /** App-wide window defaults, passed to `provideWr(withWindows(...))`. */
675
+ interface WrWindowDefaults {
676
+ /**
677
+ * The work area every window keeps inside, unless its own
678
+ * `WrWindowConfig.bounds` says otherwise. @default 'viewport'
679
+ */
680
+ readonly bounds?: WrWindowBounds;
681
+ }
173
682
  /**
174
683
  * @license
175
684
  *
@@ -178,15 +687,15 @@ interface WrWindowConfig<D = unknown> {
178
687
  */
179
688
  /**
180
689
  * Visual state of a `<wr-window>`:
181
- * - `normal` — free-floating, drag / resize allowed
182
- * - `minimized` — collapsed to a small bar (only the header is shown)
183
- * - `maximized` — pinned to the full viewport, drag / resize disabled
690
+ * - `normal` — free-floating, drag / resize allowed (a snapped window is `normal` too; see `WrWindowRef.snap`)
691
+ * - `minimized` — hidden, and listed in `<wr-window-taskbar>` to come back from
692
+ * - `maximized` — fills the work area, up to `maxWidth` / `maxHeight`, with no resize handles
184
693
  */
185
694
  type WrWindowState = 'normal' | 'minimized' | 'maximized';
186
695
  /**
187
696
  * One window as `WrWindowManager.saveLayout()` recorded it — the geometry the
188
- * window really had, not the geometry it happens to be showing while maximized
189
- * or minimized.
697
+ * window really had, not the geometry it happens to be showing while maximized,
698
+ * snapped or minimized.
190
699
  *
191
700
  * Public because `readLayout()` returns an array of these; a consumer that
192
701
  * stores or forwards that result has to be able to name the element type.
@@ -199,162 +708,67 @@ interface WrWindowLayoutSnapshot {
199
708
  readonly width: number;
200
709
  readonly height: number;
201
710
  readonly title: string;
711
+ /** The half or quarter the window was snapped to, if any (since v15.1). */
712
+ readonly snap?: WrWindowSnapTarget | null;
202
713
  }
203
- /** Hook signature for `WrWindowRef.beforeClose()`. Return falsy to veto. */
204
- type WrWindowBeforeCloseHook<R> = (result: R | undefined) => boolean | Promise<boolean>;
205
714
  /**
206
- * Handle returned by `WrWindowManager.open()`.
207
- *
208
- * Wraps the underlying overlay, exposes signals for the live geometry,
209
- * and gives the consumer programmatic control over the window
210
- * (focus, move, resize, minimize, maximize, close).
211
- *
212
- * @example
213
- * ```ts
214
- * const ref = manager.open(EditorComponent, {
215
- * title: 'Untitled.md',
216
- * storage: { key: 'editor', prefix: 'app' },
217
- * });
715
+ * @license
218
716
  *
219
- * ref.beforeClose(async () => {
220
- * if (!isDirty) return true;
221
- * return await confirmDiscard();
222
- * });
717
+ * Use of this source code is governed by an MIT-style license that can be
718
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
719
+ */
720
+ /**
721
+ * Which windows `<wr-window-taskbar>` lists.
223
722
  *
224
- * const saved = await ref.afterClosed(); // resolves with whatever the
225
- * // component passed to ref.close(value)
226
- * ```
723
+ * - `minimized` (default) — only the minimized ones, as a strip of restore tabs.
724
+ * - `all` — every open window, with the active one marked: a tab switches to
725
+ * its window, and the active window's tab minimizes it.
227
726
  */
228
- export declare class WrWindowRef<C, R = unknown> {
229
- readonly _overlayRef: OverlayRef;
230
- /** Stable id — used by the taskbar, workspace save, and DI. */
231
- readonly id: string;
232
- /** @internal — emits the close result once and completes. */
233
- /**
234
- * A `ReplaySubject`, not a plain `Subject`, so the result survives a late
235
- * subscriber — the same reasoning `WrDialogRef` already carries. A caller
236
- * that holds the ref and awaits `afterClosed()` after any intervening
237
- * `await` subscribes to an already-completed stream, and a plain Subject
238
- * hands it nothing but `complete`: the promise resolved `undefined` and a
239
- * saved result was indistinguishable from a dismissal.
240
- */
241
- readonly _closed: ReplaySubject<R | undefined>;
242
- /** @internal — emits whenever the visual state changes. */
243
- readonly _stateChanged: Subject<WrWindowState>;
244
- /** @internal — set by the container right after attach. */
245
- componentRef: ComponentRef<C> | null;
246
- /** @internal — whether this window opts into the taskbar list. */
247
- taskbarVisible: boolean;
248
- /**
249
- * @internal — non-`normal` state to apply right after the container
250
- * wires its bridges (so `restoreLayout` can land a window straight
251
- * into `minimized` / `maximized` even though it just opened).
252
- */
253
- pendingStateOnMount: WrWindowState | null;
254
- /** @internal */ readonly _state: WritableSignal<WrWindowState>;
255
- /** @internal */ readonly _x: WritableSignal<number>;
256
- /** @internal */ readonly _y: WritableSignal<number>;
257
- /** @internal */ readonly _width: WritableSignal<number>;
258
- /** @internal */ readonly _height: WritableSignal<number>;
259
- /** @internal */ readonly _z: WritableSignal<number>;
260
- /**
261
- * The geometry the USER chose, as opposed to the one the current state
262
- * imposes. `_x` and friends mirror the window's EFFECTIVE values — a
263
- * maximized window reports the viewport, a minimized one reports its
264
- * collapsed header height — which is right for anything drawing the window
265
- * and wrong for anything persisting it.
266
- *
267
- * @internal
268
- */
269
- readonly _rawX: WritableSignal<number>;
270
- /** @internal */ readonly _rawY: WritableSignal<number>;
271
- /** @internal */ readonly _rawWidth: WritableSignal<number>;
272
- /** @internal */ readonly _rawHeight: WritableSignal<number>;
273
- /** @internal */ readonly _title: WritableSignal<string>;
274
- /** Window state. */
275
- readonly state: Signal<WrWindowState>;
276
- /** Live X. */
277
- readonly x: Signal<number>;
278
- /** Live Y. */
279
- readonly y: Signal<number>;
280
- /** Live width. */
281
- readonly width: Signal<number>;
282
- /** Live height. */
283
- readonly height: Signal<number>;
284
- /** Stack z-index. */
285
- readonly z: Signal<number>;
286
- /** Live title. */
287
- readonly title: Signal<string>;
288
- private _beforeCloseHook;
289
- /** @internal */ _doClose: ((result: R | undefined) => void) | null;
290
- /** @internal */ _doMinimize: (() => void) | null;
291
- /** @internal */ _doMaximize: (() => void) | null;
292
- /** @internal */ _doRestore: (() => void) | null;
293
- /** @internal */ _doFocus: (() => void) | null;
294
- /** @internal */ _doMoveTo: ((x: number, y: number) => void) | null;
295
- /** @internal */ _doResizeTo: ((w: number, h: number) => void) | null;
296
- /** @internal */ _doCenter: (() => void) | null;
297
- /** @internal */ _doSetTitle: ((title: string) => void) | null;
298
- /** @internal — move focus into the window after the next render. */
299
- _doFocusInitial: (() => void) | null;
300
- /**
301
- * @internal — what had focus when `open()` was called, and where closing the
302
- * window sends it back. `null` when focus was on nothing.
303
- */
304
- _returnFocus: HTMLElement | null;
305
- constructor(id: string, _overlayRef: OverlayRef);
306
- /** Resolved instance of the projected component. */
307
- get componentInstance(): C;
308
- private isClosed;
309
- /**
310
- * Close the window, optionally returning a result. If a `beforeClose`
311
- * hook is registered it is consulted first — a falsy resolution
312
- * cancels the close.
313
- */
314
- close(result?: R): Promise<void>;
315
- /** Toggle the minimized state. */
316
- minimize(): void;
317
- /** Toggle the maximized state. */
318
- maximize(): void;
319
- /** Force-restore from minimized / maximized to `normal`. */
320
- restore(): void;
321
- /** Bring this window to the top of the stack. */
322
- focus(): void;
323
- moveTo(x: number, y: number): void;
324
- resizeTo(width: number, height: number): void;
325
- /** Re-position the window so it sits centered in the current viewport. */
326
- center(): void;
327
- setTitle(title: string): void;
328
- /**
329
- * Register a guard that runs before `close()`. Return `false` (or a
330
- * Promise resolving to false) to veto. Only one hook per ref —
331
- * subsequent calls replace the previous.
332
- */
333
- beforeClose(hook: WrWindowBeforeCloseHook<R>): void;
334
- /** Resolves with the result passed to `close()` (or `undefined`). */
335
- afterClosed(): Promise<R | undefined>;
336
- /** Escape hatch — the underlying CDK overlay ref. */
337
- get overlayRef(): OverlayRef;
338
- }
727
+ type WrWindowTaskbarShow = 'minimized' | 'all';
728
+ /**
729
+ * The options `WrWindowRef.update()` can change on an open window. Everything
730
+ * else in `WrWindowConfig` is read once, when the window opens.
731
+ */
732
+ type WrWindowUpdate = Partial<Pick<WrWindowConfig, 'title' | 'movable' | 'resizable' | 'snap' | 'minWidth' | 'minHeight' | 'maxWidth' | 'maxHeight' | 'showMinimize' | 'showMaximize' | 'showClose' | 'closeOnEscape'>>;
733
+ /** Hook signature for `WrWindowRef.beforeClose()`. Return falsy to veto. */
734
+ type WrWindowBeforeCloseHook<R> = (result: R | undefined) => boolean | Promise<boolean>;
339
735
  /** Resolves to the active `WrWindowRef` inside a programmatically-opened window's content tree. */
340
736
  export declare const WR_WINDOW_REF: InjectionToken<WrWindowRef<unknown, unknown>>;
341
737
  /** Resolves to the `data` passed in `WrWindowConfig.data`. */
342
738
  export declare const WR_WINDOW_DATA: InjectionToken<unknown>;
739
+ type AnyRef$1 = WrWindowRef<unknown, unknown>;
343
740
  /**
344
741
  * What `WrWindowManager` needs from a `<wr-window-taskbar>` on the page: the
345
742
  * row a window's tab sits in, so focus can land on it when the window is
346
- * minimized and be recognised there when the window is closed from it.
743
+ * minimized and be recognised there when the window is closed from it, and
744
+ * the strip it covers, so maximized windows stop short of it.
347
745
  *
348
746
  * @internal
349
747
  */
350
748
  interface WrWindowTaskbarTabs {
351
- /** The `.wr-window-taskbar__tab` row for `ref`, or `null` when this taskbar does not list it. */
352
- tabFor(ref: WrWindowRef<unknown, unknown>): HTMLElement | null;
749
+ /**
750
+ * The `.wr-window-taskbar__tab` row for `ref`, the "+N" button when its tab is
751
+ * folded under one, or `null` when this taskbar does not list it.
752
+ */
753
+ tabFor(ref: AnyRef$1): HTMLElement | null;
754
+ /**
755
+ * Whether `ref`'s place in the rail is still moving: its tab has not been
756
+ * measured yet, or the render that folds or unfolds it has not happened. Focus
757
+ * waits for it rather than landing on a tab about to hide or a "+N" not drawn.
758
+ */
759
+ settling(ref: AnyRef$1): boolean;
760
+ /** Whether `node` is inside this taskbar. */
761
+ contains(node: Node): boolean;
762
+ /** The strip of the viewport this taskbar covers while it shows tabs, in px from each edge. */
763
+ readonly reserve: Signal<{
764
+ readonly top: number;
765
+ readonly bottom: number;
766
+ }>;
353
767
  }
354
768
  /**
355
- * Owns the open `<wr-window>` stack, hands out z-indexes, cascades the
356
- * default spawn position, and opens programmatic windows that wrap a
357
- * consumer component.
769
+ * Owns the open window stack, hands out z-indexes, tracks the active window,
770
+ * cascades the default spawn position, and opens windows that wrap a consumer
771
+ * component.
358
772
  *
359
773
  * Inject the singleton and call `open(component, config)` for a
360
774
  * dialog-style flow:
@@ -371,37 +785,65 @@ interface WrWindowTaskbarTabs {
371
785
  * const saved = await ref.afterClosed();
372
786
  * ```
373
787
  *
374
- * Declarative `<wr-window [(open)]="...">` instances also register with
375
- * the manager on focus, so both styles share the same stack ordering.
788
+ * There is no declarative `<wr-window>`: `open()` is the only way in, so every
789
+ * window shares this one stack.
376
790
  */
377
- export declare class WrWindowManager {
791
+ export declare class WrWindowManager implements WrWindowRefHost {
378
792
  private readonly overlay;
379
793
  private readonly parentInjector;
380
794
  private readonly storage;
381
795
  private readonly isBrowser;
382
796
  private readonly dir;
797
+ private readonly defaults;
798
+ private readonly destroyRef;
383
799
  private readonly baseZ;
384
800
  private topZ;
385
801
  private openCount;
386
- /** All open windows opened via `open()` — declarative `<wr-window>` is not tracked here. */
802
+ /** All open windows, in the order they opened. */
387
803
  private readonly _windows;
804
+ /** The window that has the keyboard, or `null`. */
805
+ private readonly _active;
388
806
  /**
389
807
  * Filled by `restoreLayout` right before it invokes the consumer's
390
808
  * opener callback. The next `open()` call with a matching `config.id`
391
- * pops the entry and uses it as the initial geometry (so the seed
392
- * lands at the saved coords instead of the cascade default) and
393
- * applies any non-`normal` state after the bridges are wired.
809
+ * pops the entry and uses it as the initial geometry and state.
394
810
  */
395
811
  private readonly pendingRestores;
396
812
  /** The taskbars on the page, registered by each `<wr-window-taskbar>` for its lifetime. */
397
813
  private readonly taskbars;
398
- /** All currently-open programmatic windows. */
814
+ /**
815
+ * ONE viewport for every window, kept by one `resize` listener. Each window
816
+ * used to add its own — twenty listeners for twenty windows, each writing its
817
+ * own copy of the same two numbers.
818
+ */
819
+ private readonly viewport;
820
+ /** Bumped when an element used as `bounds` may have moved: it resized, or something scrolled. */
821
+ private readonly layoutTick;
822
+ private listening;
823
+ private boundsObserver;
824
+ private readonly boundElements;
825
+ private readonly bumpLayout;
826
+ /** The strip the taskbars cover, edge by edge. */
827
+ private readonly reserve;
828
+ /** All currently-open windows, in the order they opened. */
399
829
  readonly windows: Signal<readonly WrWindowRef<unknown, unknown>[]>;
400
- /** Programmatic windows that are minimized AND opted into the taskbar. */
830
+ /**
831
+ * The active window — the one that has the keyboard: the last one focused,
832
+ * clicked, opened with focus or switched to (since v15.1). `null` once focus
833
+ * moves to something on the page outside every window, and while the active
834
+ * window is minimized.
835
+ */
836
+ readonly active: Signal<WrWindowRef<unknown, unknown> | null>;
837
+ /** Windows that are minimized AND opted into the taskbar. */
401
838
  readonly minimized: Signal<WrWindowRef<unknown, unknown>[]>;
402
839
  /** Reserve the next z-index. Strictly increasing across the app's lifetime. */
403
840
  bringToFront(): number;
404
- /** Cascade offset for new windows, so two opens don't perfectly overlap. */
841
+ /**
842
+ * Cascade offset for new windows, so two opens don't perfectly overlap: 30px
843
+ * a step from the work area's start edge, back to the start after ten, and
844
+ * each lap of ten shifted 15px along so window eleven does not land exactly
845
+ * on window one.
846
+ */
405
847
  nextStartOffset(): {
406
848
  readonly x: number;
407
849
  readonly y: number;
@@ -412,31 +854,62 @@ export declare class WrWindowManager {
412
854
  * its result.
413
855
  *
414
856
  * **Singleton by id** — if `config.id` is set and a window with that
415
- * id is already open, the existing ref is restored (if minimized),
416
- * brought to the front, and returned. No duplicate window is
857
+ * id is already open, that window is switched to (back from the taskbar,
858
+ * raised, focused) and its ref returned. No duplicate window is
417
859
  * created. Use this to coalesce repeated open() calls (e.g. a
418
860
  * "Settings" menu item that should always re-focus the same window).
419
861
  */
420
862
  open<C, R = unknown, D = unknown>(component: ComponentType<C>, config?: WrWindowConfig<D>): WrWindowRef<C, R>;
863
+ /**
864
+ * Switch to `ref`: back from the taskbar, raised, active, and — unless told
865
+ * otherwise — focused on the control it had last.
866
+ *
867
+ * @internal
868
+ */
869
+ _activate(ref: AnyRef$1, options?: {
870
+ readonly focus?: boolean;
871
+ }): void;
872
+ /**
873
+ * Put `ref` on top of the stack. A window already on top keeps its z: every
874
+ * click in a window used to take a new one, so the number climbed with each
875
+ * press and every press re-wrote the host's style.
876
+ *
877
+ * @internal
878
+ */
879
+ _raise(ref: AnyRef$1): void;
880
+ private setActive;
881
+ /**
882
+ * Focus decides the active window wherever it comes from: Tab into a window,
883
+ * a click on a field in it, a script calling `focus()`. A window that gains
884
+ * focus is raised too — a focused window hidden behind another is a window
885
+ * the user is typing into blind. Focus on a taskbar, or in another overlay,
886
+ * leaves the active window as it was; focus anywhere else on the page means
887
+ * none is.
888
+ */
889
+ private readonly onFocusIn;
890
+ /** Install the shared listeners, once, on the first open in a browser. */
891
+ private listen;
892
+ private boundsElement;
893
+ /**
894
+ * The work area for one window: its bounds, cut to the viewport, minus the
895
+ * strip a taskbar covers.
896
+ */
897
+ private workAreaFor;
898
+ /** Keep an element used as `bounds` measured while a window uses it. Returns the release. */
899
+ private observeBounds;
421
900
  /**
422
901
  * Whether a keyboard event routed to `ref`'s overlay is actually meant for it.
423
902
  *
424
- * The window holding real DOM focus owns the key. When focus is outside every
425
- * window — the common case, since a window is not modal and traps nothing —
426
- * the FRONT-most one does, by the manager's own z stack rather than by attach
427
- * order. A tie (nothing has ever been focused, so no z has been handed out
428
- * yet) leaves every window willing, and the dispatcher's newest-first walk
429
- * settles it as before.
903
+ * The window holding real DOM focus owns the key. When focus is on NOTHING —
904
+ * `<body>`, which is where a click on a window's own text used to leave it —
905
+ * the active window owns it if it is on screen, else the front-most window on
906
+ * screen. When focus is anywhere else on the page, no window owns it: an
907
+ * Escape pressed in the page's own search field closed a window the reader
908
+ * was not in. That is the rule the non-modal drawer has always followed.
430
909
  *
431
910
  * A MINIMIZED window never owns a key it did not receive through focus, and
432
- * never counts as being in front: it is `display: none`, so an Escape pressed
433
- * on the page closed a window the user could not see — and threw away its
434
- * taskbar entry with it — while the visible one stayed put.
435
- *
436
- * Focus on a taskbar tab is the minimized window's (as `holdsFocus` reads
437
- * it), so NO window owns that key: a tab lists only minimized windows, and
438
- * handing the key to the front-most one closed a window the reader was not
439
- * in, right after minimizing had put them on the tab.
911
+ * never counts as being in front: it is `display: none`. Focus on a taskbar
912
+ * tab is on the page, so no window owns that key either.
440
913
  */
441
914
  private ownsKeyboard;
442
915
  /**
@@ -454,12 +927,41 @@ export declare class WrWindowManager {
454
927
  *
455
928
  * @internal
456
929
  */
457
- _focusAfterMinimize(ref: WrWindowRef<unknown, unknown>): void;
930
+ _focusAfterMinimize(ref: AnyRef$1, attempt?: number): void;
458
931
  private taskbarTab;
459
932
  /** The focused element, or `null` when that is `<body>` or nothing. */
460
933
  private focusedElement;
461
934
  /** Whether focus is `ref`'s to hand back: inside it, on its taskbar tab, or nowhere. */
462
935
  private holdsFocus;
936
+ /** Windows on screen — not minimized. */
937
+ private onScreen;
938
+ /**
939
+ * Restore every window on screen and stack them down from the start edge of
940
+ * their work area, 30px apart, keeping each one's size and their order front
941
+ * to back (since v15.1).
942
+ */
943
+ cascade(): void;
944
+ /**
945
+ * Restore every window on screen and share the work area between them, in
946
+ * the order they opened: a grid (the default), side by side in columns, or
947
+ * stacked in rows. A row of a grid with fewer windows spreads them across its
948
+ * whole width. In a right-to-left page the first window takes the right
949
+ * (since v15.1).
950
+ */
951
+ tile(mode?: 'grid' | 'columns' | 'rows'): void;
952
+ /** Minimize every window on screen (since v15.1). */
953
+ minimizeAll(): void;
954
+ /** Bring every minimized window back, each to the state it was minimized from (since v15.1). */
955
+ restoreAll(): void;
956
+ /**
957
+ * Switch to the next window, in the order they opened, wrapping at the end —
958
+ * minimized windows included, which come back. Bind it to a hotkey from
959
+ * `ngwr/hotkey`, such as Ctrl+F6 (since v15.1).
960
+ */
961
+ activateNext(): void;
962
+ /** Switch to the previous window, the other way round from {@link activateNext} (since v15.1). */
963
+ activatePrevious(): void;
964
+ private cycle;
463
965
  /** Close every programmatically-opened window. */
464
966
  closeAll(): void;
465
967
  /** Look up an open window by its `config.id`. Returns `null` when no match. */
@@ -486,8 +988,9 @@ export declare class WrWindowManager {
486
988
  * matches, the geometry / state / title is re-applied immediately.
487
989
  * For misses, the optional `open` callback is invoked so the consumer
488
990
  * can re-open the right component for that id — the freshly-opened
489
- * window then seeds straight to the saved geometry (no cascade flicker)
490
- * and the saved state lands once the bridges are wired.
991
+ * window opens straight at the saved geometry and in the saved state, with
992
+ * no cascade flicker — fitted into the work area when this viewport is
993
+ * smaller than the one the layout was saved on.
491
994
  *
492
995
  * ```ts
493
996
  * manager.restoreLayout('default', (id, snap) => {
@@ -506,45 +1009,137 @@ export declare class WrWindowManager {
506
1009
  static ɵfac: i0.ɵɵFactoryDeclaration<WrWindowManager, never>;
507
1010
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
508
1011
  }
1012
+ type AnyRef = WrWindowRef<unknown, unknown>;
509
1013
  /**
510
1014
  * OS-style window taskbar. Drop one anywhere in the app — typically
511
- * fixed to the bottom of the viewport — and it lists every window
512
- * `WrWindowManager.open()` has handed out that's currently
513
- * `minimized`. Clicking a tab restores the window; clicking the close
514
- * glyph dismisses it without restoring.
1015
+ * fixed to the bottom of the viewport — and it lists the windows
1016
+ * `WrWindowManager.open()` has handed out: the minimized ones by default,
1017
+ * every open one with `show="all"`. Clicking a tab switches to its window;
1018
+ * with `show="all"`, clicking the active window's tab minimizes it. The close
1019
+ * glyph dismisses a window without restoring it.
1020
+ *
1021
+ * The rail is one Tab stop, a toolbar: the arrow keys move between its
1022
+ * buttons, Home and End jump to the ends.
515
1023
  *
516
1024
  * Focus follows the window in and out of the rail: minimizing a window
517
1025
  * that holds focus puts focus on its tab here, and restoring it from the
518
1026
  * tab moves focus into the window.
519
1027
  *
1028
+ * While it shows tabs, the rail reserves its strip of the viewport, so a
1029
+ * maximized or snapped window stops short of it.
1030
+ *
1031
+ * The rail stays one row. A tab is as wide as its title, up to
1032
+ * `--wr-window-taskbar-tab-max-width`, and the tabs that do not fit — or every
1033
+ * one past `maxTabs` — fold under a "+N" button at the end, which opens them as
1034
+ * a menu. In `show="all"` the active window's tab is never folded.
1035
+ *
520
1036
  * Windows opted out via `config.taskbar = false` never show up here.
521
1037
  *
522
1038
  * @example
523
1039
  * ```html
524
1040
  * <wr-window-taskbar />
525
1041
  * <wr-window-taskbar position="top" />
1042
+ * <wr-window-taskbar show="all" />
1043
+ * <wr-window-taskbar show="all" [maxTabs]="6" />
526
1044
  * ```
527
1045
  *
528
1046
  * @see https://ngwr.dev/reference/components/window
529
1047
  */
530
1048
  export declare class WrWindowTaskbar {
531
- /** @internal */ protected readonly railLabel: import("@angular/core").Signal<string>;
1049
+ private readonly minimizedLabel;
1050
+ private readonly allLabel;
532
1051
  /** @internal */ protected readonly closeLabel: import("@angular/core").Signal<string>;
533
1052
  /** @internal */ protected readonly untitled: import("@angular/core").Signal<string>;
534
1053
  /** @internal */ protected readonly restoreLabel: (params?: import("ngwr/i18n").WrI18nParams) => string;
1054
+ /** @internal */ protected readonly moreLabel: (params?: import("ngwr/i18n").WrI18nParams) => string;
535
1055
  /** Edge the taskbar pins itself to. @default 'bottom' */
536
1056
  readonly position: import("@angular/core").InputSignal<"top" | "bottom">;
1057
+ /**
1058
+ * Which windows the rail lists: the minimized ones, or every open one with
1059
+ * the active window marked (since v15.1). @default 'minimized'
1060
+ */
1061
+ readonly show: import("@angular/core").InputSignal<WrWindowTaskbarShow>;
1062
+ /**
1063
+ * The most tabs the rail shows; the rest fold under a "+N" button that opens
1064
+ * them as a menu (since v15.1). The width folds tabs too, whatever this says:
1065
+ * the tabs that do not fit beside the button at their own width go under it.
1066
+ * `null` leaves it to the width alone.
1067
+ * @default null
1068
+ */
1069
+ readonly maxTabs: import("@angular/core").InputSignalWithTransform<number | null, unknown>;
537
1070
  private readonly manager;
538
- /** @internal — minimized windows that haven't opted out via `taskbar: false`. */
1071
+ private readonly host;
1072
+ private readonly dir;
1073
+ /** @internal */ protected readonly railLabel: import("@angular/core").Signal<string>;
1074
+ /** @internal — the windows the rail lists, in the order they opened. */
539
1075
  protected readonly items: import("@angular/core").Signal<WrWindowRef<unknown, unknown>[]>;
1076
+ /** What the rail has to fit its tabs into — see {@link Room}. */
1077
+ private readonly room;
1078
+ /**
1079
+ * The tabs the rail draws, in opening order: all of them while they fit and
1080
+ * `maxTabs` allows it, otherwise the most that fit beside the "+N" button,
1081
+ * never more than `maxTabs` and never fewer than one. The active window's tab
1082
+ * takes the last place when it would otherwise fold, so the one tab
1083
+ * `show="all"` marks is always in reach. A tab not measured yet counts as
1084
+ * nothing, and the pass after its first render corrects that.
1085
+ */
1086
+ protected readonly visible: import("@angular/core").Signal<WrWindowRef<unknown, unknown>[]>;
1087
+ /** @internal — each listed window's place among the drawn tabs, absent while it is folded. */
1088
+ protected readonly slots: import("@angular/core").Signal<Map<WrWindowRef<unknown, unknown>, number>>;
1089
+ /** @internal — the windows under the "+N" button, in opening order. */
1090
+ protected readonly folded: import("@angular/core").Signal<WrWindowRef<unknown, unknown>[]>;
1091
+ /** The "+N" menu opens away from the edge the rail is pinned to. */
1092
+ protected readonly menuPosition: import("@angular/core").Signal<"top-end" | "bottom-end">;
540
1093
  protected readonly classes: import("@angular/core").Signal<string>;
541
- /** One row per entry of `items()`, in the same order. */
1094
+ /**
1095
+ * One row per entry of `items()`, in the same order. A folded window keeps its
1096
+ * tab, laid out but hidden, which is how the rail knows its width.
1097
+ */
542
1098
  private readonly tabs;
1099
+ private readonly more;
1100
+ /**
1101
+ * The rail's one Tab stop, as an index into its buttons: two per drawn tab,
1102
+ * restore then close, and the "+N" button last.
1103
+ */
1104
+ private readonly rovingIndex;
1105
+ private readonly stop;
1106
+ /** The strip of the viewport the rail covers while it shows tabs. */
1107
+ private readonly reserve;
543
1108
  constructor();
544
1109
  /** A window with no title still needs a name in the rail. */
545
- protected tabTitle(ref: WrWindowRef<unknown, unknown>): string;
546
- protected restore(ref: WrWindowRef<unknown, unknown>): void;
547
- protected close(ref: WrWindowRef<unknown, unknown>, event: Event): void;
1110
+ protected tabTitle(ref: AnyRef): string;
1111
+ /** Whether `ref` is the active window and on screen — what `show="all"` marks. */
1112
+ protected isCurrent(ref: AnyRef): boolean;
1113
+ /** A minimized window's tab restores it; in `show="all"` the others' tabs switch to their window. */
1114
+ protected tabLabel(ref: AnyRef): string;
1115
+ protected tabIndex(button: number): number;
1116
+ protected press(ref: AnyRef): void;
1117
+ /** A window picked from the "+N" menu: the menu closes and the window comes forward, as from its tab. */
1118
+ protected pick(ref: AnyRef, menu: WrDropdown): void;
1119
+ protected close(ref: AnyRef, event: Event): void;
1120
+ /** The toolbar pattern: arrows between buttons, Home and End to the ends, mirrored in RTL. */
1121
+ protected onKeydown(event: KeyboardEvent): void;
1122
+ /** A click or a script that focuses a button moves the Tab stop with it. */
1123
+ protected onFocusIn(event: FocusEvent): void;
1124
+ /** The drawn buttons in order — a folded tab's are hidden and out of the toolbar. */
1125
+ private buttons;
1126
+ private measure;
1127
+ /**
1128
+ * Read what the rail has to fit into. The host spans the viewport between its
1129
+ * insets, so its width is the most the rail can take, and the gap comes from
1130
+ * the stylesheet, so a consumer's hook is what the arithmetic uses.
1131
+ *
1132
+ * A tab's width is the one its title asks for, capped by its `max-width`. Every
1133
+ * tab is laid out, a folded one too, so each can be read — and a tab drawn
1134
+ * narrower than its title, squeezed as the only one left, is as wide as it is
1135
+ * plus the part of the title it clips. That keeps the reading the same however
1136
+ * the row is drawn, so a pass never feeds the next one a different answer.
1137
+ *
1138
+ * The "+N" button is measured once it is drawn — until then a tab's height
1139
+ * stands in for its width, and the next pass corrects it. That converges: a
1140
+ * wider button folds more, which can only keep its count's digits or add one.
1141
+ */
1142
+ private measureRoom;
548
1143
  static ɵfac: i0.ɵɵFactoryDeclaration<WrWindowTaskbar, never>;
549
1144
  static ɵcmp: i0.ɵɵComponentDeclaration<WrWindowTaskbar, "wr-window-taskbar", never, {
550
1145
  "position": {
@@ -552,6 +1147,35 @@ export declare class WrWindowTaskbar {
552
1147
  "required": false;
553
1148
  "isSignal": true;
554
1149
  };
1150
+ "show": {
1151
+ "alias": "show";
1152
+ "required": false;
1153
+ "isSignal": true;
1154
+ };
1155
+ "maxTabs": {
1156
+ "alias": "maxTabs";
1157
+ "required": false;
1158
+ "isSignal": true;
1159
+ };
555
1160
  }, {}, never, never, true, never>;
556
1161
  }
557
- export type { WrWindowBeforeCloseHook, WrWindowChromeSize, WrWindowConfig, WrWindowLayoutSnapshot, WrWindowOs, WrWindowPersistMode, WrWindowSize, WrWindowSnap, WrWindowState, WrWindowStorageConfig };
1162
+ /**
1163
+ * App-wide window defaults, as a feature of `provideWr()` — today the work area
1164
+ * every window keeps inside, so maximized windows stop short of an app header.
1165
+ * A window's own `WrWindowConfig.bounds` still wins.
1166
+ *
1167
+ * Bootstrap only: `WrWindowManager` is root-provided and reads it once, from
1168
+ * the root injector, so in a route's `providers` it changes nothing.
1169
+ *
1170
+ * @example
1171
+ * ```ts
1172
+ * import { provideWr } from 'ngwr';
1173
+ * import { withWindows } from 'ngwr/window';
1174
+ *
1175
+ * bootstrapApplication(App, {
1176
+ * providers: [provideWr(withWindows({ bounds: { top: 64 } }))],
1177
+ * });
1178
+ * ```
1179
+ */
1180
+ export declare function withWindows(defaults: WrWindowDefaults): WrFeature<'windows'>;
1181
+ export type { WrWindowBeforeCloseHook, WrWindowBounds, WrWindowChromeSize, WrWindowConfig, WrWindowDefaults, WrWindowInsets, WrWindowLayoutSnapshot, WrWindowOs, WrWindowPersistMode, WrWindowSize, WrWindowSlotContent, WrWindowSlotContext, WrWindowSnap, WrWindowSnapTarget, WrWindowState, WrWindowStorageConfig, WrWindowTaskbarShow, WrWindowUpdate };