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
@@ -36,7 +36,7 @@
36
36
  white-space: nowrap;
37
37
 
38
38
  &:focus-visible + .wr-radio__dot {
39
- box-shadow: 0 0 0 3px rgba(var(--wr-color-primary-rgb), 0.2);
39
+ @include theme.focus-ring;
40
40
  }
41
41
  }
42
42
 
@@ -115,7 +115,7 @@
115
115
  &--disabled {
116
116
  --wr-radio-color: var(--wr-color-on-surface-muted);
117
117
  pointer-events: none;
118
- opacity: 0.6;
118
+ opacity: var(--wr-disabled-opacity);
119
119
  }
120
120
  }
121
121
 
@@ -75,7 +75,7 @@
75
75
  }
76
76
 
77
77
  &--disabled {
78
- opacity: 0.6;
78
+ opacity: var(--wr-disabled-opacity);
79
79
 
80
80
  .wr-rating__slot {
81
81
  cursor: not-allowed;
@@ -18,7 +18,7 @@
18
18
  "schema": "./use/schema.json"
19
19
  },
20
20
  "provider": {
21
- "description": "Add a `provideWr*()` call to your bootstrap providers (overlay / icons / toast / i18n / date-adapter / density / loading-bar / cookie / storage / theme).",
21
+ "description": "Add a `provideWr*()` call to your bootstrap providers (overlay / icons / toast / i18n / date-adapter / density / storage / theme).",
22
22
  "factory": "./provider/index#default",
23
23
  "schema": "./provider/schema.json"
24
24
  },
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ /**
10
+ * Anchored with `(?![-\w])` rather than `\b`.
11
+ *
12
+ * A word boundary matches between `r` and `-`, so a `\b`-anchored
13
+ * `ngwr/date-adapter` also matches the first half of `ngwr/date-adapter-fns`.
14
+ * Ordering alone would hide that here, but the anchor is what makes each
15
+ * pattern correct on its own — and it is the same trap the v9 migration
16
+ * documents for `<wr-checkbox` against `<wr-checkbox-group`.
17
+ */
18
+ const TRANSFORMS = [
19
+ { pattern: /ngwr\/date-adapter-fns(?![-\w])/g, replacement: 'ngwr/date/adapters/fns' },
20
+ { pattern: /ngwr\/date-adapter-luxon(?![-\w])/g, replacement: 'ngwr/date/adapters/luxon' },
21
+ { pattern: /ngwr\/date-adapter(?![-\w])/g, replacement: 'ngwr/date' },
22
+ ];
23
+ const IGNORE_DIRS = new Set(['node_modules', 'dist', '.git', '.cache', '.angular', 'coverage', '.next', '.nuxt']);
24
+ function ngUpdateV12() {
25
+ return (tree, context) => {
26
+ let touched = 0;
27
+ visit(tree, '/', filePath => {
28
+ const lower = filePath.toLowerCase();
29
+ // `.ts` for imports, `.html` for a rare inline `@import`-style reference,
30
+ // `.json` because an import map or a jest moduleNameMapper can name them.
31
+ if (!lower.endsWith('.ts') && !lower.endsWith('.html') && !lower.endsWith('.json'))
32
+ return;
33
+ const original = tree.readText(filePath);
34
+ const next = apply(original, TRANSFORMS);
35
+ if (next !== original) {
36
+ tree.overwrite(filePath, next);
37
+ touched += 1;
38
+ }
39
+ });
40
+ context.logger.info(`ngwr v12 migration: rewrote ${touched} file(s) (ngwr/date-adapter* → ngwr/date/adapters/*).\n` +
41
+ 'Every symbol keeps its name — only the import path moved, so the catalog nests ' +
42
+ 'implementations under their feature the way ngwr/icon/adapters/* already did.');
43
+ context.logger.info('Verify the result with `git diff`.');
44
+ return tree;
45
+ };
46
+ }
47
+ function apply(content, transforms) {
48
+ let next = content;
49
+ for (const { pattern, replacement } of transforms) {
50
+ next = next.replace(pattern, replacement);
51
+ }
52
+ return next;
53
+ }
54
+ function visit(tree, dir, visitor) {
55
+ const entry = tree.getDir(dir);
56
+ for (const file of entry.subfiles) {
57
+ visitor(`${dir === '/' ? '' : dir}/${file}`);
58
+ }
59
+ for (const sub of entry.subdirs) {
60
+ if (IGNORE_DIRS.has(sub))
61
+ continue;
62
+ visit(tree, `${dir === '/' ? '' : dir}/${sub}`, visitor);
63
+ }
64
+ }
65
+ exports.default = ngUpdateV12;
@@ -116,7 +116,18 @@ function ngUpdateV7() {
116
116
  return;
117
117
  const original = tree.readText(filePath);
118
118
  let next = original;
119
- if (isHtml)
119
+ // Inline templates live in .ts files too, so run the element-scoped
120
+ // transforms there as well — the gate v9 already uses. Skipping them was
121
+ // worse than leaving a file unmigrated: `applyTs` renames the import and
122
+ // the symbol in that same file, so a component with
123
+ // `template: '<wr-autocomplete …>'` came out importing WrSelect with a tag
124
+ // that now matches no directive, and the build failed NG8001 after the
125
+ // migration reported success. Every pattern in HTML_TRANSFORMS is anchored
126
+ // on `<wr-…`, `[wrTooltip]` or `wrTooltip=`, so the only TypeScript they
127
+ // can reach is a line that already reads like markup — an unspaced
128
+ // `this.wrTooltip="x"` assignment being the one shape that qualifies and
129
+ // is not, which is what the `git diff` advice below is for.
130
+ if (isHtml || isTs)
120
131
  next = applyHtml(next);
121
132
  if (isTs)
122
133
  next = applyTs(next);
@@ -71,7 +71,16 @@ function ngUpdateV8() {
71
71
  return;
72
72
  const original = tree.readText(filePath);
73
73
  let next = original;
74
- if (isHtml)
74
+ // Inline templates live in .ts files too, so the attribute rewrites run
75
+ // there as well. `wrDensity="compact"` left in one is not a cosmetic miss:
76
+ // `WrDensityDirective.wrDensity` is `input.required<WrDensityValue>()` and
77
+ // `'compact'` is not in that union, so the app stops compiling under
78
+ // strictTemplates after the upgrade. Every pattern is anchored on
79
+ // `wrDensity=`, `data-wr-density=` or `<wr-pagination`, so the only
80
+ // TypeScript they can reach is a line that already reads like markup — an
81
+ // unspaced `this.wrDensity="compact"` assignment being the one shape that
82
+ // qualifies and is not, which is what the `git diff` advice below is for.
83
+ if (isHtml || isTs)
75
84
  next = apply(next, HTML_TRANSFORMS);
76
85
  if (isTs)
77
86
  next = apply(next, TS_TRANSFORMS);
@@ -15,6 +15,11 @@
15
15
  "version": "9.0.0",
16
16
  "description": "Rename the <wr-checkbox> group-membership input value \u2192 checkboxValue (also [value] / [(value)]). The standalone checkbox is now a signal-forms FormCheckboxControl whose contract reserves `value` for the form value \u2014 its boolean state is the `checked` model. Touches .html and .ts files.",
17
17
  "factory": "./migrations/v9/index#default"
18
+ },
19
+ "migration-v12": {
20
+ "version": "12.0.0",
21
+ "description": "Move the date entry points under one namespace: ngwr/date-adapter \u2192 ngwr/date, ngwr/date-adapter-fns \u2192 ngwr/date/adapters/fns, ngwr/date-adapter-luxon \u2192 ngwr/date/adapters/luxon. Import paths only \u2014 every exported symbol keeps its name. Touches .ts, .html and .json files.",
22
+ "factory": "./migrations/v12/index#default"
18
23
  }
19
24
  }
20
25
  }
@@ -16,6 +16,11 @@ const workspace_1 = require("@schematics/angular/utility/workspace");
16
16
  * `lucide` is here because the bootstrap snippet this schematic prints registers
17
17
  * icons through the lucide adapter — leaving it out made the very first snippet
18
18
  * a consumer pastes fail to resolve.
19
+ *
20
+ * `@angular/forms` is a REQUIRED peer in `projects/lib/package.json` and is
21
+ * deliberately NOT here: every `ng new` app already depends on it, so installing
22
+ * it would be a no-op write to the consumer's manifest. The manifest declares it
23
+ * because a consumer can remove it; this list is about what `ng add` has to add.
19
24
  */
20
25
  const BASE_PEERS = [
21
26
  ['@angular/cdk', '>=22.0.0'],
@@ -145,12 +150,12 @@ function printNextSteps(options, context) {
145
150
  const providers = ['provideWrOverlay()', 'provideWrIcons(lucideIcons({ plus: Plus, trash: Trash2 }))'];
146
151
  const adapterCall = DATE_ADAPTER_PROVIDER[adapter];
147
152
  if (adapterCall) {
148
- imports.push("import { provideWrDateAdapter } from 'ngwr/date-adapter';");
153
+ imports.push("import { provideWrDateAdapter } from 'ngwr/date';");
149
154
  if (adapter === 'date-fns') {
150
- imports.push("import { WrDateFnsAdapter } from 'ngwr/date-adapter-fns';");
155
+ imports.push("import { WrDateFnsAdapter } from 'ngwr/date/adapters/fns';");
151
156
  }
152
157
  else if (adapter === 'luxon') {
153
- imports.push("import { WrLuxonAdapter } from 'ngwr/date-adapter-luxon';");
158
+ imports.push("import { WrLuxonAdapter } from 'ngwr/date/adapters/luxon';");
154
159
  }
155
160
  providers.push(adapterCall);
156
161
  }
@@ -34,7 +34,7 @@ const PROVIDERS = {
34
34
  },
35
35
  i18n: { subpath: 'ngwr/i18n', factory: 'provideWrI18n', call: 'provideWrI18n()' },
36
36
  'date-adapter': {
37
- subpath: 'ngwr/date-adapter',
37
+ subpath: 'ngwr/date',
38
38
  factory: 'provideWrDateAdapter',
39
39
  call: 'provideWrDateAdapter()',
40
40
  },
@@ -47,13 +47,26 @@ function provider(options) {
47
47
  const spec = PROVIDERS[options.name];
48
48
  if (!spec)
49
49
  throw new schematics_1.SchematicsException(`ngwr:provider: unknown provider "${options.name}".`);
50
- const filePath = await resolveMainFile(tree, options);
50
+ const filePath = await resolveTargetFile(tree, options);
51
51
  if (!filePath) {
52
52
  context.logger.info(printSnippet(spec));
53
53
  return tree;
54
54
  }
55
55
  const original = tree.readText(filePath);
56
- let next = original;
56
+ // Splice FIRST, and bail before touching the file if there is nowhere to
57
+ // splice into. The imports used to go in ahead of this, so by the time the
58
+ // splice found no array the buffer already differed from the original and
59
+ // the `next === original` guard below could not catch it: the file was
60
+ // overwritten with an unused import and reported as `✓ Added <call>`. On a
61
+ // stock app that made `ng g ngwr:provider overlay` print success and leave
62
+ // it with no overlay container.
63
+ const spliced = ensureProviderCall(original, spec.call);
64
+ if (spliced === null) {
65
+ context.logger.info(`ngwr:provider: no providers array in ${filePath}.`);
66
+ context.logger.info(printSnippet(spec));
67
+ return tree;
68
+ }
69
+ let next = spliced;
57
70
  next = ensureImport(next, spec.factory, spec.subpath);
58
71
  // Drive the extra imports off `extras` rather than special-casing a provider
59
72
  // name here: the two used to drift apart, and the hard-coded branch was
@@ -61,7 +74,6 @@ function provider(options) {
61
74
  for (const [symbols, subpath] of spec.extras ?? []) {
62
75
  next = ensureImport(next, symbols, subpath);
63
76
  }
64
- next = ensureProviderCall(next, spec.call);
65
77
  if (next === original) {
66
78
  context.logger.info(`ngwr:provider: ${filePath} already has ${spec.factory} — no changes.`);
67
79
  return tree;
@@ -71,17 +83,70 @@ function provider(options) {
71
83
  return tree;
72
84
  };
73
85
  }
74
- async function resolveMainFile(tree, options) {
86
+ /** The providers array of a `bootstrapApplication` call or an `ApplicationConfig`. */
87
+ const PROVIDERS_ARRAY = /(\bproviders\s*:\s*\[)([\s\S]*?)(\])/m;
88
+ /**
89
+ * The file that actually holds `providers: [ … ]`.
90
+ *
91
+ * Resolving the build target's entry file and stopping there is only right for
92
+ * the pre-v17 shape, where `bootstrapApplication` and its providers sit in
93
+ * `main.ts` together. `ng new` has since split them: `main.ts` is two lines
94
+ * ending in `bootstrapApplication(App, appConfig)` and the array lives in
95
+ * `app/app.config.ts` — the layout `projects/showcase/main.ts` uses as well. So
96
+ * follow the entry file's own RELATIVE imports one level and prefer whichever of
97
+ * them owns the array; one level is what `ng new` generates, and a path alias
98
+ * (`#root`, `@app/…`) is deliberately not followed, since resolving one needs
99
+ * the tsconfig. When nothing found this way has an array, the entry file is
100
+ * handed back and the caller prints a snippet rather than editing it.
101
+ */
102
+ async function resolveTargetFile(tree, options) {
103
+ const entry = await resolveEntryFile(tree, options);
104
+ if (!entry)
105
+ return null;
106
+ if (PROVIDERS_ARRAY.test(tree.readText(entry)))
107
+ return entry;
108
+ return followConfigImport(tree, entry) ?? entry;
109
+ }
110
+ /** The first module `entry` imports relatively that declares a providers array. */
111
+ function followConfigImport(tree, entry) {
112
+ const dir = entry.slice(0, entry.lastIndexOf('/') + 1);
113
+ for (const [, specifier] of tree.readText(entry).matchAll(/from\s*['"](\.[^'"]*)['"]/g)) {
114
+ // TypeScript module specifiers carry no extension; `.ts` is the only one
115
+ // `ng new` produces for this file, and a wrong guess just misses.
116
+ const candidate = normalisePath(`${dir}${specifier}.ts`);
117
+ if (tree.exists(candidate) && PROVIDERS_ARRAY.test(tree.readText(candidate)))
118
+ return candidate;
119
+ }
120
+ return null;
121
+ }
122
+ /** Collapse `.` / `..` in a joined workspace path — `Tree` resolves neither. */
123
+ function normalisePath(path) {
124
+ const out = [];
125
+ for (const part of path.split('/')) {
126
+ if (part === '' || part === '.')
127
+ continue;
128
+ if (part === '..')
129
+ out.pop();
130
+ else
131
+ out.push(part);
132
+ }
133
+ return `${path.startsWith('/') ? '/' : ''}${out.join('/')}`;
134
+ }
135
+ async function resolveEntryFile(tree, options) {
75
136
  if (options.path && tree.exists(options.path))
76
137
  return options.path;
77
138
  const workspace = await (0, workspace_1.getWorkspace)(tree);
78
- const projectName = options.project ?? workspace.extensions.defaultProject;
139
+ // Both bags are `Record<string, JsonValue>`. Named through a shape rather than
140
+ // read with `foo['bar']`, because this file compiles under two configs: its own
141
+ // CommonJS tsconfig, and — since the spec beside it imports it — the root one,
142
+ // which sets `noPropertyAccessFromIndexSignature`.
143
+ const extensions = workspace.extensions;
144
+ const projectName = options.project ?? extensions.defaultProject;
79
145
  const project = (projectName && workspace.projects.get(projectName)) ?? workspace.projects.values().next().value;
80
146
  if (!project)
81
147
  return null;
82
- const main = project.targets.get('build')?.options?.main;
83
- const browser = project.targets.get('build')?.options?.browser;
84
- const candidate = main ?? browser ?? `${project.sourceRoot ?? 'src'}/main.ts`;
148
+ const build = project.targets.get('build')?.options;
149
+ const candidate = build?.main ?? build?.browser ?? `${project.sourceRoot ?? 'src'}/main.ts`;
85
150
  return tree.exists(candidate) ? candidate : null;
86
151
  }
87
152
  function ensureImport(source, symbol, subpath) {
@@ -105,12 +170,14 @@ function ensureImport(source, symbol, subpath) {
105
170
  }
106
171
  return `${newLine}${source}`;
107
172
  }
173
+ /** The source with `call` spliced in, or `null` when there is no array to splice into. */
108
174
  function ensureProviderCall(source, call) {
109
- // Splice into the providers array of bootstrapApplication / ApplicationConfig.
110
- const arrayRe = /(\bproviders\s*:\s*\[)([\s\S]*?)(\])/m;
111
- const match = arrayRe.exec(source);
175
+ const match = PROVIDERS_ARRAY.exec(source);
176
+ // `null`, not the untouched source: "nothing to do" and "already done" are
177
+ // different answers, and returning the same value for both is what let the
178
+ // caller report a successful edit it had not made.
112
179
  if (!match)
113
- return source;
180
+ return null;
114
181
  // Already present?
115
182
  const callBase = call.split('(')[0];
116
183
  if (new RegExp(`\\b${escapeRegExp(callBase)}\\s*\\(`).test(match[2]))
@@ -6,142 +6,22 @@
6
6
  * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- const schematics_1 = require("@angular-devkit/schematics");
9
+ const rule_1 = require("./rule");
10
10
  // Bundled at build time by `scripts/build-symbol-map.ts`. Map of every
11
11
  // `Wr*` public symbol → the subpath it lives under.
12
12
  // eslint-disable-next-line @typescript-eslint/no-require-imports
13
13
  const SYMBOL_MAP = require('./symbol-map.json');
14
14
  /**
15
- * Add `import { WrFoo } from 'ngwr/<subpath>';` to the given component
16
- * file and splice `WrFoo` into the `@Component({ imports: [...] })`
17
- * array. Saves the subpath-lookup dance for newcomers — `ng g ngwr:use
18
- * WrButton --path src/app/my-page.ts`.
15
+ * `ng g ngwr:use WrButton --path src/app/my-page.ts` — the rule itself is in
16
+ * `./rule`, which takes the map as an argument.
19
17
  *
20
- * Only `symbol` is positional (see schema.json); `path` is a named option, so
21
- * the bare `ng g ngwr:use WrButton src/app/my-page.ts` form fails with
22
- * `Unknown argument`.
23
- *
24
- * Regex-based on purpose to avoid pulling in the TS compiler as a runtime
25
- * dep. Covers the common standalone-component shape; an unusual file
26
- * shape gets a clear warning + a copy-pasteable snippet.
18
+ * The split is what makes the rule testable: `symbol-map.json` is generated
19
+ * into `dist/lib/schematics/use/` and does not exist in the source tree, so
20
+ * anything reading this file from source — the unit-test builder included —
21
+ * fails to resolve the `require` above. Keeping it alone in this file leaves
22
+ * one un-runnable line instead of the whole schematic.
27
23
  */
28
24
  function use(options) {
29
- return (tree, context) => {
30
- const symbol = options.symbol.trim();
31
- if (!symbol)
32
- throw new schematics_1.SchematicsException('ngwr:use: missing required `symbol`.');
33
- const subpath = SYMBOL_MAP[symbol];
34
- if (!subpath) {
35
- throw new schematics_1.SchematicsException(`ngwr:use: unknown symbol "${symbol}". Check the catalog at https://ngwr.dev or use the literal import: \`import { ${symbol} } from 'ngwr/<subpath>';\``);
36
- }
37
- const filePath = resolveTargetFile(tree, options.path);
38
- if (!filePath) {
39
- // No file passed: just print the import snippet and stop.
40
- context.logger.info(printManualSnippet(symbol, subpath));
41
- return tree;
42
- }
43
- if (!tree.exists(filePath)) {
44
- throw new schematics_1.SchematicsException(`ngwr:use: file ${filePath} not found.`);
45
- }
46
- const original = tree.readText(filePath);
47
- let next = original;
48
- next = addImport(next, symbol, subpath);
49
- next = addToImportsArray(next, symbol);
50
- if (next === original) {
51
- context.logger.info(`ngwr:use: ${filePath} already has ${symbol} — no changes.`);
52
- return tree;
53
- }
54
- tree.overwrite(filePath, next);
55
- context.logger.info(`✓ Added ${symbol} (from ${subpath}) to ${filePath}.`);
56
- return tree;
57
- };
58
- }
59
- function resolveTargetFile(tree, candidate) {
60
- if (!candidate)
61
- return null;
62
- const path = candidate.startsWith('/') ? candidate : `/${candidate}`;
63
- if (tree.exists(path))
64
- return path;
65
- if (tree.exists(candidate))
66
- return candidate;
67
- return null;
68
- }
69
- /**
70
- * Insert `import { Symbol } from 'subpath';` near the existing imports,
71
- * or merge into an existing line that already references the same path.
72
- * Idempotent — returns the source untouched if the symbol is already in.
73
- */
74
- function addImport(source, symbol, subpath) {
75
- // Already imported from somewhere?
76
- const importedAnywhere = new RegExp(`\\bimport\\s*\\{[^}]*\\b${symbol}\\b[^}]*\\}\\s*from`).test(source);
77
- if (importedAnywhere)
78
- return source;
79
- // Existing import from the same subpath? — splice the symbol in.
80
- const sameSubpathRe = new RegExp(`(import\\s*\\{)([^}]*)(\\}\\s*from\\s*['"]${escapeRegExp(subpath)}['"])`, 'm');
81
- const sameSubpathMatch = sameSubpathRe.exec(source);
82
- if (sameSubpathMatch) {
83
- const head = sameSubpathMatch[1];
84
- const body = sameSubpathMatch[2].trim().replace(/,\s*$/, '');
85
- const tail = sameSubpathMatch[3];
86
- const merged = body ? `${head} ${body}, ${symbol} ${tail}` : `${head} ${symbol} ${tail}`;
87
- return source.replace(sameSubpathMatch[0], merged);
88
- }
89
- // No related import — prepend a new line after the last top-of-file
90
- // import we can find.
91
- const importBlockRe = /(^|\n)(import\s[^;]+;\s*\n)+/m;
92
- const block = importBlockRe.exec(source);
93
- const newLine = `import { ${symbol} } from '${subpath}';\n`;
94
- if (block) {
95
- // Splice in immediately after the last import in the block.
96
- const end = (block.index ?? 0) + block[0].length;
97
- return `${source.slice(0, end)}${newLine}${source.slice(end)}`;
98
- }
99
- // No existing imports — just prepend.
100
- return `${newLine}${source}`;
101
- }
102
- /**
103
- * Find `imports: [...]` inside a `@Component({...})` decorator (single or
104
- * multi-line) and splice the symbol in. Skips if the symbol is already
105
- * listed.
106
- */
107
- function addToImportsArray(source, symbol) {
108
- // Match `imports: [ ... ]` allowing multi-line + trailing commas.
109
- const arrayRe = /(\bimports\s*:\s*\[)([\s\S]*?)(\])/m;
110
- const match = arrayRe.exec(source);
111
- if (!match) {
112
- // No imports array — try to insert one after the `@Component({`
113
- // opening brace. Heuristic, not foolproof.
114
- const componentRe = /@Component\s*\(\s*\{/;
115
- const compMatch = componentRe.exec(source);
116
- if (compMatch?.index === undefined) {
117
- // No @Component decorator at all — leave the file alone, the user
118
- // probably wants the import only.
119
- return source;
120
- }
121
- const insertAt = compMatch.index + compMatch[0].length;
122
- return `${source.slice(0, insertAt)}\n imports: [${symbol}],${source.slice(insertAt)}`;
123
- }
124
- const body = match[2];
125
- if (new RegExp(`\\b${escapeRegExp(symbol)}\\b`).test(body))
126
- return source;
127
- const trimmed = body.replace(/\s+$/, '');
128
- const sep = trimmed.length && !trimmed.endsWith(',') ? ', ' : trimmed.length ? ' ' : '';
129
- const replaced = `${match[1]}${trimmed}${sep}${symbol}${match[3]}`;
130
- return source.replace(match[0], replaced);
131
- }
132
- function escapeRegExp(value) {
133
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
134
- }
135
- function printManualSnippet(symbol, subpath) {
136
- return `
137
- ngwr:use — copy this into your component:
138
-
139
- import { ${symbol} } from '${subpath}';
140
-
141
- @Component({
142
- imports: [/* …, */ ${symbol}],
143
- /* … */
144
- })
145
- `;
25
+ return (0, rule_1.useRule)(options, SYMBOL_MAP);
146
26
  }
147
27
  exports.default = use;