ngwr 11.2.0 → 12.1.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 (395) hide show
  1. package/README.md +85 -26
  2. package/burger/styles/_index.scss +1 -1
  3. package/button/styles/_index.scss +2 -2
  4. package/calendar/styles/_index.scss +32 -12
  5. package/calendar-heatmap/styles/_index.scss +20 -0
  6. package/carousel/styles/_index.scss +23 -1
  7. package/cascader/styles/_index.scss +15 -3
  8. package/checkbox/styles/_index.scss +2 -2
  9. package/collapse/styles/_index.scss +2 -2
  10. package/color-picker/styles/_index.scss +3 -3
  11. package/compare/styles/_index.scss +18 -2
  12. package/context-menu/styles/_index.scss +21 -2
  13. package/date-picker/styles/_index.scss +5 -5
  14. package/descriptions/styles/_index.scss +1 -1
  15. package/drag-drop/styles/_index.scss +28 -1
  16. package/drawer/styles/_index.scss +37 -0
  17. package/dropdown/styles/_index.scss +2 -2
  18. package/event-calendar/styles/_index.scss +67 -10
  19. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  20. package/fesm2022/ngwr-affix.mjs +3 -3
  21. package/fesm2022/ngwr-alert.mjs +3 -3
  22. package/fesm2022/ngwr-anchor.mjs +3 -3
  23. package/fesm2022/ngwr-aurora.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs +3 -3
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-badge.mjs +6 -6
  27. package/fesm2022/ngwr-bar-chart-testing.mjs +20 -2
  28. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  30. package/fesm2022/ngwr-blur-text.mjs +3 -3
  31. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  32. package/fesm2022/ngwr-border-glow.mjs +4 -4
  33. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  34. package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
  35. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  36. package/fesm2022/ngwr-burger.mjs +3 -3
  37. package/fesm2022/ngwr-button.mjs +6 -6
  38. package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
  39. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  40. package/fesm2022/ngwr-calendar-testing.mjs +1 -1
  41. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  42. package/fesm2022/ngwr-calendar.mjs +187 -9
  43. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  44. package/fesm2022/ngwr-card.mjs +10 -10
  45. package/fesm2022/ngwr-card.mjs.map +1 -1
  46. package/fesm2022/ngwr-carousel.mjs +124 -24
  47. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  48. package/fesm2022/ngwr-cascader.mjs +48 -5
  49. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  50. package/fesm2022/ngwr-checkbox.mjs +6 -6
  51. package/fesm2022/ngwr-circular-text.mjs +4 -4
  52. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  53. package/fesm2022/ngwr-click-spark.mjs +27 -7
  54. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  55. package/fesm2022/ngwr-clipboard.mjs +3 -3
  56. package/fesm2022/ngwr-collapse.mjs +9 -9
  57. package/fesm2022/ngwr-color-picker-testing.mjs +26 -6
  58. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  59. package/fesm2022/ngwr-color-picker.mjs +98 -8
  60. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  61. package/fesm2022/ngwr-command-palette.mjs +14 -5
  62. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  63. package/fesm2022/ngwr-compare.mjs +3 -3
  64. package/fesm2022/ngwr-confetti.mjs +31 -6
  65. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  66. package/fesm2022/ngwr-config.mjs +9 -0
  67. package/fesm2022/ngwr-config.mjs.map +1 -1
  68. package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
  69. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-context-menu.mjs +333 -43
  71. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  72. package/fesm2022/ngwr-cookie.mjs +3 -3
  73. package/fesm2022/ngwr-counter.mjs +25 -9
  74. package/fesm2022/ngwr-counter.mjs.map +1 -1
  75. package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
  76. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
  77. package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
  78. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
  79. package/fesm2022/ngwr-date-picker-testing.mjs +11 -6
  80. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  81. package/fesm2022/ngwr-date-picker.mjs +119 -37
  82. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  83. package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
  84. package/fesm2022/ngwr-date.mjs.map +1 -0
  85. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  86. package/fesm2022/ngwr-density.mjs +6 -6
  87. package/fesm2022/ngwr-descriptions.mjs +6 -6
  88. package/fesm2022/ngwr-dialog.mjs +73 -18
  89. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  90. package/fesm2022/ngwr-directives.mjs +12 -12
  91. package/fesm2022/ngwr-divider.mjs +52 -5
  92. package/fesm2022/ngwr-divider.mjs.map +1 -1
  93. package/fesm2022/ngwr-donut-chart-testing.mjs +8 -4
  94. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-donut-chart.mjs +7 -7
  96. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  97. package/fesm2022/ngwr-drag-drop.mjs +160 -11
  98. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  99. package/fesm2022/ngwr-drawer.mjs +121 -58
  100. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  101. package/fesm2022/ngwr-dropdown.mjs +26 -10
  102. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  103. package/fesm2022/ngwr-empty.mjs +3 -3
  104. package/fesm2022/ngwr-event-calendar.mjs +28 -15
  105. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  106. package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
  107. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  108. package/fesm2022/ngwr-falling-text.mjs +75 -46
  109. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  110. package/fesm2022/ngwr-file-upload.mjs +3 -3
  111. package/fesm2022/ngwr-form.mjs +32 -15
  112. package/fesm2022/ngwr-form.mjs.map +1 -1
  113. package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
  114. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  115. package/fesm2022/ngwr-gauge.mjs +3 -3
  116. package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
  117. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-glitch-text.mjs +7 -7
  119. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  120. package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
  121. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  123. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  124. package/fesm2022/ngwr-hotkey.mjs +24 -9
  125. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  126. package/fesm2022/ngwr-i18n-en.mjs +73 -1
  127. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  128. package/fesm2022/ngwr-i18n-ru.mjs +55 -1
  129. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  130. package/fesm2022/ngwr-i18n.mjs +26 -15
  131. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  132. package/fesm2022/ngwr-icon.mjs +6 -6
  133. package/fesm2022/ngwr-image-cropper-testing.mjs +53 -9
  134. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  135. package/fesm2022/ngwr-image-cropper.mjs +150 -12
  136. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  137. package/fesm2022/ngwr-input-number-testing.mjs +15 -10
  138. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  139. package/fesm2022/ngwr-input-number.mjs +17 -10
  140. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  141. package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
  142. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-input-otp.mjs +24 -5
  144. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  145. package/fesm2022/ngwr-input.mjs +15 -15
  146. package/fesm2022/ngwr-keyboard.mjs +3 -3
  147. package/fesm2022/ngwr-knob.mjs +3 -3
  148. package/fesm2022/ngwr-layout.mjs +15 -15
  149. package/fesm2022/ngwr-lightbox.mjs +4 -4
  150. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  151. package/fesm2022/ngwr-line-chart.mjs +73 -26
  152. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  153. package/fesm2022/ngwr-list.mjs +7 -7
  154. package/fesm2022/ngwr-list.mjs.map +1 -1
  155. package/fesm2022/ngwr-loading-bar.mjs +7 -7
  156. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  157. package/fesm2022/ngwr-markdown.mjs +66 -8
  158. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  159. package/fesm2022/ngwr-marquee.mjs +4 -4
  160. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  161. package/fesm2022/ngwr-media.mjs +3 -3
  162. package/fesm2022/ngwr-mention.mjs +108 -13
  163. package/fesm2022/ngwr-mention.mjs.map +1 -1
  164. package/fesm2022/ngwr-meta.mjs +6 -6
  165. package/fesm2022/ngwr-meter-group-testing.mjs +26 -6
  166. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  167. package/fesm2022/ngwr-meter-group.mjs +3 -3
  168. package/fesm2022/ngwr-overlay.mjs +6 -6
  169. package/fesm2022/ngwr-page-header.mjs +3 -3
  170. package/fesm2022/ngwr-pagination-testing.mjs +6 -6
  171. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  172. package/fesm2022/ngwr-pagination.mjs +83 -16
  173. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  174. package/fesm2022/ngwr-pipes.mjs +39 -26
  175. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  176. package/fesm2022/ngwr-platform.mjs +9 -9
  177. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  178. package/fesm2022/ngwr-popover-testing.mjs +7 -2
  179. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  180. package/fesm2022/ngwr-popover.mjs +155 -33
  181. package/fesm2022/ngwr-popover.mjs.map +1 -1
  182. package/fesm2022/ngwr-progress.mjs +3 -3
  183. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  184. package/fesm2022/ngwr-qr.mjs +42 -5
  185. package/fesm2022/ngwr-qr.mjs.map +1 -1
  186. package/fesm2022/ngwr-radio.mjs +6 -6
  187. package/fesm2022/ngwr-rating.mjs +3 -3
  188. package/fesm2022/ngwr-result.mjs +21 -30
  189. package/fesm2022/ngwr-result.mjs.map +1 -1
  190. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  191. package/fesm2022/ngwr-scroll.mjs +3 -3
  192. package/fesm2022/ngwr-segmented-testing.mjs +85 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +123 -10
  195. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  196. package/fesm2022/ngwr-select.mjs +159 -34
  197. package/fesm2022/ngwr-select.mjs.map +1 -1
  198. package/fesm2022/ngwr-shiny-text.mjs +11 -9
  199. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  200. package/fesm2022/ngwr-sidebar.mjs +31 -16
  201. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  202. package/fesm2022/ngwr-skeleton.mjs +3 -3
  203. package/fesm2022/ngwr-slider.mjs +100 -9
  204. package/fesm2022/ngwr-slider.mjs.map +1 -1
  205. package/fesm2022/ngwr-sparkline.mjs +3 -3
  206. package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
  207. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  208. package/fesm2022/ngwr-speed-dial.mjs +27 -12
  209. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  210. package/fesm2022/ngwr-spinner.mjs +3 -3
  211. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  212. package/fesm2022/ngwr-split-text.mjs +17 -5
  213. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-splitter.mjs +3 -3
  215. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  216. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  217. package/fesm2022/ngwr-squircle.mjs +6 -6
  218. package/fesm2022/ngwr-star-border.mjs +4 -4
  219. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  220. package/fesm2022/ngwr-statistic.mjs +9 -9
  221. package/fesm2022/ngwr-stepper-testing.mjs +8 -8
  222. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  223. package/fesm2022/ngwr-stepper.mjs +33 -8
  224. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  225. package/fesm2022/ngwr-storage.mjs +17 -5
  226. package/fesm2022/ngwr-storage.mjs.map +1 -1
  227. package/fesm2022/ngwr-switch.mjs +3 -3
  228. package/fesm2022/ngwr-table.mjs +99 -39
  229. package/fesm2022/ngwr-table.mjs.map +1 -1
  230. package/fesm2022/ngwr-tabs-testing.mjs +11 -10
  231. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-tabs.mjs +36 -10
  233. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  234. package/fesm2022/ngwr-textarea.mjs +3 -3
  235. package/fesm2022/ngwr-theme.mjs +181 -4
  236. package/fesm2022/ngwr-theme.mjs.map +1 -1
  237. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  238. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  239. package/fesm2022/ngwr-timeline.mjs +6 -6
  240. package/fesm2022/ngwr-toast.mjs +9 -9
  241. package/fesm2022/ngwr-toolbar.mjs +3 -3
  242. package/fesm2022/ngwr-tour.mjs +34 -10
  243. package/fesm2022/ngwr-tour.mjs.map +1 -1
  244. package/fesm2022/ngwr-transfer.mjs +3 -3
  245. package/fesm2022/ngwr-tree.mjs +28 -10
  246. package/fesm2022/ngwr-tree.mjs.map +1 -1
  247. package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
  248. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  249. package/fesm2022/ngwr-typewriter.mjs +13 -5
  250. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  251. package/fesm2022/ngwr-typography.mjs +3 -3
  252. package/fesm2022/ngwr-utils.mjs +5 -2
  253. package/fesm2022/ngwr-utils.mjs.map +1 -1
  254. package/fesm2022/ngwr-version.mjs +1 -1
  255. package/fesm2022/ngwr-version.mjs.map +1 -1
  256. package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
  257. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  258. package/fesm2022/ngwr-waves.mjs +4 -4
  259. package/fesm2022/ngwr-waves.mjs.map +1 -1
  260. package/fesm2022/ngwr-window.mjs +94 -24
  261. package/fesm2022/ngwr-window.mjs.map +1 -1
  262. package/file-upload/styles/_index.scss +2 -2
  263. package/glitch-text/styles/_index.scss +27 -12
  264. package/i18n/en.json +56 -6
  265. package/i18n/ru.json +56 -6
  266. package/image-cropper/styles/_index.scss +19 -0
  267. package/input/styles/_index.scss +2 -2
  268. package/input-number/styles/_index.scss +2 -2
  269. package/input-otp/styles/_index.scss +9 -2
  270. package/knob/styles/_index.scss +1 -1
  271. package/lightbox/styles/_index.scss +16 -2
  272. package/line-chart/styles/_index.scss +28 -14
  273. package/list/styles/_index.scss +1 -1
  274. package/llms-full.txt +19 -24
  275. package/llms.txt +46 -8
  276. package/markdown/styles/_index.scss +3 -3
  277. package/mcp/api.js +6 -4
  278. package/mcp/catalog.js +40 -3
  279. package/mcp/providers.js +16 -3
  280. package/mcp/tools.js +21 -1
  281. package/meter-group/styles/_index.scss +1 -1
  282. package/overlay/styles/_index.scss +33 -1
  283. package/package.json +17 -12
  284. package/pagination/styles/_index.scss +23 -1
  285. package/popover/styles/_index.scss +16 -7
  286. package/progress/styles/_index.scss +1 -1
  287. package/radio/styles/_index.scss +2 -2
  288. package/rating/styles/_index.scss +1 -1
  289. package/schematics/collection.json +1 -1
  290. package/schematics/migrations/v12/index.js +65 -0
  291. package/schematics/migrations/v7/index.js +12 -1
  292. package/schematics/migrations/v8/index.js +10 -1
  293. package/schematics/migrations.json +5 -0
  294. package/schematics/ng-add/index.js +8 -3
  295. package/schematics/provider/index.js +80 -13
  296. package/schematics/use/index.js +9 -129
  297. package/schematics/use/rule.js +206 -0
  298. package/schematics/use/symbol-map.json +4 -4
  299. package/segmented/styles/_index.scss +14 -3
  300. package/select/styles/_index.scss +14 -2
  301. package/sidebar/styles/_index.scss +12 -10
  302. package/skills/ngwr/SKILL.md +7 -5
  303. package/skills/ngwr/references/catalog.md +9 -9
  304. package/skills/ngwr/references/setup.md +10 -5
  305. package/slider/styles/_index.scss +1 -1
  306. package/speed-dial/styles/_index.scss +1 -1
  307. package/stepper/styles/_index.scss +12 -3
  308. package/switch/styles/_index.scss +2 -2
  309. package/table/styles/_index.scss +61 -12
  310. package/tabs/styles/_index.scss +1 -1
  311. package/textarea/styles/_index.scss +1 -1
  312. package/theme/styles/_colors.scss +142 -56
  313. package/theme/styles/_dark.scss +46 -3
  314. package/theme/styles/_focus.scss +28 -5
  315. package/theme/styles/_mixins.scss +1 -1
  316. package/theme/styles/_variables.scss +67 -0
  317. package/transfer/styles/_index.scss +26 -3
  318. package/tree/styles/_index.scss +29 -6
  319. package/types/ngwr-bar-chart-testing.d.ts +9 -1
  320. package/types/ngwr-blur-text.d.ts +8 -4
  321. package/types/ngwr-breadcrumbs.d.ts +17 -10
  322. package/types/ngwr-calendar-testing.d.ts +1 -1
  323. package/types/ngwr-calendar.d.ts +66 -0
  324. package/types/ngwr-carousel.d.ts +85 -6
  325. package/types/ngwr-cascader.d.ts +17 -0
  326. package/types/ngwr-click-spark.d.ts +4 -0
  327. package/types/ngwr-color-picker-testing.d.ts +8 -0
  328. package/types/ngwr-color-picker.d.ts +21 -1
  329. package/types/ngwr-confetti.d.ts +8 -0
  330. package/types/ngwr-config.d.ts +10 -1
  331. package/types/ngwr-context-menu-testing.d.ts +24 -11
  332. package/types/ngwr-context-menu.d.ts +56 -0
  333. package/types/ngwr-counter.d.ts +1 -0
  334. package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
  335. package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
  336. package/types/ngwr-date-picker-testing.d.ts +11 -6
  337. package/types/ngwr-date-picker.d.ts +8 -4
  338. package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
  339. package/types/ngwr-dialog.d.ts +38 -1
  340. package/types/ngwr-divider.d.ts +25 -0
  341. package/types/ngwr-donut-chart-testing.d.ts +7 -3
  342. package/types/ngwr-donut-chart.d.ts +3 -3
  343. package/types/ngwr-drag-drop.d.ts +56 -2
  344. package/types/ngwr-drawer.d.ts +56 -5
  345. package/types/ngwr-event-calendar.d.ts +8 -2
  346. package/types/ngwr-falling-text-testing.d.ts +5 -3
  347. package/types/ngwr-falling-text.d.ts +1 -1
  348. package/types/ngwr-form.d.ts +12 -2
  349. package/types/ngwr-glitch-text-testing.d.ts +37 -8
  350. package/types/ngwr-gradient-text-testing.d.ts +16 -3
  351. package/types/ngwr-i18n.d.ts +13 -4
  352. package/types/ngwr-image-cropper-testing.d.ts +49 -10
  353. package/types/ngwr-image-cropper.d.ts +70 -5
  354. package/types/ngwr-input-number-testing.d.ts +15 -10
  355. package/types/ngwr-input-number.d.ts +11 -4
  356. package/types/ngwr-input-otp-testing.d.ts +12 -6
  357. package/types/ngwr-input-otp.d.ts +15 -1
  358. package/types/ngwr-line-chart.d.ts +20 -3
  359. package/types/ngwr-markdown.d.ts +11 -0
  360. package/types/ngwr-mention.d.ts +32 -0
  361. package/types/ngwr-meter-group-testing.d.ts +12 -2
  362. package/types/ngwr-overlay.d.ts +1 -0
  363. package/types/ngwr-pagination-testing.d.ts +4 -4
  364. package/types/ngwr-pagination.d.ts +11 -0
  365. package/types/ngwr-pipes.d.ts +1 -1
  366. package/types/ngwr-popover-testing.d.ts +7 -2
  367. package/types/ngwr-popover.d.ts +1 -0
  368. package/types/ngwr-result.d.ts +6 -0
  369. package/types/ngwr-segmented-testing.d.ts +53 -0
  370. package/types/ngwr-segmented.d.ts +107 -5
  371. package/types/ngwr-select.d.ts +68 -6
  372. package/types/ngwr-shiny-text.d.ts +4 -2
  373. package/types/ngwr-sidebar.d.ts +14 -5
  374. package/types/ngwr-slider.d.ts +69 -1
  375. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  376. package/types/ngwr-speed-dial.d.ts +22 -3
  377. package/types/ngwr-split-text.d.ts +9 -0
  378. package/types/ngwr-stepper-testing.d.ts +5 -5
  379. package/types/ngwr-stepper.d.ts +8 -0
  380. package/types/ngwr-storage.d.ts +1 -0
  381. package/types/ngwr-table.d.ts +104 -11
  382. package/types/ngwr-tabs-testing.d.ts +11 -10
  383. package/types/ngwr-tabs.d.ts +2 -0
  384. package/types/ngwr-theme.d.ts +82 -1
  385. package/types/ngwr-tour.d.ts +22 -4
  386. package/types/ngwr-tree.d.ts +5 -4
  387. package/types/ngwr-typewriter-testing.d.ts +10 -0
  388. package/types/ngwr-utils.d.ts +5 -2
  389. package/types/ngwr-version.d.ts +1 -1
  390. package/types/ngwr-window.d.ts +39 -11
  391. package/typography/styles/_index.scss +1 -1
  392. package/window/styles/_index.scss +72 -26
  393. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  395. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -54,11 +54,11 @@ interface WrInputOtpHarnessFilters extends BaseHarnessFilters {
54
54
  * single character.
55
55
  *
56
56
  * A box is more than the string it shows: it carries its own accessible name
57
- * (`Digit 3`), its own emptiness, its own masking, and it is the thing that
58
- * either has focus or does not. The root harness answers the control's
59
- * questions (the assembled code, which index is focused); this one answers the
60
- * box's, so a spec can hold on to "the box that has focus" instead of zipping
61
- * four parallel arrays by index.
57
+ * (`Digit 3` on a numeric strip, `Character 3` on the others), its own
58
+ * emptiness, its own masking, and it is the thing that either has focus or does
59
+ * not. The root harness answers the control's questions (the assembled code,
60
+ * which index is focused); this one answers the box's, so a spec can hold on to
61
+ * "the box that has focus" instead of zipping four parallel arrays by index.
62
62
  *
63
63
  * @example
64
64
  * ```ts
@@ -93,11 +93,17 @@ declare class WrInputOtpBoxHarness extends ComponentHarness {
93
93
  /** Whether the box is still waiting for a character. */
94
94
  isEmpty(): Promise<boolean>;
95
95
  /**
96
- * The box's accessible name — `Digit 1`, `Digit 2`, …
96
+ * The box's accessible name — `Digit 1`, `Digit 2`, … on a numeric strip.
97
97
  *
98
98
  * This is the whole of a box's identity for a screen-reader user: the boxes
99
99
  * carry no visible label and no position in an `aria-*` set, so the name is
100
100
  * how someone knows which one they are in.
101
+ *
102
+ * The word depends on `mode`, so an assertion has to follow it: the
103
+ * `alphanumeric` and `text` modes accept letters, and the component names
104
+ * their boxes `Character 1`, `Character 2`, … rather than call an `A` a digit.
105
+ * Both come from the `inputOtp.digit` / `inputOtp.character` catalog entries,
106
+ * so a localized app answers here in its own language.
101
107
  */
102
108
  getLabel(): Promise<string | null>;
103
109
  /** Whether the box hides what was typed, like a password field. */
@@ -42,6 +42,9 @@ type WrInputOtpSize = 'sm' | 'md' | 'lg';
42
42
  */
43
43
  declare class WrInputOtp implements FormValueControl<string> {
44
44
  private readonly dir;
45
+ /** Accessible name of the whole strip. Falls back to `inputOtp.label`. */
46
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
47
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string>;
45
48
  /** Number of cells to render. Clamped to `[1, 20]`. @default 6 */
46
49
  readonly length: _angular_core.InputSignalWithTransform<number, unknown>;
47
50
  /** Character set per cell. @default 'numeric' */
@@ -81,6 +84,8 @@ declare class WrInputOtp implements FormValueControl<string> {
81
84
  protected readonly classes: _angular_core.Signal<string>;
82
85
  protected readonly cellType: _angular_core.Signal<"text" | "password">;
83
86
  protected readonly cellInputMode: _angular_core.Signal<"numeric" | "text">;
87
+ private readonly digitLabel;
88
+ private readonly characterLabel;
84
89
  protected readonly cellRefs: _angular_core.Signal<readonly ElementRef<HTMLInputElement>[]>;
85
90
  constructor();
86
91
  protected onInput(event: Event, index: number): void;
@@ -88,6 +93,15 @@ declare class WrInputOtp implements FormValueControl<string> {
88
93
  protected onPaste(event: ClipboardEvent): void;
89
94
  protected onBlur(): void;
90
95
  protected trackIndex(index: number): number;
96
+ /**
97
+ * A box's accessible name. It projects no text and carries no label of its own,
98
+ * so this string IS the name a screen reader reads for it.
99
+ *
100
+ * Keyed off `mode`, not fixed: `sanitiseChar` passes any letter through in
101
+ * `alphanumeric` and `text`, so the old literal announced "Digit 3" over a box
102
+ * holding `A` — wrong in a way translating it would not have fixed.
103
+ */
104
+ protected cellLabel(index: number): string;
91
105
  private update;
92
106
  private emitChange;
93
107
  private focusCell;
@@ -102,7 +116,7 @@ declare class WrInputOtp implements FormValueControl<string> {
102
116
  */
103
117
  private inlineKey;
104
118
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrInputOtp, never>;
105
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputOtp, "wr-input-otp", never, { "length": { "alias": "length"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "completed": "completed"; "touch": "touch"; }, never, never, true, never>;
119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrInputOtp, "wr-input-otp", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "length": { "alias": "length"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "completed": "completed"; "touch": "touch"; }, never, never, true, never>;
106
120
  }
107
121
 
108
122
  export { WrInputOtp };
@@ -55,7 +55,7 @@ declare class WrLineChart {
55
55
  protected readonly hoveredIndex: _angular_core.WritableSignal<number | null>;
56
56
  protected readonly resolvedSeries: _angular_core.Signal<{
57
57
  label: string;
58
- data: number[];
58
+ data: (number | null)[];
59
59
  color: string;
60
60
  }[]>;
61
61
  protected readonly bounds: _angular_core.Signal<{
@@ -70,12 +70,29 @@ declare class WrLineChart {
70
70
  }[]>;
71
71
  protected readonly plotWidth: () => number;
72
72
  protected readonly plotHeight: () => number;
73
- /** Get the SVG path for a series. */
73
+ /**
74
+ * The SVG path for a series — one subpath per unbroken run, so a hole in the data
75
+ * leaves a hole in the line rather than a straight segment across it.
76
+ */
74
77
  protected pathFor(series: {
75
- data: readonly number[];
78
+ data: readonly (number | null)[];
76
79
  }): string;
77
80
  protected pointX(index: number): number;
78
81
  protected pointY(value: number): number;
82
+ /**
83
+ * A point's x as a percentage of the host's width. The x-label strip and the SVG share
84
+ * that width — the drawing stretches to it — so this is the same space the tooltip and
85
+ * the labels are placed in, at any size.
86
+ */
87
+ protected xPercent(index: number): number;
88
+ /**
89
+ * How wide an x label may be, as a percentage of the host's width: its own slot — half
90
+ * the distance to a neighbour on each side — cut back to what is left between its point
91
+ * and the end of the strip. Centring a label on its point says nothing about its WIDTH,
92
+ * and with no bound at all twelve month names printed over each other and the last one
93
+ * hung outside the chart. Past this the stylesheet ellipsises.
94
+ */
95
+ protected xMaxPercent(index: number): number;
79
96
  protected readonly hoverPoints: _angular_core.Signal<{
80
97
  label: string;
81
98
  value: number;
@@ -387,6 +387,17 @@ declare class WrMarkdownHighlight {
387
387
  private fill;
388
388
  /** `Map` iterates in insertion order, and `linesFor` re-inserts on read. */
389
389
  private evict;
390
+ /**
391
+ * The same bound, one dimension out. `request` re-inserts a bucket it already
392
+ * holds, so the outer map iterates least-recently-REQUESTED first — and the
393
+ * component's effect asks for every code block in the document it is showing,
394
+ * so a language that stops being requested is one nothing renders any more.
395
+ *
396
+ * Read is deliberately NOT a touch here, unlike {@link linesFor} for the inner
397
+ * map: with the effect re-asking for every block, request order already tracks
398
+ * what is rendered, and nothing has needed the finer signal.
399
+ */
400
+ private evictLanguage;
390
401
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrMarkdownHighlight, never>;
391
402
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<WrMarkdownHighlight>;
392
403
  }
@@ -65,6 +65,12 @@ declare class WrMention<T extends WrMentionItem = WrMentionItem> {
65
65
  private readonly isBrowser;
66
66
  private overlayRef;
67
67
  private panelRef;
68
+ /**
69
+ * Where the caret sits INSIDE the field — its offset from the field's
70
+ * top-left corner, plus the height of the line it is on. Mutated in place by
71
+ * `open()`, never replaced: `caretAnchor()` closes over this object.
72
+ */
73
+ private readonly caretOffset;
68
74
  private state;
69
75
  private readonly activeIndex;
70
76
  private readonly filteredItems;
@@ -113,6 +119,27 @@ declare class WrMention<T extends WrMentionItem = WrMentionItem> {
113
119
  private activate;
114
120
  private filter;
115
121
  private setActive;
122
+ /**
123
+ * The overlay's anchor: the caret's line box, grown by the gap the panel
124
+ * keeps from the text, as a zero-WIDTH virtual origin in viewport
125
+ * coordinates. Inflating the rect rather than passing `offsetY` is what keeps
126
+ * `withPush` honest — CDK applies a position offset as a `transform` AFTER it
127
+ * has clamped, so a pushed panel would land the offset off the screen edge.
128
+ *
129
+ * Live getters, not a snapshot, and that is the whole of the scroll fix.
130
+ * `getCaretCoordinates` answers in viewport coordinates, which a
131
+ * `GlobalPositionStrategy` froze at the instant of the keystroke: the panel
132
+ * then stayed pinned to the screen while the page scrolled out from under it
133
+ * (150px of scroll, 150px of drift, ending up over unrelated content). CDK
134
+ * re-reads a virtual origin on every `apply()`, so pinning it to the FIELD's
135
+ * live rect is what turns `reposition()` into a real re-anchor.
136
+ *
137
+ * Only the caret's offset inside the field is captured up front. Measuring it
138
+ * runs the mirror-div pass in `caret.ts` — a full layout read, far too
139
+ * expensive to repeat per scroll event — and it cannot change without a
140
+ * keystroke, which re-enters `open()` anyway.
141
+ */
142
+ private caretAnchor;
116
143
  private open;
117
144
  private close;
118
145
  private commit;
@@ -123,6 +150,11 @@ declare class WrMention<T extends WrMentionItem = WrMentionItem> {
123
150
  /**
124
151
  * Overlay panel rendered by {@link WrMention}. Not intended for
125
152
  * direct use — the directive instantiates it via a ComponentPortal.
153
+ *
154
+ * @internal — the same tag its twin `WrPopconfirmPanel` already carried. It says
155
+ * the intent; it does not by itself keep the class out of the generated API
156
+ * tables, because `WrTableFilter` and `WrTableSort` are tagged AND documented —
157
+ * see `EXPORTED_BUT_INTERNAL` in `scripts/lib/extract-api.ts`.
126
158
  */
127
159
  declare class WrMentionPanel {
128
160
  readonly items: _angular_core.InputSignal<readonly WrMentionItem[]>;
@@ -35,8 +35,16 @@ interface WrMeterGroupSlice {
35
35
  * **The bar is a single `progressbar`, and its value is the TOTAL.** The bands
36
36
  * themselves announce nothing: they carry a `title` for a mouse and their share as an
37
37
  * inline width, and the legend is where their labels and values are readable. So a
38
- * spec that wants "how much of each" reads {@link getLegend} or {@link getSlices},
39
- * and one that wants "how full" reads {@link getValue}.
38
+ * spec that wants "how much of each" reads {@link getSlices} for the shares or
39
+ * {@link getLegendLabels} / {@link getLegendValues} for what is printed, and one that
40
+ * wants "how full" reads {@link getValue}.
41
+ *
42
+ * **A band's share is read off the `style` ATTRIBUTE, not through `getCssValue()`**,
43
+ * and the difference is not cosmetic: `getCssValue()` is `getComputedStyle()`, and
44
+ * `width` resolves to the USED value — so the declared `30%` comes straight back in
45
+ * jsdom and arrives as `180px` on a 600px bar in a real browser, and the same harness
46
+ * answered 30 here and 180 under a browser runner with nothing to say which one you
47
+ * got.
40
48
  *
41
49
  * @see https://ngwr.dev/guides/testing
42
50
  */
@@ -55,6 +63,8 @@ declare class WrMeterGroupHarness extends ComponentHarness {
55
63
  getMax(): Promise<number>;
56
64
  /** The bands, in order, with the share of the bar each takes. */
57
65
  getSlices(): Promise<WrMeterGroupSlice[]>;
66
+ /** Parse one band's declared share. See the class note on why this is not `getCssValue()`. */
67
+ private static percentOf;
58
68
  /** Whether the legend is rendered (`showLegend`, and at least one band). */
59
69
  hasLegend(): Promise<boolean>;
60
70
  /** The legend's labels, in order. */
@@ -303,3 +303,4 @@ declare const WR_OVERLAY: InjectionToken<Overlay>;
303
303
  declare const WR_OVERLAY_CONTAINER: InjectionToken<OverlayContainer>;
304
304
 
305
305
  export { WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, WrOutsideClick, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, wrAppendOverlayClose, wrMirrorOffsets, wrPresentAsSheet };
306
+ export type { WrResponsiveOverlaysConfig };
@@ -179,10 +179,10 @@ declare class WrPaginationHarness extends ComponentHarness {
179
179
  * The page the pager announces as current, from `aria-current="page"`.
180
180
  *
181
181
  * Throws when no cell claims it. The window always keeps the current page on the
182
- * strip, so getting here means `currentPage` is not one of the pages at all — it
183
- * is below 1, or not a whole number. The component clamps a page ABOVE the last
184
- * one and nothing else, and either survivor leaves every cell looking equally
185
- * inactive to an assistive tech user.
182
+ * strip, so getting here means `currentPage` is not one of the pages at all. The
183
+ * component clamps a host write into `1..totalPages`, which leaves one survivor:
184
+ * a fractional page, which is in range and matches no cell — and which leaves
185
+ * every cell looking equally inactive to an assistive tech user.
186
186
  */
187
187
  getCurrentPage(): Promise<number>;
188
188
  /**
@@ -111,6 +111,17 @@ declare class WrPagination {
111
111
  protected readonly navLabel: _angular_core.Signal<string>;
112
112
  /** Internal: total page count. */
113
113
  protected readonly totalPages: _angular_core.Signal<number>;
114
+ /**
115
+ * Internal: where the previous arrow goes. Clamped to the end of the valid
116
+ * range rather than being a plain `currentPage() - 1`, because the page can
117
+ * legitimately sit past that end while `total` is 0 (see the guard effect).
118
+ * From page 5 of one page, `goTo(4)` is refused as out of range, so the arrow
119
+ * was enabled and did nothing — and under `responsive` on a narrow box the
120
+ * numbered cells are hidden by a container query, which left no way back at
121
+ * all. `Math.min` only ever moves the target INWARD, so `goTo`'s own
122
+ * past-the-end refusal keeps working as the backstop it is.
123
+ */
124
+ protected readonly prevPage: _angular_core.Signal<number>;
114
125
  /** Internal: "X–Y of Z" string. */
115
126
  protected readonly rangeLabel: _angular_core.Signal<string>;
116
127
  /**
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { PipeTransform } from '@angular/core';
3
- import { WrDateFormat } from 'ngwr/date-adapter';
3
+ import { WrDateFormat } from 'ngwr/date';
4
4
  import { SafeHtml } from '@angular/platform-browser';
5
5
 
6
6
  /**
@@ -181,8 +181,13 @@ declare class WrPopoverHarness extends ContentContainerComponentHarness {
181
181
  * Where the panel sits relative to the trigger, or `null` when it is presented
182
182
  * as a sheet and has no anchor.
183
183
  *
184
- * The resolved position — the directive defaults it per mode (`bottom` for a
185
- * popover, `top` for a tooltip) — read off the pane's public modifier class.
184
+ * The APPLIED position, not the requested one: CDK flips a placement that does
185
+ * not fit to the next in its fallback chain and swaps the modifier class with
186
+ * it. Under a unit test that is always the requested placement — jsdom measures
187
+ * every box as 0×0, so the first candidate always "fits" — but in a browser the
188
+ * two can differ, and this answers what is on screen. The directive defaults
189
+ * the request per mode (`bottom` for a popover, `top` for a tooltip).
190
+ *
186
191
  * The arrow itself is a `::after` pseudo-element, so it exists for no DOM query
187
192
  * at all; this class is the placement, and it is what the arrow's own CSS keys
188
193
  * off.
@@ -73,6 +73,7 @@ declare class WrPopover {
73
73
  private readonly resolvedAriaLabel;
74
74
  private readonly resolvedPosition;
75
75
  private overlayRef;
76
+ private textPanelRef;
76
77
  private hoverCloseTimer;
77
78
  private showTimer;
78
79
  private hideTimer;
@@ -40,6 +40,8 @@ declare class WrResult {
40
40
  * ```
41
41
  */
42
42
  declare class WrResult404 {
43
+ /** Bound by the shared template; not an input — a preset IS its status. */
44
+ protected readonly status: WrResultStatus;
43
45
  readonly title: _angular_core.InputSignal<string>;
44
46
  /** Body text. Falls back to `result.notFound` from WrI18n. */
45
47
  readonly description: _angular_core.InputSignal<string | null>;
@@ -49,6 +51,8 @@ declare class WrResult404 {
49
51
  }
50
52
  /** Pre-set 403 result — forbidden / no access. */
51
53
  declare class WrResult403 {
54
+ /** Bound by the shared template; not an input — a preset IS its status. */
55
+ protected readonly status: WrResultStatus;
52
56
  readonly title: _angular_core.InputSignal<string>;
53
57
  /** Body text. Falls back to `result.forbidden` from WrI18n. */
54
58
  readonly description: _angular_core.InputSignal<string | null>;
@@ -58,6 +62,8 @@ declare class WrResult403 {
58
62
  }
59
63
  /** Pre-set 500 result — internal server error. */
60
64
  declare class WrResult500 {
65
+ /** Bound by the shared template; not an input — a preset IS its status. */
66
+ protected readonly status: WrResultStatus;
61
67
  readonly title: _angular_core.InputSignal<string>;
62
68
  /** Body text. Falls back to `result.serverError` from WrI18n. */
63
69
  readonly description: _angular_core.InputSignal<string | null>;
@@ -194,6 +194,17 @@ declare class WrSegmentedOptionHarness extends ComponentHarness {
194
194
  * - Activation is the browser's own default action on a button, which jsdom does not
195
195
  * implement, so {@link select} clicks — see {@link WrSegmentedOptionHarness.select}.
196
196
  *
197
+ * **It is a signal-forms control**, which adds two things to read here and one that
198
+ * cannot be read at all. `[formField]` binds the component's own `value` model, and a
199
+ * surrounding `<wr-form-field>` publishes its state onto the GROUP —
200
+ * {@link isInvalid} and {@link getDescriptionText} answer that, on the host rather
201
+ * than per segment, because the strip is one field and a description repeated on
202
+ * every segment would be announced once per Tab. What is NOT here is the field's
203
+ * `touched` flag: the component only emits `touch`, and whether anything listened is
204
+ * a fact about the form, not about this DOM — assert it on the field.
205
+ * {@link blur} is how a spec gets there, and it is the ONLY route: a click does not
206
+ * mark a field touched, and neither does moving from one segment to the next.
207
+ *
197
208
  * **There is deliberately no `getValue()` and no selection by value.** `options` is
198
209
  * a bound array of `{ value, label, … }` and the value is a generic `T` the component
199
210
  * writes nowhere — not on the host, not on a segment. The single exception is an
@@ -339,6 +350,39 @@ declare class WrSegmentedHarness extends ComponentHarness {
339
350
  * {@link getTabStopLabels} gives.
340
351
  */
341
352
  getFocusedLabel(): Promise<string | null>;
353
+ /**
354
+ * Whether the surrounding `<wr-form-field>` is reporting this control invalid, from
355
+ * `aria-invalid` on the host.
356
+ *
357
+ * `false` for a control with no field around it, and `false` for a field that is
358
+ * invalid but has not shown its copy yet: the component keys the attribute on the
359
+ * MESSAGE existing rather than on the error, because announcing "invalid" while
360
+ * pointing at nothing is worse than staying quiet. So this and
361
+ * {@link getDescriptionText} move together, and a `true` with no description would
362
+ * be the finding.
363
+ */
364
+ isInvalid(): Promise<boolean>;
365
+ /**
366
+ * The text `aria-describedby` points at — the validation copy a screen reader is
367
+ * given for this control — or `null` when the host describes nothing.
368
+ *
369
+ * Resolved from the document root, because the element named may sit anywhere on
370
+ * the page, and THROWS when the reference resolves to no element: a dangling
371
+ * `aria-describedby` renders exactly like a working one and is announced as
372
+ * nothing, so returning `null` for it would report the bug as the healthy state.
373
+ */
374
+ getDescriptionText(): Promise<string | null>;
375
+ /**
376
+ * Take focus off the strip entirely — what marks a bound field touched, and the
377
+ * only thing that does.
378
+ *
379
+ * The component emits `touch` from a `focusout` that leaves the host, so a click
380
+ * does not reach it and neither does Tab from one segment to the next: a strip a
381
+ * user tabbed straight past has to end up untouched, which is the case `touched`
382
+ * exists for. Resolves quietly when nothing inside was focused, since that is
383
+ * already the state this asks for.
384
+ */
385
+ blur(): Promise<void>;
342
386
  /**
343
387
  * The index the component publishes for the thumb, from the
344
388
  * `--wr-segmented-thumb-index` custom property it sets inline.
@@ -393,6 +437,15 @@ declare class WrSegmentedHarness extends ComponentHarness {
393
437
  /** Segment names for an error message, which must not throw on its way out. */
394
438
  private describeOptions;
395
439
  private describe;
440
+ /**
441
+ * One custom property off the host's `style` ATTRIBUTE.
442
+ *
443
+ * Not `getCssValue()`, which is `getComputedStyle`: with the entry point's own
444
+ * stylesheet loaded that resolves the sheet's declaration, so the method
445
+ * answers plausibly at exactly the moment the host binding — the thing under
446
+ * test — is what broke. The attribute holds only what the component wrote.
447
+ */
448
+ private inlineVar;
396
449
  /** One of the thumb's inline custom properties, as a number. */
397
450
  private thumbVar;
398
451
  }
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { FormValueControl } from '@angular/forms/signals';
2
3
  import { WrIconName } from 'ngwr/icon';
3
4
 
4
5
  /**
@@ -31,8 +32,25 @@ interface WrSegmentedOption<T = unknown> {
31
32
  * Single-choice picker rendered as a segmented control. Two-way binds
32
33
  * the selected `value`.
33
34
  *
35
+ * A signal-forms native control: it implements `FormValueControl<T | null>`, so
36
+ * `[formField]` binds straight to its `value` model — no
37
+ * `ControlValueAccessor` in between. `[(value)]` works standalone, and classic
38
+ * `[(ngModel)]` / reactive forms keep working through Angular's bridge.
39
+ *
40
+ * It stays a `role="group"` of `aria-pressed` toggle buttons rather than
41
+ * becoming a `radiogroup`: being a form control changes what the value is bound
42
+ * to, not what the widget is, and a radiogroup would owe a roving tab stop and
43
+ * arrow-key selection — a different keyboard contract for every consumer who
44
+ * already ships this. The group is what the field describes (`aria-describedby`
45
+ * / `aria-invalid` land on the host), while the `<label for>` has to name a
46
+ * labelable element, so the id goes on the first segment.
47
+ *
34
48
  * @example
35
49
  * ```html
50
+ * <!-- signal forms -->
51
+ * <wr-segmented [options]="ranges" [formField]="form.range" />
52
+ *
53
+ * <!-- standalone two-way binding -->
36
54
  * <wr-segmented
37
55
  * [options]="[
38
56
  * { value: 'day', label: 'Day' },
@@ -46,28 +64,112 @@ interface WrSegmentedOption<T = unknown> {
46
64
  * @see https://ngwr.dev/reference/components/segmented
47
65
  */
48
66
  type WrSegmentedSize = 'sm' | 'md' | 'lg';
49
- declare class WrSegmented<T = unknown> {
67
+ declare class WrSegmented<T = unknown> implements FormValueControl<T | null> {
50
68
  /** The segments to render. */
51
69
  readonly options: _angular_core.InputSignal<readonly WrSegmentedOption<T>[]>;
52
- /** Two-way bindable selected value. */
70
+ /**
71
+ * The picked segment's `value`, `null` when nothing is selected. Bound by
72
+ * `[formField]`, or two-way via `[(value)]`.
73
+ */
53
74
  readonly value: _angular_core.ModelSignal<T | null>;
54
- /** Disable the whole control. @default false */
75
+ /** Emitted when focus leaves the strip, so a bound field can mark itself touched. */
76
+ readonly touch: _angular_core.OutputEmitterRef<void>;
77
+ /**
78
+ * Disable the whole control. Bound automatically from the field's disabled
79
+ * state when used with `[formField]`.
80
+ *
81
+ * @default false
82
+ */
55
83
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
56
84
  /** Control size — shares the `--wr-control-*` contract. @default 'md' */
57
85
  readonly size: _angular_core.InputSignal<WrSegmentedSize>;
86
+ private readonly host;
87
+ private readonly field;
88
+ /**
89
+ * Id the surrounding `<wr-form-field>`'s `<label for>` points at, stamped on the
90
+ * FIRST segment.
91
+ *
92
+ * The field renders its label before it can see what was projected into it, so the
93
+ * id travels the other way and the control adopts it, exactly as `[wrInput]`,
94
+ * `wr-slider` and `wr-select` do. Without this the `for` named an element that was
95
+ * nowhere in the document: clicking the label did nothing.
96
+ *
97
+ * It cannot go on the host — only a labelable element can be a label's target, and
98
+ * `<wr-segmented>` is not one — and there is no single control to put it on, so it
99
+ * goes where clicking the label should land a user: the first segment, which is
100
+ * also the strip's first tab stop. The same choice `wr-slider` makes with its low
101
+ * thumb.
102
+ *
103
+ * What this does NOT change is that segment's NAME: it is named by its own label,
104
+ * and a `<label for>` cannot outrank text content in the accname order anyway.
105
+ *
106
+ * The one shape this reads wrong is a strip NESTED inside another control that is
107
+ * itself the field — `<wr-color-picker>`'s own format tabs are the only case in
108
+ * the library — where the id lands on a tab instead of on the picker. That is the
109
+ * same exposure `[wrInput]`, `wr-slider` and `wr-select` all carry, and the fix
110
+ * belongs to the outer control (shield its subtree by providing `WR_FORM_FIELD`
111
+ * as `null`), not to a strip that cannot tell whose field it is in.
112
+ */
113
+ protected readonly controlId: _angular_core.Signal<string | null>;
114
+ /**
115
+ * The field's error message, wired to the GROUP rather than to a segment.
116
+ *
117
+ * A segmented control is one field made of several buttons, so the description
118
+ * belongs to the thing the field describes — repeated on every segment it would be
119
+ * announced once per Tab. `role="group"` supports neither state as a role-specific
120
+ * attribute, but both are ARIA globals, so this is valid where an `aria-checked`
121
+ * would not be.
122
+ *
123
+ * `aria-invalid` is keyed on the message EXISTING rather than on `errorKeys()`,
124
+ * because the field only publishes an id once it is showing something — announcing
125
+ * "invalid" while pointing at nothing is worse than staying quiet.
126
+ */
127
+ protected readonly describedBy: _angular_core.Signal<string | null>;
128
+ protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
58
129
  /** Index of the selected option, or `-1` when nothing is selected. */
59
130
  protected readonly selectedIndex: _angular_core.Signal<number>;
60
131
  /** Flips true after the first paint so the thumb only animates user-driven changes, not the initial snap. */
61
132
  private readonly mounted;
62
133
  constructor();
63
134
  protected readonly classes: _angular_core.Signal<string>;
64
- /** Inline CSS vars driving the sliding thumb position. */
135
+ private readonly dir;
136
+ /**
137
+ * Reading direction of the strip. `Directionality` is root-provided, so this
138
+ * always resolves — `optional` only guards a consumer who has deliberately
139
+ * torn the provider out. A subtree that overrides the direction does it with
140
+ * the CDK's `Dir` directive, which writes `valueSignal`, so `thumbStyle`
141
+ * re-renders instead of leaving the thumb parked on the old segment.
142
+ */
143
+ private readonly isRtl;
144
+ /**
145
+ * Inline CSS vars driving the sliding thumb position.
146
+ *
147
+ * `--wr-segmented-thumb-index` is the SLOT the thumb parks in, counted from the
148
+ * physical left, which is the selected index only in LTR. The stylesheet anchors
149
+ * the thumb with a physical `left` and slides it with `translateX` — neither has
150
+ * a logical form — while the options are a grid that mirrors, so under `dir="rtl"`
151
+ * the segment at logical index `i` occupies slot `count - 1 - i`. Left unsigned,
152
+ * the pill sat under a different label than the one it marks (the whole strip's
153
+ * worth of offset at the far end), which is the carousel's `trackStyle` problem
154
+ * one component over.
155
+ */
65
156
  protected readonly thumbStyle: _angular_core.Signal<Record<string, string>>;
66
157
  protected isSelected(option: WrSegmentedOption<T>): boolean;
67
158
  protected select(option: WrSegmentedOption<T>): void;
68
159
  protected trackByValue(_: number, option: WrSegmentedOption<T>): unknown;
160
+ /**
161
+ * A bound field learns it may show its validation copy from `touch`, and a click
162
+ * cannot be the source: a strip tabbed into and out of without a pick left the
163
+ * field untouched forever — which is exactly the case `touched` exists for.
164
+ *
165
+ * `wr-knob` and `wr-rating` bind `(blur)` on the one element they own; this
166
+ * component owns one button per option, so it listens for the bubbling `focusout`
167
+ * on its host instead — and ignores the one that only moves focus from one segment
168
+ * to the next, the way `wr-slider` ignores the hop between its two thumbs.
169
+ */
170
+ protected onFocusOut(event: FocusEvent): void;
69
171
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSegmented<any>, never>;
70
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSegmented<any>, "wr-segmented", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
172
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSegmented<any>, "wr-segmented", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
71
173
  }
72
174
 
73
175
  export { WrSegmented };