ngwr 15.0.0-rc.2 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/README.md +18 -12
  2. package/affix/styles/_index.scss +12 -3
  3. package/avatar/styles/_index.scss +11 -0
  4. package/badge/styles/_index.scss +15 -9
  5. package/bits/decrypt-text/decrypt-text.scss +1 -1
  6. package/bits/decrypt-text/styles/_index.scss +15 -26
  7. package/bits/decrypt-text/styles/_rules.scss +40 -0
  8. package/bits/falling-text/styles/_rules.scss +14 -1
  9. package/bits/marquee/styles/_rules.scss +49 -0
  10. package/bits/typewriter/styles/_rules.scss +12 -0
  11. package/breadcrumbs/styles/_rules.scss +5 -2
  12. package/button/styles/_index.scss +18 -8
  13. package/carousel/styles/_index.scss +15 -1
  14. package/charts/bar-chart/styles/_index.scss +23 -1
  15. package/charts/calendar-heatmap/styles/_index.scss +4 -0
  16. package/charts/donut-chart/styles/_index.scss +3 -0
  17. package/charts/line-chart/styles/_index.scss +94 -11
  18. package/charts/meter-group/styles/_index.scss +19 -4
  19. package/charts/sparkline/styles/_index.scss +4 -1
  20. package/compare/styles/_index.scss +8 -1
  21. package/dialog/styles/_index.scss +13 -3
  22. package/fesm2022/ngwr-affix.mjs +64 -2
  23. package/fesm2022/ngwr-affix.mjs.map +1 -1
  24. package/fesm2022/ngwr-alert.mjs +16 -1
  25. package/fesm2022/ngwr-alert.mjs.map +1 -1
  26. package/fesm2022/ngwr-anchor.mjs +25 -0
  27. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  28. package/fesm2022/ngwr-avatar.mjs +7 -5
  29. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  30. package/fesm2022/ngwr-bits-aurora.mjs +30 -13
  31. package/fesm2022/ngwr-bits-aurora.mjs.map +1 -1
  32. package/fesm2022/ngwr-bits-blur-text.mjs +16 -5
  33. package/fesm2022/ngwr-bits-blur-text.mjs.map +1 -1
  34. package/fesm2022/ngwr-bits-border-glow.mjs +1 -1
  35. package/fesm2022/ngwr-bits-circular-text.mjs +1 -1
  36. package/fesm2022/ngwr-bits-click-spark.mjs +1 -1
  37. package/fesm2022/ngwr-bits-confetti.mjs +14 -8
  38. package/fesm2022/ngwr-bits-confetti.mjs.map +1 -1
  39. package/fesm2022/ngwr-bits-decrypt-text.mjs +40 -14
  40. package/fesm2022/ngwr-bits-decrypt-text.mjs.map +1 -1
  41. package/fesm2022/ngwr-bits-falling-text.mjs +73 -34
  42. package/fesm2022/ngwr-bits-falling-text.mjs.map +1 -1
  43. package/fesm2022/ngwr-bits-fuzzy-text.mjs +102 -44
  44. package/fesm2022/ngwr-bits-fuzzy-text.mjs.map +1 -1
  45. package/fesm2022/ngwr-bits-marquee-testing.mjs +3 -0
  46. package/fesm2022/ngwr-bits-marquee-testing.mjs.map +1 -1
  47. package/fesm2022/ngwr-bits-marquee.mjs +47 -13
  48. package/fesm2022/ngwr-bits-marquee.mjs.map +1 -1
  49. package/fesm2022/ngwr-bits-rotating-text.mjs +11 -6
  50. package/fesm2022/ngwr-bits-rotating-text.mjs.map +1 -1
  51. package/fesm2022/ngwr-bits-splash-cursor.mjs +51 -5
  52. package/fesm2022/ngwr-bits-splash-cursor.mjs.map +1 -1
  53. package/fesm2022/ngwr-bits-split-text.mjs +10 -3
  54. package/fesm2022/ngwr-bits-split-text.mjs.map +1 -1
  55. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs +1 -1
  56. package/fesm2022/ngwr-bits-spotlight-card-testing.mjs.map +1 -1
  57. package/fesm2022/ngwr-bits-spotlight-card.mjs +11 -3
  58. package/fesm2022/ngwr-bits-spotlight-card.mjs.map +1 -1
  59. package/fesm2022/ngwr-bits-typewriter-testing.mjs +6 -0
  60. package/fesm2022/ngwr-bits-typewriter-testing.mjs.map +1 -1
  61. package/fesm2022/ngwr-bits-typewriter.mjs +14 -8
  62. package/fesm2022/ngwr-bits-typewriter.mjs.map +1 -1
  63. package/fesm2022/ngwr-bits-waves.mjs +29 -16
  64. package/fesm2022/ngwr-bits-waves.mjs.map +1 -1
  65. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  66. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  67. package/fesm2022/ngwr-button.mjs +22 -5
  68. package/fesm2022/ngwr-button.mjs.map +1 -1
  69. package/fesm2022/ngwr-calendar.mjs +4 -1
  70. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  71. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
  72. package/fesm2022/ngwr-carousel.mjs +21 -5
  73. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  74. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
  75. package/fesm2022/ngwr-cascader.mjs +116 -6
  76. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  77. package/fesm2022/ngwr-charts-bar-chart-testing.mjs +4 -4
  78. package/fesm2022/ngwr-charts-bar-chart-testing.mjs.map +1 -1
  79. package/fesm2022/ngwr-charts-bar-chart.mjs +38 -6
  80. package/fesm2022/ngwr-charts-bar-chart.mjs.map +1 -1
  81. package/fesm2022/ngwr-charts-calendar-heatmap.mjs +31 -5
  82. package/fesm2022/ngwr-charts-calendar-heatmap.mjs.map +1 -1
  83. package/fesm2022/ngwr-charts-donut-chart.mjs +32 -6
  84. package/fesm2022/ngwr-charts-donut-chart.mjs.map +1 -1
  85. package/fesm2022/ngwr-charts-gauge.mjs +30 -4
  86. package/fesm2022/ngwr-charts-gauge.mjs.map +1 -1
  87. package/fesm2022/ngwr-charts-line-chart-testing.mjs.map +1 -1
  88. package/fesm2022/ngwr-charts-line-chart.mjs +117 -48
  89. package/fesm2022/ngwr-charts-line-chart.mjs.map +1 -1
  90. package/fesm2022/ngwr-charts-meter-group.mjs +30 -5
  91. package/fesm2022/ngwr-charts-meter-group.mjs.map +1 -1
  92. package/fesm2022/ngwr-charts-sparkline.mjs +42 -12
  93. package/fesm2022/ngwr-charts-sparkline.mjs.map +1 -1
  94. package/fesm2022/ngwr-checkbox.mjs +18 -2
  95. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  96. package/fesm2022/ngwr-color-picker.mjs +47 -10
  97. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  98. package/fesm2022/ngwr-command-palette.mjs +11 -0
  99. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  100. package/fesm2022/ngwr-compare.mjs +19 -7
  101. package/fesm2022/ngwr-compare.mjs.map +1 -1
  102. package/fesm2022/ngwr-counter.mjs +32 -18
  103. package/fesm2022/ngwr-counter.mjs.map +1 -1
  104. package/fesm2022/ngwr-date-picker.mjs +109 -15
  105. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  106. package/fesm2022/ngwr-date.mjs +97 -32
  107. package/fesm2022/ngwr-date.mjs.map +1 -1
  108. package/fesm2022/ngwr-density.mjs +24 -1
  109. package/fesm2022/ngwr-density.mjs.map +1 -1
  110. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
  111. package/fesm2022/ngwr-drawer.mjs +40 -11
  112. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  113. package/fesm2022/ngwr-editor.mjs +1 -1
  114. package/fesm2022/ngwr-event-calendar.mjs +26 -15
  115. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  116. package/fesm2022/ngwr-file-upload.mjs +18 -5
  117. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  118. package/fesm2022/ngwr-form.mjs.map +1 -1
  119. package/fesm2022/ngwr-i18n-ar.mjs +5 -5
  120. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  121. package/fesm2022/ngwr-i18n-cs.mjs +5 -5
  122. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  123. package/fesm2022/ngwr-i18n-de.mjs +5 -5
  124. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  125. package/fesm2022/ngwr-i18n-en.mjs +5 -5
  126. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  127. package/fesm2022/ngwr-i18n-es.mjs +5 -5
  128. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  129. package/fesm2022/ngwr-i18n-fr.mjs +5 -5
  130. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  131. package/fesm2022/ngwr-i18n-he.mjs +5 -5
  132. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  133. package/fesm2022/ngwr-i18n-hi.mjs +5 -5
  134. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  135. package/fesm2022/ngwr-i18n-id.mjs +5 -5
  136. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  137. package/fesm2022/ngwr-i18n-it.mjs +5 -5
  138. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  139. package/fesm2022/ngwr-i18n-ja.mjs +5 -5
  140. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  141. package/fesm2022/ngwr-i18n-ko.mjs +5 -5
  142. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  143. package/fesm2022/ngwr-i18n-nl.mjs +5 -5
  144. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  145. package/fesm2022/ngwr-i18n-pl.mjs +5 -5
  146. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  147. package/fesm2022/ngwr-i18n-pt.mjs +5 -5
  148. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  149. package/fesm2022/ngwr-i18n-ru.mjs +5 -5
  150. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  151. package/fesm2022/ngwr-i18n-sv.mjs +5 -5
  152. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  153. package/fesm2022/ngwr-i18n-tr.mjs +5 -5
  154. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  155. package/fesm2022/ngwr-i18n-uk.mjs +5 -5
  156. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  157. package/fesm2022/ngwr-i18n-vi.mjs +5 -5
  158. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  159. package/fesm2022/ngwr-i18n-zh-tw.mjs +5 -5
  160. package/fesm2022/ngwr-i18n-zh-tw.mjs.map +1 -1
  161. package/fesm2022/ngwr-i18n-zh.mjs +5 -5
  162. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  163. package/fesm2022/ngwr-image-cropper.mjs +9 -4
  164. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  165. package/fesm2022/ngwr-input-number.mjs +27 -2
  166. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  167. package/fesm2022/ngwr-input-otp.mjs +8 -3
  168. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  169. package/fesm2022/ngwr-knob.mjs +7 -13
  170. package/fesm2022/ngwr-knob.mjs.map +1 -1
  171. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  172. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  173. package/fesm2022/ngwr-mention-testing.mjs +3 -1
  174. package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
  175. package/fesm2022/ngwr-mention.mjs +5 -2
  176. package/fesm2022/ngwr-mention.mjs.map +1 -1
  177. package/fesm2022/ngwr-meta.mjs +3 -1
  178. package/fesm2022/ngwr-meta.mjs.map +1 -1
  179. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  180. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  181. package/fesm2022/ngwr-pagination.mjs +2 -2
  182. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  183. package/fesm2022/ngwr-pipes.mjs +11 -3
  184. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  185. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
  186. package/fesm2022/ngwr-popconfirm.mjs +64 -12
  187. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  188. package/fesm2022/ngwr-popover.mjs +15 -3
  189. package/fesm2022/ngwr-popover.mjs.map +1 -1
  190. package/fesm2022/ngwr-pull-to-refresh.mjs +1 -1
  191. package/fesm2022/ngwr-qr.mjs +6 -2
  192. package/fesm2022/ngwr-qr.mjs.map +1 -1
  193. package/fesm2022/ngwr-schema-form.mjs +1 -0
  194. package/fesm2022/ngwr-schema-form.mjs.map +1 -1
  195. package/fesm2022/ngwr-select.mjs +7 -5
  196. package/fesm2022/ngwr-select.mjs.map +1 -1
  197. package/fesm2022/ngwr-sidebar.mjs +4 -4
  198. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  199. package/fesm2022/ngwr-sortable-list.mjs +6 -4
  200. package/fesm2022/ngwr-sortable-list.mjs.map +1 -1
  201. package/fesm2022/ngwr-splitter-testing.mjs +1 -1
  202. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
  203. package/fesm2022/ngwr-splitter.mjs +7 -6
  204. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  205. package/fesm2022/ngwr-statistic.mjs +20 -19
  206. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  207. package/fesm2022/ngwr-stepper-testing.mjs +1 -1
  208. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  209. package/fesm2022/ngwr-stepper.mjs +3 -2
  210. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  211. package/fesm2022/ngwr-table-testing.mjs +18 -0
  212. package/fesm2022/ngwr-table-testing.mjs.map +1 -1
  213. package/fesm2022/ngwr-table.mjs +191 -29
  214. package/fesm2022/ngwr-table.mjs.map +1 -1
  215. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  216. package/fesm2022/ngwr-tabs.mjs +16 -3
  217. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  218. package/fesm2022/ngwr-textarea.mjs +7 -5
  219. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  220. package/fesm2022/ngwr-theme.mjs +1 -1
  221. package/fesm2022/ngwr-toast.mjs +135 -14
  222. package/fesm2022/ngwr-toast.mjs.map +1 -1
  223. package/fesm2022/ngwr-tour.mjs +11 -2
  224. package/fesm2022/ngwr-tour.mjs.map +1 -1
  225. package/fesm2022/ngwr-transfer.mjs +9 -1
  226. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  227. package/fesm2022/ngwr-tree.mjs +43 -5
  228. package/fesm2022/ngwr-tree.mjs.map +1 -1
  229. package/fesm2022/ngwr-utils.mjs +54 -1
  230. package/fesm2022/ngwr-utils.mjs.map +1 -1
  231. package/fesm2022/ngwr-validators.mjs +16 -13
  232. package/fesm2022/ngwr-validators.mjs.map +1 -1
  233. package/fesm2022/ngwr-version.mjs +1 -1
  234. package/fesm2022/ngwr-version.mjs.map +1 -1
  235. package/fesm2022/ngwr-virtual-scroll.mjs +11 -1
  236. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  237. package/fesm2022/ngwr-window.mjs +160 -35
  238. package/fesm2022/ngwr-window.mjs.map +1 -1
  239. package/i18n/ar.json +3 -3
  240. package/i18n/cs.json +3 -3
  241. package/i18n/de.json +3 -3
  242. package/i18n/en.json +3 -3
  243. package/i18n/es.json +3 -3
  244. package/i18n/fr.json +3 -3
  245. package/i18n/he.json +3 -3
  246. package/i18n/hi.json +3 -3
  247. package/i18n/id.json +3 -3
  248. package/i18n/it.json +3 -3
  249. package/i18n/ja.json +3 -3
  250. package/i18n/ko.json +3 -3
  251. package/i18n/nl.json +3 -3
  252. package/i18n/pl.json +3 -3
  253. package/i18n/pt.json +3 -3
  254. package/i18n/ru.json +3 -3
  255. package/i18n/sv.json +3 -3
  256. package/i18n/tr.json +3 -3
  257. package/i18n/uk.json +3 -3
  258. package/i18n/vi.json +3 -3
  259. package/i18n/zh-TW.json +3 -3
  260. package/i18n/zh.json +3 -3
  261. package/input-number/styles/_index.scss +11 -1
  262. package/llms-full.txt +20 -6
  263. package/llms.txt +203 -107
  264. package/loading-bar/styles/_rules.scss +8 -0
  265. package/mcp/api.js +44 -6
  266. package/mcp/catalog.js +46 -17
  267. package/mcp/tools.js +125 -48
  268. package/package.json +1 -1
  269. package/popover/styles/_index.scss +3 -0
  270. package/progress/styles/_index.scss +12 -0
  271. package/schematics/collection.json +3 -3
  272. package/schematics/component-style/index.js +41 -26
  273. package/schematics/component-style/schema.json +2 -2
  274. package/schematics/icon-set/index.js +3 -3
  275. package/schematics/migrations/v14/index.js +2 -1
  276. package/schematics/migrations/v15/index.js +1236 -0
  277. package/schematics/migrations.json +5 -0
  278. package/schematics/ng-add/index.js +82 -37
  279. package/schematics/ng-add/schema.json +2 -2
  280. package/schematics/page/index.js +39 -1
  281. package/schematics/page/schema.json +1 -2
  282. package/schematics/page/templates.js +38 -14
  283. package/schematics/provider/index.js +99 -51
  284. package/schematics/provider/schema.json +11 -3
  285. package/schematics/use/index.js +2 -1
  286. package/schematics/use/rule.js +176 -28
  287. package/schematics/utility/global-styles.js +244 -0
  288. package/skeleton/styles/_index.scss +8 -0
  289. package/skills/ngwr/SKILL.md +46 -9
  290. package/skills/ngwr/references/catalog.md +4 -3
  291. package/skills/ngwr/references/setup.md +44 -4
  292. package/stepper/styles/_index.scss +14 -0
  293. package/styles/_grid.scss +7 -1
  294. package/table/styles/_index.scss +60 -1
  295. package/timeline/styles/_index.scss +22 -0
  296. package/toast/styles/_index.scss +6 -1
  297. package/types/ngwr-affix.d.ts +10 -0
  298. package/types/ngwr-alert.d.ts +14 -1
  299. package/types/ngwr-anchor.d.ts +11 -0
  300. package/types/ngwr-avatar.d.ts +14 -4
  301. package/types/ngwr-bits-aurora.d.ts +6 -1
  302. package/types/ngwr-bits-blur-text.d.ts +10 -0
  303. package/types/ngwr-bits-confetti.d.ts +7 -1
  304. package/types/ngwr-bits-decrypt-text.d.ts +14 -6
  305. package/types/ngwr-bits-falling-text.d.ts +10 -0
  306. package/types/ngwr-bits-fuzzy-text.d.ts +35 -2
  307. package/types/ngwr-bits-marquee-testing.d.ts +17 -5
  308. package/types/ngwr-bits-marquee.d.ts +31 -0
  309. package/types/ngwr-bits-rotating-text.d.ts +9 -0
  310. package/types/ngwr-bits-split-text.d.ts +10 -0
  311. package/types/ngwr-bits-spotlight-card-testing.d.ts +11 -11
  312. package/types/ngwr-bits-spotlight-card.d.ts +2 -0
  313. package/types/ngwr-bits-typewriter-testing.d.ts +18 -10
  314. package/types/ngwr-bits-typewriter.d.ts +7 -0
  315. package/types/ngwr-bits-waves.d.ts +4 -0
  316. package/types/ngwr-button.d.ts +24 -2
  317. package/types/ngwr-carousel-testing.d.ts +2 -1
  318. package/types/ngwr-carousel.d.ts +31 -1
  319. package/types/ngwr-cascader-testing.d.ts +12 -14
  320. package/types/ngwr-cascader.d.ts +53 -4
  321. package/types/ngwr-charts-bar-chart-testing.d.ts +7 -7
  322. package/types/ngwr-charts-bar-chart.d.ts +37 -4
  323. package/types/ngwr-charts-calendar-heatmap.d.ts +35 -5
  324. package/types/ngwr-charts-donut-chart.d.ts +25 -2
  325. package/types/ngwr-charts-gauge.d.ts +19 -2
  326. package/types/ngwr-charts-line-chart-testing.d.ts +1 -1
  327. package/types/ngwr-charts-line-chart.d.ts +92 -42
  328. package/types/ngwr-charts-meter-group.d.ts +24 -2
  329. package/types/ngwr-charts-sparkline.d.ts +30 -8
  330. package/types/ngwr-checkbox.d.ts +17 -0
  331. package/types/ngwr-color-picker.d.ts +17 -1
  332. package/types/ngwr-command-palette.d.ts +10 -0
  333. package/types/ngwr-compare.d.ts +13 -0
  334. package/types/ngwr-counter.d.ts +15 -7
  335. package/types/ngwr-date-picker.d.ts +36 -10
  336. package/types/ngwr-date.d.ts +41 -1
  337. package/types/ngwr-density.d.ts +75 -1
  338. package/types/ngwr-drawer-testing.d.ts +5 -1
  339. package/types/ngwr-drawer.d.ts +32 -4
  340. package/types/ngwr-event-calendar.d.ts +26 -1
  341. package/types/ngwr-file-upload.d.ts +11 -1
  342. package/types/ngwr-form.d.ts +3 -1
  343. package/types/ngwr-image-cropper.d.ts +13 -2
  344. package/types/ngwr-input-number.d.ts +2 -0
  345. package/types/ngwr-input-otp.d.ts +8 -0
  346. package/types/ngwr-knob.d.ts +11 -3
  347. package/types/ngwr-mention.d.ts +9 -1
  348. package/types/ngwr-overlay.d.ts +1 -1
  349. package/types/ngwr-pagination-testing.d.ts +5 -5
  350. package/types/ngwr-pipes.d.ts +5 -1
  351. package/types/ngwr-popconfirm-testing.d.ts +5 -5
  352. package/types/ngwr-popconfirm.d.ts +61 -3
  353. package/types/ngwr-popover.d.ts +20 -1
  354. package/types/ngwr-qr.d.ts +11 -2
  355. package/types/ngwr-select.d.ts +21 -2
  356. package/types/ngwr-sidebar.d.ts +8 -0
  357. package/types/ngwr-sortable-list.d.ts +19 -25
  358. package/types/ngwr-splitter-testing.d.ts +3 -3
  359. package/types/ngwr-statistic.d.ts +3 -1
  360. package/types/ngwr-stepper.d.ts +7 -0
  361. package/types/ngwr-table-testing.d.ts +37 -1
  362. package/types/ngwr-table.d.ts +186 -51
  363. package/types/ngwr-tabs-testing.d.ts +16 -15
  364. package/types/ngwr-tabs.d.ts +14 -0
  365. package/types/ngwr-toast.d.ts +4 -0
  366. package/types/ngwr-tour.d.ts +2 -0
  367. package/types/ngwr-transfer.d.ts +7 -1
  368. package/types/ngwr-tree.d.ts +21 -6
  369. package/types/ngwr-utils.d.ts +60 -2
  370. package/types/ngwr-validators.d.ts +11 -3
  371. package/types/ngwr-version.d.ts +1 -1
  372. package/types/ngwr-virtual-scroll.d.ts +1 -0
  373. package/types/ngwr-window.d.ts +72 -0
  374. package/window/styles/_index.scss +17 -0
package/README.md CHANGED
@@ -9,7 +9,7 @@ Signals-first UI components for Angular.
9
9
  [![coverage](https://codecov.io/gh/thekhegay/ngwr/branch/main/graph/badge.svg)](https://codecov.io/gh/thekhegay/ngwr)
10
10
  [![license](https://img.shields.io/npm/l/ngwr)](https://github.com/thekhegay/ngwr/blob/main/LICENSE)
11
11
 
12
- [Documentation](https://ngwr.dev) · [Getting started](https://ngwr.dev/start/installation) · [Playground](https://ngwr.dev/start/playground) · [Why ngwr](https://ngwr.dev/start/comparison) · [Changelog](https://github.com/thekhegay/ngwr/blob/main/CHANGELOG.md)
12
+ [Documentation](https://ngwr.dev) · [Getting started](https://ngwr.dev/docs/installation) · [Playground](https://stackblitz.com/github/thekhegay/ngwr/tree/main/projects/starter?file=src/app/app.ts) · [Changelog](https://github.com/thekhegay/ngwr/blob/main/CHANGELOG.md)
13
13
 
14
14
  ngwr's form controls implement `FormValueControl` and `FormCheckboxControl`
15
15
  from Signal Forms directly. `[formField]` binds to each component's own `value`
@@ -62,9 +62,10 @@ reactive forms bind too, with limits the
62
62
  - Angular CDK [test harnesses](https://ngwr.dev/guides/testing) for the form
63
63
  controls and overlays.
64
64
 
65
- Browse the [components](https://ngwr.dev/reference/components) and
66
- [animations](https://ngwr.dev/animations) with live demos. Directives, pipes,
67
- services and validators are in the [reference](https://ngwr.dev/reference).
65
+ Browse the [components](https://ngwr.dev/reference/components),
66
+ [charts](https://ngwr.dev/charts) and [bits](https://ngwr.dev/bits) (animations
67
+ and visual effects) with live demos. Directives, pipes, services and validators
68
+ are in the [reference](https://ngwr.dev/reference).
68
69
 
69
70
  ## Installation
70
71
 
@@ -85,8 +86,9 @@ npm install ngwr @angular/cdk
85
86
  yarn add ngwr @angular/cdk
86
87
  ```
87
88
 
88
- The optional packages (an icon set, ProseMirror for the editor) are listed in
89
- the [installation guide](https://ngwr.dev/start/installation).
89
+ The optional packages are an icon set, shown in the
90
+ [installation guide](https://ngwr.dev/docs/installation), and ProseMirror for
91
+ the [editor](https://ngwr.dev/reference/components/editor).
90
92
 
91
93
  ## Styles
92
94
 
@@ -103,7 +105,8 @@ where `$base-colors` goes.
103
105
  @use 'ngwr/checkbox';
104
106
  ```
105
107
 
106
- Utilities are opt-in and come with nothing:
108
+ Utilities are opt-in. Write them below `@use 'ngwr/theme'`, since some of them
109
+ load the token layer too:
107
110
 
108
111
  ```scss
109
112
  @use 'ngwr/reset'; // box-sizing, body margin, sane defaults
@@ -132,6 +135,8 @@ providers: [
132
135
  ],
133
136
  ```
134
137
 
138
+ `withDensity()` and the `[wrDensity]` directive also need
139
+ `@use 'ngwr/density';` in your styles: no component loads the density scale.
135
140
  Icons and translations have calls of their own. The
136
141
  [configuration guide](https://ngwr.dev/docs/configuration) lists every feature.
137
142
 
@@ -142,9 +147,10 @@ ng update ngwr
142
147
  ```
143
148
 
144
149
  This installs the latest version and runs its migrations. The
145
- [migration guide](https://ngwr.dev/start/migration) describes the changes in
146
- each major. The Angular badge shows the lowest Angular version ngwr needs.
147
- [Versioning](https://ngwr.dev/start/versioning) explains the support policy.
150
+ [migration guide](https://ngwr.dev/docs/migration) describes the changes in
151
+ each major. The Angular badge shows the Angular versions ngwr supports, and
152
+ [SECURITY.md](https://github.com/thekhegay/ngwr/blob/main/SECURITY.md) lists the
153
+ majors that still get fixes.
148
154
 
149
155
  ## AI agents
150
156
 
@@ -159,8 +165,8 @@ and read component APIs. Add it to your client:
159
165
  }
160
166
  ```
161
167
 
162
- The [MCP guide](https://ngwr.dev/guides/mcp) covers each client. Agents without
163
- MCP can use the [agent skill](https://ngwr.dev/guides/agent-skill),
168
+ The [MCP guide](https://ngwr.dev/docs/mcp-server) covers each client. Agents
169
+ without MCP can use the [agent skill](https://ngwr.dev/docs/skills),
164
170
  [llms.txt](https://ngwr.dev/llms.txt), or any docs page as markdown by adding
165
171
  `.md` to its URL.
166
172
 
@@ -1,6 +1,6 @@
1
- // Almost nothing — the directive does the work inline. This layer owns one
2
- // declaration, the stacking order below, and otherwise only exposes the class
3
- // hook a consumer styles the "stuck" state with.
1
+ // Almost nothing — the directive does the work inline. This layer owns the
2
+ // stacking order below and the containing block of a flex or grid parent, and
3
+ // otherwise only exposes the class hook a consumer styles the "stuck" state with.
4
4
  //
5
5
  // The directive sets `position: sticky; top: <offset>px` on the host and
6
6
  // toggles `wr-affix--active` via an IntersectionObserver sentinel.
@@ -13,3 +13,12 @@
13
13
  // the active modifier is the consumer's to style.
14
14
  z-index: 10;
15
15
  }
16
+
17
+ // A flex or grid parent holds the sentinel out of the flow, absolutely
18
+ // positioned, and has to be its containing block or the sentinel stops
19
+ // scrolling with a nested scroller's content. Zero specificity on purpose: any
20
+ // position the author gives the parent wins, a media query included, and a
21
+ // positioned parent is a containing block all the same.
22
+ :where(.wr-affix__container) {
23
+ position: relative;
24
+ }
@@ -152,6 +152,17 @@
152
152
  // a 96px one — and the colour and size written here never painted once.
153
153
  // Specificity, not order, so it holds for an app that `@use`s the two entry
154
154
  // points in either order.
155
+ // The failed image's name, kept for assistive technology when nothing else
156
+ // names the avatar. Taken out of the flex line so it moves nothing, and gone
157
+ // (from the tree too) when initials are projected, since they name it then.
158
+ &__alt {
159
+ position: absolute;
160
+ }
161
+
162
+ &__content:not(:empty) ~ &__alt {
163
+ display: none;
164
+ }
165
+
155
166
  &__spin.wr-spinner {
156
167
  position: absolute;
157
168
  // A loading indicator is a status GRAPHIC, which 1.4.11 holds to 3:1: the
@@ -105,10 +105,17 @@
105
105
  --wr-badge-color: var(--wr-color-on-surface);
106
106
  --wr-badge-border: var(--wr-border-base);
107
107
 
108
+ // An intent sets the three hooks rather than the properties they feed, the way
109
+ // `wr-tag` does, so the hooks the docs list still restyle a coloured badge —
110
+ // which is every badge by default, since `color` defaults to `primary`. Writing
111
+ // `background-color` and `color` here left `--wr-badge-bg` / `-color` / `-border`
112
+ // working only with `[color]="null"`.
108
113
  @each $name in theme.$colors {
109
114
  &--#{$name} {
110
- background-color: var(--wr-color-#{$name});
111
- color: var(--wr-color-#{$name}-contrast);
115
+ --wr-badge-bg: var(--wr-color-#{$name});
116
+ --wr-badge-color: var(--wr-color-#{$name}-contrast);
117
+ // Read only by the outlined ring below.
118
+ --wr-badge-border: var(--wr-color-#{$name}-soft-border);
112
119
  }
113
120
  }
114
121
 
@@ -125,17 +132,16 @@
125
132
  // draws the same ring from the same token; the tag keeps its 6% fill, because
126
133
  // a tag is a chip you can click and a badge is a label you cannot.
127
134
  &--outlined {
128
- background-color: transparent;
129
- // `--wr-badge-border` rather than `currentcolor` for the NEUTRAL case, for
130
- // the reason the note above gives about the chromatic ones: a ring drawn in
131
- // the text colour is a hairline at full label strength around text of
132
- // exactly that strength. An intent overrides it in the loop below.
135
+ --wr-badge-bg: transparent;
136
+ // `--wr-badge-border` rather than `currentcolor`, for the reason the note
137
+ // above gives: a ring drawn in the text colour is a hairline at full label
138
+ // strength around text of exactly that strength. An intent sets the hook to
139
+ // its `-soft-border` in the loop above.
133
140
  box-shadow: inset 0 0 0 1px var(--wr-badge-border);
134
141
 
135
142
  @each $name in theme.$colors {
136
143
  &.wr-badge--#{$name} {
137
- color: var(--wr-color-#{$name}-ink);
138
- box-shadow: inset 0 0 0 1px var(--wr-color-#{$name}-soft-border);
144
+ --wr-badge-color: var(--wr-color-#{$name}-ink);
139
145
  }
140
146
  }
141
147
  }
@@ -1 +1 @@
1
- @forward './styles';
1
+ @forward './styles/rules';
@@ -1,26 +1,15 @@
1
- .wr-decrypt-text {
2
- display: inline-block;
3
- white-space: pre-wrap;
4
-
5
- &__sr-only {
6
- position: absolute;
7
- width: 1px;
8
- height: 1px;
9
- margin: -1px;
10
- padding: 0;
11
- overflow: hidden;
12
- clip: rect(0, 0, 0, 0);
13
- border: 0;
14
- }
15
-
16
- &__char {
17
- display: inline;
18
- }
19
-
20
- // Hook for consumers to style the scrambled state distinctly (e.g. dim
21
- // the scramble glyphs). Apply via `[encryptedClassName]`-style overrides
22
- // by extending `.wr-decrypt-text__char--encrypted`.
23
- &__char--encrypted {
24
- /* default: no visual change; consumers override as needed */
25
- }
26
- }
1
+ // Public Sass entry for `@use 'ngwr/bits/decrypt-text'`.
2
+ //
3
+ // Pulls the whole theme so a standalone import still brings in every design
4
+ // token these rules reference, then loads the rules themselves from `_rules`.
5
+ //
6
+ // The split is what keeps the token layer out of the JavaScript bundle.
7
+ // `decrypt-text.scss` is the component's `styleUrl`, and a component stylesheet
8
+ // is its OWN Sass compilation — `@use` only deduplicates within one. So while
9
+ // the app's global stylesheet emits the theme once, forwarding it from here
10
+ // would inline a second, byte-identical copy of `:root` and the box-sizing
11
+ // reset into the compiled component styles, which the library build then embeds
12
+ // in the FESM bundle as a string. `decrypt-text.scss` forwards `_rules` instead,
13
+ // so it carries this component's own CSS and nothing else.
14
+ @use '../../../theme/styles';
15
+ @forward 'rules';
@@ -0,0 +1,40 @@
1
+ .wr-decrypt-text {
2
+ display: inline-block;
3
+ white-space: pre-wrap;
4
+
5
+ &__sr-only {
6
+ position: absolute;
7
+ width: 1px;
8
+ height: 1px;
9
+ margin: -1px;
10
+ padding: 0;
11
+ overflow: hidden;
12
+ clip: rect(0, 0, 0, 0);
13
+ border: 0;
14
+ }
15
+
16
+ &__char {
17
+ display: inline;
18
+ }
19
+
20
+ // `click` mode makes the host a button. The ring is written from the shared
21
+ // `--wr-focus-ring-*` tokens, the way `theme.focus-ring` writes it: this is the
22
+ // component stylesheet's half, which loads no theme module, since one that did
23
+ // would carry a second copy of the token layer.
24
+ &--interactive {
25
+ cursor: pointer;
26
+
27
+ &:focus-visible {
28
+ outline: var(--wr-focus-ring-width) solid var(--wr-focus-ring-color);
29
+ outline-offset: var(--wr-focus-ring-offset);
30
+ box-shadow: 0 0 0 var(--wr-focus-ring-offset) var(--wr-focus-ring-halo);
31
+ }
32
+ }
33
+
34
+ // Hook for consumers to style the scrambled state distinctly (e.g. dim
35
+ // the scramble glyphs). Apply via `[encryptedClassName]`-style overrides
36
+ // by extending `.wr-decrypt-text__char--encrypted`.
37
+ &__char--encrypted {
38
+ /* default: no visual change; consumers override as needed */
39
+ }
40
+ }
@@ -2,10 +2,16 @@
2
2
  position: relative;
3
3
  display: block;
4
4
  overflow: hidden;
5
- touch-action: none; // pointer-driven drag — disable browser scroll on touch
6
5
 
7
6
  &__words {
8
7
  line-height: 1.4;
8
+ // The words take their ORDER from the text (`dir="auto"` in the template)
9
+ // and their alignment from the page, which is what plain text does: a Latin
10
+ // sentence on an RTL page still sits at the right. Chromium knows only the
11
+ // prefixed keyword and drops the standard one, which Firefox needs.
12
+ // rtl-ok: `match-parent` IS direction-aware — `start` resolved against the parent
13
+ text-align: -webkit-match-parent;
14
+ text-align: match-parent;
9
15
  }
10
16
 
11
17
  &__word {
@@ -18,6 +24,13 @@
18
24
  cursor: grabbing;
19
25
  }
20
26
 
27
+ // Only a released word takes its touches for the drag. On the whole host this
28
+ // made the block a scroll dead zone on every touch screen — before the words
29
+ // fell, and under reduced motion, where they never do.
30
+ .wr-falling-text--released & {
31
+ touch-action: none;
32
+ }
33
+
21
34
  &--hl {
22
35
  // A highlighted WORD is text the user reads, decorative motion or not.
23
36
  color: var(--wr-color-primary-ink);
@@ -15,6 +15,15 @@
15
15
  display: block;
16
16
  width: 100%;
17
17
  overflow: hidden;
18
+ // The loop is physical (see `&__item` below): the track starts at the left
19
+ // edge, its copies extend to the right, and `translate3d(-offset)` walks it
20
+ // left. Under an inherited RTL the host anchors the over-wide track at its
21
+ // RIGHT edge with the copies running left, and the same translate opened a
22
+ // blank gap of up to one sequence there every cycle. It has to be the host,
23
+ // not the track: which edge an over-wide block sticks to is decided by its
24
+ // containing block's direction. Each item restores the document's direction
25
+ // for its own content below.
26
+ direction: ltr;
18
27
 
19
28
  &--scale-hover {
20
29
  padding-top: calc(var(--wr-marquee-height) * 0.1);
@@ -50,6 +59,13 @@
50
59
  margin-right: var(--wr-marquee-gap);
51
60
  font-size: var(--wr-marquee-height);
52
61
  line-height: 1;
62
+
63
+ // `:dir()` reads the DOCUMENT's direction (the `dir` attribute), which the
64
+ // track's CSS `direction: ltr` does not change — so the text inside an item
65
+ // keeps the page's direction while the strip itself stays physical.
66
+ &:dir(rtl) {
67
+ direction: rtl;
68
+ }
53
69
  }
54
70
 
55
71
  &__item:last-child {
@@ -137,6 +153,39 @@
137
153
  );
138
154
  }
139
155
 
156
+ // Reduced motion. The loop is off and the component renders one copy, so a
157
+ // frozen `overflow: hidden` strip would put every item past the edge out of
158
+ // reach; the host scrolls instead. It is the named region, and it takes a tab
159
+ // stop of its own when no item has one (the component decides), so the
160
+ // keyboard can scroll it. Set from the live preference rather than from the
161
+ // media query below, because the copies that query cannot remove are what
162
+ // would scroll into view.
163
+ &--static {
164
+ overflow-x: auto;
165
+ // Not `visible`: next to an `auto` axis it computes to `auto`, and the
166
+ // scale-on-hover padding is sized to keep a scaled item inside the box.
167
+ overflow-y: hidden;
168
+ overscroll-behavior-x: contain;
169
+
170
+ // The ring is written from the shared `--wr-focus-ring-*` tokens, the way
171
+ // `theme.focus-ring` writes it (see `wr-decrypt-text`), and drawn INSIDE the
172
+ // box: the strip is full width, so an outset ring is cut off by whatever
173
+ // clips the page around it.
174
+ &:focus-visible {
175
+ outline: var(--wr-focus-ring-width) solid var(--wr-focus-ring-color);
176
+ outline-offset: calc(var(--wr-focus-ring-width) * -1);
177
+ box-shadow: inset 0 0 0 calc(var(--wr-focus-ring-width) + var(--wr-focus-ring-offset)) var(--wr-focus-ring-halo);
178
+ }
179
+ }
180
+
181
+ // The fades hide a seam that a still strip does not have, and on a scroller
182
+ // they would sit over the first and last items for good — absolutely placed
183
+ // inside the scroll container, they scroll away with the content.
184
+ &--static::before,
185
+ &--static::after {
186
+ display: none;
187
+ }
188
+
140
189
  @media (prefers-reduced-motion: reduce) {
141
190
  .wr-marquee__track {
142
191
  transform: translate3d(0, 0, 0) !important;
@@ -4,6 +4,18 @@
4
4
  display: inline-flex;
5
5
  align-items: baseline;
6
6
 
7
+ // Same shape as `wr-rotating-text`: the typed text is a fragment most of the
8
+ // time, so the whole sentence is carried once here for a screen reader.
9
+ &__sr-only {
10
+ position: absolute;
11
+ width: 1px;
12
+ height: 1px;
13
+ overflow: hidden;
14
+ clip: rect(0 0 0 0);
15
+ clip-path: inset(50%);
16
+ white-space: nowrap;
17
+ }
18
+
7
19
  &__content {
8
20
  white-space: pre;
9
21
  }
@@ -48,9 +48,12 @@
48
48
  align-items: center;
49
49
  gap: var(--wr-breadcrumbs-gap);
50
50
 
51
- // Separator before every item except the first.
51
+ // Separator before every item except the first. The empty alternative text
52
+ // after the `/` keeps it out of the accessibility tree: generated content is
53
+ // read like any other text, so the trail was announced "Home, slash,
54
+ // Components, slash, …" and the current crumb as "slash Current page".
52
55
  &:not(:first-child)::before {
53
- content: var(--wr-breadcrumbs-separator);
56
+ content: var(--wr-breadcrumbs-separator) / '';
54
57
  color: var(--wr-breadcrumbs-separator-color);
55
58
  user-select: none;
56
59
  }
@@ -224,9 +224,15 @@
224
224
  flex-direction: row-reverse;
225
225
  }
226
226
 
227
- // Loading — hide label/icon contents but keep their footprint
227
+ // Loading — hide label/icon contents but keep their footprint. The label by
228
+ // `opacity` rather than `visibility`: a `visibility: hidden` label leaves the
229
+ // accessibility tree, and the button was then named after its spinner, so every
230
+ // loading button on a page was called "Loading".
228
231
  &--loading {
229
- .wr-btn__label,
232
+ .wr-btn__label {
233
+ opacity: 0;
234
+ }
235
+
230
236
  .wr-btn__icon {
231
237
  visibility: hidden;
232
238
  }
@@ -324,23 +330,27 @@
324
330
  }
325
331
 
326
332
  // Solid colored segments share border and background color, so adjacent
327
- // buttons fuse into one slab — draw a subtle divider on the right edge of
328
- // every non-last segment. Outlined/default variants keep their own visible
333
+ // buttons fuse into one slab — draw a subtle divider on the inline-end edge
334
+ // of every non-last segment. Outlined/default variants keep their own visible
329
335
  // borders. On hover/focus the segment raises its own border (z-index above
330
336
  // neighbours), which would otherwise double-paint that edge — so drop the
331
337
  // seam there and let the raised border own it cleanly.
332
338
  @each $name in theme.$colors {
333
339
  > .wr-btn--#{$name}:not(.wr-btn--outlined):not(:last-child) {
334
- // `box-shadow` offsets are physical by spec — there is no logical form to
335
- // convert to. The seam lands on the wrong edge under RTL; fixing it needs a
336
- // `[dir]` rule or a real border, which is beyond a property-level rewrite.
340
+ // rtl-ok: `box-shadow` offsets are physical by spec, with no logical form,
341
+ // so the inline-end edge is spelled once per direction. `:dir()` reads the
342
+ // element's own direction, so no ancestor selector is involved.
337
343
  box-shadow: inset -1px 0 0 color-mix(in srgb, var(--wr-color-black) 20%, transparent);
338
344
 
345
+ &:dir(rtl) {
346
+ box-shadow: inset 1px 0 0 color-mix(in srgb, var(--wr-color-black) 20%, transparent);
347
+ }
348
+
349
+ // After the `:dir(rtl)` rule, which it ties on specificity.
339
350
  &:hover,
340
351
  &:focus-visible {
341
352
  box-shadow: none;
342
353
  }
343
- // rtl-ok: box-shadow has no logical equivalent — see above
344
354
  }
345
355
  }
346
356
  }
@@ -35,6 +35,14 @@
35
35
  height: 100%;
36
36
  transition: transform var(--wr-duration-slow) var(--wr-ease-out);
37
37
  will-change: transform;
38
+
39
+ // The slide still changes — autoplay included — it just no longer travels
40
+ // across the full width of the carousel to get there: a full-width panel
41
+ // moving on its own is the motion the preference asks to remove. Bootstrap's
42
+ // carousel makes the same call.
43
+ @media (prefers-reduced-motion: reduce) {
44
+ transition: none;
45
+ }
38
46
  }
39
47
  }
40
48
 
@@ -79,11 +87,17 @@
79
87
  background var(--wr-transition-base),
80
88
  transform var(--wr-transition-base);
81
89
 
82
- &:hover {
90
+ &:hover:not(:disabled) {
83
91
  background: var(--wr-color-surface);
84
92
  transform: translateY(-50%) scale(1.05);
85
93
  }
86
94
 
95
+ // Only without `loop`, at the end the arrow points past.
96
+ &:disabled {
97
+ cursor: not-allowed;
98
+ opacity: var(--wr-disabled-opacity);
99
+ }
100
+
87
101
  // The track's motion is direction-aware now — `carousel.ts` signs its
88
102
  // `translateX` and its swipe threshold from `Directionality` — so the arrows
89
103
  // follow the reading direction too. "Previous" is where the earlier slides
@@ -35,19 +35,41 @@
35
35
  --wr-bar-chart-value-font-size: var(--wr-text-xs);
36
36
  --wr-bar-chart-value-line-height: var(--wr-leading-none);
37
37
 
38
+ flex: none;
39
+ // Bounded by its column and ellipsised, as the label under it is. With no bound,
40
+ // forty five-digit values at 1280px overlapped their neighbours into one smear and
41
+ // the outermost hung past the chart. The tooltip and the column's name carry the
42
+ // whole number.
43
+ max-width: 100%;
44
+ overflow: hidden;
45
+ text-overflow: ellipsis;
46
+ white-space: nowrap;
38
47
  font-size: var(--wr-bar-chart-value-font-size);
39
48
  color: var(--wr-color-on-surface-muted);
40
49
  font-variant-numeric: tabular-nums;
41
50
  line-height: var(--wr-bar-chart-value-line-height);
42
51
  }
43
52
 
53
+ // The component writes the bar's share of the plot as its `flex-grow`, from 0
54
+ // to 1. Factors that sum to less than 1 hand out only that fraction of the free
55
+ // space, so the bar gets exactly its share of what the column has left after
56
+ // the value above it, and the value rides on the bar's top. It was a `height`
57
+ // percentage of the WHOLE column, so the tallest bars plus their value
58
+ // overflowed it and flex-shrink took the difference out of them alone:
59
+ // measured in Chromium, WebKit and Firefox, 24 drew at 183px beside 12 at
60
+ // 99.5px, and 22 at 182.4px — the same height as 24.
44
61
  &__bar {
45
62
  --wr-bar-chart-bar-radius: var(--wr-border-radius-sm);
46
63
 
64
+ flex: 0 0 0;
47
65
  width: 100%;
48
66
  border-radius: var(--wr-bar-chart-bar-radius) var(--wr-bar-chart-bar-radius) 0 0;
49
- transition: height var(--wr-duration-slow) var(--wr-ease-out);
67
+ transition: flex-grow var(--wr-duration-slow) var(--wr-ease-out);
50
68
  min-height: 1px;
69
+ // The bar is an inline `background`, which forced colors resets to `Canvas`:
70
+ // every bar vanished into the page and left its value floating over the
71
+ // baseline. The SVG charts keep their fills there, so the HTML marks do too.
72
+ forced-color-adjust: none;
51
73
  }
52
74
 
53
75
  &__labels {
@@ -90,6 +90,10 @@
90
90
  // border-radius tokens (5px+) would read as near-circles at this size.
91
91
  border-radius: 2px;
92
92
  transition: transform var(--wr-transition-base);
93
+ // An inline `background`, which forced colors resets to `Canvas`: the whole
94
+ // year vanished and left the month and weekday labels. The SVG charts keep
95
+ // their fills there, so the squares do too.
96
+ forced-color-adjust: none;
93
97
 
94
98
  &:hover {
95
99
  transform: scale(1.4);
@@ -89,6 +89,9 @@
89
89
  width: 0.625rem;
90
90
  height: 0.625rem;
91
91
  border-radius: 50%;
92
+ // The key to the slices, whose SVG fills forced colors keeps — so an inline
93
+ // `background` reset to `Canvas` left the legend pointing at nothing.
94
+ forced-color-adjust: none;
92
95
  }
93
96
 
94
97
  &__legend-label {