@malva-ui/core 0.1.12 → 0.1.14

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 (1619) hide show
  1. package/AGENTS.md +4 -1
  2. package/LICENSE +21 -0
  3. package/README.md +69 -3
  4. package/docs/ai/avatar.md +2 -0
  5. package/docs/ai/breadcrumb.md +67 -7
  6. package/docs/ai/button.md +74 -19
  7. package/docs/ai/card.md +8 -6
  8. package/docs/ai/chat.md +59 -45
  9. package/docs/ai/checkbox.md +12 -0
  10. package/docs/ai/combobox.md +18 -2
  11. package/docs/ai/copy-to-clipboard.md +1 -1
  12. package/docs/ai/core.md +15 -0
  13. package/docs/ai/data-table.md +89 -54
  14. package/docs/ai/dialog.md +76 -67
  15. package/docs/ai/drawer.md +15 -12
  16. package/docs/ai/dropdown.md +24 -19
  17. package/docs/ai/empty-state.md +3 -3
  18. package/docs/ai/filter.md +24 -5
  19. package/docs/ai/form-utils.md +160 -5
  20. package/docs/ai/icon-toggle.md +160 -0
  21. package/docs/ai/input.md +30 -0
  22. package/docs/ai/layout.md +23 -0
  23. package/docs/ai/list.md +10 -6
  24. package/docs/ai/menu.md +75 -1
  25. package/docs/ai/page.md +220 -60
  26. package/docs/ai/radio.md +9 -0
  27. package/docs/ai/scrollbar.md +30 -8
  28. package/docs/ai/segmented.md +35 -35
  29. package/docs/ai/select.md +30 -5
  30. package/docs/ai/sidebar.md +45 -27
  31. package/docs/ai/switch.md +114 -19
  32. package/docs/ai/table.md +69 -0
  33. package/docs/ai/tabs.md +2 -1
  34. package/docs/ai/tile.md +311 -85
  35. package/docs/ai/timeline.md +63 -39
  36. package/docs/ai/tokenizer.md +21 -5
  37. package/docs/ai/tooltip.md +5 -5
  38. package/docs/ai/view-variant.md +75 -0
  39. package/fesm2022/malva-ui-core-accordion.mjs +167 -0
  40. package/fesm2022/malva-ui-core-accordion.mjs.map +1 -0
  41. package/fesm2022/malva-ui-core-action-bar.mjs +111 -0
  42. package/fesm2022/malva-ui-core-action-bar.mjs.map +1 -0
  43. package/fesm2022/malva-ui-core-alert.mjs +173 -0
  44. package/fesm2022/malva-ui-core-alert.mjs.map +1 -0
  45. package/fesm2022/malva-ui-core-autocomplete.mjs +775 -0
  46. package/fesm2022/malva-ui-core-autocomplete.mjs.map +1 -0
  47. package/fesm2022/malva-ui-core-avatar-group.mjs +224 -0
  48. package/fesm2022/malva-ui-core-avatar-group.mjs.map +1 -0
  49. package/fesm2022/malva-ui-core-avatar.mjs +247 -0
  50. package/fesm2022/malva-ui-core-avatar.mjs.map +1 -0
  51. package/fesm2022/malva-ui-core-badge.mjs +122 -0
  52. package/fesm2022/malva-ui-core-badge.mjs.map +1 -0
  53. package/fesm2022/malva-ui-core-bottom-nav.mjs +161 -0
  54. package/fesm2022/malva-ui-core-bottom-nav.mjs.map +1 -0
  55. package/fesm2022/malva-ui-core-breadcrumb.mjs +494 -0
  56. package/fesm2022/malva-ui-core-breadcrumb.mjs.map +1 -0
  57. package/fesm2022/malva-ui-core-button.mjs +406 -0
  58. package/fesm2022/malva-ui-core-button.mjs.map +1 -0
  59. package/fesm2022/malva-ui-core-calendar.mjs +938 -0
  60. package/fesm2022/malva-ui-core-calendar.mjs.map +1 -0
  61. package/fesm2022/malva-ui-core-card.mjs +164 -0
  62. package/fesm2022/malva-ui-core-card.mjs.map +1 -0
  63. package/fesm2022/malva-ui-core-chat.mjs +825 -0
  64. package/fesm2022/malva-ui-core-chat.mjs.map +1 -0
  65. package/fesm2022/malva-ui-core-checkbox.mjs +272 -0
  66. package/fesm2022/malva-ui-core-checkbox.mjs.map +1 -0
  67. package/fesm2022/malva-ui-core-chip.mjs +176 -0
  68. package/fesm2022/malva-ui-core-chip.mjs.map +1 -0
  69. package/fesm2022/malva-ui-core-color-picker.mjs +1204 -0
  70. package/fesm2022/malva-ui-core-color-picker.mjs.map +1 -0
  71. package/fesm2022/malva-ui-core-combobox.mjs +945 -0
  72. package/fesm2022/malva-ui-core-combobox.mjs.map +1 -0
  73. package/fesm2022/malva-ui-core-copy-to-clipboard.mjs +255 -0
  74. package/fesm2022/malva-ui-core-copy-to-clipboard.mjs.map +1 -0
  75. package/fesm2022/malva-ui-core-data-table.mjs +2696 -0
  76. package/fesm2022/malva-ui-core-data-table.mjs.map +1 -0
  77. package/fesm2022/malva-ui-core-date-range-picker.mjs +276 -0
  78. package/fesm2022/malva-ui-core-date-range-picker.mjs.map +1 -0
  79. package/fesm2022/malva-ui-core-day-picker.mjs +131 -0
  80. package/fesm2022/malva-ui-core-day-picker.mjs.map +1 -0
  81. package/fesm2022/malva-ui-core-dialog-routable-dialog-CvjXMtlD.mjs +94 -0
  82. package/fesm2022/malva-ui-core-dialog-routable-dialog-CvjXMtlD.mjs.map +1 -0
  83. package/fesm2022/malva-ui-core-dialog.mjs +1223 -0
  84. package/fesm2022/malva-ui-core-dialog.mjs.map +1 -0
  85. package/fesm2022/malva-ui-core-divider.mjs +80 -0
  86. package/fesm2022/malva-ui-core-divider.mjs.map +1 -0
  87. package/fesm2022/malva-ui-core-drawer-routable-drawer-qUk6Etnx.mjs +94 -0
  88. package/fesm2022/malva-ui-core-drawer-routable-drawer-qUk6Etnx.mjs.map +1 -0
  89. package/fesm2022/malva-ui-core-drawer.mjs +814 -0
  90. package/fesm2022/malva-ui-core-drawer.mjs.map +1 -0
  91. package/fesm2022/malva-ui-core-dropdown.mjs +994 -0
  92. package/fesm2022/malva-ui-core-dropdown.mjs.map +1 -0
  93. package/fesm2022/malva-ui-core-empty-state.mjs +50 -0
  94. package/fesm2022/malva-ui-core-empty-state.mjs.map +1 -0
  95. package/fesm2022/malva-ui-core-expand.mjs +130 -0
  96. package/fesm2022/malva-ui-core-expand.mjs.map +1 -0
  97. package/fesm2022/malva-ui-core-file-upload.mjs +451 -0
  98. package/fesm2022/malva-ui-core-file-upload.mjs.map +1 -0
  99. package/fesm2022/malva-ui-core-filter.mjs +1627 -0
  100. package/fesm2022/malva-ui-core-filter.mjs.map +1 -0
  101. package/fesm2022/malva-ui-core-form-utils-testing.mjs +39 -0
  102. package/fesm2022/malva-ui-core-form-utils-testing.mjs.map +1 -0
  103. package/fesm2022/malva-ui-core-form-utils.mjs +977 -0
  104. package/fesm2022/malva-ui-core-form-utils.mjs.map +1 -0
  105. package/fesm2022/malva-ui-core-form.mjs +283 -0
  106. package/fesm2022/malva-ui-core-form.mjs.map +1 -0
  107. package/fesm2022/malva-ui-core-icon-toggle.mjs +120 -0
  108. package/fesm2022/malva-ui-core-icon-toggle.mjs.map +1 -0
  109. package/fesm2022/malva-ui-core-input.mjs +375 -0
  110. package/fesm2022/malva-ui-core-input.mjs.map +1 -0
  111. package/fesm2022/malva-ui-core-kbd.mjs +131 -0
  112. package/fesm2022/malva-ui-core-kbd.mjs.map +1 -0
  113. package/fesm2022/malva-ui-core-layout.mjs +212 -0
  114. package/fesm2022/malva-ui-core-layout.mjs.map +1 -0
  115. package/fesm2022/malva-ui-core-link.mjs +89 -0
  116. package/fesm2022/malva-ui-core-link.mjs.map +1 -0
  117. package/fesm2022/malva-ui-core-list.mjs +413 -0
  118. package/fesm2022/malva-ui-core-list.mjs.map +1 -0
  119. package/fesm2022/malva-ui-core-loader.mjs +141 -0
  120. package/fesm2022/malva-ui-core-loader.mjs.map +1 -0
  121. package/fesm2022/malva-ui-core-menu.mjs +2540 -0
  122. package/fesm2022/malva-ui-core-menu.mjs.map +1 -0
  123. package/fesm2022/malva-ui-core-notification.mjs +201 -0
  124. package/fesm2022/malva-ui-core-notification.mjs.map +1 -0
  125. package/fesm2022/malva-ui-core-number-input.mjs +404 -0
  126. package/fesm2022/malva-ui-core-number-input.mjs.map +1 -0
  127. package/fesm2022/malva-ui-core-page.mjs +1898 -0
  128. package/fesm2022/malva-ui-core-page.mjs.map +1 -0
  129. package/fesm2022/malva-ui-core-pagination.mjs +458 -0
  130. package/fesm2022/malva-ui-core-pagination.mjs.map +1 -0
  131. package/fesm2022/malva-ui-core-pin-input.mjs +405 -0
  132. package/fesm2022/malva-ui-core-pin-input.mjs.map +1 -0
  133. package/fesm2022/malva-ui-core-popup.mjs +1488 -0
  134. package/fesm2022/malva-ui-core-popup.mjs.map +1 -0
  135. package/fesm2022/malva-ui-core-progress.mjs +109 -0
  136. package/fesm2022/malva-ui-core-progress.mjs.map +1 -0
  137. package/fesm2022/malva-ui-core-radio.mjs +317 -0
  138. package/fesm2022/malva-ui-core-radio.mjs.map +1 -0
  139. package/fesm2022/malva-ui-core-rating.mjs +236 -0
  140. package/fesm2022/malva-ui-core-rating.mjs.map +1 -0
  141. package/fesm2022/malva-ui-core-scrollbar.mjs +430 -0
  142. package/fesm2022/malva-ui-core-scrollbar.mjs.map +1 -0
  143. package/fesm2022/malva-ui-core-search-field.mjs +578 -0
  144. package/fesm2022/malva-ui-core-search-field.mjs.map +1 -0
  145. package/fesm2022/malva-ui-core-segmented.mjs +458 -0
  146. package/fesm2022/malva-ui-core-segmented.mjs.map +1 -0
  147. package/fesm2022/malva-ui-core-select.mjs +855 -0
  148. package/fesm2022/malva-ui-core-select.mjs.map +1 -0
  149. package/fesm2022/malva-ui-core-sidebar.mjs +1504 -0
  150. package/fesm2022/malva-ui-core-sidebar.mjs.map +1 -0
  151. package/fesm2022/malva-ui-core-skeleton.mjs +85 -0
  152. package/fesm2022/malva-ui-core-skeleton.mjs.map +1 -0
  153. package/fesm2022/malva-ui-core-slider.mjs +514 -0
  154. package/fesm2022/malva-ui-core-slider.mjs.map +1 -0
  155. package/fesm2022/malva-ui-core-split-pane.mjs +359 -0
  156. package/fesm2022/malva-ui-core-split-pane.mjs.map +1 -0
  157. package/fesm2022/malva-ui-core-status-indicator.mjs +78 -0
  158. package/fesm2022/malva-ui-core-status-indicator.mjs.map +1 -0
  159. package/fesm2022/malva-ui-core-stepper.mjs +332 -0
  160. package/fesm2022/malva-ui-core-stepper.mjs.map +1 -0
  161. package/fesm2022/malva-ui-core-switch.mjs +272 -0
  162. package/fesm2022/malva-ui-core-switch.mjs.map +1 -0
  163. package/fesm2022/malva-ui-core-table.mjs +79 -0
  164. package/fesm2022/malva-ui-core-table.mjs.map +1 -0
  165. package/fesm2022/malva-ui-core-tabs.mjs +794 -0
  166. package/fesm2022/malva-ui-core-tabs.mjs.map +1 -0
  167. package/fesm2022/malva-ui-core-textarea.mjs +201 -0
  168. package/fesm2022/malva-ui-core-textarea.mjs.map +1 -0
  169. package/fesm2022/malva-ui-core-tile.mjs +1404 -0
  170. package/fesm2022/malva-ui-core-tile.mjs.map +1 -0
  171. package/fesm2022/malva-ui-core-time-picker.mjs +533 -0
  172. package/fesm2022/malva-ui-core-time-picker.mjs.map +1 -0
  173. package/fesm2022/malva-ui-core-timeline.mjs +216 -0
  174. package/fesm2022/malva-ui-core-timeline.mjs.map +1 -0
  175. package/fesm2022/malva-ui-core-title.mjs +178 -0
  176. package/fesm2022/malva-ui-core-title.mjs.map +1 -0
  177. package/fesm2022/malva-ui-core-toast.mjs +749 -0
  178. package/fesm2022/malva-ui-core-toast.mjs.map +1 -0
  179. package/fesm2022/malva-ui-core-tokenizer.mjs +502 -0
  180. package/fesm2022/malva-ui-core-tokenizer.mjs.map +1 -0
  181. package/fesm2022/malva-ui-core-toolbar.mjs +141 -0
  182. package/fesm2022/malva-ui-core-toolbar.mjs.map +1 -0
  183. package/fesm2022/malva-ui-core-tooltip.mjs +432 -0
  184. package/fesm2022/malva-ui-core-tooltip.mjs.map +1 -0
  185. package/fesm2022/malva-ui-core-tree.mjs +505 -0
  186. package/fesm2022/malva-ui-core-tree.mjs.map +1 -0
  187. package/fesm2022/malva-ui-core-view-variant.mjs +292 -0
  188. package/fesm2022/malva-ui-core-view-variant.mjs.map +1 -0
  189. package/fesm2022/malva-ui-core.mjs +77 -0
  190. package/fesm2022/malva-ui-core.mjs.map +1 -0
  191. package/package.json +195 -156
  192. package/styles/malva-ui.css +253 -220
  193. package/styles/tokens.md +174 -173
  194. package/table/README.md +46 -0
  195. package/types/malva-ui-core-accordion.d.ts +121 -0
  196. package/types/malva-ui-core-action-bar.d.ts +82 -0
  197. package/types/malva-ui-core-alert.d.ts +131 -0
  198. package/types/malva-ui-core-autocomplete.d.ts +301 -0
  199. package/types/malva-ui-core-avatar-group.d.ts +119 -0
  200. package/types/malva-ui-core-avatar.d.ts +156 -0
  201. package/types/malva-ui-core-badge.d.ts +97 -0
  202. package/types/malva-ui-core-bottom-nav.d.ts +104 -0
  203. package/types/malva-ui-core-breadcrumb.d.ts +308 -0
  204. package/types/malva-ui-core-button.d.ts +194 -0
  205. package/types/malva-ui-core-calendar.d.ts +339 -0
  206. package/types/malva-ui-core-card.d.ts +88 -0
  207. package/types/malva-ui-core-chat.d.ts +375 -0
  208. package/types/malva-ui-core-checkbox.d.ts +158 -0
  209. package/types/malva-ui-core-chip.d.ts +128 -0
  210. package/types/malva-ui-core-color-picker.d.ts +442 -0
  211. package/types/malva-ui-core-combobox.d.ts +419 -0
  212. package/types/malva-ui-core-copy-to-clipboard.d.ts +148 -0
  213. package/types/malva-ui-core-data-table.d.ts +1074 -0
  214. package/types/malva-ui-core-date-range-picker.d.ts +149 -0
  215. package/types/malva-ui-core-day-picker.d.ts +55 -0
  216. package/types/malva-ui-core-dialog.d.ts +597 -0
  217. package/types/malva-ui-core-divider.d.ts +68 -0
  218. package/types/malva-ui-core-drawer.d.ts +333 -0
  219. package/types/malva-ui-core-dropdown.d.ts +592 -0
  220. package/types/malva-ui-core-empty-state.d.ts +37 -0
  221. package/types/malva-ui-core-expand.d.ts +102 -0
  222. package/types/malva-ui-core-file-upload.d.ts +267 -0
  223. package/types/malva-ui-core-filter.d.ts +552 -0
  224. package/types/malva-ui-core-form-utils-testing.d.ts +50 -0
  225. package/types/malva-ui-core-form-utils.d.ts +579 -0
  226. package/types/malva-ui-core-form.d.ts +176 -0
  227. package/types/malva-ui-core-icon-toggle.d.ts +80 -0
  228. package/types/malva-ui-core-input.d.ts +262 -0
  229. package/types/malva-ui-core-kbd.d.ts +56 -0
  230. package/types/malva-ui-core-layout.d.ts +70 -0
  231. package/types/malva-ui-core-link.d.ts +28 -0
  232. package/types/malva-ui-core-list.d.ts +252 -0
  233. package/types/malva-ui-core-loader.d.ts +89 -0
  234. package/types/malva-ui-core-menu.d.ts +954 -0
  235. package/types/malva-ui-core-notification.d.ts +122 -0
  236. package/types/malva-ui-core-number-input.d.ts +167 -0
  237. package/types/malva-ui-core-page.d.ts +799 -0
  238. package/types/malva-ui-core-pagination.d.ts +261 -0
  239. package/types/malva-ui-core-pin-input.d.ts +203 -0
  240. package/types/malva-ui-core-popup.d.ts +834 -0
  241. package/types/malva-ui-core-progress.d.ts +73 -0
  242. package/types/malva-ui-core-radio.d.ts +130 -0
  243. package/types/malva-ui-core-rating.d.ts +115 -0
  244. package/types/malva-ui-core-scrollbar.d.ts +203 -0
  245. package/types/malva-ui-core-search-field.d.ts +408 -0
  246. package/types/malva-ui-core-segmented.d.ts +206 -0
  247. package/types/malva-ui-core-select.d.ts +456 -0
  248. package/types/malva-ui-core-sidebar.d.ts +698 -0
  249. package/types/malva-ui-core-skeleton.d.ts +64 -0
  250. package/types/malva-ui-core-slider.d.ts +219 -0
  251. package/types/malva-ui-core-split-pane.d.ts +149 -0
  252. package/types/malva-ui-core-status-indicator.d.ts +65 -0
  253. package/types/malva-ui-core-stepper.d.ts +168 -0
  254. package/types/malva-ui-core-switch.d.ts +146 -0
  255. package/types/malva-ui-core-table.d.ts +37 -0
  256. package/types/malva-ui-core-tabs.d.ts +339 -0
  257. package/types/malva-ui-core-textarea.d.ts +79 -0
  258. package/types/malva-ui-core-tile.d.ts +373 -0
  259. package/types/malva-ui-core-time-picker.d.ts +141 -0
  260. package/types/malva-ui-core-timeline.d.ts +188 -0
  261. package/types/malva-ui-core-title.d.ts +66 -0
  262. package/types/malva-ui-core-toast.d.ts +432 -0
  263. package/types/malva-ui-core-tokenizer.d.ts +217 -0
  264. package/types/malva-ui-core-toolbar.d.ts +91 -0
  265. package/types/malva-ui-core-tooltip.d.ts +200 -0
  266. package/types/malva-ui-core-tree.d.ts +289 -0
  267. package/types/malva-ui-core-view-variant.d.ts +207 -0
  268. package/types/malva-ui-core.d.ts +72 -0
  269. package/view-variant/README.md +3 -0
  270. package/accordion/index.d.ts +0 -3
  271. package/accordion/lib/accordion/accordion.d.ts +0 -47
  272. package/accordion/lib/accordion-item/accordion-header.d.ts +0 -22
  273. package/accordion/lib/accordion-item/accordion-item.d.ts +0 -49
  274. package/accordion/malva-ui-core-accordion.d.ts +0 -5
  275. package/action-bar/index.d.ts +0 -4
  276. package/action-bar/lib/action-bar/action-bar.d.ts +0 -59
  277. package/action-bar/lib/action-bar/components/action-bar-actions.d.ts +0 -9
  278. package/action-bar/lib/action-bar/components/action-bar-logo.d.ts +0 -5
  279. package/action-bar/lib/action-bar/components/action-bar-spacer.d.ts +0 -5
  280. package/action-bar/malva-ui-core-action-bar.d.ts +0 -5
  281. package/alert/index.d.ts +0 -2
  282. package/alert/lib/alert/alert.d.ts +0 -84
  283. package/alert/lib/alert/alert.directives.d.ts +0 -44
  284. package/alert/malva-ui-core-alert.d.ts +0 -5
  285. package/autocomplete/index.d.ts +0 -1
  286. package/autocomplete/lib/autocomplete/autocomplete.d.ts +0 -296
  287. package/autocomplete/malva-ui-core-autocomplete.d.ts +0 -5
  288. package/avatar/index.d.ts +0 -2
  289. package/avatar/lib/avatar/avatar.d.ts +0 -125
  290. package/avatar/lib/color-from-text.pipe.d.ts +0 -21
  291. package/avatar/malva-ui-core-avatar.d.ts +0 -5
  292. package/avatar-group/index.d.ts +0 -1
  293. package/avatar-group/lib/avatar-group/avatar-group.d.ts +0 -115
  294. package/avatar-group/malva-ui-core-avatar-group.d.ts +0 -5
  295. package/badge/index.d.ts +0 -2
  296. package/badge/lib/badge/badge.d.ts +0 -59
  297. package/badge/lib/badge-icon.d.ts +0 -35
  298. package/badge/malva-ui-core-badge.d.ts +0 -5
  299. package/bottom-nav/index.d.ts +0 -1
  300. package/bottom-nav/lib/bottom-nav/bottom-nav.d.ts +0 -99
  301. package/bottom-nav/malva-ui-core-bottom-nav.d.ts +0 -5
  302. package/breadcrumb/index.d.ts +0 -5
  303. package/breadcrumb/lib/breadcrumb/breadcrumb-item-host.d.ts +0 -32
  304. package/breadcrumb/lib/breadcrumb/breadcrumb-item.d.ts +0 -41
  305. package/breadcrumb/lib/breadcrumb/breadcrumb-separator.d.ts +0 -31
  306. package/breadcrumb/lib/breadcrumb/breadcrumb.d.ts +0 -151
  307. package/breadcrumb/lib/breadcrumb/breadcrumb.types.d.ts +0 -26
  308. package/breadcrumb/malva-ui-core-breadcrumb.d.ts +0 -5
  309. package/button/index.d.ts +0 -7
  310. package/button/lib/button/button.d.ts +0 -61
  311. package/button/lib/button-close/button-close.d.ts +0 -24
  312. package/button/lib/button-group/button-group.d.ts +0 -21
  313. package/button/lib/button-split/button-split.d.ts +0 -21
  314. package/button/lib/button-toggle/button-toggle.d.ts +0 -33
  315. package/button/lib/button-variant.token.d.ts +0 -13
  316. package/button/lib/button.directives.d.ts +0 -14
  317. package/button/lib/button.types.d.ts +0 -8
  318. package/button/malva-ui-core-button.d.ts +0 -5
  319. package/calendar/index.d.ts +0 -3
  320. package/calendar/lib/calendar/calendar.d.ts +0 -182
  321. package/calendar/lib/date-provider/date-adapter.d.ts +0 -92
  322. package/calendar/lib/date-provider/native-date-adapter.d.ts +0 -60
  323. package/calendar/malva-ui-core-calendar.d.ts +0 -5
  324. package/card/index.d.ts +0 -5
  325. package/card/lib/card/card.d.ts +0 -43
  326. package/card/lib/card-actions-def.d.ts +0 -10
  327. package/card/lib/card-footer-def.d.ts +0 -13
  328. package/card/lib/card-header-def.d.ts +0 -10
  329. package/card/lib/card-subheader-def.d.ts +0 -16
  330. package/card/malva-ui-core-card.d.ts +0 -5
  331. package/chat/index.d.ts +0 -9
  332. package/chat/lib/chat/chat.d.ts +0 -133
  333. package/chat/lib/chat-audio/chat-audio.d.ts +0 -51
  334. package/chat/lib/chat-audio/chat-audio.service.d.ts +0 -21
  335. package/chat/lib/chat-date/chat-date.d.ts +0 -16
  336. package/chat/lib/chat-format.d.ts +0 -5
  337. package/chat/lib/chat-media-grid/chat-media-grid.d.ts +0 -32
  338. package/chat/lib/chat-message/chat-message.d.ts +0 -45
  339. package/chat/lib/chat-render-list.d.ts +0 -16
  340. package/chat/lib/chat-tokens.d.ts +0 -25
  341. package/chat/lib/chat-typing/chat-typing.d.ts +0 -16
  342. package/chat/lib/chat.types.d.ts +0 -80
  343. package/chat/lib/defs/chat-author-def.d.ts +0 -30
  344. package/chat/lib/defs/chat-date-def.d.ts +0 -22
  345. package/chat/lib/defs/chat-message-def.d.ts +0 -23
  346. package/chat/malva-ui-core-chat.d.ts +0 -5
  347. package/checkbox/index.d.ts +0 -3
  348. package/checkbox/lib/checkbox/checkbox.d.ts +0 -129
  349. package/checkbox/lib/checkbox-group/checkbox-group.d.ts +0 -24
  350. package/checkbox/lib/checkbox-group-token.d.ts +0 -6
  351. package/checkbox/malva-ui-core-checkbox.d.ts +0 -5
  352. package/chip/index.d.ts +0 -2
  353. package/chip/lib/chip/chip.d.ts +0 -107
  354. package/chip/lib/chip/chip.directives.d.ts +0 -18
  355. package/chip/malva-ui-core-chip.d.ts +0 -5
  356. package/color-picker/index.d.ts +0 -3
  357. package/color-picker/lib/color-picker/color-picker.d.ts +0 -188
  358. package/color-picker/lib/color-picker-popup/color-picker-popup.d.ts +0 -151
  359. package/color-picker/lib/color-utils/color-utils.d.ts +0 -102
  360. package/color-picker/malva-ui-core-color-picker.d.ts +0 -5
  361. package/combobox/index.d.ts +0 -2
  362. package/combobox/lib/combobox/combobox.d.ts +0 -400
  363. package/combobox/lib/combobox-template.directives.d.ts +0 -10
  364. package/combobox/malva-ui-core-combobox.d.ts +0 -5
  365. package/copy-to-clipboard/index.d.ts +0 -1
  366. package/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.d.ts +0 -130
  367. package/copy-to-clipboard/malva-ui-core-copy-to-clipboard.d.ts +0 -5
  368. package/data-table/index.d.ts +0 -8
  369. package/data-table/lib/data-source.d.ts +0 -5
  370. package/data-table/lib/data-table/data-table-layout.d.ts +0 -31
  371. package/data-table/lib/data-table/data-table.d.ts +0 -699
  372. package/data-table/lib/data-table/services/data-table-column-visibility.service.d.ts +0 -19
  373. package/data-table/lib/data-table/services/data-table-editing.service.d.ts +0 -37
  374. package/data-table/lib/data-table/services/data-table-pinning.service.d.ts +0 -37
  375. package/data-table/lib/data-table-cell.d.ts +0 -44
  376. package/data-table/lib/data-table-edit-cell.d.ts +0 -44
  377. package/data-table/lib/data-table-error.d.ts +0 -37
  378. package/data-table/lib/data-table-footer.d.ts +0 -26
  379. package/data-table/lib/data-table-no-data.d.ts +0 -19
  380. package/data-table/lib/filter-dropdown/filter-dropdown.d.ts +0 -54
  381. package/data-table/lib/types.d.ts +0 -134
  382. package/data-table/malva-ui-core-data-table.d.ts +0 -5
  383. package/date-range-picker/index.d.ts +0 -1
  384. package/date-range-picker/lib/date-range-picker/date-range-picker.d.ts +0 -145
  385. package/date-range-picker/malva-ui-core-date-range-picker.d.ts +0 -5
  386. package/day-picker/index.d.ts +0 -1
  387. package/day-picker/lib/day-picker/day-picker.d.ts +0 -51
  388. package/day-picker/malva-ui-core-day-picker.d.ts +0 -5
  389. package/dialog/index.d.ts +0 -11
  390. package/dialog/lib/confirm-dialog-options.d.ts +0 -41
  391. package/dialog/lib/confirm-dialog.d.ts +0 -52
  392. package/dialog/lib/dialog/dialog.d.ts +0 -22
  393. package/dialog/lib/dialog-body.d.ts +0 -9
  394. package/dialog/lib/dialog-close.d.ts +0 -27
  395. package/dialog/lib/dialog-config.d.ts +0 -112
  396. package/dialog/lib/dialog-container.d.ts +0 -40
  397. package/dialog/lib/dialog-footer.d.ts +0 -13
  398. package/dialog/lib/dialog-header.d.ts +0 -74
  399. package/dialog/lib/dialog-ref.d.ts +0 -95
  400. package/dialog/lib/dialog-template.d.ts +0 -65
  401. package/dialog/lib/dialog-text-content.d.ts +0 -24
  402. package/dialog/lib/dialog.service.d.ts +0 -63
  403. package/dialog/lib/generate-routable-dialog-route.d.ts +0 -49
  404. package/dialog/lib/inject-dialog-ref.d.ts +0 -8
  405. package/dialog/lib/routable-dialog.d.ts +0 -30
  406. package/dialog/malva-ui-core-dialog.d.ts +0 -5
  407. package/divider/index.d.ts +0 -1
  408. package/divider/lib/divider/divider.d.ts +0 -64
  409. package/divider/malva-ui-core-divider.d.ts +0 -5
  410. package/drawer/index.d.ts +0 -11
  411. package/drawer/lib/drawer/drawer.d.ts +0 -106
  412. package/drawer/lib/drawer-body.d.ts +0 -8
  413. package/drawer/lib/drawer-content.d.ts +0 -6
  414. package/drawer/lib/drawer-footer.d.ts +0 -5
  415. package/drawer/lib/drawer-header.d.ts +0 -5
  416. package/drawer/lib/drawer-ref.d.ts +0 -29
  417. package/drawer/lib/drawer-resize.d.ts +0 -65
  418. package/drawer/lib/drawer-section/drawer-section.d.ts +0 -15
  419. package/drawer/lib/drawer-sections/drawer-sections.d.ts +0 -22
  420. package/drawer/lib/drawer-sections.service.d.ts +0 -42
  421. package/drawer/lib/drawer.service.d.ts +0 -66
  422. package/drawer/lib/generate-routable-drawer-route.d.ts +0 -42
  423. package/drawer/lib/routable-drawer.d.ts +0 -30
  424. package/drawer/malva-ui-core-drawer.d.ts +0 -5
  425. package/dropdown/index.d.ts +0 -9
  426. package/dropdown/lib/active-descendant.d.ts +0 -64
  427. package/dropdown/lib/dropdown-panel/dropdown-panel.d.ts +0 -178
  428. package/dropdown/lib/highlight-match.pipe.d.ts +0 -27
  429. package/dropdown/lib/option-matcher.d.ts +0 -87
  430. package/dropdown/lib/options-adapter.d.ts +0 -142
  431. package/dropdown/lib/options-result.d.ts +0 -6
  432. package/dropdown/lib/reconciliation.d.ts +0 -19
  433. package/dropdown/lib/select-data-source.d.ts +0 -18
  434. package/dropdown/lib/select-option.d.ts +0 -37
  435. package/dropdown/malva-ui-core-dropdown.d.ts +0 -5
  436. package/empty-state/index.d.ts +0 -1
  437. package/empty-state/lib/empty-state/empty-state.d.ts +0 -34
  438. package/empty-state/malva-ui-core-empty-state.d.ts +0 -5
  439. package/esm2022/accordion/index.js +0 -4
  440. package/esm2022/accordion/index.js.map +0 -1
  441. package/esm2022/accordion/lib/accordion/accordion.js +0 -65
  442. package/esm2022/accordion/lib/accordion/accordion.js.map +0 -1
  443. package/esm2022/accordion/lib/accordion-item/accordion-header.js +0 -30
  444. package/esm2022/accordion/lib/accordion-item/accordion-header.js.map +0 -1
  445. package/esm2022/accordion/lib/accordion-item/accordion-item.js +0 -70
  446. package/esm2022/accordion/lib/accordion-item/accordion-item.js.map +0 -1
  447. package/esm2022/accordion/malva-ui-core-accordion.js +0 -5
  448. package/esm2022/accordion/malva-ui-core-accordion.js.map +0 -1
  449. package/esm2022/action-bar/index.js +0 -5
  450. package/esm2022/action-bar/index.js.map +0 -1
  451. package/esm2022/action-bar/lib/action-bar/action-bar.js +0 -64
  452. package/esm2022/action-bar/lib/action-bar/action-bar.js.map +0 -1
  453. package/esm2022/action-bar/lib/action-bar/components/action-bar-actions.js +0 -20
  454. package/esm2022/action-bar/lib/action-bar/components/action-bar-actions.js.map +0 -1
  455. package/esm2022/action-bar/lib/action-bar/components/action-bar-logo.js +0 -13
  456. package/esm2022/action-bar/lib/action-bar/components/action-bar-logo.js.map +0 -1
  457. package/esm2022/action-bar/lib/action-bar/components/action-bar-spacer.js +0 -13
  458. package/esm2022/action-bar/lib/action-bar/components/action-bar-spacer.js.map +0 -1
  459. package/esm2022/action-bar/malva-ui-core-action-bar.js +0 -5
  460. package/esm2022/action-bar/malva-ui-core-action-bar.js.map +0 -1
  461. package/esm2022/alert/index.js +0 -3
  462. package/esm2022/alert/index.js.map +0 -1
  463. package/esm2022/alert/lib/alert/alert.directives.js +0 -53
  464. package/esm2022/alert/lib/alert/alert.directives.js.map +0 -1
  465. package/esm2022/alert/lib/alert/alert.js +0 -118
  466. package/esm2022/alert/lib/alert/alert.js.map +0 -1
  467. package/esm2022/alert/malva-ui-core-alert.js +0 -5
  468. package/esm2022/alert/malva-ui-core-alert.js.map +0 -1
  469. package/esm2022/autocomplete/index.js +0 -2
  470. package/esm2022/autocomplete/index.js.map +0 -1
  471. package/esm2022/autocomplete/lib/autocomplete/autocomplete.js +0 -765
  472. package/esm2022/autocomplete/lib/autocomplete/autocomplete.js.map +0 -1
  473. package/esm2022/autocomplete/malva-ui-core-autocomplete.js +0 -5
  474. package/esm2022/autocomplete/malva-ui-core-autocomplete.js.map +0 -1
  475. package/esm2022/avatar/index.js +0 -3
  476. package/esm2022/avatar/index.js.map +0 -1
  477. package/esm2022/avatar/lib/avatar/avatar.js +0 -192
  478. package/esm2022/avatar/lib/avatar/avatar.js.map +0 -1
  479. package/esm2022/avatar/lib/color-from-text.pipe.js +0 -39
  480. package/esm2022/avatar/lib/color-from-text.pipe.js.map +0 -1
  481. package/esm2022/avatar/malva-ui-core-avatar.js +0 -5
  482. package/esm2022/avatar/malva-ui-core-avatar.js.map +0 -1
  483. package/esm2022/avatar-group/index.js +0 -2
  484. package/esm2022/avatar-group/index.js.map +0 -1
  485. package/esm2022/avatar-group/lib/avatar-group/avatar-group.js +0 -217
  486. package/esm2022/avatar-group/lib/avatar-group/avatar-group.js.map +0 -1
  487. package/esm2022/avatar-group/malva-ui-core-avatar-group.js +0 -5
  488. package/esm2022/avatar-group/malva-ui-core-avatar-group.js.map +0 -1
  489. package/esm2022/badge/index.js +0 -3
  490. package/esm2022/badge/index.js.map +0 -1
  491. package/esm2022/badge/lib/badge/badge.js +0 -71
  492. package/esm2022/badge/lib/badge/badge.js.map +0 -1
  493. package/esm2022/badge/lib/badge-icon.js +0 -47
  494. package/esm2022/badge/lib/badge-icon.js.map +0 -1
  495. package/esm2022/badge/malva-ui-core-badge.js +0 -5
  496. package/esm2022/badge/malva-ui-core-badge.js.map +0 -1
  497. package/esm2022/bottom-nav/index.js +0 -2
  498. package/esm2022/bottom-nav/index.js.map +0 -1
  499. package/esm2022/bottom-nav/lib/bottom-nav/bottom-nav.js +0 -155
  500. package/esm2022/bottom-nav/lib/bottom-nav/bottom-nav.js.map +0 -1
  501. package/esm2022/bottom-nav/malva-ui-core-bottom-nav.js +0 -5
  502. package/esm2022/bottom-nav/malva-ui-core-bottom-nav.js.map +0 -1
  503. package/esm2022/breadcrumb/index.js +0 -6
  504. package/esm2022/breadcrumb/index.js.map +0 -1
  505. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item-host.js +0 -43
  506. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item-host.js.map +0 -1
  507. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item.js +0 -110
  508. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item.js.map +0 -1
  509. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-separator.js +0 -38
  510. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-separator.js.map +0 -1
  511. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.js +0 -284
  512. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.js.map +0 -1
  513. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.types.js +0 -1
  514. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.types.js.map +0 -1
  515. package/esm2022/breadcrumb/malva-ui-core-breadcrumb.js +0 -5
  516. package/esm2022/breadcrumb/malva-ui-core-breadcrumb.js.map +0 -1
  517. package/esm2022/button/index.js +0 -8
  518. package/esm2022/button/index.js.map +0 -1
  519. package/esm2022/button/lib/button/button.js +0 -137
  520. package/esm2022/button/lib/button/button.js.map +0 -1
  521. package/esm2022/button/lib/button-close/button-close.js +0 -52
  522. package/esm2022/button/lib/button-close/button-close.js.map +0 -1
  523. package/esm2022/button/lib/button-group/button-group.js +0 -44
  524. package/esm2022/button/lib/button-group/button-group.js.map +0 -1
  525. package/esm2022/button/lib/button-split/button-split.js +0 -44
  526. package/esm2022/button/lib/button-split/button-split.js.map +0 -1
  527. package/esm2022/button/lib/button-toggle/button-toggle.js +0 -94
  528. package/esm2022/button/lib/button-toggle/button-toggle.js.map +0 -1
  529. package/esm2022/button/lib/button-variant.token.js +0 -4
  530. package/esm2022/button/lib/button-variant.token.js.map +0 -1
  531. package/esm2022/button/lib/button.directives.js +0 -37
  532. package/esm2022/button/lib/button.directives.js.map +0 -1
  533. package/esm2022/button/lib/button.types.js +0 -1
  534. package/esm2022/button/lib/button.types.js.map +0 -1
  535. package/esm2022/button/malva-ui-core-button.js +0 -5
  536. package/esm2022/button/malva-ui-core-button.js.map +0 -1
  537. package/esm2022/calendar/index.js +0 -4
  538. package/esm2022/calendar/index.js.map +0 -1
  539. package/esm2022/calendar/lib/calendar/calendar.js +0 -672
  540. package/esm2022/calendar/lib/calendar/calendar.js.map +0 -1
  541. package/esm2022/calendar/lib/date-provider/date-adapter.js +0 -111
  542. package/esm2022/calendar/lib/date-provider/date-adapter.js.map +0 -1
  543. package/esm2022/calendar/lib/date-provider/native-date-adapter.js +0 -151
  544. package/esm2022/calendar/lib/date-provider/native-date-adapter.js.map +0 -1
  545. package/esm2022/calendar/malva-ui-core-calendar.js +0 -5
  546. package/esm2022/calendar/malva-ui-core-calendar.js.map +0 -1
  547. package/esm2022/card/index.js +0 -6
  548. package/esm2022/card/index.js.map +0 -1
  549. package/esm2022/card/lib/card/card.js +0 -54
  550. package/esm2022/card/lib/card/card.js.map +0 -1
  551. package/esm2022/card/lib/card-actions-def.js +0 -27
  552. package/esm2022/card/lib/card-actions-def.js.map +0 -1
  553. package/esm2022/card/lib/card-footer-def.js +0 -32
  554. package/esm2022/card/lib/card-footer-def.js.map +0 -1
  555. package/esm2022/card/lib/card-header-def.js +0 -27
  556. package/esm2022/card/lib/card-header-def.js.map +0 -1
  557. package/esm2022/card/lib/card-subheader-def.js +0 -33
  558. package/esm2022/card/lib/card-subheader-def.js.map +0 -1
  559. package/esm2022/card/malva-ui-core-card.js +0 -5
  560. package/esm2022/card/malva-ui-core-card.js.map +0 -1
  561. package/esm2022/chat/index.js +0 -10
  562. package/esm2022/chat/index.js.map +0 -1
  563. package/esm2022/chat/lib/chat/chat.js +0 -326
  564. package/esm2022/chat/lib/chat/chat.js.map +0 -1
  565. package/esm2022/chat/lib/chat-audio/chat-audio.js +0 -110
  566. package/esm2022/chat/lib/chat-audio/chat-audio.js.map +0 -1
  567. package/esm2022/chat/lib/chat-audio/chat-audio.service.js +0 -28
  568. package/esm2022/chat/lib/chat-audio/chat-audio.service.js.map +0 -1
  569. package/esm2022/chat/lib/chat-date/chat-date.js +0 -46
  570. package/esm2022/chat/lib/chat-date/chat-date.js.map +0 -1
  571. package/esm2022/chat/lib/chat-format.js +0 -11
  572. package/esm2022/chat/lib/chat-format.js.map +0 -1
  573. package/esm2022/chat/lib/chat-media-grid/chat-media-grid.js +0 -53
  574. package/esm2022/chat/lib/chat-media-grid/chat-media-grid.js.map +0 -1
  575. package/esm2022/chat/lib/chat-message/chat-message.js +0 -86
  576. package/esm2022/chat/lib/chat-message/chat-message.js.map +0 -1
  577. package/esm2022/chat/lib/chat-render-list.js +0 -55
  578. package/esm2022/chat/lib/chat-render-list.js.map +0 -1
  579. package/esm2022/chat/lib/chat-tokens.js +0 -9
  580. package/esm2022/chat/lib/chat-tokens.js.map +0 -1
  581. package/esm2022/chat/lib/chat-typing/chat-typing.js +0 -50
  582. package/esm2022/chat/lib/chat-typing/chat-typing.js.map +0 -1
  583. package/esm2022/chat/lib/chat.types.js +0 -1
  584. package/esm2022/chat/lib/chat.types.js.map +0 -1
  585. package/esm2022/chat/lib/defs/chat-author-def.js +0 -27
  586. package/esm2022/chat/lib/defs/chat-author-def.js.map +0 -1
  587. package/esm2022/chat/lib/defs/chat-date-def.js +0 -24
  588. package/esm2022/chat/lib/defs/chat-date-def.js.map +0 -1
  589. package/esm2022/chat/lib/defs/chat-message-def.js +0 -30
  590. package/esm2022/chat/lib/defs/chat-message-def.js.map +0 -1
  591. package/esm2022/chat/malva-ui-core-chat.js +0 -5
  592. package/esm2022/chat/malva-ui-core-chat.js.map +0 -1
  593. package/esm2022/checkbox/index.js +0 -4
  594. package/esm2022/checkbox/index.js.map +0 -1
  595. package/esm2022/checkbox/lib/checkbox/checkbox.js +0 -201
  596. package/esm2022/checkbox/lib/checkbox/checkbox.js.map +0 -1
  597. package/esm2022/checkbox/lib/checkbox-group/checkbox-group.js +0 -68
  598. package/esm2022/checkbox/lib/checkbox-group/checkbox-group.js.map +0 -1
  599. package/esm2022/checkbox/lib/checkbox-group-token.js +0 -3
  600. package/esm2022/checkbox/lib/checkbox-group-token.js.map +0 -1
  601. package/esm2022/checkbox/malva-ui-core-checkbox.js +0 -5
  602. package/esm2022/checkbox/malva-ui-core-checkbox.js.map +0 -1
  603. package/esm2022/chip/index.js +0 -3
  604. package/esm2022/chip/index.js.map +0 -1
  605. package/esm2022/chip/lib/chip/chip.directives.js +0 -32
  606. package/esm2022/chip/lib/chip/chip.directives.js.map +0 -1
  607. package/esm2022/chip/lib/chip/chip.js +0 -140
  608. package/esm2022/chip/lib/chip/chip.js.map +0 -1
  609. package/esm2022/chip/malva-ui-core-chip.js +0 -5
  610. package/esm2022/chip/malva-ui-core-chip.js.map +0 -1
  611. package/esm2022/color-picker/index.js +0 -4
  612. package/esm2022/color-picker/index.js.map +0 -1
  613. package/esm2022/color-picker/lib/color-picker/color-picker.js +0 -530
  614. package/esm2022/color-picker/lib/color-picker/color-picker.js.map +0 -1
  615. package/esm2022/color-picker/lib/color-picker-popup/color-picker-popup.js +0 -419
  616. package/esm2022/color-picker/lib/color-picker-popup/color-picker-popup.js.map +0 -1
  617. package/esm2022/color-picker/lib/color-utils/color-utils.js +0 -256
  618. package/esm2022/color-picker/lib/color-utils/color-utils.js.map +0 -1
  619. package/esm2022/color-picker/malva-ui-core-color-picker.js +0 -5
  620. package/esm2022/color-picker/malva-ui-core-color-picker.js.map +0 -1
  621. package/esm2022/combobox/index.js +0 -3
  622. package/esm2022/combobox/index.js.map +0 -1
  623. package/esm2022/combobox/lib/combobox/combobox.js +0 -911
  624. package/esm2022/combobox/lib/combobox/combobox.js.map +0 -1
  625. package/esm2022/combobox/lib/combobox-template.directives.js +0 -24
  626. package/esm2022/combobox/lib/combobox-template.directives.js.map +0 -1
  627. package/esm2022/combobox/malva-ui-core-combobox.js +0 -5
  628. package/esm2022/combobox/malva-ui-core-combobox.js.map +0 -1
  629. package/esm2022/copy-to-clipboard/index.js +0 -2
  630. package/esm2022/copy-to-clipboard/index.js.map +0 -1
  631. package/esm2022/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.js +0 -201
  632. package/esm2022/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.js.map +0 -1
  633. package/esm2022/copy-to-clipboard/malva-ui-core-copy-to-clipboard.js +0 -5
  634. package/esm2022/copy-to-clipboard/malva-ui-core-copy-to-clipboard.js.map +0 -1
  635. package/esm2022/data-table/index.js +0 -9
  636. package/esm2022/data-table/index.js.map +0 -1
  637. package/esm2022/data-table/lib/data-source.js +0 -6
  638. package/esm2022/data-table/lib/data-source.js.map +0 -1
  639. package/esm2022/data-table/lib/data-table/data-table-layout.js +0 -84
  640. package/esm2022/data-table/lib/data-table/data-table-layout.js.map +0 -1
  641. package/esm2022/data-table/lib/data-table/data-table.js +0 -1846
  642. package/esm2022/data-table/lib/data-table/data-table.js.map +0 -1
  643. package/esm2022/data-table/lib/data-table/services/data-table-column-visibility.service.js +0 -37
  644. package/esm2022/data-table/lib/data-table/services/data-table-column-visibility.service.js.map +0 -1
  645. package/esm2022/data-table/lib/data-table/services/data-table-editing.service.js +0 -63
  646. package/esm2022/data-table/lib/data-table/services/data-table-editing.service.js.map +0 -1
  647. package/esm2022/data-table/lib/data-table/services/data-table-pinning.service.js +0 -68
  648. package/esm2022/data-table/lib/data-table/services/data-table-pinning.service.js.map +0 -1
  649. package/esm2022/data-table/lib/data-table-cell.js +0 -46
  650. package/esm2022/data-table/lib/data-table-cell.js.map +0 -1
  651. package/esm2022/data-table/lib/data-table-edit-cell.js +0 -46
  652. package/esm2022/data-table/lib/data-table-edit-cell.js.map +0 -1
  653. package/esm2022/data-table/lib/data-table-error.js +0 -37
  654. package/esm2022/data-table/lib/data-table-error.js.map +0 -1
  655. package/esm2022/data-table/lib/data-table-footer.js +0 -33
  656. package/esm2022/data-table/lib/data-table-footer.js.map +0 -1
  657. package/esm2022/data-table/lib/data-table-no-data.js +0 -26
  658. package/esm2022/data-table/lib/data-table-no-data.js.map +0 -1
  659. package/esm2022/data-table/lib/filter-dropdown/filter-dropdown.js +0 -224
  660. package/esm2022/data-table/lib/filter-dropdown/filter-dropdown.js.map +0 -1
  661. package/esm2022/data-table/lib/types.js +0 -1
  662. package/esm2022/data-table/lib/types.js.map +0 -1
  663. package/esm2022/data-table/malva-ui-core-data-table.js +0 -5
  664. package/esm2022/data-table/malva-ui-core-data-table.js.map +0 -1
  665. package/esm2022/date-range-picker/index.js +0 -2
  666. package/esm2022/date-range-picker/index.js.map +0 -1
  667. package/esm2022/date-range-picker/lib/date-range-picker/date-range-picker.js +0 -269
  668. package/esm2022/date-range-picker/lib/date-range-picker/date-range-picker.js.map +0 -1
  669. package/esm2022/date-range-picker/malva-ui-core-date-range-picker.js +0 -5
  670. package/esm2022/date-range-picker/malva-ui-core-date-range-picker.js.map +0 -1
  671. package/esm2022/day-picker/index.js +0 -2
  672. package/esm2022/day-picker/index.js.map +0 -1
  673. package/esm2022/day-picker/lib/day-picker/day-picker.js +0 -124
  674. package/esm2022/day-picker/lib/day-picker/day-picker.js.map +0 -1
  675. package/esm2022/day-picker/malva-ui-core-day-picker.js +0 -5
  676. package/esm2022/day-picker/malva-ui-core-day-picker.js.map +0 -1
  677. package/esm2022/dialog/index.js +0 -12
  678. package/esm2022/dialog/index.js.map +0 -1
  679. package/esm2022/dialog/lib/confirm-dialog-options.js +0 -1
  680. package/esm2022/dialog/lib/confirm-dialog-options.js.map +0 -1
  681. package/esm2022/dialog/lib/confirm-dialog.js +0 -155
  682. package/esm2022/dialog/lib/confirm-dialog.js.map +0 -1
  683. package/esm2022/dialog/lib/dialog/dialog.js +0 -40
  684. package/esm2022/dialog/lib/dialog/dialog.js.map +0 -1
  685. package/esm2022/dialog/lib/dialog-body.js +0 -33
  686. package/esm2022/dialog/lib/dialog-body.js.map +0 -1
  687. package/esm2022/dialog/lib/dialog-close.js +0 -45
  688. package/esm2022/dialog/lib/dialog-close.js.map +0 -1
  689. package/esm2022/dialog/lib/dialog-config.js +0 -23
  690. package/esm2022/dialog/lib/dialog-config.js.map +0 -1
  691. package/esm2022/dialog/lib/dialog-container.js +0 -69
  692. package/esm2022/dialog/lib/dialog-container.js.map +0 -1
  693. package/esm2022/dialog/lib/dialog-footer.js +0 -29
  694. package/esm2022/dialog/lib/dialog-footer.js.map +0 -1
  695. package/esm2022/dialog/lib/dialog-header.js +0 -181
  696. package/esm2022/dialog/lib/dialog-header.js.map +0 -1
  697. package/esm2022/dialog/lib/dialog-ref.js +0 -167
  698. package/esm2022/dialog/lib/dialog-ref.js.map +0 -1
  699. package/esm2022/dialog/lib/dialog-template.js +0 -136
  700. package/esm2022/dialog/lib/dialog-template.js.map +0 -1
  701. package/esm2022/dialog/lib/dialog-text-content.js +0 -59
  702. package/esm2022/dialog/lib/dialog-text-content.js.map +0 -1
  703. package/esm2022/dialog/lib/dialog.service.js +0 -205
  704. package/esm2022/dialog/lib/dialog.service.js.map +0 -1
  705. package/esm2022/dialog/lib/generate-routable-dialog-route.js +0 -59
  706. package/esm2022/dialog/lib/generate-routable-dialog-route.js.map +0 -1
  707. package/esm2022/dialog/lib/inject-dialog-ref.js +0 -16
  708. package/esm2022/dialog/lib/inject-dialog-ref.js.map +0 -1
  709. package/esm2022/dialog/lib/routable-dialog.js +0 -91
  710. package/esm2022/dialog/lib/routable-dialog.js.map +0 -1
  711. package/esm2022/dialog/malva-ui-core-dialog.js +0 -5
  712. package/esm2022/dialog/malva-ui-core-dialog.js.map +0 -1
  713. package/esm2022/divider/index.js +0 -2
  714. package/esm2022/divider/index.js.map +0 -1
  715. package/esm2022/divider/lib/divider/divider.js +0 -73
  716. package/esm2022/divider/lib/divider/divider.js.map +0 -1
  717. package/esm2022/divider/malva-ui-core-divider.js +0 -5
  718. package/esm2022/divider/malva-ui-core-divider.js.map +0 -1
  719. package/esm2022/drawer/index.js +0 -12
  720. package/esm2022/drawer/index.js.map +0 -1
  721. package/esm2022/drawer/lib/drawer/drawer.js +0 -180
  722. package/esm2022/drawer/lib/drawer/drawer.js.map +0 -1
  723. package/esm2022/drawer/lib/drawer-body.js +0 -32
  724. package/esm2022/drawer/lib/drawer-body.js.map +0 -1
  725. package/esm2022/drawer/lib/drawer-content.js +0 -14
  726. package/esm2022/drawer/lib/drawer-content.js.map +0 -1
  727. package/esm2022/drawer/lib/drawer-footer.js +0 -14
  728. package/esm2022/drawer/lib/drawer-footer.js.map +0 -1
  729. package/esm2022/drawer/lib/drawer-header.js +0 -14
  730. package/esm2022/drawer/lib/drawer-header.js.map +0 -1
  731. package/esm2022/drawer/lib/drawer-ref.js +0 -31
  732. package/esm2022/drawer/lib/drawer-ref.js.map +0 -1
  733. package/esm2022/drawer/lib/drawer-resize.js +0 -243
  734. package/esm2022/drawer/lib/drawer-resize.js.map +0 -1
  735. package/esm2022/drawer/lib/drawer-section/drawer-section.js +0 -26
  736. package/esm2022/drawer/lib/drawer-section/drawer-section.js.map +0 -1
  737. package/esm2022/drawer/lib/drawer-sections/drawer-sections.js +0 -58
  738. package/esm2022/drawer/lib/drawer-sections/drawer-sections.js.map +0 -1
  739. package/esm2022/drawer/lib/drawer-sections.service.js +0 -83
  740. package/esm2022/drawer/lib/drawer-sections.service.js.map +0 -1
  741. package/esm2022/drawer/lib/drawer.service.js +0 -86
  742. package/esm2022/drawer/lib/drawer.service.js.map +0 -1
  743. package/esm2022/drawer/lib/generate-routable-drawer-route.js +0 -52
  744. package/esm2022/drawer/lib/generate-routable-drawer-route.js.map +0 -1
  745. package/esm2022/drawer/lib/routable-drawer.js +0 -91
  746. package/esm2022/drawer/lib/routable-drawer.js.map +0 -1
  747. package/esm2022/drawer/malva-ui-core-drawer.js +0 -5
  748. package/esm2022/drawer/malva-ui-core-drawer.js.map +0 -1
  749. package/esm2022/dropdown/index.js +0 -10
  750. package/esm2022/dropdown/index.js.map +0 -1
  751. package/esm2022/dropdown/lib/active-descendant.js +0 -92
  752. package/esm2022/dropdown/lib/active-descendant.js.map +0 -1
  753. package/esm2022/dropdown/lib/dropdown-panel/dropdown-panel.js +0 -295
  754. package/esm2022/dropdown/lib/dropdown-panel/dropdown-panel.js.map +0 -1
  755. package/esm2022/dropdown/lib/highlight-match.pipe.js +0 -36
  756. package/esm2022/dropdown/lib/highlight-match.pipe.js.map +0 -1
  757. package/esm2022/dropdown/lib/option-matcher.js +0 -124
  758. package/esm2022/dropdown/lib/option-matcher.js.map +0 -1
  759. package/esm2022/dropdown/lib/options-adapter.js +0 -356
  760. package/esm2022/dropdown/lib/options-adapter.js.map +0 -1
  761. package/esm2022/dropdown/lib/options-result.js +0 -11
  762. package/esm2022/dropdown/lib/options-result.js.map +0 -1
  763. package/esm2022/dropdown/lib/reconciliation.js +0 -32
  764. package/esm2022/dropdown/lib/reconciliation.js.map +0 -1
  765. package/esm2022/dropdown/lib/select-data-source.js +0 -21
  766. package/esm2022/dropdown/lib/select-data-source.js.map +0 -1
  767. package/esm2022/dropdown/lib/select-option.js +0 -25
  768. package/esm2022/dropdown/lib/select-option.js.map +0 -1
  769. package/esm2022/dropdown/malva-ui-core-dropdown.js +0 -5
  770. package/esm2022/dropdown/malva-ui-core-dropdown.js.map +0 -1
  771. package/esm2022/empty-state/index.js +0 -2
  772. package/esm2022/empty-state/index.js.map +0 -1
  773. package/esm2022/empty-state/lib/empty-state/empty-state.js +0 -43
  774. package/esm2022/empty-state/lib/empty-state/empty-state.js.map +0 -1
  775. package/esm2022/empty-state/malva-ui-core-empty-state.js +0 -5
  776. package/esm2022/empty-state/malva-ui-core-empty-state.js.map +0 -1
  777. package/esm2022/expand/index.js +0 -3
  778. package/esm2022/expand/index.js.map +0 -1
  779. package/esm2022/expand/lib/expand/expand-content.js +0 -33
  780. package/esm2022/expand/lib/expand/expand-content.js.map +0 -1
  781. package/esm2022/expand/lib/expand/expand.js +0 -93
  782. package/esm2022/expand/lib/expand/expand.js.map +0 -1
  783. package/esm2022/expand/malva-ui-core-expand.js +0 -5
  784. package/esm2022/expand/malva-ui-core-expand.js.map +0 -1
  785. package/esm2022/file-upload/index.js +0 -5
  786. package/esm2022/file-upload/index.js.map +0 -1
  787. package/esm2022/file-upload/lib/file-upload/file-upload.js +0 -324
  788. package/esm2022/file-upload/lib/file-upload/file-upload.js.map +0 -1
  789. package/esm2022/file-upload/lib/file-upload/file-upload.types.js +0 -1
  790. package/esm2022/file-upload/lib/file-upload/file-upload.types.js.map +0 -1
  791. package/esm2022/file-upload/lib/file-upload-action.js +0 -65
  792. package/esm2022/file-upload/lib/file-upload-action.js.map +0 -1
  793. package/esm2022/file-upload/lib/file-upload-item/file-upload-item.js +0 -55
  794. package/esm2022/file-upload/lib/file-upload-item/file-upload-item.js.map +0 -1
  795. package/esm2022/file-upload/malva-ui-core-file-upload.js +0 -5
  796. package/esm2022/file-upload/malva-ui-core-file-upload.js.map +0 -1
  797. package/esm2022/filter/index.js +0 -4
  798. package/esm2022/filter/index.js.map +0 -1
  799. package/esm2022/filter/lib/filter/filter.js +0 -552
  800. package/esm2022/filter/lib/filter/filter.js.map +0 -1
  801. package/esm2022/filter/lib/filter.types.js +0 -1
  802. package/esm2022/filter/lib/filter.types.js.map +0 -1
  803. package/esm2022/filter/lib/smart-filter-bar/smart-filter-bar.js +0 -518
  804. package/esm2022/filter/lib/smart-filter-bar/smart-filter-bar.js.map +0 -1
  805. package/esm2022/filter/malva-ui-core-filter.js +0 -5
  806. package/esm2022/filter/malva-ui-core-filter.js.map +0 -1
  807. package/esm2022/form/index.js +0 -7
  808. package/esm2022/form/index.js.map +0 -1
  809. package/esm2022/form/lib/fieldset/fieldset.js +0 -101
  810. package/esm2022/form/lib/fieldset/fieldset.js.map +0 -1
  811. package/esm2022/form/lib/fieldset-span.js +0 -49
  812. package/esm2022/form/lib/fieldset-span.js.map +0 -1
  813. package/esm2022/form/lib/form/form.js +0 -60
  814. package/esm2022/form/lib/form/form.js.map +0 -1
  815. package/esm2022/form/lib/form-actions.js +0 -34
  816. package/esm2022/form/lib/form-actions.js.map +0 -1
  817. package/esm2022/form/lib/form-gap.js +0 -15
  818. package/esm2022/form/lib/form-gap.js.map +0 -1
  819. package/esm2022/form/lib/form-header.js +0 -27
  820. package/esm2022/form/lib/form-header.js.map +0 -1
  821. package/esm2022/form/lib/form.types.js +0 -1
  822. package/esm2022/form/lib/form.types.js.map +0 -1
  823. package/esm2022/form/malva-ui-core-form.js +0 -5
  824. package/esm2022/form/malva-ui-core-form.js.map +0 -1
  825. package/esm2022/form-utils/index.js +0 -16
  826. package/esm2022/form-utils/index.js.map +0 -1
  827. package/esm2022/form-utils/lib/aria-value-bridge.js +0 -57
  828. package/esm2022/form-utils/lib/aria-value-bridge.js.map +0 -1
  829. package/esm2022/form-utils/lib/description/description.js +0 -24
  830. package/esm2022/form-utils/lib/description/description.js.map +0 -1
  831. package/esm2022/form-utils/lib/focusable-group-base.js +0 -87
  832. package/esm2022/form-utils/lib/focusable-group-base.js.map +0 -1
  833. package/esm2022/form-utils/lib/form-control-base/signal-form-control-base.js +0 -192
  834. package/esm2022/form-utils/lib/form-control-base/signal-form-control-base.js.map +0 -1
  835. package/esm2022/form-utils/lib/form-control-sides.js +0 -34
  836. package/esm2022/form-utils/lib/form-control-sides.js.map +0 -1
  837. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper-control.js +0 -14
  838. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper-control.js.map +0 -1
  839. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper.js +0 -47
  840. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper.js.map +0 -1
  841. package/esm2022/form-utils/lib/form-field/form-field.js +0 -245
  842. package/esm2022/form-utils/lib/form-field/form-field.js.map +0 -1
  843. package/esm2022/form-utils/lib/hint/hint.js +0 -11
  844. package/esm2022/form-utils/lib/hint/hint.js.map +0 -1
  845. package/esm2022/form-utils/lib/label/label.js +0 -55
  846. package/esm2022/form-utils/lib/label/label.js.map +0 -1
  847. package/esm2022/form-utils/lib/message/message.js +0 -20
  848. package/esm2022/form-utils/lib/message/message.js.map +0 -1
  849. package/esm2022/form-utils/lib/models/error-display-strategy.js +0 -1
  850. package/esm2022/form-utils/lib/models/error-display-strategy.js.map +0 -1
  851. package/esm2022/form-utils/lib/models/form-control-connector.js +0 -3
  852. package/esm2022/form-utils/lib/models/form-control-connector.js.map +0 -1
  853. package/esm2022/form-utils/lib/models/form-state.js +0 -1
  854. package/esm2022/form-utils/lib/models/form-state.js.map +0 -1
  855. package/esm2022/form-utils/lib/selection.service.js +0 -81
  856. package/esm2022/form-utils/lib/selection.service.js.map +0 -1
  857. package/esm2022/form-utils/malva-ui-core-form-utils.js +0 -5
  858. package/esm2022/form-utils/malva-ui-core-form-utils.js.map +0 -1
  859. package/esm2022/form-utils/testing/index.js +0 -2
  860. package/esm2022/form-utils/testing/index.js.map +0 -1
  861. package/esm2022/form-utils/testing/lib/forms-binding-matrix.js +0 -32
  862. package/esm2022/form-utils/testing/lib/forms-binding-matrix.js.map +0 -1
  863. package/esm2022/form-utils/testing/malva-ui-core-form-utils-testing.js +0 -5
  864. package/esm2022/form-utils/testing/malva-ui-core-form-utils-testing.js.map +0 -1
  865. package/esm2022/index.js +0 -70
  866. package/esm2022/index.js.map +0 -1
  867. package/esm2022/input/index.js +0 -4
  868. package/esm2022/input/index.js.map +0 -1
  869. package/esm2022/input/lib/input/input-native.js +0 -49
  870. package/esm2022/input/lib/input/input-native.js.map +0 -1
  871. package/esm2022/input/lib/input/input-value-accessor.js +0 -4
  872. package/esm2022/input/lib/input/input-value-accessor.js.map +0 -1
  873. package/esm2022/input/lib/input/input.js +0 -277
  874. package/esm2022/input/lib/input/input.js.map +0 -1
  875. package/esm2022/input/lib/input/password-strength.js +0 -46
  876. package/esm2022/input/lib/input/password-strength.js.map +0 -1
  877. package/esm2022/input/malva-ui-core-input.js +0 -5
  878. package/esm2022/input/malva-ui-core-input.js.map +0 -1
  879. package/esm2022/kbd/index.js +0 -2
  880. package/esm2022/kbd/index.js.map +0 -1
  881. package/esm2022/kbd/lib/kbd/kbd.js +0 -124
  882. package/esm2022/kbd/lib/kbd/kbd.js.map +0 -1
  883. package/esm2022/kbd/malva-ui-core-kbd.js +0 -5
  884. package/esm2022/kbd/malva-ui-core-kbd.js.map +0 -1
  885. package/esm2022/layout/index.js +0 -5
  886. package/esm2022/layout/index.js.map +0 -1
  887. package/esm2022/layout/lib/layout/directives/MlvLayoutSide.js +0 -14
  888. package/esm2022/layout/lib/layout/directives/MlvLayoutSide.js.map +0 -1
  889. package/esm2022/layout/lib/layout/directives/MlvLayoutTop.js +0 -14
  890. package/esm2022/layout/lib/layout/directives/MlvLayoutTop.js.map +0 -1
  891. package/esm2022/layout/lib/layout/layout.js +0 -43
  892. package/esm2022/layout/lib/layout/layout.js.map +0 -1
  893. package/esm2022/layout/lib/layout/services/theme.service.js +0 -121
  894. package/esm2022/layout/lib/layout/services/theme.service.js.map +0 -1
  895. package/esm2022/layout/malva-ui-core-layout.js +0 -5
  896. package/esm2022/layout/malva-ui-core-layout.js.map +0 -1
  897. package/esm2022/link/index.js +0 -3
  898. package/esm2022/link/index.js.map +0 -1
  899. package/esm2022/link/lib/link/link.directives.js +0 -24
  900. package/esm2022/link/lib/link/link.directives.js.map +0 -1
  901. package/esm2022/link/lib/link/link.js +0 -61
  902. package/esm2022/link/lib/link/link.js.map +0 -1
  903. package/esm2022/link/malva-ui-core-link.js +0 -5
  904. package/esm2022/link/malva-ui-core-link.js.map +0 -1
  905. package/esm2022/list/index.js +0 -14
  906. package/esm2022/list/index.js.map +0 -1
  907. package/esm2022/list/lib/list/list.js +0 -28
  908. package/esm2022/list/lib/list/list.js.map +0 -1
  909. package/esm2022/list/lib/list-item/list-item.js +0 -125
  910. package/esm2022/list/lib/list-item/list-item.js.map +0 -1
  911. package/esm2022/list/lib/list-item-actions.js +0 -23
  912. package/esm2022/list/lib/list-item-actions.js.map +0 -1
  913. package/esm2022/list/lib/list-item-byline.js +0 -13
  914. package/esm2022/list/lib/list-item-byline.js.map +0 -1
  915. package/esm2022/list/lib/list-item-group/list-item-group.js +0 -25
  916. package/esm2022/list/lib/list-item-group/list-item-group.js.map +0 -1
  917. package/esm2022/list/lib/list-item-link/list-item-link.js +0 -20
  918. package/esm2022/list/lib/list-item-link/list-item-link.js.map +0 -1
  919. package/esm2022/list/lib/list-item-media.js +0 -13
  920. package/esm2022/list/lib/list-item-media.js.map +0 -1
  921. package/esm2022/list/lib/list-item-meta.js +0 -13
  922. package/esm2022/list/lib/list-item-meta.js.map +0 -1
  923. package/esm2022/list/lib/list-item-prefix.js +0 -13
  924. package/esm2022/list/lib/list-item-prefix.js.map +0 -1
  925. package/esm2022/list/lib/list-item-suffix.js +0 -13
  926. package/esm2022/list/lib/list-item-suffix.js.map +0 -1
  927. package/esm2022/list/lib/list-item-template.js +0 -14
  928. package/esm2022/list/lib/list-item-template.js.map +0 -1
  929. package/esm2022/list/lib/list-item-title.js +0 -13
  930. package/esm2022/list/lib/list-item-title.js.map +0 -1
  931. package/esm2022/list/lib/list-selectable.js +0 -116
  932. package/esm2022/list/lib/list-selectable.js.map +0 -1
  933. package/esm2022/list/malva-ui-core-list.js +0 -5
  934. package/esm2022/list/malva-ui-core-list.js.map +0 -1
  935. package/esm2022/loader/index.js +0 -2
  936. package/esm2022/loader/index.js.map +0 -1
  937. package/esm2022/loader/lib/loader/loader.js +0 -134
  938. package/esm2022/loader/lib/loader/loader.js.map +0 -1
  939. package/esm2022/loader/malva-ui-core-loader.js +0 -5
  940. package/esm2022/loader/malva-ui-core-loader.js.map +0 -1
  941. package/esm2022/malva-ui-core.js +0 -5
  942. package/esm2022/malva-ui-core.js.map +0 -1
  943. package/esm2022/menu/index.js +0 -10
  944. package/esm2022/menu/index.js.map +0 -1
  945. package/esm2022/menu/lib/menu/menu-group-label.js +0 -35
  946. package/esm2022/menu/lib/menu/menu-group-label.js.map +0 -1
  947. package/esm2022/menu/lib/menu/menu-group.js +0 -44
  948. package/esm2022/menu/lib/menu/menu-group.js.map +0 -1
  949. package/esm2022/menu/lib/menu/menu-item.js +0 -117
  950. package/esm2022/menu/lib/menu/menu-item.js.map +0 -1
  951. package/esm2022/menu/lib/menu/menu-separator.js +0 -41
  952. package/esm2022/menu/lib/menu/menu-separator.js.map +0 -1
  953. package/esm2022/menu/lib/menu/menu-trigger.js +0 -653
  954. package/esm2022/menu/lib/menu/menu-trigger.js.map +0 -1
  955. package/esm2022/menu/lib/menu/menu.js +0 -308
  956. package/esm2022/menu/lib/menu/menu.js.map +0 -1
  957. package/esm2022/menu/lib/menu/menu.types.js +0 -4
  958. package/esm2022/menu/lib/menu/menu.types.js.map +0 -1
  959. package/esm2022/menu/lib/menu/menubar.js +0 -257
  960. package/esm2022/menu/lib/menu/menubar.js.map +0 -1
  961. package/esm2022/menu/lib/menu/menubar.types.js +0 -4
  962. package/esm2022/menu/lib/menu/menubar.types.js.map +0 -1
  963. package/esm2022/menu/lib/menu/submenu-aim.js +0 -30
  964. package/esm2022/menu/lib/menu/submenu-aim.js.map +0 -1
  965. package/esm2022/menu/malva-ui-core-menu.js +0 -5
  966. package/esm2022/menu/malva-ui-core-menu.js.map +0 -1
  967. package/esm2022/notification/index.js +0 -5
  968. package/esm2022/notification/index.js.map +0 -1
  969. package/esm2022/notification/lib/notification-item/notification-item.js +0 -65
  970. package/esm2022/notification/lib/notification-item/notification-item.js.map +0 -1
  971. package/esm2022/notification/lib/notification-ref.js +0 -13
  972. package/esm2022/notification/lib/notification-ref.js.map +0 -1
  973. package/esm2022/notification/lib/notification.service.js +0 -118
  974. package/esm2022/notification/lib/notification.service.js.map +0 -1
  975. package/esm2022/notification/lib/notification.types.js +0 -6
  976. package/esm2022/notification/lib/notification.types.js.map +0 -1
  977. package/esm2022/notification/malva-ui-core-notification.js +0 -5
  978. package/esm2022/notification/malva-ui-core-notification.js.map +0 -1
  979. package/esm2022/number-input/index.js +0 -2
  980. package/esm2022/number-input/index.js.map +0 -1
  981. package/esm2022/number-input/lib/number-input/number-input.js +0 -395
  982. package/esm2022/number-input/lib/number-input/number-input.js.map +0 -1
  983. package/esm2022/number-input/malva-ui-core-number-input.js +0 -5
  984. package/esm2022/number-input/malva-ui-core-number-input.js.map +0 -1
  985. package/esm2022/page/index.js +0 -15
  986. package/esm2022/page/index.js.map +0 -1
  987. package/esm2022/page/lib/page/page-scroll.token.js +0 -9
  988. package/esm2022/page/lib/page/page-scroll.token.js.map +0 -1
  989. package/esm2022/page/lib/page/page-snap-controller.js +0 -170
  990. package/esm2022/page/lib/page/page-snap-controller.js.map +0 -1
  991. package/esm2022/page/lib/page/page-snap.directive.js +0 -65
  992. package/esm2022/page/lib/page/page-snap.directive.js.map +0 -1
  993. package/esm2022/page/lib/page/page.js +0 -173
  994. package/esm2022/page/lib/page/page.js.map +0 -1
  995. package/esm2022/page/lib/page-content/page-aside.js +0 -13
  996. package/esm2022/page/lib/page-content/page-aside.js.map +0 -1
  997. package/esm2022/page/lib/page-content/page-content.js +0 -72
  998. package/esm2022/page/lib/page-content/page-content.js.map +0 -1
  999. package/esm2022/page/lib/page-dock/page-dock.js +0 -128
  1000. package/esm2022/page/lib/page-dock/page-dock.js.map +0 -1
  1001. package/esm2022/page/lib/page-dock/page-dock.slots.js +0 -39
  1002. package/esm2022/page/lib/page-dock/page-dock.slots.js.map +0 -1
  1003. package/esm2022/page/lib/page-header/page-header.directives.js +0 -88
  1004. package/esm2022/page/lib/page-header/page-header.directives.js.map +0 -1
  1005. package/esm2022/page/lib/page-header/page-header.js +0 -124
  1006. package/esm2022/page/lib/page-header/page-header.js.map +0 -1
  1007. package/esm2022/page/lib/page-shell/page-shell-color.js +0 -193
  1008. package/esm2022/page/lib/page-shell/page-shell-color.js.map +0 -1
  1009. package/esm2022/page/lib/page-shell/page-shell-css-color.js +0 -207
  1010. package/esm2022/page/lib/page-shell/page-shell-css-color.js.map +0 -1
  1011. package/esm2022/page/lib/page-shell/page-shell.js +0 -131
  1012. package/esm2022/page/lib/page-shell/page-shell.js.map +0 -1
  1013. package/esm2022/page/lib/page-shell/page-shell.slots.js +0 -41
  1014. package/esm2022/page/lib/page-shell/page-shell.slots.js.map +0 -1
  1015. package/esm2022/page/lib/page-summary/page-summary-item.js +0 -26
  1016. package/esm2022/page/lib/page-summary/page-summary-item.js.map +0 -1
  1017. package/esm2022/page/lib/page-summary/page-summary.js +0 -87
  1018. package/esm2022/page/lib/page-summary/page-summary.js.map +0 -1
  1019. package/esm2022/page/malva-ui-core-page.js +0 -5
  1020. package/esm2022/page/malva-ui-core-page.js.map +0 -1
  1021. package/esm2022/pagination/index.js +0 -5
  1022. package/esm2022/pagination/index.js.map +0 -1
  1023. package/esm2022/pagination/lib/pagination/pagination.directives.js +0 -58
  1024. package/esm2022/pagination/lib/pagination/pagination.directives.js.map +0 -1
  1025. package/esm2022/pagination/lib/pagination/pagination.js +0 -293
  1026. package/esm2022/pagination/lib/pagination/pagination.js.map +0 -1
  1027. package/esm2022/pagination/lib/pagination/pagination.model.js +0 -1
  1028. package/esm2022/pagination/lib/pagination/pagination.model.js.map +0 -1
  1029. package/esm2022/pagination/lib/pagination/pagination.service.js +0 -108
  1030. package/esm2022/pagination/lib/pagination/pagination.service.js.map +0 -1
  1031. package/esm2022/pagination/malva-ui-core-pagination.js +0 -5
  1032. package/esm2022/pagination/malva-ui-core-pagination.js.map +0 -1
  1033. package/esm2022/pin-input/index.js +0 -3
  1034. package/esm2022/pin-input/index.js.map +0 -1
  1035. package/esm2022/pin-input/lib/pin-input/pin-input-separator.js +0 -31
  1036. package/esm2022/pin-input/lib/pin-input/pin-input-separator.js.map +0 -1
  1037. package/esm2022/pin-input/lib/pin-input/pin-input.js +0 -365
  1038. package/esm2022/pin-input/lib/pin-input/pin-input.js.map +0 -1
  1039. package/esm2022/pin-input/malva-ui-core-pin-input.js +0 -5
  1040. package/esm2022/pin-input/malva-ui-core-pin-input.js.map +0 -1
  1041. package/esm2022/popup/index.js +0 -10
  1042. package/esm2022/popup/index.js.map +0 -1
  1043. package/esm2022/popup/lib/popup/popup.js +0 -500
  1044. package/esm2022/popup/lib/popup/popup.js.map +0 -1
  1045. package/esm2022/popup/lib/popup-container/popup-container.js +0 -169
  1046. package/esm2022/popup/lib/popup-container/popup-container.js.map +0 -1
  1047. package/esm2022/popup/lib/popup-container/popup-container.token.js +0 -9
  1048. package/esm2022/popup/lib/popup-container/popup-container.token.js.map +0 -1
  1049. package/esm2022/popup/lib/popup-content.js +0 -14
  1050. package/esm2022/popup/lib/popup-content.js.map +0 -1
  1051. package/esm2022/popup/lib/popup-header-content.js +0 -26
  1052. package/esm2022/popup/lib/popup-header-content.js.map +0 -1
  1053. package/esm2022/popup/lib/popup-pinned-content.js +0 -25
  1054. package/esm2022/popup/lib/popup-pinned-content.js.map +0 -1
  1055. package/esm2022/popup/lib/popup-positions.js +0 -252
  1056. package/esm2022/popup/lib/popup-positions.js.map +0 -1
  1057. package/esm2022/popup/lib/popup-trigger/popup-trigger.js +0 -308
  1058. package/esm2022/popup/lib/popup-trigger/popup-trigger.js.map +0 -1
  1059. package/esm2022/popup/lib/popup.service.js +0 -188
  1060. package/esm2022/popup/lib/popup.service.js.map +0 -1
  1061. package/esm2022/popup/malva-ui-core-popup.js +0 -5
  1062. package/esm2022/popup/malva-ui-core-popup.js.map +0 -1
  1063. package/esm2022/progress/index.js +0 -2
  1064. package/esm2022/progress/index.js.map +0 -1
  1065. package/esm2022/progress/lib/progress/progress.js +0 -102
  1066. package/esm2022/progress/lib/progress/progress.js.map +0 -1
  1067. package/esm2022/progress/malva-ui-core-progress.js +0 -5
  1068. package/esm2022/progress/malva-ui-core-progress.js.map +0 -1
  1069. package/esm2022/radio/index.js +0 -3
  1070. package/esm2022/radio/index.js.map +0 -1
  1071. package/esm2022/radio/lib/radio/radio.js +0 -134
  1072. package/esm2022/radio/lib/radio/radio.js.map +0 -1
  1073. package/esm2022/radio/lib/radio-group/radio-group.js +0 -176
  1074. package/esm2022/radio/lib/radio-group/radio-group.js.map +0 -1
  1075. package/esm2022/radio/lib/radio-group-token.js +0 -3
  1076. package/esm2022/radio/lib/radio-group-token.js.map +0 -1
  1077. package/esm2022/radio/malva-ui-core-radio.js +0 -5
  1078. package/esm2022/radio/malva-ui-core-radio.js.map +0 -1
  1079. package/esm2022/rating/index.js +0 -2
  1080. package/esm2022/rating/index.js.map +0 -1
  1081. package/esm2022/rating/lib/rating/rating.js +0 -208
  1082. package/esm2022/rating/lib/rating/rating.js.map +0 -1
  1083. package/esm2022/rating/malva-ui-core-rating.js +0 -5
  1084. package/esm2022/rating/malva-ui-core-rating.js.map +0 -1
  1085. package/esm2022/scrollbar/index.js +0 -2
  1086. package/esm2022/scrollbar/index.js.map +0 -1
  1087. package/esm2022/scrollbar/lib/scrollbar/scrollbar.js +0 -388
  1088. package/esm2022/scrollbar/lib/scrollbar/scrollbar.js.map +0 -1
  1089. package/esm2022/scrollbar/malva-ui-core-scrollbar.js +0 -5
  1090. package/esm2022/scrollbar/malva-ui-core-scrollbar.js.map +0 -1
  1091. package/esm2022/search-field/index.js +0 -3
  1092. package/esm2022/search-field/index.js.map +0 -1
  1093. package/esm2022/search-field/lib/search-field/search-field.js +0 -535
  1094. package/esm2022/search-field/lib/search-field/search-field.js.map +0 -1
  1095. package/esm2022/search-field/lib/search-field/search-overlay-content.js +0 -35
  1096. package/esm2022/search-field/lib/search-field/search-overlay-content.js.map +0 -1
  1097. package/esm2022/search-field/malva-ui-core-search-field.js +0 -5
  1098. package/esm2022/search-field/malva-ui-core-search-field.js.map +0 -1
  1099. package/esm2022/segmented/index.js +0 -5
  1100. package/esm2022/segmented/index.js.map +0 -1
  1101. package/esm2022/segmented/lib/segmented/segmented.js +0 -248
  1102. package/esm2022/segmented/lib/segmented/segmented.js.map +0 -1
  1103. package/esm2022/segmented/lib/segmented-item/segmented-item.js +0 -194
  1104. package/esm2022/segmented/lib/segmented-item/segmented-item.js.map +0 -1
  1105. package/esm2022/segmented/lib/segmented-token.js +0 -4
  1106. package/esm2022/segmented/lib/segmented-token.js.map +0 -1
  1107. package/esm2022/segmented/lib/segmented.types.js +0 -1
  1108. package/esm2022/segmented/lib/segmented.types.js.map +0 -1
  1109. package/esm2022/segmented/malva-ui-core-segmented.js +0 -5
  1110. package/esm2022/segmented/malva-ui-core-segmented.js.map +0 -1
  1111. package/esm2022/select/index.js +0 -4
  1112. package/esm2022/select/index.js.map +0 -1
  1113. package/esm2022/select/lib/select/select.js +0 -685
  1114. package/esm2022/select/lib/select/select.js.map +0 -1
  1115. package/esm2022/select/lib/select-option.js +0 -2
  1116. package/esm2022/select/lib/select-option.js.map +0 -1
  1117. package/esm2022/select/lib/select-template.directives.js +0 -34
  1118. package/esm2022/select/lib/select-template.directives.js.map +0 -1
  1119. package/esm2022/select/malva-ui-core-select.js +0 -5
  1120. package/esm2022/select/malva-ui-core-select.js.map +0 -1
  1121. package/esm2022/sidebar/index.js +0 -16
  1122. package/esm2022/sidebar/index.js.map +0 -1
  1123. package/esm2022/sidebar/lib/sidebar/sidebar.js +0 -251
  1124. package/esm2022/sidebar/lib/sidebar/sidebar.js.map +0 -1
  1125. package/esm2022/sidebar/lib/sidebar-content.js +0 -37
  1126. package/esm2022/sidebar/lib/sidebar-content.js.map +0 -1
  1127. package/esm2022/sidebar/lib/sidebar-context.js +0 -3
  1128. package/esm2022/sidebar/lib/sidebar-context.js.map +0 -1
  1129. package/esm2022/sidebar/lib/sidebar-footer.js +0 -20
  1130. package/esm2022/sidebar/lib/sidebar-footer.js.map +0 -1
  1131. package/esm2022/sidebar/lib/sidebar-group/sidebar-group.js +0 -341
  1132. package/esm2022/sidebar/lib/sidebar-group/sidebar-group.js.map +0 -1
  1133. package/esm2022/sidebar/lib/sidebar-header.js +0 -20
  1134. package/esm2022/sidebar/lib/sidebar-header.js.map +0 -1
  1135. package/esm2022/sidebar/lib/sidebar-item/sidebar-item.js +0 -216
  1136. package/esm2022/sidebar/lib/sidebar-item/sidebar-item.js.map +0 -1
  1137. package/esm2022/sidebar/lib/sidebar-item-host.js +0 -39
  1138. package/esm2022/sidebar/lib/sidebar-item-host.js.map +0 -1
  1139. package/esm2022/sidebar/lib/sidebar-item-icon.js +0 -14
  1140. package/esm2022/sidebar/lib/sidebar-item-icon.js.map +0 -1
  1141. package/esm2022/sidebar/lib/sidebar-mode.js +0 -1
  1142. package/esm2022/sidebar/lib/sidebar-mode.js.map +0 -1
  1143. package/esm2022/sidebar/lib/sidebar-rail/sidebar-rail.js +0 -202
  1144. package/esm2022/sidebar/lib/sidebar-rail/sidebar-rail.js.map +0 -1
  1145. package/esm2022/sidebar/lib/sidebar-trigger/sidebar-trigger.js +0 -159
  1146. package/esm2022/sidebar/lib/sidebar-trigger/sidebar-trigger.js.map +0 -1
  1147. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.js +0 -35
  1148. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.js.map +0 -1
  1149. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.js +0 -107
  1150. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.js.map +0 -1
  1151. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.types.js +0 -1
  1152. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.types.js.map +0 -1
  1153. package/esm2022/sidebar/malva-ui-core-sidebar.js +0 -5
  1154. package/esm2022/sidebar/malva-ui-core-sidebar.js.map +0 -1
  1155. package/esm2022/skeleton/index.js +0 -2
  1156. package/esm2022/skeleton/index.js.map +0 -1
  1157. package/esm2022/skeleton/lib/skeleton/skeleton.js +0 -78
  1158. package/esm2022/skeleton/lib/skeleton/skeleton.js.map +0 -1
  1159. package/esm2022/skeleton/malva-ui-core-skeleton.js +0 -5
  1160. package/esm2022/skeleton/malva-ui-core-skeleton.js.map +0 -1
  1161. package/esm2022/slider/index.js +0 -3
  1162. package/esm2022/slider/index.js.map +0 -1
  1163. package/esm2022/slider/lib/slider/slider-tooltip-def.js +0 -31
  1164. package/esm2022/slider/lib/slider/slider-tooltip-def.js.map +0 -1
  1165. package/esm2022/slider/lib/slider/slider.js +0 -468
  1166. package/esm2022/slider/lib/slider/slider.js.map +0 -1
  1167. package/esm2022/slider/malva-ui-core-slider.js +0 -5
  1168. package/esm2022/slider/malva-ui-core-slider.js.map +0 -1
  1169. package/esm2022/split-pane/index.js +0 -4
  1170. package/esm2022/split-pane/index.js.map +0 -1
  1171. package/esm2022/split-pane/lib/split-pane/split-pane-panel.js +0 -49
  1172. package/esm2022/split-pane/lib/split-pane/split-pane-panel.js.map +0 -1
  1173. package/esm2022/split-pane/lib/split-pane/split-pane.js +0 -290
  1174. package/esm2022/split-pane/lib/split-pane/split-pane.js.map +0 -1
  1175. package/esm2022/split-pane/lib/split-pane/split-pane.types.js +0 -1
  1176. package/esm2022/split-pane/lib/split-pane/split-pane.types.js.map +0 -1
  1177. package/esm2022/split-pane/malva-ui-core-split-pane.js +0 -5
  1178. package/esm2022/split-pane/malva-ui-core-split-pane.js.map +0 -1
  1179. package/esm2022/status-indicator/index.js +0 -2
  1180. package/esm2022/status-indicator/index.js.map +0 -1
  1181. package/esm2022/status-indicator/lib/status-indicator/status-indicator.js +0 -71
  1182. package/esm2022/status-indicator/lib/status-indicator/status-indicator.js.map +0 -1
  1183. package/esm2022/status-indicator/malva-ui-core-status-indicator.js +0 -5
  1184. package/esm2022/status-indicator/malva-ui-core-status-indicator.js.map +0 -1
  1185. package/esm2022/stepper/index.js +0 -5
  1186. package/esm2022/stepper/index.js.map +0 -1
  1187. package/esm2022/stepper/lib/stepper/step-header.js +0 -46
  1188. package/esm2022/stepper/lib/stepper/step-header.js.map +0 -1
  1189. package/esm2022/stepper/lib/stepper/step.js +0 -65
  1190. package/esm2022/stepper/lib/stepper/step.js.map +0 -1
  1191. package/esm2022/stepper/lib/stepper/stepper-token.js +0 -4
  1192. package/esm2022/stepper/lib/stepper/stepper-token.js.map +0 -1
  1193. package/esm2022/stepper/lib/stepper/stepper.js +0 -216
  1194. package/esm2022/stepper/lib/stepper/stepper.js.map +0 -1
  1195. package/esm2022/stepper/lib/stepper/stepper.types.js +0 -1
  1196. package/esm2022/stepper/lib/stepper/stepper.types.js.map +0 -1
  1197. package/esm2022/stepper/malva-ui-core-stepper.js +0 -5
  1198. package/esm2022/stepper/malva-ui-core-stepper.js.map +0 -1
  1199. package/esm2022/switch/index.js +0 -3
  1200. package/esm2022/switch/index.js.map +0 -1
  1201. package/esm2022/switch/lib/switch/switch.js +0 -190
  1202. package/esm2022/switch/lib/switch/switch.js.map +0 -1
  1203. package/esm2022/switch/lib/switch-group/switch-group.js +0 -68
  1204. package/esm2022/switch/lib/switch-group/switch-group.js.map +0 -1
  1205. package/esm2022/switch/lib/switch-group-token.js +0 -3
  1206. package/esm2022/switch/lib/switch-group-token.js.map +0 -1
  1207. package/esm2022/switch/malva-ui-core-switch.js +0 -5
  1208. package/esm2022/switch/malva-ui-core-switch.js.map +0 -1
  1209. package/esm2022/tabs/index.js +0 -9
  1210. package/esm2022/tabs/index.js.map +0 -1
  1211. package/esm2022/tabs/lib/tab/tab.js +0 -72
  1212. package/esm2022/tabs/lib/tab/tab.js.map +0 -1
  1213. package/esm2022/tabs/lib/tab-content/tab-content.js +0 -19
  1214. package/esm2022/tabs/lib/tab-content/tab-content.js.map +0 -1
  1215. package/esm2022/tabs/lib/tab-content-def.js +0 -14
  1216. package/esm2022/tabs/lib/tab-content-def.js.map +0 -1
  1217. package/esm2022/tabs/lib/tab-def.js +0 -17
  1218. package/esm2022/tabs/lib/tab-def.js.map +0 -1
  1219. package/esm2022/tabs/lib/tab-group-token.js +0 -3
  1220. package/esm2022/tabs/lib/tab-group-token.js.map +0 -1
  1221. package/esm2022/tabs/lib/tab-item/tab-item.js +0 -44
  1222. package/esm2022/tabs/lib/tab-item/tab-item.js.map +0 -1
  1223. package/esm2022/tabs/lib/tabs/tabs.js +0 -542
  1224. package/esm2022/tabs/lib/tabs/tabs.js.map +0 -1
  1225. package/esm2022/tabs/lib/tabs.service.js +0 -83
  1226. package/esm2022/tabs/lib/tabs.service.js.map +0 -1
  1227. package/esm2022/tabs/malva-ui-core-tabs.js +0 -5
  1228. package/esm2022/tabs/malva-ui-core-tabs.js.map +0 -1
  1229. package/esm2022/textarea/index.js +0 -2
  1230. package/esm2022/textarea/index.js.map +0 -1
  1231. package/esm2022/textarea/lib/textarea/textarea.js +0 -194
  1232. package/esm2022/textarea/lib/textarea/textarea.js.map +0 -1
  1233. package/esm2022/textarea/malva-ui-core-textarea.js +0 -5
  1234. package/esm2022/textarea/malva-ui-core-textarea.js.map +0 -1
  1235. package/esm2022/tile/index.js +0 -3
  1236. package/esm2022/tile/index.js.map +0 -1
  1237. package/esm2022/tile/lib/tile/tile.js +0 -39
  1238. package/esm2022/tile/lib/tile/tile.js.map +0 -1
  1239. package/esm2022/tile/lib/tile-header.js +0 -14
  1240. package/esm2022/tile/lib/tile-header.js.map +0 -1
  1241. package/esm2022/tile/malva-ui-core-tile.js +0 -5
  1242. package/esm2022/tile/malva-ui-core-tile.js.map +0 -1
  1243. package/esm2022/time-picker/index.js +0 -2
  1244. package/esm2022/time-picker/index.js.map +0 -1
  1245. package/esm2022/time-picker/lib/time-picker/time-picker.js +0 -310
  1246. package/esm2022/time-picker/lib/time-picker/time-picker.js.map +0 -1
  1247. package/esm2022/time-picker/lib/time-picker-column/time-picker-column.js +0 -216
  1248. package/esm2022/time-picker/lib/time-picker-column/time-picker-column.js.map +0 -1
  1249. package/esm2022/time-picker/malva-ui-core-time-picker.js +0 -5
  1250. package/esm2022/time-picker/malva-ui-core-time-picker.js.map +0 -1
  1251. package/esm2022/timeline/index.js +0 -6
  1252. package/esm2022/timeline/index.js.map +0 -1
  1253. package/esm2022/timeline/lib/timeline/timeline-item-icon.js +0 -31
  1254. package/esm2022/timeline/lib/timeline/timeline-item-icon.js.map +0 -1
  1255. package/esm2022/timeline/lib/timeline/timeline-item-meta.js +0 -31
  1256. package/esm2022/timeline/lib/timeline/timeline-item-meta.js.map +0 -1
  1257. package/esm2022/timeline/lib/timeline/timeline-item.js +0 -69
  1258. package/esm2022/timeline/lib/timeline/timeline-item.js.map +0 -1
  1259. package/esm2022/timeline/lib/timeline/timeline.js +0 -36
  1260. package/esm2022/timeline/lib/timeline/timeline.js.map +0 -1
  1261. package/esm2022/timeline/lib/timeline/timeline.types.js +0 -1
  1262. package/esm2022/timeline/lib/timeline/timeline.types.js.map +0 -1
  1263. package/esm2022/timeline/malva-ui-core-timeline.js +0 -5
  1264. package/esm2022/timeline/malva-ui-core-timeline.js.map +0 -1
  1265. package/esm2022/title/index.js +0 -2
  1266. package/esm2022/title/index.js.map +0 -1
  1267. package/esm2022/title/lib/title/title.js +0 -171
  1268. package/esm2022/title/lib/title/title.js.map +0 -1
  1269. package/esm2022/title/malva-ui-core-title.js +0 -5
  1270. package/esm2022/title/malva-ui-core-title.js.map +0 -1
  1271. package/esm2022/toast/index.js +0 -13
  1272. package/esm2022/toast/index.js.map +0 -1
  1273. package/esm2022/toast/lib/abstract-toast-container.js +0 -50
  1274. package/esm2022/toast/lib/abstract-toast-container.js.map +0 -1
  1275. package/esm2022/toast/lib/abstract-toast-item.js +0 -75
  1276. package/esm2022/toast/lib/abstract-toast-item.js.map +0 -1
  1277. package/esm2022/toast/lib/abstract-toast.service.js +0 -176
  1278. package/esm2022/toast/lib/abstract-toast.service.js.map +0 -1
  1279. package/esm2022/toast/lib/toast-container/toast-container.js +0 -61
  1280. package/esm2022/toast/lib/toast-container/toast-container.js.map +0 -1
  1281. package/esm2022/toast/lib/toast-item/toast-item.js +0 -62
  1282. package/esm2022/toast/lib/toast-item/toast-item.js.map +0 -1
  1283. package/esm2022/toast/lib/toast-ref.js +0 -54
  1284. package/esm2022/toast/lib/toast-ref.js.map +0 -1
  1285. package/esm2022/toast/lib/toast-timer.js +0 -37
  1286. package/esm2022/toast/lib/toast-timer.js.map +0 -1
  1287. package/esm2022/toast/lib/toast.directives.js +0 -76
  1288. package/esm2022/toast/lib/toast.directives.js.map +0 -1
  1289. package/esm2022/toast/lib/toast.service.js +0 -127
  1290. package/esm2022/toast/lib/toast.service.js.map +0 -1
  1291. package/esm2022/toast/lib/toast.types.js +0 -39
  1292. package/esm2022/toast/lib/toast.types.js.map +0 -1
  1293. package/esm2022/toast/malva-ui-core-toast.js +0 -5
  1294. package/esm2022/toast/malva-ui-core-toast.js.map +0 -1
  1295. package/esm2022/tokenizer/index.js +0 -4
  1296. package/esm2022/tokenizer/index.js.map +0 -1
  1297. package/esm2022/tokenizer/lib/token/token.js +0 -123
  1298. package/esm2022/tokenizer/lib/token/token.js.map +0 -1
  1299. package/esm2022/tokenizer/lib/token-template.js +0 -23
  1300. package/esm2022/tokenizer/lib/token-template.js.map +0 -1
  1301. package/esm2022/tokenizer/lib/tokenizer/tokenizer.js +0 -324
  1302. package/esm2022/tokenizer/lib/tokenizer/tokenizer.js.map +0 -1
  1303. package/esm2022/tokenizer/malva-ui-core-tokenizer.js +0 -5
  1304. package/esm2022/tokenizer/malva-ui-core-tokenizer.js.map +0 -1
  1305. package/esm2022/toolbar/index.js +0 -4
  1306. package/esm2022/toolbar/index.js.map +0 -1
  1307. package/esm2022/toolbar/lib/toolbar/toolbar-spacer.js +0 -13
  1308. package/esm2022/toolbar/lib/toolbar/toolbar-spacer.js.map +0 -1
  1309. package/esm2022/toolbar/lib/toolbar/toolbar-widget.js +0 -106
  1310. package/esm2022/toolbar/lib/toolbar/toolbar-widget.js.map +0 -1
  1311. package/esm2022/toolbar/lib/toolbar/toolbar.js +0 -19
  1312. package/esm2022/toolbar/lib/toolbar/toolbar.js.map +0 -1
  1313. package/esm2022/toolbar/malva-ui-core-toolbar.js +0 -5
  1314. package/esm2022/toolbar/malva-ui-core-toolbar.js.map +0 -1
  1315. package/esm2022/tooltip/index.js +0 -4
  1316. package/esm2022/tooltip/index.js.map +0 -1
  1317. package/esm2022/tooltip/lib/tooltip/tooltip-panel.js +0 -69
  1318. package/esm2022/tooltip/lib/tooltip/tooltip-panel.js.map +0 -1
  1319. package/esm2022/tooltip/lib/tooltip/tooltip.js +0 -352
  1320. package/esm2022/tooltip/lib/tooltip/tooltip.js.map +0 -1
  1321. package/esm2022/tooltip/lib/tooltip/tooltip.types.js +0 -1
  1322. package/esm2022/tooltip/lib/tooltip/tooltip.types.js.map +0 -1
  1323. package/esm2022/tooltip/malva-ui-core-tooltip.js +0 -5
  1324. package/esm2022/tooltip/malva-ui-core-tooltip.js.map +0 -1
  1325. package/esm2022/tree/index.js +0 -5
  1326. package/esm2022/tree/index.js.map +0 -1
  1327. package/esm2022/tree/lib/tree/tree-context.js +0 -7
  1328. package/esm2022/tree/lib/tree/tree-context.js.map +0 -1
  1329. package/esm2022/tree/lib/tree/tree-node-def.js +0 -34
  1330. package/esm2022/tree/lib/tree/tree-node-def.js.map +0 -1
  1331. package/esm2022/tree/lib/tree/tree-node.js +0 -1
  1332. package/esm2022/tree/lib/tree/tree-node.js.map +0 -1
  1333. package/esm2022/tree/lib/tree/tree-subtree.js +0 -107
  1334. package/esm2022/tree/lib/tree/tree-subtree.js.map +0 -1
  1335. package/esm2022/tree/lib/tree/tree.js +0 -362
  1336. package/esm2022/tree/lib/tree/tree.js.map +0 -1
  1337. package/esm2022/tree/malva-ui-core-tree.js +0 -5
  1338. package/esm2022/tree/malva-ui-core-tree.js.map +0 -1
  1339. package/expand/index.d.ts +0 -2
  1340. package/expand/lib/expand/expand-content.d.ts +0 -26
  1341. package/expand/lib/expand/expand.d.ts +0 -74
  1342. package/expand/malva-ui-core-expand.d.ts +0 -5
  1343. package/file-upload/index.d.ts +0 -4
  1344. package/file-upload/lib/file-upload/file-upload.d.ts +0 -138
  1345. package/file-upload/lib/file-upload/file-upload.types.d.ts +0 -42
  1346. package/file-upload/lib/file-upload-action.d.ts +0 -53
  1347. package/file-upload/lib/file-upload-item/file-upload-item.d.ts +0 -30
  1348. package/file-upload/malva-ui-core-file-upload.d.ts +0 -5
  1349. package/filter/index.d.ts +0 -3
  1350. package/filter/lib/filter/filter.d.ts +0 -156
  1351. package/filter/lib/filter.types.d.ts +0 -75
  1352. package/filter/lib/smart-filter-bar/smart-filter-bar.d.ts +0 -153
  1353. package/filter/malva-ui-core-filter.d.ts +0 -5
  1354. package/form/index.d.ts +0 -6
  1355. package/form/lib/fieldset/fieldset.d.ts +0 -58
  1356. package/form/lib/fieldset-span.d.ts +0 -28
  1357. package/form/lib/form/form.d.ts +0 -37
  1358. package/form/lib/form-actions.d.ts +0 -20
  1359. package/form/lib/form-gap.d.ts +0 -5
  1360. package/form/lib/form-header.d.ts +0 -18
  1361. package/form/lib/form.types.d.ts +0 -13
  1362. package/form/malva-ui-core-form.d.ts +0 -5
  1363. package/form-utils/index.d.ts +0 -15
  1364. package/form-utils/lib/aria-value-bridge.d.ts +0 -45
  1365. package/form-utils/lib/description/description.d.ts +0 -16
  1366. package/form-utils/lib/focusable-group-base.d.ts +0 -76
  1367. package/form-utils/lib/form-control-base/signal-form-control-base.d.ts +0 -159
  1368. package/form-utils/lib/form-control-sides.d.ts +0 -20
  1369. package/form-utils/lib/form-control-wrapper/form-control-wrapper-control.d.ts +0 -6
  1370. package/form-utils/lib/form-control-wrapper/form-control-wrapper.d.ts +0 -20
  1371. package/form-utils/lib/form-field/form-field.d.ts +0 -68
  1372. package/form-utils/lib/hint/hint.d.ts +0 -5
  1373. package/form-utils/lib/label/label.d.ts +0 -22
  1374. package/form-utils/lib/message/message.d.ts +0 -7
  1375. package/form-utils/lib/models/error-display-strategy.d.ts +0 -1
  1376. package/form-utils/lib/models/form-control-connector.d.ts +0 -41
  1377. package/form-utils/lib/models/form-state.d.ts +0 -1
  1378. package/form-utils/lib/selection.service.d.ts +0 -27
  1379. package/form-utils/malva-ui-core-form-utils.d.ts +0 -5
  1380. package/form-utils/testing/index.d.ts +0 -1
  1381. package/form-utils/testing/lib/forms-binding-matrix.d.ts +0 -47
  1382. package/form-utils/testing/malva-ui-core-form-utils-testing.d.ts +0 -5
  1383. package/index.d.ts +0 -69
  1384. package/input/index.d.ts +0 -3
  1385. package/input/lib/input/input-native.d.ts +0 -36
  1386. package/input/lib/input/input-value-accessor.d.ts +0 -11
  1387. package/input/lib/input/input.d.ts +0 -189
  1388. package/input/lib/input/password-strength.d.ts +0 -34
  1389. package/input/malva-ui-core-input.d.ts +0 -5
  1390. package/kbd/index.d.ts +0 -1
  1391. package/kbd/lib/kbd/kbd.d.ts +0 -52
  1392. package/kbd/malva-ui-core-kbd.d.ts +0 -5
  1393. package/layout/index.d.ts +0 -4
  1394. package/layout/lib/layout/directives/MlvLayoutSide.d.ts +0 -6
  1395. package/layout/lib/layout/directives/MlvLayoutTop.d.ts +0 -6
  1396. package/layout/lib/layout/layout.d.ts +0 -20
  1397. package/layout/lib/layout/services/theme.service.d.ts +0 -33
  1398. package/layout/malva-ui-core-layout.d.ts +0 -5
  1399. package/link/index.d.ts +0 -2
  1400. package/link/lib/link/link.d.ts +0 -15
  1401. package/link/lib/link/link.directives.d.ts +0 -10
  1402. package/link/malva-ui-core-link.d.ts +0 -5
  1403. package/list/index.d.ts +0 -13
  1404. package/list/lib/list/list.d.ts +0 -25
  1405. package/list/lib/list-item/list-item.d.ts +0 -67
  1406. package/list/lib/list-item-actions.d.ts +0 -12
  1407. package/list/lib/list-item-byline.d.ts +0 -5
  1408. package/list/lib/list-item-group/list-item-group.d.ts +0 -11
  1409. package/list/lib/list-item-link/list-item-link.d.ts +0 -8
  1410. package/list/lib/list-item-media.d.ts +0 -5
  1411. package/list/lib/list-item-meta.d.ts +0 -5
  1412. package/list/lib/list-item-prefix.d.ts +0 -5
  1413. package/list/lib/list-item-suffix.d.ts +0 -5
  1414. package/list/lib/list-item-template.d.ts +0 -10
  1415. package/list/lib/list-item-title.d.ts +0 -5
  1416. package/list/lib/list-selectable.d.ts +0 -73
  1417. package/list/malva-ui-core-list.d.ts +0 -5
  1418. package/loader/index.d.ts +0 -1
  1419. package/loader/lib/loader/loader.d.ts +0 -84
  1420. package/loader/malva-ui-core-loader.d.ts +0 -5
  1421. package/malva-ui-core.d.ts +0 -5
  1422. package/menu/index.d.ts +0 -9
  1423. package/menu/lib/menu/menu-group-label.d.ts +0 -22
  1424. package/menu/lib/menu/menu-group.d.ts +0 -27
  1425. package/menu/lib/menu/menu-item.d.ts +0 -76
  1426. package/menu/lib/menu/menu-separator.d.ts +0 -18
  1427. package/menu/lib/menu/menu-trigger.d.ts +0 -255
  1428. package/menu/lib/menu/menu.d.ts +0 -149
  1429. package/menu/lib/menu/menu.types.d.ts +0 -13
  1430. package/menu/lib/menu/menubar.d.ts +0 -131
  1431. package/menu/lib/menu/menubar.types.d.ts +0 -82
  1432. package/menu/lib/menu/submenu-aim.d.ts +0 -10
  1433. package/menu/malva-ui-core-menu.d.ts +0 -5
  1434. package/notification/index.d.ts +0 -4
  1435. package/notification/lib/notification-item/notification-item.d.ts +0 -20
  1436. package/notification/lib/notification-ref.d.ts +0 -12
  1437. package/notification/lib/notification.service.d.ts +0 -43
  1438. package/notification/lib/notification.types.d.ts +0 -52
  1439. package/notification/malva-ui-core-notification.d.ts +0 -5
  1440. package/number-input/index.d.ts +0 -1
  1441. package/number-input/lib/number-input/number-input.d.ts +0 -162
  1442. package/number-input/malva-ui-core-number-input.d.ts +0 -5
  1443. package/page/index.d.ts +0 -14
  1444. package/page/lib/page/page-scroll.token.d.ts +0 -19
  1445. package/page/lib/page/page-snap-controller.d.ts +0 -87
  1446. package/page/lib/page/page-snap.directive.d.ts +0 -40
  1447. package/page/lib/page/page.d.ts +0 -74
  1448. package/page/lib/page-content/page-aside.d.ts +0 -7
  1449. package/page/lib/page-content/page-content.d.ts +0 -37
  1450. package/page/lib/page-dock/page-dock.d.ts +0 -50
  1451. package/page/lib/page-dock/page-dock.slots.d.ts +0 -16
  1452. package/page/lib/page-header/page-header.d.ts +0 -77
  1453. package/page/lib/page-header/page-header.directives.d.ts +0 -50
  1454. package/page/lib/page-shell/page-shell-color.d.ts +0 -48
  1455. package/page/lib/page-shell/page-shell-css-color.d.ts +0 -20
  1456. package/page/lib/page-shell/page-shell.d.ts +0 -44
  1457. package/page/lib/page-shell/page-shell.slots.d.ts +0 -16
  1458. package/page/lib/page-summary/page-summary-item.d.ts +0 -11
  1459. package/page/lib/page-summary/page-summary.d.ts +0 -36
  1460. package/page/malva-ui-core-page.d.ts +0 -5
  1461. package/pagination/index.d.ts +0 -4
  1462. package/pagination/lib/pagination/pagination.d.ts +0 -182
  1463. package/pagination/lib/pagination/pagination.directives.d.ts +0 -44
  1464. package/pagination/lib/pagination/pagination.model.d.ts +0 -6
  1465. package/pagination/lib/pagination/pagination.service.d.ts +0 -26
  1466. package/pagination/malva-ui-core-pagination.d.ts +0 -5
  1467. package/pin-input/index.d.ts +0 -2
  1468. package/pin-input/lib/pin-input/pin-input-separator.d.ts +0 -24
  1469. package/pin-input/lib/pin-input/pin-input.d.ts +0 -176
  1470. package/pin-input/malva-ui-core-pin-input.d.ts +0 -5
  1471. package/popup/index.d.ts +0 -9
  1472. package/popup/lib/popup/popup.d.ts +0 -343
  1473. package/popup/lib/popup-container/popup-container.d.ts +0 -61
  1474. package/popup/lib/popup-container/popup-container.token.d.ts +0 -34
  1475. package/popup/lib/popup-content.d.ts +0 -6
  1476. package/popup/lib/popup-header-content.d.ts +0 -18
  1477. package/popup/lib/popup-pinned-content.d.ts +0 -17
  1478. package/popup/lib/popup-positions.d.ts +0 -105
  1479. package/popup/lib/popup-trigger/popup-trigger.d.ts +0 -102
  1480. package/popup/lib/popup.service.d.ts +0 -159
  1481. package/popup/malva-ui-core-popup.d.ts +0 -5
  1482. package/progress/index.d.ts +0 -1
  1483. package/progress/lib/progress/progress.d.ts +0 -69
  1484. package/progress/malva-ui-core-progress.d.ts +0 -5
  1485. package/radio/index.d.ts +0 -2
  1486. package/radio/lib/radio/radio.d.ts +0 -87
  1487. package/radio/lib/radio-group/radio-group.d.ts +0 -35
  1488. package/radio/lib/radio-group-token.d.ts +0 -7
  1489. package/radio/malva-ui-core-radio.d.ts +0 -5
  1490. package/rating/index.d.ts +0 -1
  1491. package/rating/lib/rating/rating.d.ts +0 -100
  1492. package/rating/malva-ui-core-rating.d.ts +0 -5
  1493. package/scrollbar/index.d.ts +0 -1
  1494. package/scrollbar/lib/scrollbar/scrollbar.d.ts +0 -166
  1495. package/scrollbar/malva-ui-core-scrollbar.d.ts +0 -5
  1496. package/search-field/index.d.ts +0 -2
  1497. package/search-field/lib/search-field/search-field.d.ts +0 -347
  1498. package/search-field/lib/search-field/search-overlay-content.d.ts +0 -59
  1499. package/search-field/malva-ui-core-search-field.d.ts +0 -5
  1500. package/segmented/index.d.ts +0 -4
  1501. package/segmented/lib/segmented/segmented.d.ts +0 -80
  1502. package/segmented/lib/segmented-item/segmented-item.d.ts +0 -89
  1503. package/segmented/lib/segmented-token.d.ts +0 -22
  1504. package/segmented/lib/segmented.types.d.ts +0 -9
  1505. package/segmented/malva-ui-core-segmented.d.ts +0 -5
  1506. package/select/index.d.ts +0 -3
  1507. package/select/lib/select/select.d.ts +0 -379
  1508. package/select/lib/select-option.d.ts +0 -1
  1509. package/select/lib/select-template.directives.d.ts +0 -14
  1510. package/select/malva-ui-core-select.d.ts +0 -5
  1511. package/sidebar/index.d.ts +0 -15
  1512. package/sidebar/lib/sidebar/sidebar.d.ts +0 -134
  1513. package/sidebar/lib/sidebar-content.d.ts +0 -11
  1514. package/sidebar/lib/sidebar-context.d.ts +0 -23
  1515. package/sidebar/lib/sidebar-footer.d.ts +0 -9
  1516. package/sidebar/lib/sidebar-group/sidebar-group.d.ts +0 -127
  1517. package/sidebar/lib/sidebar-header.d.ts +0 -9
  1518. package/sidebar/lib/sidebar-item/sidebar-item.d.ts +0 -104
  1519. package/sidebar/lib/sidebar-item-host.d.ts +0 -18
  1520. package/sidebar/lib/sidebar-item-icon.d.ts +0 -6
  1521. package/sidebar/lib/sidebar-mode.d.ts +0 -2
  1522. package/sidebar/lib/sidebar-rail/sidebar-rail.d.ts +0 -54
  1523. package/sidebar/lib/sidebar-trigger/sidebar-trigger.d.ts +0 -67
  1524. package/sidebar/lib/sidebar-workspace/sidebar-workspace.d.ts +0 -54
  1525. package/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.d.ts +0 -19
  1526. package/sidebar/lib/sidebar-workspace/sidebar-workspace.types.d.ts +0 -20
  1527. package/sidebar/malva-ui-core-sidebar.d.ts +0 -5
  1528. package/skeleton/index.d.ts +0 -1
  1529. package/skeleton/lib/skeleton/skeleton.d.ts +0 -60
  1530. package/skeleton/malva-ui-core-skeleton.d.ts +0 -5
  1531. package/slider/index.d.ts +0 -2
  1532. package/slider/lib/slider/slider-tooltip-def.d.ts +0 -39
  1533. package/slider/lib/slider/slider.d.ts +0 -171
  1534. package/slider/malva-ui-core-slider.d.ts +0 -5
  1535. package/split-pane/index.d.ts +0 -3
  1536. package/split-pane/lib/split-pane/split-pane-panel.d.ts +0 -34
  1537. package/split-pane/lib/split-pane/split-pane.d.ts +0 -98
  1538. package/split-pane/lib/split-pane/split-pane.types.d.ts +0 -7
  1539. package/split-pane/malva-ui-core-split-pane.d.ts +0 -5
  1540. package/status-indicator/index.d.ts +0 -1
  1541. package/status-indicator/lib/status-indicator/status-indicator.d.ts +0 -61
  1542. package/status-indicator/malva-ui-core-status-indicator.d.ts +0 -5
  1543. package/stepper/index.d.ts +0 -4
  1544. package/stepper/lib/stepper/step-header.d.ts +0 -34
  1545. package/stepper/lib/stepper/step.d.ts +0 -51
  1546. package/stepper/lib/stepper/stepper-token.d.ts +0 -13
  1547. package/stepper/lib/stepper/stepper.d.ts +0 -98
  1548. package/stepper/lib/stepper/stepper.types.d.ts +0 -4
  1549. package/stepper/malva-ui-core-stepper.d.ts +0 -5
  1550. package/switch/index.d.ts +0 -2
  1551. package/switch/lib/switch/switch.d.ts +0 -118
  1552. package/switch/lib/switch-group/switch-group.d.ts +0 -24
  1553. package/switch/lib/switch-group-token.d.ts +0 -6
  1554. package/switch/malva-ui-core-switch.d.ts +0 -5
  1555. package/tabs/index.d.ts +0 -8
  1556. package/tabs/lib/tab/tab.d.ts +0 -46
  1557. package/tabs/lib/tab-content/tab-content.d.ts +0 -11
  1558. package/tabs/lib/tab-content-def.d.ts +0 -6
  1559. package/tabs/lib/tab-def.d.ts +0 -11
  1560. package/tabs/lib/tab-group-token.d.ts +0 -10
  1561. package/tabs/lib/tab-item/tab-item.d.ts +0 -28
  1562. package/tabs/lib/tabs/tabs.d.ts +0 -202
  1563. package/tabs/lib/tabs.service.d.ts +0 -24
  1564. package/tabs/malva-ui-core-tabs.d.ts +0 -5
  1565. package/textarea/index.d.ts +0 -1
  1566. package/textarea/lib/textarea/textarea.d.ts +0 -77
  1567. package/textarea/malva-ui-core-textarea.d.ts +0 -5
  1568. package/tile/index.d.ts +0 -2
  1569. package/tile/lib/tile/tile.d.ts +0 -20
  1570. package/tile/lib/tile-header.d.ts +0 -6
  1571. package/tile/malva-ui-core-tile.d.ts +0 -5
  1572. package/time-picker/index.d.ts +0 -1
  1573. package/time-picker/lib/time-picker/time-picker.d.ts +0 -135
  1574. package/time-picker/lib/time-picker-column/time-picker-column.d.ts +0 -111
  1575. package/time-picker/malva-ui-core-time-picker.d.ts +0 -5
  1576. package/timeline/index.d.ts +0 -5
  1577. package/timeline/lib/timeline/timeline-item-icon.d.ts +0 -24
  1578. package/timeline/lib/timeline/timeline-item-meta.d.ts +0 -24
  1579. package/timeline/lib/timeline/timeline-item.d.ts +0 -52
  1580. package/timeline/lib/timeline/timeline.d.ts +0 -27
  1581. package/timeline/lib/timeline/timeline.types.d.ts +0 -18
  1582. package/timeline/malva-ui-core-timeline.d.ts +0 -5
  1583. package/title/index.d.ts +0 -1
  1584. package/title/lib/title/title.d.ts +0 -63
  1585. package/title/malva-ui-core-title.d.ts +0 -5
  1586. package/toast/index.d.ts +0 -10
  1587. package/toast/lib/abstract-toast-container.d.ts +0 -29
  1588. package/toast/lib/abstract-toast-item.d.ts +0 -44
  1589. package/toast/lib/abstract-toast.service.d.ts +0 -75
  1590. package/toast/lib/toast-container/toast-container.d.ts +0 -23
  1591. package/toast/lib/toast-item/toast-item.d.ts +0 -25
  1592. package/toast/lib/toast-ref.d.ts +0 -33
  1593. package/toast/lib/toast-timer.d.ts +0 -24
  1594. package/toast/lib/toast.directives.d.ts +0 -13
  1595. package/toast/lib/toast.service.d.ts +0 -41
  1596. package/toast/lib/toast.types.d.ts +0 -139
  1597. package/toast/malva-ui-core-toast.d.ts +0 -5
  1598. package/tokenizer/index.d.ts +0 -3
  1599. package/tokenizer/lib/token/token.d.ts +0 -60
  1600. package/tokenizer/lib/token-template.d.ts +0 -29
  1601. package/tokenizer/lib/tokenizer/tokenizer.d.ts +0 -109
  1602. package/tokenizer/malva-ui-core-tokenizer.d.ts +0 -5
  1603. package/toolbar/index.d.ts +0 -3
  1604. package/toolbar/lib/toolbar/toolbar-spacer.d.ts +0 -5
  1605. package/toolbar/lib/toolbar/toolbar-widget.d.ts +0 -75
  1606. package/toolbar/lib/toolbar/toolbar.d.ts +0 -8
  1607. package/toolbar/malva-ui-core-toolbar.d.ts +0 -5
  1608. package/tooltip/index.d.ts +0 -3
  1609. package/tooltip/lib/tooltip/tooltip-panel.d.ts +0 -26
  1610. package/tooltip/lib/tooltip/tooltip.d.ts +0 -148
  1611. package/tooltip/lib/tooltip/tooltip.types.d.ts +0 -17
  1612. package/tooltip/malva-ui-core-tooltip.d.ts +0 -5
  1613. package/tree/index.d.ts +0 -4
  1614. package/tree/lib/tree/tree-context.d.ts +0 -62
  1615. package/tree/lib/tree/tree-node-def.d.ts +0 -33
  1616. package/tree/lib/tree/tree-node.d.ts +0 -45
  1617. package/tree/lib/tree/tree-subtree.d.ts +0 -63
  1618. package/tree/lib/tree/tree.d.ts +0 -156
  1619. package/tree/malva-ui-core-tree.d.ts +0 -5
@@ -0,0 +1,2540 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, signal, inject, DestroyRef, NgZone, ElementRef, input, output, ViewContainerRef, afterRenderEffect, Renderer2, effect, Directive, computed, Injector, viewChild, forwardRef, runInInjectionContext, ChangeDetectionStrategy, ViewEncapsulation, Component, TemplateRef, contentChildren, contentChild, untracked, HostAttributeToken } from '@angular/core';
3
+ import { FocusKeyManager } from '@angular/cdk/a11y';
4
+ import { RIGHT_ARROW, UP_ARROW, DOWN_ARROW, LEFT_ARROW } from '@angular/cdk/keycodes';
5
+ import { MlvPopupService, SUBMENU_POSITIONS, MENU_POSITIONS, MlvPopup, MlvPopupContent } from '@malva-ui/core/popup';
6
+ import { MlvListItem, MlvList } from '@malva-ui/core/list';
7
+ import { MlvLoader } from '@malva-ui/core/loader';
8
+ import { MlvRtlService, mlvNextId } from '@malva-ui/cdk/utils';
9
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
10
+ import { NgTemplateOutlet } from '@angular/common';
11
+ import { MlvDataSource } from '@malva-ui/cdk/data-source';
12
+
13
+ /** Injection token for the nearest `mlv-menu` item registry. */
14
+ const MLV_MENU_ITEM_REGISTRY = new InjectionToken('MLV_MENU_ITEM_REGISTRY');
15
+ /** Signal-backed ordered item registry used by `mlv-menu`. */
16
+ class MlvMenuItemRegistryStore {
17
+ _items = signal([], /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
19
+ _mutationObserver = null;
20
+ _observedContainer = null;
21
+ items = this._items.asReadonly();
22
+ register(item) {
23
+ this._items.update((items) => items.includes(item) ? items : [...items, item]);
24
+ this._syncObservedContainer();
25
+ this._resyncItems();
26
+ }
27
+ unregister(item) {
28
+ this._items.update((items) => {
29
+ const nextItems = items.filter((candidate) => candidate !== item);
30
+ return nextItems.length === items.length ? items : nextItems;
31
+ });
32
+ this._syncObservedContainer();
33
+ this._resyncItems();
34
+ }
35
+ resync() {
36
+ this._syncObservedContainer();
37
+ this._resyncItems();
38
+ }
39
+ syncOrder(items) {
40
+ this._items.update((currentItems) => {
41
+ const orderedItems = items.filter((item) => currentItems.includes(item));
42
+ const unorderedItems = currentItems.filter((item) => !orderedItems.includes(item));
43
+ const nextItems = [
44
+ ...orderedItems,
45
+ ...[...unorderedItems].sort(mlvCompareMenuItemsByDomOrder),
46
+ ];
47
+ return mlvMenuItemsMatchOrder(currentItems, nextItems)
48
+ ? currentItems
49
+ : nextItems;
50
+ });
51
+ this._syncObservedContainer();
52
+ }
53
+ _syncObservedContainer() {
54
+ const nextContainer = mlvGetSharedMenuContainer(this._items());
55
+ if (nextContainer === this._observedContainer) {
56
+ return;
57
+ }
58
+ this._mutationObserver?.disconnect();
59
+ this._observedContainer = nextContainer;
60
+ if (!nextContainer) {
61
+ this._mutationObserver = null;
62
+ return;
63
+ }
64
+ this._mutationObserver = new MutationObserver(() => this._resyncItems());
65
+ this._mutationObserver.observe(nextContainer, {
66
+ childList: true,
67
+ subtree: true,
68
+ });
69
+ }
70
+ _resyncItems() {
71
+ this._items.update((items) => {
72
+ if (items.length < 2) {
73
+ return items;
74
+ }
75
+ const nextItems = [...items].sort(mlvCompareMenuItemsByDomOrder);
76
+ return mlvMenuItemsMatchOrder(items, nextItems) ? items : nextItems;
77
+ });
78
+ }
79
+ }
80
+ function mlvCompareMenuItemsByDomOrder(a, b) {
81
+ const aEl = a._elementRef?.nativeElement;
82
+ const bEl = b._elementRef?.nativeElement;
83
+ if (!aEl || !bEl || aEl === bEl) {
84
+ return 0;
85
+ }
86
+ const panelContainer = mlvGetSharedMenuItemContainer(aEl, bEl, '[role="menu"]');
87
+ if (panelContainer) {
88
+ return mlvCompareWithinContainer(panelContainer, '[role="menuitem"]', aEl, bEl);
89
+ }
90
+ const hostContainer = mlvGetSharedMenuItemContainer(aEl, bEl, 'mlv-menu');
91
+ if (hostContainer) {
92
+ return mlvCompareWithinContainer(hostContainer, 'mlv-list-item[mlvMenuItem]', aEl, bEl);
93
+ }
94
+ const position = aEl.compareDocumentPosition(bEl);
95
+ if (position & Node.DOCUMENT_POSITION_DISCONNECTED) {
96
+ return 0;
97
+ }
98
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING)
99
+ return -1;
100
+ if (position & Node.DOCUMENT_POSITION_PRECEDING)
101
+ return 1;
102
+ return 0;
103
+ }
104
+ function mlvGetSharedMenuContainer(items) {
105
+ const containers = items
106
+ .map((item) => item._elementRef?.nativeElement)
107
+ .filter((element) => element instanceof HTMLElement)
108
+ .map((element) => element.closest('[role="menu"]') ?? element.closest('mlv-menu'))
109
+ .filter((container) => container instanceof HTMLElement);
110
+ if (containers.length === 0) {
111
+ return null;
112
+ }
113
+ const [firstContainer, ...restContainers] = containers;
114
+ return restContainers.every((container) => container === firstContainer)
115
+ ? firstContainer
116
+ : null;
117
+ }
118
+ function mlvMenuItemsMatchOrder(currentItems, nextItems) {
119
+ return currentItems.every((item, index) => item === nextItems[index]);
120
+ }
121
+ function mlvGetSharedMenuItemContainer(aEl, bEl, selector) {
122
+ const aContainer = mlvAsHtmlElement(aEl.closest(selector));
123
+ const bContainer = mlvAsHtmlElement(bEl.closest(selector));
124
+ return aContainer && aContainer === bContainer ? aContainer : null;
125
+ }
126
+ function mlvAsHtmlElement(element) {
127
+ return element instanceof HTMLElement ? element : null;
128
+ }
129
+ function mlvCompareWithinContainer(container, itemSelector, aEl, bEl) {
130
+ const orderedItems = Array.from(container.querySelectorAll(itemSelector));
131
+ const aIndex = orderedItems.indexOf(aEl);
132
+ const bIndex = orderedItems.indexOf(bEl);
133
+ if (aIndex === -1 || bIndex === -1 || aIndex === bIndex) {
134
+ return 0;
135
+ }
136
+ return aIndex < bIndex ? -1 : 1;
137
+ }
138
+
139
+ /** Injection token for the parent menu. */
140
+ const MENU_TOKEN = new InjectionToken('MENU_TOKEN');
141
+ /** Internal injector token for generated menu-row submenu behaviour. */
142
+ const MLV_MENU_DATA_ITEM = new InjectionToken('MLV_MENU_DATA_ITEM');
143
+
144
+ /** Injection token for the nearest `mlv-menubar` item registry. */
145
+ const MLV_MENUBAR_ITEM_REGISTRY = new InjectionToken('MLV_MENUBAR_ITEM_REGISTRY');
146
+ /** Signal-backed ordered item registry used by `mlv-menubar`. */
147
+ class MlvMenubarItemRegistryStore {
148
+ _items = signal([], /* @ts-ignore */
149
+ ...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
150
+ _mutationObserver = null;
151
+ _observedContainer = null;
152
+ items = this._items.asReadonly();
153
+ register(item) {
154
+ this._items.update((items) => items.includes(item) ? items : [...items, item]);
155
+ this._syncObservedContainer();
156
+ this._resyncItems();
157
+ }
158
+ unregister(item) {
159
+ this._items.update((items) => {
160
+ const nextItems = items.filter((candidate) => candidate !== item);
161
+ return nextItems.length === items.length ? items : nextItems;
162
+ });
163
+ this._syncObservedContainer();
164
+ this._resyncItems();
165
+ }
166
+ resync() {
167
+ this._syncObservedContainer();
168
+ this._resyncItems();
169
+ }
170
+ syncOrder(items) {
171
+ this._items.update((currentItems) => {
172
+ const orderedItems = items.filter((item) => currentItems.includes(item));
173
+ const unorderedItems = currentItems.filter((item) => !orderedItems.includes(item));
174
+ const nextItems = [
175
+ ...orderedItems,
176
+ ...[...unorderedItems].sort(mlvCompareMenubarItemsByDomOrder),
177
+ ];
178
+ return mlvMenubarItemsMatchOrder(currentItems, nextItems)
179
+ ? currentItems
180
+ : nextItems;
181
+ });
182
+ this._syncObservedContainer();
183
+ }
184
+ _syncObservedContainer() {
185
+ const nextContainer = mlvGetSharedMenubarContainer(this._items());
186
+ if (nextContainer === this._observedContainer) {
187
+ return;
188
+ }
189
+ this._mutationObserver?.disconnect();
190
+ this._observedContainer = nextContainer;
191
+ if (!nextContainer) {
192
+ this._mutationObserver = null;
193
+ return;
194
+ }
195
+ this._mutationObserver = new MutationObserver(() => this._resyncItems());
196
+ this._mutationObserver.observe(nextContainer, {
197
+ childList: true,
198
+ subtree: true,
199
+ });
200
+ }
201
+ _resyncItems() {
202
+ this._items.update((items) => {
203
+ if (items.length < 2) {
204
+ return items;
205
+ }
206
+ const nextItems = [...items].sort(mlvCompareMenubarItemsByDomOrder);
207
+ return mlvMenubarItemsMatchOrder(items, nextItems) ? items : nextItems;
208
+ });
209
+ }
210
+ }
211
+ function mlvCompareMenubarItemsByDomOrder(a, b) {
212
+ const aEl = a._elementRef?.nativeElement;
213
+ const bEl = b._elementRef?.nativeElement;
214
+ if (!aEl || !bEl || aEl === bEl) {
215
+ return 0;
216
+ }
217
+ const position = aEl.compareDocumentPosition(bEl);
218
+ if (position & Node.DOCUMENT_POSITION_DISCONNECTED) {
219
+ return 0;
220
+ }
221
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING)
222
+ return -1;
223
+ if (position & Node.DOCUMENT_POSITION_PRECEDING)
224
+ return 1;
225
+ return 0;
226
+ }
227
+ function mlvGetSharedMenubarContainer(items) {
228
+ const containers = items
229
+ .map((item) => item._elementRef?.nativeElement.closest('mlv-menubar'))
230
+ .filter((container) => container instanceof HTMLElement);
231
+ if (containers.length === 0) {
232
+ return null;
233
+ }
234
+ const [firstContainer, ...restContainers] = containers;
235
+ return restContainers.every((container) => container === firstContainer)
236
+ ? firstContainer
237
+ : null;
238
+ }
239
+ function mlvMenubarItemsMatchOrder(currentItems, nextItems) {
240
+ return currentItems.every((item, index) => item === nextItems[index]);
241
+ }
242
+
243
+ /**
244
+ * Minimum horizontal travel, in CSS pixels, that counts as aiming at the submenu.
245
+ *
246
+ * Without it a purely vertical move qualifies: `deltaX === 0` is not "away from"
247
+ * the submenu, and the cone between the panel's top and bottom corners is very
248
+ * wide when measured from the far side of the item, so sliding straight down the
249
+ * item column read as heading toward the panel and kept cancelling the close.
250
+ *
251
+ * Small enough that a genuine diagonal still registers on the first move, large
252
+ * enough that jitter along one axis does not.
253
+ */
254
+ const MIN_HORIZONTAL_PROGRESS = 2;
255
+ /** Returns whether the current pointer trajectory is heading into a submenu. */
256
+ function isCursorHeadingToSubmenu(currentX, currentY, state) {
257
+ const { lastX, lastY, submenuRect, side } = state;
258
+ const deltaX = currentX - lastX;
259
+ const progress = side === 'right' ? deltaX : -deltaX;
260
+ if (progress < MIN_HORIZONTAL_PROGRESS)
261
+ return false;
262
+ const edgeX = side === 'right' ? submenuRect.left : submenuRect.right;
263
+ const edgeDelta = edgeX - lastX;
264
+ if (Math.abs(edgeDelta) < 1)
265
+ return true;
266
+ const currentSlope = (currentY - lastY) / edgeDelta;
267
+ const topSlope = (submenuRect.top - lastY) / edgeDelta;
268
+ const bottomSlope = (submenuRect.bottom - lastY) / edgeDelta;
269
+ return (currentSlope >= Math.min(topSlope, bottomSlope) &&
270
+ currentSlope <= Math.max(topSlope, bottomSlope));
271
+ }
272
+
273
+ /**
274
+ * Owns the common popup, focus restoration, and submenu hover-intent lifecycle
275
+ * used by explicit and data-generated menu triggers.
276
+ */
277
+ class MlvMenuOverlayController {
278
+ _config;
279
+ /** Whether the controlled menu overlay is currently open. */
280
+ isOpen = signal(false, /* @ts-ignore */
281
+ ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
282
+ _popupService;
283
+ _ngZone;
284
+ _destroyRef = inject(DestroyRef);
285
+ _overlayRef = null;
286
+ _openSubscriptions = [];
287
+ _triangleState = null;
288
+ _closeTimer = null;
289
+ _mousemoveCleanup = null;
290
+ _destroyed = false;
291
+ constructor(_config, dependencies) {
292
+ this._config = _config;
293
+ this._popupService = dependencies?.popupService ?? inject(MlvPopupService);
294
+ this._ngZone = dependencies?.ngZone ?? inject(NgZone);
295
+ this._destroyRef.onDestroy(() => this.destroy());
296
+ }
297
+ /** Opens the menu overlay unless it is already open or disabled. */
298
+ open() {
299
+ if (this._destroyed || this.isOpen() || this._config.isDisabled())
300
+ return;
301
+ const menu = this._config.getMenu();
302
+ const popup = menu._popup();
303
+ const isSubmenu = this._config.isSubmenu();
304
+ const isMenubarChild = this._config.isMenubarChild;
305
+ const positions = isSubmenu ? SUBMENU_POSITIONS : MENU_POSITIONS;
306
+ menu.registerParentMenu(isSubmenu ? this._config.parentMenu : null);
307
+ menu.registerMenubarController(isMenubarChild && this._config.menubar
308
+ ? {
309
+ openNextItemMenu: () => this._config.menubar?.openAdjacentItemMenu(this._config.getMenubarItem(), 1),
310
+ openPreviousItemMenu: () => this._config.menubar?.openAdjacentItemMenu(this._config.getMenubarItem(), -1),
311
+ }
312
+ : null);
313
+ popup.animationState.set('idle');
314
+ this._overlayRef = this._popupService.open({
315
+ origin: this._config.origin,
316
+ template: popup.popupTemplate(),
317
+ vcr: this._config.vcr,
318
+ positions,
319
+ hasBackdrop: !isSubmenu && !isMenubarChild,
320
+ dismissExcludeElements: isMenubarChild && this._config.menubar
321
+ ? [this._config.menubar.hostElement]
322
+ : undefined,
323
+ onClose: () => {
324
+ this._overlayRef = null;
325
+ this.isOpen.set(false);
326
+ popup.animationState.set('idle');
327
+ popup.opened.set(false);
328
+ menu._isOpen.set(false);
329
+ this._openSubscriptions.forEach((subscription) => subscription.unsubscribe());
330
+ this._openSubscriptions = [];
331
+ this._triangleState = null;
332
+ this._removeMousemoveListener();
333
+ this._config.onClosed?.();
334
+ if (isMenubarChild) {
335
+ this._config.menubar?.notifyItemClosed(this._config.getMenubarItem());
336
+ }
337
+ },
338
+ onRequestClose: () => menu.close(),
339
+ onPositionChange: (change) => popup.updateArrowFromPosition(change.connectionPair),
340
+ });
341
+ popup.opened.set(true);
342
+ menu._isOpen.set(true);
343
+ this.isOpen.set(true);
344
+ this._config.onOpened?.();
345
+ if (isMenubarChild) {
346
+ this._config.menubar?.notifyItemOpened(this._config.getMenubarItem());
347
+ }
348
+ const leaveSubscription = popup.leaveAnimationDone$.subscribe(() => {
349
+ this._overlayRef?.close();
350
+ });
351
+ this._openSubscriptions.push(leaveSubscription);
352
+ const closedSubscription = menu.closed.subscribe(() => {
353
+ this._restoreFocusToTrigger();
354
+ if (this._overlayRef) {
355
+ popup.animationState.set('leave');
356
+ }
357
+ });
358
+ this._openSubscriptions.push(closedSubscription);
359
+ queueMicrotask(() => popup.beginEnterAnimation());
360
+ if (isSubmenu) {
361
+ this._setupSubmenuTracking();
362
+ }
363
+ }
364
+ /** Closes the menu overlay when it is open. */
365
+ close() {
366
+ if (!this.isOpen())
367
+ return;
368
+ this._closeOverlay();
369
+ }
370
+ /** Toggles the controlled menu overlay. */
371
+ toggle() {
372
+ if (this.isOpen()) {
373
+ this.close();
374
+ }
375
+ else {
376
+ this.open();
377
+ }
378
+ }
379
+ /** Opens the menu and focuses its first enabled item. */
380
+ openWithFirstItemFocused() {
381
+ this.open();
382
+ if (this.isOpen()) {
383
+ setTimeout(() => this._config.getMenu().focusFirstItem(), 0);
384
+ }
385
+ }
386
+ /** Opens the menu and focuses its last enabled item. */
387
+ openWithLastItemFocused() {
388
+ this.open();
389
+ if (this.isOpen()) {
390
+ setTimeout(() => this._config.getMenu().focusLastItem(), 0);
391
+ }
392
+ }
393
+ /** Handles pointer entry for menubar and submenu triggers. */
394
+ onMouseEnter() {
395
+ if (this._config.isMenubarChild) {
396
+ if (this._config.isDisabled())
397
+ return;
398
+ this._config.menubar?.onItemPointerEnter(this._config.getMenubarItem());
399
+ return;
400
+ }
401
+ if (!this._config.isSubmenu() || this._config.isDisabled())
402
+ return;
403
+ this._clearCloseTimer();
404
+ if (!this.isOpen()) {
405
+ this.open();
406
+ }
407
+ }
408
+ /** Handles pointer exit for submenu triggers using triangle intent. */
409
+ onMouseLeave(event) {
410
+ if (!this._config.isSubmenu())
411
+ return;
412
+ if (this._triangleState?.cursorEnteredSubmenu) {
413
+ const overlayElement = this._overlayRef?.overlayRef.overlayElement;
414
+ const entered = event.relatedTarget;
415
+ const intoSubmenu = entered instanceof Node && !!overlayElement?.contains(entered);
416
+ if (!intoSubmenu)
417
+ this._scheduleClose();
418
+ return;
419
+ }
420
+ if (this._triangleState) {
421
+ const heading = isCursorHeadingToSubmenu(event.clientX, event.clientY, this._triangleState);
422
+ if (heading)
423
+ return;
424
+ }
425
+ this._scheduleClose();
426
+ }
427
+ /** Cleans up listeners and disposes the controlled overlay. */
428
+ destroy() {
429
+ if (this._destroyed)
430
+ return;
431
+ this._destroyed = true;
432
+ this._clearCloseTimer();
433
+ this._removeMousemoveListener();
434
+ this._overlayRef?.close();
435
+ this._overlayRef = null;
436
+ }
437
+ _restoreFocusToTrigger() {
438
+ const overlayElement = this._overlayRef?.overlayRef.overlayElement;
439
+ const active = document.activeElement;
440
+ if (overlayElement && active && overlayElement.contains(active)) {
441
+ this._config.origin.nativeElement.focus();
442
+ }
443
+ }
444
+ _closeOverlay() {
445
+ if (!this._overlayRef)
446
+ return;
447
+ this._config.getMenu()._popup().animationState.set('leave');
448
+ }
449
+ _setupSubmenuTracking() {
450
+ setTimeout(() => {
451
+ if (this._destroyed || !this._overlayRef || !this.isOpen())
452
+ return;
453
+ const overlayElement = this._overlayRef.overlayRef.overlayElement;
454
+ this._triangleState = {
455
+ lastX: 0,
456
+ lastY: 0,
457
+ submenuRect: overlayElement.getBoundingClientRect(),
458
+ side: 'right',
459
+ cursorEnteredSubmenu: false,
460
+ };
461
+ this._installMousemoveListener();
462
+ this._installSubmenuOverlayListeners(overlayElement);
463
+ }, 0);
464
+ }
465
+ _installSubmenuOverlayListeners(overlayElement) {
466
+ const onEnter = () => {
467
+ if (this._triangleState) {
468
+ this._triangleState.cursorEnteredSubmenu = true;
469
+ }
470
+ this._clearCloseTimer();
471
+ this._removeMousemoveListener();
472
+ };
473
+ const onLeave = () => this._scheduleClose();
474
+ this._ngZone.runOutsideAngular(() => {
475
+ overlayElement.addEventListener('mouseenter', onEnter);
476
+ overlayElement.addEventListener('mouseleave', onLeave);
477
+ });
478
+ this._openSubscriptions.push({
479
+ unsubscribe: () => {
480
+ overlayElement.removeEventListener('mouseenter', onEnter);
481
+ overlayElement.removeEventListener('mouseleave', onLeave);
482
+ },
483
+ });
484
+ }
485
+ _installMousemoveListener() {
486
+ this._removeMousemoveListener();
487
+ const handler = (event) => {
488
+ if (!this._triangleState || !this.isOpen())
489
+ return;
490
+ if (this._triangleState.cursorEnteredSubmenu)
491
+ return;
492
+ if (this._config.origin.nativeElement.contains(event.target)) {
493
+ this._clearCloseTimer();
494
+ return;
495
+ }
496
+ if (this._isPointerOnSiblingItem(event.target)) {
497
+ this._ngZone.run(() => this._config.requestClose?.() ?? this.close());
498
+ return;
499
+ }
500
+ const { clientX, clientY } = event;
501
+ const state = this._triangleState;
502
+ const heading = isCursorHeadingToSubmenu(clientX, clientY, state);
503
+ state.lastX = clientX;
504
+ state.lastY = clientY;
505
+ if (heading) {
506
+ this._clearCloseTimer();
507
+ }
508
+ else if (this._overlayRef) {
509
+ state.submenuRect =
510
+ this._overlayRef.overlayRef.overlayElement.getBoundingClientRect();
511
+ if (!isCursorHeadingToSubmenu(clientX, clientY, state)) {
512
+ this._scheduleClose();
513
+ }
514
+ }
515
+ };
516
+ this._ngZone.runOutsideAngular(() => {
517
+ document.addEventListener('mousemove', handler, true);
518
+ this._mousemoveCleanup = () => document.removeEventListener('mousemove', handler, true);
519
+ });
520
+ }
521
+ _isPointerOnSiblingItem(target) {
522
+ if (!(target instanceof Element))
523
+ return false;
524
+ const item = target.closest('[role="menuitem"]');
525
+ if (!item || item === this._config.origin.nativeElement)
526
+ return false;
527
+ const panel = this._config.origin.nativeElement.closest('[role="menu"]');
528
+ return !!panel?.contains(item);
529
+ }
530
+ _removeMousemoveListener() {
531
+ if (this._mousemoveCleanup) {
532
+ this._mousemoveCleanup();
533
+ this._mousemoveCleanup = null;
534
+ }
535
+ }
536
+ _scheduleClose() {
537
+ this._clearCloseTimer();
538
+ this._closeTimer = setTimeout(() => {
539
+ this._ngZone.run(() => this._config.requestClose?.() ?? this.close());
540
+ }, 150);
541
+ }
542
+ _clearCloseTimer() {
543
+ if (this._closeTimer !== null) {
544
+ clearTimeout(this._closeTimer);
545
+ this._closeTimer = null;
546
+ }
547
+ }
548
+ }
549
+
550
+ /** Injection token for the parent `mlv-menubar`. */
551
+ const MENUBAR_TOKEN = new InjectionToken('MENUBAR_TOKEN');
552
+
553
+ /**
554
+ * Trigger directive for `mlv-menu`.
555
+ *
556
+ * Attach to any element to open a `mlv-menu` panel on click. Uses `MlvPopupService`
557
+ * from `@malva-ui/core/popup` to create the CDK overlay with the popup component's
558
+ * template for visual chrome (background, border, radius, shadow, animations).
559
+ * The menu panel and items are declared inside `[mlvPopupContent]` in the menu's
560
+ * template and are rendered directly into the overlay — no DOM manipulation required.
561
+ *
562
+ * When used as a submenu trigger (`[isSubmenuTrigger]="true"`), the panel opens on
563
+ * mouseenter and the triangle-pointer-tracking algorithm keeps it open while the
564
+ * cursor moves diagonally toward it.
565
+ *
566
+ * Hover intent is resolved by what the pointer is over, with geometry used only
567
+ * for the ambiguous space between item and panel:
568
+ * - over the trigger item — stays open, whatever the trajectory;
569
+ * - over a different row of the same menu — closes;
570
+ * - in between (including the 8px `SUBMENU_POSITIONS` gap) — the safe cone
571
+ * decides, and a short grace timer absorbs jitter and gap crossings.
572
+ *
573
+ * Once the cursor enters the submenu panel, triangle tracking stops and the
574
+ * panel's own `mouseleave` schedules the close.
575
+ *
576
+ * @example Simple trigger
577
+ * ```html
578
+ * <button [mlvMenuTrigger]="menu">Open menu</button>
579
+ * <mlv-menu #menu>
580
+ * <mlv-menu-item (itemClick)="onEdit()">Edit</mlv-menu-item>
581
+ * <mlv-menu-separator />
582
+ * <mlv-menu-item (itemClick)="onDelete()">Delete</mlv-menu-item>
583
+ * </mlv-menu>
584
+ * ```
585
+ *
586
+ * @example Submenu trigger on a menu item
587
+ * ```html
588
+ * <mlv-menu-item [mlvMenuTrigger]="sub" [isSubmenuTrigger]="true">
589
+ * More options
590
+ * </mlv-menu-item>
591
+ * <mlv-menu #sub>
592
+ * <mlv-menu-item (itemClick)="onOption()">Option A</mlv-menu-item>
593
+ * </mlv-menu>
594
+ * ```
595
+ */
596
+ class MlvMenuTrigger {
597
+ /** @private Normalizes horizontal submenu opening for RTL layouts. */
598
+ _rtlService = inject(MlvRtlService);
599
+ // ─── Injected services ────────────────────────────────────────────────────
600
+ /** @private Host element reference. */
601
+ _elementRef = inject((ElementRef));
602
+ /** @private DestroyRef for cleanup on directive destruction. */
603
+ _destroyRef = inject(DestroyRef);
604
+ /** @private Parent menu for submenu triggers, if this trigger lives inside one. */
605
+ _parentMenu = inject(MENU_TOKEN, {
606
+ optional: true,
607
+ });
608
+ /**
609
+ * @private Parent menubar, if this trigger is a direct child of a `mlv-menubar`
610
+ * (i.e. a top-level File / Edit / View item). `null` for standalone triggers
611
+ * and submenu triggers.
612
+ */
613
+ _menubar = inject(MENUBAR_TOKEN, {
614
+ optional: true,
615
+ });
616
+ _menubarItemRegistry = inject(MLV_MENUBAR_ITEM_REGISTRY, {
617
+ optional: true,
618
+ });
619
+ /**
620
+ * @private Whether this trigger is a top-level menubar item. When `true` the
621
+ * host exposes `role="menuitem"` + a roving tabindex, and open/close state is
622
+ * coordinated with the parent `mlv-menubar`.
623
+ */
624
+ _isMenubarChild = this._menubar !== null;
625
+ // ─── Inputs ───────────────────────────────────────────────────────────────
626
+ /**
627
+ * The `mlv-menu` panel to open. Required.
628
+ */
629
+ mlvMenuTrigger = input.required(/* @ts-ignore */
630
+ ...(ngDevMode ? [{ debugName: "mlvMenuTrigger" }] : /* istanbul ignore next */ []));
631
+ /**
632
+ * When true, treats this trigger as a submenu trigger:
633
+ * - Opens the panel using submenu positions (right-of-parent).
634
+ * - Activates triangle pointer tracking while the submenu is open.
635
+ * - Opens on `mouseenter` in addition to `click`.
636
+ */
637
+ isSubmenuTrigger = input(false, { ...(ngDevMode ? { debugName: "isSubmenuTrigger" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
638
+ /**
639
+ * When `true`, disables the trigger — no overlay will open.
640
+ */
641
+ menuTriggerDisabled = input(false, { ...(ngDevMode ? { debugName: "menuTriggerDisabled" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
642
+ // ─── Outputs ──────────────────────────────────────────────────────────────
643
+ /** Emits when the menu panel opens. */
644
+ menuOpened = output();
645
+ /** Emits when the menu panel closes. */
646
+ menuClosed = output();
647
+ // ─── Internal state ───────────────────────────────────────────────────────
648
+ /**
649
+ * @private Roving tabindex for menubar top-level items — `0` for the active
650
+ * item, `-1` otherwise. Written by the parent `mlv-menubar`; only reflected
651
+ * on the host when `_isMenubarChild` is `true`.
652
+ */
653
+ _tabIndex = signal(-1, /* @ts-ignore */
654
+ ...(ngDevMode ? [{ debugName: "_tabIndex" }] : /* istanbul ignore next */ []));
655
+ /** @private Shared overlay and submenu hover-intent controller. */
656
+ _overlayController = new MlvMenuOverlayController({
657
+ getMenu: () => this.mlvMenuTrigger(),
658
+ origin: this._elementRef,
659
+ vcr: inject(ViewContainerRef),
660
+ parentMenu: this._parentMenu,
661
+ menubar: this._menubar,
662
+ isSubmenu: () => this.isSubmenuTrigger(),
663
+ isMenubarChild: this._isMenubarChild,
664
+ isDisabled: () => this.menuTriggerDisabled(),
665
+ getMenubarItem: () => this,
666
+ requestClose: () => this.close(),
667
+ onOpened: () => this.menuOpened.emit(),
668
+ onClosed: () => this.menuClosed.emit(),
669
+ });
670
+ /** @private Whether the menu overlay is currently open. */
671
+ _isOpen = this._overlayController.isOpen;
672
+ constructor() {
673
+ if (this._isMenubarChild) {
674
+ this._menubarItemRegistry?.register(this);
675
+ afterRenderEffect(() => this._menubarItemRegistry?.resync());
676
+ }
677
+ this._destroyRef.onDestroy(() => {
678
+ if (this._isMenubarChild) {
679
+ this._menubarItemRegistry?.unregister(this);
680
+ }
681
+ });
682
+ // Menubar top-level item: apply `role="menuitem"` + a roving tabindex
683
+ // imperatively. Only done for menubar children (never co-hosted with
684
+ // `MlvMenuItem`), so it cannot collide with that directive's own
685
+ // `role`/`tabindex` host bindings on submenu triggers.
686
+ if (this._isMenubarChild) {
687
+ const renderer = inject(Renderer2);
688
+ const el = this._elementRef.nativeElement;
689
+ renderer.setAttribute(el, 'role', 'menuitem');
690
+ effect(() => {
691
+ renderer.setAttribute(el, 'tabindex', String(this._tabIndex()));
692
+ });
693
+ }
694
+ }
695
+ // ─── Public API ───────────────────────────────────────────────────────────
696
+ /**
697
+ * Opens the menu overlay programmatically.
698
+ * No-op if the overlay is already open or the trigger is disabled.
699
+ */
700
+ open() {
701
+ this._overlayController.open();
702
+ }
703
+ /**
704
+ * Closes the menu overlay programmatically.
705
+ * No-op if the overlay is not open.
706
+ */
707
+ close() {
708
+ this._overlayController.close();
709
+ }
710
+ /**
711
+ * Toggles the menu overlay open/closed.
712
+ */
713
+ toggle() {
714
+ this._overlayController.toggle();
715
+ }
716
+ // ─── MlvMenubarItem (used by the parent `mlv-menubar`) ─────────────────────
717
+ /**
718
+ * Whether this trigger is disabled. Bridges the `menuTriggerDisabled` signal
719
+ * to the `MlvMenubarItem` / `FocusKeyManager.skipPredicate` contract.
720
+ */
721
+ get disabledBoolean() {
722
+ return !!this.menuTriggerDisabled();
723
+ }
724
+ /**
725
+ * Focuses the trigger host element. Required by CDK `FocusableOption` for the
726
+ * menubar's `FocusKeyManager` roving tabindex.
727
+ */
728
+ focus() {
729
+ this._elementRef.nativeElement.focus();
730
+ }
731
+ /**
732
+ * Returns the trigger's trimmed visible text, used by the menubar's
733
+ * `FocusKeyManager` type-ahead. Required by `FocusKeyManager.withTypeAhead()`.
734
+ */
735
+ getLabel() {
736
+ return this._elementRef.nativeElement.textContent?.trim() ?? '';
737
+ }
738
+ /** Whether this item's dropdown menu is currently open (`MlvMenubarItem`). */
739
+ isMenuOpen() {
740
+ return this._isOpen();
741
+ }
742
+ /** Opens this item's dropdown without moving focus into the panel (`MlvMenubarItem`). */
743
+ openMenu() {
744
+ this.open();
745
+ }
746
+ /** Closes this item's dropdown (`MlvMenubarItem`). */
747
+ closeMenu() {
748
+ this.close();
749
+ }
750
+ /**
751
+ * Opens this item's dropdown and moves focus to its first item (`MlvMenubarItem`).
752
+ */
753
+ openMenuWithFirstItemFocused() {
754
+ this._overlayController.openWithFirstItemFocused();
755
+ }
756
+ /**
757
+ * Opens this item's dropdown and moves focus to its last item (`MlvMenubarItem`).
758
+ */
759
+ openMenuWithLastItemFocused() {
760
+ this._overlayController.openWithLastItemFocused();
761
+ }
762
+ // ─── Protected host event handlers ───────────────────────────────────────
763
+ /**
764
+ * @protected Click handler — toggles the menu.
765
+ */
766
+ _onTriggerClick() {
767
+ if (this.menuTriggerDisabled())
768
+ return;
769
+ this.toggle();
770
+ }
771
+ /**
772
+ * @protected Mouseenter handler.
773
+ *
774
+ * - Menubar top-level item: delegates to the bar's hover-follow, which opens
775
+ * this item's menu only while another dropdown in the bar is already open.
776
+ * - Submenu trigger: opens the submenu on hover (triangle tracking).
777
+ * - Standalone trigger: no-op (opens on click only).
778
+ */
779
+ _onTriggerMouseEnter() {
780
+ this._overlayController.onMouseEnter();
781
+ }
782
+ /**
783
+ * @protected Mouseleave handler — for submenu triggers, starts a delayed close
784
+ * unless the cursor is heading into the submenu triangle.
785
+ * Once the cursor has entered the submenu panel, the submenu overlay's own
786
+ * mouseleave listener handles closing — no triangle tracking needed here.
787
+ */
788
+ _onTriggerMouseLeave(event) {
789
+ this._overlayController.onMouseLeave(event);
790
+ }
791
+ /**
792
+ * @protected Keyboard handler — Enter/Space opens; Escape closes;
793
+ * ArrowDown/Up opens with keyboard focus.
794
+ */
795
+ _onKeydown(event) {
796
+ if (this.menuTriggerDisabled())
797
+ return;
798
+ const key = this._rtlService.normalizeArrowKey(event);
799
+ switch (key ?? event.key) {
800
+ case 'Enter':
801
+ case ' ':
802
+ event.preventDefault();
803
+ this.toggle();
804
+ if (this._isOpen()) {
805
+ setTimeout(() => this.mlvMenuTrigger().focusFirstItem(), 0);
806
+ }
807
+ break;
808
+ case DOWN_ARROW:
809
+ if (!this._isOpen()) {
810
+ event.preventDefault();
811
+ this.open();
812
+ setTimeout(() => this.mlvMenuTrigger().focusFirstItem(), 0);
813
+ }
814
+ break;
815
+ case UP_ARROW:
816
+ if (!this._isOpen()) {
817
+ event.preventDefault();
818
+ this.open();
819
+ setTimeout(() => this.mlvMenuTrigger().focusLastItem(), 0);
820
+ }
821
+ break;
822
+ case RIGHT_ARROW:
823
+ // On a submenu trigger (a menu item), ArrowRight opens the submenu and
824
+ // moves focus to its first item.
825
+ if (this.isSubmenuTrigger() && !this._isOpen()) {
826
+ event.preventDefault();
827
+ event.stopPropagation();
828
+ this.open();
829
+ setTimeout(() => this.mlvMenuTrigger().focusFirstItem(), 0);
830
+ }
831
+ break;
832
+ case 'Escape':
833
+ if (this._isOpen()) {
834
+ event.preventDefault();
835
+ this.close();
836
+ this._elementRef.nativeElement.focus();
837
+ }
838
+ break;
839
+ }
840
+ }
841
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
842
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MlvMenuTrigger, isStandalone: true, selector: "[mlvMenuTrigger]", inputs: { mlvMenuTrigger: { classPropertyName: "mlvMenuTrigger", publicName: "mlvMenuTrigger", isSignal: true, isRequired: true, transformFunction: null }, isSubmenuTrigger: { classPropertyName: "isSubmenuTrigger", publicName: "isSubmenuTrigger", isSignal: true, isRequired: false, transformFunction: null }, menuTriggerDisabled: { classPropertyName: "menuTriggerDisabled", publicName: "menuTriggerDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuOpened: "menuOpened", menuClosed: "menuClosed" }, host: { listeners: { "click": "_onTriggerClick()", "mouseenter": "_onTriggerMouseEnter()", "mouseleave": "_onTriggerMouseLeave($event)", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-haspopup": "\"menu\"", "attr.aria-expanded": "_isOpen()", "attr.aria-controls": "_isOpen() ? mlvMenuTrigger().panelId : null" } }, ngImport: i0 });
843
+ }
844
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuTrigger, decorators: [{
845
+ type: Directive,
846
+ args: [{
847
+ selector: '[mlvMenuTrigger]',
848
+ host: {
849
+ '[attr.aria-haspopup]': '"menu"',
850
+ '[attr.aria-expanded]': '_isOpen()',
851
+ '[attr.aria-controls]': '_isOpen() ? mlvMenuTrigger().panelId : null',
852
+ // NB: `role="menuitem"` and the roving `tabindex` are applied imperatively
853
+ // (see the constructor) *only* for menubar children. They are deliberately
854
+ // NOT host bindings: a submenu trigger co-hosts `MlvMenuItem`, which
855
+ // already owns `[attr.role]`/`[attr.tabindex]`, and two directives binding
856
+ // the same attribute would clobber each other.
857
+ '(click)': '_onTriggerClick()',
858
+ '(mouseenter)': '_onTriggerMouseEnter()',
859
+ '(mouseleave)': '_onTriggerMouseLeave($event)',
860
+ '(keydown)': '_onKeydown($event)',
861
+ },
862
+ }]
863
+ }], ctorParameters: () => [], propDecorators: { mlvMenuTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "mlvMenuTrigger", required: true }] }], isSubmenuTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSubmenuTrigger", required: false }] }], menuTriggerDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuTriggerDisabled", required: false }] }], menuOpened: [{ type: i0.Output, args: ["menuOpened"] }], menuClosed: [{ type: i0.Output, args: ["menuClosed"] }] } });
864
+
865
+ /**
866
+ * Menu item directive — applied to `mlv-list-item` to give it menu-item semantics
867
+ * and behavior.
868
+ *
869
+ * Overrides the list item's default `role="listitem"` with `role="menuitem"`,
870
+ * wires into the parent menu's `FocusKeyManager` (via `focus()` / `disabledBoolean`),
871
+ * and closes the parent menu stack on leaf activation. A co-hosted enabled
872
+ * submenu trigger owns its own activation so opening a child menu keeps the
873
+ * ancestor open; a disabled submenu trigger falls back to leaf activation.
874
+ *
875
+ * Use `[mlvListItemPrefix]` for leading icons and `[mlvListItemSuffix]` for
876
+ * trailing content (chevron, shortcut label, etc.).
877
+ *
878
+ * @example
879
+ * ```html
880
+ * <mlv-list-item mlvMenuItem (itemClick)="onSave()">Save</mlv-list-item>
881
+ *
882
+ * <mlv-list-item mlvMenuItem disabled>Unavailable</mlv-list-item>
883
+ *
884
+ * <mlv-list-item mlvMenuItem (itemClick)="onEdit()">
885
+ * <svg mlvListItemPrefix lucideEdit [size]="14" />
886
+ * Edit
887
+ * </mlv-list-item>
888
+ * ```
889
+ */
890
+ class MlvMenuItem {
891
+ /** @private Normalizes horizontal submenu navigation for RTL layouts. */
892
+ _rtlService = inject(MlvRtlService);
893
+ /** @private Reference to parent menu, if any. Used to close on activation. */
894
+ _menu = inject(MENU_TOKEN, { optional: true });
895
+ _registry = inject(MLV_MENU_ITEM_REGISTRY, {
896
+ optional: true,
897
+ });
898
+ _renderer = inject(Renderer2);
899
+ _dataItemContext = inject(MLV_MENU_DATA_ITEM, {
900
+ optional: true,
901
+ });
902
+ _menubar = inject(MENUBAR_TOKEN, { optional: true });
903
+ /** @private A co-hosted submenu trigger owns activation instead of this leaf item. */
904
+ _submenuTrigger = inject(MlvMenuTrigger, {
905
+ optional: true,
906
+ self: true,
907
+ });
908
+ /** @private Host element used to call `focus()` for `FocusKeyManager`. */
909
+ _elementRef = inject((ElementRef));
910
+ constructor() {
911
+ this._registry?.register(this);
912
+ afterRenderEffect(() => this._registry?.resync());
913
+ inject(DestroyRef).onDestroy(() => this._registry?.unregister(this));
914
+ if (this._dataItemContext && !this._submenuTrigger) {
915
+ effect(() => {
916
+ const element = this._elementRef.nativeElement;
917
+ if (!this._dataItemContext?.hasChildren()) {
918
+ this._renderer.removeAttribute(element, 'aria-haspopup');
919
+ this._renderer.removeAttribute(element, 'aria-expanded');
920
+ this._renderer.removeAttribute(element, 'aria-controls');
921
+ return;
922
+ }
923
+ this._renderer.setAttribute(element, 'aria-haspopup', 'menu');
924
+ this._renderer.setAttribute(element, 'aria-expanded', String(this._dataItemContext.isOpen()));
925
+ const panelId = this._dataItemContext.panelId();
926
+ if (this._dataItemContext.isOpen() && panelId) {
927
+ this._renderer.setAttribute(element, 'aria-controls', panelId);
928
+ }
929
+ else {
930
+ this._renderer.removeAttribute(element, 'aria-controls');
931
+ }
932
+ });
933
+ }
934
+ }
935
+ // ─── Inputs ───────────────────────────────────────────────────────────────
936
+ /**
937
+ * When true, disables the item — removes it from the tab order and
938
+ * prevents activation. Supports attribute syntax: `<mlv-list-item mlvMenuItem disabled>`.
939
+ */
940
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
941
+ // ─── Outputs ──────────────────────────────────────────────────────────────
942
+ /**
943
+ * Emits when a leaf item is activated (click or Enter/Space key).
944
+ * The parent menu stack closes automatically after this event. Submenu-trigger
945
+ * rows delegate activation to `MlvMenuTrigger` and do not emit this output
946
+ * while that trigger is enabled.
947
+ */
948
+ itemClick = output();
949
+ // ─── FocusKeyManager interface ────────────────────────────────────────────
950
+ /**
951
+ * @private Tabindex managed by the parent menu's `FocusKeyManager`.
952
+ * `0` for the active (focused) item, `-1` for all others (roving tabindex).
953
+ * A signal so the host `[attr.tabindex]` binding updates under OnPush.
954
+ */
955
+ _tabIndex = signal(-1, /* @ts-ignore */
956
+ ...(ngDevMode ? [{ debugName: "_tabIndex" }] : /* istanbul ignore next */ []));
957
+ /**
958
+ * Boolean getter for `FocusKeyManager.skipPredicate`.
959
+ * The key manager calls `item.disabledBoolean` so this bridges
960
+ * the signal API to the CDK interface.
961
+ */
962
+ get disabledBoolean() {
963
+ return this._isDisabled();
964
+ }
965
+ /**
966
+ * Focuses the host element.
967
+ * Required by CDK `FocusableOption` for `FocusKeyManager`.
968
+ */
969
+ focus() {
970
+ this._elementRef.nativeElement.focus();
971
+ }
972
+ /**
973
+ * Returns the item's visible text label, used by the parent menu's
974
+ * `FocusKeyManager` type-ahead (type a letter to jump to the first matching
975
+ * item). Reads the host element's trimmed `textContent`.
976
+ * Required by CDK `FocusKeyManager.withTypeAhead()`.
977
+ */
978
+ getLabel() {
979
+ return this._elementRef.nativeElement.textContent?.trim() ?? '';
980
+ }
981
+ // ─── Handlers ─────────────────────────────────────────────────────────────
982
+ /**
983
+ * @protected Handles click activation.
984
+ */
985
+ _onClick() {
986
+ if (this._isDisabled())
987
+ return;
988
+ if (this._hasAutomaticSubmenu()) {
989
+ this._dataItemContext?.toggle();
990
+ return;
991
+ }
992
+ if (this._enabledSubmenuOwnsActivation())
993
+ return;
994
+ this.itemClick.emit();
995
+ this._menu?.closeAll();
996
+ }
997
+ /**
998
+ * @protected Handles Enter / Space keyboard activation.
999
+ * Prevents default scroll on Space and triggers the same logic as a click.
1000
+ */
1001
+ _onActivate(event) {
1002
+ event.preventDefault();
1003
+ event.stopPropagation();
1004
+ if (this._isDisabled())
1005
+ return;
1006
+ if (this._hasAutomaticSubmenu()) {
1007
+ if (this._dataItemContext?.isOpen()) {
1008
+ this._dataItemContext.close();
1009
+ }
1010
+ else {
1011
+ this._dataItemContext?.openWithFirstItemFocused();
1012
+ }
1013
+ return;
1014
+ }
1015
+ if (this._enabledSubmenuOwnsActivation())
1016
+ return;
1017
+ this.itemClick.emit();
1018
+ this._menu?.closeAll();
1019
+ }
1020
+ /** @protected Delegates hover-open behavior for generated submenu rows. */
1021
+ _onMouseEnter() {
1022
+ if (this._isDisabled() || !this._hasAutomaticSubmenu())
1023
+ return;
1024
+ this._dataItemContext?.onMouseEnter();
1025
+ }
1026
+ /** @protected Delegates hover-close intent for generated submenu rows. */
1027
+ _onMouseLeave(event) {
1028
+ if (this._isDisabled() || !this._hasAutomaticSubmenu())
1029
+ return;
1030
+ this._dataItemContext?.onMouseLeave(event);
1031
+ }
1032
+ /** @protected Handles submenu keyboard opening for generated rows. */
1033
+ _onKeydown(event) {
1034
+ if (this._isDisabled() || !this._hasAutomaticSubmenu())
1035
+ return;
1036
+ const key = this._rtlService.normalizeArrowKey(event) ?? event.key;
1037
+ if (this._isMenubarDataItem()) {
1038
+ if (key === DOWN_ARROW && !this._dataItemContext?.isOpen()) {
1039
+ event.preventDefault();
1040
+ event.stopPropagation();
1041
+ this._dataItemContext?.openWithFirstItemFocused();
1042
+ }
1043
+ else if (key === UP_ARROW && !this._dataItemContext?.isOpen()) {
1044
+ event.preventDefault();
1045
+ event.stopPropagation();
1046
+ this._dataItemContext?.openWithLastItemFocused();
1047
+ }
1048
+ return;
1049
+ }
1050
+ if (key !== RIGHT_ARROW || this._dataItemContext?.isOpen())
1051
+ return;
1052
+ event.preventDefault();
1053
+ event.stopPropagation();
1054
+ this._dataItemContext?.openWithFirstItemFocused();
1055
+ }
1056
+ /** @private Whether a co-hosted trigger can handle submenu activation. */
1057
+ _enabledSubmenuOwnsActivation() {
1058
+ return !!(this._submenuTrigger?.isSubmenuTrigger() &&
1059
+ !this._submenuTrigger.menuTriggerDisabled());
1060
+ }
1061
+ /** @private Whether this row is a generated submenu row without an explicit trigger. */
1062
+ _hasAutomaticSubmenu() {
1063
+ return !this._submenuTrigger && !!this._dataItemContext?.hasChildren();
1064
+ }
1065
+ /** @private Whether this generated row is a root item of a reactive menubar. */
1066
+ _isMenubarDataItem() {
1067
+ return !!this._dataItemContext && this._menubar !== null;
1068
+ }
1069
+ /** @private Resolved disabled state from explicit input or generated row data. */
1070
+ _isDisabled() {
1071
+ return !!(this.disabled() || this._dataItemContext?.isDisabled());
1072
+ }
1073
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1074
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MlvMenuItem, isStandalone: true, selector: "mlv-list-item[mlvMenuItem]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { listeners: { "click": "_onClick()", "mouseenter": "_onMouseEnter()", "mouseleave": "_onMouseLeave($event)", "keydown.enter": "_onActivate($event)", "keydown": "_onKeydown($event)", "keydown.space": "_onActivate($event)" }, properties: { "attr.role": "\"menuitem\"", "attr.tabindex": "_isDisabled() ? -1 : _tabIndex()", "attr.aria-disabled": "_isDisabled() || null", "class.mlv-list-item--disabled": "_isDisabled()", "class.mlv-menu-data-renderer__submenu-trigger": "_hasAutomaticSubmenu()" } }, ngImport: i0 });
1075
+ }
1076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuItem, decorators: [{
1077
+ type: Directive,
1078
+ args: [{
1079
+ selector: 'mlv-list-item[mlvMenuItem]',
1080
+ host: {
1081
+ '[attr.role]': '"menuitem"',
1082
+ '[attr.tabindex]': '_isDisabled() ? -1 : _tabIndex()',
1083
+ '[attr.aria-disabled]': '_isDisabled() || null',
1084
+ '[class.mlv-list-item--disabled]': '_isDisabled()',
1085
+ '[class.mlv-menu-data-renderer__submenu-trigger]': '_hasAutomaticSubmenu()',
1086
+ '(click)': '_onClick()',
1087
+ '(mouseenter)': '_onMouseEnter()',
1088
+ '(mouseleave)': '_onMouseLeave($event)',
1089
+ '(keydown.enter)': '_onActivate($event)',
1090
+ '(keydown)': '_onKeydown($event)',
1091
+ '(keydown.space)': '_onActivate($event)',
1092
+ },
1093
+ }]
1094
+ }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
1095
+
1096
+ /** Internal adapter that normalizes arrays and `MlvDataSource` instances. */
1097
+ class MlvMenuDataSourceAdapter {
1098
+ /** @private The current source identity the adapter exposes. */
1099
+ _source = signal([], /* @ts-ignore */
1100
+ ...(ngDevMode ? [{ debugName: "_source" }] : /* istanbul ignore next */ []));
1101
+ /** @private Memoized `connect()` signals keyed by data-source identity. */
1102
+ _connected = new Map();
1103
+ /** Current top-level menu items for the active source. */
1104
+ items = computed(() => {
1105
+ const source = this._source();
1106
+ if (source instanceof MlvDataSource) {
1107
+ const items = this._connected.get(source);
1108
+ return items ? items() : [];
1109
+ }
1110
+ return source;
1111
+ }, /* @ts-ignore */
1112
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1113
+ loading = computed(() => {
1114
+ const source = this._source();
1115
+ return source instanceof MlvDataSource ? source.loading() : false;
1116
+ }, /* @ts-ignore */
1117
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
1118
+ /** Replaces the active source, connecting data sources once per identity. */
1119
+ setSource(source) {
1120
+ if (source instanceof MlvDataSource && !this._connected.has(source)) {
1121
+ this._connected.set(source, source.connect());
1122
+ }
1123
+ this._source.set(source);
1124
+ }
1125
+ }
1126
+ /** Internal lazy loader for submenu children streams. */
1127
+ class MlvMenuChildrenDataSource {
1128
+ _children;
1129
+ /** @private Destroy hook used to tear down the child subscription. */
1130
+ _destroyRef = inject(DestroyRef);
1131
+ /** @private Latest emitted child items. */
1132
+ _items = signal([], /* @ts-ignore */
1133
+ ...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
1134
+ /** @private Loading state for the first child request. */
1135
+ _loading = signal(false, /* @ts-ignore */
1136
+ ...(ngDevMode ? [{ debugName: "_loading" }] : /* istanbul ignore next */ []));
1137
+ /** @private Guards the one-time lazy subscription. */
1138
+ _loaded = false;
1139
+ _destroyed = false;
1140
+ /** @private Active child-stream subscription, if loading has started. */
1141
+ _subscription = null;
1142
+ /** Latest child items emitted by the submenu stream. */
1143
+ items = this._items.asReadonly();
1144
+ /** Whether the first child payload is still pending. */
1145
+ loading = this._loading.asReadonly();
1146
+ constructor(_children) {
1147
+ this._children = _children;
1148
+ this._destroyRef.onDestroy(() => this._subscription?.unsubscribe());
1149
+ }
1150
+ /** Starts the lazy child subscription the first time a submenu is opened. */
1151
+ ensureLoaded() {
1152
+ if (this._destroyed || this._loaded || !this._children)
1153
+ return;
1154
+ this._loaded = true;
1155
+ this._loading.set(true);
1156
+ this._subscription = this._children.subscribe({
1157
+ next: (items) => {
1158
+ this._items.set(items);
1159
+ this._loading.set(false);
1160
+ },
1161
+ error: () => {
1162
+ this._items.set([]);
1163
+ this._loading.set(false);
1164
+ },
1165
+ });
1166
+ }
1167
+ /** Stops the child stream when its owning row changes source identity. */
1168
+ destroy() {
1169
+ if (this._destroyed)
1170
+ return;
1171
+ this._destroyed = true;
1172
+ this._subscription?.unsubscribe();
1173
+ this._subscription = null;
1174
+ }
1175
+ }
1176
+
1177
+ /** Internal generated row host for one data-driven menu item. */
1178
+ class MlvMenuDataItem {
1179
+ _injector = inject(Injector);
1180
+ _viewContainerRef = inject(ViewContainerRef);
1181
+ _menuItemRegistry = inject(MLV_MENU_ITEM_REGISTRY, { optional: true });
1182
+ _menubarItemRegistry = inject(MLV_MENUBAR_ITEM_REGISTRY, { optional: true });
1183
+ _hostElement = inject((ElementRef));
1184
+ _renderer = inject(Renderer2);
1185
+ _childMenu = viewChild(forwardRef(() => MlvMenu), /* @ts-ignore */
1186
+ ...(ngDevMode ? [{ debugName: "_childMenu" }] : /* istanbul ignore next */ []));
1187
+ _childrenSource = signal(null, /* @ts-ignore */
1188
+ ...(ngDevMode ? [{ debugName: "_childrenSource" }] : /* istanbul ignore next */ []));
1189
+ _childrenIdentity;
1190
+ _registeredMenubarItem = false;
1191
+ /** Current row data. */
1192
+ item = input.required(/* @ts-ignore */
1193
+ ...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
1194
+ /** Zero-based row index within the current level. */
1195
+ index = input.required(/* @ts-ignore */
1196
+ ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
1197
+ /** Optional projected row definition to stamp for this item. */
1198
+ itemDef = input(undefined, /* @ts-ignore */
1199
+ ...(ngDevMode ? [{ debugName: "itemDef" }] : /* istanbul ignore next */ []));
1200
+ /** Menu/menubar rendering mode for this level. */
1201
+ mode = input('menu', /* @ts-ignore */
1202
+ ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1203
+ /** Owning parent menu accessor. */
1204
+ parentMenu = input(null, /* @ts-ignore */
1205
+ ...(ngDevMode ? [{ debugName: "parentMenu" }] : /* istanbul ignore next */ []));
1206
+ /** Root menubar accessor when relevant. */
1207
+ menubar = input(null, /* @ts-ignore */
1208
+ ...(ngDevMode ? [{ debugName: "menubar" }] : /* istanbul ignore next */ []));
1209
+ /** Menubar registry façade for a generated root data row. */
1210
+ _menubarItem = this._createMenubarItem();
1211
+ /** Typed template context for the stamped row. */
1212
+ context = computed(() => ({
1213
+ $implicit: this.item(),
1214
+ index: this.index(),
1215
+ hasChildren: this.hasChildren(),
1216
+ loading: this.loading(),
1217
+ }), /* @ts-ignore */
1218
+ ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
1219
+ /** Injector that reconnects generated rows to the menu contracts. */
1220
+ rowInjector = computed(() => Injector.create({
1221
+ providers: [
1222
+ {
1223
+ provide: MENU_TOKEN,
1224
+ useValue: this.parentMenu(),
1225
+ },
1226
+ {
1227
+ provide: MLV_MENU_ITEM_REGISTRY,
1228
+ useValue: this._menuItemRegistry,
1229
+ },
1230
+ {
1231
+ provide: MENUBAR_TOKEN,
1232
+ useValue: this.mode() === 'menubar' ? this.menubar() : null,
1233
+ },
1234
+ {
1235
+ provide: MLV_MENU_DATA_ITEM,
1236
+ useValue: this._dataItemContext,
1237
+ },
1238
+ ],
1239
+ parent: this._injector,
1240
+ }), /* @ts-ignore */
1241
+ ...(ngDevMode ? [{ debugName: "rowInjector" }] : /* istanbul ignore next */ []));
1242
+ /**
1243
+ * @private Overlay origin for the generated submenu.
1244
+ *
1245
+ * Must be a real `ElementRef` instance: CDK's
1246
+ * `FlexibleConnectedPositionStrategy` only measures the DOM node when the
1247
+ * origin passes `instanceof ElementRef` (or `instanceof Element`), and reads
1248
+ * anything else as an `{x, y}` point — which anchors the submenu to the
1249
+ * viewport origin instead of its row. The `nativeElement` accessor stays
1250
+ * lazy because the row is stamped by `ngTemplateOutlet` after construction.
1251
+ */
1252
+ _originElement = Object.defineProperty(new ElementRef(this._hostElement.nativeElement), 'nativeElement', {
1253
+ configurable: true,
1254
+ get: () => this._getRenderedRowElement() ?? this._hostElement.nativeElement,
1255
+ });
1256
+ _parentMenuProxy = {
1257
+ close: () => this.parentMenu()?.close(),
1258
+ closeAll: () => this.parentMenu()?.closeAll(),
1259
+ };
1260
+ _menubarProxy = this._createMenubarProxy();
1261
+ _overlayController = new MlvMenuOverlayController({
1262
+ getMenu: () => {
1263
+ const menu = this._childMenu();
1264
+ if (!menu) {
1265
+ throw new Error('Generated submenu menu is not available.');
1266
+ }
1267
+ return menu;
1268
+ },
1269
+ origin: this._originElement,
1270
+ vcr: this._viewContainerRef,
1271
+ parentMenu: this._parentMenuProxy,
1272
+ menubar: null,
1273
+ isSubmenu: () => this.hasChildren(),
1274
+ isMenubarChild: false,
1275
+ isDisabled: () => !!this.item().disabled,
1276
+ getMenubarItem: () => {
1277
+ throw new Error('Generated data rows are not menubar triggers.');
1278
+ },
1279
+ });
1280
+ _menubarOverlayController = new MlvMenuOverlayController({
1281
+ getMenu: () => {
1282
+ const menu = this._childMenu();
1283
+ if (!menu) {
1284
+ throw new Error('Generated submenu menu is not available.');
1285
+ }
1286
+ return menu;
1287
+ },
1288
+ origin: this._originElement,
1289
+ vcr: this._viewContainerRef,
1290
+ parentMenu: null,
1291
+ menubar: this._menubarProxy,
1292
+ isSubmenu: () => false,
1293
+ isMenubarChild: true,
1294
+ isDisabled: () => !!this.item().disabled,
1295
+ getMenubarItem: () => this._menubarItem,
1296
+ });
1297
+ _dataItemContext = {
1298
+ hasChildren: () => this.hasChildren(),
1299
+ loading: () => this.loading(),
1300
+ isOpen: () => this._activeOverlayController().isOpen(),
1301
+ panelId: () => this._childMenu()?.panelId ?? null,
1302
+ isDisabled: () => !!this.item().disabled,
1303
+ open: () => {
1304
+ this._ensureLoaded();
1305
+ this._activeOverlayController().open();
1306
+ },
1307
+ close: () => this._activeOverlayController().close(),
1308
+ toggle: () => {
1309
+ this._ensureLoaded();
1310
+ this._activeOverlayController().toggle();
1311
+ },
1312
+ openWithFirstItemFocused: () => {
1313
+ this._ensureLoaded();
1314
+ this._activeOverlayController().openWithFirstItemFocused();
1315
+ },
1316
+ openWithLastItemFocused: () => {
1317
+ this._ensureLoaded();
1318
+ this._activeOverlayController().openWithLastItemFocused();
1319
+ },
1320
+ onMouseEnter: () => {
1321
+ this._ensureLoaded();
1322
+ this._activeOverlayController().onMouseEnter();
1323
+ },
1324
+ onMouseLeave: (event) => this._activeOverlayController().onMouseLeave(event),
1325
+ };
1326
+ constructor() {
1327
+ const source = this._childrenSource;
1328
+ const injector = this._injector;
1329
+ effect(() => {
1330
+ const isMenubarItem = this.mode() === 'menubar' && this.menubar() !== null;
1331
+ if (isMenubarItem &&
1332
+ this._menubarItemRegistry &&
1333
+ !this._registeredMenubarItem) {
1334
+ this._menubarItemRegistry.register(this._menubarItem);
1335
+ this._registeredMenubarItem = true;
1336
+ }
1337
+ else if (!isMenubarItem && this._registeredMenubarItem) {
1338
+ this._menubarItemRegistry?.unregister(this._menubarItem);
1339
+ this._registeredMenubarItem = false;
1340
+ }
1341
+ });
1342
+ afterRenderEffect(() => {
1343
+ const tabIndex = this._menubarItem._tabIndex();
1344
+ if (this.mode() !== 'menubar')
1345
+ return;
1346
+ const row = this._getRenderedRowElement();
1347
+ if (row)
1348
+ this._renderer.setAttribute(row, 'tabindex', String(tabIndex));
1349
+ });
1350
+ inject(DestroyRef).onDestroy(() => {
1351
+ if (this._registeredMenubarItem) {
1352
+ this._menubarItemRegistry?.unregister(this._menubarItem);
1353
+ }
1354
+ });
1355
+ effect(() => {
1356
+ const children = this.item().children;
1357
+ if (children === this._childrenIdentity)
1358
+ return;
1359
+ this._childrenSource()?.destroy();
1360
+ this._childrenIdentity = children;
1361
+ const nextSource = children
1362
+ ? runInInjectionContext(injector, () => new MlvMenuChildrenDataSource(children))
1363
+ : null;
1364
+ source.set(nextSource);
1365
+ if (nextSource && this._activeOverlayController().isOpen()) {
1366
+ nextSource.ensureLoaded();
1367
+ }
1368
+ });
1369
+ }
1370
+ /** Whether this row currently advertises a generated submenu. */
1371
+ hasChildren = computed(() => !!this.item().children, /* @ts-ignore */
1372
+ ...(ngDevMode ? [{ debugName: "hasChildren" }] : /* istanbul ignore next */ []));
1373
+ /** Whether the submenu is still waiting for its first child emission. */
1374
+ loading = computed(() => this._childrenSource()?.loading() ?? false, /* @ts-ignore */
1375
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
1376
+ /** Current child collection for the generated submenu. */
1377
+ childItems = computed(() => this._childrenSource()?.items() ?? [], /* @ts-ignore */
1378
+ ...(ngDevMode ? [{ debugName: "childItems" }] : /* istanbul ignore next */ []));
1379
+ _ensureLoaded() {
1380
+ this._childrenSource()?.ensureLoaded();
1381
+ }
1382
+ _getRenderedRowElement() {
1383
+ return this._hostElement.nativeElement.querySelector('mlv-list-item');
1384
+ }
1385
+ _activeOverlayController() {
1386
+ return this.mode() === 'menubar'
1387
+ ? this._menubarOverlayController
1388
+ : this._overlayController;
1389
+ }
1390
+ _createMenubarItem() {
1391
+ const item = {
1392
+ _elementRef: this._hostElement,
1393
+ _tabIndex: signal(-1),
1394
+ focus: () => this._getRenderedRowElement()?.focus() ??
1395
+ this._hostElement.nativeElement.focus(),
1396
+ getLabel: () => this._getRenderedRowElement()?.textContent?.trim() ?? this.item().label,
1397
+ isMenuOpen: () => this._menubarOverlayController.isOpen(),
1398
+ openMenu: () => {
1399
+ if (this.hasChildren())
1400
+ this._menubarOverlayController.open();
1401
+ },
1402
+ closeMenu: () => this._menubarOverlayController.close(),
1403
+ openMenuWithFirstItemFocused: () => {
1404
+ if (this.hasChildren())
1405
+ this._menubarOverlayController.openWithFirstItemFocused();
1406
+ },
1407
+ openMenuWithLastItemFocused: () => {
1408
+ if (this.hasChildren())
1409
+ this._menubarOverlayController.openWithLastItemFocused();
1410
+ },
1411
+ };
1412
+ Object.defineProperty(item, 'disabledBoolean', {
1413
+ get: () => !!this.item().disabled,
1414
+ });
1415
+ return item;
1416
+ }
1417
+ _createMenubarProxy() {
1418
+ const proxy = {
1419
+ notifyItemOpened: (item) => this.menubar()?.notifyItemOpened(item),
1420
+ notifyItemClosed: (item) => this.menubar()?.notifyItemClosed(item),
1421
+ onItemPointerEnter: (item) => this.menubar()?.onItemPointerEnter(item),
1422
+ hasOpenMenu: () => this.menubar()?.hasOpenMenu() ?? false,
1423
+ openAdjacentItemMenu: (from, dir) => this.menubar()?.openAdjacentItemMenu(from, dir),
1424
+ };
1425
+ Object.defineProperty(proxy, 'hostElement', {
1426
+ get: () => this.menubar()?.hostElement ?? this._hostElement.nativeElement,
1427
+ });
1428
+ return proxy;
1429
+ }
1430
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuDataItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
1431
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvMenuDataItem, isStandalone: true, selector: "mlv-menu-data-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, itemDef: { classPropertyName: "itemDef", publicName: "itemDef", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, parentMenu: { classPropertyName: "parentMenu", publicName: "parentMenu", isSignal: true, isRequired: false, transformFunction: null }, menubar: { classPropertyName: "menubar", publicName: "menubar", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "mlv-menu-data-item" }, viewQueries: [{ propertyName: "_childMenu", first: true, predicate: i0.forwardRef(() => MlvMenu), descendants: true, isSignal: true }], ngImport: i0, template: `
1432
+ <ng-container
1433
+ [ngTemplateOutlet]="itemDef()?.templateRef ?? _defaultItemDef"
1434
+ [ngTemplateOutletContext]="context()"
1435
+ [ngTemplateOutletInjector]="rowInjector()"
1436
+ />
1437
+
1438
+ @if (hasChildren()) {
1439
+ <mlv-menu #childMenu [label]="item().label">
1440
+ @if (loading()) {
1441
+ <div class="mlv-menu-data-renderer__loader">
1442
+ <mlv-loader variant="circle" indeterminate />
1443
+ </div>
1444
+ } @else {
1445
+ <mlv-menu-data-renderer
1446
+ [items]="childItems()"
1447
+ [itemDef]="itemDef()"
1448
+ mode="menu"
1449
+ [parentMenu]="childMenu"
1450
+ [menubar]="menubar()"
1451
+ />
1452
+ }
1453
+ </mlv-menu>
1454
+ }
1455
+
1456
+ <ng-template #_defaultItemDef let-item>
1457
+ <mlv-list-item mlvMenuItem>{{ item.label }}</mlv-list-item>
1458
+ </ng-template>
1459
+ `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i0.forwardRef(() => MlvListItem), selector: "mlv-list-item", inputs: ["itemRole", "unread", "accent"] }, { kind: "component", type: i0.forwardRef(() => MlvLoader), selector: "mlv-loader", inputs: ["variant", "tone", "value", "max", "indeterminate", "size", "strokeWidth", "ariaLabel", "showHint", "color", "trackColor", "glow"] }, { kind: "component", type: i0.forwardRef(() => MlvMenu), selector: "mlv-menu", inputs: ["label", "mlvDensity", "dataSource"], outputs: ["closed"] }, { kind: "directive", type: i0.forwardRef(() => MlvMenuItem), selector: "mlv-list-item[mlvMenuItem]", inputs: ["disabled"], outputs: ["itemClick"] }, { kind: "component", type: i0.forwardRef(() => MlvMenuDataRenderer), selector: "mlv-menu-data-renderer", inputs: ["items", "itemDef", "mode", "parentMenu", "menubar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1460
+ }
1461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuDataItem, decorators: [{
1462
+ type: Component,
1463
+ args: [{
1464
+ selector: 'mlv-menu-data-item',
1465
+ template: `
1466
+ <ng-container
1467
+ [ngTemplateOutlet]="itemDef()?.templateRef ?? _defaultItemDef"
1468
+ [ngTemplateOutletContext]="context()"
1469
+ [ngTemplateOutletInjector]="rowInjector()"
1470
+ />
1471
+
1472
+ @if (hasChildren()) {
1473
+ <mlv-menu #childMenu [label]="item().label">
1474
+ @if (loading()) {
1475
+ <div class="mlv-menu-data-renderer__loader">
1476
+ <mlv-loader variant="circle" indeterminate />
1477
+ </div>
1478
+ } @else {
1479
+ <mlv-menu-data-renderer
1480
+ [items]="childItems()"
1481
+ [itemDef]="itemDef()"
1482
+ mode="menu"
1483
+ [parentMenu]="childMenu"
1484
+ [menubar]="menubar()"
1485
+ />
1486
+ }
1487
+ </mlv-menu>
1488
+ }
1489
+
1490
+ <ng-template #_defaultItemDef let-item>
1491
+ <mlv-list-item mlvMenuItem>{{ item.label }}</mlv-list-item>
1492
+ </ng-template>
1493
+ `,
1494
+ encapsulation: ViewEncapsulation.None,
1495
+ changeDetection: ChangeDetectionStrategy.OnPush,
1496
+ imports: [
1497
+ NgTemplateOutlet,
1498
+ MlvListItem,
1499
+ MlvLoader,
1500
+ forwardRef(() => MlvMenu),
1501
+ MlvMenuItem,
1502
+ forwardRef(() => MlvMenuDataRenderer),
1503
+ ],
1504
+ host: {
1505
+ class: 'mlv-menu-data-item',
1506
+ },
1507
+ }]
1508
+ }], ctorParameters: () => [], propDecorators: { _childMenu: [{ type: i0.ViewChild, args: [forwardRef(() => MlvMenu), { isSignal: true }] }], item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], itemDef: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemDef", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], parentMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentMenu", required: false }] }], menubar: [{ type: i0.Input, args: [{ isSignal: true, alias: "menubar", required: false }] }] } });
1509
+
1510
+ /** Internal recursive renderer for data-driven menu rows. */
1511
+ class MlvMenuDataRenderer {
1512
+ _injectedParentMenu = inject(MENU_TOKEN, { optional: true });
1513
+ _injectedMenubar = inject(MENUBAR_TOKEN, { optional: true });
1514
+ /** Current collection to render at this menu level. */
1515
+ items = input.required(/* @ts-ignore */
1516
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1517
+ /** Optional projected row template for each item. */
1518
+ itemDef = input(undefined, /* @ts-ignore */
1519
+ ...(ngDevMode ? [{ debugName: "itemDef" }] : /* istanbul ignore next */ []));
1520
+ /** Whether this renderer is inside a menu or a root menubar. */
1521
+ mode = input('menu', /* @ts-ignore */
1522
+ ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1523
+ /** Parent menu accessor for generated rows at this level. */
1524
+ parentMenu = input(null, /* @ts-ignore */
1525
+ ...(ngDevMode ? [{ debugName: "parentMenu" }] : /* istanbul ignore next */ []));
1526
+ /** Parent menu input, falling back to the nearest menu provider. */
1527
+ _resolvedParentMenu = computed(() => this.parentMenu() ?? this._injectedParentMenu, /* @ts-ignore */
1528
+ ...(ngDevMode ? [{ debugName: "_resolvedParentMenu" }] : /* istanbul ignore next */ []));
1529
+ /** Menubar accessor, falling back to the nearest menubar provider. */
1530
+ _resolvedMenubar = computed(() => this.menubar() ?? this._injectedMenubar, /* @ts-ignore */
1531
+ ...(ngDevMode ? [{ debugName: "_resolvedMenubar" }] : /* istanbul ignore next */ []));
1532
+ /** Root menubar accessor when rows need top-level menubar context. */
1533
+ menubar = input(null, /* @ts-ignore */
1534
+ ...(ngDevMode ? [{ debugName: "menubar" }] : /* istanbul ignore next */ []));
1535
+ /** Whether an entry is a root-level menubar divider. */
1536
+ isDivider(item) {
1537
+ return 'kind' in item && item.kind === 'divider';
1538
+ }
1539
+ /** Narrows a mixed menubar entry to a renderable menu item. */
1540
+ asItem(item) {
1541
+ return item;
1542
+ }
1543
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuDataRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component });
1544
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvMenuDataRenderer, isStandalone: true, selector: "mlv-menu-data-renderer", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, itemDef: { classPropertyName: "itemDef", publicName: "itemDef", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, parentMenu: { classPropertyName: "parentMenu", publicName: "parentMenu", isSignal: true, isRequired: false, transformFunction: null }, menubar: { classPropertyName: "menubar", publicName: "menubar", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "mlv-menu-data-renderer" }, ngImport: i0, template: `
1545
+ @for (item of items(); track item.id) {
1546
+ @if (mode() === 'menubar' && isDivider(item)) {
1547
+ <span
1548
+ class="mlv-menubar__divider"
1549
+ role="separator"
1550
+ aria-orientation="vertical"
1551
+ ></span>
1552
+ } @else {
1553
+ <mlv-menu-data-item
1554
+ [item]="asItem(item)"
1555
+ [index]="$index"
1556
+ [itemDef]="itemDef()"
1557
+ [mode]="mode()"
1558
+ [parentMenu]="mode() === 'menu' ? _resolvedParentMenu() : null"
1559
+ [menubar]="_resolvedMenubar()"
1560
+ />
1561
+ }
1562
+ }
1563
+ `, isInline: true, styles: ["@layer mlv.components{mlv-menu-data-renderer,mlv-menu-data-item{display:contents}.mlv-menu-data-renderer__loader{display:flex;align-items:center;justify-content:center;min-block-size:2.5rem;padding:var(--mlv-padding-s)}}\n"], dependencies: [{ kind: "component", type: MlvMenuDataItem, selector: "mlv-menu-data-item", inputs: ["item", "index", "itemDef", "mode", "parentMenu", "menubar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1564
+ }
1565
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuDataRenderer, decorators: [{
1566
+ type: Component,
1567
+ args: [{ selector: 'mlv-menu-data-renderer', template: `
1568
+ @for (item of items(); track item.id) {
1569
+ @if (mode() === 'menubar' && isDivider(item)) {
1570
+ <span
1571
+ class="mlv-menubar__divider"
1572
+ role="separator"
1573
+ aria-orientation="vertical"
1574
+ ></span>
1575
+ } @else {
1576
+ <mlv-menu-data-item
1577
+ [item]="asItem(item)"
1578
+ [index]="$index"
1579
+ [itemDef]="itemDef()"
1580
+ [mode]="mode()"
1581
+ [parentMenu]="mode() === 'menu' ? _resolvedParentMenu() : null"
1582
+ [menubar]="_resolvedMenubar()"
1583
+ />
1584
+ }
1585
+ }
1586
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MlvMenuDataItem], host: {
1587
+ class: 'mlv-menu-data-renderer',
1588
+ }, styles: ["@layer mlv.components{mlv-menu-data-renderer,mlv-menu-data-item{display:contents}.mlv-menu-data-renderer__loader{display:flex;align-items:center;justify-content:center;min-block-size:2.5rem;padding:var(--mlv-padding-s)}}\n"] }]
1589
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], itemDef: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemDef", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], parentMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentMenu", required: false }] }], menubar: [{ type: i0.Input, args: [{ isSignal: true, alias: "menubar", required: false }] }] } });
1590
+
1591
+ /** Marks a custom template for rendering reactive menu items. */
1592
+ class MlvMenuItemDef {
1593
+ /** The template reference used for each rendered menu row. */
1594
+ templateRef = inject((TemplateRef));
1595
+ /** Type guard so `let-` variables infer from `MlvMenuItemDefContext<T>`. */
1596
+ static ngTemplateContextGuard(_directive, _context) {
1597
+ return true;
1598
+ }
1599
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuItemDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1600
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvMenuItemDef, isStandalone: true, selector: "[mlvMenuItemDef]", ngImport: i0 });
1601
+ }
1602
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuItemDef, decorators: [{
1603
+ type: Directive,
1604
+ args: [{
1605
+ selector: '[mlvMenuItemDef]',
1606
+ }]
1607
+ }] });
1608
+
1609
+ function mlvSameMenuItems(a, b) {
1610
+ return (a.length === b.length &&
1611
+ a.every((item, index) => item.item === b[index] && item.disabled === b[index].disabledBoolean));
1612
+ }
1613
+ /**
1614
+ * The first item at or after `start` that is not disabled, falling back to the
1615
+ * closest enabled item before `start`. Returns `null` when every item is
1616
+ * disabled (or the list is empty).
1617
+ * @private
1618
+ */
1619
+ function mlvNearestEnabledItem(items, start) {
1620
+ for (let index = Math.max(start, 0); index < items.length; index++) {
1621
+ if (!items[index].disabledBoolean)
1622
+ return items[index];
1623
+ }
1624
+ for (let index = Math.min(start, items.length) - 1; index >= 0; index--) {
1625
+ if (!items[index].disabledBoolean)
1626
+ return items[index];
1627
+ }
1628
+ return null;
1629
+ }
1630
+ /**
1631
+ * Dropdown menu panel (`mlv-menu`).
1632
+ *
1633
+ * Renders a `role="menu"` panel containing `mlv-menu-item`, `mlv-menu-separator`,
1634
+ * and `mlv-menu-group` children. Manages keyboard navigation (ArrowUp, ArrowDown,
1635
+ * Home, End, Escape) via `FocusKeyManager`.
1636
+ *
1637
+ * The menu uses `mlv-popup` for visual chrome (background, border, radius, shadow,
1638
+ * animations). The panel is rendered inside the popup's content template via
1639
+ * `[mlvPopupContent]`, so no DOM manipulation is required.
1640
+ *
1641
+ * @example
1642
+ * ```html
1643
+ * <button [mlvMenuTrigger]="myMenu">Open</button>
1644
+ * <mlv-menu #myMenu>
1645
+ * <mlv-menu-item (itemClick)="onEdit()">Edit</mlv-menu-item>
1646
+ * <mlv-menu-separator />
1647
+ * <mlv-menu-item (itemClick)="onDelete()">Delete</mlv-menu-item>
1648
+ * </mlv-menu>
1649
+ * ```
1650
+ */
1651
+ class MlvMenu {
1652
+ // ─── Injected services ────────────────────────────────────────────────────
1653
+ /**
1654
+ * @private Element reference for the host element.
1655
+ */
1656
+ _elementRef = inject((ElementRef));
1657
+ _itemRegistry = inject(MLV_MENU_ITEM_REGISTRY);
1658
+ _dataSourceAdapter = new MlvMenuDataSourceAdapter();
1659
+ // ─── View children ────────────────────────────────────────────────────────
1660
+ /**
1661
+ * @private The popup component managing the overlay chrome (background, border, shadow, animations).
1662
+ * Accessed by `MlvMenuTrigger` to open the overlay and manage animation state.
1663
+ * The menu panel (`mlv-list`) is declared inside this popup's `[mlvPopupContent]` template.
1664
+ */
1665
+ _popup = viewChild.required('_popup', /* @ts-ignore */
1666
+ ...(ngDevMode ? [{ debugName: "_popup" }] : /* istanbul ignore next */ []));
1667
+ // ─── Content children ────────────────────────────────────────────────────
1668
+ _projectedItems = contentChildren(MlvMenuItem, /* @ts-ignore */
1669
+ ...(ngDevMode ? [{ debugName: "_projectedItems" }] : /* istanbul ignore next */ []));
1670
+ /** @protected The projected row definition used by data-driven rendering. */
1671
+ _itemDef = contentChild((MlvMenuItemDef), /* @ts-ignore */
1672
+ ...(ngDevMode ? [{ debugName: "_itemDef" }] : /* istanbul ignore next */ []));
1673
+ /** @protected All registered menu items, in render order. */
1674
+ _items = this._itemRegistry.items;
1675
+ /** @protected Items currently rendered in this menu panel. */
1676
+ _navigationItems = computed(() => {
1677
+ const items = this._items();
1678
+ items.forEach((item) => void item.disabledBoolean);
1679
+ if (!this._dataMode())
1680
+ return items;
1681
+ return items.filter((item) => item._elementRef?.nativeElement.closest('[role="menu"]'));
1682
+ }, /* @ts-ignore */
1683
+ ...(ngDevMode ? [{ debugName: "_navigationItems" }] : /* istanbul ignore next */ []));
1684
+ // ─── Inputs ───────────────────────────────────────────────────────────────
1685
+ /**
1686
+ * Accessible label for the menu panel (`aria-label`).
1687
+ * Use when there is no visible heading that labels the menu.
1688
+ */
1689
+ label = input('', /* @ts-ignore */
1690
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1691
+ /**
1692
+ * Density applied to the menu panel's item rows.
1693
+ *
1694
+ * The panel is portaled to the CDK overlay container, outside the trigger's
1695
+ * DOM tree, so ancestor density classes cannot cascade into it. Forwarded to
1696
+ * the underlying `mlv-popup`, which stamps the resolved `mlv--{density}`
1697
+ * class on the detached panel. When omitted, the global `MlvDensityService`
1698
+ * density applies. Submenus are separate `mlv-menu` instances — set the
1699
+ * input on each when overriding the density of a nested menu tree.
1700
+ */
1701
+ mlvDensity = input(undefined, /* @ts-ignore */
1702
+ ...(ngDevMode ? [{ debugName: "mlvDensity" }] : /* istanbul ignore next */ []));
1703
+ /**
1704
+ * Optional data source for this menu. Arrays render immediately; an
1705
+ * `MlvDataSource` supplies the current collection and loading state.
1706
+ */
1707
+ dataSource = input(undefined, /* @ts-ignore */
1708
+ ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1709
+ // ─── Public identifiers ────────────────────────────────────────────────────
1710
+ /**
1711
+ * Stable DOM id of the menu panel (`role="menu"` list). Consumed by
1712
+ * `MlvMenuTrigger` to wire `aria-controls` from the trigger to the panel.
1713
+ */
1714
+ panelId = mlvNextId('mlv-menu-panel');
1715
+ // ─── Outputs ──────────────────────────────────────────────────────────────
1716
+ /**
1717
+ * Emits when the menu requests to be closed (e.g., Escape key, Tab key,
1718
+ * or after a menu item is activated).
1719
+ */
1720
+ closed = output();
1721
+ // ─── Internal state ───────────────────────────────────────────────────────
1722
+ /**
1723
+ * @private Whether the panel is currently open. Set by `MlvMenuTrigger`.
1724
+ */
1725
+ _isOpen = signal(false, /* @ts-ignore */
1726
+ ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
1727
+ /** @protected Whether this menu is using data-driven rather than projected content. */
1728
+ _dataMode = computed(() => this.dataSource() !== undefined, /* @ts-ignore */
1729
+ ...(ngDevMode ? [{ debugName: "_dataMode" }] : /* istanbul ignore next */ []));
1730
+ /** @protected Current data-driven items normalized from the active source. */
1731
+ _dataSourceItems = this._dataSourceAdapter.items;
1732
+ /** @protected Current loading state normalized from the active source. */
1733
+ _dataSourceLoading = this._dataSourceAdapter.loading;
1734
+ /**
1735
+ * @private Parent menu that opened this menu as a submenu.
1736
+ */
1737
+ _parentMenu = null;
1738
+ /**
1739
+ * @private Controller supplied by the opening `MlvMenuTrigger` when this
1740
+ * menu is a top-level menubar dropdown. Enables ArrowRight / ArrowLeft at the
1741
+ * top level of the panel to cross to the adjacent menubar menu. `null` for
1742
+ * standalone menus and submenus.
1743
+ */
1744
+ _menubarController = null;
1745
+ /** @private Normalizes horizontal menu navigation for RTL layouts. */
1746
+ _rtlService = inject(MlvRtlService);
1747
+ /**
1748
+ * @private `FocusKeyManager` managing the menu items.
1749
+ * Initialized lazily when items are first available.
1750
+ */
1751
+ _keyManager = null;
1752
+ /**
1753
+ * @private Subscription to the key manager's `change` stream, used to keep the
1754
+ * roving tabindex in sync when type-ahead moves the active item asynchronously.
1755
+ */
1756
+ _changeSub = null;
1757
+ /**
1758
+ * @private Snapshot of the items the current `_keyManager` was built from.
1759
+ * Compared member-by-member so a change-detection pass that re-runs the content
1760
+ * query without changing the projected items does not rebuild the manager —
1761
+ * a rebuild resets `activeItemIndex` and would wipe the roving tabindex.
1762
+ */
1763
+ _managedItems = null;
1764
+ /** @private The last menu item that received focus, retained across row removal. */
1765
+ _focusedItem = null;
1766
+ constructor() {
1767
+ effect(() => {
1768
+ const source = this.dataSource();
1769
+ untracked(() => this._dataSourceAdapter.setSource(source ?? []));
1770
+ });
1771
+ afterRenderEffect(() => this._itemRegistry.resync());
1772
+ afterRenderEffect(() => {
1773
+ if (!this._dataMode())
1774
+ return;
1775
+ this._dataSourceItems();
1776
+ untracked(() => this._syncKeyManager(this._navigationItems()));
1777
+ });
1778
+ effect(() => {
1779
+ const projectedItems = this._projectedItems();
1780
+ untracked(() => this._itemRegistry.syncOrder(projectedItems));
1781
+ });
1782
+ // Rebuild the key manager only when the projected item set actually changes.
1783
+ //
1784
+ // The work runs `untracked` on purpose. `_syncTabIndices()` reads
1785
+ // `FocusKeyManager.activeItem`, which CDK backs with a signal; reading it in
1786
+ // the effect's reactive context made the effect depend on the active item, so
1787
+ // *every* arrow keypress re-ran the effect, replaced the manager and reset
1788
+ // `activeItemIndex` to -1 — no item ever kept `tabindex="0"` and ArrowDown /
1789
+ // ArrowUp always snapped back to the first / last item. `_navigationItems()`
1790
+ // must stay the effect's only dependency.
1791
+ effect(() => {
1792
+ const items = this._navigationItems();
1793
+ if (this._dataMode())
1794
+ this._dataSourceItems();
1795
+ untracked(() => this._syncKeyManager(items));
1796
+ });
1797
+ inject(DestroyRef).onDestroy(() => this._teardownKeyManager());
1798
+ }
1799
+ // ─── Public API ───────────────────────────────────────────────────────────
1800
+ /**
1801
+ * Focuses the first non-disabled item in the menu.
1802
+ * Called by `MlvMenuTrigger` when the menu opens via keyboard ArrowDown or Enter.
1803
+ */
1804
+ focusFirstItem() {
1805
+ this._keyManager?.setFirstItemActive();
1806
+ this._syncTabIndices();
1807
+ }
1808
+ /**
1809
+ * Focuses the last non-disabled item in the menu.
1810
+ * Called by `MlvMenuTrigger` when the menu opens via keyboard ArrowUp.
1811
+ */
1812
+ focusLastItem() {
1813
+ this._keyManager?.setLastItemActive();
1814
+ this._syncTabIndices();
1815
+ }
1816
+ // ─── MlvMenuAccessor ─────────────────────────────────────────────────────────
1817
+ /**
1818
+ * Closes the menu panel by emitting the `closed` output.
1819
+ * Called by `MlvMenuItem` after item activation and by the keyboard handler.
1820
+ */
1821
+ close() {
1822
+ this._isOpen.set(false);
1823
+ this.closed.emit();
1824
+ }
1825
+ /**
1826
+ * Closes this menu panel and any ancestor menu panels.
1827
+ * Called by submenu items so selecting a nested action dismisses the full menu stack.
1828
+ */
1829
+ closeAll() {
1830
+ this.close();
1831
+ this._parentMenu?.closeAll();
1832
+ }
1833
+ /**
1834
+ * Registers the parent menu that owns this menu when it is opened as a submenu.
1835
+ * Called by `MlvMenuTrigger` while opening submenu overlays.
1836
+ */
1837
+ registerParentMenu(parentMenu) {
1838
+ this._parentMenu = parentMenu;
1839
+ }
1840
+ /**
1841
+ * Registers (or clears) the menubar controller when this menu is opened as a
1842
+ * top-level menubar dropdown. Called by `MlvMenuTrigger` while opening.
1843
+ */
1844
+ registerMenubarController(controller) {
1845
+ this._menubarController = controller;
1846
+ }
1847
+ // ─── Protected handlers ──────────────────────────────────────────────────
1848
+ /**
1849
+ * @protected Routes keydown events to `FocusKeyManager` and handles Escape / Tab.
1850
+ */
1851
+ _onKeydown(event) {
1852
+ if (event.key === 'Escape') {
1853
+ event.preventDefault();
1854
+ this.close();
1855
+ return;
1856
+ }
1857
+ if (event.key === 'Tab') {
1858
+ // Close the menu and let the trigger restore focus (see MlvMenuTrigger).
1859
+ event.preventDefault();
1860
+ event.stopPropagation();
1861
+ this.close();
1862
+ return;
1863
+ }
1864
+ const key = this._rtlService.normalizeArrowKey(event);
1865
+ // Top-level menubar dropdown: ArrowRight / ArrowLeft cross to the adjacent
1866
+ // menubar menu. A focused submenu-trigger item handles ArrowRight itself
1867
+ // (and stops propagation), so the submenu opens instead — submenu wins.
1868
+ if (this._menubarController) {
1869
+ if (key === RIGHT_ARROW) {
1870
+ event.preventDefault();
1871
+ event.stopPropagation();
1872
+ this._menubarController.openNextItemMenu();
1873
+ return;
1874
+ }
1875
+ if (key === LEFT_ARROW && !this._parentMenu) {
1876
+ event.preventDefault();
1877
+ event.stopPropagation();
1878
+ this._menubarController.openPreviousItemMenu();
1879
+ return;
1880
+ }
1881
+ }
1882
+ // ArrowLeft inside a submenu closes it and returns focus to the parent
1883
+ // trigger item (handled by the submenu trigger's close-focus restore).
1884
+ if (key === LEFT_ARROW && this._parentMenu) {
1885
+ event.preventDefault();
1886
+ event.stopPropagation();
1887
+ this.close();
1888
+ return;
1889
+ }
1890
+ this._keyManager?.onKeydown(event);
1891
+ this._syncTabIndices();
1892
+ }
1893
+ /** @protected Remembers item focus before a live data update can remove its row. */
1894
+ _onFocusIn(event) {
1895
+ const target = event.target;
1896
+ this._focusedItem =
1897
+ this._navigationItems().find((item) => item._elementRef?.nativeElement === target) ?? null;
1898
+ }
1899
+ // ─── Private helpers ──────────────────────────────────────────────────────
1900
+ /**
1901
+ * @private Reconciles the `FocusKeyManager` with the projected items.
1902
+ *
1903
+ * No-ops when the item set is unchanged — rebuilding a manager throws away its
1904
+ * `activeItemIndex`, which is what previously broke arrow navigation. When the
1905
+ * set really did change the manager is replaced and the active item carried
1906
+ * over, so the roving tabindex survives adding or removing an item.
1907
+ */
1908
+ _syncKeyManager(items) {
1909
+ if (this._managedItems && mlvSameMenuItems(this._managedItems, items)) {
1910
+ return;
1911
+ }
1912
+ const previousItem = this._keyManager?.activeItem ?? null;
1913
+ const previousIndex = this._keyManager?.activeItemIndex ?? -1;
1914
+ // Snapshot so later in-place mutation of the query result cannot make the
1915
+ // comparison above lie, and so the manager holds a stable item array.
1916
+ const snapshot = Array.from(items);
1917
+ this._managedItems = snapshot.map((item) => ({
1918
+ item,
1919
+ disabled: item.disabledBoolean,
1920
+ }));
1921
+ this._teardownKeyManager();
1922
+ if (snapshot.length > 0) {
1923
+ this._initKeyManager(snapshot);
1924
+ this._restoreActiveItem(snapshot, previousItem, previousIndex);
1925
+ }
1926
+ this._syncTabIndices();
1927
+ }
1928
+ /**
1929
+ * @private Creates the `FocusKeyManager` for `items`.
1930
+ * Skips items whose `disabled` property is `true`.
1931
+ *
1932
+ * `withTypeAhead()` enables type-to-focus (press a letter to jump to the
1933
+ * first matching item by its `getLabel()`). Type-ahead matching is debounced
1934
+ * and can move the active item outside of `_onKeydown`, so the manager's
1935
+ * `change` stream is used to keep the roving tabindex in sync.
1936
+ */
1937
+ _initKeyManager(items) {
1938
+ this._keyManager = new FocusKeyManager(items)
1939
+ .withVerticalOrientation()
1940
+ .withWrap()
1941
+ .withHomeAndEnd()
1942
+ .withTypeAhead()
1943
+ .skipPredicate((item) => item.disabledBoolean);
1944
+ this._changeSub = this._keyManager.change.subscribe(() => this._syncTabIndices());
1945
+ }
1946
+ /**
1947
+ * @private Disposes the current key manager and its `change` subscription.
1948
+ */
1949
+ _teardownKeyManager() {
1950
+ this._changeSub?.unsubscribe();
1951
+ this._changeSub = null;
1952
+ this._keyManager?.destroy();
1953
+ this._keyManager = null;
1954
+ }
1955
+ /**
1956
+ * @private Carries the active item of the previous key manager over to a freshly
1957
+ * built one, using `updateActiveItem()` so the roving tabindex is restored
1958
+ * without stealing DOM focus. When the previously active item was removed (or
1959
+ * became disabled) the nearest enabled item to its old position takes over.
1960
+ * Does nothing when no item was active yet.
1961
+ */
1962
+ _restoreActiveItem(items, previousItem, previousIndex) {
1963
+ const keyManager = this._keyManager;
1964
+ if (!keyManager || previousIndex < 0)
1965
+ return;
1966
+ const shouldRestoreFocus = this._focusedItem === previousItem;
1967
+ if (previousItem &&
1968
+ !previousItem.disabledBoolean &&
1969
+ items.indexOf(previousItem) > -1) {
1970
+ keyManager.updateActiveItem(previousItem);
1971
+ return;
1972
+ }
1973
+ const fallback = mlvNearestEnabledItem(items, previousIndex);
1974
+ if (fallback)
1975
+ keyManager.updateActiveItem(fallback);
1976
+ if (fallback && shouldRestoreFocus && this._isOpen()) {
1977
+ this._focusedItem = fallback;
1978
+ fallback.focus();
1979
+ }
1980
+ }
1981
+ /**
1982
+ * @private Updates `_tabIndex` on every item so that exactly one item has
1983
+ * `tabindex="0"` (roving tabindex pattern) and all others have `-1`.
1984
+ *
1985
+ * That is the active item once keyboard navigation has started. Before then —
1986
+ * a pointer-opened panel puts focus on the `role="menu"` list itself — the first
1987
+ * enabled item is the tab stop, so the open menu is never entirely untabbable.
1988
+ */
1989
+ _syncTabIndices() {
1990
+ const items = this._navigationItems();
1991
+ const activeItem = (this._keyManager?.activeItem ??
1992
+ null);
1993
+ const tabbableItem = activeItem ?? mlvNearestEnabledItem(items, 0);
1994
+ items.forEach((item) => item._tabIndex.set(item === tabbableItem ? 0 : -1));
1995
+ }
1996
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
1997
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvMenu, isStandalone: true, selector: "mlv-menu", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, mlvDensity: { classPropertyName: "mlvDensity", publicName: "mlvDensity", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { properties: { "class.mlv-menu--open": "_isOpen()" }, classAttribute: "mlv-menu" }, providers: [
1998
+ {
1999
+ provide: MENU_TOKEN,
2000
+ useExisting: MlvMenu,
2001
+ },
2002
+ {
2003
+ provide: MLV_MENU_ITEM_REGISTRY,
2004
+ useFactory: () => new MlvMenuItemRegistryStore(),
2005
+ },
2006
+ ], queries: [{ propertyName: "_projectedItems", predicate: MlvMenuItem, isSignal: true }, { propertyName: "_itemDef", first: true, predicate: (MlvMenuItemDef), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_popup", first: true, predicate: ["_popup"], descendants: true, isSignal: true }], ngImport: i0, template: `
2007
+ <mlv-popup
2008
+ #_popup
2009
+ [position]="['bottom-start', 'top-start', 'bottom-end', 'top-end']"
2010
+ [hasShadow]="true"
2011
+ [restrictPosition]="false"
2012
+ [mlvDensity]="mlvDensity()"
2013
+ [class]="'mlv-menu__popup'"
2014
+ >
2015
+ <ng-template mlvPopupContent>
2016
+ <mlv-list
2017
+ listRole="menu"
2018
+ appearance="menu"
2019
+ class="mlv-menu__panel"
2020
+ tabindex="-1"
2021
+ [id]="panelId"
2022
+ [attr.aria-label]="label() || null"
2023
+ (keydown)="_onKeydown($event)"
2024
+ (focusin)="_onFocusIn($event)"
2025
+ >
2026
+ @if (_dataMode()) {
2027
+ @if (_dataSourceLoading()) {
2028
+ <div class="mlv-menu__loader">
2029
+ <mlv-loader variant="circle" indeterminate [size]="20" />
2030
+ </div>
2031
+ } @else {
2032
+ <mlv-menu-data-renderer
2033
+ [items]="_dataSourceItems()"
2034
+ [itemDef]="_itemDef()"
2035
+ mode="menu"
2036
+ />
2037
+ }
2038
+ } @else {
2039
+ <ng-content />
2040
+ }
2041
+ </mlv-list>
2042
+ </ng-template>
2043
+ </mlv-popup>
2044
+ `, isInline: true, styles: ["@layer mlv.components{.mlv-menu{display:contents}.mlv-menu__popup{padding:var(--mlv-popover-inset);overflow:hidden}.mlv-menu__panel{display:flex;flex-direction:column;min-width:10rem;max-width:20rem;--mlv-list-padding-block: 0;--mlv-list-padding-inline: 0;gap:0;overflow:hidden;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m);box-sizing:border-box}.mlv-menu__loader{display:flex;align-items:center;justify-content:center;min-block-size:2.5rem;padding:var(--mlv-padding-s)}.mlv-menu__panel .mlv-list-item{border-radius:var(--mlv-popover-item-radius);--mlv-list-item-padding-block: var(--mlv-popover-item-padding);--mlv-list-item-padding-inline: var(--mlv-popover-item-padding);font-size:var(--mlv-font-size-m)}.mlv-menu__panel .mlv-list-item:focus-visible{outline-offset:calc(var(--mlv-focus-ring-offset) * -1)}.mlv-menu__panel .mlv-list-item [mlvlistitemsuffix]{display:inline-flex;flex:0 0 var(--form-ctrl-icon-size, 1.25rem);align-items:center;justify-content:center;inline-size:var(--form-ctrl-icon-size, 1.25rem);block-size:var(--form-ctrl-icon-size, 1.25rem);color:var(--mlv-text-tertiary)}.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface{position:relative;padding-inline-end:calc(var(--mlv-list-item-padding-inline) + var(--form-ctrl-icon-size, 1.25rem))}.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface:after{content:\"\";position:absolute;inset-block-start:50%;inset-inline-end:var(--mlv-list-item-padding-inline);inline-size:var(--form-ctrl-icon-size, 1.25rem);block-size:var(--form-ctrl-icon-size, 1.25rem);border-block-start:var(--mlv-stroke-width-medium) solid currentColor;border-inline-end:var(--mlv-stroke-width-medium) solid currentColor;color:var(--mlv-text-tertiary);pointer-events:none;transform:translateY(-50%) rotate(45deg) scale(.6);transform-origin:center;transition:color var(--mlv-duration-fast) var(--mlv-ease-out)}.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface:hover:after,.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface:focus-visible:after,.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface[aria-expanded=true]:after{color:var(--mlv-text-primary)}.mlv-menu-separator{display:block;margin:var(--mlv-spacing-1) 0}.mlv-menu-separator__line{border:none;border-top:var(--mlv-stroke-width) solid var(--mlv-border-subtle);margin:0}.mlv-menu-group{display:block}.mlv-menu-group__label{display:block;padding:var(--mlv-spacing-1) var(--mlv-popover-item-padding);font-size:var(--mlv-typography-ui-s-size);font-weight:var(--mlv-font-weight-medium);color:var(--mlv-text-secondary);text-transform:uppercase;letter-spacing:.05em;pointer-events:none}}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => MlvPopup), selector: "mlv-popup", inputs: ["position", "positions", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "hasArrow", "hasShadow", "class", "mlvDensity", "flexibleDimensions", "scrollStrategy", "hasBackdrop", "restrictPosition", "panelRole", "modal", "ariaLabel", "dismissExcludeElements", "mobileMode", "mobileBreakpoint", "mobileTitle", "mobileCloseLabel", "opened"], outputs: ["openedChange", "afterOpened", "afterClosed"] }, { kind: "directive", type: i0.forwardRef(() => MlvPopupContent), selector: "[mlvPopupContent]" }, { kind: "component", type: i0.forwardRef(() => MlvList), selector: "mlv-list", inputs: ["listRole", "variant", "appearance"] }, { kind: "component", type: i0.forwardRef(() => MlvLoader), selector: "mlv-loader", inputs: ["variant", "tone", "value", "max", "indeterminate", "size", "strokeWidth", "ariaLabel", "showHint", "color", "trackColor", "glow"] }, { kind: "component", type: i0.forwardRef(() => MlvMenuDataRenderer), selector: "mlv-menu-data-renderer", inputs: ["items", "itemDef", "mode", "parentMenu", "menubar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2045
+ }
2046
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenu, decorators: [{
2047
+ type: Component,
2048
+ args: [{ selector: 'mlv-menu', template: `
2049
+ <mlv-popup
2050
+ #_popup
2051
+ [position]="['bottom-start', 'top-start', 'bottom-end', 'top-end']"
2052
+ [hasShadow]="true"
2053
+ [restrictPosition]="false"
2054
+ [mlvDensity]="mlvDensity()"
2055
+ [class]="'mlv-menu__popup'"
2056
+ >
2057
+ <ng-template mlvPopupContent>
2058
+ <mlv-list
2059
+ listRole="menu"
2060
+ appearance="menu"
2061
+ class="mlv-menu__panel"
2062
+ tabindex="-1"
2063
+ [id]="panelId"
2064
+ [attr.aria-label]="label() || null"
2065
+ (keydown)="_onKeydown($event)"
2066
+ (focusin)="_onFocusIn($event)"
2067
+ >
2068
+ @if (_dataMode()) {
2069
+ @if (_dataSourceLoading()) {
2070
+ <div class="mlv-menu__loader">
2071
+ <mlv-loader variant="circle" indeterminate [size]="20" />
2072
+ </div>
2073
+ } @else {
2074
+ <mlv-menu-data-renderer
2075
+ [items]="_dataSourceItems()"
2076
+ [itemDef]="_itemDef()"
2077
+ mode="menu"
2078
+ />
2079
+ }
2080
+ } @else {
2081
+ <ng-content />
2082
+ }
2083
+ </mlv-list>
2084
+ </ng-template>
2085
+ </mlv-popup>
2086
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2087
+ MlvPopup,
2088
+ MlvPopupContent,
2089
+ MlvList,
2090
+ MlvLoader,
2091
+ forwardRef(() => MlvMenuDataRenderer),
2092
+ ], host: {
2093
+ class: 'mlv-menu',
2094
+ '[class.mlv-menu--open]': '_isOpen()',
2095
+ }, providers: [
2096
+ {
2097
+ provide: MENU_TOKEN,
2098
+ useExisting: MlvMenu,
2099
+ },
2100
+ {
2101
+ provide: MLV_MENU_ITEM_REGISTRY,
2102
+ useFactory: () => new MlvMenuItemRegistryStore(),
2103
+ },
2104
+ ], styles: ["@layer mlv.components{.mlv-menu{display:contents}.mlv-menu__popup{padding:var(--mlv-popover-inset);overflow:hidden}.mlv-menu__panel{display:flex;flex-direction:column;min-width:10rem;max-width:20rem;--mlv-list-padding-block: 0;--mlv-list-padding-inline: 0;gap:0;overflow:hidden;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m);box-sizing:border-box}.mlv-menu__loader{display:flex;align-items:center;justify-content:center;min-block-size:2.5rem;padding:var(--mlv-padding-s)}.mlv-menu__panel .mlv-list-item{border-radius:var(--mlv-popover-item-radius);--mlv-list-item-padding-block: var(--mlv-popover-item-padding);--mlv-list-item-padding-inline: var(--mlv-popover-item-padding);font-size:var(--mlv-font-size-m)}.mlv-menu__panel .mlv-list-item:focus-visible{outline-offset:calc(var(--mlv-focus-ring-offset) * -1)}.mlv-menu__panel .mlv-list-item [mlvlistitemsuffix]{display:inline-flex;flex:0 0 var(--form-ctrl-icon-size, 1.25rem);align-items:center;justify-content:center;inline-size:var(--form-ctrl-icon-size, 1.25rem);block-size:var(--form-ctrl-icon-size, 1.25rem);color:var(--mlv-text-tertiary)}.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface{position:relative;padding-inline-end:calc(var(--mlv-list-item-padding-inline) + var(--form-ctrl-icon-size, 1.25rem))}.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface:after{content:\"\";position:absolute;inset-block-start:50%;inset-inline-end:var(--mlv-list-item-padding-inline);inline-size:var(--form-ctrl-icon-size, 1.25rem);block-size:var(--form-ctrl-icon-size, 1.25rem);border-block-start:var(--mlv-stroke-width-medium) solid currentColor;border-inline-end:var(--mlv-stroke-width-medium) solid currentColor;color:var(--mlv-text-tertiary);pointer-events:none;transform:translateY(-50%) rotate(45deg) scale(.6);transform-origin:center;transition:color var(--mlv-duration-fast) var(--mlv-ease-out)}.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface:hover:after,.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface:focus-visible:after,.mlv-menu__panel .mlv-menu-data-renderer__submenu-trigger:not(:has([mlvlistitemsuffix])) .mlv-list-item__surface[aria-expanded=true]:after{color:var(--mlv-text-primary)}.mlv-menu-separator{display:block;margin:var(--mlv-spacing-1) 0}.mlv-menu-separator__line{border:none;border-top:var(--mlv-stroke-width) solid var(--mlv-border-subtle);margin:0}.mlv-menu-group{display:block}.mlv-menu-group__label{display:block;padding:var(--mlv-spacing-1) var(--mlv-popover-item-padding);font-size:var(--mlv-typography-ui-s-size);font-weight:var(--mlv-font-weight-medium);color:var(--mlv-text-secondary);text-transform:uppercase;letter-spacing:.05em;pointer-events:none}}\n"] }]
2105
+ }], ctorParameters: () => [], propDecorators: { _popup: [{ type: i0.ViewChild, args: ['_popup', { isSignal: true }] }], _projectedItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MlvMenuItem), { isSignal: true }] }], _itemDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvMenuItemDef), { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], mlvDensity: [{ type: i0.Input, args: [{ isSignal: true, alias: "mlvDensity", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
2106
+
2107
+ /**
2108
+ * A visual separator between groups of menu items in a `mlv-menu`.
2109
+ *
2110
+ * Renders as a horizontal rule (`<hr role="separator">`) styled to match
2111
+ * `mlv-divider` visual design.
2112
+ *
2113
+ * @example
2114
+ * ```html
2115
+ * <mlv-menu-item (itemClick)="onEdit()">Edit</mlv-menu-item>
2116
+ * <mlv-menu-separator />
2117
+ * <mlv-menu-item (itemClick)="onDelete()">Delete</mlv-menu-item>
2118
+ * ```
2119
+ */
2120
+ class MlvMenuSeparator {
2121
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuSeparator, deps: [], target: i0.ɵɵFactoryTarget.Component });
2122
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: MlvMenuSeparator, isStandalone: true, selector: "mlv-menu-separator", host: { attributes: { "role": "presentation" }, classAttribute: "mlv-menu-separator" }, ngImport: i0, template: `<hr
2123
+ class="mlv-menu-separator__line"
2124
+ role="separator"
2125
+ aria-orientation="horizontal"
2126
+ />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2127
+ }
2128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuSeparator, decorators: [{
2129
+ type: Component,
2130
+ args: [{
2131
+ selector: 'mlv-menu-separator',
2132
+ template: `<hr
2133
+ class="mlv-menu-separator__line"
2134
+ role="separator"
2135
+ aria-orientation="horizontal"
2136
+ />`,
2137
+ encapsulation: ViewEncapsulation.None,
2138
+ changeDetection: ChangeDetectionStrategy.OnPush,
2139
+ host: {
2140
+ class: 'mlv-menu-separator',
2141
+ role: 'presentation',
2142
+ },
2143
+ }]
2144
+ }] });
2145
+
2146
+ /**
2147
+ * Marks an element as the label for a `mlv-menu-group`.
2148
+ * The group applies `aria-labelledby` pointing to this element's generated id.
2149
+ *
2150
+ * @example
2151
+ * ```html
2152
+ * <mlv-menu-group>
2153
+ * <span mlvMenuGroupLabel>File actions</span>
2154
+ * <mlv-menu-item>Open</mlv-menu-item>
2155
+ * </mlv-menu-group>
2156
+ * ```
2157
+ */
2158
+ class MlvMenuGroupLabel {
2159
+ /**
2160
+ * Stable DOM id applied to the label element so the parent
2161
+ * `mlv-menu-group` can reference it via `aria-labelledby`.
2162
+ */
2163
+ id = mlvNextId('mlv-menu-group-label');
2164
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuGroupLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2165
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvMenuGroupLabel, isStandalone: true, selector: "[mlvMenuGroupLabel]", host: { properties: { "id": "id" }, classAttribute: "mlv-menu-group__label" }, ngImport: i0 });
2166
+ }
2167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuGroupLabel, decorators: [{
2168
+ type: Directive,
2169
+ args: [{
2170
+ selector: '[mlvMenuGroupLabel]',
2171
+ host: {
2172
+ class: 'mlv-menu-group__label',
2173
+ '[id]': 'id',
2174
+ },
2175
+ }]
2176
+ }] });
2177
+
2178
+ /**
2179
+ * Groups related menu items with an optional label inside a `mlv-menu`.
2180
+ *
2181
+ * Use `[mlvMenuGroupLabel]` on a child element to provide an accessible label
2182
+ * for the group. When present, the group's `role="group"` is named via
2183
+ * `aria-labelledby` pointing at the label element.
2184
+ *
2185
+ * @example
2186
+ * ```html
2187
+ * <mlv-menu-group>
2188
+ * <span mlvMenuGroupLabel>File</span>
2189
+ * <mlv-menu-item (itemClick)="onNew()">New</mlv-menu-item>
2190
+ * <mlv-menu-item (itemClick)="onOpen()">Open</mlv-menu-item>
2191
+ * </mlv-menu-group>
2192
+ * ```
2193
+ */
2194
+ class MlvMenuGroup {
2195
+ /**
2196
+ * @protected Projected `[mlvMenuGroupLabel]` element, if any. Its generated
2197
+ * id names this group via `aria-labelledby`.
2198
+ */
2199
+ _label = contentChild(MlvMenuGroupLabel, /* @ts-ignore */
2200
+ ...(ngDevMode ? [{ debugName: "_label" }] : /* istanbul ignore next */ []));
2201
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
2202
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: MlvMenuGroup, isStandalone: true, selector: "mlv-menu-group", host: { attributes: { "role": "group" }, properties: { "attr.aria-labelledby": "_label()?.id ?? null" }, classAttribute: "mlv-menu-group" }, queries: [{ propertyName: "_label", first: true, predicate: MlvMenuGroupLabel, descendants: true, isSignal: true }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2203
+ }
2204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenuGroup, decorators: [{
2205
+ type: Component,
2206
+ args: [{
2207
+ selector: 'mlv-menu-group',
2208
+ template: `<ng-content />`,
2209
+ encapsulation: ViewEncapsulation.None,
2210
+ changeDetection: ChangeDetectionStrategy.OnPush,
2211
+ host: {
2212
+ class: 'mlv-menu-group',
2213
+ role: 'group',
2214
+ '[attr.aria-labelledby]': '_label()?.id ?? null',
2215
+ },
2216
+ }]
2217
+ }], propDecorators: { _label: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvMenuGroupLabel), { isSignal: true }] }] } });
2218
+
2219
+ /**
2220
+ * Horizontal application menu bar (`mlv-menubar`) — a File / Edit / View style
2221
+ * row of top-level menu triggers, implementing the
2222
+ * [WAI-ARIA Menubar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/menubar/).
2223
+ *
2224
+ * Wrap a set of `[mlvMenuTrigger]` elements. Each trigger opens a standard
2225
+ * `mlv-menu` dropdown; the bar coordinates them:
2226
+ *
2227
+ * - `role="menubar"` container with a **roving tabindex** across the top-level
2228
+ * items (only the active item is in the tab order).
2229
+ * - `ArrowLeft` / `ArrowRight` move between top-level items (wrapping); `Home` /
2230
+ * `End` jump to the first / last; printable characters type-ahead by label.
2231
+ * - `ArrowDown` / `Enter` / `Space` open the focused item's menu with focus on
2232
+ * its first item; `ArrowUp` opens with focus on the last item (handled by the
2233
+ * trigger).
2234
+ * - While any dropdown is open, hovering or arrowing to another top-level item
2235
+ * closes the current menu and opens the sibling (hover-follow only-while-open).
2236
+ * - `ArrowRight` / `ArrowLeft` at the top level of an open dropdown cross to the
2237
+ * adjacent menubar menu; a focused submenu trigger's own `ArrowRight` wins.
2238
+ * - `Escape` closes the menu and restores focus to its top-level item.
2239
+ *
2240
+ * Declare the `mlv-menu` panels **as siblings of the menubar** (outside its
2241
+ * content), so the bar's `contentChildren` query only picks up the top-level
2242
+ * triggers — see the example below.
2243
+ *
2244
+ * @example
2245
+ * ```html
2246
+ * <mlv-menubar aria-label="Main">
2247
+ * <button mlvButton variant="transparent" [mlvMenuTrigger]="fileMenu">File</button>
2248
+ * <button mlvButton variant="transparent" [mlvMenuTrigger]="editMenu">Edit</button>
2249
+ * </mlv-menubar>
2250
+ *
2251
+ * <mlv-menu #fileMenu label="File">
2252
+ * <mlv-list-item mlvMenuItem (itemClick)="onNew()">New</mlv-list-item>
2253
+ * </mlv-menu>
2254
+ * <mlv-menu #editMenu label="Edit">
2255
+ * <mlv-list-item mlvMenuItem (itemClick)="onUndo()">Undo</mlv-list-item>
2256
+ * </mlv-menu>
2257
+ * ```
2258
+ */
2259
+ class MlvMenubar {
2260
+ // ─── Injected services ────────────────────────────────────────────────────
2261
+ /** @private Host element reference. */
2262
+ _elementRef = inject((ElementRef));
2263
+ _itemRegistry = inject(MLV_MENUBAR_ITEM_REGISTRY);
2264
+ _rtlService = inject(MlvRtlService);
2265
+ _dataSourceAdapter = new MlvMenuDataSourceAdapter();
2266
+ /**
2267
+ * @private The `aria-label` the consumer placed directly on the `<mlv-menubar>`
2268
+ * element, captured before the host binding runs. Used as the accessible-name
2269
+ * fallback so a natively-provided `aria-label` is preserved when the `label`
2270
+ * input is not used — without it the `[attr.aria-label]` host binding would
2271
+ * clobber the consumer's attribute with `null`.
2272
+ */
2273
+ _initialAriaLabel = inject(new HostAttributeToken('aria-label'), { optional: true });
2274
+ // ─── Content children ─────────────────────────────────────────────────────
2275
+ _projectedItems = contentChildren(MlvMenuTrigger, /* @ts-ignore */
2276
+ ...(ngDevMode ? [{ debugName: "_projectedItems" }] : /* istanbul ignore next */ []));
2277
+ /** @protected The projected row definition used by data-driven rendering. */
2278
+ _itemDef = contentChild((MlvMenuItemDef), /* @ts-ignore */
2279
+ ...(ngDevMode ? [{ debugName: "_itemDef" }] : /* istanbul ignore next */ []));
2280
+ /** @protected The registered top-level menu triggers, in render order. */
2281
+ _items = this._itemRegistry.items;
2282
+ // ─── Inputs ───────────────────────────────────────────────────────────────
2283
+ /**
2284
+ * Accessible label for the menubar (`aria-label`). Use when there is no
2285
+ * visible heading that labels the bar.
2286
+ */
2287
+ label = input('', /* @ts-ignore */
2288
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2289
+ /**
2290
+ * Optional reactive source for the root menubar entries. Entries may be
2291
+ * menu-item data or `{ kind: 'divider', id }` separator records.
2292
+ */
2293
+ dataSource = input(undefined, /* @ts-ignore */
2294
+ ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
2295
+ // ─── Internal state ───────────────────────────────────────────────────────
2296
+ /**
2297
+ * @private `FocusKeyManager` managing the roving tabindex and horizontal
2298
+ * arrow / Home / End / type-ahead navigation across top-level items.
2299
+ */
2300
+ _keyManager = null;
2301
+ /**
2302
+ * @private Subscription to the key manager's `change` stream, keeping the
2303
+ * roving tabindex in sync when type-ahead moves the active item.
2304
+ */
2305
+ _changeSub = null;
2306
+ /**
2307
+ * @private The top-level item whose dropdown is currently open, or `null`
2308
+ * when the whole bar is closed.
2309
+ */
2310
+ _openItem = null;
2311
+ /** @protected Whether the bar is rendering reactive data instead of projected triggers. */
2312
+ _dataMode = computed(() => this.dataSource() !== undefined, /* @ts-ignore */
2313
+ ...(ngDevMode ? [{ debugName: "_dataMode" }] : /* istanbul ignore next */ []));
2314
+ /** @protected Current entries normalized from the active reactive source. */
2315
+ _dataSourceItems = this._dataSourceAdapter.items;
2316
+ /** @protected Current source loading state. */
2317
+ _dataSourceLoading = this._dataSourceAdapter.loading;
2318
+ constructor() {
2319
+ effect(() => {
2320
+ const source = this.dataSource();
2321
+ untracked(() => this._dataSourceAdapter.setSource(source ?? []));
2322
+ });
2323
+ afterRenderEffect(() => this._itemRegistry.resync());
2324
+ effect(() => {
2325
+ const projectedItems = this._projectedItems();
2326
+ if (this._dataMode())
2327
+ return;
2328
+ untracked(() => this._itemRegistry.syncOrder(projectedItems));
2329
+ });
2330
+ // (Re)build the key manager whenever the set of top-level items changes.
2331
+ //
2332
+ // The effect deliberately depends ONLY on the `_items()` query. All the
2333
+ // imperative work below both READS reactive signals (`menuTriggerDisabled()`
2334
+ // via the key manager's `skipPredicate`) and WRITES them (`_tabIndex` in
2335
+ // `_syncTabIndices`). Because writing `_tabIndex` dirties the child trigger
2336
+ // effects — and therefore the view — leaving those reads tracked would let
2337
+ // the effect re-notify itself on every view refresh, spinning synchronously.
2338
+ // Running the side effects in `untracked` keeps the sole reactive dependency
2339
+ // the item set, which is the only thing that should trigger a rebuild.
2340
+ effect(() => {
2341
+ const items = this._items();
2342
+ const direction = this._rtlService.direction();
2343
+ untracked(() => {
2344
+ if (items.length > 0) {
2345
+ this._initKeyManager(items, direction);
2346
+ this._syncTabIndices();
2347
+ }
2348
+ });
2349
+ });
2350
+ inject(DestroyRef).onDestroy(() => this._changeSub?.unsubscribe());
2351
+ }
2352
+ // ─── MlvMenubarAccessor ──────────────────────────────────────────────────────
2353
+ /** Host element of the menubar (used as a click-outside exclusion). */
2354
+ get hostElement() {
2355
+ return this._elementRef.nativeElement;
2356
+ }
2357
+ /**
2358
+ * Records `item` as the open dropdown, closing any previously-open sibling
2359
+ * and syncing the roving tabindex so the bar's active item follows the open
2360
+ * menu. Called by a child trigger from its open path.
2361
+ */
2362
+ notifyItemOpened(item) {
2363
+ const previous = this._openItem;
2364
+ this._openItem = item;
2365
+ if (previous && previous !== item) {
2366
+ previous.closeMenu();
2367
+ }
2368
+ this._keyManager?.setActiveItem(item);
2369
+ this._syncTabIndices();
2370
+ }
2371
+ /** Clears the open-item record when `item`'s dropdown closes. */
2372
+ notifyItemClosed(item) {
2373
+ if (this._openItem === item) {
2374
+ this._openItem = null;
2375
+ }
2376
+ }
2377
+ /** Whether any dropdown in the bar is currently open. */
2378
+ hasOpenMenu() {
2379
+ return this._openItem !== null;
2380
+ }
2381
+ /**
2382
+ * Hover-follow: while a dropdown is already open, opening the hovered item's
2383
+ * dropdown (which, via `notifyItemOpened`, closes the previous one). Does
2384
+ * nothing when the bar is fully closed or the item is disabled/already open.
2385
+ */
2386
+ onItemPointerEnter(item) {
2387
+ if (!this.hasOpenMenu())
2388
+ return;
2389
+ if (item === this._openItem || item.disabledBoolean)
2390
+ return;
2391
+ item.openMenu();
2392
+ }
2393
+ /**
2394
+ * Crosses from the open dropdown to an adjacent top-level item's menu,
2395
+ * wrapping over disabled items, and opens it with focus on its first item.
2396
+ */
2397
+ openAdjacentItemMenu(from, dir) {
2398
+ const items = this._navigableItems();
2399
+ const index = items.indexOf(from);
2400
+ if (index === -1 || items.length === 0)
2401
+ return;
2402
+ const target = items[(index + dir + items.length) % items.length];
2403
+ if (target === from)
2404
+ return;
2405
+ from.closeMenu();
2406
+ this._keyManager?.setActiveItem(target);
2407
+ this._syncTabIndices();
2408
+ target.openMenuWithFirstItemFocused();
2409
+ }
2410
+ // ─── Protected handlers ───────────────────────────────────────────────────
2411
+ /**
2412
+ * @protected Menubar-level keyboard handler.
2413
+ *
2414
+ * Opening keys (`Enter`, `Space`, `ArrowDown`, `ArrowUp`) are handled by the
2415
+ * focused trigger itself, so they are ignored here. Everything else is routed
2416
+ * to `FocusKeyManager` for horizontal navigation, Home/End, and type-ahead.
2417
+ * If a dropdown is open when the active item changes, the newly-focused item's
2418
+ * menu is opened (open-follow).
2419
+ */
2420
+ _onKeydown(event) {
2421
+ const key = this._rtlService.normalizeArrowKey(event);
2422
+ switch (key ?? event.key) {
2423
+ case 'Enter':
2424
+ case ' ':
2425
+ case DOWN_ARROW:
2426
+ case UP_ARROW:
2427
+ return;
2428
+ }
2429
+ const keyManager = this._keyManager;
2430
+ if (!keyManager)
2431
+ return;
2432
+ const before = keyManager.activeItem;
2433
+ keyManager.onKeydown(event);
2434
+ const after = keyManager.activeItem;
2435
+ if (after && after !== before) {
2436
+ this._syncTabIndices();
2437
+ if (this._openItem && after !== this._openItem) {
2438
+ after.openMenu();
2439
+ }
2440
+ }
2441
+ }
2442
+ // ─── Private helpers ──────────────────────────────────────────────────────
2443
+ /**
2444
+ * @private Creates or replaces the `FocusKeyManager` with the current items,
2445
+ * using horizontal orientation, wrap, Home/End and type-ahead, skipping
2446
+ * disabled items. Sets the first item active so the bar has a tabbable entry.
2447
+ */
2448
+ _initKeyManager(items, direction) {
2449
+ this._changeSub?.unsubscribe();
2450
+ this._keyManager = new FocusKeyManager(items)
2451
+ .withHorizontalOrientation(direction)
2452
+ .withWrap()
2453
+ .withHomeAndEnd()
2454
+ .withTypeAhead()
2455
+ .skipPredicate((item) => item.disabledBoolean);
2456
+ this._changeSub = this._keyManager.change.subscribe(() => this._syncTabIndices());
2457
+ if (!this._keyManager.activeItem) {
2458
+ this._keyManager.setFirstItemActive();
2459
+ }
2460
+ }
2461
+ /**
2462
+ * @private Updates `_tabIndex` on every item so that only the active item has
2463
+ * `tabindex="0"` (roving tabindex). All others get `-1`.
2464
+ */
2465
+ _syncTabIndices() {
2466
+ const active = this._keyManager?.activeItem;
2467
+ this._items().forEach((item) => {
2468
+ item._tabIndex.set(item === active ? 0 : -1);
2469
+ });
2470
+ }
2471
+ /** @private The non-disabled top-level items, in DOM order. */
2472
+ _navigableItems() {
2473
+ return this._items().filter((item) => !item.disabledBoolean);
2474
+ }
2475
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenubar, deps: [], target: i0.ɵɵFactoryTarget.Component });
2476
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvMenubar, isStandalone: true, selector: "mlv-menubar", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "menubar" }, listeners: { "keydown": "_onKeydown($event)" }, properties: { "attr.aria-orientation": "\"horizontal\"", "attr.aria-label": "label() || _initialAriaLabel || null" }, classAttribute: "mlv-menubar" }, providers: [
2477
+ {
2478
+ provide: MENUBAR_TOKEN,
2479
+ useExisting: MlvMenubar,
2480
+ },
2481
+ {
2482
+ provide: MLV_MENUBAR_ITEM_REGISTRY,
2483
+ useFactory: () => new MlvMenubarItemRegistryStore(),
2484
+ },
2485
+ ], queries: [{ propertyName: "_projectedItems", predicate: MlvMenuTrigger, isSignal: true }, { propertyName: "_itemDef", first: true, predicate: (MlvMenuItemDef), descendants: true, isSignal: true }], ngImport: i0, template: `
2486
+ @if (_dataMode()) {
2487
+ @if (_dataSourceLoading()) {
2488
+ <mlv-loader variant="circle" indeterminate [size]="20" />
2489
+ } @else {
2490
+ <mlv-menu-data-renderer
2491
+ [items]="_dataSourceItems()"
2492
+ [itemDef]="_itemDef()"
2493
+ mode="menubar"
2494
+ />
2495
+ }
2496
+ } @else {
2497
+ <ng-content />
2498
+ }
2499
+ `, isInline: true, styles: ["@layer mlv.components{.mlv-menubar{box-sizing:border-box;padding:var(--mlv-padding-xs);margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-typography-body-m-size)}.mlv-menubar *{box-sizing:border-box}.mlv-menubar{display:inline-flex;align-items:center;gap:var(--mlv-spacing-2);background-color:var(--mlv-background-raised);border:var(--mlv-stroke-width) solid var(--mlv-border-subtle);border-radius:var(--mlv-radius-m);color:var(--mlv-text-primary)}.mlv-menubar__divider{align-self:stretch;flex:0 0 var(--mlv-stroke-width);min-block-size:1.5rem;margin-block:var(--mlv-spacing-1);background-color:var(--mlv-border-subtle)}.mlv-menubar>mlv-loader{margin:var(--mlv-spacing-1)}.mlv-menubar:focus-visible{outline:none}.mlv-menubar [role=menuitem]:focus-visible{outline:var(--mlv-stroke-width-medium) solid var(--mlv-border-focus);outline-offset:var(--mlv-focus-ring-offset)}}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => MlvLoader), selector: "mlv-loader", inputs: ["variant", "tone", "value", "max", "indeterminate", "size", "strokeWidth", "ariaLabel", "showHint", "color", "trackColor", "glow"] }, { kind: "component", type: i0.forwardRef(() => MlvMenuDataRenderer), selector: "mlv-menu-data-renderer", inputs: ["items", "itemDef", "mode", "parentMenu", "menubar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2500
+ }
2501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvMenubar, decorators: [{
2502
+ type: Component,
2503
+ args: [{ selector: 'mlv-menubar', template: `
2504
+ @if (_dataMode()) {
2505
+ @if (_dataSourceLoading()) {
2506
+ <mlv-loader variant="circle" indeterminate [size]="20" />
2507
+ } @else {
2508
+ <mlv-menu-data-renderer
2509
+ [items]="_dataSourceItems()"
2510
+ [itemDef]="_itemDef()"
2511
+ mode="menubar"
2512
+ />
2513
+ }
2514
+ } @else {
2515
+ <ng-content />
2516
+ }
2517
+ `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MlvLoader, forwardRef(() => MlvMenuDataRenderer)], host: {
2518
+ class: 'mlv-menubar',
2519
+ role: 'menubar',
2520
+ '[attr.aria-orientation]': '"horizontal"',
2521
+ '[attr.aria-label]': 'label() || _initialAriaLabel || null',
2522
+ '(keydown)': '_onKeydown($event)',
2523
+ }, providers: [
2524
+ {
2525
+ provide: MENUBAR_TOKEN,
2526
+ useExisting: MlvMenubar,
2527
+ },
2528
+ {
2529
+ provide: MLV_MENUBAR_ITEM_REGISTRY,
2530
+ useFactory: () => new MlvMenubarItemRegistryStore(),
2531
+ },
2532
+ ], styles: ["@layer mlv.components{.mlv-menubar{box-sizing:border-box;padding:var(--mlv-padding-xs);margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-typography-body-m-size)}.mlv-menubar *{box-sizing:border-box}.mlv-menubar{display:inline-flex;align-items:center;gap:var(--mlv-spacing-2);background-color:var(--mlv-background-raised);border:var(--mlv-stroke-width) solid var(--mlv-border-subtle);border-radius:var(--mlv-radius-m);color:var(--mlv-text-primary)}.mlv-menubar__divider{align-self:stretch;flex:0 0 var(--mlv-stroke-width);min-block-size:1.5rem;margin-block:var(--mlv-spacing-1);background-color:var(--mlv-border-subtle)}.mlv-menubar>mlv-loader{margin:var(--mlv-spacing-1)}.mlv-menubar:focus-visible{outline:none}.mlv-menubar [role=menuitem]:focus-visible{outline:var(--mlv-stroke-width-medium) solid var(--mlv-border-focus);outline-offset:var(--mlv-focus-ring-offset)}}\n"] }]
2533
+ }], ctorParameters: () => [], propDecorators: { _projectedItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MlvMenuTrigger), { isSignal: true }] }], _itemDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvMenuItemDef), { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }] } });
2534
+
2535
+ /**
2536
+ * Generated bundle index. Do not edit.
2537
+ */
2538
+
2539
+ export { MENUBAR_TOKEN, MENU_TOKEN, MLV_MENU_DATA_ITEM, MlvMenu, MlvMenuGroup, MlvMenuGroupLabel, MlvMenuItem, MlvMenuItemDef, MlvMenuSeparator, MlvMenuTrigger, MlvMenubar };
2540
+ //# sourceMappingURL=malva-ui-core-menu.mjs.map