@malva-ui/core 0.1.13 → 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 (1618) hide show
  1. package/AGENTS.md +4 -1
  2. package/README.md +15 -0
  3. package/docs/ai/avatar.md +2 -0
  4. package/docs/ai/breadcrumb.md +67 -7
  5. package/docs/ai/button.md +74 -19
  6. package/docs/ai/card.md +8 -6
  7. package/docs/ai/chat.md +59 -45
  8. package/docs/ai/checkbox.md +12 -0
  9. package/docs/ai/combobox.md +18 -2
  10. package/docs/ai/copy-to-clipboard.md +1 -1
  11. package/docs/ai/core.md +15 -0
  12. package/docs/ai/data-table.md +89 -54
  13. package/docs/ai/dialog.md +76 -67
  14. package/docs/ai/drawer.md +15 -12
  15. package/docs/ai/dropdown.md +24 -19
  16. package/docs/ai/empty-state.md +3 -3
  17. package/docs/ai/filter.md +24 -5
  18. package/docs/ai/form-utils.md +160 -5
  19. package/docs/ai/icon-toggle.md +160 -0
  20. package/docs/ai/input.md +30 -0
  21. package/docs/ai/layout.md +23 -0
  22. package/docs/ai/list.md +10 -6
  23. package/docs/ai/menu.md +75 -1
  24. package/docs/ai/page.md +220 -60
  25. package/docs/ai/radio.md +9 -0
  26. package/docs/ai/scrollbar.md +30 -8
  27. package/docs/ai/segmented.md +35 -35
  28. package/docs/ai/select.md +30 -5
  29. package/docs/ai/sidebar.md +45 -27
  30. package/docs/ai/switch.md +114 -19
  31. package/docs/ai/table.md +69 -0
  32. package/docs/ai/tabs.md +2 -1
  33. package/docs/ai/tile.md +311 -85
  34. package/docs/ai/timeline.md +63 -39
  35. package/docs/ai/tokenizer.md +21 -5
  36. package/docs/ai/tooltip.md +5 -5
  37. package/docs/ai/view-variant.md +75 -0
  38. package/fesm2022/malva-ui-core-accordion.mjs +167 -0
  39. package/fesm2022/malva-ui-core-accordion.mjs.map +1 -0
  40. package/fesm2022/malva-ui-core-action-bar.mjs +111 -0
  41. package/fesm2022/malva-ui-core-action-bar.mjs.map +1 -0
  42. package/fesm2022/malva-ui-core-alert.mjs +173 -0
  43. package/fesm2022/malva-ui-core-alert.mjs.map +1 -0
  44. package/fesm2022/malva-ui-core-autocomplete.mjs +775 -0
  45. package/fesm2022/malva-ui-core-autocomplete.mjs.map +1 -0
  46. package/fesm2022/malva-ui-core-avatar-group.mjs +224 -0
  47. package/fesm2022/malva-ui-core-avatar-group.mjs.map +1 -0
  48. package/fesm2022/malva-ui-core-avatar.mjs +247 -0
  49. package/fesm2022/malva-ui-core-avatar.mjs.map +1 -0
  50. package/fesm2022/malva-ui-core-badge.mjs +122 -0
  51. package/fesm2022/malva-ui-core-badge.mjs.map +1 -0
  52. package/fesm2022/malva-ui-core-bottom-nav.mjs +161 -0
  53. package/fesm2022/malva-ui-core-bottom-nav.mjs.map +1 -0
  54. package/fesm2022/malva-ui-core-breadcrumb.mjs +494 -0
  55. package/fesm2022/malva-ui-core-breadcrumb.mjs.map +1 -0
  56. package/fesm2022/malva-ui-core-button.mjs +406 -0
  57. package/fesm2022/malva-ui-core-button.mjs.map +1 -0
  58. package/fesm2022/malva-ui-core-calendar.mjs +938 -0
  59. package/fesm2022/malva-ui-core-calendar.mjs.map +1 -0
  60. package/fesm2022/malva-ui-core-card.mjs +164 -0
  61. package/fesm2022/malva-ui-core-card.mjs.map +1 -0
  62. package/fesm2022/malva-ui-core-chat.mjs +825 -0
  63. package/fesm2022/malva-ui-core-chat.mjs.map +1 -0
  64. package/fesm2022/malva-ui-core-checkbox.mjs +272 -0
  65. package/fesm2022/malva-ui-core-checkbox.mjs.map +1 -0
  66. package/fesm2022/malva-ui-core-chip.mjs +176 -0
  67. package/fesm2022/malva-ui-core-chip.mjs.map +1 -0
  68. package/fesm2022/malva-ui-core-color-picker.mjs +1204 -0
  69. package/fesm2022/malva-ui-core-color-picker.mjs.map +1 -0
  70. package/fesm2022/malva-ui-core-combobox.mjs +945 -0
  71. package/fesm2022/malva-ui-core-combobox.mjs.map +1 -0
  72. package/fesm2022/malva-ui-core-copy-to-clipboard.mjs +255 -0
  73. package/fesm2022/malva-ui-core-copy-to-clipboard.mjs.map +1 -0
  74. package/fesm2022/malva-ui-core-data-table.mjs +2696 -0
  75. package/fesm2022/malva-ui-core-data-table.mjs.map +1 -0
  76. package/fesm2022/malva-ui-core-date-range-picker.mjs +276 -0
  77. package/fesm2022/malva-ui-core-date-range-picker.mjs.map +1 -0
  78. package/fesm2022/malva-ui-core-day-picker.mjs +131 -0
  79. package/fesm2022/malva-ui-core-day-picker.mjs.map +1 -0
  80. package/fesm2022/malva-ui-core-dialog-routable-dialog-CvjXMtlD.mjs +94 -0
  81. package/fesm2022/malva-ui-core-dialog-routable-dialog-CvjXMtlD.mjs.map +1 -0
  82. package/fesm2022/malva-ui-core-dialog.mjs +1223 -0
  83. package/fesm2022/malva-ui-core-dialog.mjs.map +1 -0
  84. package/fesm2022/malva-ui-core-divider.mjs +80 -0
  85. package/fesm2022/malva-ui-core-divider.mjs.map +1 -0
  86. package/fesm2022/malva-ui-core-drawer-routable-drawer-qUk6Etnx.mjs +94 -0
  87. package/fesm2022/malva-ui-core-drawer-routable-drawer-qUk6Etnx.mjs.map +1 -0
  88. package/fesm2022/malva-ui-core-drawer.mjs +814 -0
  89. package/fesm2022/malva-ui-core-drawer.mjs.map +1 -0
  90. package/fesm2022/malva-ui-core-dropdown.mjs +994 -0
  91. package/fesm2022/malva-ui-core-dropdown.mjs.map +1 -0
  92. package/fesm2022/malva-ui-core-empty-state.mjs +50 -0
  93. package/fesm2022/malva-ui-core-empty-state.mjs.map +1 -0
  94. package/fesm2022/malva-ui-core-expand.mjs +130 -0
  95. package/fesm2022/malva-ui-core-expand.mjs.map +1 -0
  96. package/fesm2022/malva-ui-core-file-upload.mjs +451 -0
  97. package/fesm2022/malva-ui-core-file-upload.mjs.map +1 -0
  98. package/fesm2022/malva-ui-core-filter.mjs +1627 -0
  99. package/fesm2022/malva-ui-core-filter.mjs.map +1 -0
  100. package/fesm2022/malva-ui-core-form-utils-testing.mjs +39 -0
  101. package/fesm2022/malva-ui-core-form-utils-testing.mjs.map +1 -0
  102. package/fesm2022/malva-ui-core-form-utils.mjs +977 -0
  103. package/fesm2022/malva-ui-core-form-utils.mjs.map +1 -0
  104. package/fesm2022/malva-ui-core-form.mjs +283 -0
  105. package/fesm2022/malva-ui-core-form.mjs.map +1 -0
  106. package/fesm2022/malva-ui-core-icon-toggle.mjs +120 -0
  107. package/fesm2022/malva-ui-core-icon-toggle.mjs.map +1 -0
  108. package/fesm2022/malva-ui-core-input.mjs +375 -0
  109. package/fesm2022/malva-ui-core-input.mjs.map +1 -0
  110. package/fesm2022/malva-ui-core-kbd.mjs +131 -0
  111. package/fesm2022/malva-ui-core-kbd.mjs.map +1 -0
  112. package/fesm2022/malva-ui-core-layout.mjs +212 -0
  113. package/fesm2022/malva-ui-core-layout.mjs.map +1 -0
  114. package/fesm2022/malva-ui-core-link.mjs +89 -0
  115. package/fesm2022/malva-ui-core-link.mjs.map +1 -0
  116. package/fesm2022/malva-ui-core-list.mjs +413 -0
  117. package/fesm2022/malva-ui-core-list.mjs.map +1 -0
  118. package/fesm2022/malva-ui-core-loader.mjs +141 -0
  119. package/fesm2022/malva-ui-core-loader.mjs.map +1 -0
  120. package/fesm2022/malva-ui-core-menu.mjs +2540 -0
  121. package/fesm2022/malva-ui-core-menu.mjs.map +1 -0
  122. package/fesm2022/malva-ui-core-notification.mjs +201 -0
  123. package/fesm2022/malva-ui-core-notification.mjs.map +1 -0
  124. package/fesm2022/malva-ui-core-number-input.mjs +404 -0
  125. package/fesm2022/malva-ui-core-number-input.mjs.map +1 -0
  126. package/fesm2022/malva-ui-core-page.mjs +1898 -0
  127. package/fesm2022/malva-ui-core-page.mjs.map +1 -0
  128. package/fesm2022/malva-ui-core-pagination.mjs +458 -0
  129. package/fesm2022/malva-ui-core-pagination.mjs.map +1 -0
  130. package/fesm2022/malva-ui-core-pin-input.mjs +405 -0
  131. package/fesm2022/malva-ui-core-pin-input.mjs.map +1 -0
  132. package/fesm2022/malva-ui-core-popup.mjs +1488 -0
  133. package/fesm2022/malva-ui-core-popup.mjs.map +1 -0
  134. package/fesm2022/malva-ui-core-progress.mjs +109 -0
  135. package/fesm2022/malva-ui-core-progress.mjs.map +1 -0
  136. package/fesm2022/malva-ui-core-radio.mjs +317 -0
  137. package/fesm2022/malva-ui-core-radio.mjs.map +1 -0
  138. package/fesm2022/malva-ui-core-rating.mjs +236 -0
  139. package/fesm2022/malva-ui-core-rating.mjs.map +1 -0
  140. package/fesm2022/malva-ui-core-scrollbar.mjs +430 -0
  141. package/fesm2022/malva-ui-core-scrollbar.mjs.map +1 -0
  142. package/fesm2022/malva-ui-core-search-field.mjs +578 -0
  143. package/fesm2022/malva-ui-core-search-field.mjs.map +1 -0
  144. package/fesm2022/malva-ui-core-segmented.mjs +458 -0
  145. package/fesm2022/malva-ui-core-segmented.mjs.map +1 -0
  146. package/fesm2022/malva-ui-core-select.mjs +855 -0
  147. package/fesm2022/malva-ui-core-select.mjs.map +1 -0
  148. package/fesm2022/malva-ui-core-sidebar.mjs +1504 -0
  149. package/fesm2022/malva-ui-core-sidebar.mjs.map +1 -0
  150. package/fesm2022/malva-ui-core-skeleton.mjs +85 -0
  151. package/fesm2022/malva-ui-core-skeleton.mjs.map +1 -0
  152. package/fesm2022/malva-ui-core-slider.mjs +514 -0
  153. package/fesm2022/malva-ui-core-slider.mjs.map +1 -0
  154. package/fesm2022/malva-ui-core-split-pane.mjs +359 -0
  155. package/fesm2022/malva-ui-core-split-pane.mjs.map +1 -0
  156. package/fesm2022/malva-ui-core-status-indicator.mjs +78 -0
  157. package/fesm2022/malva-ui-core-status-indicator.mjs.map +1 -0
  158. package/fesm2022/malva-ui-core-stepper.mjs +332 -0
  159. package/fesm2022/malva-ui-core-stepper.mjs.map +1 -0
  160. package/fesm2022/malva-ui-core-switch.mjs +272 -0
  161. package/fesm2022/malva-ui-core-switch.mjs.map +1 -0
  162. package/fesm2022/malva-ui-core-table.mjs +79 -0
  163. package/fesm2022/malva-ui-core-table.mjs.map +1 -0
  164. package/fesm2022/malva-ui-core-tabs.mjs +794 -0
  165. package/fesm2022/malva-ui-core-tabs.mjs.map +1 -0
  166. package/fesm2022/malva-ui-core-textarea.mjs +201 -0
  167. package/fesm2022/malva-ui-core-textarea.mjs.map +1 -0
  168. package/fesm2022/malva-ui-core-tile.mjs +1404 -0
  169. package/fesm2022/malva-ui-core-tile.mjs.map +1 -0
  170. package/fesm2022/malva-ui-core-time-picker.mjs +533 -0
  171. package/fesm2022/malva-ui-core-time-picker.mjs.map +1 -0
  172. package/fesm2022/malva-ui-core-timeline.mjs +216 -0
  173. package/fesm2022/malva-ui-core-timeline.mjs.map +1 -0
  174. package/fesm2022/malva-ui-core-title.mjs +178 -0
  175. package/fesm2022/malva-ui-core-title.mjs.map +1 -0
  176. package/fesm2022/malva-ui-core-toast.mjs +749 -0
  177. package/fesm2022/malva-ui-core-toast.mjs.map +1 -0
  178. package/fesm2022/malva-ui-core-tokenizer.mjs +502 -0
  179. package/fesm2022/malva-ui-core-tokenizer.mjs.map +1 -0
  180. package/fesm2022/malva-ui-core-toolbar.mjs +141 -0
  181. package/fesm2022/malva-ui-core-toolbar.mjs.map +1 -0
  182. package/fesm2022/malva-ui-core-tooltip.mjs +432 -0
  183. package/fesm2022/malva-ui-core-tooltip.mjs.map +1 -0
  184. package/fesm2022/malva-ui-core-tree.mjs +505 -0
  185. package/fesm2022/malva-ui-core-tree.mjs.map +1 -0
  186. package/fesm2022/malva-ui-core-view-variant.mjs +292 -0
  187. package/fesm2022/malva-ui-core-view-variant.mjs.map +1 -0
  188. package/fesm2022/malva-ui-core.mjs +77 -0
  189. package/fesm2022/malva-ui-core.mjs.map +1 -0
  190. package/package.json +179 -156
  191. package/styles/malva-ui.css +253 -220
  192. package/styles/tokens.md +174 -173
  193. package/table/README.md +46 -0
  194. package/types/malva-ui-core-accordion.d.ts +121 -0
  195. package/types/malva-ui-core-action-bar.d.ts +82 -0
  196. package/types/malva-ui-core-alert.d.ts +131 -0
  197. package/types/malva-ui-core-autocomplete.d.ts +301 -0
  198. package/types/malva-ui-core-avatar-group.d.ts +119 -0
  199. package/types/malva-ui-core-avatar.d.ts +156 -0
  200. package/types/malva-ui-core-badge.d.ts +97 -0
  201. package/types/malva-ui-core-bottom-nav.d.ts +104 -0
  202. package/types/malva-ui-core-breadcrumb.d.ts +308 -0
  203. package/types/malva-ui-core-button.d.ts +194 -0
  204. package/types/malva-ui-core-calendar.d.ts +339 -0
  205. package/types/malva-ui-core-card.d.ts +88 -0
  206. package/types/malva-ui-core-chat.d.ts +375 -0
  207. package/types/malva-ui-core-checkbox.d.ts +158 -0
  208. package/types/malva-ui-core-chip.d.ts +128 -0
  209. package/types/malva-ui-core-color-picker.d.ts +442 -0
  210. package/types/malva-ui-core-combobox.d.ts +419 -0
  211. package/types/malva-ui-core-copy-to-clipboard.d.ts +148 -0
  212. package/types/malva-ui-core-data-table.d.ts +1074 -0
  213. package/types/malva-ui-core-date-range-picker.d.ts +149 -0
  214. package/types/malva-ui-core-day-picker.d.ts +55 -0
  215. package/types/malva-ui-core-dialog.d.ts +597 -0
  216. package/types/malva-ui-core-divider.d.ts +68 -0
  217. package/types/malva-ui-core-drawer.d.ts +333 -0
  218. package/types/malva-ui-core-dropdown.d.ts +592 -0
  219. package/types/malva-ui-core-empty-state.d.ts +37 -0
  220. package/types/malva-ui-core-expand.d.ts +102 -0
  221. package/types/malva-ui-core-file-upload.d.ts +267 -0
  222. package/types/malva-ui-core-filter.d.ts +552 -0
  223. package/types/malva-ui-core-form-utils-testing.d.ts +50 -0
  224. package/types/malva-ui-core-form-utils.d.ts +579 -0
  225. package/types/malva-ui-core-form.d.ts +176 -0
  226. package/types/malva-ui-core-icon-toggle.d.ts +80 -0
  227. package/types/malva-ui-core-input.d.ts +262 -0
  228. package/types/malva-ui-core-kbd.d.ts +56 -0
  229. package/types/malva-ui-core-layout.d.ts +70 -0
  230. package/types/malva-ui-core-link.d.ts +28 -0
  231. package/types/malva-ui-core-list.d.ts +252 -0
  232. package/types/malva-ui-core-loader.d.ts +89 -0
  233. package/types/malva-ui-core-menu.d.ts +954 -0
  234. package/types/malva-ui-core-notification.d.ts +122 -0
  235. package/types/malva-ui-core-number-input.d.ts +167 -0
  236. package/types/malva-ui-core-page.d.ts +799 -0
  237. package/types/malva-ui-core-pagination.d.ts +261 -0
  238. package/types/malva-ui-core-pin-input.d.ts +203 -0
  239. package/types/malva-ui-core-popup.d.ts +834 -0
  240. package/types/malva-ui-core-progress.d.ts +73 -0
  241. package/types/malva-ui-core-radio.d.ts +130 -0
  242. package/types/malva-ui-core-rating.d.ts +115 -0
  243. package/types/malva-ui-core-scrollbar.d.ts +203 -0
  244. package/types/malva-ui-core-search-field.d.ts +408 -0
  245. package/types/malva-ui-core-segmented.d.ts +206 -0
  246. package/types/malva-ui-core-select.d.ts +456 -0
  247. package/types/malva-ui-core-sidebar.d.ts +698 -0
  248. package/types/malva-ui-core-skeleton.d.ts +64 -0
  249. package/types/malva-ui-core-slider.d.ts +219 -0
  250. package/types/malva-ui-core-split-pane.d.ts +149 -0
  251. package/types/malva-ui-core-status-indicator.d.ts +65 -0
  252. package/types/malva-ui-core-stepper.d.ts +168 -0
  253. package/types/malva-ui-core-switch.d.ts +146 -0
  254. package/types/malva-ui-core-table.d.ts +37 -0
  255. package/types/malva-ui-core-tabs.d.ts +339 -0
  256. package/types/malva-ui-core-textarea.d.ts +79 -0
  257. package/types/malva-ui-core-tile.d.ts +373 -0
  258. package/types/malva-ui-core-time-picker.d.ts +141 -0
  259. package/types/malva-ui-core-timeline.d.ts +188 -0
  260. package/types/malva-ui-core-title.d.ts +66 -0
  261. package/types/malva-ui-core-toast.d.ts +432 -0
  262. package/types/malva-ui-core-tokenizer.d.ts +217 -0
  263. package/types/malva-ui-core-toolbar.d.ts +91 -0
  264. package/types/malva-ui-core-tooltip.d.ts +200 -0
  265. package/types/malva-ui-core-tree.d.ts +289 -0
  266. package/types/malva-ui-core-view-variant.d.ts +207 -0
  267. package/types/malva-ui-core.d.ts +72 -0
  268. package/view-variant/README.md +3 -0
  269. package/accordion/index.d.ts +0 -3
  270. package/accordion/lib/accordion/accordion.d.ts +0 -47
  271. package/accordion/lib/accordion-item/accordion-header.d.ts +0 -22
  272. package/accordion/lib/accordion-item/accordion-item.d.ts +0 -49
  273. package/accordion/malva-ui-core-accordion.d.ts +0 -5
  274. package/action-bar/index.d.ts +0 -4
  275. package/action-bar/lib/action-bar/action-bar.d.ts +0 -59
  276. package/action-bar/lib/action-bar/components/action-bar-actions.d.ts +0 -9
  277. package/action-bar/lib/action-bar/components/action-bar-logo.d.ts +0 -5
  278. package/action-bar/lib/action-bar/components/action-bar-spacer.d.ts +0 -5
  279. package/action-bar/malva-ui-core-action-bar.d.ts +0 -5
  280. package/alert/index.d.ts +0 -2
  281. package/alert/lib/alert/alert.d.ts +0 -84
  282. package/alert/lib/alert/alert.directives.d.ts +0 -44
  283. package/alert/malva-ui-core-alert.d.ts +0 -5
  284. package/autocomplete/index.d.ts +0 -1
  285. package/autocomplete/lib/autocomplete/autocomplete.d.ts +0 -296
  286. package/autocomplete/malva-ui-core-autocomplete.d.ts +0 -5
  287. package/avatar/index.d.ts +0 -2
  288. package/avatar/lib/avatar/avatar.d.ts +0 -125
  289. package/avatar/lib/color-from-text.pipe.d.ts +0 -21
  290. package/avatar/malva-ui-core-avatar.d.ts +0 -5
  291. package/avatar-group/index.d.ts +0 -1
  292. package/avatar-group/lib/avatar-group/avatar-group.d.ts +0 -115
  293. package/avatar-group/malva-ui-core-avatar-group.d.ts +0 -5
  294. package/badge/index.d.ts +0 -2
  295. package/badge/lib/badge/badge.d.ts +0 -59
  296. package/badge/lib/badge-icon.d.ts +0 -35
  297. package/badge/malva-ui-core-badge.d.ts +0 -5
  298. package/bottom-nav/index.d.ts +0 -1
  299. package/bottom-nav/lib/bottom-nav/bottom-nav.d.ts +0 -99
  300. package/bottom-nav/malva-ui-core-bottom-nav.d.ts +0 -5
  301. package/breadcrumb/index.d.ts +0 -5
  302. package/breadcrumb/lib/breadcrumb/breadcrumb-item-host.d.ts +0 -32
  303. package/breadcrumb/lib/breadcrumb/breadcrumb-item.d.ts +0 -41
  304. package/breadcrumb/lib/breadcrumb/breadcrumb-separator.d.ts +0 -31
  305. package/breadcrumb/lib/breadcrumb/breadcrumb.d.ts +0 -151
  306. package/breadcrumb/lib/breadcrumb/breadcrumb.types.d.ts +0 -26
  307. package/breadcrumb/malva-ui-core-breadcrumb.d.ts +0 -5
  308. package/button/index.d.ts +0 -7
  309. package/button/lib/button/button.d.ts +0 -61
  310. package/button/lib/button-close/button-close.d.ts +0 -24
  311. package/button/lib/button-group/button-group.d.ts +0 -21
  312. package/button/lib/button-split/button-split.d.ts +0 -21
  313. package/button/lib/button-toggle/button-toggle.d.ts +0 -33
  314. package/button/lib/button-variant.token.d.ts +0 -13
  315. package/button/lib/button.directives.d.ts +0 -14
  316. package/button/lib/button.types.d.ts +0 -8
  317. package/button/malva-ui-core-button.d.ts +0 -5
  318. package/calendar/index.d.ts +0 -3
  319. package/calendar/lib/calendar/calendar.d.ts +0 -182
  320. package/calendar/lib/date-provider/date-adapter.d.ts +0 -92
  321. package/calendar/lib/date-provider/native-date-adapter.d.ts +0 -60
  322. package/calendar/malva-ui-core-calendar.d.ts +0 -5
  323. package/card/index.d.ts +0 -5
  324. package/card/lib/card/card.d.ts +0 -43
  325. package/card/lib/card-actions-def.d.ts +0 -10
  326. package/card/lib/card-footer-def.d.ts +0 -13
  327. package/card/lib/card-header-def.d.ts +0 -10
  328. package/card/lib/card-subheader-def.d.ts +0 -16
  329. package/card/malva-ui-core-card.d.ts +0 -5
  330. package/chat/index.d.ts +0 -9
  331. package/chat/lib/chat/chat.d.ts +0 -133
  332. package/chat/lib/chat-audio/chat-audio.d.ts +0 -51
  333. package/chat/lib/chat-audio/chat-audio.service.d.ts +0 -21
  334. package/chat/lib/chat-date/chat-date.d.ts +0 -16
  335. package/chat/lib/chat-format.d.ts +0 -5
  336. package/chat/lib/chat-media-grid/chat-media-grid.d.ts +0 -32
  337. package/chat/lib/chat-message/chat-message.d.ts +0 -45
  338. package/chat/lib/chat-render-list.d.ts +0 -16
  339. package/chat/lib/chat-tokens.d.ts +0 -25
  340. package/chat/lib/chat-typing/chat-typing.d.ts +0 -16
  341. package/chat/lib/chat.types.d.ts +0 -80
  342. package/chat/lib/defs/chat-author-def.d.ts +0 -30
  343. package/chat/lib/defs/chat-date-def.d.ts +0 -22
  344. package/chat/lib/defs/chat-message-def.d.ts +0 -23
  345. package/chat/malva-ui-core-chat.d.ts +0 -5
  346. package/checkbox/index.d.ts +0 -3
  347. package/checkbox/lib/checkbox/checkbox.d.ts +0 -129
  348. package/checkbox/lib/checkbox-group/checkbox-group.d.ts +0 -24
  349. package/checkbox/lib/checkbox-group-token.d.ts +0 -6
  350. package/checkbox/malva-ui-core-checkbox.d.ts +0 -5
  351. package/chip/index.d.ts +0 -2
  352. package/chip/lib/chip/chip.d.ts +0 -107
  353. package/chip/lib/chip/chip.directives.d.ts +0 -18
  354. package/chip/malva-ui-core-chip.d.ts +0 -5
  355. package/color-picker/index.d.ts +0 -3
  356. package/color-picker/lib/color-picker/color-picker.d.ts +0 -188
  357. package/color-picker/lib/color-picker-popup/color-picker-popup.d.ts +0 -151
  358. package/color-picker/lib/color-utils/color-utils.d.ts +0 -102
  359. package/color-picker/malva-ui-core-color-picker.d.ts +0 -5
  360. package/combobox/index.d.ts +0 -2
  361. package/combobox/lib/combobox/combobox.d.ts +0 -400
  362. package/combobox/lib/combobox-template.directives.d.ts +0 -10
  363. package/combobox/malva-ui-core-combobox.d.ts +0 -5
  364. package/copy-to-clipboard/index.d.ts +0 -1
  365. package/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.d.ts +0 -130
  366. package/copy-to-clipboard/malva-ui-core-copy-to-clipboard.d.ts +0 -5
  367. package/data-table/index.d.ts +0 -8
  368. package/data-table/lib/data-source.d.ts +0 -5
  369. package/data-table/lib/data-table/data-table-layout.d.ts +0 -31
  370. package/data-table/lib/data-table/data-table.d.ts +0 -699
  371. package/data-table/lib/data-table/services/data-table-column-visibility.service.d.ts +0 -19
  372. package/data-table/lib/data-table/services/data-table-editing.service.d.ts +0 -37
  373. package/data-table/lib/data-table/services/data-table-pinning.service.d.ts +0 -37
  374. package/data-table/lib/data-table-cell.d.ts +0 -44
  375. package/data-table/lib/data-table-edit-cell.d.ts +0 -44
  376. package/data-table/lib/data-table-error.d.ts +0 -37
  377. package/data-table/lib/data-table-footer.d.ts +0 -26
  378. package/data-table/lib/data-table-no-data.d.ts +0 -19
  379. package/data-table/lib/filter-dropdown/filter-dropdown.d.ts +0 -54
  380. package/data-table/lib/types.d.ts +0 -134
  381. package/data-table/malva-ui-core-data-table.d.ts +0 -5
  382. package/date-range-picker/index.d.ts +0 -1
  383. package/date-range-picker/lib/date-range-picker/date-range-picker.d.ts +0 -145
  384. package/date-range-picker/malva-ui-core-date-range-picker.d.ts +0 -5
  385. package/day-picker/index.d.ts +0 -1
  386. package/day-picker/lib/day-picker/day-picker.d.ts +0 -51
  387. package/day-picker/malva-ui-core-day-picker.d.ts +0 -5
  388. package/dialog/index.d.ts +0 -11
  389. package/dialog/lib/confirm-dialog-options.d.ts +0 -41
  390. package/dialog/lib/confirm-dialog.d.ts +0 -52
  391. package/dialog/lib/dialog/dialog.d.ts +0 -22
  392. package/dialog/lib/dialog-body.d.ts +0 -9
  393. package/dialog/lib/dialog-close.d.ts +0 -27
  394. package/dialog/lib/dialog-config.d.ts +0 -112
  395. package/dialog/lib/dialog-container.d.ts +0 -40
  396. package/dialog/lib/dialog-footer.d.ts +0 -13
  397. package/dialog/lib/dialog-header.d.ts +0 -74
  398. package/dialog/lib/dialog-ref.d.ts +0 -95
  399. package/dialog/lib/dialog-template.d.ts +0 -65
  400. package/dialog/lib/dialog-text-content.d.ts +0 -24
  401. package/dialog/lib/dialog.service.d.ts +0 -63
  402. package/dialog/lib/generate-routable-dialog-route.d.ts +0 -49
  403. package/dialog/lib/inject-dialog-ref.d.ts +0 -8
  404. package/dialog/lib/routable-dialog.d.ts +0 -30
  405. package/dialog/malva-ui-core-dialog.d.ts +0 -5
  406. package/divider/index.d.ts +0 -1
  407. package/divider/lib/divider/divider.d.ts +0 -64
  408. package/divider/malva-ui-core-divider.d.ts +0 -5
  409. package/drawer/index.d.ts +0 -11
  410. package/drawer/lib/drawer/drawer.d.ts +0 -106
  411. package/drawer/lib/drawer-body.d.ts +0 -8
  412. package/drawer/lib/drawer-content.d.ts +0 -6
  413. package/drawer/lib/drawer-footer.d.ts +0 -5
  414. package/drawer/lib/drawer-header.d.ts +0 -5
  415. package/drawer/lib/drawer-ref.d.ts +0 -29
  416. package/drawer/lib/drawer-resize.d.ts +0 -65
  417. package/drawer/lib/drawer-section/drawer-section.d.ts +0 -15
  418. package/drawer/lib/drawer-sections/drawer-sections.d.ts +0 -22
  419. package/drawer/lib/drawer-sections.service.d.ts +0 -42
  420. package/drawer/lib/drawer.service.d.ts +0 -66
  421. package/drawer/lib/generate-routable-drawer-route.d.ts +0 -42
  422. package/drawer/lib/routable-drawer.d.ts +0 -30
  423. package/drawer/malva-ui-core-drawer.d.ts +0 -5
  424. package/dropdown/index.d.ts +0 -9
  425. package/dropdown/lib/active-descendant.d.ts +0 -64
  426. package/dropdown/lib/dropdown-panel/dropdown-panel.d.ts +0 -178
  427. package/dropdown/lib/highlight-match.pipe.d.ts +0 -27
  428. package/dropdown/lib/option-matcher.d.ts +0 -87
  429. package/dropdown/lib/options-adapter.d.ts +0 -142
  430. package/dropdown/lib/options-result.d.ts +0 -6
  431. package/dropdown/lib/reconciliation.d.ts +0 -19
  432. package/dropdown/lib/select-data-source.d.ts +0 -18
  433. package/dropdown/lib/select-option.d.ts +0 -37
  434. package/dropdown/malva-ui-core-dropdown.d.ts +0 -5
  435. package/empty-state/index.d.ts +0 -1
  436. package/empty-state/lib/empty-state/empty-state.d.ts +0 -34
  437. package/empty-state/malva-ui-core-empty-state.d.ts +0 -5
  438. package/esm2022/accordion/index.js +0 -4
  439. package/esm2022/accordion/index.js.map +0 -1
  440. package/esm2022/accordion/lib/accordion/accordion.js +0 -65
  441. package/esm2022/accordion/lib/accordion/accordion.js.map +0 -1
  442. package/esm2022/accordion/lib/accordion-item/accordion-header.js +0 -30
  443. package/esm2022/accordion/lib/accordion-item/accordion-header.js.map +0 -1
  444. package/esm2022/accordion/lib/accordion-item/accordion-item.js +0 -70
  445. package/esm2022/accordion/lib/accordion-item/accordion-item.js.map +0 -1
  446. package/esm2022/accordion/malva-ui-core-accordion.js +0 -5
  447. package/esm2022/accordion/malva-ui-core-accordion.js.map +0 -1
  448. package/esm2022/action-bar/index.js +0 -5
  449. package/esm2022/action-bar/index.js.map +0 -1
  450. package/esm2022/action-bar/lib/action-bar/action-bar.js +0 -64
  451. package/esm2022/action-bar/lib/action-bar/action-bar.js.map +0 -1
  452. package/esm2022/action-bar/lib/action-bar/components/action-bar-actions.js +0 -20
  453. package/esm2022/action-bar/lib/action-bar/components/action-bar-actions.js.map +0 -1
  454. package/esm2022/action-bar/lib/action-bar/components/action-bar-logo.js +0 -13
  455. package/esm2022/action-bar/lib/action-bar/components/action-bar-logo.js.map +0 -1
  456. package/esm2022/action-bar/lib/action-bar/components/action-bar-spacer.js +0 -13
  457. package/esm2022/action-bar/lib/action-bar/components/action-bar-spacer.js.map +0 -1
  458. package/esm2022/action-bar/malva-ui-core-action-bar.js +0 -5
  459. package/esm2022/action-bar/malva-ui-core-action-bar.js.map +0 -1
  460. package/esm2022/alert/index.js +0 -3
  461. package/esm2022/alert/index.js.map +0 -1
  462. package/esm2022/alert/lib/alert/alert.directives.js +0 -53
  463. package/esm2022/alert/lib/alert/alert.directives.js.map +0 -1
  464. package/esm2022/alert/lib/alert/alert.js +0 -118
  465. package/esm2022/alert/lib/alert/alert.js.map +0 -1
  466. package/esm2022/alert/malva-ui-core-alert.js +0 -5
  467. package/esm2022/alert/malva-ui-core-alert.js.map +0 -1
  468. package/esm2022/autocomplete/index.js +0 -2
  469. package/esm2022/autocomplete/index.js.map +0 -1
  470. package/esm2022/autocomplete/lib/autocomplete/autocomplete.js +0 -765
  471. package/esm2022/autocomplete/lib/autocomplete/autocomplete.js.map +0 -1
  472. package/esm2022/autocomplete/malva-ui-core-autocomplete.js +0 -5
  473. package/esm2022/autocomplete/malva-ui-core-autocomplete.js.map +0 -1
  474. package/esm2022/avatar/index.js +0 -3
  475. package/esm2022/avatar/index.js.map +0 -1
  476. package/esm2022/avatar/lib/avatar/avatar.js +0 -192
  477. package/esm2022/avatar/lib/avatar/avatar.js.map +0 -1
  478. package/esm2022/avatar/lib/color-from-text.pipe.js +0 -39
  479. package/esm2022/avatar/lib/color-from-text.pipe.js.map +0 -1
  480. package/esm2022/avatar/malva-ui-core-avatar.js +0 -5
  481. package/esm2022/avatar/malva-ui-core-avatar.js.map +0 -1
  482. package/esm2022/avatar-group/index.js +0 -2
  483. package/esm2022/avatar-group/index.js.map +0 -1
  484. package/esm2022/avatar-group/lib/avatar-group/avatar-group.js +0 -217
  485. package/esm2022/avatar-group/lib/avatar-group/avatar-group.js.map +0 -1
  486. package/esm2022/avatar-group/malva-ui-core-avatar-group.js +0 -5
  487. package/esm2022/avatar-group/malva-ui-core-avatar-group.js.map +0 -1
  488. package/esm2022/badge/index.js +0 -3
  489. package/esm2022/badge/index.js.map +0 -1
  490. package/esm2022/badge/lib/badge/badge.js +0 -71
  491. package/esm2022/badge/lib/badge/badge.js.map +0 -1
  492. package/esm2022/badge/lib/badge-icon.js +0 -47
  493. package/esm2022/badge/lib/badge-icon.js.map +0 -1
  494. package/esm2022/badge/malva-ui-core-badge.js +0 -5
  495. package/esm2022/badge/malva-ui-core-badge.js.map +0 -1
  496. package/esm2022/bottom-nav/index.js +0 -2
  497. package/esm2022/bottom-nav/index.js.map +0 -1
  498. package/esm2022/bottom-nav/lib/bottom-nav/bottom-nav.js +0 -155
  499. package/esm2022/bottom-nav/lib/bottom-nav/bottom-nav.js.map +0 -1
  500. package/esm2022/bottom-nav/malva-ui-core-bottom-nav.js +0 -5
  501. package/esm2022/bottom-nav/malva-ui-core-bottom-nav.js.map +0 -1
  502. package/esm2022/breadcrumb/index.js +0 -6
  503. package/esm2022/breadcrumb/index.js.map +0 -1
  504. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item-host.js +0 -43
  505. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item-host.js.map +0 -1
  506. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item.js +0 -110
  507. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item.js.map +0 -1
  508. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-separator.js +0 -38
  509. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-separator.js.map +0 -1
  510. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.js +0 -284
  511. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.js.map +0 -1
  512. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.types.js +0 -1
  513. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.types.js.map +0 -1
  514. package/esm2022/breadcrumb/malva-ui-core-breadcrumb.js +0 -5
  515. package/esm2022/breadcrumb/malva-ui-core-breadcrumb.js.map +0 -1
  516. package/esm2022/button/index.js +0 -8
  517. package/esm2022/button/index.js.map +0 -1
  518. package/esm2022/button/lib/button/button.js +0 -137
  519. package/esm2022/button/lib/button/button.js.map +0 -1
  520. package/esm2022/button/lib/button-close/button-close.js +0 -52
  521. package/esm2022/button/lib/button-close/button-close.js.map +0 -1
  522. package/esm2022/button/lib/button-group/button-group.js +0 -44
  523. package/esm2022/button/lib/button-group/button-group.js.map +0 -1
  524. package/esm2022/button/lib/button-split/button-split.js +0 -44
  525. package/esm2022/button/lib/button-split/button-split.js.map +0 -1
  526. package/esm2022/button/lib/button-toggle/button-toggle.js +0 -94
  527. package/esm2022/button/lib/button-toggle/button-toggle.js.map +0 -1
  528. package/esm2022/button/lib/button-variant.token.js +0 -4
  529. package/esm2022/button/lib/button-variant.token.js.map +0 -1
  530. package/esm2022/button/lib/button.directives.js +0 -37
  531. package/esm2022/button/lib/button.directives.js.map +0 -1
  532. package/esm2022/button/lib/button.types.js +0 -1
  533. package/esm2022/button/lib/button.types.js.map +0 -1
  534. package/esm2022/button/malva-ui-core-button.js +0 -5
  535. package/esm2022/button/malva-ui-core-button.js.map +0 -1
  536. package/esm2022/calendar/index.js +0 -4
  537. package/esm2022/calendar/index.js.map +0 -1
  538. package/esm2022/calendar/lib/calendar/calendar.js +0 -672
  539. package/esm2022/calendar/lib/calendar/calendar.js.map +0 -1
  540. package/esm2022/calendar/lib/date-provider/date-adapter.js +0 -111
  541. package/esm2022/calendar/lib/date-provider/date-adapter.js.map +0 -1
  542. package/esm2022/calendar/lib/date-provider/native-date-adapter.js +0 -151
  543. package/esm2022/calendar/lib/date-provider/native-date-adapter.js.map +0 -1
  544. package/esm2022/calendar/malva-ui-core-calendar.js +0 -5
  545. package/esm2022/calendar/malva-ui-core-calendar.js.map +0 -1
  546. package/esm2022/card/index.js +0 -6
  547. package/esm2022/card/index.js.map +0 -1
  548. package/esm2022/card/lib/card/card.js +0 -54
  549. package/esm2022/card/lib/card/card.js.map +0 -1
  550. package/esm2022/card/lib/card-actions-def.js +0 -27
  551. package/esm2022/card/lib/card-actions-def.js.map +0 -1
  552. package/esm2022/card/lib/card-footer-def.js +0 -32
  553. package/esm2022/card/lib/card-footer-def.js.map +0 -1
  554. package/esm2022/card/lib/card-header-def.js +0 -27
  555. package/esm2022/card/lib/card-header-def.js.map +0 -1
  556. package/esm2022/card/lib/card-subheader-def.js +0 -33
  557. package/esm2022/card/lib/card-subheader-def.js.map +0 -1
  558. package/esm2022/card/malva-ui-core-card.js +0 -5
  559. package/esm2022/card/malva-ui-core-card.js.map +0 -1
  560. package/esm2022/chat/index.js +0 -10
  561. package/esm2022/chat/index.js.map +0 -1
  562. package/esm2022/chat/lib/chat/chat.js +0 -326
  563. package/esm2022/chat/lib/chat/chat.js.map +0 -1
  564. package/esm2022/chat/lib/chat-audio/chat-audio.js +0 -110
  565. package/esm2022/chat/lib/chat-audio/chat-audio.js.map +0 -1
  566. package/esm2022/chat/lib/chat-audio/chat-audio.service.js +0 -28
  567. package/esm2022/chat/lib/chat-audio/chat-audio.service.js.map +0 -1
  568. package/esm2022/chat/lib/chat-date/chat-date.js +0 -46
  569. package/esm2022/chat/lib/chat-date/chat-date.js.map +0 -1
  570. package/esm2022/chat/lib/chat-format.js +0 -11
  571. package/esm2022/chat/lib/chat-format.js.map +0 -1
  572. package/esm2022/chat/lib/chat-media-grid/chat-media-grid.js +0 -53
  573. package/esm2022/chat/lib/chat-media-grid/chat-media-grid.js.map +0 -1
  574. package/esm2022/chat/lib/chat-message/chat-message.js +0 -86
  575. package/esm2022/chat/lib/chat-message/chat-message.js.map +0 -1
  576. package/esm2022/chat/lib/chat-render-list.js +0 -55
  577. package/esm2022/chat/lib/chat-render-list.js.map +0 -1
  578. package/esm2022/chat/lib/chat-tokens.js +0 -9
  579. package/esm2022/chat/lib/chat-tokens.js.map +0 -1
  580. package/esm2022/chat/lib/chat-typing/chat-typing.js +0 -50
  581. package/esm2022/chat/lib/chat-typing/chat-typing.js.map +0 -1
  582. package/esm2022/chat/lib/chat.types.js +0 -1
  583. package/esm2022/chat/lib/chat.types.js.map +0 -1
  584. package/esm2022/chat/lib/defs/chat-author-def.js +0 -27
  585. package/esm2022/chat/lib/defs/chat-author-def.js.map +0 -1
  586. package/esm2022/chat/lib/defs/chat-date-def.js +0 -24
  587. package/esm2022/chat/lib/defs/chat-date-def.js.map +0 -1
  588. package/esm2022/chat/lib/defs/chat-message-def.js +0 -30
  589. package/esm2022/chat/lib/defs/chat-message-def.js.map +0 -1
  590. package/esm2022/chat/malva-ui-core-chat.js +0 -5
  591. package/esm2022/chat/malva-ui-core-chat.js.map +0 -1
  592. package/esm2022/checkbox/index.js +0 -4
  593. package/esm2022/checkbox/index.js.map +0 -1
  594. package/esm2022/checkbox/lib/checkbox/checkbox.js +0 -201
  595. package/esm2022/checkbox/lib/checkbox/checkbox.js.map +0 -1
  596. package/esm2022/checkbox/lib/checkbox-group/checkbox-group.js +0 -68
  597. package/esm2022/checkbox/lib/checkbox-group/checkbox-group.js.map +0 -1
  598. package/esm2022/checkbox/lib/checkbox-group-token.js +0 -3
  599. package/esm2022/checkbox/lib/checkbox-group-token.js.map +0 -1
  600. package/esm2022/checkbox/malva-ui-core-checkbox.js +0 -5
  601. package/esm2022/checkbox/malva-ui-core-checkbox.js.map +0 -1
  602. package/esm2022/chip/index.js +0 -3
  603. package/esm2022/chip/index.js.map +0 -1
  604. package/esm2022/chip/lib/chip/chip.directives.js +0 -32
  605. package/esm2022/chip/lib/chip/chip.directives.js.map +0 -1
  606. package/esm2022/chip/lib/chip/chip.js +0 -140
  607. package/esm2022/chip/lib/chip/chip.js.map +0 -1
  608. package/esm2022/chip/malva-ui-core-chip.js +0 -5
  609. package/esm2022/chip/malva-ui-core-chip.js.map +0 -1
  610. package/esm2022/color-picker/index.js +0 -4
  611. package/esm2022/color-picker/index.js.map +0 -1
  612. package/esm2022/color-picker/lib/color-picker/color-picker.js +0 -530
  613. package/esm2022/color-picker/lib/color-picker/color-picker.js.map +0 -1
  614. package/esm2022/color-picker/lib/color-picker-popup/color-picker-popup.js +0 -419
  615. package/esm2022/color-picker/lib/color-picker-popup/color-picker-popup.js.map +0 -1
  616. package/esm2022/color-picker/lib/color-utils/color-utils.js +0 -256
  617. package/esm2022/color-picker/lib/color-utils/color-utils.js.map +0 -1
  618. package/esm2022/color-picker/malva-ui-core-color-picker.js +0 -5
  619. package/esm2022/color-picker/malva-ui-core-color-picker.js.map +0 -1
  620. package/esm2022/combobox/index.js +0 -3
  621. package/esm2022/combobox/index.js.map +0 -1
  622. package/esm2022/combobox/lib/combobox/combobox.js +0 -911
  623. package/esm2022/combobox/lib/combobox/combobox.js.map +0 -1
  624. package/esm2022/combobox/lib/combobox-template.directives.js +0 -24
  625. package/esm2022/combobox/lib/combobox-template.directives.js.map +0 -1
  626. package/esm2022/combobox/malva-ui-core-combobox.js +0 -5
  627. package/esm2022/combobox/malva-ui-core-combobox.js.map +0 -1
  628. package/esm2022/copy-to-clipboard/index.js +0 -2
  629. package/esm2022/copy-to-clipboard/index.js.map +0 -1
  630. package/esm2022/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.js +0 -201
  631. package/esm2022/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.js.map +0 -1
  632. package/esm2022/copy-to-clipboard/malva-ui-core-copy-to-clipboard.js +0 -5
  633. package/esm2022/copy-to-clipboard/malva-ui-core-copy-to-clipboard.js.map +0 -1
  634. package/esm2022/data-table/index.js +0 -9
  635. package/esm2022/data-table/index.js.map +0 -1
  636. package/esm2022/data-table/lib/data-source.js +0 -6
  637. package/esm2022/data-table/lib/data-source.js.map +0 -1
  638. package/esm2022/data-table/lib/data-table/data-table-layout.js +0 -84
  639. package/esm2022/data-table/lib/data-table/data-table-layout.js.map +0 -1
  640. package/esm2022/data-table/lib/data-table/data-table.js +0 -1846
  641. package/esm2022/data-table/lib/data-table/data-table.js.map +0 -1
  642. package/esm2022/data-table/lib/data-table/services/data-table-column-visibility.service.js +0 -37
  643. package/esm2022/data-table/lib/data-table/services/data-table-column-visibility.service.js.map +0 -1
  644. package/esm2022/data-table/lib/data-table/services/data-table-editing.service.js +0 -63
  645. package/esm2022/data-table/lib/data-table/services/data-table-editing.service.js.map +0 -1
  646. package/esm2022/data-table/lib/data-table/services/data-table-pinning.service.js +0 -68
  647. package/esm2022/data-table/lib/data-table/services/data-table-pinning.service.js.map +0 -1
  648. package/esm2022/data-table/lib/data-table-cell.js +0 -46
  649. package/esm2022/data-table/lib/data-table-cell.js.map +0 -1
  650. package/esm2022/data-table/lib/data-table-edit-cell.js +0 -46
  651. package/esm2022/data-table/lib/data-table-edit-cell.js.map +0 -1
  652. package/esm2022/data-table/lib/data-table-error.js +0 -37
  653. package/esm2022/data-table/lib/data-table-error.js.map +0 -1
  654. package/esm2022/data-table/lib/data-table-footer.js +0 -33
  655. package/esm2022/data-table/lib/data-table-footer.js.map +0 -1
  656. package/esm2022/data-table/lib/data-table-no-data.js +0 -26
  657. package/esm2022/data-table/lib/data-table-no-data.js.map +0 -1
  658. package/esm2022/data-table/lib/filter-dropdown/filter-dropdown.js +0 -224
  659. package/esm2022/data-table/lib/filter-dropdown/filter-dropdown.js.map +0 -1
  660. package/esm2022/data-table/lib/types.js +0 -1
  661. package/esm2022/data-table/lib/types.js.map +0 -1
  662. package/esm2022/data-table/malva-ui-core-data-table.js +0 -5
  663. package/esm2022/data-table/malva-ui-core-data-table.js.map +0 -1
  664. package/esm2022/date-range-picker/index.js +0 -2
  665. package/esm2022/date-range-picker/index.js.map +0 -1
  666. package/esm2022/date-range-picker/lib/date-range-picker/date-range-picker.js +0 -269
  667. package/esm2022/date-range-picker/lib/date-range-picker/date-range-picker.js.map +0 -1
  668. package/esm2022/date-range-picker/malva-ui-core-date-range-picker.js +0 -5
  669. package/esm2022/date-range-picker/malva-ui-core-date-range-picker.js.map +0 -1
  670. package/esm2022/day-picker/index.js +0 -2
  671. package/esm2022/day-picker/index.js.map +0 -1
  672. package/esm2022/day-picker/lib/day-picker/day-picker.js +0 -124
  673. package/esm2022/day-picker/lib/day-picker/day-picker.js.map +0 -1
  674. package/esm2022/day-picker/malva-ui-core-day-picker.js +0 -5
  675. package/esm2022/day-picker/malva-ui-core-day-picker.js.map +0 -1
  676. package/esm2022/dialog/index.js +0 -12
  677. package/esm2022/dialog/index.js.map +0 -1
  678. package/esm2022/dialog/lib/confirm-dialog-options.js +0 -1
  679. package/esm2022/dialog/lib/confirm-dialog-options.js.map +0 -1
  680. package/esm2022/dialog/lib/confirm-dialog.js +0 -155
  681. package/esm2022/dialog/lib/confirm-dialog.js.map +0 -1
  682. package/esm2022/dialog/lib/dialog/dialog.js +0 -40
  683. package/esm2022/dialog/lib/dialog/dialog.js.map +0 -1
  684. package/esm2022/dialog/lib/dialog-body.js +0 -33
  685. package/esm2022/dialog/lib/dialog-body.js.map +0 -1
  686. package/esm2022/dialog/lib/dialog-close.js +0 -45
  687. package/esm2022/dialog/lib/dialog-close.js.map +0 -1
  688. package/esm2022/dialog/lib/dialog-config.js +0 -23
  689. package/esm2022/dialog/lib/dialog-config.js.map +0 -1
  690. package/esm2022/dialog/lib/dialog-container.js +0 -69
  691. package/esm2022/dialog/lib/dialog-container.js.map +0 -1
  692. package/esm2022/dialog/lib/dialog-footer.js +0 -29
  693. package/esm2022/dialog/lib/dialog-footer.js.map +0 -1
  694. package/esm2022/dialog/lib/dialog-header.js +0 -181
  695. package/esm2022/dialog/lib/dialog-header.js.map +0 -1
  696. package/esm2022/dialog/lib/dialog-ref.js +0 -167
  697. package/esm2022/dialog/lib/dialog-ref.js.map +0 -1
  698. package/esm2022/dialog/lib/dialog-template.js +0 -136
  699. package/esm2022/dialog/lib/dialog-template.js.map +0 -1
  700. package/esm2022/dialog/lib/dialog-text-content.js +0 -59
  701. package/esm2022/dialog/lib/dialog-text-content.js.map +0 -1
  702. package/esm2022/dialog/lib/dialog.service.js +0 -205
  703. package/esm2022/dialog/lib/dialog.service.js.map +0 -1
  704. package/esm2022/dialog/lib/generate-routable-dialog-route.js +0 -59
  705. package/esm2022/dialog/lib/generate-routable-dialog-route.js.map +0 -1
  706. package/esm2022/dialog/lib/inject-dialog-ref.js +0 -16
  707. package/esm2022/dialog/lib/inject-dialog-ref.js.map +0 -1
  708. package/esm2022/dialog/lib/routable-dialog.js +0 -91
  709. package/esm2022/dialog/lib/routable-dialog.js.map +0 -1
  710. package/esm2022/dialog/malva-ui-core-dialog.js +0 -5
  711. package/esm2022/dialog/malva-ui-core-dialog.js.map +0 -1
  712. package/esm2022/divider/index.js +0 -2
  713. package/esm2022/divider/index.js.map +0 -1
  714. package/esm2022/divider/lib/divider/divider.js +0 -73
  715. package/esm2022/divider/lib/divider/divider.js.map +0 -1
  716. package/esm2022/divider/malva-ui-core-divider.js +0 -5
  717. package/esm2022/divider/malva-ui-core-divider.js.map +0 -1
  718. package/esm2022/drawer/index.js +0 -12
  719. package/esm2022/drawer/index.js.map +0 -1
  720. package/esm2022/drawer/lib/drawer/drawer.js +0 -180
  721. package/esm2022/drawer/lib/drawer/drawer.js.map +0 -1
  722. package/esm2022/drawer/lib/drawer-body.js +0 -32
  723. package/esm2022/drawer/lib/drawer-body.js.map +0 -1
  724. package/esm2022/drawer/lib/drawer-content.js +0 -14
  725. package/esm2022/drawer/lib/drawer-content.js.map +0 -1
  726. package/esm2022/drawer/lib/drawer-footer.js +0 -14
  727. package/esm2022/drawer/lib/drawer-footer.js.map +0 -1
  728. package/esm2022/drawer/lib/drawer-header.js +0 -14
  729. package/esm2022/drawer/lib/drawer-header.js.map +0 -1
  730. package/esm2022/drawer/lib/drawer-ref.js +0 -31
  731. package/esm2022/drawer/lib/drawer-ref.js.map +0 -1
  732. package/esm2022/drawer/lib/drawer-resize.js +0 -243
  733. package/esm2022/drawer/lib/drawer-resize.js.map +0 -1
  734. package/esm2022/drawer/lib/drawer-section/drawer-section.js +0 -26
  735. package/esm2022/drawer/lib/drawer-section/drawer-section.js.map +0 -1
  736. package/esm2022/drawer/lib/drawer-sections/drawer-sections.js +0 -58
  737. package/esm2022/drawer/lib/drawer-sections/drawer-sections.js.map +0 -1
  738. package/esm2022/drawer/lib/drawer-sections.service.js +0 -83
  739. package/esm2022/drawer/lib/drawer-sections.service.js.map +0 -1
  740. package/esm2022/drawer/lib/drawer.service.js +0 -86
  741. package/esm2022/drawer/lib/drawer.service.js.map +0 -1
  742. package/esm2022/drawer/lib/generate-routable-drawer-route.js +0 -52
  743. package/esm2022/drawer/lib/generate-routable-drawer-route.js.map +0 -1
  744. package/esm2022/drawer/lib/routable-drawer.js +0 -91
  745. package/esm2022/drawer/lib/routable-drawer.js.map +0 -1
  746. package/esm2022/drawer/malva-ui-core-drawer.js +0 -5
  747. package/esm2022/drawer/malva-ui-core-drawer.js.map +0 -1
  748. package/esm2022/dropdown/index.js +0 -10
  749. package/esm2022/dropdown/index.js.map +0 -1
  750. package/esm2022/dropdown/lib/active-descendant.js +0 -92
  751. package/esm2022/dropdown/lib/active-descendant.js.map +0 -1
  752. package/esm2022/dropdown/lib/dropdown-panel/dropdown-panel.js +0 -295
  753. package/esm2022/dropdown/lib/dropdown-panel/dropdown-panel.js.map +0 -1
  754. package/esm2022/dropdown/lib/highlight-match.pipe.js +0 -36
  755. package/esm2022/dropdown/lib/highlight-match.pipe.js.map +0 -1
  756. package/esm2022/dropdown/lib/option-matcher.js +0 -124
  757. package/esm2022/dropdown/lib/option-matcher.js.map +0 -1
  758. package/esm2022/dropdown/lib/options-adapter.js +0 -356
  759. package/esm2022/dropdown/lib/options-adapter.js.map +0 -1
  760. package/esm2022/dropdown/lib/options-result.js +0 -11
  761. package/esm2022/dropdown/lib/options-result.js.map +0 -1
  762. package/esm2022/dropdown/lib/reconciliation.js +0 -32
  763. package/esm2022/dropdown/lib/reconciliation.js.map +0 -1
  764. package/esm2022/dropdown/lib/select-data-source.js +0 -21
  765. package/esm2022/dropdown/lib/select-data-source.js.map +0 -1
  766. package/esm2022/dropdown/lib/select-option.js +0 -25
  767. package/esm2022/dropdown/lib/select-option.js.map +0 -1
  768. package/esm2022/dropdown/malva-ui-core-dropdown.js +0 -5
  769. package/esm2022/dropdown/malva-ui-core-dropdown.js.map +0 -1
  770. package/esm2022/empty-state/index.js +0 -2
  771. package/esm2022/empty-state/index.js.map +0 -1
  772. package/esm2022/empty-state/lib/empty-state/empty-state.js +0 -43
  773. package/esm2022/empty-state/lib/empty-state/empty-state.js.map +0 -1
  774. package/esm2022/empty-state/malva-ui-core-empty-state.js +0 -5
  775. package/esm2022/empty-state/malva-ui-core-empty-state.js.map +0 -1
  776. package/esm2022/expand/index.js +0 -3
  777. package/esm2022/expand/index.js.map +0 -1
  778. package/esm2022/expand/lib/expand/expand-content.js +0 -33
  779. package/esm2022/expand/lib/expand/expand-content.js.map +0 -1
  780. package/esm2022/expand/lib/expand/expand.js +0 -93
  781. package/esm2022/expand/lib/expand/expand.js.map +0 -1
  782. package/esm2022/expand/malva-ui-core-expand.js +0 -5
  783. package/esm2022/expand/malva-ui-core-expand.js.map +0 -1
  784. package/esm2022/file-upload/index.js +0 -5
  785. package/esm2022/file-upload/index.js.map +0 -1
  786. package/esm2022/file-upload/lib/file-upload/file-upload.js +0 -324
  787. package/esm2022/file-upload/lib/file-upload/file-upload.js.map +0 -1
  788. package/esm2022/file-upload/lib/file-upload/file-upload.types.js +0 -1
  789. package/esm2022/file-upload/lib/file-upload/file-upload.types.js.map +0 -1
  790. package/esm2022/file-upload/lib/file-upload-action.js +0 -65
  791. package/esm2022/file-upload/lib/file-upload-action.js.map +0 -1
  792. package/esm2022/file-upload/lib/file-upload-item/file-upload-item.js +0 -55
  793. package/esm2022/file-upload/lib/file-upload-item/file-upload-item.js.map +0 -1
  794. package/esm2022/file-upload/malva-ui-core-file-upload.js +0 -5
  795. package/esm2022/file-upload/malva-ui-core-file-upload.js.map +0 -1
  796. package/esm2022/filter/index.js +0 -4
  797. package/esm2022/filter/index.js.map +0 -1
  798. package/esm2022/filter/lib/filter/filter.js +0 -552
  799. package/esm2022/filter/lib/filter/filter.js.map +0 -1
  800. package/esm2022/filter/lib/filter.types.js +0 -1
  801. package/esm2022/filter/lib/filter.types.js.map +0 -1
  802. package/esm2022/filter/lib/smart-filter-bar/smart-filter-bar.js +0 -518
  803. package/esm2022/filter/lib/smart-filter-bar/smart-filter-bar.js.map +0 -1
  804. package/esm2022/filter/malva-ui-core-filter.js +0 -5
  805. package/esm2022/filter/malva-ui-core-filter.js.map +0 -1
  806. package/esm2022/form/index.js +0 -7
  807. package/esm2022/form/index.js.map +0 -1
  808. package/esm2022/form/lib/fieldset/fieldset.js +0 -101
  809. package/esm2022/form/lib/fieldset/fieldset.js.map +0 -1
  810. package/esm2022/form/lib/fieldset-span.js +0 -49
  811. package/esm2022/form/lib/fieldset-span.js.map +0 -1
  812. package/esm2022/form/lib/form/form.js +0 -60
  813. package/esm2022/form/lib/form/form.js.map +0 -1
  814. package/esm2022/form/lib/form-actions.js +0 -34
  815. package/esm2022/form/lib/form-actions.js.map +0 -1
  816. package/esm2022/form/lib/form-gap.js +0 -15
  817. package/esm2022/form/lib/form-gap.js.map +0 -1
  818. package/esm2022/form/lib/form-header.js +0 -27
  819. package/esm2022/form/lib/form-header.js.map +0 -1
  820. package/esm2022/form/lib/form.types.js +0 -1
  821. package/esm2022/form/lib/form.types.js.map +0 -1
  822. package/esm2022/form/malva-ui-core-form.js +0 -5
  823. package/esm2022/form/malva-ui-core-form.js.map +0 -1
  824. package/esm2022/form-utils/index.js +0 -16
  825. package/esm2022/form-utils/index.js.map +0 -1
  826. package/esm2022/form-utils/lib/aria-value-bridge.js +0 -57
  827. package/esm2022/form-utils/lib/aria-value-bridge.js.map +0 -1
  828. package/esm2022/form-utils/lib/description/description.js +0 -24
  829. package/esm2022/form-utils/lib/description/description.js.map +0 -1
  830. package/esm2022/form-utils/lib/focusable-group-base.js +0 -87
  831. package/esm2022/form-utils/lib/focusable-group-base.js.map +0 -1
  832. package/esm2022/form-utils/lib/form-control-base/signal-form-control-base.js +0 -192
  833. package/esm2022/form-utils/lib/form-control-base/signal-form-control-base.js.map +0 -1
  834. package/esm2022/form-utils/lib/form-control-sides.js +0 -34
  835. package/esm2022/form-utils/lib/form-control-sides.js.map +0 -1
  836. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper-control.js +0 -14
  837. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper-control.js.map +0 -1
  838. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper.js +0 -47
  839. package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper.js.map +0 -1
  840. package/esm2022/form-utils/lib/form-field/form-field.js +0 -245
  841. package/esm2022/form-utils/lib/form-field/form-field.js.map +0 -1
  842. package/esm2022/form-utils/lib/hint/hint.js +0 -11
  843. package/esm2022/form-utils/lib/hint/hint.js.map +0 -1
  844. package/esm2022/form-utils/lib/label/label.js +0 -55
  845. package/esm2022/form-utils/lib/label/label.js.map +0 -1
  846. package/esm2022/form-utils/lib/message/message.js +0 -20
  847. package/esm2022/form-utils/lib/message/message.js.map +0 -1
  848. package/esm2022/form-utils/lib/models/error-display-strategy.js +0 -1
  849. package/esm2022/form-utils/lib/models/error-display-strategy.js.map +0 -1
  850. package/esm2022/form-utils/lib/models/form-control-connector.js +0 -3
  851. package/esm2022/form-utils/lib/models/form-control-connector.js.map +0 -1
  852. package/esm2022/form-utils/lib/models/form-state.js +0 -1
  853. package/esm2022/form-utils/lib/models/form-state.js.map +0 -1
  854. package/esm2022/form-utils/lib/selection.service.js +0 -81
  855. package/esm2022/form-utils/lib/selection.service.js.map +0 -1
  856. package/esm2022/form-utils/malva-ui-core-form-utils.js +0 -5
  857. package/esm2022/form-utils/malva-ui-core-form-utils.js.map +0 -1
  858. package/esm2022/form-utils/testing/index.js +0 -2
  859. package/esm2022/form-utils/testing/index.js.map +0 -1
  860. package/esm2022/form-utils/testing/lib/forms-binding-matrix.js +0 -32
  861. package/esm2022/form-utils/testing/lib/forms-binding-matrix.js.map +0 -1
  862. package/esm2022/form-utils/testing/malva-ui-core-form-utils-testing.js +0 -5
  863. package/esm2022/form-utils/testing/malva-ui-core-form-utils-testing.js.map +0 -1
  864. package/esm2022/index.js +0 -70
  865. package/esm2022/index.js.map +0 -1
  866. package/esm2022/input/index.js +0 -4
  867. package/esm2022/input/index.js.map +0 -1
  868. package/esm2022/input/lib/input/input-native.js +0 -49
  869. package/esm2022/input/lib/input/input-native.js.map +0 -1
  870. package/esm2022/input/lib/input/input-value-accessor.js +0 -4
  871. package/esm2022/input/lib/input/input-value-accessor.js.map +0 -1
  872. package/esm2022/input/lib/input/input.js +0 -277
  873. package/esm2022/input/lib/input/input.js.map +0 -1
  874. package/esm2022/input/lib/input/password-strength.js +0 -46
  875. package/esm2022/input/lib/input/password-strength.js.map +0 -1
  876. package/esm2022/input/malva-ui-core-input.js +0 -5
  877. package/esm2022/input/malva-ui-core-input.js.map +0 -1
  878. package/esm2022/kbd/index.js +0 -2
  879. package/esm2022/kbd/index.js.map +0 -1
  880. package/esm2022/kbd/lib/kbd/kbd.js +0 -124
  881. package/esm2022/kbd/lib/kbd/kbd.js.map +0 -1
  882. package/esm2022/kbd/malva-ui-core-kbd.js +0 -5
  883. package/esm2022/kbd/malva-ui-core-kbd.js.map +0 -1
  884. package/esm2022/layout/index.js +0 -5
  885. package/esm2022/layout/index.js.map +0 -1
  886. package/esm2022/layout/lib/layout/directives/MlvLayoutSide.js +0 -14
  887. package/esm2022/layout/lib/layout/directives/MlvLayoutSide.js.map +0 -1
  888. package/esm2022/layout/lib/layout/directives/MlvLayoutTop.js +0 -14
  889. package/esm2022/layout/lib/layout/directives/MlvLayoutTop.js.map +0 -1
  890. package/esm2022/layout/lib/layout/layout.js +0 -43
  891. package/esm2022/layout/lib/layout/layout.js.map +0 -1
  892. package/esm2022/layout/lib/layout/services/theme.service.js +0 -121
  893. package/esm2022/layout/lib/layout/services/theme.service.js.map +0 -1
  894. package/esm2022/layout/malva-ui-core-layout.js +0 -5
  895. package/esm2022/layout/malva-ui-core-layout.js.map +0 -1
  896. package/esm2022/link/index.js +0 -3
  897. package/esm2022/link/index.js.map +0 -1
  898. package/esm2022/link/lib/link/link.directives.js +0 -24
  899. package/esm2022/link/lib/link/link.directives.js.map +0 -1
  900. package/esm2022/link/lib/link/link.js +0 -61
  901. package/esm2022/link/lib/link/link.js.map +0 -1
  902. package/esm2022/link/malva-ui-core-link.js +0 -5
  903. package/esm2022/link/malva-ui-core-link.js.map +0 -1
  904. package/esm2022/list/index.js +0 -14
  905. package/esm2022/list/index.js.map +0 -1
  906. package/esm2022/list/lib/list/list.js +0 -28
  907. package/esm2022/list/lib/list/list.js.map +0 -1
  908. package/esm2022/list/lib/list-item/list-item.js +0 -125
  909. package/esm2022/list/lib/list-item/list-item.js.map +0 -1
  910. package/esm2022/list/lib/list-item-actions.js +0 -23
  911. package/esm2022/list/lib/list-item-actions.js.map +0 -1
  912. package/esm2022/list/lib/list-item-byline.js +0 -13
  913. package/esm2022/list/lib/list-item-byline.js.map +0 -1
  914. package/esm2022/list/lib/list-item-group/list-item-group.js +0 -25
  915. package/esm2022/list/lib/list-item-group/list-item-group.js.map +0 -1
  916. package/esm2022/list/lib/list-item-link/list-item-link.js +0 -20
  917. package/esm2022/list/lib/list-item-link/list-item-link.js.map +0 -1
  918. package/esm2022/list/lib/list-item-media.js +0 -13
  919. package/esm2022/list/lib/list-item-media.js.map +0 -1
  920. package/esm2022/list/lib/list-item-meta.js +0 -13
  921. package/esm2022/list/lib/list-item-meta.js.map +0 -1
  922. package/esm2022/list/lib/list-item-prefix.js +0 -13
  923. package/esm2022/list/lib/list-item-prefix.js.map +0 -1
  924. package/esm2022/list/lib/list-item-suffix.js +0 -13
  925. package/esm2022/list/lib/list-item-suffix.js.map +0 -1
  926. package/esm2022/list/lib/list-item-template.js +0 -14
  927. package/esm2022/list/lib/list-item-template.js.map +0 -1
  928. package/esm2022/list/lib/list-item-title.js +0 -13
  929. package/esm2022/list/lib/list-item-title.js.map +0 -1
  930. package/esm2022/list/lib/list-selectable.js +0 -116
  931. package/esm2022/list/lib/list-selectable.js.map +0 -1
  932. package/esm2022/list/malva-ui-core-list.js +0 -5
  933. package/esm2022/list/malva-ui-core-list.js.map +0 -1
  934. package/esm2022/loader/index.js +0 -2
  935. package/esm2022/loader/index.js.map +0 -1
  936. package/esm2022/loader/lib/loader/loader.js +0 -134
  937. package/esm2022/loader/lib/loader/loader.js.map +0 -1
  938. package/esm2022/loader/malva-ui-core-loader.js +0 -5
  939. package/esm2022/loader/malva-ui-core-loader.js.map +0 -1
  940. package/esm2022/malva-ui-core.js +0 -5
  941. package/esm2022/malva-ui-core.js.map +0 -1
  942. package/esm2022/menu/index.js +0 -10
  943. package/esm2022/menu/index.js.map +0 -1
  944. package/esm2022/menu/lib/menu/menu-group-label.js +0 -35
  945. package/esm2022/menu/lib/menu/menu-group-label.js.map +0 -1
  946. package/esm2022/menu/lib/menu/menu-group.js +0 -44
  947. package/esm2022/menu/lib/menu/menu-group.js.map +0 -1
  948. package/esm2022/menu/lib/menu/menu-item.js +0 -117
  949. package/esm2022/menu/lib/menu/menu-item.js.map +0 -1
  950. package/esm2022/menu/lib/menu/menu-separator.js +0 -41
  951. package/esm2022/menu/lib/menu/menu-separator.js.map +0 -1
  952. package/esm2022/menu/lib/menu/menu-trigger.js +0 -653
  953. package/esm2022/menu/lib/menu/menu-trigger.js.map +0 -1
  954. package/esm2022/menu/lib/menu/menu.js +0 -308
  955. package/esm2022/menu/lib/menu/menu.js.map +0 -1
  956. package/esm2022/menu/lib/menu/menu.types.js +0 -4
  957. package/esm2022/menu/lib/menu/menu.types.js.map +0 -1
  958. package/esm2022/menu/lib/menu/menubar.js +0 -257
  959. package/esm2022/menu/lib/menu/menubar.js.map +0 -1
  960. package/esm2022/menu/lib/menu/menubar.types.js +0 -4
  961. package/esm2022/menu/lib/menu/menubar.types.js.map +0 -1
  962. package/esm2022/menu/lib/menu/submenu-aim.js +0 -30
  963. package/esm2022/menu/lib/menu/submenu-aim.js.map +0 -1
  964. package/esm2022/menu/malva-ui-core-menu.js +0 -5
  965. package/esm2022/menu/malva-ui-core-menu.js.map +0 -1
  966. package/esm2022/notification/index.js +0 -5
  967. package/esm2022/notification/index.js.map +0 -1
  968. package/esm2022/notification/lib/notification-item/notification-item.js +0 -65
  969. package/esm2022/notification/lib/notification-item/notification-item.js.map +0 -1
  970. package/esm2022/notification/lib/notification-ref.js +0 -13
  971. package/esm2022/notification/lib/notification-ref.js.map +0 -1
  972. package/esm2022/notification/lib/notification.service.js +0 -118
  973. package/esm2022/notification/lib/notification.service.js.map +0 -1
  974. package/esm2022/notification/lib/notification.types.js +0 -6
  975. package/esm2022/notification/lib/notification.types.js.map +0 -1
  976. package/esm2022/notification/malva-ui-core-notification.js +0 -5
  977. package/esm2022/notification/malva-ui-core-notification.js.map +0 -1
  978. package/esm2022/number-input/index.js +0 -2
  979. package/esm2022/number-input/index.js.map +0 -1
  980. package/esm2022/number-input/lib/number-input/number-input.js +0 -395
  981. package/esm2022/number-input/lib/number-input/number-input.js.map +0 -1
  982. package/esm2022/number-input/malva-ui-core-number-input.js +0 -5
  983. package/esm2022/number-input/malva-ui-core-number-input.js.map +0 -1
  984. package/esm2022/page/index.js +0 -15
  985. package/esm2022/page/index.js.map +0 -1
  986. package/esm2022/page/lib/page/page-scroll.token.js +0 -9
  987. package/esm2022/page/lib/page/page-scroll.token.js.map +0 -1
  988. package/esm2022/page/lib/page/page-snap-controller.js +0 -170
  989. package/esm2022/page/lib/page/page-snap-controller.js.map +0 -1
  990. package/esm2022/page/lib/page/page-snap.directive.js +0 -65
  991. package/esm2022/page/lib/page/page-snap.directive.js.map +0 -1
  992. package/esm2022/page/lib/page/page.js +0 -173
  993. package/esm2022/page/lib/page/page.js.map +0 -1
  994. package/esm2022/page/lib/page-content/page-aside.js +0 -13
  995. package/esm2022/page/lib/page-content/page-aside.js.map +0 -1
  996. package/esm2022/page/lib/page-content/page-content.js +0 -72
  997. package/esm2022/page/lib/page-content/page-content.js.map +0 -1
  998. package/esm2022/page/lib/page-dock/page-dock.js +0 -128
  999. package/esm2022/page/lib/page-dock/page-dock.js.map +0 -1
  1000. package/esm2022/page/lib/page-dock/page-dock.slots.js +0 -39
  1001. package/esm2022/page/lib/page-dock/page-dock.slots.js.map +0 -1
  1002. package/esm2022/page/lib/page-header/page-header.directives.js +0 -88
  1003. package/esm2022/page/lib/page-header/page-header.directives.js.map +0 -1
  1004. package/esm2022/page/lib/page-header/page-header.js +0 -124
  1005. package/esm2022/page/lib/page-header/page-header.js.map +0 -1
  1006. package/esm2022/page/lib/page-shell/page-shell-color.js +0 -193
  1007. package/esm2022/page/lib/page-shell/page-shell-color.js.map +0 -1
  1008. package/esm2022/page/lib/page-shell/page-shell-css-color.js +0 -207
  1009. package/esm2022/page/lib/page-shell/page-shell-css-color.js.map +0 -1
  1010. package/esm2022/page/lib/page-shell/page-shell.js +0 -131
  1011. package/esm2022/page/lib/page-shell/page-shell.js.map +0 -1
  1012. package/esm2022/page/lib/page-shell/page-shell.slots.js +0 -41
  1013. package/esm2022/page/lib/page-shell/page-shell.slots.js.map +0 -1
  1014. package/esm2022/page/lib/page-summary/page-summary-item.js +0 -26
  1015. package/esm2022/page/lib/page-summary/page-summary-item.js.map +0 -1
  1016. package/esm2022/page/lib/page-summary/page-summary.js +0 -87
  1017. package/esm2022/page/lib/page-summary/page-summary.js.map +0 -1
  1018. package/esm2022/page/malva-ui-core-page.js +0 -5
  1019. package/esm2022/page/malva-ui-core-page.js.map +0 -1
  1020. package/esm2022/pagination/index.js +0 -5
  1021. package/esm2022/pagination/index.js.map +0 -1
  1022. package/esm2022/pagination/lib/pagination/pagination.directives.js +0 -58
  1023. package/esm2022/pagination/lib/pagination/pagination.directives.js.map +0 -1
  1024. package/esm2022/pagination/lib/pagination/pagination.js +0 -293
  1025. package/esm2022/pagination/lib/pagination/pagination.js.map +0 -1
  1026. package/esm2022/pagination/lib/pagination/pagination.model.js +0 -1
  1027. package/esm2022/pagination/lib/pagination/pagination.model.js.map +0 -1
  1028. package/esm2022/pagination/lib/pagination/pagination.service.js +0 -108
  1029. package/esm2022/pagination/lib/pagination/pagination.service.js.map +0 -1
  1030. package/esm2022/pagination/malva-ui-core-pagination.js +0 -5
  1031. package/esm2022/pagination/malva-ui-core-pagination.js.map +0 -1
  1032. package/esm2022/pin-input/index.js +0 -3
  1033. package/esm2022/pin-input/index.js.map +0 -1
  1034. package/esm2022/pin-input/lib/pin-input/pin-input-separator.js +0 -31
  1035. package/esm2022/pin-input/lib/pin-input/pin-input-separator.js.map +0 -1
  1036. package/esm2022/pin-input/lib/pin-input/pin-input.js +0 -365
  1037. package/esm2022/pin-input/lib/pin-input/pin-input.js.map +0 -1
  1038. package/esm2022/pin-input/malva-ui-core-pin-input.js +0 -5
  1039. package/esm2022/pin-input/malva-ui-core-pin-input.js.map +0 -1
  1040. package/esm2022/popup/index.js +0 -10
  1041. package/esm2022/popup/index.js.map +0 -1
  1042. package/esm2022/popup/lib/popup/popup.js +0 -500
  1043. package/esm2022/popup/lib/popup/popup.js.map +0 -1
  1044. package/esm2022/popup/lib/popup-container/popup-container.js +0 -169
  1045. package/esm2022/popup/lib/popup-container/popup-container.js.map +0 -1
  1046. package/esm2022/popup/lib/popup-container/popup-container.token.js +0 -9
  1047. package/esm2022/popup/lib/popup-container/popup-container.token.js.map +0 -1
  1048. package/esm2022/popup/lib/popup-content.js +0 -14
  1049. package/esm2022/popup/lib/popup-content.js.map +0 -1
  1050. package/esm2022/popup/lib/popup-header-content.js +0 -26
  1051. package/esm2022/popup/lib/popup-header-content.js.map +0 -1
  1052. package/esm2022/popup/lib/popup-pinned-content.js +0 -25
  1053. package/esm2022/popup/lib/popup-pinned-content.js.map +0 -1
  1054. package/esm2022/popup/lib/popup-positions.js +0 -252
  1055. package/esm2022/popup/lib/popup-positions.js.map +0 -1
  1056. package/esm2022/popup/lib/popup-trigger/popup-trigger.js +0 -308
  1057. package/esm2022/popup/lib/popup-trigger/popup-trigger.js.map +0 -1
  1058. package/esm2022/popup/lib/popup.service.js +0 -188
  1059. package/esm2022/popup/lib/popup.service.js.map +0 -1
  1060. package/esm2022/popup/malva-ui-core-popup.js +0 -5
  1061. package/esm2022/popup/malva-ui-core-popup.js.map +0 -1
  1062. package/esm2022/progress/index.js +0 -2
  1063. package/esm2022/progress/index.js.map +0 -1
  1064. package/esm2022/progress/lib/progress/progress.js +0 -102
  1065. package/esm2022/progress/lib/progress/progress.js.map +0 -1
  1066. package/esm2022/progress/malva-ui-core-progress.js +0 -5
  1067. package/esm2022/progress/malva-ui-core-progress.js.map +0 -1
  1068. package/esm2022/radio/index.js +0 -3
  1069. package/esm2022/radio/index.js.map +0 -1
  1070. package/esm2022/radio/lib/radio/radio.js +0 -134
  1071. package/esm2022/radio/lib/radio/radio.js.map +0 -1
  1072. package/esm2022/radio/lib/radio-group/radio-group.js +0 -176
  1073. package/esm2022/radio/lib/radio-group/radio-group.js.map +0 -1
  1074. package/esm2022/radio/lib/radio-group-token.js +0 -3
  1075. package/esm2022/radio/lib/radio-group-token.js.map +0 -1
  1076. package/esm2022/radio/malva-ui-core-radio.js +0 -5
  1077. package/esm2022/radio/malva-ui-core-radio.js.map +0 -1
  1078. package/esm2022/rating/index.js +0 -2
  1079. package/esm2022/rating/index.js.map +0 -1
  1080. package/esm2022/rating/lib/rating/rating.js +0 -208
  1081. package/esm2022/rating/lib/rating/rating.js.map +0 -1
  1082. package/esm2022/rating/malva-ui-core-rating.js +0 -5
  1083. package/esm2022/rating/malva-ui-core-rating.js.map +0 -1
  1084. package/esm2022/scrollbar/index.js +0 -2
  1085. package/esm2022/scrollbar/index.js.map +0 -1
  1086. package/esm2022/scrollbar/lib/scrollbar/scrollbar.js +0 -388
  1087. package/esm2022/scrollbar/lib/scrollbar/scrollbar.js.map +0 -1
  1088. package/esm2022/scrollbar/malva-ui-core-scrollbar.js +0 -5
  1089. package/esm2022/scrollbar/malva-ui-core-scrollbar.js.map +0 -1
  1090. package/esm2022/search-field/index.js +0 -3
  1091. package/esm2022/search-field/index.js.map +0 -1
  1092. package/esm2022/search-field/lib/search-field/search-field.js +0 -535
  1093. package/esm2022/search-field/lib/search-field/search-field.js.map +0 -1
  1094. package/esm2022/search-field/lib/search-field/search-overlay-content.js +0 -35
  1095. package/esm2022/search-field/lib/search-field/search-overlay-content.js.map +0 -1
  1096. package/esm2022/search-field/malva-ui-core-search-field.js +0 -5
  1097. package/esm2022/search-field/malva-ui-core-search-field.js.map +0 -1
  1098. package/esm2022/segmented/index.js +0 -5
  1099. package/esm2022/segmented/index.js.map +0 -1
  1100. package/esm2022/segmented/lib/segmented/segmented.js +0 -248
  1101. package/esm2022/segmented/lib/segmented/segmented.js.map +0 -1
  1102. package/esm2022/segmented/lib/segmented-item/segmented-item.js +0 -194
  1103. package/esm2022/segmented/lib/segmented-item/segmented-item.js.map +0 -1
  1104. package/esm2022/segmented/lib/segmented-token.js +0 -4
  1105. package/esm2022/segmented/lib/segmented-token.js.map +0 -1
  1106. package/esm2022/segmented/lib/segmented.types.js +0 -1
  1107. package/esm2022/segmented/lib/segmented.types.js.map +0 -1
  1108. package/esm2022/segmented/malva-ui-core-segmented.js +0 -5
  1109. package/esm2022/segmented/malva-ui-core-segmented.js.map +0 -1
  1110. package/esm2022/select/index.js +0 -4
  1111. package/esm2022/select/index.js.map +0 -1
  1112. package/esm2022/select/lib/select/select.js +0 -685
  1113. package/esm2022/select/lib/select/select.js.map +0 -1
  1114. package/esm2022/select/lib/select-option.js +0 -2
  1115. package/esm2022/select/lib/select-option.js.map +0 -1
  1116. package/esm2022/select/lib/select-template.directives.js +0 -34
  1117. package/esm2022/select/lib/select-template.directives.js.map +0 -1
  1118. package/esm2022/select/malva-ui-core-select.js +0 -5
  1119. package/esm2022/select/malva-ui-core-select.js.map +0 -1
  1120. package/esm2022/sidebar/index.js +0 -16
  1121. package/esm2022/sidebar/index.js.map +0 -1
  1122. package/esm2022/sidebar/lib/sidebar/sidebar.js +0 -251
  1123. package/esm2022/sidebar/lib/sidebar/sidebar.js.map +0 -1
  1124. package/esm2022/sidebar/lib/sidebar-content.js +0 -37
  1125. package/esm2022/sidebar/lib/sidebar-content.js.map +0 -1
  1126. package/esm2022/sidebar/lib/sidebar-context.js +0 -3
  1127. package/esm2022/sidebar/lib/sidebar-context.js.map +0 -1
  1128. package/esm2022/sidebar/lib/sidebar-footer.js +0 -20
  1129. package/esm2022/sidebar/lib/sidebar-footer.js.map +0 -1
  1130. package/esm2022/sidebar/lib/sidebar-group/sidebar-group.js +0 -341
  1131. package/esm2022/sidebar/lib/sidebar-group/sidebar-group.js.map +0 -1
  1132. package/esm2022/sidebar/lib/sidebar-header.js +0 -20
  1133. package/esm2022/sidebar/lib/sidebar-header.js.map +0 -1
  1134. package/esm2022/sidebar/lib/sidebar-item/sidebar-item.js +0 -216
  1135. package/esm2022/sidebar/lib/sidebar-item/sidebar-item.js.map +0 -1
  1136. package/esm2022/sidebar/lib/sidebar-item-host.js +0 -39
  1137. package/esm2022/sidebar/lib/sidebar-item-host.js.map +0 -1
  1138. package/esm2022/sidebar/lib/sidebar-item-icon.js +0 -14
  1139. package/esm2022/sidebar/lib/sidebar-item-icon.js.map +0 -1
  1140. package/esm2022/sidebar/lib/sidebar-mode.js +0 -1
  1141. package/esm2022/sidebar/lib/sidebar-mode.js.map +0 -1
  1142. package/esm2022/sidebar/lib/sidebar-rail/sidebar-rail.js +0 -202
  1143. package/esm2022/sidebar/lib/sidebar-rail/sidebar-rail.js.map +0 -1
  1144. package/esm2022/sidebar/lib/sidebar-trigger/sidebar-trigger.js +0 -159
  1145. package/esm2022/sidebar/lib/sidebar-trigger/sidebar-trigger.js.map +0 -1
  1146. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.js +0 -35
  1147. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.js.map +0 -1
  1148. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.js +0 -107
  1149. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.js.map +0 -1
  1150. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.types.js +0 -1
  1151. package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.types.js.map +0 -1
  1152. package/esm2022/sidebar/malva-ui-core-sidebar.js +0 -5
  1153. package/esm2022/sidebar/malva-ui-core-sidebar.js.map +0 -1
  1154. package/esm2022/skeleton/index.js +0 -2
  1155. package/esm2022/skeleton/index.js.map +0 -1
  1156. package/esm2022/skeleton/lib/skeleton/skeleton.js +0 -78
  1157. package/esm2022/skeleton/lib/skeleton/skeleton.js.map +0 -1
  1158. package/esm2022/skeleton/malva-ui-core-skeleton.js +0 -5
  1159. package/esm2022/skeleton/malva-ui-core-skeleton.js.map +0 -1
  1160. package/esm2022/slider/index.js +0 -3
  1161. package/esm2022/slider/index.js.map +0 -1
  1162. package/esm2022/slider/lib/slider/slider-tooltip-def.js +0 -31
  1163. package/esm2022/slider/lib/slider/slider-tooltip-def.js.map +0 -1
  1164. package/esm2022/slider/lib/slider/slider.js +0 -468
  1165. package/esm2022/slider/lib/slider/slider.js.map +0 -1
  1166. package/esm2022/slider/malva-ui-core-slider.js +0 -5
  1167. package/esm2022/slider/malva-ui-core-slider.js.map +0 -1
  1168. package/esm2022/split-pane/index.js +0 -4
  1169. package/esm2022/split-pane/index.js.map +0 -1
  1170. package/esm2022/split-pane/lib/split-pane/split-pane-panel.js +0 -49
  1171. package/esm2022/split-pane/lib/split-pane/split-pane-panel.js.map +0 -1
  1172. package/esm2022/split-pane/lib/split-pane/split-pane.js +0 -290
  1173. package/esm2022/split-pane/lib/split-pane/split-pane.js.map +0 -1
  1174. package/esm2022/split-pane/lib/split-pane/split-pane.types.js +0 -1
  1175. package/esm2022/split-pane/lib/split-pane/split-pane.types.js.map +0 -1
  1176. package/esm2022/split-pane/malva-ui-core-split-pane.js +0 -5
  1177. package/esm2022/split-pane/malva-ui-core-split-pane.js.map +0 -1
  1178. package/esm2022/status-indicator/index.js +0 -2
  1179. package/esm2022/status-indicator/index.js.map +0 -1
  1180. package/esm2022/status-indicator/lib/status-indicator/status-indicator.js +0 -71
  1181. package/esm2022/status-indicator/lib/status-indicator/status-indicator.js.map +0 -1
  1182. package/esm2022/status-indicator/malva-ui-core-status-indicator.js +0 -5
  1183. package/esm2022/status-indicator/malva-ui-core-status-indicator.js.map +0 -1
  1184. package/esm2022/stepper/index.js +0 -5
  1185. package/esm2022/stepper/index.js.map +0 -1
  1186. package/esm2022/stepper/lib/stepper/step-header.js +0 -46
  1187. package/esm2022/stepper/lib/stepper/step-header.js.map +0 -1
  1188. package/esm2022/stepper/lib/stepper/step.js +0 -65
  1189. package/esm2022/stepper/lib/stepper/step.js.map +0 -1
  1190. package/esm2022/stepper/lib/stepper/stepper-token.js +0 -4
  1191. package/esm2022/stepper/lib/stepper/stepper-token.js.map +0 -1
  1192. package/esm2022/stepper/lib/stepper/stepper.js +0 -216
  1193. package/esm2022/stepper/lib/stepper/stepper.js.map +0 -1
  1194. package/esm2022/stepper/lib/stepper/stepper.types.js +0 -1
  1195. package/esm2022/stepper/lib/stepper/stepper.types.js.map +0 -1
  1196. package/esm2022/stepper/malva-ui-core-stepper.js +0 -5
  1197. package/esm2022/stepper/malva-ui-core-stepper.js.map +0 -1
  1198. package/esm2022/switch/index.js +0 -3
  1199. package/esm2022/switch/index.js.map +0 -1
  1200. package/esm2022/switch/lib/switch/switch.js +0 -190
  1201. package/esm2022/switch/lib/switch/switch.js.map +0 -1
  1202. package/esm2022/switch/lib/switch-group/switch-group.js +0 -68
  1203. package/esm2022/switch/lib/switch-group/switch-group.js.map +0 -1
  1204. package/esm2022/switch/lib/switch-group-token.js +0 -3
  1205. package/esm2022/switch/lib/switch-group-token.js.map +0 -1
  1206. package/esm2022/switch/malva-ui-core-switch.js +0 -5
  1207. package/esm2022/switch/malva-ui-core-switch.js.map +0 -1
  1208. package/esm2022/tabs/index.js +0 -9
  1209. package/esm2022/tabs/index.js.map +0 -1
  1210. package/esm2022/tabs/lib/tab/tab.js +0 -72
  1211. package/esm2022/tabs/lib/tab/tab.js.map +0 -1
  1212. package/esm2022/tabs/lib/tab-content/tab-content.js +0 -19
  1213. package/esm2022/tabs/lib/tab-content/tab-content.js.map +0 -1
  1214. package/esm2022/tabs/lib/tab-content-def.js +0 -14
  1215. package/esm2022/tabs/lib/tab-content-def.js.map +0 -1
  1216. package/esm2022/tabs/lib/tab-def.js +0 -17
  1217. package/esm2022/tabs/lib/tab-def.js.map +0 -1
  1218. package/esm2022/tabs/lib/tab-group-token.js +0 -3
  1219. package/esm2022/tabs/lib/tab-group-token.js.map +0 -1
  1220. package/esm2022/tabs/lib/tab-item/tab-item.js +0 -44
  1221. package/esm2022/tabs/lib/tab-item/tab-item.js.map +0 -1
  1222. package/esm2022/tabs/lib/tabs/tabs.js +0 -542
  1223. package/esm2022/tabs/lib/tabs/tabs.js.map +0 -1
  1224. package/esm2022/tabs/lib/tabs.service.js +0 -83
  1225. package/esm2022/tabs/lib/tabs.service.js.map +0 -1
  1226. package/esm2022/tabs/malva-ui-core-tabs.js +0 -5
  1227. package/esm2022/tabs/malva-ui-core-tabs.js.map +0 -1
  1228. package/esm2022/textarea/index.js +0 -2
  1229. package/esm2022/textarea/index.js.map +0 -1
  1230. package/esm2022/textarea/lib/textarea/textarea.js +0 -194
  1231. package/esm2022/textarea/lib/textarea/textarea.js.map +0 -1
  1232. package/esm2022/textarea/malva-ui-core-textarea.js +0 -5
  1233. package/esm2022/textarea/malva-ui-core-textarea.js.map +0 -1
  1234. package/esm2022/tile/index.js +0 -3
  1235. package/esm2022/tile/index.js.map +0 -1
  1236. package/esm2022/tile/lib/tile/tile.js +0 -39
  1237. package/esm2022/tile/lib/tile/tile.js.map +0 -1
  1238. package/esm2022/tile/lib/tile-header.js +0 -14
  1239. package/esm2022/tile/lib/tile-header.js.map +0 -1
  1240. package/esm2022/tile/malva-ui-core-tile.js +0 -5
  1241. package/esm2022/tile/malva-ui-core-tile.js.map +0 -1
  1242. package/esm2022/time-picker/index.js +0 -2
  1243. package/esm2022/time-picker/index.js.map +0 -1
  1244. package/esm2022/time-picker/lib/time-picker/time-picker.js +0 -310
  1245. package/esm2022/time-picker/lib/time-picker/time-picker.js.map +0 -1
  1246. package/esm2022/time-picker/lib/time-picker-column/time-picker-column.js +0 -216
  1247. package/esm2022/time-picker/lib/time-picker-column/time-picker-column.js.map +0 -1
  1248. package/esm2022/time-picker/malva-ui-core-time-picker.js +0 -5
  1249. package/esm2022/time-picker/malva-ui-core-time-picker.js.map +0 -1
  1250. package/esm2022/timeline/index.js +0 -6
  1251. package/esm2022/timeline/index.js.map +0 -1
  1252. package/esm2022/timeline/lib/timeline/timeline-item-icon.js +0 -31
  1253. package/esm2022/timeline/lib/timeline/timeline-item-icon.js.map +0 -1
  1254. package/esm2022/timeline/lib/timeline/timeline-item-meta.js +0 -31
  1255. package/esm2022/timeline/lib/timeline/timeline-item-meta.js.map +0 -1
  1256. package/esm2022/timeline/lib/timeline/timeline-item.js +0 -69
  1257. package/esm2022/timeline/lib/timeline/timeline-item.js.map +0 -1
  1258. package/esm2022/timeline/lib/timeline/timeline.js +0 -36
  1259. package/esm2022/timeline/lib/timeline/timeline.js.map +0 -1
  1260. package/esm2022/timeline/lib/timeline/timeline.types.js +0 -1
  1261. package/esm2022/timeline/lib/timeline/timeline.types.js.map +0 -1
  1262. package/esm2022/timeline/malva-ui-core-timeline.js +0 -5
  1263. package/esm2022/timeline/malva-ui-core-timeline.js.map +0 -1
  1264. package/esm2022/title/index.js +0 -2
  1265. package/esm2022/title/index.js.map +0 -1
  1266. package/esm2022/title/lib/title/title.js +0 -171
  1267. package/esm2022/title/lib/title/title.js.map +0 -1
  1268. package/esm2022/title/malva-ui-core-title.js +0 -5
  1269. package/esm2022/title/malva-ui-core-title.js.map +0 -1
  1270. package/esm2022/toast/index.js +0 -13
  1271. package/esm2022/toast/index.js.map +0 -1
  1272. package/esm2022/toast/lib/abstract-toast-container.js +0 -50
  1273. package/esm2022/toast/lib/abstract-toast-container.js.map +0 -1
  1274. package/esm2022/toast/lib/abstract-toast-item.js +0 -75
  1275. package/esm2022/toast/lib/abstract-toast-item.js.map +0 -1
  1276. package/esm2022/toast/lib/abstract-toast.service.js +0 -176
  1277. package/esm2022/toast/lib/abstract-toast.service.js.map +0 -1
  1278. package/esm2022/toast/lib/toast-container/toast-container.js +0 -61
  1279. package/esm2022/toast/lib/toast-container/toast-container.js.map +0 -1
  1280. package/esm2022/toast/lib/toast-item/toast-item.js +0 -62
  1281. package/esm2022/toast/lib/toast-item/toast-item.js.map +0 -1
  1282. package/esm2022/toast/lib/toast-ref.js +0 -54
  1283. package/esm2022/toast/lib/toast-ref.js.map +0 -1
  1284. package/esm2022/toast/lib/toast-timer.js +0 -37
  1285. package/esm2022/toast/lib/toast-timer.js.map +0 -1
  1286. package/esm2022/toast/lib/toast.directives.js +0 -76
  1287. package/esm2022/toast/lib/toast.directives.js.map +0 -1
  1288. package/esm2022/toast/lib/toast.service.js +0 -127
  1289. package/esm2022/toast/lib/toast.service.js.map +0 -1
  1290. package/esm2022/toast/lib/toast.types.js +0 -39
  1291. package/esm2022/toast/lib/toast.types.js.map +0 -1
  1292. package/esm2022/toast/malva-ui-core-toast.js +0 -5
  1293. package/esm2022/toast/malva-ui-core-toast.js.map +0 -1
  1294. package/esm2022/tokenizer/index.js +0 -4
  1295. package/esm2022/tokenizer/index.js.map +0 -1
  1296. package/esm2022/tokenizer/lib/token/token.js +0 -123
  1297. package/esm2022/tokenizer/lib/token/token.js.map +0 -1
  1298. package/esm2022/tokenizer/lib/token-template.js +0 -23
  1299. package/esm2022/tokenizer/lib/token-template.js.map +0 -1
  1300. package/esm2022/tokenizer/lib/tokenizer/tokenizer.js +0 -324
  1301. package/esm2022/tokenizer/lib/tokenizer/tokenizer.js.map +0 -1
  1302. package/esm2022/tokenizer/malva-ui-core-tokenizer.js +0 -5
  1303. package/esm2022/tokenizer/malva-ui-core-tokenizer.js.map +0 -1
  1304. package/esm2022/toolbar/index.js +0 -4
  1305. package/esm2022/toolbar/index.js.map +0 -1
  1306. package/esm2022/toolbar/lib/toolbar/toolbar-spacer.js +0 -13
  1307. package/esm2022/toolbar/lib/toolbar/toolbar-spacer.js.map +0 -1
  1308. package/esm2022/toolbar/lib/toolbar/toolbar-widget.js +0 -106
  1309. package/esm2022/toolbar/lib/toolbar/toolbar-widget.js.map +0 -1
  1310. package/esm2022/toolbar/lib/toolbar/toolbar.js +0 -19
  1311. package/esm2022/toolbar/lib/toolbar/toolbar.js.map +0 -1
  1312. package/esm2022/toolbar/malva-ui-core-toolbar.js +0 -5
  1313. package/esm2022/toolbar/malva-ui-core-toolbar.js.map +0 -1
  1314. package/esm2022/tooltip/index.js +0 -4
  1315. package/esm2022/tooltip/index.js.map +0 -1
  1316. package/esm2022/tooltip/lib/tooltip/tooltip-panel.js +0 -69
  1317. package/esm2022/tooltip/lib/tooltip/tooltip-panel.js.map +0 -1
  1318. package/esm2022/tooltip/lib/tooltip/tooltip.js +0 -352
  1319. package/esm2022/tooltip/lib/tooltip/tooltip.js.map +0 -1
  1320. package/esm2022/tooltip/lib/tooltip/tooltip.types.js +0 -1
  1321. package/esm2022/tooltip/lib/tooltip/tooltip.types.js.map +0 -1
  1322. package/esm2022/tooltip/malva-ui-core-tooltip.js +0 -5
  1323. package/esm2022/tooltip/malva-ui-core-tooltip.js.map +0 -1
  1324. package/esm2022/tree/index.js +0 -5
  1325. package/esm2022/tree/index.js.map +0 -1
  1326. package/esm2022/tree/lib/tree/tree-context.js +0 -7
  1327. package/esm2022/tree/lib/tree/tree-context.js.map +0 -1
  1328. package/esm2022/tree/lib/tree/tree-node-def.js +0 -34
  1329. package/esm2022/tree/lib/tree/tree-node-def.js.map +0 -1
  1330. package/esm2022/tree/lib/tree/tree-node.js +0 -1
  1331. package/esm2022/tree/lib/tree/tree-node.js.map +0 -1
  1332. package/esm2022/tree/lib/tree/tree-subtree.js +0 -107
  1333. package/esm2022/tree/lib/tree/tree-subtree.js.map +0 -1
  1334. package/esm2022/tree/lib/tree/tree.js +0 -362
  1335. package/esm2022/tree/lib/tree/tree.js.map +0 -1
  1336. package/esm2022/tree/malva-ui-core-tree.js +0 -5
  1337. package/esm2022/tree/malva-ui-core-tree.js.map +0 -1
  1338. package/expand/index.d.ts +0 -2
  1339. package/expand/lib/expand/expand-content.d.ts +0 -26
  1340. package/expand/lib/expand/expand.d.ts +0 -74
  1341. package/expand/malva-ui-core-expand.d.ts +0 -5
  1342. package/file-upload/index.d.ts +0 -4
  1343. package/file-upload/lib/file-upload/file-upload.d.ts +0 -138
  1344. package/file-upload/lib/file-upload/file-upload.types.d.ts +0 -42
  1345. package/file-upload/lib/file-upload-action.d.ts +0 -53
  1346. package/file-upload/lib/file-upload-item/file-upload-item.d.ts +0 -30
  1347. package/file-upload/malva-ui-core-file-upload.d.ts +0 -5
  1348. package/filter/index.d.ts +0 -3
  1349. package/filter/lib/filter/filter.d.ts +0 -156
  1350. package/filter/lib/filter.types.d.ts +0 -75
  1351. package/filter/lib/smart-filter-bar/smart-filter-bar.d.ts +0 -153
  1352. package/filter/malva-ui-core-filter.d.ts +0 -5
  1353. package/form/index.d.ts +0 -6
  1354. package/form/lib/fieldset/fieldset.d.ts +0 -58
  1355. package/form/lib/fieldset-span.d.ts +0 -28
  1356. package/form/lib/form/form.d.ts +0 -37
  1357. package/form/lib/form-actions.d.ts +0 -20
  1358. package/form/lib/form-gap.d.ts +0 -5
  1359. package/form/lib/form-header.d.ts +0 -18
  1360. package/form/lib/form.types.d.ts +0 -13
  1361. package/form/malva-ui-core-form.d.ts +0 -5
  1362. package/form-utils/index.d.ts +0 -15
  1363. package/form-utils/lib/aria-value-bridge.d.ts +0 -45
  1364. package/form-utils/lib/description/description.d.ts +0 -16
  1365. package/form-utils/lib/focusable-group-base.d.ts +0 -76
  1366. package/form-utils/lib/form-control-base/signal-form-control-base.d.ts +0 -159
  1367. package/form-utils/lib/form-control-sides.d.ts +0 -20
  1368. package/form-utils/lib/form-control-wrapper/form-control-wrapper-control.d.ts +0 -6
  1369. package/form-utils/lib/form-control-wrapper/form-control-wrapper.d.ts +0 -20
  1370. package/form-utils/lib/form-field/form-field.d.ts +0 -68
  1371. package/form-utils/lib/hint/hint.d.ts +0 -5
  1372. package/form-utils/lib/label/label.d.ts +0 -22
  1373. package/form-utils/lib/message/message.d.ts +0 -7
  1374. package/form-utils/lib/models/error-display-strategy.d.ts +0 -1
  1375. package/form-utils/lib/models/form-control-connector.d.ts +0 -41
  1376. package/form-utils/lib/models/form-state.d.ts +0 -1
  1377. package/form-utils/lib/selection.service.d.ts +0 -27
  1378. package/form-utils/malva-ui-core-form-utils.d.ts +0 -5
  1379. package/form-utils/testing/index.d.ts +0 -1
  1380. package/form-utils/testing/lib/forms-binding-matrix.d.ts +0 -47
  1381. package/form-utils/testing/malva-ui-core-form-utils-testing.d.ts +0 -5
  1382. package/index.d.ts +0 -69
  1383. package/input/index.d.ts +0 -3
  1384. package/input/lib/input/input-native.d.ts +0 -36
  1385. package/input/lib/input/input-value-accessor.d.ts +0 -11
  1386. package/input/lib/input/input.d.ts +0 -189
  1387. package/input/lib/input/password-strength.d.ts +0 -34
  1388. package/input/malva-ui-core-input.d.ts +0 -5
  1389. package/kbd/index.d.ts +0 -1
  1390. package/kbd/lib/kbd/kbd.d.ts +0 -52
  1391. package/kbd/malva-ui-core-kbd.d.ts +0 -5
  1392. package/layout/index.d.ts +0 -4
  1393. package/layout/lib/layout/directives/MlvLayoutSide.d.ts +0 -6
  1394. package/layout/lib/layout/directives/MlvLayoutTop.d.ts +0 -6
  1395. package/layout/lib/layout/layout.d.ts +0 -20
  1396. package/layout/lib/layout/services/theme.service.d.ts +0 -33
  1397. package/layout/malva-ui-core-layout.d.ts +0 -5
  1398. package/link/index.d.ts +0 -2
  1399. package/link/lib/link/link.d.ts +0 -15
  1400. package/link/lib/link/link.directives.d.ts +0 -10
  1401. package/link/malva-ui-core-link.d.ts +0 -5
  1402. package/list/index.d.ts +0 -13
  1403. package/list/lib/list/list.d.ts +0 -25
  1404. package/list/lib/list-item/list-item.d.ts +0 -67
  1405. package/list/lib/list-item-actions.d.ts +0 -12
  1406. package/list/lib/list-item-byline.d.ts +0 -5
  1407. package/list/lib/list-item-group/list-item-group.d.ts +0 -11
  1408. package/list/lib/list-item-link/list-item-link.d.ts +0 -8
  1409. package/list/lib/list-item-media.d.ts +0 -5
  1410. package/list/lib/list-item-meta.d.ts +0 -5
  1411. package/list/lib/list-item-prefix.d.ts +0 -5
  1412. package/list/lib/list-item-suffix.d.ts +0 -5
  1413. package/list/lib/list-item-template.d.ts +0 -10
  1414. package/list/lib/list-item-title.d.ts +0 -5
  1415. package/list/lib/list-selectable.d.ts +0 -73
  1416. package/list/malva-ui-core-list.d.ts +0 -5
  1417. package/loader/index.d.ts +0 -1
  1418. package/loader/lib/loader/loader.d.ts +0 -84
  1419. package/loader/malva-ui-core-loader.d.ts +0 -5
  1420. package/malva-ui-core.d.ts +0 -5
  1421. package/menu/index.d.ts +0 -9
  1422. package/menu/lib/menu/menu-group-label.d.ts +0 -22
  1423. package/menu/lib/menu/menu-group.d.ts +0 -27
  1424. package/menu/lib/menu/menu-item.d.ts +0 -76
  1425. package/menu/lib/menu/menu-separator.d.ts +0 -18
  1426. package/menu/lib/menu/menu-trigger.d.ts +0 -255
  1427. package/menu/lib/menu/menu.d.ts +0 -149
  1428. package/menu/lib/menu/menu.types.d.ts +0 -13
  1429. package/menu/lib/menu/menubar.d.ts +0 -131
  1430. package/menu/lib/menu/menubar.types.d.ts +0 -82
  1431. package/menu/lib/menu/submenu-aim.d.ts +0 -10
  1432. package/menu/malva-ui-core-menu.d.ts +0 -5
  1433. package/notification/index.d.ts +0 -4
  1434. package/notification/lib/notification-item/notification-item.d.ts +0 -20
  1435. package/notification/lib/notification-ref.d.ts +0 -12
  1436. package/notification/lib/notification.service.d.ts +0 -43
  1437. package/notification/lib/notification.types.d.ts +0 -52
  1438. package/notification/malva-ui-core-notification.d.ts +0 -5
  1439. package/number-input/index.d.ts +0 -1
  1440. package/number-input/lib/number-input/number-input.d.ts +0 -162
  1441. package/number-input/malva-ui-core-number-input.d.ts +0 -5
  1442. package/page/index.d.ts +0 -14
  1443. package/page/lib/page/page-scroll.token.d.ts +0 -19
  1444. package/page/lib/page/page-snap-controller.d.ts +0 -87
  1445. package/page/lib/page/page-snap.directive.d.ts +0 -40
  1446. package/page/lib/page/page.d.ts +0 -74
  1447. package/page/lib/page-content/page-aside.d.ts +0 -7
  1448. package/page/lib/page-content/page-content.d.ts +0 -37
  1449. package/page/lib/page-dock/page-dock.d.ts +0 -50
  1450. package/page/lib/page-dock/page-dock.slots.d.ts +0 -16
  1451. package/page/lib/page-header/page-header.d.ts +0 -77
  1452. package/page/lib/page-header/page-header.directives.d.ts +0 -50
  1453. package/page/lib/page-shell/page-shell-color.d.ts +0 -48
  1454. package/page/lib/page-shell/page-shell-css-color.d.ts +0 -20
  1455. package/page/lib/page-shell/page-shell.d.ts +0 -44
  1456. package/page/lib/page-shell/page-shell.slots.d.ts +0 -16
  1457. package/page/lib/page-summary/page-summary-item.d.ts +0 -11
  1458. package/page/lib/page-summary/page-summary.d.ts +0 -36
  1459. package/page/malva-ui-core-page.d.ts +0 -5
  1460. package/pagination/index.d.ts +0 -4
  1461. package/pagination/lib/pagination/pagination.d.ts +0 -182
  1462. package/pagination/lib/pagination/pagination.directives.d.ts +0 -44
  1463. package/pagination/lib/pagination/pagination.model.d.ts +0 -6
  1464. package/pagination/lib/pagination/pagination.service.d.ts +0 -26
  1465. package/pagination/malva-ui-core-pagination.d.ts +0 -5
  1466. package/pin-input/index.d.ts +0 -2
  1467. package/pin-input/lib/pin-input/pin-input-separator.d.ts +0 -24
  1468. package/pin-input/lib/pin-input/pin-input.d.ts +0 -176
  1469. package/pin-input/malva-ui-core-pin-input.d.ts +0 -5
  1470. package/popup/index.d.ts +0 -9
  1471. package/popup/lib/popup/popup.d.ts +0 -343
  1472. package/popup/lib/popup-container/popup-container.d.ts +0 -61
  1473. package/popup/lib/popup-container/popup-container.token.d.ts +0 -34
  1474. package/popup/lib/popup-content.d.ts +0 -6
  1475. package/popup/lib/popup-header-content.d.ts +0 -18
  1476. package/popup/lib/popup-pinned-content.d.ts +0 -17
  1477. package/popup/lib/popup-positions.d.ts +0 -105
  1478. package/popup/lib/popup-trigger/popup-trigger.d.ts +0 -102
  1479. package/popup/lib/popup.service.d.ts +0 -159
  1480. package/popup/malva-ui-core-popup.d.ts +0 -5
  1481. package/progress/index.d.ts +0 -1
  1482. package/progress/lib/progress/progress.d.ts +0 -69
  1483. package/progress/malva-ui-core-progress.d.ts +0 -5
  1484. package/radio/index.d.ts +0 -2
  1485. package/radio/lib/radio/radio.d.ts +0 -87
  1486. package/radio/lib/radio-group/radio-group.d.ts +0 -35
  1487. package/radio/lib/radio-group-token.d.ts +0 -7
  1488. package/radio/malva-ui-core-radio.d.ts +0 -5
  1489. package/rating/index.d.ts +0 -1
  1490. package/rating/lib/rating/rating.d.ts +0 -100
  1491. package/rating/malva-ui-core-rating.d.ts +0 -5
  1492. package/scrollbar/index.d.ts +0 -1
  1493. package/scrollbar/lib/scrollbar/scrollbar.d.ts +0 -166
  1494. package/scrollbar/malva-ui-core-scrollbar.d.ts +0 -5
  1495. package/search-field/index.d.ts +0 -2
  1496. package/search-field/lib/search-field/search-field.d.ts +0 -347
  1497. package/search-field/lib/search-field/search-overlay-content.d.ts +0 -59
  1498. package/search-field/malva-ui-core-search-field.d.ts +0 -5
  1499. package/segmented/index.d.ts +0 -4
  1500. package/segmented/lib/segmented/segmented.d.ts +0 -80
  1501. package/segmented/lib/segmented-item/segmented-item.d.ts +0 -89
  1502. package/segmented/lib/segmented-token.d.ts +0 -22
  1503. package/segmented/lib/segmented.types.d.ts +0 -9
  1504. package/segmented/malva-ui-core-segmented.d.ts +0 -5
  1505. package/select/index.d.ts +0 -3
  1506. package/select/lib/select/select.d.ts +0 -379
  1507. package/select/lib/select-option.d.ts +0 -1
  1508. package/select/lib/select-template.directives.d.ts +0 -14
  1509. package/select/malva-ui-core-select.d.ts +0 -5
  1510. package/sidebar/index.d.ts +0 -15
  1511. package/sidebar/lib/sidebar/sidebar.d.ts +0 -134
  1512. package/sidebar/lib/sidebar-content.d.ts +0 -11
  1513. package/sidebar/lib/sidebar-context.d.ts +0 -23
  1514. package/sidebar/lib/sidebar-footer.d.ts +0 -9
  1515. package/sidebar/lib/sidebar-group/sidebar-group.d.ts +0 -127
  1516. package/sidebar/lib/sidebar-header.d.ts +0 -9
  1517. package/sidebar/lib/sidebar-item/sidebar-item.d.ts +0 -104
  1518. package/sidebar/lib/sidebar-item-host.d.ts +0 -18
  1519. package/sidebar/lib/sidebar-item-icon.d.ts +0 -6
  1520. package/sidebar/lib/sidebar-mode.d.ts +0 -2
  1521. package/sidebar/lib/sidebar-rail/sidebar-rail.d.ts +0 -54
  1522. package/sidebar/lib/sidebar-trigger/sidebar-trigger.d.ts +0 -67
  1523. package/sidebar/lib/sidebar-workspace/sidebar-workspace.d.ts +0 -54
  1524. package/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.d.ts +0 -19
  1525. package/sidebar/lib/sidebar-workspace/sidebar-workspace.types.d.ts +0 -20
  1526. package/sidebar/malva-ui-core-sidebar.d.ts +0 -5
  1527. package/skeleton/index.d.ts +0 -1
  1528. package/skeleton/lib/skeleton/skeleton.d.ts +0 -60
  1529. package/skeleton/malva-ui-core-skeleton.d.ts +0 -5
  1530. package/slider/index.d.ts +0 -2
  1531. package/slider/lib/slider/slider-tooltip-def.d.ts +0 -39
  1532. package/slider/lib/slider/slider.d.ts +0 -171
  1533. package/slider/malva-ui-core-slider.d.ts +0 -5
  1534. package/split-pane/index.d.ts +0 -3
  1535. package/split-pane/lib/split-pane/split-pane-panel.d.ts +0 -34
  1536. package/split-pane/lib/split-pane/split-pane.d.ts +0 -98
  1537. package/split-pane/lib/split-pane/split-pane.types.d.ts +0 -7
  1538. package/split-pane/malva-ui-core-split-pane.d.ts +0 -5
  1539. package/status-indicator/index.d.ts +0 -1
  1540. package/status-indicator/lib/status-indicator/status-indicator.d.ts +0 -61
  1541. package/status-indicator/malva-ui-core-status-indicator.d.ts +0 -5
  1542. package/stepper/index.d.ts +0 -4
  1543. package/stepper/lib/stepper/step-header.d.ts +0 -34
  1544. package/stepper/lib/stepper/step.d.ts +0 -51
  1545. package/stepper/lib/stepper/stepper-token.d.ts +0 -13
  1546. package/stepper/lib/stepper/stepper.d.ts +0 -98
  1547. package/stepper/lib/stepper/stepper.types.d.ts +0 -4
  1548. package/stepper/malva-ui-core-stepper.d.ts +0 -5
  1549. package/switch/index.d.ts +0 -2
  1550. package/switch/lib/switch/switch.d.ts +0 -118
  1551. package/switch/lib/switch-group/switch-group.d.ts +0 -24
  1552. package/switch/lib/switch-group-token.d.ts +0 -6
  1553. package/switch/malva-ui-core-switch.d.ts +0 -5
  1554. package/tabs/index.d.ts +0 -8
  1555. package/tabs/lib/tab/tab.d.ts +0 -46
  1556. package/tabs/lib/tab-content/tab-content.d.ts +0 -11
  1557. package/tabs/lib/tab-content-def.d.ts +0 -6
  1558. package/tabs/lib/tab-def.d.ts +0 -11
  1559. package/tabs/lib/tab-group-token.d.ts +0 -10
  1560. package/tabs/lib/tab-item/tab-item.d.ts +0 -28
  1561. package/tabs/lib/tabs/tabs.d.ts +0 -202
  1562. package/tabs/lib/tabs.service.d.ts +0 -24
  1563. package/tabs/malva-ui-core-tabs.d.ts +0 -5
  1564. package/textarea/index.d.ts +0 -1
  1565. package/textarea/lib/textarea/textarea.d.ts +0 -77
  1566. package/textarea/malva-ui-core-textarea.d.ts +0 -5
  1567. package/tile/index.d.ts +0 -2
  1568. package/tile/lib/tile/tile.d.ts +0 -20
  1569. package/tile/lib/tile-header.d.ts +0 -6
  1570. package/tile/malva-ui-core-tile.d.ts +0 -5
  1571. package/time-picker/index.d.ts +0 -1
  1572. package/time-picker/lib/time-picker/time-picker.d.ts +0 -135
  1573. package/time-picker/lib/time-picker-column/time-picker-column.d.ts +0 -111
  1574. package/time-picker/malva-ui-core-time-picker.d.ts +0 -5
  1575. package/timeline/index.d.ts +0 -5
  1576. package/timeline/lib/timeline/timeline-item-icon.d.ts +0 -24
  1577. package/timeline/lib/timeline/timeline-item-meta.d.ts +0 -24
  1578. package/timeline/lib/timeline/timeline-item.d.ts +0 -52
  1579. package/timeline/lib/timeline/timeline.d.ts +0 -27
  1580. package/timeline/lib/timeline/timeline.types.d.ts +0 -18
  1581. package/timeline/malva-ui-core-timeline.d.ts +0 -5
  1582. package/title/index.d.ts +0 -1
  1583. package/title/lib/title/title.d.ts +0 -63
  1584. package/title/malva-ui-core-title.d.ts +0 -5
  1585. package/toast/index.d.ts +0 -10
  1586. package/toast/lib/abstract-toast-container.d.ts +0 -29
  1587. package/toast/lib/abstract-toast-item.d.ts +0 -44
  1588. package/toast/lib/abstract-toast.service.d.ts +0 -75
  1589. package/toast/lib/toast-container/toast-container.d.ts +0 -23
  1590. package/toast/lib/toast-item/toast-item.d.ts +0 -25
  1591. package/toast/lib/toast-ref.d.ts +0 -33
  1592. package/toast/lib/toast-timer.d.ts +0 -24
  1593. package/toast/lib/toast.directives.d.ts +0 -13
  1594. package/toast/lib/toast.service.d.ts +0 -41
  1595. package/toast/lib/toast.types.d.ts +0 -139
  1596. package/toast/malva-ui-core-toast.d.ts +0 -5
  1597. package/tokenizer/index.d.ts +0 -3
  1598. package/tokenizer/lib/token/token.d.ts +0 -60
  1599. package/tokenizer/lib/token-template.d.ts +0 -29
  1600. package/tokenizer/lib/tokenizer/tokenizer.d.ts +0 -109
  1601. package/tokenizer/malva-ui-core-tokenizer.d.ts +0 -5
  1602. package/toolbar/index.d.ts +0 -3
  1603. package/toolbar/lib/toolbar/toolbar-spacer.d.ts +0 -5
  1604. package/toolbar/lib/toolbar/toolbar-widget.d.ts +0 -75
  1605. package/toolbar/lib/toolbar/toolbar.d.ts +0 -8
  1606. package/toolbar/malva-ui-core-toolbar.d.ts +0 -5
  1607. package/tooltip/index.d.ts +0 -3
  1608. package/tooltip/lib/tooltip/tooltip-panel.d.ts +0 -26
  1609. package/tooltip/lib/tooltip/tooltip.d.ts +0 -148
  1610. package/tooltip/lib/tooltip/tooltip.types.d.ts +0 -17
  1611. package/tooltip/malva-ui-core-tooltip.d.ts +0 -5
  1612. package/tree/index.d.ts +0 -4
  1613. package/tree/lib/tree/tree-context.d.ts +0 -62
  1614. package/tree/lib/tree/tree-node-def.d.ts +0 -33
  1615. package/tree/lib/tree/tree-node.d.ts +0 -45
  1616. package/tree/lib/tree/tree-subtree.d.ts +0 -63
  1617. package/tree/lib/tree/tree.d.ts +0 -156
  1618. 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