ngwr 14.8.0 → 14.9.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 (447) hide show
  1. package/README.md +66 -332
  2. package/alert/styles/_index.scss +10 -0
  3. package/avatar/styles/_index.scss +18 -7
  4. package/badge/styles/_index.scss +7 -0
  5. package/badge/styles/_tag.scss +7 -1
  6. package/button/styles/_index.scss +6 -0
  7. package/cascader/styles/_rules.scss +1 -1
  8. package/checkbox/styles/_index.scss +4 -0
  9. package/command-palette/styles/_index.scss +1 -1
  10. package/divider/styles/_index.scss +2 -0
  11. package/editor/styles/_index.scss +441 -0
  12. package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -1
  13. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  14. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  15. package/fesm2022/ngwr-affix.mjs +3 -3
  16. package/fesm2022/ngwr-affix.mjs.map +1 -1
  17. package/fesm2022/ngwr-alert.mjs +3 -3
  18. package/fesm2022/ngwr-alert.mjs.map +1 -1
  19. package/fesm2022/ngwr-anchor.mjs +3 -3
  20. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  21. package/fesm2022/ngwr-aurora.mjs +3 -3
  22. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  23. package/fesm2022/ngwr-avatar.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  27. package/fesm2022/ngwr-badge.mjs +28 -13
  28. package/fesm2022/ngwr-badge.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  30. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  31. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  32. package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -1
  33. package/fesm2022/ngwr-blur-text.mjs +3 -3
  34. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  35. package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -1
  36. package/fesm2022/ngwr-border-glow.mjs +3 -3
  37. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  38. package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
  39. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  40. package/fesm2022/ngwr-burger.mjs +3 -3
  41. package/fesm2022/ngwr-burger.mjs.map +1 -1
  42. package/fesm2022/ngwr-button-testing.mjs.map +1 -1
  43. package/fesm2022/ngwr-button.mjs +6 -6
  44. package/fesm2022/ngwr-button.mjs.map +1 -1
  45. package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
  46. package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
  47. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  48. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  49. package/fesm2022/ngwr-calendar.mjs +3 -3
  50. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  51. package/fesm2022/ngwr-card.mjs +9 -9
  52. package/fesm2022/ngwr-card.mjs.map +1 -1
  53. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
  54. package/fesm2022/ngwr-carousel.mjs +6 -6
  55. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  56. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
  57. package/fesm2022/ngwr-cascader.mjs +4 -4
  58. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  59. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
  60. package/fesm2022/ngwr-checkbox.mjs +6 -6
  61. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  62. package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -1
  63. package/fesm2022/ngwr-circular-text.mjs +3 -3
  64. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  65. package/fesm2022/ngwr-click-spark.mjs +3 -3
  66. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  67. package/fesm2022/ngwr-clipboard.mjs +3 -3
  68. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  69. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-collapse.mjs +9 -9
  71. package/fesm2022/ngwr-collapse.mjs.map +1 -1
  72. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  73. package/fesm2022/ngwr-color-picker.mjs +6 -6
  74. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  75. package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -1
  76. package/fesm2022/ngwr-command-palette.mjs +3 -3
  77. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  78. package/fesm2022/ngwr-compare.mjs +3 -3
  79. package/fesm2022/ngwr-compare.mjs.map +1 -1
  80. package/fesm2022/ngwr-confetti.mjs +3 -3
  81. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  82. package/fesm2022/ngwr-config.mjs.map +1 -1
  83. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  84. package/fesm2022/ngwr-context-menu.mjs +12 -12
  85. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  86. package/fesm2022/ngwr-cookie.mjs +3 -3
  87. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  88. package/fesm2022/ngwr-counter.mjs +6 -6
  89. package/fesm2022/ngwr-counter.mjs.map +1 -1
  90. package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
  91. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
  92. package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
  93. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -1
  94. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-date-picker.mjs +21 -21
  96. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  97. package/fesm2022/ngwr-date.mjs +3 -3
  98. package/fesm2022/ngwr-date.mjs.map +1 -1
  99. package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -1
  100. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  101. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  102. package/fesm2022/ngwr-density.mjs +6 -6
  103. package/fesm2022/ngwr-density.mjs.map +1 -1
  104. package/fesm2022/ngwr-descriptions.mjs +6 -6
  105. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  106. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -1
  107. package/fesm2022/ngwr-dialog.mjs +15 -15
  108. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  109. package/fesm2022/ngwr-directives.mjs +12 -12
  110. package/fesm2022/ngwr-directives.mjs.map +1 -1
  111. package/fesm2022/ngwr-divider.mjs +3 -3
  112. package/fesm2022/ngwr-divider.mjs.map +1 -1
  113. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  114. package/fesm2022/ngwr-donut-chart.mjs +3 -3
  115. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  116. package/fesm2022/ngwr-drag-drop.mjs +6 -6
  117. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  118. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
  119. package/fesm2022/ngwr-drawer.mjs +18 -18
  120. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  121. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-dropdown.mjs +9 -9
  123. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  124. package/fesm2022/ngwr-editor-testing.mjs +568 -0
  125. package/fesm2022/ngwr-editor-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-editor.mjs +2601 -0
  127. package/fesm2022/ngwr-editor.mjs.map +1 -0
  128. package/fesm2022/ngwr-empty.mjs +3 -3
  129. package/fesm2022/ngwr-empty.mjs.map +1 -1
  130. package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
  131. package/fesm2022/ngwr-event-calendar.mjs +6 -6
  132. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  133. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  134. package/fesm2022/ngwr-falling-text.mjs +3 -3
  135. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  136. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -1
  137. package/fesm2022/ngwr-file-upload.mjs +3 -3
  138. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  139. package/fesm2022/ngwr-form-testing.mjs.map +1 -1
  140. package/fesm2022/ngwr-form.mjs +9 -9
  141. package/fesm2022/ngwr-form.mjs.map +1 -1
  142. package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
  144. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  145. package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
  146. package/fesm2022/ngwr-gauge.mjs +3 -3
  147. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  148. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  149. package/fesm2022/ngwr-glitch-text.mjs +3 -3
  150. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  151. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  152. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  153. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  154. package/fesm2022/ngwr-graph-testing.mjs.map +1 -1
  155. package/fesm2022/ngwr-graph.mjs +6 -6
  156. package/fesm2022/ngwr-graph.mjs.map +1 -1
  157. package/fesm2022/ngwr-hotkey.mjs +6 -6
  158. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  159. package/fesm2022/ngwr-i18n-ar.mjs +29 -0
  160. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  161. package/fesm2022/ngwr-i18n-cs.mjs +29 -0
  162. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  163. package/fesm2022/ngwr-i18n-de.mjs +29 -0
  164. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  165. package/fesm2022/ngwr-i18n-en.mjs +34 -0
  166. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  167. package/fesm2022/ngwr-i18n-es.mjs +29 -0
  168. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  169. package/fesm2022/ngwr-i18n-fr.mjs +29 -0
  170. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  171. package/fesm2022/ngwr-i18n-he.mjs +29 -0
  172. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  173. package/fesm2022/ngwr-i18n-hi.mjs +29 -0
  174. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  175. package/fesm2022/ngwr-i18n-id.mjs +29 -0
  176. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  177. package/fesm2022/ngwr-i18n-it.mjs +29 -0
  178. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  179. package/fesm2022/ngwr-i18n-ja.mjs +29 -0
  180. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  181. package/fesm2022/ngwr-i18n-ko.mjs +29 -0
  182. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  183. package/fesm2022/ngwr-i18n-nl.mjs +29 -0
  184. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  185. package/fesm2022/ngwr-i18n-pl.mjs +29 -0
  186. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  187. package/fesm2022/ngwr-i18n-pt.mjs +29 -0
  188. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  189. package/fesm2022/ngwr-i18n-ru.mjs +29 -0
  190. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  191. package/fesm2022/ngwr-i18n-sv.mjs +29 -0
  192. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  193. package/fesm2022/ngwr-i18n-tr.mjs +29 -0
  194. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  195. package/fesm2022/ngwr-i18n-uk.mjs +29 -0
  196. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  197. package/fesm2022/ngwr-i18n-vi.mjs +29 -0
  198. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  199. package/fesm2022/ngwr-i18n-zh-TW.mjs +29 -0
  200. package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
  201. package/fesm2022/ngwr-i18n-zh.mjs +29 -0
  202. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  203. package/fesm2022/ngwr-i18n.mjs +9 -9
  204. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  205. package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
  206. package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
  207. package/fesm2022/ngwr-icon.mjs +6 -6
  208. package/fesm2022/ngwr-icon.mjs.map +1 -1
  209. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  210. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  211. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  212. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  213. package/fesm2022/ngwr-input-number.mjs +3 -3
  214. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  215. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  216. package/fesm2022/ngwr-input-otp.mjs +3 -3
  217. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  218. package/fesm2022/ngwr-input-testing.mjs.map +1 -1
  219. package/fesm2022/ngwr-input.mjs +15 -15
  220. package/fesm2022/ngwr-input.mjs.map +1 -1
  221. package/fesm2022/ngwr-keyboard.mjs +3 -3
  222. package/fesm2022/ngwr-keyboard.mjs.map +1 -1
  223. package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
  224. package/fesm2022/ngwr-knob.mjs +3 -3
  225. package/fesm2022/ngwr-knob.mjs.map +1 -1
  226. package/fesm2022/ngwr-layout.mjs +15 -15
  227. package/fesm2022/ngwr-layout.mjs.map +1 -1
  228. package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -1
  229. package/fesm2022/ngwr-lightbox.mjs +3 -3
  230. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  231. package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-line-chart.mjs +3 -3
  233. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  234. package/fesm2022/ngwr-list.mjs +6 -6
  235. package/fesm2022/ngwr-list.mjs.map +1 -1
  236. package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -1
  237. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  238. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  239. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -1
  240. package/fesm2022/ngwr-markdown.mjs +798 -17
  241. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  242. package/fesm2022/ngwr-marquee-testing.mjs.map +1 -1
  243. package/fesm2022/ngwr-marquee.mjs +3 -3
  244. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  245. package/fesm2022/ngwr-media.mjs +3 -3
  246. package/fesm2022/ngwr-media.mjs.map +1 -1
  247. package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
  248. package/fesm2022/ngwr-mention.mjs +6 -6
  249. package/fesm2022/ngwr-mention.mjs.map +1 -1
  250. package/fesm2022/ngwr-meta.mjs +6 -6
  251. package/fesm2022/ngwr-meta.mjs.map +1 -1
  252. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  253. package/fesm2022/ngwr-meter-group.mjs +3 -3
  254. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  255. package/fesm2022/ngwr-overlay.mjs +6 -6
  256. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  257. package/fesm2022/ngwr-page-header.mjs +3 -3
  258. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  259. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  260. package/fesm2022/ngwr-pagination.mjs +3 -3
  261. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  262. package/fesm2022/ngwr-pipes.mjs +21 -21
  263. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  264. package/fesm2022/ngwr-platform.mjs +9 -9
  265. package/fesm2022/ngwr-platform.mjs.map +1 -1
  266. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
  267. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  268. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  269. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  270. package/fesm2022/ngwr-popover.mjs +12 -12
  271. package/fesm2022/ngwr-popover.mjs.map +1 -1
  272. package/fesm2022/ngwr-progress.mjs +3 -3
  273. package/fesm2022/ngwr-progress.mjs.map +1 -1
  274. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  275. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  276. package/fesm2022/ngwr-qr.mjs +3 -3
  277. package/fesm2022/ngwr-qr.mjs.map +1 -1
  278. package/fesm2022/ngwr-radio-testing.mjs.map +1 -1
  279. package/fesm2022/ngwr-radio.mjs +6 -6
  280. package/fesm2022/ngwr-radio.mjs.map +1 -1
  281. package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
  282. package/fesm2022/ngwr-rating.mjs +3 -3
  283. package/fesm2022/ngwr-rating.mjs.map +1 -1
  284. package/fesm2022/ngwr-result.mjs +12 -12
  285. package/fesm2022/ngwr-result.mjs.map +1 -1
  286. package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -1
  287. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  288. package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
  289. package/fesm2022/ngwr-schema-form.mjs +3 -3
  290. package/fesm2022/ngwr-schema-form.mjs.map +1 -1
  291. package/fesm2022/ngwr-scroll.mjs +3 -3
  292. package/fesm2022/ngwr-scroll.mjs.map +1 -1
  293. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  294. package/fesm2022/ngwr-segmented.mjs +3 -3
  295. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  296. package/fesm2022/ngwr-select-testing.mjs.map +1 -1
  297. package/fesm2022/ngwr-select.mjs +12 -12
  298. package/fesm2022/ngwr-select.mjs.map +1 -1
  299. package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -1
  300. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  301. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  302. package/fesm2022/ngwr-sidebar.mjs +3 -3
  303. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  304. package/fesm2022/ngwr-skeleton.mjs +3 -3
  305. package/fesm2022/ngwr-skeleton.mjs.map +1 -1
  306. package/fesm2022/ngwr-slider-testing.mjs.map +1 -1
  307. package/fesm2022/ngwr-slider.mjs +3 -3
  308. package/fesm2022/ngwr-slider.mjs.map +1 -1
  309. package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -1
  310. package/fesm2022/ngwr-sparkline.mjs +3 -3
  311. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  312. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  313. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  314. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  315. package/fesm2022/ngwr-spinner.mjs +3 -3
  316. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  317. package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -1
  318. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  319. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  320. package/fesm2022/ngwr-split-text-testing.mjs.map +1 -1
  321. package/fesm2022/ngwr-split-text.mjs +3 -3
  322. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  323. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
  324. package/fesm2022/ngwr-splitter.mjs +3 -3
  325. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  326. package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -1
  327. package/fesm2022/ngwr-spotlight-card.mjs +6 -6
  328. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  329. package/fesm2022/ngwr-squircle.mjs +6 -6
  330. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  331. package/fesm2022/ngwr-star-border-testing.mjs.map +1 -1
  332. package/fesm2022/ngwr-star-border.mjs +3 -3
  333. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  334. package/fesm2022/ngwr-statistic.mjs +9 -9
  335. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  336. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  337. package/fesm2022/ngwr-stepper.mjs +6 -6
  338. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  339. package/fesm2022/ngwr-storage.mjs +3 -3
  340. package/fesm2022/ngwr-storage.mjs.map +1 -1
  341. package/fesm2022/ngwr-switch-testing.mjs.map +1 -1
  342. package/fesm2022/ngwr-switch.mjs +3 -3
  343. package/fesm2022/ngwr-switch.mjs.map +1 -1
  344. package/fesm2022/ngwr-table-testing.mjs.map +1 -1
  345. package/fesm2022/ngwr-table.mjs +18 -18
  346. package/fesm2022/ngwr-table.mjs.map +1 -1
  347. package/fesm2022/ngwr-tabs-router.mjs +3 -3
  348. package/fesm2022/ngwr-tabs-router.mjs.map +1 -1
  349. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  350. package/fesm2022/ngwr-tabs.mjs +6 -6
  351. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  352. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -1
  353. package/fesm2022/ngwr-textarea.mjs +3 -3
  354. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  355. package/fesm2022/ngwr-theme.mjs +3 -3
  356. package/fesm2022/ngwr-theme.mjs.map +1 -1
  357. package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -1
  358. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  359. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  360. package/fesm2022/ngwr-timeline.mjs +6 -6
  361. package/fesm2022/ngwr-timeline.mjs.map +1 -1
  362. package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
  363. package/fesm2022/ngwr-toast.mjs +9 -9
  364. package/fesm2022/ngwr-toast.mjs.map +1 -1
  365. package/fesm2022/ngwr-toolbar.mjs +3 -3
  366. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  367. package/fesm2022/ngwr-tour-testing.mjs.map +1 -1
  368. package/fesm2022/ngwr-tour.mjs +6 -6
  369. package/fesm2022/ngwr-tour.mjs.map +1 -1
  370. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -1
  371. package/fesm2022/ngwr-transfer.mjs +3 -3
  372. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  373. package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
  374. package/fesm2022/ngwr-tree.mjs +3 -3
  375. package/fesm2022/ngwr-tree.mjs.map +1 -1
  376. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  377. package/fesm2022/ngwr-typewriter.mjs +3 -3
  378. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  379. package/fesm2022/ngwr-typography.mjs +7 -3
  380. package/fesm2022/ngwr-typography.mjs.map +1 -1
  381. package/fesm2022/ngwr-utils.mjs.map +1 -1
  382. package/fesm2022/ngwr-validators.mjs.map +1 -1
  383. package/fesm2022/ngwr-version.mjs +1 -1
  384. package/fesm2022/ngwr-version.mjs.map +1 -1
  385. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  386. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  387. package/fesm2022/ngwr-waves-testing.mjs.map +1 -1
  388. package/fesm2022/ngwr-waves.mjs +3 -3
  389. package/fesm2022/ngwr-waves.mjs.map +1 -1
  390. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  391. package/fesm2022/ngwr-window.mjs +12 -12
  392. package/fesm2022/ngwr-window.mjs.map +1 -1
  393. package/form/styles/_index.scss +5 -0
  394. package/i18n/ar.json +29 -0
  395. package/i18n/cs.json +29 -0
  396. package/i18n/de.json +29 -0
  397. package/i18n/en.json +29 -0
  398. package/i18n/es.json +29 -0
  399. package/i18n/fr.json +29 -0
  400. package/i18n/he.json +29 -0
  401. package/i18n/hi.json +29 -0
  402. package/i18n/id.json +29 -0
  403. package/i18n/it.json +29 -0
  404. package/i18n/ja.json +29 -0
  405. package/i18n/ko.json +29 -0
  406. package/i18n/nl.json +29 -0
  407. package/i18n/pl.json +29 -0
  408. package/i18n/pt.json +29 -0
  409. package/i18n/ru.json +29 -0
  410. package/i18n/sv.json +29 -0
  411. package/i18n/tr.json +29 -0
  412. package/i18n/uk.json +29 -0
  413. package/i18n/vi.json +29 -0
  414. package/i18n/zh-TW.json +29 -0
  415. package/i18n/zh.json +29 -0
  416. package/input/styles/_index.scss +5 -1
  417. package/input-otp/styles/_index.scss +5 -5
  418. package/llms-full.txt +11 -1
  419. package/llms.txt +188 -132
  420. package/mcp/providers.js +2 -2
  421. package/mcp/server.js +1 -1
  422. package/overlay/styles/_arrow.scss +3 -0
  423. package/package.json +43 -2
  424. package/progress/styles/_index.scss +4 -0
  425. package/radio/styles/_index.scss +4 -1
  426. package/schematics/use/symbol-map.json +1 -0
  427. package/select/styles/_index.scss +3 -3
  428. package/sidebar/styles/_index.scss +10 -0
  429. package/skeleton/styles/_index.scss +3 -0
  430. package/skills/ngwr/SKILL.md +5 -5
  431. package/skills/ngwr/references/catalog.md +2 -0
  432. package/skills/ngwr/references/setup.md +3 -3
  433. package/styles.scss +1 -0
  434. package/table/styles/_index.scss +7 -0
  435. package/textarea/styles/_index.scss +12 -3
  436. package/theme/styles/_colors.scss +39 -13
  437. package/theme/styles/_contrast.scss +9 -7
  438. package/toast/styles/_index.scss +4 -0
  439. package/tree/styles/_index.scss +1 -1
  440. package/types/ngwr-badge.d.ts +22 -7
  441. package/types/ngwr-config.d.ts +12 -0
  442. package/types/ngwr-editor-testing.d.ts +378 -0
  443. package/types/ngwr-editor.d.ts +449 -0
  444. package/types/ngwr-markdown.d.ts +61 -2
  445. package/types/ngwr-typography.d.ts +4 -0
  446. package/types/ngwr-version.d.ts +1 -1
  447. package/typography/styles/_index.scss +16 -0
package/README.md CHANGED
@@ -1,32 +1,19 @@
1
- # <a href="https://ngwr.dev"><img src="https://ngwr.dev/images/logo.svg" alt="ngwr" height="32px"></a>
1
+ # <a href="https://ngwr.dev"><img src="https://ngwr.dev/images/logo.svg" alt="ngwr" height="32"></a>
2
+
3
+ Signals-first UI components for Angular.
2
4
 
3
5
  [![ngwr website](https://img.shields.io/badge/ngwr.dev-3969e2)](https://ngwr.dev)
4
- [![ngwr version](https://img.shields.io/github/package-json/v/thekhegay/ngwr?filename=projects%2Flib%2Fpackage.json&color=%23e21a62)](https://www.npmjs.com/package/ngwr)
6
+ [![npm version](https://img.shields.io/npm/v/ngwr?color=e21a62)](https://www.npmjs.com/package/ngwr)
5
7
  [![angular peer](https://img.shields.io/npm/dependency-version/ngwr/peer/@angular/core)](https://www.npmjs.com/package/ngwr)
6
8
  [![ci](https://img.shields.io/github/actions/workflow/status/thekhegay/ngwr/ci.yml?branch=main&label=ci)](https://github.com/thekhegay/ngwr/actions/workflows/ci.yml)
7
9
  [![coverage](https://codecov.io/gh/thekhegay/ngwr/branch/main/graph/badge.svg)](https://codecov.io/gh/thekhegay/ngwr)
8
10
  [![license](https://img.shields.io/npm/l/ngwr)](https://github.com/thekhegay/ngwr/blob/main/LICENSE)
9
11
 
10
- <!-- "Nineteen" is derived, not chosen: `grep -rn "implements .*Form\(Value\|Checkbox\)Control" projects/lib`
11
- returns twenty class declarations, and the twentieth — `date-picker/internal/time-panel.ts` —
12
- is exported by no `public-api.ts`. Seventeen implement `FormValueControl`; `wr-checkbox` and
13
- `wr-switch` implement `FormCheckboxControl`. It is a count and not the word "every" on purpose:
14
- `[wrColorPickerTrigger]` is public, carries its own `value` model, and implements neither.
15
- Re-derive before editing the number. -->
16
-
17
- **NGWR is an Angular UI library that binds straight to Signal Forms.** Nineteen
18
- value controls implement `FormValueControl` / `FormCheckboxControl` themselves,
19
- so `[formField]` writes the component's own `value` / `checked` model — there
20
- is not one `ControlValueAccessor` in the library. Zoneless by construction, not
21
- zoneless-compatible: signal inputs, signal state, `afterNextRender()` for DOM
22
- work, and no `@NgModule` or `@Input()` decorator anywhere in the source. 227
23
- tree-shakable entry points, on `@angular/cdk` for overlay, portal and a11y
24
- primitives.
25
-
26
- **[Try it in the browser](https://ngwr.dev/start/playground)** — no install.
27
- **[How it compares](https://ngwr.dev/start/comparison)** — what the other
28
- Angular UI libraries do about Signal Forms today, counted rather than asserted.
29
- **[Docs and live demos](https://ngwr.dev)**.
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)
13
+
14
+ ngwr's form controls implement `FormValueControl` and `FormCheckboxControl`
15
+ from Signal Forms directly. `[formField]` binds to each component's own `value`
16
+ or `checked` model, and the library contains no `ControlValueAccessor`.
30
17
 
31
18
  ```ts
32
19
  import { Component, signal } from '@angular/core';
@@ -49,9 +36,6 @@ import { WrInput } from 'ngwr/input';
49
36
  export class SignupCard {
50
37
  private readonly model = signal({ email: '', agree: false });
51
38
 
52
- // `[formField]` binds to the control's own `value` / `checked` model, and
53
- // `<wr-form-field>` resolves the error copy from the i18n catalog — so
54
- // neither an accessor nor a `<wr-form-error>` has to be written by hand.
55
39
  readonly signup = form(this.model, path => {
56
40
  required(path.email);
57
41
  email(path.email);
@@ -59,104 +43,39 @@ export class SignupCard {
59
43
  }
60
44
  ```
61
45
 
62
- Classic `[(ngModel)]` and reactive forms still bind, with no `ControlValueAccessor`
63
- created: Angular's `NgModel` / `FormControlDirective` drive the control's `value`
64
- or `checked` model directly. That bridge does **not** apply template validator
65
- directives — `required`, `minlength`, `maxlength`, `pattern` or `email` on an ngwr
66
- control is silently ignored and the form submits — so put validators on the
67
- `FormControl`. It also ignores `updateOn`, and a `{ emitEvent: false }` write needs
68
- `markForCheck()`; the [forms guide](https://ngwr.dev/guides/forms) has the detail.
69
- Every control is also usable standalone through its two-way `[(value)]` /
70
- `[(checked)]` model.
71
-
72
- > **Status:** active development. v14 is the current major line (Angular 22 peer).
73
- > Upgrading? `ng update ngwr@14` rewrites v14's six renames and reports the
74
- > changes no codemod should guess at — the
75
- > [migration guide](https://ngwr.dev/start/migration) walks every step.
76
- > [Open an issue](https://github.com/thekhegay/ngwr/issues/new)
77
- > if something breaks or feels wrong.
78
-
79
- ## Requirements
80
-
81
- **The ranges live in one place: `peerDependencies` in the package's own
82
- manifest.** Read them with `npm info ngwr peerDependencies`, or on the npm page,
83
- or in `node_modules/ngwr/package.json` once installed. They are not copied here,
84
- because a copy is only ever correct until the next release — this table listed
85
- an icon package as a peer for a while after the library had stopped declaring
86
- one.
87
-
88
- What the manifest will not tell you is the SHAPE, so that is what this section
89
- is for. Angular, its CDK and rxjs are required. `@angular/router` is optional
90
- because only a handful of entry points import it. The two date libraries are
91
- optional and you pick at most one, whichever `provideWrDateAdapter()` you use.
92
- **Icon sets are not peers at all** — every adapter takes the icon data as an
93
- argument, so ngwr never imports lucide, feather or any other set; install
94
- whichever you like, or none, and register raw SVG with `svgIcon()`.
95
-
96
- ngwr declares no `engines` field and no TypeScript peer of its own, because it
97
- ships pre-compiled bundles and `.d.ts` files: the Node and TypeScript versions
98
- that bind are the ones your Angular names. Contributing to this repo is
99
- narrower, and those ranges live in the root `package.json` too — `engines`,
100
- `devEngines` and `packageManager`, with `.nvmrc` naming the version CI runs.
101
-
102
- **The floor is real; the missing ceiling promises nothing.** ngwr ships
103
- partially compiled, and the floor is enforced by the bundles rather than by the
104
- range — but by a minority of them, which is why the failure is confusing when it
105
- arrives. Of 654 declarations, **25 record `minVersion: "22.0.0"`** (the service
106
- declarations, across 22 files); the rest are older shapes an old linker reads
107
- fine. So the install succeeds — every package manager treats an unmet peer as a
108
- warning — and `ng build` then dies inside one `fesm2022` bundle with a message
109
- that names no version at all. Read the peer warning at install time. Above the
110
- floor, an open-ended range only means your package manager will not stop you
111
- installing next to an Angular this release was never built against.
46
+ `<wr-form-field>` shows the validation messages itself, so there is no error
47
+ markup to write. Template-driven and reactive forms bind too, with limits the
48
+ [forms guide](https://ngwr.dev/guides/forms) lists.
112
49
 
113
- ```sh
114
- grep -ho 'minVersion: *"[^"]*"' node_modules/ngwr/fesm2022/*.mjs | sort | uniq -c
115
- ```
50
+ ## Features
51
+
52
+ - Standalone, signal-based components that work zoneless and render on the
53
+ server.
54
+ - One import path per component (`ngwr/button`, `ngwr/select`). The only
55
+ runtime dependency is `tslib`.
56
+ - [Theming](https://ngwr.dev/guides/theming) through `--wr-*` CSS custom
57
+ properties, with light and dark modes.
58
+ - Keyboard and screen reader support based on the WAI-ARIA patterns.
59
+ - Translatable built-in labels and right-to-left layouts.
60
+ - Angular CDK [test harnesses](https://ngwr.dev/guides/testing) for the form
61
+ controls and overlays.
116
62
 
117
- ## Versioning and support
118
-
119
- Semver, with the one rule that matters made mechanical: **a breaking change
120
- cannot ride a minor or a patch.** `release:prepare` refuses `--bump=minor` and
121
- `--bump=patch` when any commit since the last release tag carries a `!` type or
122
- a `BREAKING CHANGE:` footer — it prints the offending subjects and exits
123
- non-zero, and since a release is cut only by that workflow, the refusal is the
124
- release. It exists because the opposite shipped: 12.2.0 was a minor carrying a
125
- `BREAKING CHANGES` section, and `^12.1.0` picked it up silently. So a caret
126
- range on a major is a safe range now. It was not then. What the guard cannot see
127
- is a break nobody labelled as one — it reads commit metadata, which is what
128
- commitlint on every commit and PR title gives it to read.
129
-
130
- Public API is three surfaces, and all three move only in a major: the exported
131
- TypeScript, the `.wr-*` BEM class names (components ship
132
- `ViewEncapsulation.None`), and the `--wr-*` custom properties. Anything marked
133
- `@internal` is not API, and the marker survives into the shipped types —
134
- `grep -rn "@internal" node_modules/ngwr/types` is the whole check. A few helpers
135
- are exported, unmarked and undocumented; treat those as unsupported until a page
136
- describes them, and open an issue naming the one you need.
137
-
138
- Two lines are supported at a time: the current major in full, the one before it
139
- for mechanical security fixes only, and that second row ends when the next major
140
- ships. Read it against the cadence rather than a calendar — eight majors shipped
141
- between 2026-06-12 (v7.0.0) and 2026-09-04 (v14.0.0). Table, targets and the
142
- private reporting route: [SECURITY.md](SECURITY.md). Full policy, with the
143
- commands to check every claim in it against the installed package:
144
- <https://ngwr.dev/start/versioning>.
145
-
146
- ## Install
147
-
148
- The schematic does the whole Install + Styles section for you — it installs
149
- ngwr and its peers, appends `@use 'ngwr';` to your global stylesheet, and
150
- prints a provider snippet tailored to your answers (date adapter, density,
151
- theme) to paste into bootstrap:
152
-
153
- ```shell
63
+ Browse the [components](https://ngwr.dev/reference/components) and
64
+ [animations](https://ngwr.dev/animations) with live demos. Directives, pipes,
65
+ services and validators are in the [reference](https://ngwr.dev/reference).
66
+
67
+ ## Installation
68
+
69
+ ```sh
154
70
  ng add ngwr
155
71
  ```
156
72
 
157
- Or wire it up by hand:
73
+ The schematic asks a few questions, adds `@use 'ngwr';` to your global Sass
74
+ stylesheet and prints the providers to add to your app.
158
75
 
159
- ```shell
76
+ Or install the packages yourself:
77
+
78
+ ```sh
160
79
  pnpm add ngwr @angular/cdk
161
80
  # or
162
81
  npm install ngwr @angular/cdk
@@ -164,257 +83,72 @@ npm install ngwr @angular/cdk
164
83
  yarn add ngwr @angular/cdk
165
84
  ```
166
85
 
167
- Beyond Angular itself, `@angular/cdk` and `@angular/forms` are the required
168
- peers — forms because the value controls implement its Signal Forms interfaces.
169
- `@angular/router` is optional, and since v14 nothing pulls it in unless you ask:
170
- a `<wr-tab routerLink>` needs `WrTabsRouting` from `ngwr/tabs/router` on the
171
- strip, and `<wr-loading-bar>` follows navigation only once you add
172
- `provideWrLoadingBarRouter()` from `ngwr/loading-bar/router`. Both used to be
173
- automatic, which cost every app 66–76 kB of router whether it routed or not.
174
- A stock `ng new` app already ships forms and router, so
175
- `@angular/cdk` is the only one you have to add — which is why it is on the
176
- install lines above. Add an icon set and a date library only if you use them —
177
- `lucide` (or `feather-icons`) for the icon adapters, and `date-fns` or `luxon`
178
- for the calendar / date-picker, which otherwise runs on a built-in native
179
- `Date` adapter. The Quick start below registers a lucide icon, so it needs
180
- `lucide`:
181
-
182
- ```shell
183
- pnpm add lucide
184
- ```
86
+ The optional packages (a date library, an icon set, ProseMirror for the editor)
87
+ are listed in the [installation guide](https://ngwr.dev/start/installation).
185
88
 
186
89
  ## Styles
187
90
 
188
- The fastest way — pull in everything (theme tokens + all component styles):
189
-
190
91
  ```scss
191
92
  // styles.scss
192
93
  @use 'ngwr';
193
94
  ```
194
95
 
195
- Good for a spike, but it is every entry point at once — about **265 kB** of CSS
196
- (~40 kB over the wire), which is over half the 500 kB initial budget a fresh
197
- `ng new` warns at before any of your own code. For anything you intend to keep,
198
- opt in per component below and the sheet stays proportional to what you actually
199
- render.
200
-
201
- Prefer to opt in per-component? Each component has its own SCSS entry that pulls
202
- in the theme automatically:
96
+ This loads the theme and the styles of every component. To keep the stylesheet
97
+ small, load only the components you use. Each entry brings the theme with it:
203
98
 
204
99
  ```scss
205
- @use 'ngwr/theme'; // CSS custom properties (--wr-color-*, --wr-font-*, etc.)
206
- @use 'ngwr/button';
100
+ @use 'ngwr/form';
207
101
  @use 'ngwr/input';
208
102
  @use 'ngwr/checkbox';
209
103
  ```
210
104
 
211
- Opt-in utilities (not part of `@use 'ngwr'`):
105
+ Utilities are opt-in and are not part of `@use 'ngwr'`:
212
106
 
213
107
  ```scss
214
108
  @use 'ngwr/reset'; // box-sizing, body margin, sane defaults
215
109
  @use 'ngwr/grid'; // .grid, .container, .col-*
216
- @use 'ngwr/animations'; // .wr-animate-fade-in, .wr-animate-slide-up, …
217
- @use 'ngwr/typography-utilities'; // .wr-text-*, .wr-font-* utility classes
218
- @use 'ngwr/breakpoints' as bp; // SCSS mixins only, no CSS output
219
- ```
220
-
221
- `ngwr/typography-utilities` is the utility-class sheet — not `ngwr/typography`,
222
- which is the larger `wrTypography` component entry.
223
-
224
- ### What you may style, and what may move
225
-
226
- Components render with `ViewEncapsulation.None`, so their `.wr-*` BEM classes and
227
- their `--wr-*` custom properties are reachable — and both are treated as public
228
- API: renaming one is a breaking change carrying a migration note. The DOM *shape*
229
- is not. Which element holds which class, how deeply they nest, whether a wrapper
230
- exists — all of that may move in a minor. A rule keyed on one class survives a
231
- rename; a descendant selector that encodes a structure
232
- (`.wr-select__trigger > span > svg`) does not. And a surviving rule is not a
233
- winning one: 27 components ship their own stylesheet, which Angular emits after
234
- your linked `styles.css`, so a single-class override loses to it at equal
235
- specificity — reach for their `--wr-*` token instead. See
236
- [Theming](https://ngwr.dev/guides/theming) for the full statement and the list.
237
-
238
- ## Quick start
239
-
240
- ```ts
241
- // main.ts
242
- import { bootstrapApplication } from '@angular/platform-browser';
243
- import { provideWrOverlay } from 'ngwr/overlay';
244
-
245
- import { AppComponent } from './app/app.component';
246
-
247
- bootstrapApplication(AppComponent, {
248
- providers: [
249
- provideWrOverlay(), // isolated overlay container
250
- ],
251
- });
252
- ```
253
-
254
- ```ts
255
- // app.component.ts
256
- import { Component, signal } from '@angular/core';
257
- import { FormsModule } from '@angular/forms';
258
- import { Check } from 'lucide';
259
- import { WrButton } from 'ngwr/button';
260
- import { provideWrIcons } from 'ngwr/icon';
261
- import { lucideIcons } from 'ngwr/icon/adapters/lucide';
262
- import { WrInput } from 'ngwr/input';
263
-
264
- @Component({
265
- selector: 'app-root',
266
- imports: [FormsModule, WrButton, WrInput],
267
- providers: [provideWrIcons(lucideIcons({ checkmark: Check }))], // tree-shaken icons
268
- template: `
269
- <input wrInput [(ngModel)]="name" placeholder="Your name" />
270
- <button wr-btn color="primary" icon="checkmark" (click)="greet()">Hello</button>
271
- `,
272
- })
273
- export class AppComponent {
274
- readonly name = signal('');
275
- greet(): void {
276
- console.log('Hi', this.name());
277
- }
278
- }
110
+ @use 'ngwr/animations'; // .wr-animate-* classes
111
+ @use 'ngwr/typography-utilities'; // .wr-text-*, .wr-font-* classes
112
+ @use 'ngwr/breakpoints' as bp; // Sass mixins only, no CSS output
279
113
  ```
280
114
 
281
- Value controls are Signal Forms-native, so `[formField]` binds straight
282
- through — no `ControlValueAccessor` anywhere in the chain:
283
-
284
- ```ts
285
- // profile-form.ts
286
- import { Component, signal } from '@angular/core';
287
- import { FormField, form } from '@angular/forms/signals';
288
- import { WrCheckbox } from 'ngwr/checkbox';
289
- import { WrInput } from 'ngwr/input';
115
+ ## Upgrading
290
116
 
291
- @Component({
292
- selector: 'app-profile-form',
293
- imports: [FormField, WrCheckbox, WrInput],
294
- template: `
295
- <input wrInput [formField]="profile.name" placeholder="Your name" />
296
- <wr-checkbox [formField]="profile.agree">I agree</wr-checkbox>
297
- `,
298
- })
299
- export class ProfileForm {
300
- readonly model = signal({ name: '', agree: false });
301
- readonly profile = form(this.model); // FieldTree — profile.name, profile.agree
302
- }
117
+ ```sh
118
+ ng update ngwr
303
119
  ```
304
120
 
305
- ## Catalog
306
-
307
- > Browse the full catalog with live demos at [**ngwr.dev**](https://ngwr.dev).
308
- > Each entry below is a tree-shakable subpath — `import { … } from 'ngwr/<name>'`.
309
- > A few share a package: `form-field` ships from `ngwr/form`, `button-group` from
310
- > `ngwr/button`, and `qr` is the subpath behind the `qrcode` docs page.
311
-
312
- ### Components
313
-
314
- **Form** — [calendar](https://ngwr.dev/reference/components/calendar), [cascader](https://ngwr.dev/reference/components/cascader), [checkbox](https://ngwr.dev/reference/components/checkbox), [color-picker](https://ngwr.dev/reference/components/color-picker), [date-picker](https://ngwr.dev/reference/components/date-picker), [file-upload](https://ngwr.dev/reference/components/file-upload), [form](https://ngwr.dev/reference/components/form), [form-field](https://ngwr.dev/reference/components/form-field), [input](https://ngwr.dev/reference/components/input), [input-number](https://ngwr.dev/reference/components/input-number), [input-otp](https://ngwr.dev/reference/components/input-otp), [knob](https://ngwr.dev/reference/components/knob), [mention](https://ngwr.dev/reference/components/mention), [radio](https://ngwr.dev/reference/components/radio), [rating](https://ngwr.dev/reference/components/rating), [schema-form](https://ngwr.dev/reference/components/schema-form), [segmented](https://ngwr.dev/reference/components/segmented), [select](https://ngwr.dev/reference/components/select), [slider](https://ngwr.dev/reference/components/slider), [switch](https://ngwr.dev/reference/components/switch), [textarea](https://ngwr.dev/reference/components/textarea), [transfer](https://ngwr.dev/reference/components/transfer).
315
-
316
- **Buttons** — [button](https://ngwr.dev/reference/components/button), [button-group](https://ngwr.dev/reference/components/button-group), [speed-dial](https://ngwr.dev/reference/components/speed-dial).
317
-
318
- **Data** — [drag-drop](https://ngwr.dev/reference/components/drag-drop), [event-calendar](https://ngwr.dev/reference/components/event-calendar), [graph](https://ngwr.dev/reference/components/graph), [pagination](https://ngwr.dev/reference/components/pagination), [pull-to-refresh](https://ngwr.dev/reference/components/pull-to-refresh), [table](https://ngwr.dev/reference/components/table), [tree](https://ngwr.dev/reference/components/tree), [virtual-scroll](https://ngwr.dev/reference/components/virtual-scroll).
319
-
320
- **Feedback** — [alert](https://ngwr.dev/reference/components/alert), [empty](https://ngwr.dev/reference/components/empty), [progress](https://ngwr.dev/reference/components/progress), [result](https://ngwr.dev/reference/components/result), [skeleton](https://ngwr.dev/reference/components/skeleton), [spinner](https://ngwr.dev/reference/components/spinner).
321
-
322
- **Display** — [avatar](https://ngwr.dev/reference/components/avatar), [badge](https://ngwr.dev/reference/components/badge) (incl. `wr-tag`), [compare](https://ngwr.dev/reference/components/compare), [counter](https://ngwr.dev/reference/components/counter), [descriptions](https://ngwr.dev/reference/components/descriptions), [divider](https://ngwr.dev/reference/components/divider), [image-cropper](https://ngwr.dev/reference/components/image-cropper), [keyboard](https://ngwr.dev/reference/components/keyboard), [lightbox](https://ngwr.dev/reference/components/lightbox), [markdown](https://ngwr.dev/reference/components/markdown), [qr](https://ngwr.dev/reference/components/qrcode), [statistic](https://ngwr.dev/reference/components/statistic), [timeline](https://ngwr.dev/reference/components/timeline).
323
-
324
- **Layout** — [card](https://ngwr.dev/reference/components/card), [carousel](https://ngwr.dev/reference/components/carousel), [collapse](https://ngwr.dev/reference/components/collapse), [layout](https://ngwr.dev/reference/components/layout), [list](https://ngwr.dev/reference/components/list), [page-header](https://ngwr.dev/reference/components/page-header), [splitter](https://ngwr.dev/reference/components/splitter), [toolbar](https://ngwr.dev/reference/components/toolbar).
325
-
326
- **Navigation** — [anchor](https://ngwr.dev/reference/components/anchor), [back-top](https://ngwr.dev/reference/components/back-top), [breadcrumbs](https://ngwr.dev/reference/components/breadcrumbs), [burger](https://ngwr.dev/reference/components/burger), [dropdown](https://ngwr.dev/reference/components/dropdown), [sidebar](https://ngwr.dev/reference/components/sidebar), [stepper](https://ngwr.dev/reference/components/stepper), [tabs](https://ngwr.dev/reference/components/tabs).
327
-
328
- **Overlays** — [action-sheet](https://ngwr.dev/reference/components/action-sheet), [command-palette](https://ngwr.dev/reference/components/command-palette), [context-menu](https://ngwr.dev/reference/components/context-menu), [dialog](https://ngwr.dev/reference/components/dialog), [drawer](https://ngwr.dev/reference/components/drawer), [popconfirm](https://ngwr.dev/reference/components/popconfirm), [popover](https://ngwr.dev/reference/components/popover), [toast](https://ngwr.dev/reference/components/toast), [window](https://ngwr.dev/reference/components/window).
329
-
330
- **Charts** — [bar-chart](https://ngwr.dev/reference/components/bar-chart), [calendar-heatmap](https://ngwr.dev/reference/components/calendar-heatmap), [donut-chart](https://ngwr.dev/reference/components/donut-chart), [gauge](https://ngwr.dev/reference/components/gauge), [line-chart](https://ngwr.dev/reference/components/line-chart), [meter-group](https://ngwr.dev/reference/components/meter-group), [sparkline](https://ngwr.dev/reference/components/sparkline).
331
-
332
- Plus [icon](https://ngwr.dev/reference/components/icon), the experimental [squircle](https://ngwr.dev/reference/components/squircle), and the [typography](https://ngwr.dev/reference/directives/typography) directive.
333
-
334
- ### Animations
335
-
336
- Animated UI effects. Mix of in-house components + ports of [reactbits.dev](https://www.reactbits.dev) — each port carries a credit chip on its docs page. Defaults are theme-aware (light + dark), and every component in **this section** honors `prefers-reduced-motion` — the one exception is `spotlight-card`, whose highlight only tracks the pointer. The scope of that sentence is the thing to read carefully: it says nothing about the rest of the catalog, and until v13 it was inviting a reader to over-generalise. The always-on chrome — the spinner and skeleton that animate on essentially every page, plus the enter animations on dialog, drawer, dropdown, popconfirm, toast, lightbox and the responsive bottom sheet — had no guard at all. It has one now, in the theme layer (`theme/styles/_motion.scss`) rather than per component, so the set is reviewable in one place.
337
-
338
- [aurora](https://ngwr.dev/animations/aurora), [blur-text](https://ngwr.dev/animations/blur-text), [border-glow](https://ngwr.dev/animations/border-glow), [circular-text](https://ngwr.dev/animations/circular-text), [click-spark](https://ngwr.dev/animations/click-spark), [confetti](https://ngwr.dev/animations/confetti), [decrypt-text](https://ngwr.dev/animations/decrypt-text), [falling-text](https://ngwr.dev/animations/falling-text), [fuzzy-text](https://ngwr.dev/animations/fuzzy-text), [glitch-text](https://ngwr.dev/animations/glitch-text), [gradient-text](https://ngwr.dev/animations/gradient-text), [marquee](https://ngwr.dev/animations/marquee), [rotating-text](https://ngwr.dev/animations/rotating-text), [shiny-text](https://ngwr.dev/animations/shiny-text), [splash-cursor](https://ngwr.dev/animations/splash-cursor), [split-text](https://ngwr.dev/animations/split-text), [spotlight-card](https://ngwr.dev/animations/spotlight-card), [star-border](https://ngwr.dev/animations/star-border), [tilt-card](https://ngwr.dev/animations/tilt-card), [typewriter](https://ngwr.dev/animations/typewriter), [waves](https://ngwr.dev/animations/waves).
121
+ This installs the latest version and runs its migrations. The
122
+ [migration guide](https://ngwr.dev/start/migration) describes the changes in
123
+ each major. The Angular badge shows the lowest Angular version ngwr needs.
124
+ [Versioning](https://ngwr.dev/start/versioning) explains the support policy.
339
125
 
340
- Card packages bundle their related directives: `ngwr/spotlight-card` exports `WrSpotlight`; `ngwr/tilt-card` exports `WrTilt`; `ngwr/shiny-text` exports `WrShimmer`.
126
+ ## AI agents
341
127
 
342
- ### Directives — `ngwr/directives`
343
-
344
- [autofocus](https://ngwr.dev/reference/directives/autofocus), [autosize](https://ngwr.dev/reference/directives/autosize), [click-outside](https://ngwr.dev/reference/directives/click-outside), [copy-to-clipboard](https://ngwr.dev/reference/directives/copy-to-clipboard). [affix](https://ngwr.dev/reference/directives/affix) ships as its own entry (`ngwr/affix`).
345
-
346
- ### Pipes — `ngwr/pipes`
347
-
348
- [wrBytes](https://ngwr.dev/reference/pipes/wr-bytes), [wrDate](https://ngwr.dev/reference/pipes/wr-date), [wrMark](https://ngwr.dev/reference/pipes/wr-mark), [wrNumber](https://ngwr.dev/reference/pipes/wr-number), [wrPlural](https://ngwr.dev/reference/pipes/wr-plural), [wrRange](https://ngwr.dev/reference/pipes/wr-range), [wrTruncate](https://ngwr.dev/reference/pipes/wr-truncate).
349
-
350
- ### Services
351
-
352
- [clipboard](https://ngwr.dev/reference/services/clipboard), [cookie](https://ngwr.dev/reference/services/cookie), [density](https://ngwr.dev/reference/services/density), [hotkey](https://ngwr.dev/reference/services/hotkey), [loading-bar](https://ngwr.dev/reference/services/loading-bar), [media](https://ngwr.dev/reference/services/media), [meta](https://ngwr.dev/reference/services/meta), [platform](https://ngwr.dev/reference/services/platform), [scroll](https://ngwr.dev/reference/services/scroll), [storage](https://ngwr.dev/reference/services/storage), [theme](https://ngwr.dev/reference/services/theme), [tour](https://ngwr.dev/reference/services/tour), [i18n](https://ngwr.dev/reference/services/i18n).
353
-
354
- ### Validators — `ngwr/validators`
355
-
356
- Bundled `ValidatorFn`s composing cleanly with Angular's built-in `Validators`: `cardNumber` (Luhn), `cvc`, `hexColor`, `iban` (mod-97), `match` (sibling control), `matchFields` (group-level), `maxDate`, `minDate`, `noWhitespace`, `oneOf`, `url`. See [docs](https://ngwr.dev/reference/validators).
357
-
358
- ### Utils — `ngwr/utils`
359
-
360
- Math (`clamp`, `round`), coercion (`numAttr`), css helpers (`resolveCssSize`, `getRootFontSize`), ids (`randomId`), type guards (`isDefined`, `isNonEmptyArray`, `isObservable`), keyboard helpers (`KEYS`, `hasModifier`, `isPrintableKey`), functional primitives (`noop`, `badgeLog`, `debounce`, `throttle`), focus management (`getFocusableElements`, `trapFocus`). See [docs](https://ngwr.dev/reference/utils) for the full list. Shared shapes (`Maybe`, `SafeAny`, `WrColor`, …) are documented under [Interfaces](https://ngwr.dev/reference/interfaces).
361
-
362
- ### Core
363
-
364
- - [Color](https://ngwr.dev/guides/tokens/colors) — design tokens and palette.
365
- - [Grid](https://ngwr.dev/guides/grid) — opt-in 12-column layout.
366
- - [Overlay](https://ngwr.dev/guides/overlay) — isolated CDK overlay container, `provideWrOverlay()`.
367
- - [Mobile & responsive](https://ngwr.dev/guides/mobile) — responsive overlays, touch targets & density, swipe gestures, safe-area insets, container-query layouts.
368
- - [Typography](https://ngwr.dev/guides/typography) — `wrTypography` directive: headings, paragraphs, lists, links, code.
369
- - [Icons](https://ngwr.dev/icons) — `ngwr/icon` registry. Use `svgIcon()` for any set that ships raw SVG files (Tabler, Phosphor, Heroicons, Iconoir, Radix, Bootstrap, or your designer's own), plus thin adapters for Lucide (`ngwr/icon/adapters/lucide`) and Feather (`ngwr/icon/adapters/feather`), whose packages don't ship SVGs.
370
- - **Date adapters** — `ngwr/date` (native `Date`, no extra package), `ngwr/date/adapters/fns`, `ngwr/date/adapters/luxon`. Wire one with `provideWrDateAdapter()` — plus `{ adapter: WrDateFnsAdapter }` / `{ adapter: WrLuxonAdapter }` for the library-backed ones — to power calendar + every mode of date-picker.
371
- - **Component defaults** — `ngwr/config`. `provideWrConfig({ button: { size: 'sm' } })` sets what a component falls back to when a template says nothing; a bound value always wins, and a bound `false` beats a configured `true`, so a config never has to be escaped. [Reference](https://ngwr.dev/start/configuration).
372
-
373
- ## Highlights
374
-
375
- - **Standalone & signals-first.** Every component is standalone and uses `input()` / `model()` / `output()` / `signal()` / `computed()`. Zoneless-ready.
376
- - **Signal Forms native.** Nineteen value controls implement `FormValueControl` / `FormCheckboxControl`, so `[formField]` binds straight through — there is no `ControlValueAccessor` in the library at all. `[(ngModel)]` and reactive forms keep working through Angular's bridge, and every control also works standalone via `[(value)]` / `[(checked)]`.
377
- - **CDK-powered.** Overlays, portals, and a11y come from `@angular/cdk`. We add `provideWrOverlay()` so NGWR overlays never collide with other CDK consumers (Material, NG-ZORRO, etc.).
378
- - **Mobile & responsive.** Overlays collapse to bottom-sheets on small screens (`provideWrResponsiveOverlays()`), touch targets grow to ≥44px on coarse pointers, a `touch` density preset enlarges the nine control families that read the multipliers, and drawer / lightbox / toast / carousel respond to swipe gestures. Fixed surfaces respect `env(safe-area-inset-*)`, and layout components (`descriptions`, `stepper`, `page-header`, `toolbar`, `pagination`, `table`) reflow to their container via container queries. [Guide](https://ngwr.dev/guides/mobile).
379
- - **Table, batteries included.** `wr-table` covers column pinning / resizing / drag-reorder, row selection, expandable rows, grouping, tree rows (`childrenKey` — the forest flattens into the same `<tbody>`, so pinning and cell templates keep working at every depth, and the table announces a `treegrid`), summary rows, CSV export (`exportCsv()`, dependency-free RFC 4180) and a virtualized body — all opt-in inputs on the one component. Excel (`.xlsx`) export is deliberately not shipped: it would mean a third-party dependency.
380
- - **Tree-shakable.** 227 separate ng-packagr entry points — import only what you use. Per-component FESM bundles are small: a median of ~4 KB gzipped, the heaviest (`ngwr/markdown`) ~23 KB. Every runtime bundle together gzips to ~690 KB — the 71 `ngwr/<name>/testing` harnesses aside, since they never reach an app bundle — but real apps pull a handful of entries. The only runtime dependency is `tslib`.
381
- - **Modular SCSS.** Component styles are scoped through CSS custom properties. Theme tokens live in `ngwr/theme`; utilities (`grid`, `reset`) and the breakpoints SCSS API are opt-in.
382
- - **Tree-shaken icons.** `provideWrIcons(lucideIcons({ plus: Plus }))` registers only the icons you actually import. Dev-mode validation warns about unregistered icons.
383
- - **Reactbits ports, dependency-free.** All animation ports are reimplemented with vanilla DOM + Web Animations API / `IntersectionObserver` / `requestAnimationFrame` / raw WebGL — no GSAP, no `motion/react`, no `matter-js`, no `ogl`.
384
- - **Motion respects the OS.** Every animation component short-circuits to its final state under `prefers-reduced-motion`, except `spotlight-card`, which animates nothing on its own — its highlight follows the cursor.
385
- - **Legible to agents.** Every docs page also serves as markdown at the same URL plus `.md` — [reference/components/select.md](https://ngwr.dev/reference/components/select.md) is that page's prose, code samples and API tables without the site chrome. The whole catalog is at [llms-full.txt](https://ngwr.dev/llms-full.txt), a quick-ref at [llms.txt](https://ngwr.dev/llms.txt).
386
-
387
- ### MCP server
388
-
389
- The package ships `ngwr-mcp`, a zero-dependency MCP server that makes those files askable: `search_ngwr` (find an entry point by what you need), `get_ngwr_component`, `get_ngwr_api` (a class's inputs / models / outputs / methods, read out of the shipped `.d.ts`) and `get_ngwr_setup` (the install, `ng g ngwr:use` and provider commands — returned as text; it never runs them). It adds no second copy of the catalog: it reads only files inside its own installed package, makes no network requests, and runs no commands.
128
+ ngwr ships `ngwr-mcp`, an MCP server that lets coding agents search the catalog
129
+ and read component APIs. Add it to your client:
390
130
 
391
131
  ```json
392
132
  {
393
133
  "mcpServers": {
394
- "ngwr": { "command": "npx", "args": ["-y", "ngwr-mcp"] }
134
+ "ngwr": { "command": "npx", "args": ["-y", "-p", "ngwr", "ngwr-mcp"] }
395
135
  }
396
136
  }
397
137
  ```
398
138
 
399
- Works in Claude Code (`claude mcp add ngwr -- npx -y ngwr-mcp`), Claude Desktop and Cursor. To pin it to the version in your lockfile, use `"command": "node", "args": ["./node_modules/ngwr/mcp/server.js"]`. [Guide](https://ngwr.dev/guides/mcp).
139
+ The [MCP guide](https://ngwr.dev/guides/mcp) covers each client. Agents without
140
+ MCP can use the [agent skill](https://ngwr.dev/guides/agent-skill),
141
+ [llms.txt](https://ngwr.dev/llms.txt), or any docs page as markdown by adding
142
+ `.md` to its URL.
400
143
 
401
144
  ## Contributing
402
145
 
403
- Conventional commits are enforced on PR titles. Common types: `feat`, `fix`, `perf`, `refactor`, `docs`, `style`, `test`, `build`, `ci`, `chore`, `revert`. Optional scope is the component or area (`feat(checkbox): icon mode`).
404
-
405
- ```shell
406
- pnpm install
407
- pnpm dev # ng serve --o (showcase)
408
- pnpm test # ng test lib (vitest)
409
- pnpm build:lib # ng build lib + ai assets + dist assets + i18n json + schematics + mcp server
410
- pnpm build:showcase # ai assets + showcase build + sitemap + markdown twins
411
- pnpm lint # ng lint + eslint scripts + stylelint + colour parity + rtl + registry + tokens
412
- ```
413
-
414
- ## Authors
415
-
416
- - [Roman Khegay](https://github.com/thekhegay) — code, design
146
+ Bug reports go to [issues](https://github.com/thekhegay/ngwr/issues/new/choose)
147
+ and questions to [Discussions](https://github.com/thekhegay/ngwr/discussions).
148
+ Read [CONTRIBUTING.md](https://github.com/thekhegay/ngwr/blob/main/CONTRIBUTING.md)
149
+ before opening a pull request, and report security issues privately as
150
+ [SECURITY.md](https://github.com/thekhegay/ngwr/blob/main/SECURITY.md) describes.
417
151
 
418
152
  ## License
419
153
 
420
- [MIT](./LICENSE) — free for commercial use.
154
+ [MIT](https://github.com/thekhegay/ngwr/blob/main/LICENSE) © [Roman Khegay](https://github.com/thekhegay)
@@ -121,6 +121,10 @@ $alert-colors: (
121
121
  }
122
122
  }
123
123
 
124
+ // color-ok: each type draws its OWN glyph in alert.html — a check in a broken
125
+ // circle, a triangle, an octagon, an `i` — so these hooks only ink a
126
+ // silhouette that already differs. `[icon]="false"` or an `iconName` hands
127
+ // that channel to the author, whose title then has to name the state.
124
128
  @each $variant, $color in $alert-colors {
125
129
  &--#{$variant} {
126
130
  --wr-alert-bg: var(--wr-color-#{$color}-soft);
@@ -130,6 +134,9 @@ $alert-colors: (
130
134
  }
131
135
 
132
136
  // Neutral — muted gray chip, reusing the `medium` soft tokens.
137
+ // color-ok: its own glyph in alert.html, a bar in a circle, is what tells it
138
+ // from `danger` — the two paints sit on tints 1.036:1 apart, which is a hue
139
+ // difference and little else (measured in the template's comment).
133
140
  &--neutral {
134
141
  --wr-alert-bg: var(--wr-color-medium-soft);
135
142
  --wr-alert-title: var(--wr-color-on-surface);
@@ -143,6 +150,9 @@ $alert-colors: (
143
150
 
144
151
  // Offline — inverse chip. Auto-flips via the theme tokens: dark bg +
145
152
  // light text in light theme; light bg + dark text in dark theme.
153
+ // color-ok: its own glyph in alert.html, a slashed circle — and the inverted
154
+ // chip is a LIGHTNESS change, an `on-surface` fill under `surface` text, the
155
+ // far end of the scale from every other type's pale tint.
146
156
  &--offline {
147
157
  --wr-alert-bg: var(--wr-color-on-surface);
148
158
  --wr-alert-title: var(--wr-color-surface);
@@ -73,10 +73,12 @@
73
73
  // the host's font. Shrinking only the wrapper's text sat the letters on the
74
74
  // baseline of the bigger strut, about 4px below centre in a 16px circle.
75
75
  //
76
- // Only while something is projected, because the spinner drawn when nothing
77
- // is sizes itself in `em` too, and it has no business shrinking. A size the
78
- // host did not publish leaves the `var()` unresolved, and the declaration
79
- // falls back to inheriting.
76
+ // Only while something is projected, which is when there is text to size.
77
+ // The one thing an empty avatar draws is the loading spinner, and the cap
78
+ // cannot reach it either way: it is 40% of the box rather than `em` (the
79
+ // `__spin` rule below), and it is hidden whenever something is projected. A
80
+ // size the host did not publish leaves the `var()` unresolved, and the
81
+ // declaration falls back to inheriting.
80
82
  //
81
83
  // `:where()` around the WHOLE selector leaves it no specificity, so any
82
84
  // unlayered `font-size` rule a consumer writes for the avatar — a type, class
@@ -128,10 +130,19 @@
128
130
  transition: opacity var(--wr-transition-base);
129
131
  }
130
132
 
131
- &__spin {
133
+ // Doubled with `.wr-spinner` on purpose. A lone `.wr-avatar__spin` ties with
134
+ // the spinner's own `.wr-spinner { color: inherit; --wr-spinner-size: 1.25em }`,
135
+ // and the combined `@use 'ngwr'` sheet forwards the spinner after the avatar,
136
+ // so the spinner won both: measured, every avatar drew a 19px spinner in the
137
+ // inherited ink (17.85:1 light, 15.73:1 dark) — 59% of a 32px box and 20% of
138
+ // a 96px one — and the colour and size written here never painted once.
139
+ // Specificity, not order, so it holds for an app that `@use`s the two entry
140
+ // points in either order.
141
+ &__spin.wr-spinner {
132
142
  position: absolute;
133
- // Same as the textarea grip: a loading indicator is a status GRAPHIC that
134
- // 1.4.11 holds to 3:1, and the faint tier is 2.43:1 in light.
143
+ // A loading indicator is a status GRAPHIC, which 1.4.11 holds to 3:1: the
144
+ // muted role is 5.35:1 light and 7.64:1 dark on the surface it sits over.
145
+ // Not the faint tier, which is 2.43:1 in light.
135
146
  color: var(--wr-color-on-surface-muted);
136
147
  --wr-spinner-size: 40%;
137
148
  }
@@ -72,6 +72,11 @@
72
72
 
73
73
  // Colors
74
74
 
75
+ // color-ok: a badge's colour is decoration or category, never the state —
76
+ // the LABEL carries that. Six of the nine intents share one lightness
77
+ // (`success` against `danger` is 1.004:1), so a badge whose words do not name
78
+ // the state tells a reader without hue nothing, and no palette can fix that
79
+ // without giving up the white labels the intents were tuned for.
75
80
  @each $name in theme.$colors {
76
81
  &--#{$name} {
77
82
  background-color: var(--wr-color-#{$name});
@@ -110,6 +115,8 @@
110
115
  background-color: transparent;
111
116
  box-shadow: inset 0 0 0 1px currentcolor;
112
117
 
118
+ // color-ok: the decision the filled loop above records — decoration or
119
+ // category, with the label carrying the state.
113
120
  @each $name in theme.$colors {
114
121
  &.wr-badge--#{$name} {
115
122
  color: var(--wr-color-#{$name}-ink);
@@ -68,6 +68,12 @@
68
68
  }
69
69
 
70
70
  // Colored variants
71
+ // color-ok: a tag's colour is decoration or category — the label carries the
72
+ // state (`Failed`, not a red `Build`), because six of the nine intents share
73
+ // one lightness and `success` against `danger` is 1.004:1. When a tag has to
74
+ // stand for a status on its own, its `icon` input is the channel. Nothing is
75
+ // drawn per intent by default: tags are categories too, and a check on
76
+ // `Standalone` would say something false.
71
77
  @each $name in theme.$colors {
72
78
  &--#{$name} {
73
79
  --wr-tag-color: var(--wr-color-#{$name}-contrast);
@@ -100,7 +106,7 @@
100
106
  // `--wr-color-outline`, which is already this component's default border.
101
107
  // color-ok: every outlined tag already draws a border — this only gives the
102
108
  // one intent that cannot tint one a literal colour. Telling two INTENTS
103
- // apart on a bare tag is the open half of D7 and is not what this rule does.
109
+ // apart is the label's job, as the marker above the loop says.
104
110
  &--light.wr-tag--outlined {
105
111
  --wr-tag-border: var(--wr-color-outline);
106
112
  }
@@ -197,6 +197,10 @@
197
197
  }
198
198
 
199
199
  // Color variants
200
+ // color-ok: a button's intent is emphasis, not a state — the label names the
201
+ // action and the intent only ranks it against its neighbours. A destructive
202
+ // button says `Delete`; a red `OK` is the author's colour-only cue, and no
203
+ // rule here can supply the word.
200
204
  @each $name in theme.$colors {
201
205
  &--#{$name} {
202
206
  --wr-btn-color: var(--wr-color-#{$name}-contrast);
@@ -271,6 +275,8 @@
271
275
  // borders. On hover/focus the segment raises its own border (z-index above
272
276
  // neighbours), which would otherwise double-paint that edge — so drop the
273
277
  // seam there and let the raised border own it cleanly.
278
+ // color-ok: not an intent cue — the seam is the same 20% black hairline for
279
+ // all nine; the loop only picks WHICH segments are solid enough to need it.
274
280
  @each $name in theme.$colors {
275
281
  > .wr-btn--#{$name}:not(.wr-btn--outlined):not(:last-child) {
276
282
  // `box-shadow` offsets are physical by spec — there is no logical form to