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,5 +1,19 @@
1
1
  @use '../../theme/styles' as theme;
2
2
 
3
+ // Styles for the entry points this component's own markup renders.
4
+ //
5
+ // v15 removed the `@use 'ngwr'` umbrella, which is what had been covering these:
6
+ // a consumer now writes one `@use` per component they place, and never learns
7
+ // about the ones a component places INSIDE itself. `@use 'ngwr/date-picker'`
8
+ // alone gave a date field with a raw browser input — grey, square, 2px inset —
9
+ // and `@use 'ngwr/table'` a table with unstyled checkboxes and pager. Nothing
10
+ // says so: the component renders, the markup is right, and no build, console or
11
+ // gate has an opinion about a missing rule.
12
+ //
13
+ // Sass deduplicates `@use` within a compilation, so an app that also loads one of
14
+ // these by hand still emits it once.
15
+ @use '../../dropdown/styles' as dropdown-styles; // WrDropdown
16
+
3
17
  /// Two-corner variant of `theme.smooth-br`. The host no longer clips at its own
4
18
  /// rounded edge (it has to let the resize grips out), so the chrome and the
5
19
  /// status bar each have to round the pair of corners they sit in or their square
@@ -16,14 +30,37 @@
16
30
  }
17
31
  }
18
32
 
33
+ /// One corner of the same arithmetic, for the Windows close button, which sits
34
+ /// in the frame's top end corner and has to follow its curve.
35
+ @mixin _corner($corner, $br) {
36
+ #{$corner}: $br;
37
+
38
+ @supports (corner-shape: squircle) {
39
+ corner-shape: squircle;
40
+ #{$corner}: calc(#{$br} * 1.85);
41
+ }
42
+ }
43
+
19
44
  .wr-window {
20
45
  --wr-window-bg: var(--wr-color-surface);
21
46
  --wr-window-border: var(--wr-border-base);
22
47
  --wr-window-chrome-bg: var(--wr-color-hover);
23
48
  --wr-window-chrome-color: var(--wr-color-on-surface);
49
+ // An inactive window's title bar, the way every desktop dims the windows that
50
+ // do not have the keyboard. Muted text on the faintest fill still reads at
51
+ // 7:1 in both schemes.
52
+ --wr-window-chrome-inactive-bg: var(--wr-color-fill-subtle);
53
+ --wr-window-chrome-inactive-color: var(--wr-color-on-surface-muted);
24
54
  --wr-window-radius: var(--wr-border-radius-base);
25
55
  --wr-window-handle-size: 8px;
26
56
  --wr-window-handle-corner: 14px;
57
+
58
+ // A finger needs more than a cursor: 16px edges and 24px corners, still all
59
+ // outside the frame, so they cover nothing of the window's own.
60
+ @media (pointer: coarse) {
61
+ --wr-window-handle-size: 16px;
62
+ --wr-window-handle-corner: 24px;
63
+ }
27
64
  --wr-window-chrome-height: 2.25rem;
28
65
  --wr-window-title-size: var(--wr-text-sm);
29
66
  --wr-window-action-size: 1.5rem;
@@ -74,6 +111,19 @@
74
111
  var(--wr-shadow-modal);
75
112
  }
76
113
 
114
+ // Keyboard move / resize: a dashed ring says the arrow keys now move or size
115
+ // the window rather than whatever was focused in it.
116
+ &--keyboard-moving,
117
+ &--keyboard-resizing,
118
+ &--keyboard-moving:focus-visible,
119
+ &--keyboard-resizing:focus-visible {
120
+ outline: var(--wr-focus-ring-width) dashed var(--wr-focus-ring-color);
121
+ outline-offset: var(--wr-focus-ring-offset);
122
+ }
123
+ &--keyboard-moving .wr-window__chrome {
124
+ cursor: move;
125
+ }
126
+
77
127
  // Squares the host AND the two bars that now round their own corners
78
128
  // (see `&__chrome` / `&__status-bar`) — one variable instead of three rules.
79
129
  &--maximized {
@@ -93,8 +143,14 @@
93
143
  --wr-window-action-size: 1.125rem;
94
144
  }
95
145
 
146
+ // The window's OWN motion only: the frame, the chrome and the grips. A
147
+ // universal selector here used to switch off every animation in the body as
148
+ // well — a spinner stopped, a switch stopped sliding — for an option that
149
+ // is about the window.
96
150
  &--no-anim,
97
- &--no-anim * {
151
+ &--no-anim .wr-window__chrome,
152
+ &--no-anim .wr-window__chrome *,
153
+ &--no-anim .wr-window__handle {
98
154
  animation: none !important;
99
155
  transition: none !important;
100
156
  }
@@ -116,16 +172,44 @@
116
172
  padding-block: 0;
117
173
  // Roomy where the title starts, tight where the action cluster ends.
118
174
  padding-inline: var(--wr-window-chrome-padding-inline-start) var(--wr-window-chrome-padding-inline-end);
175
+ position: relative;
119
176
  background: var(--wr-window-chrome-bg);
120
177
  color: var(--wr-window-chrome-color);
121
178
  cursor: grab;
122
- border-bottom: 1px solid var(--wr-window-border);
123
179
  @include _corner-pair(border-start-start-radius, border-start-end-radius, var(--wr-window-radius));
124
180
  touch-action: none;
125
181
 
126
182
  &:active {
127
183
  cursor: grabbing;
128
184
  }
185
+
186
+ // The line under the bar is drawn ON TOP of the bar's contents rather than
187
+ // as its border. The caption buttons fill the bar's whole height, so every
188
+ // box in a 36px bar lands on a whole pixel, and a hovered button's fill no
189
+ // longer cuts the line short beneath it. A border, not a background, so
190
+ // forced colours keep it.
191
+ &::after {
192
+ content: '';
193
+ position: absolute;
194
+ inset-inline: 0;
195
+ inset-block-end: 0;
196
+ block-size: 0;
197
+ border-block-end: 1px solid var(--wr-window-border);
198
+ pointer-events: none;
199
+ }
200
+ }
201
+
202
+ &--inactive &__chrome {
203
+ --wr-window-chrome-bg: var(--wr-window-chrome-inactive-bg);
204
+ --wr-window-chrome-color: var(--wr-window-chrome-inactive-color);
205
+ }
206
+
207
+ // The caption glyphs dim with the title; a hovered button wakes up, as on
208
+ // Windows and GNOME. Not on macOS, where each light keeps its own dark glyph:
209
+ // the lights go grey instead (see the preset), and a hover over the cluster
210
+ // brings back every light and every glyph at once.
211
+ &--inactive:not(.wr-window--os-macos) &__chrome-action:not(:hover) {
212
+ --wr-window-chrome-action-color: var(--wr-window-chrome-inactive-color);
129
213
  }
130
214
 
131
215
  &__title {
@@ -167,109 +251,370 @@
167
251
  flex: 0 0 auto;
168
252
  display: inline-flex;
169
253
  align-items: center;
254
+ // The cluster spans the bar's whole height, which has no border of its own
255
+ // (the line under it is the bar's `::after`), so a 24px button centres on a
256
+ // whole pixel and the glyphs inside it stay sharp at 1x.
257
+ align-self: stretch;
170
258
  gap: var(--wr-window-chrome-actions-gap);
171
259
  padding-inline-start: var(--wr-window-chrome-actions-padding-inline-start);
172
260
  }
173
261
 
262
+ // The caption buttons. Every colour is a hook, and each OS preset below
263
+ // re-declares the ones its platform paints differently: Windows a flat
264
+ // full-height strip with a red close, GNOME tinted circles, macOS the
265
+ // traffic lights.
174
266
  &__chrome-action {
175
267
  --wr-window-chrome-action-radius: var(--wr-border-radius-sm);
268
+ --wr-window-chrome-action-width: var(--wr-window-action-size);
269
+ --wr-window-chrome-action-color: var(--wr-color-on-surface);
270
+ --wr-window-chrome-action-bg: transparent;
271
+ --wr-window-chrome-action-hover-bg: color-mix(in srgb, var(--wr-color-on-surface) 6%, transparent);
272
+ --wr-window-chrome-action-active-color: var(--wr-color-on-surface-muted);
273
+ --wr-window-chrome-action-active-bg: color-mix(in srgb, var(--wr-color-on-surface) 4%, transparent);
274
+ --wr-window-chrome-action-close-hover-color: var(--wr-color-danger-contrast);
275
+ --wr-window-chrome-action-close-hover-bg: var(--wr-color-danger);
276
+ --wr-window-chrome-action-close-active-bg: color-mix(in srgb, var(--wr-color-danger) 90%, transparent);
176
277
 
278
+ position: relative;
279
+ flex: 0 0 auto;
177
280
  appearance: none;
178
- background: transparent;
179
281
  border: 0;
180
282
  padding: 0;
181
- width: var(--wr-window-action-size);
283
+ width: var(--wr-window-chrome-action-width);
182
284
  height: var(--wr-window-action-size);
183
285
  display: inline-flex;
184
286
  align-items: center;
185
287
  justify-content: center;
186
- color: var(--wr-color-on-surface-muted);
288
+ color: var(--wr-window-chrome-action-color);
289
+ background: var(--wr-window-chrome-action-bg);
187
290
  cursor: pointer;
188
291
  border-radius: var(--wr-window-chrome-action-radius);
189
292
  transition:
190
293
  color var(--wr-transition-base),
191
- background var(--wr-transition-base);
294
+ background-color var(--wr-transition-base);
192
295
 
193
296
  &:hover {
194
- color: var(--wr-color-on-surface);
195
- background: var(--wr-color-fill-strong);
297
+ background: var(--wr-window-chrome-action-hover-bg);
298
+ }
299
+
300
+ &:active {
301
+ color: var(--wr-window-chrome-action-active-color);
302
+ background: var(--wr-window-chrome-action-active-bg);
196
303
  }
197
304
 
198
305
  &--close:hover {
199
- color: var(--wr-color-surface);
200
- background: var(--wr-color-danger);
306
+ color: var(--wr-window-chrome-action-close-hover-color);
307
+ background: var(--wr-window-chrome-action-close-hover-bg);
308
+ }
309
+
310
+ &--close:active {
311
+ color: var(--wr-window-chrome-action-close-hover-color);
312
+ background: var(--wr-window-chrome-action-close-active-bg);
313
+ }
314
+ }
315
+
316
+ // Each OS draws its glyph on its own grid (10px Windows, 16px GNOME, 8px
317
+ // macOS) and the button centres it; the size is set per preset below, in rem
318
+ // so it scales with the text, which at the default root size is the whole
319
+ // pixel the glyph was drawn for.
320
+ &__chrome-action-glyph {
321
+ position: relative;
322
+ flex: 0 0 auto;
323
+ display: block;
324
+ pointer-events: none;
325
+ }
326
+
327
+ // OS preset: Windows 11 — caption buttons 46px wide and as tall as the bar,
328
+ // flush with the frame, with 10px glyphs; a subtle tint
329
+ // on hover and the platform's red behind close.
330
+ //
331
+ // RTL: Windows mirrors the whole title bar in a right-to-left UI, close
332
+ // included, so the strip follows `dir` like every other flex row here.
333
+ &--os-windows {
334
+ .wr-window__chrome {
335
+ --wr-window-chrome-padding-inline-end: 0;
336
+ }
337
+ .wr-window__chrome-actions {
338
+ --wr-window-chrome-actions-gap: 0;
339
+ }
340
+ .wr-window__chrome-action {
341
+ --wr-window-chrome-action-radius: 0;
342
+ --wr-window-chrome-action-width: 2.875rem;
343
+ // Windows 11's own close colours: #c42b1c behind a white glyph, 90% of it
344
+ // when pressed. A platform colour, like the traffic lights, not an intent.
345
+ --wr-window-chrome-action-close-hover-color: #fff;
346
+ --wr-window-chrome-action-close-hover-bg: #c42b1c;
347
+ --wr-window-chrome-action-close-active-bg: color-mix(in srgb, #c42b1c 90%, transparent);
348
+
349
+ align-self: stretch;
350
+ height: auto;
351
+
352
+ // Inset: the strip runs flush to the frame, and to the viewport edge when
353
+ // the window is maximized, where an outset ring would be cut off. The
354
+ // halo moves inside with it, still under the outline.
355
+ // Lifted over the line under the bar, which would otherwise cover the
356
+ // ring's bottom edge.
357
+ &:focus-visible {
358
+ z-index: 1;
359
+ outline-offset: calc(var(--wr-focus-ring-width) * -1);
360
+ box-shadow: inset 0 0 0 calc(var(--wr-focus-ring-width) + var(--wr-focus-ring-offset)) var(--wr-focus-ring-halo);
361
+ }
362
+ }
363
+ // Close sits in the frame's corner, so its red follows the frame's curve.
364
+ .wr-window__chrome-action--close {
365
+ @include _corner(border-start-end-radius, var(--wr-window-radius));
366
+ }
367
+ .wr-window__chrome-action-glyph {
368
+ width: 0.625rem;
369
+ height: 0.625rem;
370
+ }
371
+
372
+ &.wr-window--chrome-sm .wr-window__chrome-action {
373
+ --wr-window-chrome-action-width: 2.25rem;
201
374
  }
202
375
  }
203
376
 
204
- // OS preset: macOS — traffic-light dots, LEFT-aligned, colored
205
- // (close = red, minimize = yellow, maximize = green).
377
+ // OS preset: macOS — traffic lights (close red, minimize yellow, zoom green)
378
+ // at the start of the bar, glyphs on hover.
206
379
  //
207
- // Native macOS hides the glyphs (×, −, +) until the cursor enters the
208
- // cluster. Mirror that.
380
+ // The button is a 28px hit target and the dot is its `::before`: 16px dots
381
+ // 28px apart hold macOS's own 12px dot to its 28px title bar, scaled to this
382
+ // 36px one, and the light a pointer has to land on is a third larger than
383
+ // macOS draws it. The compact bar keeps 24px targets with 14px dots in them.
384
+ // Both clear WCAG 2.5.8, which the original 14px buttons did not.
385
+ //
386
+ // RTL: macOS mirrors its window chrome in a right-to-left UI, so the lights
387
+ // move to the other edge with close still outermost. `row-reverse` resolves
388
+ // against `dir`, which is what does it.
209
389
  &--os-macos {
390
+ --wr-window-action-size: 1.75rem;
391
+
210
392
  .wr-window__chrome {
393
+ // The close dot's centre is as far from the side of the frame as from its
394
+ // top, which is where macOS puts it.
395
+ --wr-window-chrome-padding-inline-start: calc(
396
+ (var(--wr-window-chrome-height) - var(--wr-window-action-size)) / 2
397
+ );
398
+
211
399
  flex-direction: row-reverse;
212
400
  }
213
401
  .wr-window__title {
214
402
  text-align: center;
215
403
  // Counterbalance the cluster, which `row-reverse` parks on the opposite
216
- // edge. `row-reverse` resolves against `dir`, so under RTL the dots move
217
- // to the other edge and this gutter has to follow them.
218
- padding-inline-end: 5rem;
404
+ // edge, so the title centres on the whole bar rather than on what is left.
405
+ // The template writes how many lights it drew: a window without minimize
406
+ // has a two-light cluster, and three lights' worth put its title 12px off.
407
+ padding-inline-end: calc(
408
+ var(--wr-window-chrome-padding-inline-start) + var(--wr-window-chrome-action-count, 3) *
409
+ var(--wr-window-action-size) - var(--wr-window-chrome-padding-inline-end)
410
+ );
411
+ }
412
+ // `row-reverse` puts the slot between the lights and the title, so its gap
413
+ // goes on the lights' side: on the inline end it sat between the badge and
414
+ // the title and left the badge touching the zoom light.
415
+ .wr-window__title-extra {
416
+ padding-inline-start: var(--wr-window-title-extra-padding-inline-end);
417
+ padding-inline-end: 0;
219
418
  }
220
419
  .wr-window__chrome-actions {
221
- --wr-window-chrome-actions-gap: var(--wr-space-sm);
222
- // gap from the edge the cluster is parked on
223
- --wr-window-chrome-actions-padding-inline-start: var(--wr-space-sm);
420
+ --wr-window-chrome-actions-gap: 0;
421
+ --wr-window-chrome-actions-padding-inline-start: 0;
224
422
  }
225
423
  .wr-window__chrome-action {
226
- width: 0.875rem; // 14px — bigger than the prior 12px to match native
227
- height: 0.875rem;
228
- border-radius: 50%;
229
- color: color-mix(in srgb, var(--wr-color-black) 55%, transparent); // glyph color (revealed on hover)
230
-
231
- &--close,
232
- &--close:hover {
233
- background: #ff5f57;
234
- }
235
- &--minimize,
236
- &--minimize:hover {
237
- background: #febc2e;
424
+ --wr-window-traffic-light-size: 1rem;
425
+ // A tint of the text colour rather than a fill token: the fills sit a
426
+ // step from the bar in the dark scheme, which left the grey lights all
427
+ // but invisible there.
428
+ --wr-window-traffic-light-inactive-bg: color-mix(in srgb, var(--wr-color-on-surface) 22%, transparent);
429
+ --wr-window-chrome-action-radius: 50%;
430
+ --wr-window-chrome-action-color: var(--wr-window-traffic-light-color);
431
+ --wr-window-chrome-action-hover-bg: transparent;
432
+ --wr-window-chrome-action-active-color: var(--wr-window-traffic-light-color);
433
+ --wr-window-chrome-action-active-bg: transparent;
434
+ --wr-window-chrome-action-close-hover-color: var(--wr-window-traffic-light-color);
435
+ --wr-window-chrome-action-close-hover-bg: transparent;
436
+ --wr-window-chrome-action-close-active-bg: transparent;
437
+
438
+ &::before {
439
+ content: '';
440
+ position: absolute;
441
+ inset: 0;
442
+ margin: auto;
443
+ width: var(--wr-window-traffic-light-size);
444
+ height: var(--wr-window-traffic-light-size);
445
+ border-radius: 50%;
446
+ background: var(--wr-window-traffic-light-bg);
447
+ // The darker rim every light has, which keeps the yellow readable on
448
+ // a light bar.
449
+ box-shadow: inset 0 0 0 0.5px rgb(0 0 0 / 15%);
238
450
  }
239
- &--maximize,
240
- &--maximize:hover {
241
- background: #28c840;
451
+
452
+ // Hovering only reveals the glyphs; pressing darkens the light.
453
+ &:active::before {
454
+ filter: brightness(0.82);
242
455
  }
243
456
 
244
- &:hover {
245
- filter: brightness(0.92);
457
+ // Hug the dot rather than the 24px box around it.
458
+ &:focus-visible {
459
+ outline-offset: calc(
460
+ var(--wr-focus-ring-offset) - (var(--wr-window-action-size) - var(--wr-window-traffic-light-size)) / 2
461
+ );
462
+ box-shadow: none;
246
463
  }
247
464
  }
248
- // Glyphs are invisible by default and fade in as soon as the cursor
249
- // enters the cluster — native macOS behaviour.
465
+ .wr-window__chrome-action--close {
466
+ --wr-window-traffic-light-bg: #ff5f57;
467
+ --wr-window-traffic-light-color: #4d0000;
468
+ }
469
+ .wr-window__chrome-action--minimize {
470
+ --wr-window-traffic-light-bg: #febc2e;
471
+ --wr-window-traffic-light-color: #995700;
472
+ }
473
+ .wr-window__chrome-action--maximize {
474
+ --wr-window-traffic-light-bg: #28c840;
475
+ --wr-window-traffic-light-color: #006500;
476
+ }
477
+ // Hidden until the cursor enters the cluster, as on macOS, and shown while a
478
+ // light holds keyboard focus, so a keyboard user can see what it does.
250
479
  .wr-window__chrome-action-glyph {
251
- width: 100%;
252
- height: 100%;
480
+ width: 0.5rem;
481
+ height: 0.5rem;
253
482
  opacity: 0;
254
- transition: opacity 0.12s ease;
483
+ transition: opacity var(--wr-transition-short);
255
484
  }
256
- .wr-window__chrome-actions:hover .wr-window__chrome-action-glyph {
485
+ .wr-window__chrome-actions:hover .wr-window__chrome-action-glyph,
486
+ .wr-window__chrome-action:focus-visible .wr-window__chrome-action-glyph {
257
487
  opacity: 1;
258
488
  }
489
+ // A rule of its own: Firefox 120, inside the browser floor, has no `:has()`,
490
+ // and one unknown selector would drop the hover reveal above with it. There
491
+ // the focused light alone shows its glyph.
492
+ .wr-window__chrome-actions:has(:focus-visible) .wr-window__chrome-action-glyph {
493
+ opacity: 1;
494
+ }
495
+
496
+ // An inactive window's lights go grey until the cursor enters the
497
+ // cluster or a light takes focus, as on macOS.
498
+ &.wr-window--inactive .wr-window__chrome-actions:not(:hover, :focus-within) .wr-window__chrome-action {
499
+ --wr-window-traffic-light-bg: var(--wr-window-traffic-light-inactive-bg);
500
+ }
501
+
502
+ &.wr-window--chrome-sm {
503
+ --wr-window-action-size: 1.5rem;
504
+
505
+ .wr-window__chrome-action {
506
+ --wr-window-traffic-light-size: 0.875rem;
507
+ }
508
+ }
259
509
  }
260
510
 
261
- // OS preset: Linux (GNOME-style) — chrome-action retains the windows
262
- // look but the chrome bar is slightly taller and the
263
- // title stays left-aligned. Close-only is the template's
264
- // DEFAULT here, not a rule: `[showMinimize]="true"` puts
265
- // the button back.
511
+ // OS preset: Linux (GNOME) — libadwaita's window controls: 24px circles
512
+ // tinted with the text colour (10% at rest, 15% on hover,
513
+ // 30% pressed), close included, which GNOME does not paint
514
+ // red. Close-only is the template's DEFAULT here, not a
515
+ // rule: `[showMinimize]="true"` puts the button back.
516
+ //
517
+ // RTL: GTK mirrors the header bar in a right-to-left UI, so the controls move
518
+ // to the other edge with close outermost — the flex row follows `dir`.
266
519
  &--os-linux {
520
+ // A variable rather than a `height` on the bar, so `chromeSize: 'sm'` can
521
+ // still shrink it; a literal height here kept the compact bar 40px tall.
522
+ --wr-window-chrome-height: 2.5rem;
523
+
524
+ // The compact bar keeps the 16px glyphs, so its circles stop at 20px rather
525
+ // than the 18px the other chromes use: an 8px glyph in an 18px circle crowds
526
+ // it, and libadwaita's own small header keeps the same proportion.
527
+ &.wr-window--chrome-sm {
528
+ --wr-window-chrome-height: 1.625rem;
529
+ --wr-window-action-size: 1.25rem;
530
+ }
531
+
267
532
  .wr-window__chrome {
268
- height: 2.5rem;
533
+ // The close circle as far from the side of the frame as from its top.
534
+ --wr-window-chrome-padding-inline-end: calc((var(--wr-window-chrome-height) - var(--wr-window-action-size)) / 2);
269
535
  }
270
536
  .wr-window__title {
271
537
  --wr-window-title-font-weight: var(--wr-font-weight-medium);
272
538
  }
539
+ .wr-window__chrome-actions {
540
+ --wr-window-chrome-actions-gap: var(--wr-space-md);
541
+ }
542
+ .wr-window__chrome-action {
543
+ --wr-window-chrome-action-radius: 50%;
544
+ --wr-window-chrome-action-bg: color-mix(in srgb, currentColor 10%, transparent);
545
+ --wr-window-chrome-action-hover-bg: color-mix(in srgb, currentColor 15%, transparent);
546
+ --wr-window-chrome-action-active-color: var(--wr-window-chrome-action-color);
547
+ --wr-window-chrome-action-active-bg: color-mix(in srgb, currentColor 30%, transparent);
548
+ --wr-window-chrome-action-close-hover-color: var(--wr-window-chrome-action-color);
549
+ --wr-window-chrome-action-close-hover-bg: var(--wr-window-chrome-action-hover-bg);
550
+ --wr-window-chrome-action-close-active-bg: var(--wr-window-chrome-action-active-bg);
551
+
552
+ // libadwaita rims each circle when the reader asks for more contrast.
553
+ @media (prefers-contrast: more) {
554
+ box-shadow: inset 0 0 0 1px var(--wr-border-strong);
555
+ }
556
+ }
557
+ .wr-window__chrome-action-glyph {
558
+ width: 1rem;
559
+ height: 1rem;
560
+ }
561
+ }
562
+
563
+ // Forced colours drop every fill above, the traffic lights with them. The
564
+ // buttons opt out and repaint in system colours: a rim where the shape is the
565
+ // only cue (the lights, GNOME's circles), Highlight on hover and press, and
566
+ // the macOS glyphs always on, since a bare rim says nothing about what it does.
567
+ @media (forced-colors: active) {
568
+ &__chrome-action {
569
+ forced-color-adjust: none;
570
+ color: ButtonText;
571
+ // Transparent at rest, as outside forced colours, so the strip reads as
572
+ // part of the bar rather than as a row of ButtonFace boxes.
573
+ background: transparent;
574
+
575
+ &:hover,
576
+ &:active,
577
+ &--close:hover,
578
+ &--close:active {
579
+ color: HighlightText;
580
+ background: Highlight;
581
+ }
582
+
583
+ &:focus-visible {
584
+ outline-color: CanvasText;
585
+ }
586
+ }
587
+
588
+ &--os-linux .wr-window__chrome-action {
589
+ box-shadow: inset 0 0 0 1px ButtonText;
590
+ }
591
+
592
+ &--os-macos {
593
+ .wr-window__chrome-action,
594
+ .wr-window__chrome-action:hover,
595
+ .wr-window__chrome-action:active {
596
+ color: ButtonText;
597
+ background: transparent;
598
+
599
+ &::before {
600
+ background: ButtonFace;
601
+ box-shadow: inset 0 0 0 1px ButtonText;
602
+ filter: none;
603
+ }
604
+ }
605
+ .wr-window__chrome-action:hover,
606
+ .wr-window__chrome-action:active {
607
+ color: HighlightText;
608
+
609
+ &::before {
610
+ background: Highlight;
611
+ box-shadow: none;
612
+ }
613
+ }
614
+ .wr-window__chrome-action-glyph {
615
+ opacity: 1;
616
+ }
617
+ }
273
618
  }
274
619
 
275
620
  // Body
@@ -313,6 +658,19 @@
313
658
  display: none;
314
659
  }
315
660
 
661
+ // The keyboard modes' live region: read, never drawn.
662
+ &__sr-only {
663
+ position: absolute;
664
+ width: 1px;
665
+ height: 1px;
666
+ padding: 0;
667
+ margin: -1px;
668
+ overflow: hidden;
669
+ clip: rect(0, 0, 0, 0);
670
+ white-space: nowrap;
671
+ border: 0;
672
+ }
673
+
316
674
  // Resize handles (only rendered in normal state).
317
675
  //
318
676
  // Every grip sits ENTIRELY OUTSIDE the padding box — the band the drop shadow
@@ -333,6 +691,9 @@
333
691
  &__handle {
334
692
  position: absolute;
335
693
  z-index: 1;
694
+ // A touch drag on a grip resizes; without this the browser took it as a
695
+ // page pan, fired `pointercancel` and stopped the resize after a few pixels.
696
+ touch-action: none;
336
697
 
337
698
  &--t {
338
699
  bottom: 100%;
@@ -407,8 +768,14 @@
407
768
  }
408
769
  }
409
770
 
410
- // Snap hint — translucent rectangle showing the target region the
411
- // window will jump into when the pointer is released.
771
+ // Snap hint — translucent rectangle showing the region the window will jump
772
+ // into when the pointer is released. Its box is written inline,
773
+ // from the same arithmetic the drop uses, so the two agree with
774
+ // a scrollbar showing and inside a custom work area. So is its
775
+ // z-index, one above the window's own: the two share an overlay
776
+ // host, and the window's z climbs with every raise, so this
777
+ // fallback alone put the hint behind a window raised a hundred
778
+ // times.
412
779
  .wr-window__snap-hint {
413
780
  --wr-window-snap-hint-radius: var(--wr-border-radius-base);
414
781
 
@@ -418,32 +785,14 @@
418
785
  background: color-mix(in srgb, var(--wr-color-primary) 18%, transparent);
419
786
  border: 2px solid var(--wr-color-primary);
420
787
  border-radius: var(--wr-window-snap-hint-radius);
421
- transition: all 0.12s ease;
788
+ transition:
789
+ left 0.12s ease,
790
+ top 0.12s ease,
791
+ width 0.12s ease,
792
+ height 0.12s ease;
422
793
 
423
- // rtl-ok: the `inset` shorthands below paint physical screen regions, not
424
- // reading-order ones. `detectSnapTarget` picks `left` from `clientX <= 12`
425
- // and `applySnap` answers with `x = 0`, so the hint has to cover the same
426
- // half of the viewport the window is about to jump into.
427
- &[data-target='top'] {
428
- inset: 0;
429
- }
430
- &[data-target='left'] {
431
- inset: 0 50% 0 0;
432
- }
433
- &[data-target='right'] {
434
- inset: 0 0 0 50%;
435
- }
436
- &[data-target='top-left'] {
437
- inset: 0 50% 50% 0;
438
- }
439
- &[data-target='top-right'] {
440
- inset: 0 0 50% 50%;
441
- }
442
- &[data-target='bottom-left'] {
443
- inset: 50% 50% 0 0;
444
- }
445
- &[data-target='bottom-right'] {
446
- inset: 50% 0 0 50%;
794
+ @media (prefers-reduced-motion: reduce) {
795
+ transition: none;
447
796
  }
448
797
  }
449
798
 
@@ -452,11 +801,14 @@
452
801
  --wr-window-taskbar-font-family: var(--wr-font-family-base);
453
802
 
454
803
  position: fixed;
455
- // rtl-ok: centred with a physical translateX, so the pair must stay physical
456
- left: 50%;
457
- transform: translateX(-50%);
804
+ // Both inline edges rather than `left: 50%` and a translate: a box pinned at
805
+ // the middle could only ever be half the viewport wide before it overflowed,
806
+ // and the rail ran off both sides of a phone with four windows listed. The
807
+ // host spans the page and lets presses through; the rail is centred in it.
808
+ inset-inline: 0.75rem;
458
809
  z-index: var(--wr-z-window, 1100);
459
- display: block;
810
+ display: flex;
811
+ justify-content: center;
460
812
  pointer-events: none;
461
813
  font-family: var(--wr-window-taskbar-font-family);
462
814
 
@@ -473,8 +825,15 @@
473
825
  --wr-window-taskbar-rail-border: var(--wr-border-base);
474
826
  --wr-window-taskbar-rail-radius: var(--wr-border-radius-base);
475
827
 
476
- display: inline-flex;
828
+ display: flex;
829
+ // One row, always. Each tab is as wide as its title, up to its max-width,
830
+ // and the ones that do not fit fold under the "+N" button at the end — the
831
+ // component counts them from those widths, the gap and the rail's own width.
832
+ flex-wrap: nowrap;
477
833
  align-items: center;
834
+ justify-content: center;
835
+ min-inline-size: 0;
836
+ max-inline-size: 100%;
478
837
  gap: var(--wr-window-taskbar-rail-gap);
479
838
  padding: var(--wr-window-taskbar-rail-padding);
480
839
  background: var(--wr-color-surface);
@@ -494,8 +853,21 @@
494
853
  --wr-window-taskbar-tab-radius: var(--wr-border-radius-sm);
495
854
  --wr-window-taskbar-tab-font-size: var(--wr-text-sm);
496
855
  --wr-window-taskbar-tab-line-height: var(--wr-text-sm-leading);
856
+ --wr-window-taskbar-tab-active-bg: var(--wr-color-fill);
857
+ --wr-window-taskbar-tab-active-indicator: var(--wr-color-primary);
858
+ --wr-window-taskbar-tab-minimized-color: var(--wr-color-on-surface-muted);
859
+ // The widest a tab grows for a long title, which then ends in an ellipsis.
860
+ // The component reads it back as the computed `max-width`, so it counts
861
+ // what fits from the same number. Give it a length: a percentage resolves
862
+ // against the rail for a drawn tab and the host for a folded one.
863
+ --wr-window-taskbar-tab-max-width: 12rem;
497
864
 
498
865
  display: inline-flex;
866
+ // As wide as the title, never wider than the cap. It shrinks only when one
867
+ // tab is all the rail has left and even that does not fit.
868
+ flex: 0 1 auto;
869
+ min-width: 0;
870
+ max-width: var(--wr-window-taskbar-tab-max-width);
499
871
  align-items: center;
500
872
  gap: var(--wr-window-taskbar-tab-gap);
501
873
  // Roomy where the title starts, tight against the trailing close button,
@@ -505,12 +877,36 @@
505
877
  color: var(--wr-color-on-surface);
506
878
  font-size: var(--wr-window-taskbar-tab-font-size);
507
879
  line-height: var(--wr-window-taskbar-tab-line-height);
508
- max-width: 12rem;
509
880
  transition: background var(--wr-transition-base);
510
881
 
511
882
  &:hover {
512
883
  background: var(--wr-color-fill-strong);
513
884
  }
885
+
886
+ // `show="all"`: the active window's tab is filled, the way a desktop
887
+ // taskbar marks the window that has the keyboard; `aria-pressed` says the
888
+ // same to a screen reader.
889
+ &--active {
890
+ background: var(--wr-window-taskbar-tab-active-bg);
891
+ box-shadow: inset 0 -2px 0 var(--wr-window-taskbar-tab-active-indicator);
892
+ }
893
+
894
+ // A minimized window's tab in `show="all"` reads quieter than the windows
895
+ // on screen.
896
+ &--minimized {
897
+ color: var(--wr-window-taskbar-tab-minimized-color);
898
+ }
899
+
900
+ // Folded under "+N": out of the row and out of sight, but still laid out at
901
+ // the width its title asks for, so the rail can tell when it fits again.
902
+ &--folded {
903
+ position: absolute;
904
+ inset-block-start: 0;
905
+ inset-inline-start: 0;
906
+ width: max-content;
907
+ visibility: hidden;
908
+ pointer-events: none;
909
+ }
514
910
  }
515
911
 
516
912
  &__tab-restore {
@@ -548,6 +944,56 @@
548
944
  white-space: nowrap;
549
945
  }
550
946
 
947
+ // "+N": the tabs that did not fit, as a menu. As tall as a tab and wide
948
+ // enough for a two-digit count, so its width rarely moves the fold.
949
+ &__more {
950
+ --wr-window-taskbar-more-min-width: 2.5rem;
951
+ --wr-window-taskbar-more-padding-inline: var(--wr-space-sm);
952
+ --wr-window-taskbar-more-radius: var(--wr-border-radius-sm);
953
+ --wr-window-taskbar-more-color: var(--wr-color-on-surface);
954
+ --wr-window-taskbar-more-hover-bg: var(--wr-color-fill-strong);
955
+ --wr-window-taskbar-more-open-bg: var(--wr-color-fill);
956
+
957
+ appearance: none;
958
+ flex: 0 0 auto;
959
+ align-self: stretch;
960
+ min-inline-size: var(--wr-window-taskbar-more-min-width);
961
+ padding-block: 0;
962
+ padding-inline: var(--wr-window-taskbar-more-padding-inline);
963
+ border: 0;
964
+ border-radius: var(--wr-window-taskbar-more-radius);
965
+ background: transparent;
966
+ color: var(--wr-window-taskbar-more-color);
967
+ font-family: inherit;
968
+ font-size: var(--wr-text-sm);
969
+ font-variant-numeric: tabular-nums;
970
+ line-height: var(--wr-text-sm-leading);
971
+ white-space: nowrap;
972
+ cursor: pointer;
973
+ transition: background-color var(--wr-transition-base);
974
+
975
+ &:hover {
976
+ background: var(--wr-window-taskbar-more-hover-bg);
977
+ }
978
+
979
+ &[aria-expanded='true'] {
980
+ background: var(--wr-window-taskbar-more-open-bg);
981
+ }
982
+
983
+ &:focus-visible {
984
+ @include theme.focus-ring;
985
+ outline-offset: -2px;
986
+ }
987
+ }
988
+
989
+ // A row of the "+N" menu. It renders in the overlay, outside the rail, so it
990
+ // carries its own copy of the muted tone a minimized window's tab has.
991
+ &__fold-item--minimized {
992
+ --wr-window-taskbar-fold-item-minimized-color: var(--wr-color-on-surface-muted);
993
+
994
+ color: var(--wr-window-taskbar-fold-item-minimized-color);
995
+ }
996
+
551
997
  &__tab-close {
552
998
  --wr-window-taskbar-tab-close-radius: var(--wr-border-radius-sm);
553
999