ngwr 6.1.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +179 -32
  3. package/affix/styles/_index.scss +12 -0
  4. package/alert/styles/_index.scss +75 -32
  5. package/anchor/styles/_index.scss +59 -0
  6. package/aurora/aurora.scss +1 -0
  7. package/aurora/styles/_index.scss +30 -0
  8. package/avatar/styles/_index.scss +30 -14
  9. package/back-top/styles/_index.scss +42 -0
  10. package/badge/styles/_index.scss +80 -0
  11. package/badge/styles/_tag.scss +81 -0
  12. package/bar-chart/styles/_index.scss +56 -0
  13. package/blur-text/blur-text.scss +1 -0
  14. package/blur-text/styles/_index.scss +14 -0
  15. package/border-glow/border-glow.scss +4 -0
  16. package/border-glow/styles/_index.scss +228 -0
  17. package/breadcrumbs/breadcrumbs.scss +1 -0
  18. package/breadcrumbs/styles/_index.scss +76 -0
  19. package/button/styles/_index.scss +148 -125
  20. package/calendar/styles/_index.scss +252 -0
  21. package/calendar-heatmap/styles/_index.scss +69 -0
  22. package/card/card.scss +1 -0
  23. package/card/styles/_index.scss +96 -0
  24. package/carousel/styles/_index.scss +102 -0
  25. package/cascader/cascader.scss +1 -0
  26. package/cascader/styles/_index.scss +174 -0
  27. package/checkbox/styles/_index.scss +76 -60
  28. package/circular-text/circular-text.scss +1 -0
  29. package/circular-text/styles/_index.scss +45 -0
  30. package/click-spark/click-spark.scss +1 -0
  31. package/click-spark/styles/_index.scss +16 -0
  32. package/collapse/styles/_index.scss +92 -0
  33. package/color-picker/styles/_index.scss +247 -0
  34. package/command-palette/styles/_index.scss +188 -0
  35. package/compare/styles/_index.scss +100 -0
  36. package/context-menu/styles/_index.scss +112 -0
  37. package/counter/styles/_index.scss +44 -0
  38. package/date-picker/styles/_index.scss +204 -0
  39. package/decrypt-text/decrypt-text.scss +1 -0
  40. package/decrypt-text/styles/_index.scss +26 -0
  41. package/density/styles/_index.scss +37 -0
  42. package/descriptions/styles/_index.scss +104 -0
  43. package/dialog/styles/_index.scss +101 -27
  44. package/divider/styles/_index.scss +43 -24
  45. package/donut-chart/styles/_index.scss +76 -0
  46. package/drag-drop/sortable-list.scss +1 -0
  47. package/drag-drop/styles/_index.scss +99 -0
  48. package/drawer/styles/_index.scss +164 -0
  49. package/dropdown/styles/_index.scss +76 -56
  50. package/empty/styles/_index.scss +49 -0
  51. package/falling-text/falling-text.scss +1 -0
  52. package/falling-text/styles/_index.scss +30 -0
  53. package/fesm2022/ngwr-affix.mjs +102 -0
  54. package/fesm2022/ngwr-affix.mjs.map +1 -0
  55. package/fesm2022/ngwr-alert.mjs +70 -52
  56. package/fesm2022/ngwr-alert.mjs.map +1 -1
  57. package/fesm2022/ngwr-anchor.mjs +103 -0
  58. package/fesm2022/ngwr-anchor.mjs.map +1 -0
  59. package/fesm2022/ngwr-aurora.mjs +309 -0
  60. package/fesm2022/ngwr-aurora.mjs.map +1 -0
  61. package/fesm2022/ngwr-avatar.mjs +81 -71
  62. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  63. package/fesm2022/ngwr-back-top.mjs +81 -0
  64. package/fesm2022/ngwr-back-top.mjs.map +1 -0
  65. package/fesm2022/ngwr-badge.mjs +192 -0
  66. package/fesm2022/ngwr-badge.mjs.map +1 -0
  67. package/fesm2022/ngwr-bar-chart.mjs +69 -0
  68. package/fesm2022/ngwr-bar-chart.mjs.map +1 -0
  69. package/fesm2022/ngwr-blur-text.mjs +181 -0
  70. package/fesm2022/ngwr-blur-text.mjs.map +1 -0
  71. package/fesm2022/ngwr-border-glow.mjs +278 -0
  72. package/fesm2022/ngwr-border-glow.mjs.map +1 -0
  73. package/fesm2022/ngwr-breadcrumbs.mjs +101 -0
  74. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -0
  75. package/fesm2022/ngwr-button.mjs +179 -104
  76. package/fesm2022/ngwr-button.mjs.map +1 -1
  77. package/fesm2022/ngwr-calendar-heatmap.mjs +145 -0
  78. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -0
  79. package/fesm2022/ngwr-calendar.mjs +402 -0
  80. package/fesm2022/ngwr-calendar.mjs.map +1 -0
  81. package/fesm2022/ngwr-card.mjs +100 -0
  82. package/fesm2022/ngwr-card.mjs.map +1 -0
  83. package/fesm2022/ngwr-carousel.mjs +128 -0
  84. package/fesm2022/ngwr-carousel.mjs.map +1 -0
  85. package/fesm2022/ngwr-cascader.mjs +280 -0
  86. package/fesm2022/ngwr-cascader.mjs.map +1 -0
  87. package/fesm2022/ngwr-checkbox.mjs +214 -54
  88. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  89. package/fesm2022/ngwr-circular-text.mjs +168 -0
  90. package/fesm2022/ngwr-circular-text.mjs.map +1 -0
  91. package/fesm2022/ngwr-click-spark.mjs +163 -0
  92. package/fesm2022/ngwr-click-spark.mjs.map +1 -0
  93. package/fesm2022/ngwr-clipboard.mjs +130 -0
  94. package/fesm2022/ngwr-clipboard.mjs.map +1 -0
  95. package/fesm2022/ngwr-collapse.mjs +232 -0
  96. package/fesm2022/ngwr-collapse.mjs.map +1 -0
  97. package/fesm2022/ngwr-color-picker.mjs +646 -0
  98. package/fesm2022/ngwr-color-picker.mjs.map +1 -0
  99. package/fesm2022/ngwr-command-palette.mjs +259 -0
  100. package/fesm2022/ngwr-command-palette.mjs.map +1 -0
  101. package/fesm2022/ngwr-compare.mjs +137 -0
  102. package/fesm2022/ngwr-compare.mjs.map +1 -0
  103. package/fesm2022/ngwr-confetti.mjs +160 -0
  104. package/fesm2022/ngwr-confetti.mjs.map +1 -0
  105. package/fesm2022/ngwr-context-menu.mjs +653 -0
  106. package/fesm2022/ngwr-context-menu.mjs.map +1 -0
  107. package/fesm2022/ngwr-cookie.mjs +127 -0
  108. package/fesm2022/ngwr-cookie.mjs.map +1 -0
  109. package/fesm2022/ngwr-counter.mjs +415 -0
  110. package/fesm2022/ngwr-counter.mjs.map +1 -0
  111. package/fesm2022/ngwr-date-adapter-fns.mjs +180 -0
  112. package/fesm2022/ngwr-date-adapter-fns.mjs.map +1 -0
  113. package/fesm2022/ngwr-date-adapter-luxon.mjs +201 -0
  114. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -0
  115. package/fesm2022/ngwr-date-adapter.mjs +419 -0
  116. package/fesm2022/ngwr-date-adapter.mjs.map +1 -0
  117. package/fesm2022/ngwr-date-picker.mjs +624 -0
  118. package/fesm2022/ngwr-date-picker.mjs.map +1 -0
  119. package/fesm2022/ngwr-decrypt-text.mjs +396 -0
  120. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -0
  121. package/fesm2022/ngwr-density.mjs +157 -0
  122. package/fesm2022/ngwr-density.mjs.map +1 -0
  123. package/fesm2022/ngwr-descriptions.mjs +83 -0
  124. package/fesm2022/ngwr-descriptions.mjs.map +1 -0
  125. package/fesm2022/ngwr-dialog.mjs +249 -377
  126. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  127. package/fesm2022/ngwr-directives.mjs +315 -0
  128. package/fesm2022/ngwr-directives.mjs.map +1 -0
  129. package/fesm2022/ngwr-divider.mjs +74 -59
  130. package/fesm2022/ngwr-divider.mjs.map +1 -1
  131. package/fesm2022/ngwr-donut-chart.mjs +131 -0
  132. package/fesm2022/ngwr-donut-chart.mjs.map +1 -0
  133. package/fesm2022/ngwr-drag-drop.mjs +117 -0
  134. package/fesm2022/ngwr-drag-drop.mjs.map +1 -0
  135. package/fesm2022/ngwr-drawer.mjs +315 -0
  136. package/fesm2022/ngwr-drawer.mjs.map +1 -0
  137. package/fesm2022/ngwr-dropdown.mjs +276 -229
  138. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  139. package/fesm2022/ngwr-empty.mjs +57 -0
  140. package/fesm2022/ngwr-empty.mjs.map +1 -0
  141. package/fesm2022/ngwr-falling-text.mjs +316 -0
  142. package/fesm2022/ngwr-falling-text.mjs.map +1 -0
  143. package/fesm2022/ngwr-file-upload.mjs +260 -0
  144. package/fesm2022/ngwr-file-upload.mjs.map +1 -0
  145. package/fesm2022/ngwr-form.mjs +133 -48
  146. package/fesm2022/ngwr-form.mjs.map +1 -1
  147. package/fesm2022/ngwr-fuzzy-text.mjs +373 -0
  148. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -0
  149. package/fesm2022/ngwr-gauge.mjs +83 -0
  150. package/fesm2022/ngwr-gauge.mjs.map +1 -0
  151. package/fesm2022/ngwr-glitch-text.mjs +67 -0
  152. package/fesm2022/ngwr-glitch-text.mjs.map +1 -0
  153. package/fesm2022/ngwr-gradient-text.mjs +109 -0
  154. package/fesm2022/ngwr-gradient-text.mjs.map +1 -0
  155. package/fesm2022/ngwr-hotkey.mjs +263 -0
  156. package/fesm2022/ngwr-hotkey.mjs.map +1 -0
  157. package/fesm2022/ngwr-i18n-en.mjs +168 -0
  158. package/fesm2022/ngwr-i18n-en.mjs.map +1 -0
  159. package/fesm2022/ngwr-i18n-ru.mjs +156 -0
  160. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -0
  161. package/fesm2022/ngwr-i18n.mjs +478 -0
  162. package/fesm2022/ngwr-i18n.mjs.map +1 -0
  163. package/fesm2022/ngwr-icon-adapters-feather.mjs +74 -0
  164. package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -0
  165. package/fesm2022/ngwr-icon-adapters-lucide.mjs +88 -0
  166. package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -0
  167. package/fesm2022/ngwr-icon.mjs +189 -649
  168. package/fesm2022/ngwr-icon.mjs.map +1 -1
  169. package/fesm2022/ngwr-image-cropper.mjs +299 -0
  170. package/fesm2022/ngwr-image-cropper.mjs.map +1 -0
  171. package/fesm2022/ngwr-input-number.mjs +239 -0
  172. package/fesm2022/ngwr-input-number.mjs.map +1 -0
  173. package/fesm2022/ngwr-input-otp.mjs +216 -0
  174. package/fesm2022/ngwr-input-otp.mjs.map +1 -0
  175. package/fesm2022/ngwr-input.mjs +183 -104
  176. package/fesm2022/ngwr-input.mjs.map +1 -1
  177. package/fesm2022/ngwr-keyboard.mjs +47 -0
  178. package/fesm2022/ngwr-keyboard.mjs.map +1 -0
  179. package/fesm2022/ngwr-knob.mjs +227 -0
  180. package/fesm2022/ngwr-knob.mjs.map +1 -0
  181. package/fesm2022/ngwr-layout.mjs +197 -0
  182. package/fesm2022/ngwr-layout.mjs.map +1 -0
  183. package/fesm2022/ngwr-lightbox.mjs +131 -0
  184. package/fesm2022/ngwr-lightbox.mjs.map +1 -0
  185. package/fesm2022/ngwr-line-chart.mjs +176 -0
  186. package/fesm2022/ngwr-line-chart.mjs.map +1 -0
  187. package/fesm2022/ngwr-list.mjs +132 -0
  188. package/fesm2022/ngwr-list.mjs.map +1 -0
  189. package/fesm2022/ngwr-loading-bar.mjs +160 -0
  190. package/fesm2022/ngwr-loading-bar.mjs.map +1 -0
  191. package/fesm2022/ngwr-marquee.mjs +224 -0
  192. package/fesm2022/ngwr-marquee.mjs.map +1 -0
  193. package/fesm2022/ngwr-media.mjs +132 -0
  194. package/fesm2022/ngwr-media.mjs.map +1 -0
  195. package/fesm2022/ngwr-mention.mjs +374 -0
  196. package/fesm2022/ngwr-mention.mjs.map +1 -0
  197. package/fesm2022/ngwr-meta.mjs +266 -0
  198. package/fesm2022/ngwr-meta.mjs.map +1 -0
  199. package/fesm2022/ngwr-meter-group.mjs +73 -0
  200. package/fesm2022/ngwr-meter-group.mjs.map +1 -0
  201. package/fesm2022/ngwr-overlay.mjs +145 -0
  202. package/fesm2022/ngwr-overlay.mjs.map +1 -0
  203. package/fesm2022/ngwr-page-header.mjs +53 -0
  204. package/fesm2022/ngwr-page-header.mjs.map +1 -0
  205. package/fesm2022/ngwr-pagination.mjs +152 -96
  206. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  207. package/fesm2022/ngwr-pipes.mjs +290 -11
  208. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  209. package/fesm2022/ngwr-platform.mjs +63 -0
  210. package/fesm2022/ngwr-platform.mjs.map +1 -0
  211. package/fesm2022/ngwr-popconfirm.mjs +188 -0
  212. package/fesm2022/ngwr-popconfirm.mjs.map +1 -0
  213. package/fesm2022/ngwr-popover.mjs +361 -0
  214. package/fesm2022/ngwr-popover.mjs.map +1 -0
  215. package/fesm2022/ngwr-progress.mjs +47 -39
  216. package/fesm2022/ngwr-progress.mjs.map +1 -1
  217. package/fesm2022/ngwr-qr.mjs +160 -179
  218. package/fesm2022/ngwr-qr.mjs.map +1 -1
  219. package/fesm2022/ngwr-radio.mjs +204 -0
  220. package/fesm2022/ngwr-radio.mjs.map +1 -0
  221. package/fesm2022/ngwr-rating.mjs +180 -0
  222. package/fesm2022/ngwr-rating.mjs.map +1 -0
  223. package/fesm2022/ngwr-result.mjs +119 -0
  224. package/fesm2022/ngwr-result.mjs.map +1 -0
  225. package/fesm2022/ngwr-rotating-text.mjs +256 -0
  226. package/fesm2022/ngwr-rotating-text.mjs.map +1 -0
  227. package/fesm2022/ngwr-scramble-text.mjs +165 -0
  228. package/fesm2022/ngwr-scramble-text.mjs.map +1 -0
  229. package/fesm2022/ngwr-scroll.mjs +107 -0
  230. package/fesm2022/ngwr-scroll.mjs.map +1 -0
  231. package/fesm2022/ngwr-segmented.mjs +96 -0
  232. package/fesm2022/ngwr-segmented.mjs.map +1 -0
  233. package/fesm2022/ngwr-select.mjs +844 -309
  234. package/fesm2022/ngwr-select.mjs.map +1 -1
  235. package/fesm2022/ngwr-shiny-text.mjs +127 -0
  236. package/fesm2022/ngwr-shiny-text.mjs.map +1 -0
  237. package/fesm2022/ngwr-sidebar.mjs +134 -0
  238. package/fesm2022/ngwr-sidebar.mjs.map +1 -0
  239. package/fesm2022/ngwr-skeleton.mjs +59 -34
  240. package/fesm2022/ngwr-skeleton.mjs.map +1 -1
  241. package/fesm2022/ngwr-slider.mjs +234 -0
  242. package/fesm2022/ngwr-slider.mjs.map +1 -0
  243. package/fesm2022/ngwr-sparkline.mjs +104 -0
  244. package/fesm2022/ngwr-sparkline.mjs.map +1 -0
  245. package/fesm2022/ngwr-speed-dial.mjs +79 -0
  246. package/fesm2022/ngwr-speed-dial.mjs.map +1 -0
  247. package/fesm2022/ngwr-spinner.mjs +34 -28
  248. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  249. package/fesm2022/ngwr-splash-cursor.mjs +970 -0
  250. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -0
  251. package/fesm2022/ngwr-split-text.mjs +200 -0
  252. package/fesm2022/ngwr-split-text.mjs.map +1 -0
  253. package/fesm2022/ngwr-splitter.mjs +125 -0
  254. package/fesm2022/ngwr-splitter.mjs.map +1 -0
  255. package/fesm2022/ngwr-spotlight-card.mjs +138 -0
  256. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -0
  257. package/fesm2022/ngwr-squircle.mjs +320 -0
  258. package/fesm2022/ngwr-squircle.mjs.map +1 -0
  259. package/fesm2022/ngwr-star-border.mjs +72 -0
  260. package/fesm2022/ngwr-star-border.mjs.map +1 -0
  261. package/fesm2022/ngwr-statistic.mjs +220 -0
  262. package/fesm2022/ngwr-statistic.mjs.map +1 -0
  263. package/fesm2022/ngwr-stepper.mjs +186 -0
  264. package/fesm2022/ngwr-stepper.mjs.map +1 -0
  265. package/fesm2022/ngwr-storage.mjs +317 -0
  266. package/fesm2022/ngwr-storage.mjs.map +1 -0
  267. package/fesm2022/ngwr-switch.mjs +99 -0
  268. package/fesm2022/ngwr-switch.mjs.map +1 -0
  269. package/fesm2022/ngwr-table.mjs +217 -206
  270. package/fesm2022/ngwr-table.mjs.map +1 -1
  271. package/fesm2022/ngwr-tabs.mjs +217 -0
  272. package/fesm2022/ngwr-tabs.mjs.map +1 -0
  273. package/fesm2022/ngwr-textarea.mjs +106 -120
  274. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  275. package/fesm2022/ngwr-theme.mjs +152 -0
  276. package/fesm2022/ngwr-theme.mjs.map +1 -0
  277. package/fesm2022/ngwr-tilt-card.mjs +137 -0
  278. package/fesm2022/ngwr-tilt-card.mjs.map +1 -0
  279. package/fesm2022/ngwr-timeline.mjs +73 -0
  280. package/fesm2022/ngwr-timeline.mjs.map +1 -0
  281. package/fesm2022/ngwr-toast.mjs +446 -0
  282. package/fesm2022/ngwr-toast.mjs.map +1 -0
  283. package/fesm2022/ngwr-toolbar.mjs +46 -0
  284. package/fesm2022/ngwr-toolbar.mjs.map +1 -0
  285. package/fesm2022/ngwr-tree.mjs +483 -0
  286. package/fesm2022/ngwr-tree.mjs.map +1 -0
  287. package/fesm2022/ngwr-typewriter.mjs +229 -0
  288. package/fesm2022/ngwr-typewriter.mjs.map +1 -0
  289. package/fesm2022/ngwr-typography.mjs +79 -0
  290. package/fesm2022/ngwr-typography.mjs.map +1 -0
  291. package/fesm2022/ngwr-utils.mjs +535 -0
  292. package/fesm2022/ngwr-utils.mjs.map +1 -0
  293. package/fesm2022/ngwr-validators.mjs +214 -0
  294. package/fesm2022/ngwr-validators.mjs.map +1 -0
  295. package/fesm2022/ngwr-version.mjs +51 -0
  296. package/fesm2022/ngwr-version.mjs.map +1 -0
  297. package/fesm2022/ngwr-virtual-scroll.mjs +99 -0
  298. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -0
  299. package/fesm2022/ngwr-waves.mjs +356 -0
  300. package/fesm2022/ngwr-waves.mjs.map +1 -0
  301. package/fesm2022/ngwr-window.mjs +1141 -0
  302. package/fesm2022/ngwr-window.mjs.map +1 -0
  303. package/fesm2022/ngwr.mjs +0 -3
  304. package/fesm2022/ngwr.mjs.map +1 -1
  305. package/file-upload/styles/_index.scss +152 -0
  306. package/form/styles/_index.scss +85 -42
  307. package/gauge/styles/_index.scss +37 -0
  308. package/glitch-text/glitch-text.scss +1 -0
  309. package/glitch-text/styles/_index.scss +144 -0
  310. package/gradient-text/gradient-text.scss +1 -0
  311. package/gradient-text/styles/_index.scss +113 -0
  312. package/icon/styles/_index.scss +21 -15
  313. package/image-cropper/styles/_index.scss +114 -0
  314. package/input/styles/_index.scss +133 -93
  315. package/input-number/styles/_index.scss +75 -0
  316. package/input-otp/styles/_index.scss +53 -0
  317. package/keyboard/styles/_index.scss +55 -0
  318. package/knob/styles/_index.scss +54 -0
  319. package/layout/styles/_index.scss +65 -0
  320. package/lightbox/lightbox.scss +1 -0
  321. package/lightbox/styles/_index.scss +144 -0
  322. package/line-chart/styles/_index.scss +93 -0
  323. package/list/list.scss +1 -0
  324. package/list/styles/_index.scss +101 -0
  325. package/loading-bar/loading-bar.scss +1 -0
  326. package/loading-bar/styles/_index.scss +29 -0
  327. package/marquee/marquee.scss +1 -0
  328. package/marquee/styles/_index.scss +138 -0
  329. package/mention/styles/_index.scss +47 -0
  330. package/meter-group/styles/_index.scss +61 -0
  331. package/package.json +576 -99
  332. package/page-header/styles/_index.scss +78 -0
  333. package/pagination/styles/_index.scss +89 -34
  334. package/popconfirm/styles/_index.scss +32 -0
  335. package/popover/styles/_index.scss +83 -0
  336. package/progress/styles/_index.scss +29 -14
  337. package/qr/styles/_index.scss +6 -3
  338. package/radio/styles/_index.scss +111 -0
  339. package/rating/styles/_index.scss +63 -0
  340. package/result/styles/_index.scss +69 -0
  341. package/rotating-text/rotating-text.scss +1 -0
  342. package/rotating-text/styles/_index.scss +39 -0
  343. package/schematics/collection.json +37 -0
  344. package/schematics/component-style/index.js +49 -0
  345. package/{cdk/utils/index.d.ts → schematics/component-style/schema.js} +2 -8
  346. package/schematics/component-style/schema.json +20 -0
  347. package/schematics/icon-set/index.js +96 -0
  348. package/schematics/icon-set/schema.js +8 -0
  349. package/schematics/icon-set/schema.json +39 -0
  350. package/schematics/migrations/v7/index.js +187 -0
  351. package/schematics/migrations.json +10 -0
  352. package/schematics/ng-add/index.js +180 -0
  353. package/schematics/ng-add/schema.js +8 -0
  354. package/schematics/ng-add/schema.json +80 -0
  355. package/schematics/page/index.js +63 -0
  356. package/schematics/page/schema.js +8 -0
  357. package/schematics/page/schema.json +39 -0
  358. package/schematics/page/templates.js +198 -0
  359. package/schematics/provider/index.js +126 -0
  360. package/schematics/provider/schema.js +8 -0
  361. package/schematics/provider/schema.json +52 -0
  362. package/schematics/use/index.js +143 -0
  363. package/schematics/use/schema.js +8 -0
  364. package/schematics/use/schema.json +25 -0
  365. package/schematics/use/symbol-map.json +356 -0
  366. package/scramble-text/scramble-text.scss +1 -0
  367. package/scramble-text/styles/_index.scss +8 -0
  368. package/segmented/styles/_index.scss +92 -0
  369. package/select/styles/_index.scss +245 -159
  370. package/shiny-text/shiny-text.scss +1 -0
  371. package/shiny-text/styles/_index.scss +101 -0
  372. package/sidebar/styles/_index.scss +208 -0
  373. package/skeleton/styles/_index.scss +33 -33
  374. package/slider/styles/_index.scss +77 -0
  375. package/sparkline/styles/_index.scss +9 -0
  376. package/speed-dial/styles/_index.scss +158 -0
  377. package/spinner/styles/_index.scss +38 -22
  378. package/splash-cursor/splash-cursor.scss +1 -0
  379. package/splash-cursor/styles/_index.scss +27 -0
  380. package/split-text/split-text.scss +1 -0
  381. package/split-text/styles/_index.scss +22 -0
  382. package/splitter/styles/_index.scss +85 -0
  383. package/spotlight-card/spotlight-card.scss +1 -0
  384. package/spotlight-card/styles/_index.scss +43 -0
  385. package/squircle/styles/_index.scss +34 -0
  386. package/star-border/star-border.scss +1 -0
  387. package/star-border/styles/_index.scss +118 -0
  388. package/statistic/styles/_index.scss +54 -0
  389. package/stepper/styles/_index.scss +162 -0
  390. package/styles/_animations.scss +198 -0
  391. package/styles/_breakpoints.scss +75 -0
  392. package/styles/_grid.scss +71 -0
  393. package/styles/_reset.scss +123 -0
  394. package/styles/_typography.scss +122 -0
  395. package/styles.scss +102 -13
  396. package/switch/styles/_index.scss +82 -0
  397. package/table/styles/_index.scss +255 -4
  398. package/tabs/styles/_index.scss +71 -0
  399. package/textarea/styles/_index.scss +47 -56
  400. package/theme/styles/_colors.scss +83 -0
  401. package/theme/styles/_dark.scss +85 -0
  402. package/theme/styles/_focus.scss +93 -0
  403. package/theme/styles/_index.scss +5 -0
  404. package/theme/styles/_mixins.scss +57 -0
  405. package/theme/styles/_variables.scss +118 -0
  406. package/tilt-card/styles/_index.scss +40 -0
  407. package/tilt-card/tilt-card.scss +1 -0
  408. package/timeline/styles/_index.scss +127 -0
  409. package/toast/styles/_index.scss +263 -0
  410. package/toolbar/styles/_index.scss +65 -0
  411. package/tree/styles/_index.scss +271 -0
  412. package/types/ngwr-affix.d.ts +43 -0
  413. package/types/ngwr-alert.d.ts +68 -0
  414. package/types/ngwr-anchor.d.ts +53 -0
  415. package/types/ngwr-aurora.d.ts +52 -0
  416. package/types/ngwr-avatar.d.ts +90 -0
  417. package/types/ngwr-back-top.d.ts +37 -0
  418. package/types/ngwr-badge.d.ts +158 -0
  419. package/types/ngwr-bar-chart.d.ts +47 -0
  420. package/types/ngwr-blur-text.d.ts +62 -0
  421. package/types/ngwr-border-glow.d.ts +66 -0
  422. package/types/ngwr-breadcrumbs.d.ts +61 -0
  423. package/types/ngwr-button.d.ts +176 -0
  424. package/types/ngwr-calendar-heatmap.d.ts +58 -0
  425. package/types/ngwr-calendar.d.ts +116 -0
  426. package/types/ngwr-card.d.ts +50 -0
  427. package/types/ngwr-carousel.d.ts +57 -0
  428. package/types/ngwr-cascader.d.ts +107 -0
  429. package/types/ngwr-checkbox.d.ts +139 -0
  430. package/types/ngwr-circular-text.d.ts +49 -0
  431. package/types/ngwr-click-spark.d.ts +52 -0
  432. package/types/ngwr-clipboard.d.ts +53 -0
  433. package/types/ngwr-collapse.d.ts +139 -0
  434. package/types/ngwr-color-picker.d.ts +302 -0
  435. package/types/ngwr-command-palette.d.ts +113 -0
  436. package/types/ngwr-compare.d.ts +55 -0
  437. package/types/ngwr-confetti.d.ts +70 -0
  438. package/types/ngwr-context-menu.d.ts +207 -0
  439. package/types/ngwr-cookie.d.ts +60 -0
  440. package/types/ngwr-counter.d.ts +182 -0
  441. package/types/ngwr-date-adapter-fns.d.ts +73 -0
  442. package/types/ngwr-date-adapter-luxon.d.ts +73 -0
  443. package/types/ngwr-date-adapter.d.ts +198 -0
  444. package/types/ngwr-date-picker.d.ts +117 -0
  445. package/types/ngwr-decrypt-text.d.ts +85 -0
  446. package/types/ngwr-density.d.ts +97 -0
  447. package/types/ngwr-descriptions.d.ts +41 -0
  448. package/types/ngwr-dialog.d.ts +210 -0
  449. package/types/ngwr-directives.d.ts +125 -0
  450. package/types/ngwr-divider.d.ts +73 -0
  451. package/types/ngwr-donut-chart.d.ts +53 -0
  452. package/types/ngwr-drag-drop.d.ts +83 -0
  453. package/types/ngwr-drawer.d.ts +155 -0
  454. package/types/ngwr-dropdown.d.ts +124 -0
  455. package/types/ngwr-empty.d.ts +38 -0
  456. package/types/ngwr-falling-text.d.ts +63 -0
  457. package/types/ngwr-file-upload.d.ts +94 -0
  458. package/types/ngwr-form.d.ts +95 -0
  459. package/types/ngwr-fuzzy-text.d.ts +74 -0
  460. package/types/ngwr-gauge.d.ts +39 -0
  461. package/types/ngwr-glitch-text.d.ts +31 -0
  462. package/types/ngwr-gradient-text.d.ts +46 -0
  463. package/types/ngwr-hotkey.d.ts +142 -0
  464. package/types/ngwr-i18n-en.d.ts +18 -0
  465. package/types/ngwr-i18n-ru.d.ts +6 -0
  466. package/types/ngwr-i18n.d.ts +336 -0
  467. package/types/ngwr-icon-adapters-feather.d.ts +44 -0
  468. package/types/ngwr-icon-adapters-lucide.d.ts +54 -0
  469. package/types/ngwr-icon.d.ts +180 -0
  470. package/types/ngwr-image-cropper.d.ts +110 -0
  471. package/types/ngwr-input-number.d.ts +77 -0
  472. package/types/ngwr-input-otp.d.ts +78 -0
  473. package/types/ngwr-input.d.ts +131 -0
  474. package/types/ngwr-keyboard.d.ts +34 -0
  475. package/types/ngwr-knob.d.ts +77 -0
  476. package/types/ngwr-layout.d.ts +89 -0
  477. package/types/ngwr-lightbox.d.ts +50 -0
  478. package/types/ngwr-line-chart.d.ts +90 -0
  479. package/types/ngwr-list.d.ts +71 -0
  480. package/types/ngwr-loading-bar.d.ts +79 -0
  481. package/types/ngwr-marquee.d.ts +95 -0
  482. package/types/ngwr-media.d.ts +74 -0
  483. package/types/ngwr-mention.d.ts +110 -0
  484. package/types/ngwr-meta.d.ts +164 -0
  485. package/types/ngwr-meter-group.d.ts +57 -0
  486. package/types/ngwr-overlay.d.ts +110 -0
  487. package/types/ngwr-page-header.d.ts +35 -0
  488. package/types/ngwr-pagination.d.ts +119 -0
  489. package/types/ngwr-pipes.d.ts +177 -0
  490. package/types/ngwr-platform.d.ts +38 -0
  491. package/types/ngwr-popconfirm.d.ts +79 -0
  492. package/types/ngwr-popover.d.ts +90 -0
  493. package/types/ngwr-progress.d.ts +33 -0
  494. package/types/ngwr-qr.d.ts +56 -0
  495. package/types/ngwr-radio.d.ts +120 -0
  496. package/types/ngwr-rating.d.ts +62 -0
  497. package/types/ngwr-result.d.ts +64 -0
  498. package/types/ngwr-rotating-text.d.ts +72 -0
  499. package/types/ngwr-scramble-text.d.ts +49 -0
  500. package/types/ngwr-scroll.d.ts +65 -0
  501. package/types/ngwr-segmented.d.ts +65 -0
  502. package/types/ngwr-select.d.ts +413 -0
  503. package/types/ngwr-shiny-text.d.ts +70 -0
  504. package/types/ngwr-sidebar.d.ts +83 -0
  505. package/types/ngwr-skeleton.d.ts +41 -0
  506. package/types/ngwr-slider.d.ts +86 -0
  507. package/types/ngwr-sparkline.d.ts +48 -0
  508. package/types/ngwr-speed-dial.d.ts +51 -0
  509. package/types/ngwr-spinner.d.ts +41 -0
  510. package/types/ngwr-splash-cursor.d.ts +94 -0
  511. package/types/ngwr-split-text.d.ts +83 -0
  512. package/types/ngwr-splitter.d.ts +52 -0
  513. package/types/ngwr-spotlight-card.d.ts +71 -0
  514. package/types/ngwr-squircle.d.ts +132 -0
  515. package/types/ngwr-star-border.d.ts +40 -0
  516. package/types/ngwr-statistic.d.ts +88 -0
  517. package/types/ngwr-stepper.d.ts +99 -0
  518. package/types/ngwr-storage.d.ts +178 -0
  519. package/types/ngwr-switch.d.ts +39 -0
  520. package/types/ngwr-table.d.ts +237 -0
  521. package/types/ngwr-tabs.d.ts +125 -0
  522. package/types/ngwr-textarea.d.ts +60 -0
  523. package/types/ngwr-theme.d.ts +124 -0
  524. package/types/ngwr-tilt-card.d.ts +63 -0
  525. package/types/ngwr-timeline.d.ts +40 -0
  526. package/types/ngwr-toast.d.ts +230 -0
  527. package/types/ngwr-toolbar.d.ts +30 -0
  528. package/types/ngwr-tree.d.ts +150 -0
  529. package/types/ngwr-typewriter.d.ts +84 -0
  530. package/types/ngwr-typography.d.ts +56 -0
  531. package/types/ngwr-utils.d.ts +447 -0
  532. package/types/ngwr-validators.d.ts +70 -0
  533. package/types/ngwr-version.d.ts +44 -0
  534. package/types/ngwr-virtual-scroll.d.ts +64 -0
  535. package/types/ngwr-waves.d.ts +71 -0
  536. package/types/ngwr-window.d.ts +437 -0
  537. package/typewriter/styles/_index.scss +33 -0
  538. package/typewriter/typewriter.scss +1 -0
  539. package/typography/styles/_index.scss +211 -0
  540. package/virtual-scroll/styles/_index.scss +27 -0
  541. package/virtual-scroll/virtual-scroll.scss +1 -0
  542. package/waves/styles/_index.scss +24 -0
  543. package/waves/waves.scss +1 -0
  544. package/window/styles/_index.scss +430 -0
  545. package/alert/index.d.ts +0 -32
  546. package/alert/styles/theming.scss +0 -26
  547. package/alert/styles/vars.scss +0 -11
  548. package/avatar/index.d.ts +0 -30
  549. package/button/index.d.ts +0 -45
  550. package/button/styles/vars.scss +0 -13
  551. package/cdk/index.d.ts +0 -24
  552. package/cdk/rxjs/index.d.ts +0 -40
  553. package/cdk/types/index.d.ts +0 -27
  554. package/checkbox/index.d.ts +0 -31
  555. package/checkbox/styles/vars.scss +0 -16
  556. package/dialog/index.d.ts +0 -193
  557. package/dialog/styles/vars.scss +0 -7
  558. package/divider/index.d.ts +0 -16
  559. package/dropdown/index.d.ts +0 -68
  560. package/dropdown/styles/vars.scss +0 -18
  561. package/fesm2022/ngwr-cdk-rxjs.mjs +0 -53
  562. package/fesm2022/ngwr-cdk-rxjs.mjs.map +0 -1
  563. package/fesm2022/ngwr-cdk-types.mjs +0 -44
  564. package/fesm2022/ngwr-cdk-types.mjs.map +0 -1
  565. package/fesm2022/ngwr-cdk-utils.mjs +0 -30
  566. package/fesm2022/ngwr-cdk-utils.mjs.map +0 -1
  567. package/fesm2022/ngwr-cdk.mjs +0 -46
  568. package/fesm2022/ngwr-cdk.mjs.map +0 -1
  569. package/fesm2022/ngwr-tag.mjs +0 -87
  570. package/fesm2022/ngwr-tag.mjs.map +0 -1
  571. package/form/index.d.ts +0 -28
  572. package/icon/index.d.ts +0 -830
  573. package/icon/styles/vars.scss +0 -3
  574. package/input/index.d.ts +0 -43
  575. package/input/styles/vars.scss +0 -17
  576. package/pagination/index.d.ts +0 -34
  577. package/pagination/styles/vars.scss +0 -14
  578. package/pipes/index.d.ts +0 -17
  579. package/progress/index.d.ts +0 -13
  580. package/progress/styles/theming.scss +0 -8
  581. package/progress/styles/vars.scss +0 -6
  582. package/qr/index.d.ts +0 -127
  583. package/select/index.d.ts +0 -121
  584. package/select/styles/vars.scss +0 -32
  585. package/skeleton/index.d.ts +0 -13
  586. package/spinner/index.d.ts +0 -23
  587. package/styles/animations.scss +0 -92
  588. package/styles/cdk.scss +0 -5
  589. package/styles/colors.scss +0 -72
  590. package/styles/grid.scss +0 -99
  591. package/styles/maps.scss +0 -31
  592. package/styles/reset.scss +0 -112
  593. package/styles/variables.scss +0 -72
  594. package/table/index.d.ts +0 -101
  595. package/table/styles/table-filter.scss +0 -202
  596. package/table/styles/table-sort.scss +0 -47
  597. package/table/styles/table.scss +0 -232
  598. package/table/styles/vars.scss +0 -21
  599. package/tag/index.d.ts +0 -24
  600. package/tag/styles/_index.scss +0 -32
  601. package/tag/styles/theming.scss +0 -21
  602. package/tag/styles/vars.scss +0 -12
  603. package/textarea/index.d.ts +0 -47
  604. package/textarea/styles/vars.scss +0 -17
  605. /package/{index.d.ts → types/ngwr.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-select.mjs","sources":["../../../projects/lib/select/select-option.component.ts","../../../projects/lib/select/select-option.component.html","../../../projects/lib/select/select-option-group.component.ts","../../../projects/lib/select/select-option-group.component.html","../../../projects/lib/select/select.component.ts","../../../projects/lib/select/select.component.html","../../../projects/lib/select/public-api.ts","../../../projects/lib/select/ngwr-select.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n Input,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n HostBinding,\n inject,\n booleanAttribute,\n TemplateRef,\n ContentChild,\n} from '@angular/core';\n\nimport { SafeAny } from 'ngwr/cdk/types';\n\nimport { WrSelectComponent } from './select.component';\n\n@Component({\n selector: 'wr-option',\n templateUrl: './select-option.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '(click)': 'select()',\n },\n imports: [NgTemplateOutlet],\n})\nexport class WrOptionComponent {\n @Input()\n value: SafeAny;\n\n @Input()\n label?: string;\n\n @Input({ transform: booleanAttribute })\n disabled = false;\n\n @ContentChild(TemplateRef)\n customTemplate?: TemplateRef<SafeAny>;\n\n @HostBinding('class')\n get hostClasses(): Record<string, boolean> {\n return {\n 'wr-option': true,\n 'wr-option--selected': this.isSelected,\n 'wr-option--disabled': this.disabled,\n 'wr-option--highlighted': this.isHighlighted,\n 'wr-option--filtered': this.isFiltered,\n };\n }\n\n protected readonly context: { $implicit: SafeAny; option: SafeAny } = {\n $implicit: this,\n option: this,\n };\n\n private readonly selectComponent = inject(WrSelectComponent);\n\n get isSelected(): boolean {\n const currentValue = this.selectComponent.currentValue;\n if (this.selectComponent.isMultiple) {\n return Array.isArray(currentValue) && currentValue.includes(this.value);\n }\n return currentValue === this.value;\n }\n\n get isHighlighted(): boolean {\n return this.selectComponent.isHighlightedOption(this);\n }\n\n get isFiltered(): boolean {\n return this.selectComponent.isFilteredOption(this);\n }\n\n select(): void {\n if (!this.disabled) {\n this.selectComponent.onOptionSelect(this);\n }\n }\n}\n","<div class=\"wr-option__content\">\n @if (customTemplate) {\n <ng-container *ngTemplateOutlet=\"customTemplate; context: context\"> </ng-container>\n } @else {\n {{ label }}\n }\n</div>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport {\n Component,\n Input,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n ContentChildren,\n QueryList,\n AfterContentInit,\n HostBinding,\n booleanAttribute,\n} from '@angular/core';\n\nimport { WrOptionComponent } from './select-option.component';\n\n@Component({\n selector: 'wr-option-group',\n templateUrl: './select-option-group.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class WrOptionGroupComponent implements AfterContentInit {\n @Input()\n label = '';\n\n @Input({ transform: booleanAttribute })\n disabled = false;\n\n @ContentChildren(WrOptionComponent)\n options!: QueryList<WrOptionComponent>;\n\n @HostBinding('class')\n get hostClasses(): Record<string, boolean> {\n return {\n 'wr-select-group': true,\n 'wr-select-group--disabled': this.disabled,\n };\n }\n\n ngAfterContentInit(): void {\n if (this.disabled) {\n this.options.forEach(option => (option.disabled = true));\n }\n }\n}\n","<div class=\"wr-select-group__label\">{{ label }}</div>\n<div class=\"wr-select-group__content\">\n <ng-content></ng-content>\n</div>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Input,\n ContentChildren,\n QueryList,\n AfterContentInit,\n forwardRef,\n HostBinding,\n inject,\n signal,\n computed,\n ChangeDetectorRef,\n booleanAttribute,\n ElementRef,\n ViewChild,\n HostListener,\n numberAttribute,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { noop } from 'rxjs';\n\nimport { WrAbstractBase } from 'ngwr/cdk';\nimport { SafeAny } from 'ngwr/cdk/types';\nimport { provideWrIcons, chevronDown, WrIconComponent, close } from 'ngwr/icon';\nimport { WrTagComponent } from 'ngwr/tag';\n\nimport { WrOptionGroupComponent } from './select-option-group.component';\nimport { WrOptionComponent } from './select-option.component';\n\n/**\n * NGWR select component.\n *\n * {@tutorial} [How to use wr-select]{@link http://ngwr.dev/docs/components/select}\n */\n@Component({\n selector: 'wr-select',\n templateUrl: './select.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n provideWrIcons([chevronDown, close]),\n {\n provide: NG_VALUE_ACCESSOR,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelectComponent),\n multi: true,\n },\n ],\n imports: [WrIconComponent, WrTagComponent, NgTemplateOutlet],\n})\nexport class WrSelectComponent extends WrAbstractBase implements ControlValueAccessor, AfterContentInit {\n @Input()\n placeholder = '';\n\n @Input()\n noItemsLabel = 'No Items';\n\n @Input({ transform: booleanAttribute })\n multiple = false;\n\n @Input({ transform: booleanAttribute })\n searchable = false;\n\n @Input({ transform: booleanAttribute })\n clearable = false;\n\n @Input({ transform: numberAttribute })\n maxMultipleCount?: number;\n\n @Input({ transform: booleanAttribute })\n set disabled(value: boolean) {\n this.isDisabled.set(value);\n }\n get disabled(): boolean {\n return this.isDisabled();\n }\n\n @ViewChild('searchInput')\n searchInput?: ElementRef<HTMLInputElement>;\n\n @ContentChildren(WrOptionComponent, { descendants: true })\n options!: QueryList<WrOptionComponent>;\n\n @ContentChildren(WrOptionGroupComponent)\n optionGroups!: QueryList<WrOptionGroupComponent>;\n\n @HostBinding('class')\n get hostClasses(): Record<string, boolean> {\n return {\n 'wr-select': true,\n 'wr-select--open': this.isOpen(),\n 'wr-select--multiple': this.multiple,\n 'wr-select--disabled': this.isDisabled(),\n 'wr-select--focused': this.isFocused(),\n };\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.isOpen()) {\n return;\n }\n\n const filteredOpts = this.filteredOptions();\n const currentIndex = this.highlightedOptionIndex();\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.highlightedOptionIndex.set(currentIndex < filteredOpts.length - 1 ? currentIndex + 1 : 0);\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.highlightedOptionIndex.set(currentIndex > 0 ? currentIndex - 1 : filteredOpts.length - 1);\n break;\n\n case 'Enter':\n event.preventDefault();\n if (currentIndex >= 0 && filteredOpts[currentIndex]) {\n this.onOptionSelect(filteredOpts[currentIndex]);\n }\n break;\n\n case 'Backspace':\n if (this.multiple && !this.searchValue() && this.selectedOptions().length) {\n const selectedOptionsArray = this.selectedOptions();\n const lastSelected = selectedOptionsArray[selectedOptionsArray.length - 1];\n this.onOptionSelect(lastSelected);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n }\n }\n\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target)) {\n this.close();\n }\n }\n\n protected readonly value = signal<SafeAny>(null);\n protected readonly isOpen = signal(false);\n protected readonly isFocused = signal(false);\n protected readonly isDisabled = signal(false);\n protected readonly searchValue = signal('');\n protected readonly highlightedOptionIndex = signal(-1);\n\n protected readonly selectedOptions = computed(() => {\n const currentValue = this.value();\n const optionsArray = this.options?.toArray() || [];\n\n if (this.multiple) {\n return optionsArray.filter(option => Array.isArray(currentValue) && currentValue.includes(option.value));\n }\n return optionsArray.filter(option => option.value === currentValue);\n });\n\n protected readonly selectedLabel = computed(() => {\n const selected = this.selectedOptions();\n return selected.length ? selected[0].label || selected[0].value : '';\n });\n\n protected readonly filteredOptions = computed(() => {\n const search = this.searchValue().toLowerCase();\n const optionsArray = this.options?.toArray() || [];\n\n let filteredArray = optionsArray;\n if (this.multiple) {\n const currentValue = this.value();\n filteredArray = optionsArray.filter(\n option => !Array.isArray(currentValue) || !currentValue.includes(option.value)\n );\n }\n\n if (!search) {\n return filteredArray;\n }\n\n return filteredArray.filter(option => (option.label || option.value.toString()).toLowerCase().includes(search));\n });\n\n private readonly elementRef = inject(ElementRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n get currentValue(): SafeAny {\n return this.value();\n }\n\n get isMultiple(): boolean {\n return this.multiple;\n }\n\n ngAfterContentInit(): void {\n this.options.changes.pipe(takeUntilDestroyed(this.destroyRef$)).subscribe(() => {\n this.cdr.markForCheck();\n });\n }\n\n onChange: (value: string) => void = noop;\n onTouch: () => void = noop;\n\n onOptionSelect(option: WrOptionComponent): void {\n if (this.isDisabled()) return;\n\n if (this.multiple) {\n const currentValue = Array.isArray(this.value()) ? this.value() : [];\n\n if (this.maxMultipleCount && !this.isSelectedOption(option) && currentValue.length >= this.maxMultipleCount) {\n return;\n }\n\n const newValue = this.isSelectedOption(option)\n ? currentValue.filter((v: SafeAny) => v !== option.value)\n : [...currentValue, option.value];\n\n this.writeValue(newValue);\n this.searchValue.set('');\n } else {\n this.writeValue(option.value);\n this.close();\n }\n }\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchValue.set(value);\n }\n\n isHighlightedOption(option: WrOptionComponent): boolean {\n if (this.highlightedOptionIndex() === -1) {\n return false;\n }\n\n const filteredOpts = this.filteredOptions();\n const optionIndex = filteredOpts.findIndex(item => item.value === option.value);\n\n return optionIndex !== -1 && optionIndex === this.highlightedOptionIndex();\n }\n\n isFilteredOption(option: WrOptionComponent): boolean {\n if (this.multiple) {\n const currentValue = this.value();\n if (Array.isArray(currentValue) && currentValue.includes(option.value)) {\n return true;\n }\n }\n\n const search = this.searchValue().toLowerCase();\n if (search) {\n return !(option.label || option.value.toString()).toLowerCase().includes(search);\n }\n\n return false;\n }\n\n writeValue(value: SafeAny): void {\n this.value.set(value);\n this.onChange(value);\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: SafeAny) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled.set(isDisabled);\n }\n\n clear(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n\n if (this.multiple) {\n this.writeValue([]);\n } else {\n this.writeValue(null);\n }\n }\n\n toggle(): void {\n if (this.isDisabled()) {\n return;\n }\n\n this.isOpen.update(value => !value);\n this.isFocused.update(value => !value);\n\n if (this.isOpen() && this.searchable) {\n // TODO Разобраться с этим хаком\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 10);\n }\n }\n\n private close(): void {\n this.isOpen.set(false);\n this.isFocused.set(false);\n this.searchValue.set('');\n this.highlightedOptionIndex.set(-1);\n }\n\n private isSelectedOption(option: WrOptionComponent): boolean {\n const currentValue = this.value();\n if (this.multiple) {\n return Array.isArray(currentValue) && currentValue.includes(option.value);\n }\n\n return currentValue === option.value;\n }\n}\n","<ng-template #searchTemplate let-placeholder=\"placeholder\">\n <input\n #searchInput\n class=\"wr-select__search\"\n [value]=\"searchValue()\"\n (input)=\"onSearch($event)\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"placeholder || ''\"\n />\n</ng-template>\n\n<ng-template #selectedOptionsTemplate>\n @for (option of selectedOptions(); track option.value) {\n <wr-tag [hoverable]=\"true\" color=\"light\" (click)=\"onOptionSelect(option); $event.stopPropagation()\">\n {{ option.label || option.value }}\n <button class=\"wr-select__tag-remove\">×</button>\n </wr-tag>\n }\n</ng-template>\n\n<div class=\"wr-select__trigger\" (click)=\"toggle()\">\n <div class=\"wr-select__value\">\n @if (multiple) {\n <div class=\"wr-select__tags\">\n <div class=\"wr-select__tags-container\">\n <ng-container *ngTemplateOutlet=\"selectedOptionsTemplate\"></ng-container>\n </div>\n\n @if (searchable && isOpen()) {\n <ng-container *ngTemplateOutlet=\"searchTemplate\"></ng-container>\n }\n\n @if (maxMultipleCount) {\n <div class=\"wr-select__counter\">{{ selectedOptions().length }}/{{ maxMultipleCount }}</div>\n }\n </div>\n } @else {\n @if (searchable && isOpen()) {\n <ng-container\n *ngTemplateOutlet=\"searchTemplate; context: { placeholder: selectedLabel() || placeholder }\"\n ></ng-container>\n } @else {\n {{ selectedLabel() || placeholder }}\n }\n }\n </div>\n\n @if (clearable && selectedOptions().length) {\n <button class=\"wr-select__clear\" (click)=\"clear($event)\" [class.wr-select__clear--multiple]=\"multiple\">\n <wr-icon name=\"close\" />\n </button>\n }\n <wr-icon class=\"wr-select__arrow\" name=\"chevron-down\" />\n</div>\n\n<div class=\"wr-select__dropdown\" [class.wr-select__dropdown--open]=\"isOpen()\">\n <div class=\"wr-select__dropdown-content\">\n @if (!filteredOptions().length) {\n <div class=\"wr-select__no-data\">{{ noItemsLabel }}</div>\n } @else {\n <ng-content></ng-content>\n }\n </div>\n</div>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nexport * from './select.types';\nexport * from './select.component';\nexport * from './select-option.component';\nexport * from './select-option-group.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-select.mjs","sources":["../../../projects/lib/select/tokens/select.token.ts","../../../projects/lib/select/option.ts","../../../projects/lib/select/select.ts","../../../projects/lib/select/select.html","../../../projects/lib/select/option-group.ts","../../../projects/lib/select/option-group.html","../../../projects/lib/select/ngwr-select.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken, type Signal } from '@angular/core';\n\n/** Per-option registration metadata. @internal */\nexport interface WrSelectOptionRegistration {\n readonly id: string;\n readonly value: unknown;\n readonly disabled: boolean;\n /**\n * Lazy label reader. Options render text via `<ng-content>`, so we\n * read it at call time once Angular has settled the projected content.\n */\n readonly getLabel: () => string;\n}\n\n/**\n * Contract a `<wr-option>` uses to talk to its parent `<wr-select>`.\n *\n * @internal\n */\nexport interface WrSelectContext {\n /**\n * Currently selected value. Single mode: `T | null`. Multi mode:\n * `readonly T[]`. Options consult {@link isSelected} instead of\n * reading this directly so the same option code works in both modes.\n */\n readonly value: Signal<unknown>;\n /** Whether the select is in multi-selection mode. */\n readonly multi: Signal<boolean>;\n /** Whether the select is disabled. */\n readonly isDisabled: Signal<boolean>;\n /** Id of the option currently highlighted by keyboard navigation. */\n readonly activeOptionId: Signal<string | null>;\n /**\n * Active search query (search mode only). Empty string when there is\n * no filter applied — options treat that as \"show me\".\n */\n readonly searchQuery: Signal<string>;\n /** True only when `mode=\"search\"`. Options gate filtering on this. */\n readonly isSearch: Signal<boolean>;\n /** Is the given option value currently selected? Handles both single and multi. */\n isSelected(value: unknown): boolean;\n /**\n * Called when a child option is clicked. The label is read lazily\n * via {@link WrSelectOptionRegistration.getLabel}, so callers don't\n * need to thread it through.\n */\n selectOption(value: unknown): void;\n /** Register an option; returns an unregister function. */\n registerOption(reg: WrSelectOptionRegistration): () => void;\n}\n\n/**\n * Token a `<wr-option>` injects to register itself with and notify its\n * parent `<wr-select>`.\n *\n * @internal\n */\nexport const WR_SELECT = new InjectionToken<WrSelectContext>('WR_SELECT');\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, DestroyRef, ElementRef, ViewEncapsulation, computed, effect, inject, input } from '@angular/core';\n\nimport { WR_SELECT } from './tokens';\n\nlet uid = 0;\n\n/**\n * Single option inside a `<wr-select>`.\n *\n * The option's display label is taken from its projected text content;\n * the form value is its `value` input.\n *\n * @example\n * ```html\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option [value]=\"42\">Forty-two</wr-option>\n * ```\n */\n@Component({\n selector: 'wr-option',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'option',\n '[attr.id]': 'id',\n '[class]': 'classes()',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled() ? true : null',\n '(click)': 'onClick()',\n },\n})\nexport class WrOption {\n /** The value contributed when this option is chosen. Required. */\n readonly value = input.required<unknown>();\n\n /** Disable this option. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Stable id used for `aria-activedescendant`. */\n readonly id = `wr-option-${++uid}`;\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly parent = inject(WR_SELECT, { optional: true });\n\n /**\n * @internal — true when this option is currently selected. Works for\n * both single and multi-select parents via `WrSelectContext.isSelected`.\n */\n protected readonly selected = computed(() => {\n const parent = this.parent;\n if (!parent) return false;\n // Re-read parent's value signal so the computed recomputes on change.\n parent.value();\n return parent.isSelected(this.value());\n });\n\n /** @internal — true when this option is the keyboard cursor target. */\n protected readonly active = computed(() => this.parent?.activeOptionId() === this.id);\n\n /**\n * @internal — search mode only. True when the parent has a query that\n * the option's text content does not match (case-insensitive substring).\n * Hidden options stay in the DOM so registration order survives but\n * collapse via CSS.\n */\n protected readonly hidden = computed(() => {\n const parent = this.parent;\n if (!parent?.isSearch()) return false;\n const q = parent.searchQuery().trim().toLowerCase();\n if (!q) return false;\n const label = (this.host.nativeElement.textContent ?? '').trim().toLowerCase();\n return !label.includes(q);\n });\n\n protected readonly classes = computed(() => {\n const parts = ['wr-option'];\n if (this.selected()) parts.push('wr-option--selected');\n if (this.active()) parts.push('wr-option--active');\n if (this.disabled()) parts.push('wr-option--disabled');\n if (this.hidden()) parts.push('wr-option--hidden');\n return parts.join(' ');\n });\n\n constructor() {\n if (this.parent) {\n const parent = this.parent;\n // Re-register when disabled or value changes so the parent has fresh metadata.\n effect(onCleanup => {\n const unreg = parent.registerOption({\n id: this.id,\n value: this.value(),\n disabled: this.disabled(),\n getLabel: () => this.host.nativeElement.textContent?.trim() ?? '',\n });\n onCleanup(() => unreg());\n });\n inject(DestroyRef);\n }\n }\n\n protected onClick(): void {\n if (this.disabled() || !this.parent) return;\n this.parent.selectOption(this.value());\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { type Observable, debounceTime, finalize, from, isObservable, of, switchMap } from 'rxjs';\n\nimport { useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { WR_OVERLAY } from 'ngwr/overlay';\nimport { noop } from 'ngwr/utils';\n\nimport type { WrSelectMode, WrSelectSearchLoader, WrSelectTagValidator } from './interfaces';\nimport { WrOption } from './option';\nimport { WR_SELECT, type WrSelectContext, type WrSelectOptionRegistration } from './tokens';\n\nlet listboxUid = 0;\n\ninterface SelectedChip {\n readonly value: unknown;\n readonly label: string;\n}\n\n/**\n * Combobox primitive. Renders a button that opens a CDK overlay\n * containing the projected `<wr-option>` (and optionally\n * `<wr-option-group>`) children. Every shape is the same component\n * with a different `[mode]`:\n *\n * - `'single'` (default) — one value, no input. Classic dropdown.\n * - `'multi'` — array value, chips on the trigger; clicking an option\n * toggles instead of closing, Backspace removes the last chip.\n * - `'search'` — type-ahead with sync `[options]` filter or async\n * `[loader]`. Replaces the standalone `<wr-autocomplete>`.\n * - `'tag'` — free-text + chips with `[separators]` / `[validate]` /\n * `[allowDuplicates]`. Replaces `<wr-chips-input>`.\n *\n * Implements `ControlValueAccessor` — usable with `[(ngModel)]`,\n * `formControl`, or `formControlName`.\n *\n * @example\n * ```html\n * <!-- Single -->\n * <wr-select placeholder=\"Pick a size\" [(ngModel)]=\"size\">\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option value=\"md\">Medium</wr-option>\n * <wr-option value=\"lg\">Large</wr-option>\n * </wr-select>\n *\n * <!-- Multi -->\n * <wr-select mode=\"multi\" placeholder=\"Pick tags\" [(ngModel)]=\"tags\">\n * <wr-option value=\"ts\">TypeScript</wr-option>\n * <wr-option value=\"ng\">Angular</wr-option>\n * </wr-select>\n * ```\n *\n * The legacy `[multi]=\"true\"` boolean is still accepted but is now an\n * alias for `[mode]=\"'multi'\"` — prefer the explicit mode.\n *\n * @see https://ngwr.dev/components/select\n */\n@Component({\n selector: 'wr-select',\n templateUrl: './select.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrOption],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelect),\n multi: true,\n },\n {\n provide: WR_SELECT,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelect),\n },\n ],\n})\nexport class WrSelect implements ControlValueAccessor, WrSelectContext {\n /** Placeholder shown when no option is selected. Falls back to `select.placeholder`. */\n readonly placeholder = input<string | null>(null);\n\n /** Clear-selection (×) button aria-label. Falls back to `select.clearSelection`. */\n readonly clearLabel = input<string | null>(null);\n\n protected readonly resolvedPlaceholder = useI18nText(this.placeholder, 'select.placeholder', '');\n protected readonly resolvedClear = useI18nText(this.clearLabel, 'select.clearSelection', 'Clear selection');\n\n /** Per-chip ARIA label — interpolates `{{label}}`. @internal */\n protected readonly chipRemoveLabel = useI18nFormatter('select.removeItem', 'Remove {{label}}');\n\n /** Disable the select. Also set by Angular forms via `setDisabledState`. */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Pill-shaped corners on the trigger. @default false */\n readonly rounded = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Behavior mode. `<wr-select>` is the unified combobox primitive —\n * pick the shape via `[mode]`:\n *\n * - `'single'` (default) — one value, no input. Classic dropdown.\n * - `'multi'` — array value, chips on the trigger.\n * - `'search'` *(planned)* — type-ahead with sync filter or async loader.\n * - `'tag'` *(planned)* — free-text + chips with optional `allowCreate`.\n *\n */\n readonly mode = input<WrSelectMode | null>(null);\n\n /** Resolved mode — `'single'` unless `[mode]` says otherwise. */\n protected readonly effectiveMode = computed<WrSelectMode>(() => this.mode() ?? 'single');\n\n /** Convenience — `effectiveMode() === 'multi'`. */\n protected readonly isMulti = computed(() => this.effectiveMode() === 'multi');\n\n /** Convenience — `effectiveMode() === 'tag'`. */\n protected readonly isTag = computed(() => this.effectiveMode() === 'tag');\n\n /** Convenience — `effectiveMode() === 'search'`. Exposed via context for options. */\n readonly isSearch = computed(() => this.effectiveMode() === 'search');\n\n /** WrSelectContext — resolved multi-selection flag for child options. */\n readonly multi = computed(() => this.effectiveMode() === 'multi' || this.effectiveMode() === 'tag');\n\n /** Both multi and tag render chips on the trigger. */\n protected readonly hasChips = computed(() => {\n const m = this.effectiveMode();\n return m === 'multi' || m === 'tag';\n });\n\n /**\n * Search-mode query. Empty string = no filter. Exposed via context so\n * each `<wr-option>` can self-hide non-matching rows.\n */\n readonly searchQuery = signal('');\n\n // Search-mode-only inputs (ignored in other modes)\n\n /**\n * Search mode: dynamic option array. Each item is rendered as a\n * `<wr-option>` whose label comes from `[displayWith]`. Works\n * alongside projected `<wr-option>` children — both lists are\n * filtered by the search query.\n */\n readonly options = input<readonly unknown[]>([]);\n\n /** Search mode: map a dynamic option item to its display label. @default String */\n readonly displayWith = input<(item: unknown) => string>((item: unknown) => String(item));\n\n /**\n * Search mode: async loader. When set, the loader is called on every\n * (debounced) keystroke and its result replaces `[options]`. Supports\n * Observables, Promises, and plain arrays.\n */\n readonly loader = input<WrSelectSearchLoader<unknown> | null>(null);\n\n /** Search mode: debounce (ms) applied to the loader. @default 250 */\n readonly debounceMs = input(250, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /** Search mode: minimum query length before the panel opens / loader fires. @default 0 */\n readonly minChars = input(0, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /**\n * Search mode: allow values not in the options list. Enter on an\n * unmatched query commits the raw text as the form value. @default false\n */\n readonly freeText = input(false, { transform: coerceBooleanProperty });\n\n /** Search mode: text shown when the filter / loader returns nothing. Falls back to `select.noResults`. */\n readonly noResultsText = input<string | null>(null);\n\n /** Search mode: text shown while the async loader is in flight. Falls back to `select.loading`. */\n readonly loadingText = input<string | null>(null);\n\n protected readonly resolvedNoResults = useI18nText(this.noResultsText, 'select.noResults', 'No results');\n protected readonly resolvedLoading = useI18nText(this.loadingText, 'select.loading', 'Loading…');\n\n /** Search mode: results returned by the async loader. @internal */\n protected readonly loadedOptions = signal<readonly unknown[]>([]);\n\n /** Search mode: true while the loader is in flight. @internal */\n protected readonly loading = signal(false);\n\n // Tag-mode-only inputs (ignored in other modes)\n\n /**\n * Tag mode: keys / characters that commit the current draft into a chip.\n * `'Enter'` is the key name; everything else is a literal character watched\n * in keypresses and pastes. @default ['Enter', ',']\n */\n readonly separators = input<readonly string[]>(['Enter', ',']);\n\n /** Tag mode: allow the same value to appear more than once. @default false */\n readonly allowDuplicates = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Tag mode: custom validator — return `true` to accept the value, `false`\n * to silently reject. Receives the trimmed draft + the existing chips.\n */\n readonly validate = input<WrSelectTagValidator | null>(null);\n\n /** Tag-mode draft (text currently typed in the inline input). @internal */\n protected readonly draft = signal('');\n\n /**\n * Show a clear-all (×) button at the end of the chip row when at\n * least one option is selected (multi mode only). @default true\n */\n readonly clearable = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Cap on selected items (multi mode). `0` = unlimited. Once reached,\n * additional clicks on unselected options are ignored. @default 0\n */\n readonly maxItems = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /**\n * Maximum number of chips rendered before collapsing the rest into a\n * `+N more` indicator. `0` = render every chip. @default 0\n */\n readonly maxTagCount = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /**\n * Unified value signal. Single mode holds `T | null`; multi mode\n * holds `readonly T[]`. Internal — consumers go through `[(ngModel)]`\n * or `[formControl]` via CVA.\n * @internal\n */\n readonly value = signal<unknown>(null);\n\n /** Listbox id used by the trigger's `aria-controls`. */\n protected readonly listboxId = `wr-select-listbox-${++listboxUid}`;\n\n /** Registered options (insertion order). Internal — distinct from the public `[options]` input. */\n private readonly registry = signal<readonly WrSelectOptionRegistration[]>([]);\n\n /** Keyboard cursor index into `options`. -1 = none. */\n private readonly activeIndex = signal(-1);\n\n /** Id of the active option (for `aria-activedescendant`). */\n readonly activeOptionId = computed<string | null>(() => {\n const idx = this.activeIndex();\n const list = this.registry();\n return idx >= 0 && idx < list.length ? list[idx].id : null;\n });\n\n protected readonly open = signal(false);\n protected readonly selectedLabel = signal<string | null>(null);\n\n /**\n * Selected chips (multi + tag modes). Multi reads labels from the\n * registered `<wr-option>` children; tag uses each raw string as\n * both value and label.\n */\n protected readonly selectedChips = computed<readonly SelectedChip[]>(() => {\n if (!this.hasChips()) return [];\n const arr = this.asArray(this.value());\n if (this.isTag()) {\n return arr.map<SelectedChip>(v => ({ value: v, label: String(v) }));\n }\n const list = this.registry();\n return arr.map<SelectedChip>(v => {\n const found = list.find(o => o.value === v);\n return { value: v, label: found?.getLabel() ?? String(v) };\n });\n });\n\n protected readonly visibleChips = computed<readonly SelectedChip[]>(() => {\n const cap = this.maxTagCount();\n const chips = this.selectedChips();\n return cap > 0 && chips.length > cap ? chips.slice(0, cap) : chips;\n });\n\n protected readonly hiddenChipCount = computed(() => {\n const cap = this.maxTagCount();\n const total = this.selectedChips().length;\n return cap > 0 && total > cap ? total - cap : 0;\n });\n\n protected readonly hasSelection = computed(() => {\n if (this.hasChips()) return this.selectedChips().length > 0;\n return this.value() != null;\n });\n\n private readonly disabledFromCva = signal(false);\n\n /** Effective disabled state — input wins, CVA second. */\n readonly isDisabled = computed(() => this.disabled() || this.disabledFromCva());\n\n protected readonly classes = computed(() => {\n const parts = ['wr-select'];\n if (this.open()) parts.push('wr-select--open');\n if (this.rounded()) parts.push('wr-select--rounded');\n if (this.isMulti()) parts.push('wr-select--multi');\n if (this.isTag()) parts.push('wr-select--tag');\n if (this.isSearch()) parts.push('wr-select--search');\n if (this.isDisabled()) parts.push('wr-select--disabled');\n return parts.join(' ');\n });\n\n /**\n * Search-mode dynamic options. Loader results win when the loader is\n * set; otherwise the static `[options]` array. Each item is rendered\n * as an internal `<wr-option>` in the panel.\n */\n protected readonly dynamicOptions = computed<readonly unknown[]>(() =>\n this.loader() ? this.loadedOptions() : this.options()\n );\n\n /**\n * Count of registered options that pass the current search filter.\n * Hides the noResults state when the panel has at least one visible row.\n */\n protected readonly visibleCount = computed(() => {\n const list = this.registry();\n if (!this.isSearch()) return list.length;\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return list.length;\n let count = 0;\n for (const o of list) {\n if (o.getLabel().toLowerCase().includes(q)) count++;\n }\n return count;\n });\n\n /** Search mode: show \"no results\" when the panel has nothing to offer. */\n protected readonly hasNoResults = computed(() => {\n if (!this.isSearch() || !this.open() || this.loading()) return false;\n if (this.searchQuery().trim().length < this.minChars()) return false;\n return this.visibleCount() === 0;\n });\n\n /** Search mode: is this option hidden by the current query? @internal */\n private isOptionHidden(label: string): boolean {\n if (!this.isSearch()) return false;\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return false;\n return !label.toLowerCase().includes(q);\n }\n\n protected readonly panelTpl = viewChild.required('panelTpl', { read: TemplateRef });\n\n /** Tag-mode inline input. Present only when `mode=\"tag\"`. @internal */\n protected readonly tagInputEl = viewChild<ElementRef<HTMLInputElement>>('tagInput');\n\n /** Search-mode inline input. Present only when `mode=\"search\"`. @internal */\n protected readonly searchInputEl = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n protected focusTagInput(): void {\n this.tagInputEl()?.nativeElement.focus();\n }\n\n protected focusSearchInput(): void {\n this.searchInputEl()?.nativeElement.focus();\n }\n\n // Search-mode handlers\n\n protected onSearchInput(event: Event): void {\n if (this.isDisabled()) return;\n const value = (event.target as HTMLInputElement).value;\n this.searchQuery.set(value);\n if (!this.open()) this.open.set(true);\n }\n\n protected onSearchFocus(): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n this.seedActiveIndex();\n this.open.set(true);\n }\n }\n\n protected onSearchKey(event: KeyboardEvent): void {\n // freeText: Enter on an unmatched query commits the typed string\n // as the value. Skips when an active option is highlighted (the\n // normal Enter-selects behaviour wins).\n if (event.key === 'Enter' && this.freeText() && this.open()) {\n const q = this.searchQuery().trim();\n const idx = this.activeIndex();\n const list = this.registry();\n const hasActive =\n idx >= 0 && idx < list.length && !list[idx].disabled && !this.isOptionHidden(list[idx].getLabel());\n if (!hasActive && q) {\n event.preventDefault();\n this.value.set(q);\n this.onChange(q);\n this.onTouched();\n this.open.set(false);\n return;\n }\n }\n // Otherwise route through the same keyboard plumbing as the button trigger.\n this.onTriggerKey(event);\n }\n\n /**\n * Display text for the search input. Shows the selected option's\n * label when collapsed, or the live query while typing / panel open.\n * @internal\n */\n protected readonly searchDisplay = computed(() => {\n if (this.open()) return this.searchQuery();\n return this.selectedLabel() ?? '';\n });\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private overlayRef: OverlayRef | null = null;\n\n private onChange: (value: unknown) => void = noop;\n protected onTouched: () => void = noop;\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.openOverlay();\n } else {\n this.closeOverlay();\n // Reset the search query when the panel closes so a re-open\n // doesn't carry a stale filter.\n if (this.isSearch()) this.searchQuery.set('');\n }\n });\n\n // Async loader pipeline (search mode only). `switchMap` cancels\n // in-flight requests when a new keystroke arrives.\n toObservable(this.searchQuery)\n .pipe(\n debounceTime(this.debounceMs()),\n switchMap(query => {\n const loader = this.loader();\n if (!loader || !this.isSearch() || query.length < this.minChars()) {\n this.loading.set(false);\n return of<readonly unknown[]>([]);\n }\n this.loading.set(true);\n const result = loader(query);\n const source: Observable<readonly unknown[]> = isObservable(result) ? result : from(Promise.resolve(result));\n return source.pipe(finalize(() => this.loading.set(false)));\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(items => this.loadedOptions.set(items));\n\n // Resolve the single-mode trigger label whenever the value or\n // options change. Multi mode reads `selectedChips` instead and\n // doesn't need this.\n effect(() => {\n const v = this.value();\n const list = this.registry();\n if (this.isMulti()) {\n this.selectedLabel.set(null);\n return;\n }\n const match = list.find(o => o.value === v);\n this.selectedLabel.set(match ? match.getLabel() : null);\n });\n }\n\n // WrSelectContext\n\n isSelected(value: unknown): boolean {\n if (this.isMulti()) return this.asArray(this.value()).includes(value);\n return this.value() === value;\n }\n\n selectOption(value: unknown): void {\n if (this.isMulti()) {\n const current = this.asArray(this.value());\n const idx = current.indexOf(value);\n let next: readonly unknown[];\n if (idx >= 0) {\n next = [...current.slice(0, idx), ...current.slice(idx + 1)];\n } else {\n const cap = this.maxItems();\n if (cap > 0 && current.length >= cap) return;\n next = [...current, value];\n }\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n // Keep the panel open in multi mode so the user can keep picking.\n return;\n }\n this.value.set(value);\n this.onChange(value);\n this.onTouched();\n this.open.set(false);\n }\n\n registerOption(reg: WrSelectOptionRegistration): () => void {\n this.registry.update(list => [...list, reg]);\n return () => this.registry.update(list => list.filter(o => o.id !== reg.id));\n }\n\n // Chip handlers (multi + tag)\n\n /** Remove one selection (chip × button). Works for multi and tag modes. */\n protected removeChip(value: unknown, event: Event): void {\n event.stopPropagation();\n if (this.isDisabled() || !this.hasChips()) return;\n const next = this.asArray(this.value()).filter(v => v !== value);\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n /** Clear every selection (× button). Multi/tag → empty array; search → null. */\n protected clearAll(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n if (this.hasChips()) {\n this.value.set([]);\n this.onChange([]);\n } else if (this.isSearch()) {\n this.value.set(null);\n this.onChange(null);\n this.searchQuery.set('');\n } else {\n return;\n }\n this.onTouched();\n }\n\n // Tag-mode draft handlers\n\n /** Capacity check used by tag mode to refuse the next add. */\n protected readonly atCapacity = computed(() => {\n const cap = this.maxItems();\n return cap > 0 && this.asArray(this.value()).length >= cap;\n });\n\n protected onTagInput(event: Event): void {\n if (this.isDisabled()) return;\n this.draft.set((event.target as HTMLInputElement).value);\n }\n\n protected onTagKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const seps = this.separators();\n\n if (seps.includes(event.key)) {\n event.preventDefault();\n this.commitDraft();\n return;\n }\n\n if (event.key === 'Backspace' && this.draft() === '') {\n const chips = this.selectedChips();\n if (chips.length > 0) {\n event.preventDefault();\n this.removeChip(chips[chips.length - 1].value, event);\n }\n }\n }\n\n protected onTagPaste(event: ClipboardEvent): void {\n if (this.isDisabled()) return;\n const text = event.clipboardData?.getData('text') ?? '';\n if (!text) return;\n\n const seps = this.separators().filter(s => s !== 'Enter');\n if (seps.length === 0) return;\n\n event.preventDefault();\n const escaped = seps.map(s => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('');\n const splitRegex = new RegExp(`[${escaped}\\\\n]+`);\n for (const part of text.split(splitRegex)) this.tryAddTag(part);\n }\n\n protected onTagBlur(): void {\n if (this.draft().trim()) this.commitDraft();\n this.onTouched();\n }\n\n private commitDraft(): void {\n const v = this.draft().trim();\n this.draft.set('');\n if (v) this.tryAddTag(v);\n }\n\n private tryAddTag(raw: string): void {\n if (!this.isTag() || this.atCapacity()) return;\n const value = raw.trim();\n if (!value) return;\n\n const existing = this.asArray(this.value()).map(String);\n if (!this.allowDuplicates() && existing.includes(value)) return;\n\n const validator = this.validate();\n if (validator && !validator(value, existing)) return;\n\n const next = [...existing, value];\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n // ControlValueAccessor\n\n writeValue(value: unknown): void {\n if (this.hasChips()) {\n this.value.set(Array.isArray(value) ? (value as readonly unknown[]) : []);\n } else {\n this.value.set(value);\n }\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledFromCva.set(coerceBooleanProperty(isDisabled));\n if (isDisabled) this.open.set(false);\n }\n\n // Template handlers\n\n protected onTriggerClick(): void {\n if (this.isDisabled()) return;\n // Tag mode has no panel — clicks should land on the inline input,\n // not toggle an overlay that's never created.\n if (this.isTag()) return;\n this.open.update(v => !v);\n }\n\n protected onTriggerKey(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n\n if (!this.open()) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n this.seedActiveIndex();\n this.open.set(true);\n return;\n }\n // Multi mode: Backspace on closed trigger removes last chip. Tag\n // mode has its own input handler — never reaches this branch.\n if (event.key === 'Backspace' && this.isMulti() && this.hasSelection()) {\n event.preventDefault();\n const chips = this.selectedChips();\n const last = chips[chips.length - 1];\n if (last) this.removeChip(last.value, event);\n }\n return;\n }\n\n // Open — navigation/selection.\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(this.firstEnabled());\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(this.lastEnabled());\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const idx = this.activeIndex();\n const list = this.registry();\n if (idx >= 0 && idx < list.length && !list[idx].disabled) {\n const id = list[idx].id;\n const el = this.overlayRef?.overlayElement.querySelector<HTMLElement>(`#${CSS.escape(id)}`);\n el?.click();\n }\n break;\n }\n default:\n break;\n }\n }\n\n private seedActiveIndex(): void {\n const list = this.registry();\n let selectedIdx = -1;\n if (this.isMulti()) {\n const arr = this.asArray(this.value());\n if (arr.length > 0) selectedIdx = list.findIndex(o => o.value === arr[0]);\n } else {\n selectedIdx = list.findIndex(o => o.value === this.value());\n }\n this.activeIndex.set(selectedIdx >= 0 ? selectedIdx : this.firstEnabled());\n }\n\n private moveActive(delta: number): void {\n const list = this.registry();\n if (list.length === 0) return;\n let i = this.activeIndex();\n let attempts = list.length;\n while (attempts-- > 0) {\n i = (i + delta + list.length) % list.length;\n const o = list[i];\n if (!o.disabled && !this.isOptionHidden(o.getLabel())) {\n this.activeIndex.set(i);\n return;\n }\n }\n }\n\n private firstEnabled(): number {\n return this.registry().findIndex(o => !o.disabled && !this.isOptionHidden(o.getLabel()));\n }\n\n private lastEnabled(): number {\n const list = this.registry();\n let found = -1;\n list.forEach((o, i) => {\n if (!o.disabled && !this.isOptionHidden(o.getLabel())) found = i;\n });\n return found;\n }\n\n /** Coerce the multi-mode value signal into an array (handles writeValue from non-array). */\n private asArray(value: unknown): readonly unknown[] {\n if (Array.isArray(value)) return value as readonly unknown[];\n if (value == null) return [];\n return [value];\n }\n\n // Overlay\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n width: this.host.nativeElement.getBoundingClientRect().width,\n panelClass: 'wr-select-overlay',\n });\n\n const portal = new TemplatePortal(this.panelTpl(), this.vcr);\n this.overlayRef.attach(portal);\n\n this.overlayRef\n .outsidePointerEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.open.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.open.set(false);\n }\n });\n }\n\n private closeOverlay(): void {\n if (!this.overlayRef) return;\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n}\n","@if (isSearch()) {\n <!-- Search mode: a real text input drives a filtered overlay panel.\n The wrapper isn't itself focusable — the input is the tabstop. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div class=\"wr-select__trigger wr-select__trigger--search\" (click)=\"focusSearchInput()\">\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n class=\"wr-select__search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() || null : null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"searchDisplay()\"\n (input)=\"onSearchInput($event)\"\n (focus)=\"onSearchFocus()\"\n (keydown)=\"onSearchKey($event)\"\n (blur)=\"onTouched()\"\n />\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n <svg\n class=\"wr-icon__svg wr-select__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n} @else if (isTag()) {\n <!-- Tag mode: a focusable input lives inside, so the wrapper itself\n only exists to host chips and forward whitespace clicks to the\n input. Keyboard users tab straight into the input — no need for a\n separate role. The click handler is a mouse-only convenience. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"wr-select__trigger wr-select__trigger--tag\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n (click)=\"focusTagInput()\"\n >\n <span class=\"wr-select__chips\">\n @for (chip of visibleChips(); track $index) {\n <span class=\"wr-select__chip\">\n <span class=\"wr-select__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-select__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.value, $event)\"\n (keydown.enter)=\"removeChip(chip.value, $event)\"\n (keydown.space)=\"removeChip(chip.value, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-select__chip wr-select__chip--more\">+{{ extra }} more</span>\n }\n <input\n #tagInput\n type=\"text\"\n class=\"wr-select__tag-input\"\n [value]=\"draft()\"\n [disabled]=\"isDisabled() || atCapacity()\"\n [placeholder]=\"hasSelection() ? '' : resolvedPlaceholder()\"\n (input)=\"onTagInput($event)\"\n (keydown)=\"onTagKeydown($event)\"\n (paste)=\"onTagPaste($event)\"\n (blur)=\"onTagBlur()\"\n />\n </span>\n\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n </div>\n} @else {\n <button\n type=\"button\"\n class=\"wr-select__trigger\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() || null : null\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKey($event)\"\n (blur)=\"onTouched()\"\n >\n @if (isMulti()) {\n @if (hasSelection()) {\n <span class=\"wr-select__chips\">\n @for (chip of visibleChips(); track $index) {\n <span class=\"wr-select__chip\">\n <span class=\"wr-select__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-select__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.value, $event)\"\n (keydown.enter)=\"removeChip(chip.value, $event)\"\n (keydown.space)=\"removeChip(chip.value, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-select__chip wr-select__chip--more\">+{{ extra }} more</span>\n }\n </span>\n } @else {\n <span class=\"wr-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n } @else {\n @if (selectedLabel(); as label) {\n <span class=\"wr-select__value\">{{ label }}</span>\n } @else {\n <span class=\"wr-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n }\n\n @if (isMulti() && clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n\n <svg\n class=\"wr-icon__svg wr-select__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n}\n\n<ng-template #panelTpl>\n <div\n class=\"wr-select-panel\"\n role=\"listbox\"\n [attr.id]=\"listboxId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n >\n @if (loading()) {\n <div class=\"wr-select-panel__loading\" aria-busy=\"true\">{{ resolvedLoading() }}</div>\n }\n\n <!-- Dynamic options from [options] or async [loader] (search mode).\n Rendered as wr-option so the standard registration / filter\n pipeline applies uniformly. -->\n @for (item of dynamicOptions(); track $index) {\n <wr-option [value]=\"item\">{{ displayWith()(item) }}</wr-option>\n }\n\n <!-- Projected static options. -->\n <ng-content />\n\n @if (hasNoResults()) {\n <div class=\"wr-select-panel__empty\">{{ resolvedNoResults() }}</div>\n }\n </div>\n</ng-template>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * Visually groups options under a label inside a `<wr-select>`.\n *\n * @example\n * ```html\n * <wr-option-group label=\"Sizes\">\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option value=\"md\">Medium</wr-option>\n * </wr-option-group>\n * ```\n */\n@Component({\n selector: 'wr-option-group',\n templateUrl: './option-group.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-option-group', role: 'group' },\n})\nexport class WrOptionGroup {\n /** Section heading shown above the options. */\n readonly label = input.required<string>();\n}\n","<div class=\"wr-option-group__label\">{{ label() }}</div>\n<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import * as i0 from '@angular/core';
3
+ import { input, computed, ViewEncapsulation, Component, Directive } from '@angular/core';
4
+ import { numAttr } from 'ngwr/utils';
5
+
6
+ /**
7
+ * @license
8
+ *
9
+ * Use of this source code is governed by an MIT-style license that can be
10
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
11
+ *
12
+ * Angular adaptation of the ShinyText effect by David Haz / reactbits.dev.
13
+ * Original: https://www.reactbits.dev/text-animations/shiny-text
14
+ *
15
+ * The reactbits version uses `motion/react` to drive `background-position`
16
+ * via rAF. This port is pure CSS — the same effect via a keyframe that
17
+ * sweeps `background-position`, parameterised by `[speed]` / `[delay]` /
18
+ * `[yoyo]` / `[direction]`.
19
+ */
20
+ /**
21
+ * Animated shimmer-over-text effect. A bright stripe sweeps across the
22
+ * text using `background-clip: text` + an animated `background-position`.
23
+ *
24
+ * @example
25
+ * ```html
26
+ * <wr-shiny-text text="Premium" />
27
+ * <wr-shiny-text
28
+ * text="Custom"
29
+ * color="#444"
30
+ * shineColor="#a0e0ff"
31
+ * [speed]="3"
32
+ * [delay]="0.5"
33
+ * [yoyo]="true"
34
+ * [pauseOnHover]="true"
35
+ * />
36
+ * ```
37
+ *
38
+ * @see https://www.reactbits.dev/text-animations/shiny-text
39
+ */
40
+ class WrShinyText {
41
+ /** Text to render. */
42
+ text = input.required(/* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
44
+ /** Pause the animation. @default false */
45
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
46
+ /** Time for the bright stripe to traverse the text, in seconds. @default 2 */
47
+ speed = input(2, { ...(ngDevMode ? { debugName: "speed" } : /* istanbul ignore next */ {}), transform: numAttr(2) });
48
+ /** Base text colour (outside the bright stripe). @default '#b5b5b5' */
49
+ /** Base text colour. When unset, the theme decides. */
50
+ color = input(null, /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
52
+ /** Bright stripe colour. @default '#ffffff' */
53
+ /** Sweep highlight colour. When unset, the theme decides. */
54
+ shineColor = input(null, /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "shineColor" }] : /* istanbul ignore next */ []));
56
+ /** Gradient angle in degrees. @default 120 */
57
+ spread = input(120, { ...(ngDevMode ? { debugName: "spread" } : /* istanbul ignore next */ {}), transform: numAttr(120) });
58
+ /** Bounce the stripe back-and-forth instead of restarting. @default false */
59
+ yoyo = input(false, { ...(ngDevMode ? { debugName: "yoyo" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
60
+ /** Pause the animation while hovered. @default false */
61
+ pauseOnHover = input(false, { ...(ngDevMode ? { debugName: "pauseOnHover" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
62
+ /** Sweep direction. @default 'left' */
63
+ direction = input('left', /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
65
+ /** Pause between sweeps in seconds. @default 0 */
66
+ delay = input(0, { ...(ngDevMode ? { debugName: "delay" } : /* istanbul ignore next */ {}), transform: numAttr(0) });
67
+ /** Total animation cycle (speed + delay) in seconds. */
68
+ totalDuration = computed(() => this.speed() + this.delay(), /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "totalDuration" }] : /* istanbul ignore next */ []));
70
+ gradient = computed(() => {
71
+ const base = this.color() ?? 'var(--wr-shiny-text-base)';
72
+ const shine = this.shineColor() ?? 'var(--wr-shiny-text-shine)';
73
+ return `linear-gradient(${this.spread()}deg, ${base} 0%, ${base} 35%, ${shine} 50%, ${base} 65%, ${base} 100%)`;
74
+ }, /* @ts-ignore */
75
+ ...(ngDevMode ? [{ debugName: "gradient" }] : /* istanbul ignore next */ []));
76
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrShinyText, deps: [], target: i0.ɵɵFactoryTarget.Component });
77
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: WrShinyText, isStandalone: true, selector: "wr-shiny-text", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, shineColor: { classPropertyName: "shineColor", publicName: "shineColor", isSignal: true, isRequired: false, transformFunction: null }, spread: { classPropertyName: "spread", publicName: "spread", isSignal: true, isRequired: false, transformFunction: null }, yoyo: { classPropertyName: "yoyo", publicName: "yoyo", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.wr-shiny-text--paused": "disabled()", "class.wr-shiny-text--pause-on-hover": "pauseOnHover()", "class.wr-shiny-text--yoyo": "yoyo()", "class.wr-shiny-text--reverse": "direction() === 'right'", "style.background-image": "gradient()", "style.animation-duration": "totalDuration() + 's'" }, classAttribute: "wr-shiny-text" }, ngImport: i0, template: '{{ text() }}', isInline: true, styles: [".wr-shiny-text{--wr-shiny-text-base: var(--wr-color-medium, #8594a4);--wr-shiny-text-shine: var(--wr-color-dark, #0f172a);display:inline-block;background-size:200% auto;background-position:150% center;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;animation-name:wr-shiny-text-sweep;animation-timing-function:linear;animation-iteration-count:infinite;animation-direction:normal;animation-fill-mode:both;animation-play-state:running}.wr-shiny-text--reverse{animation-direction:reverse}.wr-shiny-text--yoyo{animation-direction:alternate}.wr-shiny-text--yoyo.wr-shiny-text--reverse{animation-direction:alternate-reverse}.wr-shiny-text--paused,.wr-shiny-text--pause-on-hover:hover{animation-play-state:paused}@keyframes wr-shiny-text-sweep{0%{background-position:150% center}50%{background-position:-50% center}to{background-position:-50% center}}@media(prefers-reduced-motion:reduce){.wr-shiny-text{animation:none!important}}@keyframes wr-shimmer{to{background-position-x:-200%}}.wr-shimmer{background:linear-gradient(110deg,var(--wr-color-dark) 30%,rgba(var(--wr-color-primary-rgb),.9) 50%,var(--wr-color-dark) 70%);background-size:200% 100%;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:wr-shimmer 2.5s linear infinite}@media(prefers-reduced-motion:reduce){.wr-shimmer{animation:none}}[data-theme=dark] .wr-shiny-text{--wr-shiny-text-base: #b5b5b5;--wr-shiny-text-shine: #ffffff}\n"], encapsulation: i0.ViewEncapsulation.None });
78
+ }
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrShinyText, decorators: [{
80
+ type: Component,
81
+ args: [{ selector: 'wr-shiny-text', template: '{{ text() }}', encapsulation: ViewEncapsulation.None, host: {
82
+ class: 'wr-shiny-text',
83
+ '[class.wr-shiny-text--paused]': 'disabled()',
84
+ '[class.wr-shiny-text--pause-on-hover]': 'pauseOnHover()',
85
+ '[class.wr-shiny-text--yoyo]': 'yoyo()',
86
+ '[class.wr-shiny-text--reverse]': "direction() === 'right'",
87
+ '[style.background-image]': 'gradient()',
88
+ '[style.animation-duration]': "totalDuration() + 's'",
89
+ }, styles: [".wr-shiny-text{--wr-shiny-text-base: var(--wr-color-medium, #8594a4);--wr-shiny-text-shine: var(--wr-color-dark, #0f172a);display:inline-block;background-size:200% auto;background-position:150% center;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;animation-name:wr-shiny-text-sweep;animation-timing-function:linear;animation-iteration-count:infinite;animation-direction:normal;animation-fill-mode:both;animation-play-state:running}.wr-shiny-text--reverse{animation-direction:reverse}.wr-shiny-text--yoyo{animation-direction:alternate}.wr-shiny-text--yoyo.wr-shiny-text--reverse{animation-direction:alternate-reverse}.wr-shiny-text--paused,.wr-shiny-text--pause-on-hover:hover{animation-play-state:paused}@keyframes wr-shiny-text-sweep{0%{background-position:150% center}50%{background-position:-50% center}to{background-position:-50% center}}@media(prefers-reduced-motion:reduce){.wr-shiny-text{animation:none!important}}@keyframes wr-shimmer{to{background-position-x:-200%}}.wr-shimmer{background:linear-gradient(110deg,var(--wr-color-dark) 30%,rgba(var(--wr-color-primary-rgb),.9) 50%,var(--wr-color-dark) 70%);background-size:200% 100%;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:wr-shimmer 2.5s linear infinite}@media(prefers-reduced-motion:reduce){.wr-shimmer{animation:none}}[data-theme=dark] .wr-shiny-text{--wr-shiny-text-base: #b5b5b5;--wr-shiny-text-shine: #ffffff}\n"] }]
90
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], speed: [{ type: i0.Input, args: [{ isSignal: true, alias: "speed", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], shineColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "shineColor", required: false }] }], spread: [{ type: i0.Input, args: [{ isSignal: true, alias: "spread", required: false }] }], yoyo: [{ type: i0.Input, args: [{ isSignal: true, alias: "yoyo", required: false }] }], pauseOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseOnHover", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }] } });
91
+
92
+ /**
93
+ * @license
94
+ *
95
+ * Use of this source code is governed by an MIT-style license that can be
96
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
97
+ */
98
+ /**
99
+ * Gradient sweep over text. Applies a `background-clip: text` gradient
100
+ * with a moving highlight — gives any text a subtle shimmer.
101
+ *
102
+ * The directive only adds the `wr-shimmer` host class. Pair with the
103
+ * styles in `ngwr/animations` (which include the `wr-shimmer` keyframes).
104
+ *
105
+ * @example
106
+ * ```html
107
+ * <h1 wrShimmer>Premium</h1>
108
+ * ```
109
+ */
110
+ class WrShimmer {
111
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrShimmer, deps: [], target: i0.ɵɵFactoryTarget.Directive });
112
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.1", type: WrShimmer, isStandalone: true, selector: "[wrShimmer]", host: { classAttribute: "wr-shimmer" }, ngImport: i0 });
113
+ }
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrShimmer, decorators: [{
115
+ type: Directive,
116
+ args: [{
117
+ selector: '[wrShimmer]',
118
+ host: { class: 'wr-shimmer' },
119
+ }]
120
+ }] });
121
+
122
+ /**
123
+ * Generated bundle index. Do not edit.
124
+ */
125
+
126
+ export { WrShimmer, WrShinyText };
127
+ //# sourceMappingURL=ngwr-shiny-text.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngwr-shiny-text.mjs","sources":["../../../projects/lib/shiny-text/shiny-text.ts","../../../projects/lib/shiny-text/shimmer.ts","../../../projects/lib/shiny-text/ngwr-shiny-text.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n *\n * Angular adaptation of the ShinyText effect by David Haz / reactbits.dev.\n * Original: https://www.reactbits.dev/text-animations/shiny-text\n *\n * The reactbits version uses `motion/react` to drive `background-position`\n * via rAF. This port is pure CSS — the same effect via a keyframe that\n * sweeps `background-position`, parameterised by `[speed]` / `[delay]` /\n * `[yoyo]` / `[direction]`.\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\n\nimport { numAttr } from 'ngwr/utils';\n\n/**\n * Animated shimmer-over-text effect. A bright stripe sweeps across the\n * text using `background-clip: text` + an animated `background-position`.\n *\n * @example\n * ```html\n * <wr-shiny-text text=\"Premium\" />\n * <wr-shiny-text\n * text=\"Custom\"\n * color=\"#444\"\n * shineColor=\"#a0e0ff\"\n * [speed]=\"3\"\n * [delay]=\"0.5\"\n * [yoyo]=\"true\"\n * [pauseOnHover]=\"true\"\n * />\n * ```\n *\n * @see https://www.reactbits.dev/text-animations/shiny-text\n */\n@Component({\n selector: 'wr-shiny-text',\n template: '{{ text() }}',\n styleUrl: './shiny-text.scss',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-shiny-text',\n '[class.wr-shiny-text--paused]': 'disabled()',\n '[class.wr-shiny-text--pause-on-hover]': 'pauseOnHover()',\n '[class.wr-shiny-text--yoyo]': 'yoyo()',\n '[class.wr-shiny-text--reverse]': \"direction() === 'right'\",\n '[style.background-image]': 'gradient()',\n '[style.animation-duration]': \"totalDuration() + 's'\",\n },\n})\nexport class WrShinyText {\n /** Text to render. */\n readonly text = input.required<string>();\n\n /** Pause the animation. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Time for the bright stripe to traverse the text, in seconds. @default 2 */\n readonly speed = input(2, { transform: numAttr(2) });\n\n /** Base text colour (outside the bright stripe). @default '#b5b5b5' */\n /** Base text colour. When unset, the theme decides. */\n readonly color = input<string | null>(null);\n\n /** Bright stripe colour. @default '#ffffff' */\n /** Sweep highlight colour. When unset, the theme decides. */\n readonly shineColor = input<string | null>(null);\n\n /** Gradient angle in degrees. @default 120 */\n readonly spread = input(120, { transform: numAttr(120) });\n\n /** Bounce the stripe back-and-forth instead of restarting. @default false */\n readonly yoyo = input(false, { transform: coerceBooleanProperty });\n\n /** Pause the animation while hovered. @default false */\n readonly pauseOnHover = input(false, { transform: coerceBooleanProperty });\n\n /** Sweep direction. @default 'left' */\n readonly direction = input<'left' | 'right'>('left');\n\n /** Pause between sweeps in seconds. @default 0 */\n readonly delay = input(0, { transform: numAttr(0) });\n\n /** Total animation cycle (speed + delay) in seconds. */\n protected readonly totalDuration = computed(() => this.speed() + this.delay());\n\n protected readonly gradient = computed(() => {\n const base = this.color() ?? 'var(--wr-shiny-text-base)';\n const shine = this.shineColor() ?? 'var(--wr-shiny-text-shine)';\n return `linear-gradient(${this.spread()}deg, ${base} 0%, ${base} 35%, ${shine} 50%, ${base} 65%, ${base} 100%)`;\n });\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directive } from '@angular/core';\n\n/**\n * Gradient sweep over text. Applies a `background-clip: text` gradient\n * with a moving highlight — gives any text a subtle shimmer.\n *\n * The directive only adds the `wr-shimmer` host class. Pair with the\n * styles in `ngwr/animations` (which include the `wr-shimmer` keyframes).\n *\n * @example\n * ```html\n * <h1 wrShimmer>Premium</h1>\n * ```\n */\n@Directive({\n selector: '[wrShimmer]',\n host: { class: 'wr-shimmer' },\n})\nexport class WrShimmer {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import * as i0 from '@angular/core';
3
+ import { input, signal, inject, effect, ViewEncapsulation, Component } from '@angular/core';
4
+ import { toSignal } from '@angular/core/rxjs-interop';
5
+ import { Router, NavigationEnd, RouterLink, RouterLinkActive } from '@angular/router';
6
+ import { filter, map, startWith } from 'rxjs';
7
+ import { WrIcon } from 'ngwr/icon';
8
+
9
+ /**
10
+ * @license
11
+ *
12
+ * Use of this source code is governed by an MIT-style license that can be
13
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
14
+ */
15
+ function isGroup(entry) {
16
+ return 'children' in entry;
17
+ }
18
+ /**
19
+ * Data-driven sidebar nav. Pass `[entries]` — either flat
20
+ * `WrSidebarItem`s (direct links) or `WrSidebarGroup`s (expand to reveal
21
+ * child items). Active route auto-expands its containing group.
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <wr-sidebar [entries]="[
26
+ * { title: 'Dashboard', icon: 'home', url: ['/dashboard'] },
27
+ * {
28
+ * title: 'Settings',
29
+ * icon: 'cog',
30
+ * children: [
31
+ * { title: 'Profile', url: ['/settings', 'profile'] },
32
+ * { title: 'Billing', url: ['/settings', 'billing'] }
33
+ * ]
34
+ * }
35
+ * ]" />
36
+ * ```
37
+ *
38
+ * @see https://ngwr.dev/components/sidebar
39
+ */
40
+ class WrSidebar {
41
+ entries = input([], /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "entries" }] : /* istanbul ignore next */ []));
43
+ /** Default icon for entries without one. @default 'folder' */
44
+ defaultGroupIcon = input('folder', /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "defaultGroupIcon" }] : /* istanbul ignore next */ []));
46
+ /** Default icon for items without one. @default 'caret-forward' */
47
+ defaultItemIcon = input('caret-forward', /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "defaultItemIcon" }] : /* istanbul ignore next */ []));
49
+ /** Auto-expand the group containing the active route. @default true */
50
+ autoExpand = input(true, { ...(ngDevMode ? { debugName: "autoExpand" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
51
+ isGroup = isGroup;
52
+ opened = signal(new Set(), /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "opened" }] : /* istanbul ignore next */ []));
54
+ router = inject(Router);
55
+ currentUrl = toSignal(this.router.events.pipe(filter((e) => e instanceof NavigationEnd), map(e => e.urlAfterRedirects), startWith(this.router.url)), { initialValue: this.router.url });
56
+ /** Last URL we auto-expanded — prevents re-opening a group the user collapsed. */
57
+ lastAutoUrl = null;
58
+ constructor() {
59
+ // Seed defaultOpen groups.
60
+ effect(() => {
61
+ const seeded = new Set();
62
+ for (const entry of this.entries()) {
63
+ if (isGroup(entry) && entry.defaultOpen)
64
+ seeded.add(entry.title);
65
+ }
66
+ if (seeded.size > 0) {
67
+ this.opened.update(prev => new Set([...prev, ...seeded]));
68
+ }
69
+ });
70
+ // Auto-expand the group containing the current URL.
71
+ effect(() => {
72
+ if (!this.autoExpand())
73
+ return;
74
+ const url = this.currentUrl();
75
+ if (url === this.lastAutoUrl)
76
+ return;
77
+ this.lastAutoUrl = url;
78
+ const match = this.findGroupForUrl(url);
79
+ if (!match || this.opened().has(match))
80
+ return;
81
+ this.opened.update(prev => {
82
+ const next = new Set(prev);
83
+ next.add(match);
84
+ return next;
85
+ });
86
+ });
87
+ }
88
+ isOpen(title) {
89
+ return this.opened().has(title);
90
+ }
91
+ /** Stable id for the group body, referenced by the toggle's `aria-controls`. */
92
+ groupBodyId(title) {
93
+ return `wr-sidebar-group-${title.replace(/\s+/g, '-').toLowerCase()}`;
94
+ }
95
+ toggleGroup(title) {
96
+ this.opened.update(prev => {
97
+ const next = new Set(prev);
98
+ if (next.has(title))
99
+ next.delete(title);
100
+ else
101
+ next.add(title);
102
+ return next;
103
+ });
104
+ }
105
+ asItem(entry) {
106
+ return entry;
107
+ }
108
+ asGroup(entry) {
109
+ return entry;
110
+ }
111
+ findGroupForUrl(url) {
112
+ for (const entry of this.entries()) {
113
+ if (!isGroup(entry))
114
+ continue;
115
+ const hit = entry.children.some(child => url.startsWith(`/${child.url.join('/')}`));
116
+ if (hit)
117
+ return entry.title;
118
+ }
119
+ return null;
120
+ }
121
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
122
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: WrSidebar, isStandalone: true, selector: "wr-sidebar", inputs: { entries: { classPropertyName: "entries", publicName: "entries", isSignal: true, isRequired: false, transformFunction: null }, defaultGroupIcon: { classPropertyName: "defaultGroupIcon", publicName: "defaultGroupIcon", isSignal: true, isRequired: false, transformFunction: null }, defaultItemIcon: { classPropertyName: "defaultItemIcon", publicName: "defaultItemIcon", isSignal: true, isRequired: false, transformFunction: null }, autoExpand: { classPropertyName: "autoExpand", publicName: "autoExpand", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, classAttribute: "wr-sidebar" }, ngImport: i0, template: "<nav class=\"wr-sidebar__inner\">\n @for (entry of entries(); track entry.title) {\n @if (!isGroup(entry)) {\n <a\n class=\"wr-sidebar__entry\"\n routerLinkActive=\"wr-sidebar__entry--active\"\n [routerLink]=\"asItem(entry).url\"\n [class.wr-sidebar__entry--disabled]=\"asItem(entry).disabled\"\n >\n @if (asItem(entry).icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__title\">{{ entry.title }}</span>\n @if (asItem(entry).badge) {\n <small class=\"wr-sidebar__badge\">{{ asItem(entry).badge }}</small>\n }\n </a>\n } @else {\n <section class=\"wr-sidebar__group\" [class.wr-sidebar__group--collapsed]=\"!isOpen(entry.title)\">\n <button\n type=\"button\"\n class=\"wr-sidebar__group-toggle\"\n [attr.aria-expanded]=\"isOpen(entry.title)\"\n [attr.aria-controls]=\"groupBodyId(entry.title)\"\n (click)=\"toggleGroup(entry.title)\"\n >\n @if (asGroup(entry).icon || defaultGroupIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__title\">{{ entry.title }}</span>\n <!-- Inline chrome chevron \u2014 not user-customizable. -->\n <svg\n class=\"wr-icon__svg wr-sidebar__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n <div\n class=\"wr-sidebar__group-wrap\"\n [attr.id]=\"groupBodyId(entry.title)\"\n [attr.inert]=\"!isOpen(entry.title) ? '' : null\"\n >\n <div class=\"wr-sidebar__group-body\">\n <ul class=\"wr-sidebar__list\">\n @for (child of asGroup(entry).children; track child.title) {\n <li>\n @if (child.disabled || !child.url.length) {\n <span class=\"wr-sidebar__item wr-sidebar__item--disabled\">\n @if (child.icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__item-title\">{{ child.title }}</span>\n @if (child.badge) {\n <small class=\"wr-sidebar__badge\">{{ child.badge }}</small>\n }\n </span>\n } @else {\n <a class=\"wr-sidebar__item\" routerLinkActive=\"wr-sidebar__item--active\" [routerLink]=\"child.url\">\n @if (child.icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__item-title\">{{ child.title }}</span>\n @if (child.badge) {\n <small class=\"wr-sidebar__badge\">{{ child.badge }}</small>\n }\n </a>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n </section>\n }\n }\n</nav>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: WrIcon, selector: "wr-icon", inputs: ["name"] }], encapsulation: i0.ViewEncapsulation.None });
123
+ }
124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: WrSidebar, decorators: [{
125
+ type: Component,
126
+ args: [{ selector: 'wr-sidebar', encapsulation: ViewEncapsulation.None, host: { class: 'wr-sidebar', role: 'navigation' }, imports: [RouterLink, RouterLinkActive, WrIcon], template: "<nav class=\"wr-sidebar__inner\">\n @for (entry of entries(); track entry.title) {\n @if (!isGroup(entry)) {\n <a\n class=\"wr-sidebar__entry\"\n routerLinkActive=\"wr-sidebar__entry--active\"\n [routerLink]=\"asItem(entry).url\"\n [class.wr-sidebar__entry--disabled]=\"asItem(entry).disabled\"\n >\n @if (asItem(entry).icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__title\">{{ entry.title }}</span>\n @if (asItem(entry).badge) {\n <small class=\"wr-sidebar__badge\">{{ asItem(entry).badge }}</small>\n }\n </a>\n } @else {\n <section class=\"wr-sidebar__group\" [class.wr-sidebar__group--collapsed]=\"!isOpen(entry.title)\">\n <button\n type=\"button\"\n class=\"wr-sidebar__group-toggle\"\n [attr.aria-expanded]=\"isOpen(entry.title)\"\n [attr.aria-controls]=\"groupBodyId(entry.title)\"\n (click)=\"toggleGroup(entry.title)\"\n >\n @if (asGroup(entry).icon || defaultGroupIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__title\">{{ entry.title }}</span>\n <!-- Inline chrome chevron \u2014 not user-customizable. -->\n <svg\n class=\"wr-icon__svg wr-sidebar__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n <div\n class=\"wr-sidebar__group-wrap\"\n [attr.id]=\"groupBodyId(entry.title)\"\n [attr.inert]=\"!isOpen(entry.title) ? '' : null\"\n >\n <div class=\"wr-sidebar__group-body\">\n <ul class=\"wr-sidebar__list\">\n @for (child of asGroup(entry).children; track child.title) {\n <li>\n @if (child.disabled || !child.url.length) {\n <span class=\"wr-sidebar__item wr-sidebar__item--disabled\">\n @if (child.icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__item-title\">{{ child.title }}</span>\n @if (child.badge) {\n <small class=\"wr-sidebar__badge\">{{ child.badge }}</small>\n }\n </span>\n } @else {\n <a class=\"wr-sidebar__item\" routerLinkActive=\"wr-sidebar__item--active\" [routerLink]=\"child.url\">\n @if (child.icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__item-title\">{{ child.title }}</span>\n @if (child.badge) {\n <small class=\"wr-sidebar__badge\">{{ child.badge }}</small>\n }\n </a>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n </section>\n }\n }\n</nav>\n" }]
127
+ }], ctorParameters: () => [], propDecorators: { entries: [{ type: i0.Input, args: [{ isSignal: true, alias: "entries", required: false }] }], defaultGroupIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultGroupIcon", required: false }] }], defaultItemIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultItemIcon", required: false }] }], autoExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoExpand", required: false }] }] } });
128
+
129
+ /**
130
+ * Generated bundle index. Do not edit.
131
+ */
132
+
133
+ export { WrSidebar };
134
+ //# sourceMappingURL=ngwr-sidebar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngwr-sidebar.mjs","sources":["../../../projects/lib/sidebar/sidebar.ts","../../../projects/lib/sidebar/sidebar.html","../../../projects/lib/sidebar/ngwr-sidebar.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, effect, inject, input, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { filter, map, startWith } from 'rxjs';\n\nimport { WrIcon } from 'ngwr/icon';\n\nimport type { WrSidebarEntry, WrSidebarGroup, WrSidebarItem } from './interfaces';\n\nfunction isGroup(entry: WrSidebarEntry): entry is WrSidebarGroup {\n return 'children' in entry;\n}\n\n/**\n * Data-driven sidebar nav. Pass `[entries]` — either flat\n * `WrSidebarItem`s (direct links) or `WrSidebarGroup`s (expand to reveal\n * child items). Active route auto-expands its containing group.\n *\n * @example\n * ```html\n * <wr-sidebar [entries]=\"[\n * { title: 'Dashboard', icon: 'home', url: ['/dashboard'] },\n * {\n * title: 'Settings',\n * icon: 'cog',\n * children: [\n * { title: 'Profile', url: ['/settings', 'profile'] },\n * { title: 'Billing', url: ['/settings', 'billing'] }\n * ]\n * }\n * ]\" />\n * ```\n *\n * @see https://ngwr.dev/components/sidebar\n */\n@Component({\n selector: 'wr-sidebar',\n templateUrl: './sidebar.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-sidebar', role: 'navigation' },\n imports: [RouterLink, RouterLinkActive, WrIcon],\n})\nexport class WrSidebar {\n readonly entries = input<readonly WrSidebarEntry[]>([]);\n\n /** Default icon for entries without one. @default 'folder' */\n readonly defaultGroupIcon = input<string>('folder');\n\n /** Default icon for items without one. @default 'caret-forward' */\n readonly defaultItemIcon = input<string>('caret-forward');\n\n /** Auto-expand the group containing the active route. @default true */\n readonly autoExpand = input(true, { transform: coerceBooleanProperty });\n\n protected readonly isGroup = isGroup;\n\n private readonly opened = signal<ReadonlySet<string>>(new Set());\n\n private readonly router = inject(Router);\n private readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(e => e.urlAfterRedirects),\n startWith(this.router.url)\n ),\n { initialValue: this.router.url }\n );\n\n /** Last URL we auto-expanded — prevents re-opening a group the user collapsed. */\n private lastAutoUrl: string | null = null;\n\n constructor() {\n // Seed defaultOpen groups.\n effect(() => {\n const seeded = new Set<string>();\n for (const entry of this.entries()) {\n if (isGroup(entry) && entry.defaultOpen) seeded.add(entry.title);\n }\n if (seeded.size > 0) {\n this.opened.update(prev => new Set([...prev, ...seeded]));\n }\n });\n\n // Auto-expand the group containing the current URL.\n effect(() => {\n if (!this.autoExpand()) return;\n const url = this.currentUrl();\n if (url === this.lastAutoUrl) return;\n this.lastAutoUrl = url;\n const match = this.findGroupForUrl(url);\n if (!match || this.opened().has(match)) return;\n this.opened.update(prev => {\n const next = new Set(prev);\n next.add(match);\n return next;\n });\n });\n }\n\n protected isOpen(title: string): boolean {\n return this.opened().has(title);\n }\n\n /** Stable id for the group body, referenced by the toggle's `aria-controls`. */\n protected groupBodyId(title: string): string {\n return `wr-sidebar-group-${title.replace(/\\s+/g, '-').toLowerCase()}`;\n }\n\n protected toggleGroup(title: string): void {\n this.opened.update(prev => {\n const next = new Set(prev);\n if (next.has(title)) next.delete(title);\n else next.add(title);\n return next;\n });\n }\n\n protected asItem(entry: WrSidebarEntry): WrSidebarItem {\n return entry as WrSidebarItem;\n }\n\n protected asGroup(entry: WrSidebarEntry): WrSidebarGroup {\n return entry as WrSidebarGroup;\n }\n\n private findGroupForUrl(url: string): string | null {\n for (const entry of this.entries()) {\n if (!isGroup(entry)) continue;\n const hit = entry.children.some(child => url.startsWith(`/${child.url.join('/')}`));\n if (hit) return entry.title;\n }\n return null;\n }\n}\n","<nav class=\"wr-sidebar__inner\">\n @for (entry of entries(); track entry.title) {\n @if (!isGroup(entry)) {\n <a\n class=\"wr-sidebar__entry\"\n routerLinkActive=\"wr-sidebar__entry--active\"\n [routerLink]=\"asItem(entry).url\"\n [class.wr-sidebar__entry--disabled]=\"asItem(entry).disabled\"\n >\n @if (asItem(entry).icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__title\">{{ entry.title }}</span>\n @if (asItem(entry).badge) {\n <small class=\"wr-sidebar__badge\">{{ asItem(entry).badge }}</small>\n }\n </a>\n } @else {\n <section class=\"wr-sidebar__group\" [class.wr-sidebar__group--collapsed]=\"!isOpen(entry.title)\">\n <button\n type=\"button\"\n class=\"wr-sidebar__group-toggle\"\n [attr.aria-expanded]=\"isOpen(entry.title)\"\n [attr.aria-controls]=\"groupBodyId(entry.title)\"\n (click)=\"toggleGroup(entry.title)\"\n >\n @if (asGroup(entry).icon || defaultGroupIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__title\">{{ entry.title }}</span>\n <!-- Inline chrome chevron — not user-customizable. -->\n <svg\n class=\"wr-icon__svg wr-sidebar__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n <div\n class=\"wr-sidebar__group-wrap\"\n [attr.id]=\"groupBodyId(entry.title)\"\n [attr.inert]=\"!isOpen(entry.title) ? '' : null\"\n >\n <div class=\"wr-sidebar__group-body\">\n <ul class=\"wr-sidebar__list\">\n @for (child of asGroup(entry).children; track child.title) {\n <li>\n @if (child.disabled || !child.url.length) {\n <span class=\"wr-sidebar__item wr-sidebar__item--disabled\">\n @if (child.icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__item-title\">{{ child.title }}</span>\n @if (child.badge) {\n <small class=\"wr-sidebar__badge\">{{ child.badge }}</small>\n }\n </span>\n } @else {\n <a class=\"wr-sidebar__item\" routerLinkActive=\"wr-sidebar__item--active\" [routerLink]=\"child.url\">\n @if (child.icon || defaultItemIcon(); as name) {\n <wr-icon class=\"wr-sidebar__icon\" [name]=\"name\" />\n }\n <span class=\"wr-sidebar__item-title\">{{ child.title }}</span>\n @if (child.badge) {\n <small class=\"wr-sidebar__badge\">{{ child.badge }}</small>\n }\n </a>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n </section>\n }\n }\n</nav>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}