@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.
- package/AGENTS.md +4 -1
- package/README.md +15 -0
- package/docs/ai/avatar.md +2 -0
- package/docs/ai/breadcrumb.md +67 -7
- package/docs/ai/button.md +74 -19
- package/docs/ai/card.md +8 -6
- package/docs/ai/chat.md +59 -45
- package/docs/ai/checkbox.md +12 -0
- package/docs/ai/combobox.md +18 -2
- package/docs/ai/copy-to-clipboard.md +1 -1
- package/docs/ai/core.md +15 -0
- package/docs/ai/data-table.md +89 -54
- package/docs/ai/dialog.md +76 -67
- package/docs/ai/drawer.md +15 -12
- package/docs/ai/dropdown.md +24 -19
- package/docs/ai/empty-state.md +3 -3
- package/docs/ai/filter.md +24 -5
- package/docs/ai/form-utils.md +160 -5
- package/docs/ai/icon-toggle.md +160 -0
- package/docs/ai/input.md +30 -0
- package/docs/ai/layout.md +23 -0
- package/docs/ai/list.md +10 -6
- package/docs/ai/menu.md +75 -1
- package/docs/ai/page.md +220 -60
- package/docs/ai/radio.md +9 -0
- package/docs/ai/scrollbar.md +30 -8
- package/docs/ai/segmented.md +35 -35
- package/docs/ai/select.md +30 -5
- package/docs/ai/sidebar.md +45 -27
- package/docs/ai/switch.md +114 -19
- package/docs/ai/table.md +69 -0
- package/docs/ai/tabs.md +2 -1
- package/docs/ai/tile.md +311 -85
- package/docs/ai/timeline.md +63 -39
- package/docs/ai/tokenizer.md +21 -5
- package/docs/ai/tooltip.md +5 -5
- package/docs/ai/view-variant.md +75 -0
- package/fesm2022/malva-ui-core-accordion.mjs +167 -0
- package/fesm2022/malva-ui-core-accordion.mjs.map +1 -0
- package/fesm2022/malva-ui-core-action-bar.mjs +111 -0
- package/fesm2022/malva-ui-core-action-bar.mjs.map +1 -0
- package/fesm2022/malva-ui-core-alert.mjs +173 -0
- package/fesm2022/malva-ui-core-alert.mjs.map +1 -0
- package/fesm2022/malva-ui-core-autocomplete.mjs +775 -0
- package/fesm2022/malva-ui-core-autocomplete.mjs.map +1 -0
- package/fesm2022/malva-ui-core-avatar-group.mjs +224 -0
- package/fesm2022/malva-ui-core-avatar-group.mjs.map +1 -0
- package/fesm2022/malva-ui-core-avatar.mjs +247 -0
- package/fesm2022/malva-ui-core-avatar.mjs.map +1 -0
- package/fesm2022/malva-ui-core-badge.mjs +122 -0
- package/fesm2022/malva-ui-core-badge.mjs.map +1 -0
- package/fesm2022/malva-ui-core-bottom-nav.mjs +161 -0
- package/fesm2022/malva-ui-core-bottom-nav.mjs.map +1 -0
- package/fesm2022/malva-ui-core-breadcrumb.mjs +494 -0
- package/fesm2022/malva-ui-core-breadcrumb.mjs.map +1 -0
- package/fesm2022/malva-ui-core-button.mjs +406 -0
- package/fesm2022/malva-ui-core-button.mjs.map +1 -0
- package/fesm2022/malva-ui-core-calendar.mjs +938 -0
- package/fesm2022/malva-ui-core-calendar.mjs.map +1 -0
- package/fesm2022/malva-ui-core-card.mjs +164 -0
- package/fesm2022/malva-ui-core-card.mjs.map +1 -0
- package/fesm2022/malva-ui-core-chat.mjs +825 -0
- package/fesm2022/malva-ui-core-chat.mjs.map +1 -0
- package/fesm2022/malva-ui-core-checkbox.mjs +272 -0
- package/fesm2022/malva-ui-core-checkbox.mjs.map +1 -0
- package/fesm2022/malva-ui-core-chip.mjs +176 -0
- package/fesm2022/malva-ui-core-chip.mjs.map +1 -0
- package/fesm2022/malva-ui-core-color-picker.mjs +1204 -0
- package/fesm2022/malva-ui-core-color-picker.mjs.map +1 -0
- package/fesm2022/malva-ui-core-combobox.mjs +945 -0
- package/fesm2022/malva-ui-core-combobox.mjs.map +1 -0
- package/fesm2022/malva-ui-core-copy-to-clipboard.mjs +255 -0
- package/fesm2022/malva-ui-core-copy-to-clipboard.mjs.map +1 -0
- package/fesm2022/malva-ui-core-data-table.mjs +2696 -0
- package/fesm2022/malva-ui-core-data-table.mjs.map +1 -0
- package/fesm2022/malva-ui-core-date-range-picker.mjs +276 -0
- package/fesm2022/malva-ui-core-date-range-picker.mjs.map +1 -0
- package/fesm2022/malva-ui-core-day-picker.mjs +131 -0
- package/fesm2022/malva-ui-core-day-picker.mjs.map +1 -0
- package/fesm2022/malva-ui-core-dialog-routable-dialog-CvjXMtlD.mjs +94 -0
- package/fesm2022/malva-ui-core-dialog-routable-dialog-CvjXMtlD.mjs.map +1 -0
- package/fesm2022/malva-ui-core-dialog.mjs +1223 -0
- package/fesm2022/malva-ui-core-dialog.mjs.map +1 -0
- package/fesm2022/malva-ui-core-divider.mjs +80 -0
- package/fesm2022/malva-ui-core-divider.mjs.map +1 -0
- package/fesm2022/malva-ui-core-drawer-routable-drawer-qUk6Etnx.mjs +94 -0
- package/fesm2022/malva-ui-core-drawer-routable-drawer-qUk6Etnx.mjs.map +1 -0
- package/fesm2022/malva-ui-core-drawer.mjs +814 -0
- package/fesm2022/malva-ui-core-drawer.mjs.map +1 -0
- package/fesm2022/malva-ui-core-dropdown.mjs +994 -0
- package/fesm2022/malva-ui-core-dropdown.mjs.map +1 -0
- package/fesm2022/malva-ui-core-empty-state.mjs +50 -0
- package/fesm2022/malva-ui-core-empty-state.mjs.map +1 -0
- package/fesm2022/malva-ui-core-expand.mjs +130 -0
- package/fesm2022/malva-ui-core-expand.mjs.map +1 -0
- package/fesm2022/malva-ui-core-file-upload.mjs +451 -0
- package/fesm2022/malva-ui-core-file-upload.mjs.map +1 -0
- package/fesm2022/malva-ui-core-filter.mjs +1627 -0
- package/fesm2022/malva-ui-core-filter.mjs.map +1 -0
- package/fesm2022/malva-ui-core-form-utils-testing.mjs +39 -0
- package/fesm2022/malva-ui-core-form-utils-testing.mjs.map +1 -0
- package/fesm2022/malva-ui-core-form-utils.mjs +977 -0
- package/fesm2022/malva-ui-core-form-utils.mjs.map +1 -0
- package/fesm2022/malva-ui-core-form.mjs +283 -0
- package/fesm2022/malva-ui-core-form.mjs.map +1 -0
- package/fesm2022/malva-ui-core-icon-toggle.mjs +120 -0
- package/fesm2022/malva-ui-core-icon-toggle.mjs.map +1 -0
- package/fesm2022/malva-ui-core-input.mjs +375 -0
- package/fesm2022/malva-ui-core-input.mjs.map +1 -0
- package/fesm2022/malva-ui-core-kbd.mjs +131 -0
- package/fesm2022/malva-ui-core-kbd.mjs.map +1 -0
- package/fesm2022/malva-ui-core-layout.mjs +212 -0
- package/fesm2022/malva-ui-core-layout.mjs.map +1 -0
- package/fesm2022/malva-ui-core-link.mjs +89 -0
- package/fesm2022/malva-ui-core-link.mjs.map +1 -0
- package/fesm2022/malva-ui-core-list.mjs +413 -0
- package/fesm2022/malva-ui-core-list.mjs.map +1 -0
- package/fesm2022/malva-ui-core-loader.mjs +141 -0
- package/fesm2022/malva-ui-core-loader.mjs.map +1 -0
- package/fesm2022/malva-ui-core-menu.mjs +2540 -0
- package/fesm2022/malva-ui-core-menu.mjs.map +1 -0
- package/fesm2022/malva-ui-core-notification.mjs +201 -0
- package/fesm2022/malva-ui-core-notification.mjs.map +1 -0
- package/fesm2022/malva-ui-core-number-input.mjs +404 -0
- package/fesm2022/malva-ui-core-number-input.mjs.map +1 -0
- package/fesm2022/malva-ui-core-page.mjs +1898 -0
- package/fesm2022/malva-ui-core-page.mjs.map +1 -0
- package/fesm2022/malva-ui-core-pagination.mjs +458 -0
- package/fesm2022/malva-ui-core-pagination.mjs.map +1 -0
- package/fesm2022/malva-ui-core-pin-input.mjs +405 -0
- package/fesm2022/malva-ui-core-pin-input.mjs.map +1 -0
- package/fesm2022/malva-ui-core-popup.mjs +1488 -0
- package/fesm2022/malva-ui-core-popup.mjs.map +1 -0
- package/fesm2022/malva-ui-core-progress.mjs +109 -0
- package/fesm2022/malva-ui-core-progress.mjs.map +1 -0
- package/fesm2022/malva-ui-core-radio.mjs +317 -0
- package/fesm2022/malva-ui-core-radio.mjs.map +1 -0
- package/fesm2022/malva-ui-core-rating.mjs +236 -0
- package/fesm2022/malva-ui-core-rating.mjs.map +1 -0
- package/fesm2022/malva-ui-core-scrollbar.mjs +430 -0
- package/fesm2022/malva-ui-core-scrollbar.mjs.map +1 -0
- package/fesm2022/malva-ui-core-search-field.mjs +578 -0
- package/fesm2022/malva-ui-core-search-field.mjs.map +1 -0
- package/fesm2022/malva-ui-core-segmented.mjs +458 -0
- package/fesm2022/malva-ui-core-segmented.mjs.map +1 -0
- package/fesm2022/malva-ui-core-select.mjs +855 -0
- package/fesm2022/malva-ui-core-select.mjs.map +1 -0
- package/fesm2022/malva-ui-core-sidebar.mjs +1504 -0
- package/fesm2022/malva-ui-core-sidebar.mjs.map +1 -0
- package/fesm2022/malva-ui-core-skeleton.mjs +85 -0
- package/fesm2022/malva-ui-core-skeleton.mjs.map +1 -0
- package/fesm2022/malva-ui-core-slider.mjs +514 -0
- package/fesm2022/malva-ui-core-slider.mjs.map +1 -0
- package/fesm2022/malva-ui-core-split-pane.mjs +359 -0
- package/fesm2022/malva-ui-core-split-pane.mjs.map +1 -0
- package/fesm2022/malva-ui-core-status-indicator.mjs +78 -0
- package/fesm2022/malva-ui-core-status-indicator.mjs.map +1 -0
- package/fesm2022/malva-ui-core-stepper.mjs +332 -0
- package/fesm2022/malva-ui-core-stepper.mjs.map +1 -0
- package/fesm2022/malva-ui-core-switch.mjs +272 -0
- package/fesm2022/malva-ui-core-switch.mjs.map +1 -0
- package/fesm2022/malva-ui-core-table.mjs +79 -0
- package/fesm2022/malva-ui-core-table.mjs.map +1 -0
- package/fesm2022/malva-ui-core-tabs.mjs +794 -0
- package/fesm2022/malva-ui-core-tabs.mjs.map +1 -0
- package/fesm2022/malva-ui-core-textarea.mjs +201 -0
- package/fesm2022/malva-ui-core-textarea.mjs.map +1 -0
- package/fesm2022/malva-ui-core-tile.mjs +1404 -0
- package/fesm2022/malva-ui-core-tile.mjs.map +1 -0
- package/fesm2022/malva-ui-core-time-picker.mjs +533 -0
- package/fesm2022/malva-ui-core-time-picker.mjs.map +1 -0
- package/fesm2022/malva-ui-core-timeline.mjs +216 -0
- package/fesm2022/malva-ui-core-timeline.mjs.map +1 -0
- package/fesm2022/malva-ui-core-title.mjs +178 -0
- package/fesm2022/malva-ui-core-title.mjs.map +1 -0
- package/fesm2022/malva-ui-core-toast.mjs +749 -0
- package/fesm2022/malva-ui-core-toast.mjs.map +1 -0
- package/fesm2022/malva-ui-core-tokenizer.mjs +502 -0
- package/fesm2022/malva-ui-core-tokenizer.mjs.map +1 -0
- package/fesm2022/malva-ui-core-toolbar.mjs +141 -0
- package/fesm2022/malva-ui-core-toolbar.mjs.map +1 -0
- package/fesm2022/malva-ui-core-tooltip.mjs +432 -0
- package/fesm2022/malva-ui-core-tooltip.mjs.map +1 -0
- package/fesm2022/malva-ui-core-tree.mjs +505 -0
- package/fesm2022/malva-ui-core-tree.mjs.map +1 -0
- package/fesm2022/malva-ui-core-view-variant.mjs +292 -0
- package/fesm2022/malva-ui-core-view-variant.mjs.map +1 -0
- package/fesm2022/malva-ui-core.mjs +77 -0
- package/fesm2022/malva-ui-core.mjs.map +1 -0
- package/package.json +179 -156
- package/styles/malva-ui.css +253 -220
- package/styles/tokens.md +174 -173
- package/table/README.md +46 -0
- package/types/malva-ui-core-accordion.d.ts +121 -0
- package/types/malva-ui-core-action-bar.d.ts +82 -0
- package/types/malva-ui-core-alert.d.ts +131 -0
- package/types/malva-ui-core-autocomplete.d.ts +301 -0
- package/types/malva-ui-core-avatar-group.d.ts +119 -0
- package/types/malva-ui-core-avatar.d.ts +156 -0
- package/types/malva-ui-core-badge.d.ts +97 -0
- package/types/malva-ui-core-bottom-nav.d.ts +104 -0
- package/types/malva-ui-core-breadcrumb.d.ts +308 -0
- package/types/malva-ui-core-button.d.ts +194 -0
- package/types/malva-ui-core-calendar.d.ts +339 -0
- package/types/malva-ui-core-card.d.ts +88 -0
- package/types/malva-ui-core-chat.d.ts +375 -0
- package/types/malva-ui-core-checkbox.d.ts +158 -0
- package/types/malva-ui-core-chip.d.ts +128 -0
- package/types/malva-ui-core-color-picker.d.ts +442 -0
- package/types/malva-ui-core-combobox.d.ts +419 -0
- package/types/malva-ui-core-copy-to-clipboard.d.ts +148 -0
- package/types/malva-ui-core-data-table.d.ts +1074 -0
- package/types/malva-ui-core-date-range-picker.d.ts +149 -0
- package/types/malva-ui-core-day-picker.d.ts +55 -0
- package/types/malva-ui-core-dialog.d.ts +597 -0
- package/types/malva-ui-core-divider.d.ts +68 -0
- package/types/malva-ui-core-drawer.d.ts +333 -0
- package/types/malva-ui-core-dropdown.d.ts +592 -0
- package/types/malva-ui-core-empty-state.d.ts +37 -0
- package/types/malva-ui-core-expand.d.ts +102 -0
- package/types/malva-ui-core-file-upload.d.ts +267 -0
- package/types/malva-ui-core-filter.d.ts +552 -0
- package/types/malva-ui-core-form-utils-testing.d.ts +50 -0
- package/types/malva-ui-core-form-utils.d.ts +579 -0
- package/types/malva-ui-core-form.d.ts +176 -0
- package/types/malva-ui-core-icon-toggle.d.ts +80 -0
- package/types/malva-ui-core-input.d.ts +262 -0
- package/types/malva-ui-core-kbd.d.ts +56 -0
- package/types/malva-ui-core-layout.d.ts +70 -0
- package/types/malva-ui-core-link.d.ts +28 -0
- package/types/malva-ui-core-list.d.ts +252 -0
- package/types/malva-ui-core-loader.d.ts +89 -0
- package/types/malva-ui-core-menu.d.ts +954 -0
- package/types/malva-ui-core-notification.d.ts +122 -0
- package/types/malva-ui-core-number-input.d.ts +167 -0
- package/types/malva-ui-core-page.d.ts +799 -0
- package/types/malva-ui-core-pagination.d.ts +261 -0
- package/types/malva-ui-core-pin-input.d.ts +203 -0
- package/types/malva-ui-core-popup.d.ts +834 -0
- package/types/malva-ui-core-progress.d.ts +73 -0
- package/types/malva-ui-core-radio.d.ts +130 -0
- package/types/malva-ui-core-rating.d.ts +115 -0
- package/types/malva-ui-core-scrollbar.d.ts +203 -0
- package/types/malva-ui-core-search-field.d.ts +408 -0
- package/types/malva-ui-core-segmented.d.ts +206 -0
- package/types/malva-ui-core-select.d.ts +456 -0
- package/types/malva-ui-core-sidebar.d.ts +698 -0
- package/types/malva-ui-core-skeleton.d.ts +64 -0
- package/types/malva-ui-core-slider.d.ts +219 -0
- package/types/malva-ui-core-split-pane.d.ts +149 -0
- package/types/malva-ui-core-status-indicator.d.ts +65 -0
- package/types/malva-ui-core-stepper.d.ts +168 -0
- package/types/malva-ui-core-switch.d.ts +146 -0
- package/types/malva-ui-core-table.d.ts +37 -0
- package/types/malva-ui-core-tabs.d.ts +339 -0
- package/types/malva-ui-core-textarea.d.ts +79 -0
- package/types/malva-ui-core-tile.d.ts +373 -0
- package/types/malva-ui-core-time-picker.d.ts +141 -0
- package/types/malva-ui-core-timeline.d.ts +188 -0
- package/types/malva-ui-core-title.d.ts +66 -0
- package/types/malva-ui-core-toast.d.ts +432 -0
- package/types/malva-ui-core-tokenizer.d.ts +217 -0
- package/types/malva-ui-core-toolbar.d.ts +91 -0
- package/types/malva-ui-core-tooltip.d.ts +200 -0
- package/types/malva-ui-core-tree.d.ts +289 -0
- package/types/malva-ui-core-view-variant.d.ts +207 -0
- package/types/malva-ui-core.d.ts +72 -0
- package/view-variant/README.md +3 -0
- package/accordion/index.d.ts +0 -3
- package/accordion/lib/accordion/accordion.d.ts +0 -47
- package/accordion/lib/accordion-item/accordion-header.d.ts +0 -22
- package/accordion/lib/accordion-item/accordion-item.d.ts +0 -49
- package/accordion/malva-ui-core-accordion.d.ts +0 -5
- package/action-bar/index.d.ts +0 -4
- package/action-bar/lib/action-bar/action-bar.d.ts +0 -59
- package/action-bar/lib/action-bar/components/action-bar-actions.d.ts +0 -9
- package/action-bar/lib/action-bar/components/action-bar-logo.d.ts +0 -5
- package/action-bar/lib/action-bar/components/action-bar-spacer.d.ts +0 -5
- package/action-bar/malva-ui-core-action-bar.d.ts +0 -5
- package/alert/index.d.ts +0 -2
- package/alert/lib/alert/alert.d.ts +0 -84
- package/alert/lib/alert/alert.directives.d.ts +0 -44
- package/alert/malva-ui-core-alert.d.ts +0 -5
- package/autocomplete/index.d.ts +0 -1
- package/autocomplete/lib/autocomplete/autocomplete.d.ts +0 -296
- package/autocomplete/malva-ui-core-autocomplete.d.ts +0 -5
- package/avatar/index.d.ts +0 -2
- package/avatar/lib/avatar/avatar.d.ts +0 -125
- package/avatar/lib/color-from-text.pipe.d.ts +0 -21
- package/avatar/malva-ui-core-avatar.d.ts +0 -5
- package/avatar-group/index.d.ts +0 -1
- package/avatar-group/lib/avatar-group/avatar-group.d.ts +0 -115
- package/avatar-group/malva-ui-core-avatar-group.d.ts +0 -5
- package/badge/index.d.ts +0 -2
- package/badge/lib/badge/badge.d.ts +0 -59
- package/badge/lib/badge-icon.d.ts +0 -35
- package/badge/malva-ui-core-badge.d.ts +0 -5
- package/bottom-nav/index.d.ts +0 -1
- package/bottom-nav/lib/bottom-nav/bottom-nav.d.ts +0 -99
- package/bottom-nav/malva-ui-core-bottom-nav.d.ts +0 -5
- package/breadcrumb/index.d.ts +0 -5
- package/breadcrumb/lib/breadcrumb/breadcrumb-item-host.d.ts +0 -32
- package/breadcrumb/lib/breadcrumb/breadcrumb-item.d.ts +0 -41
- package/breadcrumb/lib/breadcrumb/breadcrumb-separator.d.ts +0 -31
- package/breadcrumb/lib/breadcrumb/breadcrumb.d.ts +0 -151
- package/breadcrumb/lib/breadcrumb/breadcrumb.types.d.ts +0 -26
- package/breadcrumb/malva-ui-core-breadcrumb.d.ts +0 -5
- package/button/index.d.ts +0 -7
- package/button/lib/button/button.d.ts +0 -61
- package/button/lib/button-close/button-close.d.ts +0 -24
- package/button/lib/button-group/button-group.d.ts +0 -21
- package/button/lib/button-split/button-split.d.ts +0 -21
- package/button/lib/button-toggle/button-toggle.d.ts +0 -33
- package/button/lib/button-variant.token.d.ts +0 -13
- package/button/lib/button.directives.d.ts +0 -14
- package/button/lib/button.types.d.ts +0 -8
- package/button/malva-ui-core-button.d.ts +0 -5
- package/calendar/index.d.ts +0 -3
- package/calendar/lib/calendar/calendar.d.ts +0 -182
- package/calendar/lib/date-provider/date-adapter.d.ts +0 -92
- package/calendar/lib/date-provider/native-date-adapter.d.ts +0 -60
- package/calendar/malva-ui-core-calendar.d.ts +0 -5
- package/card/index.d.ts +0 -5
- package/card/lib/card/card.d.ts +0 -43
- package/card/lib/card-actions-def.d.ts +0 -10
- package/card/lib/card-footer-def.d.ts +0 -13
- package/card/lib/card-header-def.d.ts +0 -10
- package/card/lib/card-subheader-def.d.ts +0 -16
- package/card/malva-ui-core-card.d.ts +0 -5
- package/chat/index.d.ts +0 -9
- package/chat/lib/chat/chat.d.ts +0 -133
- package/chat/lib/chat-audio/chat-audio.d.ts +0 -51
- package/chat/lib/chat-audio/chat-audio.service.d.ts +0 -21
- package/chat/lib/chat-date/chat-date.d.ts +0 -16
- package/chat/lib/chat-format.d.ts +0 -5
- package/chat/lib/chat-media-grid/chat-media-grid.d.ts +0 -32
- package/chat/lib/chat-message/chat-message.d.ts +0 -45
- package/chat/lib/chat-render-list.d.ts +0 -16
- package/chat/lib/chat-tokens.d.ts +0 -25
- package/chat/lib/chat-typing/chat-typing.d.ts +0 -16
- package/chat/lib/chat.types.d.ts +0 -80
- package/chat/lib/defs/chat-author-def.d.ts +0 -30
- package/chat/lib/defs/chat-date-def.d.ts +0 -22
- package/chat/lib/defs/chat-message-def.d.ts +0 -23
- package/chat/malva-ui-core-chat.d.ts +0 -5
- package/checkbox/index.d.ts +0 -3
- package/checkbox/lib/checkbox/checkbox.d.ts +0 -129
- package/checkbox/lib/checkbox-group/checkbox-group.d.ts +0 -24
- package/checkbox/lib/checkbox-group-token.d.ts +0 -6
- package/checkbox/malva-ui-core-checkbox.d.ts +0 -5
- package/chip/index.d.ts +0 -2
- package/chip/lib/chip/chip.d.ts +0 -107
- package/chip/lib/chip/chip.directives.d.ts +0 -18
- package/chip/malva-ui-core-chip.d.ts +0 -5
- package/color-picker/index.d.ts +0 -3
- package/color-picker/lib/color-picker/color-picker.d.ts +0 -188
- package/color-picker/lib/color-picker-popup/color-picker-popup.d.ts +0 -151
- package/color-picker/lib/color-utils/color-utils.d.ts +0 -102
- package/color-picker/malva-ui-core-color-picker.d.ts +0 -5
- package/combobox/index.d.ts +0 -2
- package/combobox/lib/combobox/combobox.d.ts +0 -400
- package/combobox/lib/combobox-template.directives.d.ts +0 -10
- package/combobox/malva-ui-core-combobox.d.ts +0 -5
- package/copy-to-clipboard/index.d.ts +0 -1
- package/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.d.ts +0 -130
- package/copy-to-clipboard/malva-ui-core-copy-to-clipboard.d.ts +0 -5
- package/data-table/index.d.ts +0 -8
- package/data-table/lib/data-source.d.ts +0 -5
- package/data-table/lib/data-table/data-table-layout.d.ts +0 -31
- package/data-table/lib/data-table/data-table.d.ts +0 -699
- package/data-table/lib/data-table/services/data-table-column-visibility.service.d.ts +0 -19
- package/data-table/lib/data-table/services/data-table-editing.service.d.ts +0 -37
- package/data-table/lib/data-table/services/data-table-pinning.service.d.ts +0 -37
- package/data-table/lib/data-table-cell.d.ts +0 -44
- package/data-table/lib/data-table-edit-cell.d.ts +0 -44
- package/data-table/lib/data-table-error.d.ts +0 -37
- package/data-table/lib/data-table-footer.d.ts +0 -26
- package/data-table/lib/data-table-no-data.d.ts +0 -19
- package/data-table/lib/filter-dropdown/filter-dropdown.d.ts +0 -54
- package/data-table/lib/types.d.ts +0 -134
- package/data-table/malva-ui-core-data-table.d.ts +0 -5
- package/date-range-picker/index.d.ts +0 -1
- package/date-range-picker/lib/date-range-picker/date-range-picker.d.ts +0 -145
- package/date-range-picker/malva-ui-core-date-range-picker.d.ts +0 -5
- package/day-picker/index.d.ts +0 -1
- package/day-picker/lib/day-picker/day-picker.d.ts +0 -51
- package/day-picker/malva-ui-core-day-picker.d.ts +0 -5
- package/dialog/index.d.ts +0 -11
- package/dialog/lib/confirm-dialog-options.d.ts +0 -41
- package/dialog/lib/confirm-dialog.d.ts +0 -52
- package/dialog/lib/dialog/dialog.d.ts +0 -22
- package/dialog/lib/dialog-body.d.ts +0 -9
- package/dialog/lib/dialog-close.d.ts +0 -27
- package/dialog/lib/dialog-config.d.ts +0 -112
- package/dialog/lib/dialog-container.d.ts +0 -40
- package/dialog/lib/dialog-footer.d.ts +0 -13
- package/dialog/lib/dialog-header.d.ts +0 -74
- package/dialog/lib/dialog-ref.d.ts +0 -95
- package/dialog/lib/dialog-template.d.ts +0 -65
- package/dialog/lib/dialog-text-content.d.ts +0 -24
- package/dialog/lib/dialog.service.d.ts +0 -63
- package/dialog/lib/generate-routable-dialog-route.d.ts +0 -49
- package/dialog/lib/inject-dialog-ref.d.ts +0 -8
- package/dialog/lib/routable-dialog.d.ts +0 -30
- package/dialog/malva-ui-core-dialog.d.ts +0 -5
- package/divider/index.d.ts +0 -1
- package/divider/lib/divider/divider.d.ts +0 -64
- package/divider/malva-ui-core-divider.d.ts +0 -5
- package/drawer/index.d.ts +0 -11
- package/drawer/lib/drawer/drawer.d.ts +0 -106
- package/drawer/lib/drawer-body.d.ts +0 -8
- package/drawer/lib/drawer-content.d.ts +0 -6
- package/drawer/lib/drawer-footer.d.ts +0 -5
- package/drawer/lib/drawer-header.d.ts +0 -5
- package/drawer/lib/drawer-ref.d.ts +0 -29
- package/drawer/lib/drawer-resize.d.ts +0 -65
- package/drawer/lib/drawer-section/drawer-section.d.ts +0 -15
- package/drawer/lib/drawer-sections/drawer-sections.d.ts +0 -22
- package/drawer/lib/drawer-sections.service.d.ts +0 -42
- package/drawer/lib/drawer.service.d.ts +0 -66
- package/drawer/lib/generate-routable-drawer-route.d.ts +0 -42
- package/drawer/lib/routable-drawer.d.ts +0 -30
- package/drawer/malva-ui-core-drawer.d.ts +0 -5
- package/dropdown/index.d.ts +0 -9
- package/dropdown/lib/active-descendant.d.ts +0 -64
- package/dropdown/lib/dropdown-panel/dropdown-panel.d.ts +0 -178
- package/dropdown/lib/highlight-match.pipe.d.ts +0 -27
- package/dropdown/lib/option-matcher.d.ts +0 -87
- package/dropdown/lib/options-adapter.d.ts +0 -142
- package/dropdown/lib/options-result.d.ts +0 -6
- package/dropdown/lib/reconciliation.d.ts +0 -19
- package/dropdown/lib/select-data-source.d.ts +0 -18
- package/dropdown/lib/select-option.d.ts +0 -37
- package/dropdown/malva-ui-core-dropdown.d.ts +0 -5
- package/empty-state/index.d.ts +0 -1
- package/empty-state/lib/empty-state/empty-state.d.ts +0 -34
- package/empty-state/malva-ui-core-empty-state.d.ts +0 -5
- package/esm2022/accordion/index.js +0 -4
- package/esm2022/accordion/index.js.map +0 -1
- package/esm2022/accordion/lib/accordion/accordion.js +0 -65
- package/esm2022/accordion/lib/accordion/accordion.js.map +0 -1
- package/esm2022/accordion/lib/accordion-item/accordion-header.js +0 -30
- package/esm2022/accordion/lib/accordion-item/accordion-header.js.map +0 -1
- package/esm2022/accordion/lib/accordion-item/accordion-item.js +0 -70
- package/esm2022/accordion/lib/accordion-item/accordion-item.js.map +0 -1
- package/esm2022/accordion/malva-ui-core-accordion.js +0 -5
- package/esm2022/accordion/malva-ui-core-accordion.js.map +0 -1
- package/esm2022/action-bar/index.js +0 -5
- package/esm2022/action-bar/index.js.map +0 -1
- package/esm2022/action-bar/lib/action-bar/action-bar.js +0 -64
- package/esm2022/action-bar/lib/action-bar/action-bar.js.map +0 -1
- package/esm2022/action-bar/lib/action-bar/components/action-bar-actions.js +0 -20
- package/esm2022/action-bar/lib/action-bar/components/action-bar-actions.js.map +0 -1
- package/esm2022/action-bar/lib/action-bar/components/action-bar-logo.js +0 -13
- package/esm2022/action-bar/lib/action-bar/components/action-bar-logo.js.map +0 -1
- package/esm2022/action-bar/lib/action-bar/components/action-bar-spacer.js +0 -13
- package/esm2022/action-bar/lib/action-bar/components/action-bar-spacer.js.map +0 -1
- package/esm2022/action-bar/malva-ui-core-action-bar.js +0 -5
- package/esm2022/action-bar/malva-ui-core-action-bar.js.map +0 -1
- package/esm2022/alert/index.js +0 -3
- package/esm2022/alert/index.js.map +0 -1
- package/esm2022/alert/lib/alert/alert.directives.js +0 -53
- package/esm2022/alert/lib/alert/alert.directives.js.map +0 -1
- package/esm2022/alert/lib/alert/alert.js +0 -118
- package/esm2022/alert/lib/alert/alert.js.map +0 -1
- package/esm2022/alert/malva-ui-core-alert.js +0 -5
- package/esm2022/alert/malva-ui-core-alert.js.map +0 -1
- package/esm2022/autocomplete/index.js +0 -2
- package/esm2022/autocomplete/index.js.map +0 -1
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.js +0 -765
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.js.map +0 -1
- package/esm2022/autocomplete/malva-ui-core-autocomplete.js +0 -5
- package/esm2022/autocomplete/malva-ui-core-autocomplete.js.map +0 -1
- package/esm2022/avatar/index.js +0 -3
- package/esm2022/avatar/index.js.map +0 -1
- package/esm2022/avatar/lib/avatar/avatar.js +0 -192
- package/esm2022/avatar/lib/avatar/avatar.js.map +0 -1
- package/esm2022/avatar/lib/color-from-text.pipe.js +0 -39
- package/esm2022/avatar/lib/color-from-text.pipe.js.map +0 -1
- package/esm2022/avatar/malva-ui-core-avatar.js +0 -5
- package/esm2022/avatar/malva-ui-core-avatar.js.map +0 -1
- package/esm2022/avatar-group/index.js +0 -2
- package/esm2022/avatar-group/index.js.map +0 -1
- package/esm2022/avatar-group/lib/avatar-group/avatar-group.js +0 -217
- package/esm2022/avatar-group/lib/avatar-group/avatar-group.js.map +0 -1
- package/esm2022/avatar-group/malva-ui-core-avatar-group.js +0 -5
- package/esm2022/avatar-group/malva-ui-core-avatar-group.js.map +0 -1
- package/esm2022/badge/index.js +0 -3
- package/esm2022/badge/index.js.map +0 -1
- package/esm2022/badge/lib/badge/badge.js +0 -71
- package/esm2022/badge/lib/badge/badge.js.map +0 -1
- package/esm2022/badge/lib/badge-icon.js +0 -47
- package/esm2022/badge/lib/badge-icon.js.map +0 -1
- package/esm2022/badge/malva-ui-core-badge.js +0 -5
- package/esm2022/badge/malva-ui-core-badge.js.map +0 -1
- package/esm2022/bottom-nav/index.js +0 -2
- package/esm2022/bottom-nav/index.js.map +0 -1
- package/esm2022/bottom-nav/lib/bottom-nav/bottom-nav.js +0 -155
- package/esm2022/bottom-nav/lib/bottom-nav/bottom-nav.js.map +0 -1
- package/esm2022/bottom-nav/malva-ui-core-bottom-nav.js +0 -5
- package/esm2022/bottom-nav/malva-ui-core-bottom-nav.js.map +0 -1
- package/esm2022/breadcrumb/index.js +0 -6
- package/esm2022/breadcrumb/index.js.map +0 -1
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item-host.js +0 -43
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item-host.js.map +0 -1
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item.js +0 -110
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-item.js.map +0 -1
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-separator.js +0 -38
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb-separator.js.map +0 -1
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.js +0 -284
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.js.map +0 -1
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.types.js +0 -1
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.types.js.map +0 -1
- package/esm2022/breadcrumb/malva-ui-core-breadcrumb.js +0 -5
- package/esm2022/breadcrumb/malva-ui-core-breadcrumb.js.map +0 -1
- package/esm2022/button/index.js +0 -8
- package/esm2022/button/index.js.map +0 -1
- package/esm2022/button/lib/button/button.js +0 -137
- package/esm2022/button/lib/button/button.js.map +0 -1
- package/esm2022/button/lib/button-close/button-close.js +0 -52
- package/esm2022/button/lib/button-close/button-close.js.map +0 -1
- package/esm2022/button/lib/button-group/button-group.js +0 -44
- package/esm2022/button/lib/button-group/button-group.js.map +0 -1
- package/esm2022/button/lib/button-split/button-split.js +0 -44
- package/esm2022/button/lib/button-split/button-split.js.map +0 -1
- package/esm2022/button/lib/button-toggle/button-toggle.js +0 -94
- package/esm2022/button/lib/button-toggle/button-toggle.js.map +0 -1
- package/esm2022/button/lib/button-variant.token.js +0 -4
- package/esm2022/button/lib/button-variant.token.js.map +0 -1
- package/esm2022/button/lib/button.directives.js +0 -37
- package/esm2022/button/lib/button.directives.js.map +0 -1
- package/esm2022/button/lib/button.types.js +0 -1
- package/esm2022/button/lib/button.types.js.map +0 -1
- package/esm2022/button/malva-ui-core-button.js +0 -5
- package/esm2022/button/malva-ui-core-button.js.map +0 -1
- package/esm2022/calendar/index.js +0 -4
- package/esm2022/calendar/index.js.map +0 -1
- package/esm2022/calendar/lib/calendar/calendar.js +0 -672
- package/esm2022/calendar/lib/calendar/calendar.js.map +0 -1
- package/esm2022/calendar/lib/date-provider/date-adapter.js +0 -111
- package/esm2022/calendar/lib/date-provider/date-adapter.js.map +0 -1
- package/esm2022/calendar/lib/date-provider/native-date-adapter.js +0 -151
- package/esm2022/calendar/lib/date-provider/native-date-adapter.js.map +0 -1
- package/esm2022/calendar/malva-ui-core-calendar.js +0 -5
- package/esm2022/calendar/malva-ui-core-calendar.js.map +0 -1
- package/esm2022/card/index.js +0 -6
- package/esm2022/card/index.js.map +0 -1
- package/esm2022/card/lib/card/card.js +0 -54
- package/esm2022/card/lib/card/card.js.map +0 -1
- package/esm2022/card/lib/card-actions-def.js +0 -27
- package/esm2022/card/lib/card-actions-def.js.map +0 -1
- package/esm2022/card/lib/card-footer-def.js +0 -32
- package/esm2022/card/lib/card-footer-def.js.map +0 -1
- package/esm2022/card/lib/card-header-def.js +0 -27
- package/esm2022/card/lib/card-header-def.js.map +0 -1
- package/esm2022/card/lib/card-subheader-def.js +0 -33
- package/esm2022/card/lib/card-subheader-def.js.map +0 -1
- package/esm2022/card/malva-ui-core-card.js +0 -5
- package/esm2022/card/malva-ui-core-card.js.map +0 -1
- package/esm2022/chat/index.js +0 -10
- package/esm2022/chat/index.js.map +0 -1
- package/esm2022/chat/lib/chat/chat.js +0 -326
- package/esm2022/chat/lib/chat/chat.js.map +0 -1
- package/esm2022/chat/lib/chat-audio/chat-audio.js +0 -110
- package/esm2022/chat/lib/chat-audio/chat-audio.js.map +0 -1
- package/esm2022/chat/lib/chat-audio/chat-audio.service.js +0 -28
- package/esm2022/chat/lib/chat-audio/chat-audio.service.js.map +0 -1
- package/esm2022/chat/lib/chat-date/chat-date.js +0 -46
- package/esm2022/chat/lib/chat-date/chat-date.js.map +0 -1
- package/esm2022/chat/lib/chat-format.js +0 -11
- package/esm2022/chat/lib/chat-format.js.map +0 -1
- package/esm2022/chat/lib/chat-media-grid/chat-media-grid.js +0 -53
- package/esm2022/chat/lib/chat-media-grid/chat-media-grid.js.map +0 -1
- package/esm2022/chat/lib/chat-message/chat-message.js +0 -86
- package/esm2022/chat/lib/chat-message/chat-message.js.map +0 -1
- package/esm2022/chat/lib/chat-render-list.js +0 -55
- package/esm2022/chat/lib/chat-render-list.js.map +0 -1
- package/esm2022/chat/lib/chat-tokens.js +0 -9
- package/esm2022/chat/lib/chat-tokens.js.map +0 -1
- package/esm2022/chat/lib/chat-typing/chat-typing.js +0 -50
- package/esm2022/chat/lib/chat-typing/chat-typing.js.map +0 -1
- package/esm2022/chat/lib/chat.types.js +0 -1
- package/esm2022/chat/lib/chat.types.js.map +0 -1
- package/esm2022/chat/lib/defs/chat-author-def.js +0 -27
- package/esm2022/chat/lib/defs/chat-author-def.js.map +0 -1
- package/esm2022/chat/lib/defs/chat-date-def.js +0 -24
- package/esm2022/chat/lib/defs/chat-date-def.js.map +0 -1
- package/esm2022/chat/lib/defs/chat-message-def.js +0 -30
- package/esm2022/chat/lib/defs/chat-message-def.js.map +0 -1
- package/esm2022/chat/malva-ui-core-chat.js +0 -5
- package/esm2022/chat/malva-ui-core-chat.js.map +0 -1
- package/esm2022/checkbox/index.js +0 -4
- package/esm2022/checkbox/index.js.map +0 -1
- package/esm2022/checkbox/lib/checkbox/checkbox.js +0 -201
- package/esm2022/checkbox/lib/checkbox/checkbox.js.map +0 -1
- package/esm2022/checkbox/lib/checkbox-group/checkbox-group.js +0 -68
- package/esm2022/checkbox/lib/checkbox-group/checkbox-group.js.map +0 -1
- package/esm2022/checkbox/lib/checkbox-group-token.js +0 -3
- package/esm2022/checkbox/lib/checkbox-group-token.js.map +0 -1
- package/esm2022/checkbox/malva-ui-core-checkbox.js +0 -5
- package/esm2022/checkbox/malva-ui-core-checkbox.js.map +0 -1
- package/esm2022/chip/index.js +0 -3
- package/esm2022/chip/index.js.map +0 -1
- package/esm2022/chip/lib/chip/chip.directives.js +0 -32
- package/esm2022/chip/lib/chip/chip.directives.js.map +0 -1
- package/esm2022/chip/lib/chip/chip.js +0 -140
- package/esm2022/chip/lib/chip/chip.js.map +0 -1
- package/esm2022/chip/malva-ui-core-chip.js +0 -5
- package/esm2022/chip/malva-ui-core-chip.js.map +0 -1
- package/esm2022/color-picker/index.js +0 -4
- package/esm2022/color-picker/index.js.map +0 -1
- package/esm2022/color-picker/lib/color-picker/color-picker.js +0 -530
- package/esm2022/color-picker/lib/color-picker/color-picker.js.map +0 -1
- package/esm2022/color-picker/lib/color-picker-popup/color-picker-popup.js +0 -419
- package/esm2022/color-picker/lib/color-picker-popup/color-picker-popup.js.map +0 -1
- package/esm2022/color-picker/lib/color-utils/color-utils.js +0 -256
- package/esm2022/color-picker/lib/color-utils/color-utils.js.map +0 -1
- package/esm2022/color-picker/malva-ui-core-color-picker.js +0 -5
- package/esm2022/color-picker/malva-ui-core-color-picker.js.map +0 -1
- package/esm2022/combobox/index.js +0 -3
- package/esm2022/combobox/index.js.map +0 -1
- package/esm2022/combobox/lib/combobox/combobox.js +0 -911
- package/esm2022/combobox/lib/combobox/combobox.js.map +0 -1
- package/esm2022/combobox/lib/combobox-template.directives.js +0 -24
- package/esm2022/combobox/lib/combobox-template.directives.js.map +0 -1
- package/esm2022/combobox/malva-ui-core-combobox.js +0 -5
- package/esm2022/combobox/malva-ui-core-combobox.js.map +0 -1
- package/esm2022/copy-to-clipboard/index.js +0 -2
- package/esm2022/copy-to-clipboard/index.js.map +0 -1
- package/esm2022/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.js +0 -201
- package/esm2022/copy-to-clipboard/lib/copy-to-clipboard/copy-to-clipboard.js.map +0 -1
- package/esm2022/copy-to-clipboard/malva-ui-core-copy-to-clipboard.js +0 -5
- package/esm2022/copy-to-clipboard/malva-ui-core-copy-to-clipboard.js.map +0 -1
- package/esm2022/data-table/index.js +0 -9
- package/esm2022/data-table/index.js.map +0 -1
- package/esm2022/data-table/lib/data-source.js +0 -6
- package/esm2022/data-table/lib/data-source.js.map +0 -1
- package/esm2022/data-table/lib/data-table/data-table-layout.js +0 -84
- package/esm2022/data-table/lib/data-table/data-table-layout.js.map +0 -1
- package/esm2022/data-table/lib/data-table/data-table.js +0 -1846
- package/esm2022/data-table/lib/data-table/data-table.js.map +0 -1
- package/esm2022/data-table/lib/data-table/services/data-table-column-visibility.service.js +0 -37
- package/esm2022/data-table/lib/data-table/services/data-table-column-visibility.service.js.map +0 -1
- package/esm2022/data-table/lib/data-table/services/data-table-editing.service.js +0 -63
- package/esm2022/data-table/lib/data-table/services/data-table-editing.service.js.map +0 -1
- package/esm2022/data-table/lib/data-table/services/data-table-pinning.service.js +0 -68
- package/esm2022/data-table/lib/data-table/services/data-table-pinning.service.js.map +0 -1
- package/esm2022/data-table/lib/data-table-cell.js +0 -46
- package/esm2022/data-table/lib/data-table-cell.js.map +0 -1
- package/esm2022/data-table/lib/data-table-edit-cell.js +0 -46
- package/esm2022/data-table/lib/data-table-edit-cell.js.map +0 -1
- package/esm2022/data-table/lib/data-table-error.js +0 -37
- package/esm2022/data-table/lib/data-table-error.js.map +0 -1
- package/esm2022/data-table/lib/data-table-footer.js +0 -33
- package/esm2022/data-table/lib/data-table-footer.js.map +0 -1
- package/esm2022/data-table/lib/data-table-no-data.js +0 -26
- package/esm2022/data-table/lib/data-table-no-data.js.map +0 -1
- package/esm2022/data-table/lib/filter-dropdown/filter-dropdown.js +0 -224
- package/esm2022/data-table/lib/filter-dropdown/filter-dropdown.js.map +0 -1
- package/esm2022/data-table/lib/types.js +0 -1
- package/esm2022/data-table/lib/types.js.map +0 -1
- package/esm2022/data-table/malva-ui-core-data-table.js +0 -5
- package/esm2022/data-table/malva-ui-core-data-table.js.map +0 -1
- package/esm2022/date-range-picker/index.js +0 -2
- package/esm2022/date-range-picker/index.js.map +0 -1
- package/esm2022/date-range-picker/lib/date-range-picker/date-range-picker.js +0 -269
- package/esm2022/date-range-picker/lib/date-range-picker/date-range-picker.js.map +0 -1
- package/esm2022/date-range-picker/malva-ui-core-date-range-picker.js +0 -5
- package/esm2022/date-range-picker/malva-ui-core-date-range-picker.js.map +0 -1
- package/esm2022/day-picker/index.js +0 -2
- package/esm2022/day-picker/index.js.map +0 -1
- package/esm2022/day-picker/lib/day-picker/day-picker.js +0 -124
- package/esm2022/day-picker/lib/day-picker/day-picker.js.map +0 -1
- package/esm2022/day-picker/malva-ui-core-day-picker.js +0 -5
- package/esm2022/day-picker/malva-ui-core-day-picker.js.map +0 -1
- package/esm2022/dialog/index.js +0 -12
- package/esm2022/dialog/index.js.map +0 -1
- package/esm2022/dialog/lib/confirm-dialog-options.js +0 -1
- package/esm2022/dialog/lib/confirm-dialog-options.js.map +0 -1
- package/esm2022/dialog/lib/confirm-dialog.js +0 -155
- package/esm2022/dialog/lib/confirm-dialog.js.map +0 -1
- package/esm2022/dialog/lib/dialog/dialog.js +0 -40
- package/esm2022/dialog/lib/dialog/dialog.js.map +0 -1
- package/esm2022/dialog/lib/dialog-body.js +0 -33
- package/esm2022/dialog/lib/dialog-body.js.map +0 -1
- package/esm2022/dialog/lib/dialog-close.js +0 -45
- package/esm2022/dialog/lib/dialog-close.js.map +0 -1
- package/esm2022/dialog/lib/dialog-config.js +0 -23
- package/esm2022/dialog/lib/dialog-config.js.map +0 -1
- package/esm2022/dialog/lib/dialog-container.js +0 -69
- package/esm2022/dialog/lib/dialog-container.js.map +0 -1
- package/esm2022/dialog/lib/dialog-footer.js +0 -29
- package/esm2022/dialog/lib/dialog-footer.js.map +0 -1
- package/esm2022/dialog/lib/dialog-header.js +0 -181
- package/esm2022/dialog/lib/dialog-header.js.map +0 -1
- package/esm2022/dialog/lib/dialog-ref.js +0 -167
- package/esm2022/dialog/lib/dialog-ref.js.map +0 -1
- package/esm2022/dialog/lib/dialog-template.js +0 -136
- package/esm2022/dialog/lib/dialog-template.js.map +0 -1
- package/esm2022/dialog/lib/dialog-text-content.js +0 -59
- package/esm2022/dialog/lib/dialog-text-content.js.map +0 -1
- package/esm2022/dialog/lib/dialog.service.js +0 -205
- package/esm2022/dialog/lib/dialog.service.js.map +0 -1
- package/esm2022/dialog/lib/generate-routable-dialog-route.js +0 -59
- package/esm2022/dialog/lib/generate-routable-dialog-route.js.map +0 -1
- package/esm2022/dialog/lib/inject-dialog-ref.js +0 -16
- package/esm2022/dialog/lib/inject-dialog-ref.js.map +0 -1
- package/esm2022/dialog/lib/routable-dialog.js +0 -91
- package/esm2022/dialog/lib/routable-dialog.js.map +0 -1
- package/esm2022/dialog/malva-ui-core-dialog.js +0 -5
- package/esm2022/dialog/malva-ui-core-dialog.js.map +0 -1
- package/esm2022/divider/index.js +0 -2
- package/esm2022/divider/index.js.map +0 -1
- package/esm2022/divider/lib/divider/divider.js +0 -73
- package/esm2022/divider/lib/divider/divider.js.map +0 -1
- package/esm2022/divider/malva-ui-core-divider.js +0 -5
- package/esm2022/divider/malva-ui-core-divider.js.map +0 -1
- package/esm2022/drawer/index.js +0 -12
- package/esm2022/drawer/index.js.map +0 -1
- package/esm2022/drawer/lib/drawer/drawer.js +0 -180
- package/esm2022/drawer/lib/drawer/drawer.js.map +0 -1
- package/esm2022/drawer/lib/drawer-body.js +0 -32
- package/esm2022/drawer/lib/drawer-body.js.map +0 -1
- package/esm2022/drawer/lib/drawer-content.js +0 -14
- package/esm2022/drawer/lib/drawer-content.js.map +0 -1
- package/esm2022/drawer/lib/drawer-footer.js +0 -14
- package/esm2022/drawer/lib/drawer-footer.js.map +0 -1
- package/esm2022/drawer/lib/drawer-header.js +0 -14
- package/esm2022/drawer/lib/drawer-header.js.map +0 -1
- package/esm2022/drawer/lib/drawer-ref.js +0 -31
- package/esm2022/drawer/lib/drawer-ref.js.map +0 -1
- package/esm2022/drawer/lib/drawer-resize.js +0 -243
- package/esm2022/drawer/lib/drawer-resize.js.map +0 -1
- package/esm2022/drawer/lib/drawer-section/drawer-section.js +0 -26
- package/esm2022/drawer/lib/drawer-section/drawer-section.js.map +0 -1
- package/esm2022/drawer/lib/drawer-sections/drawer-sections.js +0 -58
- package/esm2022/drawer/lib/drawer-sections/drawer-sections.js.map +0 -1
- package/esm2022/drawer/lib/drawer-sections.service.js +0 -83
- package/esm2022/drawer/lib/drawer-sections.service.js.map +0 -1
- package/esm2022/drawer/lib/drawer.service.js +0 -86
- package/esm2022/drawer/lib/drawer.service.js.map +0 -1
- package/esm2022/drawer/lib/generate-routable-drawer-route.js +0 -52
- package/esm2022/drawer/lib/generate-routable-drawer-route.js.map +0 -1
- package/esm2022/drawer/lib/routable-drawer.js +0 -91
- package/esm2022/drawer/lib/routable-drawer.js.map +0 -1
- package/esm2022/drawer/malva-ui-core-drawer.js +0 -5
- package/esm2022/drawer/malva-ui-core-drawer.js.map +0 -1
- package/esm2022/dropdown/index.js +0 -10
- package/esm2022/dropdown/index.js.map +0 -1
- package/esm2022/dropdown/lib/active-descendant.js +0 -92
- package/esm2022/dropdown/lib/active-descendant.js.map +0 -1
- package/esm2022/dropdown/lib/dropdown-panel/dropdown-panel.js +0 -295
- package/esm2022/dropdown/lib/dropdown-panel/dropdown-panel.js.map +0 -1
- package/esm2022/dropdown/lib/highlight-match.pipe.js +0 -36
- package/esm2022/dropdown/lib/highlight-match.pipe.js.map +0 -1
- package/esm2022/dropdown/lib/option-matcher.js +0 -124
- package/esm2022/dropdown/lib/option-matcher.js.map +0 -1
- package/esm2022/dropdown/lib/options-adapter.js +0 -356
- package/esm2022/dropdown/lib/options-adapter.js.map +0 -1
- package/esm2022/dropdown/lib/options-result.js +0 -11
- package/esm2022/dropdown/lib/options-result.js.map +0 -1
- package/esm2022/dropdown/lib/reconciliation.js +0 -32
- package/esm2022/dropdown/lib/reconciliation.js.map +0 -1
- package/esm2022/dropdown/lib/select-data-source.js +0 -21
- package/esm2022/dropdown/lib/select-data-source.js.map +0 -1
- package/esm2022/dropdown/lib/select-option.js +0 -25
- package/esm2022/dropdown/lib/select-option.js.map +0 -1
- package/esm2022/dropdown/malva-ui-core-dropdown.js +0 -5
- package/esm2022/dropdown/malva-ui-core-dropdown.js.map +0 -1
- package/esm2022/empty-state/index.js +0 -2
- package/esm2022/empty-state/index.js.map +0 -1
- package/esm2022/empty-state/lib/empty-state/empty-state.js +0 -43
- package/esm2022/empty-state/lib/empty-state/empty-state.js.map +0 -1
- package/esm2022/empty-state/malva-ui-core-empty-state.js +0 -5
- package/esm2022/empty-state/malva-ui-core-empty-state.js.map +0 -1
- package/esm2022/expand/index.js +0 -3
- package/esm2022/expand/index.js.map +0 -1
- package/esm2022/expand/lib/expand/expand-content.js +0 -33
- package/esm2022/expand/lib/expand/expand-content.js.map +0 -1
- package/esm2022/expand/lib/expand/expand.js +0 -93
- package/esm2022/expand/lib/expand/expand.js.map +0 -1
- package/esm2022/expand/malva-ui-core-expand.js +0 -5
- package/esm2022/expand/malva-ui-core-expand.js.map +0 -1
- package/esm2022/file-upload/index.js +0 -5
- package/esm2022/file-upload/index.js.map +0 -1
- package/esm2022/file-upload/lib/file-upload/file-upload.js +0 -324
- package/esm2022/file-upload/lib/file-upload/file-upload.js.map +0 -1
- package/esm2022/file-upload/lib/file-upload/file-upload.types.js +0 -1
- package/esm2022/file-upload/lib/file-upload/file-upload.types.js.map +0 -1
- package/esm2022/file-upload/lib/file-upload-action.js +0 -65
- package/esm2022/file-upload/lib/file-upload-action.js.map +0 -1
- package/esm2022/file-upload/lib/file-upload-item/file-upload-item.js +0 -55
- package/esm2022/file-upload/lib/file-upload-item/file-upload-item.js.map +0 -1
- package/esm2022/file-upload/malva-ui-core-file-upload.js +0 -5
- package/esm2022/file-upload/malva-ui-core-file-upload.js.map +0 -1
- package/esm2022/filter/index.js +0 -4
- package/esm2022/filter/index.js.map +0 -1
- package/esm2022/filter/lib/filter/filter.js +0 -552
- package/esm2022/filter/lib/filter/filter.js.map +0 -1
- package/esm2022/filter/lib/filter.types.js +0 -1
- package/esm2022/filter/lib/filter.types.js.map +0 -1
- package/esm2022/filter/lib/smart-filter-bar/smart-filter-bar.js +0 -518
- package/esm2022/filter/lib/smart-filter-bar/smart-filter-bar.js.map +0 -1
- package/esm2022/filter/malva-ui-core-filter.js +0 -5
- package/esm2022/filter/malva-ui-core-filter.js.map +0 -1
- package/esm2022/form/index.js +0 -7
- package/esm2022/form/index.js.map +0 -1
- package/esm2022/form/lib/fieldset/fieldset.js +0 -101
- package/esm2022/form/lib/fieldset/fieldset.js.map +0 -1
- package/esm2022/form/lib/fieldset-span.js +0 -49
- package/esm2022/form/lib/fieldset-span.js.map +0 -1
- package/esm2022/form/lib/form/form.js +0 -60
- package/esm2022/form/lib/form/form.js.map +0 -1
- package/esm2022/form/lib/form-actions.js +0 -34
- package/esm2022/form/lib/form-actions.js.map +0 -1
- package/esm2022/form/lib/form-gap.js +0 -15
- package/esm2022/form/lib/form-gap.js.map +0 -1
- package/esm2022/form/lib/form-header.js +0 -27
- package/esm2022/form/lib/form-header.js.map +0 -1
- package/esm2022/form/lib/form.types.js +0 -1
- package/esm2022/form/lib/form.types.js.map +0 -1
- package/esm2022/form/malva-ui-core-form.js +0 -5
- package/esm2022/form/malva-ui-core-form.js.map +0 -1
- package/esm2022/form-utils/index.js +0 -16
- package/esm2022/form-utils/index.js.map +0 -1
- package/esm2022/form-utils/lib/aria-value-bridge.js +0 -57
- package/esm2022/form-utils/lib/aria-value-bridge.js.map +0 -1
- package/esm2022/form-utils/lib/description/description.js +0 -24
- package/esm2022/form-utils/lib/description/description.js.map +0 -1
- package/esm2022/form-utils/lib/focusable-group-base.js +0 -87
- package/esm2022/form-utils/lib/focusable-group-base.js.map +0 -1
- package/esm2022/form-utils/lib/form-control-base/signal-form-control-base.js +0 -192
- package/esm2022/form-utils/lib/form-control-base/signal-form-control-base.js.map +0 -1
- package/esm2022/form-utils/lib/form-control-sides.js +0 -34
- package/esm2022/form-utils/lib/form-control-sides.js.map +0 -1
- package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper-control.js +0 -14
- package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper-control.js.map +0 -1
- package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper.js +0 -47
- package/esm2022/form-utils/lib/form-control-wrapper/form-control-wrapper.js.map +0 -1
- package/esm2022/form-utils/lib/form-field/form-field.js +0 -245
- package/esm2022/form-utils/lib/form-field/form-field.js.map +0 -1
- package/esm2022/form-utils/lib/hint/hint.js +0 -11
- package/esm2022/form-utils/lib/hint/hint.js.map +0 -1
- package/esm2022/form-utils/lib/label/label.js +0 -55
- package/esm2022/form-utils/lib/label/label.js.map +0 -1
- package/esm2022/form-utils/lib/message/message.js +0 -20
- package/esm2022/form-utils/lib/message/message.js.map +0 -1
- package/esm2022/form-utils/lib/models/error-display-strategy.js +0 -1
- package/esm2022/form-utils/lib/models/error-display-strategy.js.map +0 -1
- package/esm2022/form-utils/lib/models/form-control-connector.js +0 -3
- package/esm2022/form-utils/lib/models/form-control-connector.js.map +0 -1
- package/esm2022/form-utils/lib/models/form-state.js +0 -1
- package/esm2022/form-utils/lib/models/form-state.js.map +0 -1
- package/esm2022/form-utils/lib/selection.service.js +0 -81
- package/esm2022/form-utils/lib/selection.service.js.map +0 -1
- package/esm2022/form-utils/malva-ui-core-form-utils.js +0 -5
- package/esm2022/form-utils/malva-ui-core-form-utils.js.map +0 -1
- package/esm2022/form-utils/testing/index.js +0 -2
- package/esm2022/form-utils/testing/index.js.map +0 -1
- package/esm2022/form-utils/testing/lib/forms-binding-matrix.js +0 -32
- package/esm2022/form-utils/testing/lib/forms-binding-matrix.js.map +0 -1
- package/esm2022/form-utils/testing/malva-ui-core-form-utils-testing.js +0 -5
- package/esm2022/form-utils/testing/malva-ui-core-form-utils-testing.js.map +0 -1
- package/esm2022/index.js +0 -70
- package/esm2022/index.js.map +0 -1
- package/esm2022/input/index.js +0 -4
- package/esm2022/input/index.js.map +0 -1
- package/esm2022/input/lib/input/input-native.js +0 -49
- package/esm2022/input/lib/input/input-native.js.map +0 -1
- package/esm2022/input/lib/input/input-value-accessor.js +0 -4
- package/esm2022/input/lib/input/input-value-accessor.js.map +0 -1
- package/esm2022/input/lib/input/input.js +0 -277
- package/esm2022/input/lib/input/input.js.map +0 -1
- package/esm2022/input/lib/input/password-strength.js +0 -46
- package/esm2022/input/lib/input/password-strength.js.map +0 -1
- package/esm2022/input/malva-ui-core-input.js +0 -5
- package/esm2022/input/malva-ui-core-input.js.map +0 -1
- package/esm2022/kbd/index.js +0 -2
- package/esm2022/kbd/index.js.map +0 -1
- package/esm2022/kbd/lib/kbd/kbd.js +0 -124
- package/esm2022/kbd/lib/kbd/kbd.js.map +0 -1
- package/esm2022/kbd/malva-ui-core-kbd.js +0 -5
- package/esm2022/kbd/malva-ui-core-kbd.js.map +0 -1
- package/esm2022/layout/index.js +0 -5
- package/esm2022/layout/index.js.map +0 -1
- package/esm2022/layout/lib/layout/directives/MlvLayoutSide.js +0 -14
- package/esm2022/layout/lib/layout/directives/MlvLayoutSide.js.map +0 -1
- package/esm2022/layout/lib/layout/directives/MlvLayoutTop.js +0 -14
- package/esm2022/layout/lib/layout/directives/MlvLayoutTop.js.map +0 -1
- package/esm2022/layout/lib/layout/layout.js +0 -43
- package/esm2022/layout/lib/layout/layout.js.map +0 -1
- package/esm2022/layout/lib/layout/services/theme.service.js +0 -121
- package/esm2022/layout/lib/layout/services/theme.service.js.map +0 -1
- package/esm2022/layout/malva-ui-core-layout.js +0 -5
- package/esm2022/layout/malva-ui-core-layout.js.map +0 -1
- package/esm2022/link/index.js +0 -3
- package/esm2022/link/index.js.map +0 -1
- package/esm2022/link/lib/link/link.directives.js +0 -24
- package/esm2022/link/lib/link/link.directives.js.map +0 -1
- package/esm2022/link/lib/link/link.js +0 -61
- package/esm2022/link/lib/link/link.js.map +0 -1
- package/esm2022/link/malva-ui-core-link.js +0 -5
- package/esm2022/link/malva-ui-core-link.js.map +0 -1
- package/esm2022/list/index.js +0 -14
- package/esm2022/list/index.js.map +0 -1
- package/esm2022/list/lib/list/list.js +0 -28
- package/esm2022/list/lib/list/list.js.map +0 -1
- package/esm2022/list/lib/list-item/list-item.js +0 -125
- package/esm2022/list/lib/list-item/list-item.js.map +0 -1
- package/esm2022/list/lib/list-item-actions.js +0 -23
- package/esm2022/list/lib/list-item-actions.js.map +0 -1
- package/esm2022/list/lib/list-item-byline.js +0 -13
- package/esm2022/list/lib/list-item-byline.js.map +0 -1
- package/esm2022/list/lib/list-item-group/list-item-group.js +0 -25
- package/esm2022/list/lib/list-item-group/list-item-group.js.map +0 -1
- package/esm2022/list/lib/list-item-link/list-item-link.js +0 -20
- package/esm2022/list/lib/list-item-link/list-item-link.js.map +0 -1
- package/esm2022/list/lib/list-item-media.js +0 -13
- package/esm2022/list/lib/list-item-media.js.map +0 -1
- package/esm2022/list/lib/list-item-meta.js +0 -13
- package/esm2022/list/lib/list-item-meta.js.map +0 -1
- package/esm2022/list/lib/list-item-prefix.js +0 -13
- package/esm2022/list/lib/list-item-prefix.js.map +0 -1
- package/esm2022/list/lib/list-item-suffix.js +0 -13
- package/esm2022/list/lib/list-item-suffix.js.map +0 -1
- package/esm2022/list/lib/list-item-template.js +0 -14
- package/esm2022/list/lib/list-item-template.js.map +0 -1
- package/esm2022/list/lib/list-item-title.js +0 -13
- package/esm2022/list/lib/list-item-title.js.map +0 -1
- package/esm2022/list/lib/list-selectable.js +0 -116
- package/esm2022/list/lib/list-selectable.js.map +0 -1
- package/esm2022/list/malva-ui-core-list.js +0 -5
- package/esm2022/list/malva-ui-core-list.js.map +0 -1
- package/esm2022/loader/index.js +0 -2
- package/esm2022/loader/index.js.map +0 -1
- package/esm2022/loader/lib/loader/loader.js +0 -134
- package/esm2022/loader/lib/loader/loader.js.map +0 -1
- package/esm2022/loader/malva-ui-core-loader.js +0 -5
- package/esm2022/loader/malva-ui-core-loader.js.map +0 -1
- package/esm2022/malva-ui-core.js +0 -5
- package/esm2022/malva-ui-core.js.map +0 -1
- package/esm2022/menu/index.js +0 -10
- package/esm2022/menu/index.js.map +0 -1
- package/esm2022/menu/lib/menu/menu-group-label.js +0 -35
- package/esm2022/menu/lib/menu/menu-group-label.js.map +0 -1
- package/esm2022/menu/lib/menu/menu-group.js +0 -44
- package/esm2022/menu/lib/menu/menu-group.js.map +0 -1
- package/esm2022/menu/lib/menu/menu-item.js +0 -117
- package/esm2022/menu/lib/menu/menu-item.js.map +0 -1
- package/esm2022/menu/lib/menu/menu-separator.js +0 -41
- package/esm2022/menu/lib/menu/menu-separator.js.map +0 -1
- package/esm2022/menu/lib/menu/menu-trigger.js +0 -653
- package/esm2022/menu/lib/menu/menu-trigger.js.map +0 -1
- package/esm2022/menu/lib/menu/menu.js +0 -308
- package/esm2022/menu/lib/menu/menu.js.map +0 -1
- package/esm2022/menu/lib/menu/menu.types.js +0 -4
- package/esm2022/menu/lib/menu/menu.types.js.map +0 -1
- package/esm2022/menu/lib/menu/menubar.js +0 -257
- package/esm2022/menu/lib/menu/menubar.js.map +0 -1
- package/esm2022/menu/lib/menu/menubar.types.js +0 -4
- package/esm2022/menu/lib/menu/menubar.types.js.map +0 -1
- package/esm2022/menu/lib/menu/submenu-aim.js +0 -30
- package/esm2022/menu/lib/menu/submenu-aim.js.map +0 -1
- package/esm2022/menu/malva-ui-core-menu.js +0 -5
- package/esm2022/menu/malva-ui-core-menu.js.map +0 -1
- package/esm2022/notification/index.js +0 -5
- package/esm2022/notification/index.js.map +0 -1
- package/esm2022/notification/lib/notification-item/notification-item.js +0 -65
- package/esm2022/notification/lib/notification-item/notification-item.js.map +0 -1
- package/esm2022/notification/lib/notification-ref.js +0 -13
- package/esm2022/notification/lib/notification-ref.js.map +0 -1
- package/esm2022/notification/lib/notification.service.js +0 -118
- package/esm2022/notification/lib/notification.service.js.map +0 -1
- package/esm2022/notification/lib/notification.types.js +0 -6
- package/esm2022/notification/lib/notification.types.js.map +0 -1
- package/esm2022/notification/malva-ui-core-notification.js +0 -5
- package/esm2022/notification/malva-ui-core-notification.js.map +0 -1
- package/esm2022/number-input/index.js +0 -2
- package/esm2022/number-input/index.js.map +0 -1
- package/esm2022/number-input/lib/number-input/number-input.js +0 -395
- package/esm2022/number-input/lib/number-input/number-input.js.map +0 -1
- package/esm2022/number-input/malva-ui-core-number-input.js +0 -5
- package/esm2022/number-input/malva-ui-core-number-input.js.map +0 -1
- package/esm2022/page/index.js +0 -15
- package/esm2022/page/index.js.map +0 -1
- package/esm2022/page/lib/page/page-scroll.token.js +0 -9
- package/esm2022/page/lib/page/page-scroll.token.js.map +0 -1
- package/esm2022/page/lib/page/page-snap-controller.js +0 -170
- package/esm2022/page/lib/page/page-snap-controller.js.map +0 -1
- package/esm2022/page/lib/page/page-snap.directive.js +0 -65
- package/esm2022/page/lib/page/page-snap.directive.js.map +0 -1
- package/esm2022/page/lib/page/page.js +0 -173
- package/esm2022/page/lib/page/page.js.map +0 -1
- package/esm2022/page/lib/page-content/page-aside.js +0 -13
- package/esm2022/page/lib/page-content/page-aside.js.map +0 -1
- package/esm2022/page/lib/page-content/page-content.js +0 -72
- package/esm2022/page/lib/page-content/page-content.js.map +0 -1
- package/esm2022/page/lib/page-dock/page-dock.js +0 -128
- package/esm2022/page/lib/page-dock/page-dock.js.map +0 -1
- package/esm2022/page/lib/page-dock/page-dock.slots.js +0 -39
- package/esm2022/page/lib/page-dock/page-dock.slots.js.map +0 -1
- package/esm2022/page/lib/page-header/page-header.directives.js +0 -88
- package/esm2022/page/lib/page-header/page-header.directives.js.map +0 -1
- package/esm2022/page/lib/page-header/page-header.js +0 -124
- package/esm2022/page/lib/page-header/page-header.js.map +0 -1
- package/esm2022/page/lib/page-shell/page-shell-color.js +0 -193
- package/esm2022/page/lib/page-shell/page-shell-color.js.map +0 -1
- package/esm2022/page/lib/page-shell/page-shell-css-color.js +0 -207
- package/esm2022/page/lib/page-shell/page-shell-css-color.js.map +0 -1
- package/esm2022/page/lib/page-shell/page-shell.js +0 -131
- package/esm2022/page/lib/page-shell/page-shell.js.map +0 -1
- package/esm2022/page/lib/page-shell/page-shell.slots.js +0 -41
- package/esm2022/page/lib/page-shell/page-shell.slots.js.map +0 -1
- package/esm2022/page/lib/page-summary/page-summary-item.js +0 -26
- package/esm2022/page/lib/page-summary/page-summary-item.js.map +0 -1
- package/esm2022/page/lib/page-summary/page-summary.js +0 -87
- package/esm2022/page/lib/page-summary/page-summary.js.map +0 -1
- package/esm2022/page/malva-ui-core-page.js +0 -5
- package/esm2022/page/malva-ui-core-page.js.map +0 -1
- package/esm2022/pagination/index.js +0 -5
- package/esm2022/pagination/index.js.map +0 -1
- package/esm2022/pagination/lib/pagination/pagination.directives.js +0 -58
- package/esm2022/pagination/lib/pagination/pagination.directives.js.map +0 -1
- package/esm2022/pagination/lib/pagination/pagination.js +0 -293
- package/esm2022/pagination/lib/pagination/pagination.js.map +0 -1
- package/esm2022/pagination/lib/pagination/pagination.model.js +0 -1
- package/esm2022/pagination/lib/pagination/pagination.model.js.map +0 -1
- package/esm2022/pagination/lib/pagination/pagination.service.js +0 -108
- package/esm2022/pagination/lib/pagination/pagination.service.js.map +0 -1
- package/esm2022/pagination/malva-ui-core-pagination.js +0 -5
- package/esm2022/pagination/malva-ui-core-pagination.js.map +0 -1
- package/esm2022/pin-input/index.js +0 -3
- package/esm2022/pin-input/index.js.map +0 -1
- package/esm2022/pin-input/lib/pin-input/pin-input-separator.js +0 -31
- package/esm2022/pin-input/lib/pin-input/pin-input-separator.js.map +0 -1
- package/esm2022/pin-input/lib/pin-input/pin-input.js +0 -365
- package/esm2022/pin-input/lib/pin-input/pin-input.js.map +0 -1
- package/esm2022/pin-input/malva-ui-core-pin-input.js +0 -5
- package/esm2022/pin-input/malva-ui-core-pin-input.js.map +0 -1
- package/esm2022/popup/index.js +0 -10
- package/esm2022/popup/index.js.map +0 -1
- package/esm2022/popup/lib/popup/popup.js +0 -500
- package/esm2022/popup/lib/popup/popup.js.map +0 -1
- package/esm2022/popup/lib/popup-container/popup-container.js +0 -169
- package/esm2022/popup/lib/popup-container/popup-container.js.map +0 -1
- package/esm2022/popup/lib/popup-container/popup-container.token.js +0 -9
- package/esm2022/popup/lib/popup-container/popup-container.token.js.map +0 -1
- package/esm2022/popup/lib/popup-content.js +0 -14
- package/esm2022/popup/lib/popup-content.js.map +0 -1
- package/esm2022/popup/lib/popup-header-content.js +0 -26
- package/esm2022/popup/lib/popup-header-content.js.map +0 -1
- package/esm2022/popup/lib/popup-pinned-content.js +0 -25
- package/esm2022/popup/lib/popup-pinned-content.js.map +0 -1
- package/esm2022/popup/lib/popup-positions.js +0 -252
- package/esm2022/popup/lib/popup-positions.js.map +0 -1
- package/esm2022/popup/lib/popup-trigger/popup-trigger.js +0 -308
- package/esm2022/popup/lib/popup-trigger/popup-trigger.js.map +0 -1
- package/esm2022/popup/lib/popup.service.js +0 -188
- package/esm2022/popup/lib/popup.service.js.map +0 -1
- package/esm2022/popup/malva-ui-core-popup.js +0 -5
- package/esm2022/popup/malva-ui-core-popup.js.map +0 -1
- package/esm2022/progress/index.js +0 -2
- package/esm2022/progress/index.js.map +0 -1
- package/esm2022/progress/lib/progress/progress.js +0 -102
- package/esm2022/progress/lib/progress/progress.js.map +0 -1
- package/esm2022/progress/malva-ui-core-progress.js +0 -5
- package/esm2022/progress/malva-ui-core-progress.js.map +0 -1
- package/esm2022/radio/index.js +0 -3
- package/esm2022/radio/index.js.map +0 -1
- package/esm2022/radio/lib/radio/radio.js +0 -134
- package/esm2022/radio/lib/radio/radio.js.map +0 -1
- package/esm2022/radio/lib/radio-group/radio-group.js +0 -176
- package/esm2022/radio/lib/radio-group/radio-group.js.map +0 -1
- package/esm2022/radio/lib/radio-group-token.js +0 -3
- package/esm2022/radio/lib/radio-group-token.js.map +0 -1
- package/esm2022/radio/malva-ui-core-radio.js +0 -5
- package/esm2022/radio/malva-ui-core-radio.js.map +0 -1
- package/esm2022/rating/index.js +0 -2
- package/esm2022/rating/index.js.map +0 -1
- package/esm2022/rating/lib/rating/rating.js +0 -208
- package/esm2022/rating/lib/rating/rating.js.map +0 -1
- package/esm2022/rating/malva-ui-core-rating.js +0 -5
- package/esm2022/rating/malva-ui-core-rating.js.map +0 -1
- package/esm2022/scrollbar/index.js +0 -2
- package/esm2022/scrollbar/index.js.map +0 -1
- package/esm2022/scrollbar/lib/scrollbar/scrollbar.js +0 -388
- package/esm2022/scrollbar/lib/scrollbar/scrollbar.js.map +0 -1
- package/esm2022/scrollbar/malva-ui-core-scrollbar.js +0 -5
- package/esm2022/scrollbar/malva-ui-core-scrollbar.js.map +0 -1
- package/esm2022/search-field/index.js +0 -3
- package/esm2022/search-field/index.js.map +0 -1
- package/esm2022/search-field/lib/search-field/search-field.js +0 -535
- package/esm2022/search-field/lib/search-field/search-field.js.map +0 -1
- package/esm2022/search-field/lib/search-field/search-overlay-content.js +0 -35
- package/esm2022/search-field/lib/search-field/search-overlay-content.js.map +0 -1
- package/esm2022/search-field/malva-ui-core-search-field.js +0 -5
- package/esm2022/search-field/malva-ui-core-search-field.js.map +0 -1
- package/esm2022/segmented/index.js +0 -5
- package/esm2022/segmented/index.js.map +0 -1
- package/esm2022/segmented/lib/segmented/segmented.js +0 -248
- package/esm2022/segmented/lib/segmented/segmented.js.map +0 -1
- package/esm2022/segmented/lib/segmented-item/segmented-item.js +0 -194
- package/esm2022/segmented/lib/segmented-item/segmented-item.js.map +0 -1
- package/esm2022/segmented/lib/segmented-token.js +0 -4
- package/esm2022/segmented/lib/segmented-token.js.map +0 -1
- package/esm2022/segmented/lib/segmented.types.js +0 -1
- package/esm2022/segmented/lib/segmented.types.js.map +0 -1
- package/esm2022/segmented/malva-ui-core-segmented.js +0 -5
- package/esm2022/segmented/malva-ui-core-segmented.js.map +0 -1
- package/esm2022/select/index.js +0 -4
- package/esm2022/select/index.js.map +0 -1
- package/esm2022/select/lib/select/select.js +0 -685
- package/esm2022/select/lib/select/select.js.map +0 -1
- package/esm2022/select/lib/select-option.js +0 -2
- package/esm2022/select/lib/select-option.js.map +0 -1
- package/esm2022/select/lib/select-template.directives.js +0 -34
- package/esm2022/select/lib/select-template.directives.js.map +0 -1
- package/esm2022/select/malva-ui-core-select.js +0 -5
- package/esm2022/select/malva-ui-core-select.js.map +0 -1
- package/esm2022/sidebar/index.js +0 -16
- package/esm2022/sidebar/index.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar/sidebar.js +0 -251
- package/esm2022/sidebar/lib/sidebar/sidebar.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-content.js +0 -37
- package/esm2022/sidebar/lib/sidebar-content.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-context.js +0 -3
- package/esm2022/sidebar/lib/sidebar-context.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-footer.js +0 -20
- package/esm2022/sidebar/lib/sidebar-footer.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-group/sidebar-group.js +0 -341
- package/esm2022/sidebar/lib/sidebar-group/sidebar-group.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-header.js +0 -20
- package/esm2022/sidebar/lib/sidebar-header.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-item/sidebar-item.js +0 -216
- package/esm2022/sidebar/lib/sidebar-item/sidebar-item.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-item-host.js +0 -39
- package/esm2022/sidebar/lib/sidebar-item-host.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-item-icon.js +0 -14
- package/esm2022/sidebar/lib/sidebar-item-icon.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-mode.js +0 -1
- package/esm2022/sidebar/lib/sidebar-mode.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-rail/sidebar-rail.js +0 -202
- package/esm2022/sidebar/lib/sidebar-rail/sidebar-rail.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-trigger/sidebar-trigger.js +0 -159
- package/esm2022/sidebar/lib/sidebar-trigger/sidebar-trigger.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.js +0 -35
- package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.js +0 -107
- package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.js.map +0 -1
- package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.types.js +0 -1
- package/esm2022/sidebar/lib/sidebar-workspace/sidebar-workspace.types.js.map +0 -1
- package/esm2022/sidebar/malva-ui-core-sidebar.js +0 -5
- package/esm2022/sidebar/malva-ui-core-sidebar.js.map +0 -1
- package/esm2022/skeleton/index.js +0 -2
- package/esm2022/skeleton/index.js.map +0 -1
- package/esm2022/skeleton/lib/skeleton/skeleton.js +0 -78
- package/esm2022/skeleton/lib/skeleton/skeleton.js.map +0 -1
- package/esm2022/skeleton/malva-ui-core-skeleton.js +0 -5
- package/esm2022/skeleton/malva-ui-core-skeleton.js.map +0 -1
- package/esm2022/slider/index.js +0 -3
- package/esm2022/slider/index.js.map +0 -1
- package/esm2022/slider/lib/slider/slider-tooltip-def.js +0 -31
- package/esm2022/slider/lib/slider/slider-tooltip-def.js.map +0 -1
- package/esm2022/slider/lib/slider/slider.js +0 -468
- package/esm2022/slider/lib/slider/slider.js.map +0 -1
- package/esm2022/slider/malva-ui-core-slider.js +0 -5
- package/esm2022/slider/malva-ui-core-slider.js.map +0 -1
- package/esm2022/split-pane/index.js +0 -4
- package/esm2022/split-pane/index.js.map +0 -1
- package/esm2022/split-pane/lib/split-pane/split-pane-panel.js +0 -49
- package/esm2022/split-pane/lib/split-pane/split-pane-panel.js.map +0 -1
- package/esm2022/split-pane/lib/split-pane/split-pane.js +0 -290
- package/esm2022/split-pane/lib/split-pane/split-pane.js.map +0 -1
- package/esm2022/split-pane/lib/split-pane/split-pane.types.js +0 -1
- package/esm2022/split-pane/lib/split-pane/split-pane.types.js.map +0 -1
- package/esm2022/split-pane/malva-ui-core-split-pane.js +0 -5
- package/esm2022/split-pane/malva-ui-core-split-pane.js.map +0 -1
- package/esm2022/status-indicator/index.js +0 -2
- package/esm2022/status-indicator/index.js.map +0 -1
- package/esm2022/status-indicator/lib/status-indicator/status-indicator.js +0 -71
- package/esm2022/status-indicator/lib/status-indicator/status-indicator.js.map +0 -1
- package/esm2022/status-indicator/malva-ui-core-status-indicator.js +0 -5
- package/esm2022/status-indicator/malva-ui-core-status-indicator.js.map +0 -1
- package/esm2022/stepper/index.js +0 -5
- package/esm2022/stepper/index.js.map +0 -1
- package/esm2022/stepper/lib/stepper/step-header.js +0 -46
- package/esm2022/stepper/lib/stepper/step-header.js.map +0 -1
- package/esm2022/stepper/lib/stepper/step.js +0 -65
- package/esm2022/stepper/lib/stepper/step.js.map +0 -1
- package/esm2022/stepper/lib/stepper/stepper-token.js +0 -4
- package/esm2022/stepper/lib/stepper/stepper-token.js.map +0 -1
- package/esm2022/stepper/lib/stepper/stepper.js +0 -216
- package/esm2022/stepper/lib/stepper/stepper.js.map +0 -1
- package/esm2022/stepper/lib/stepper/stepper.types.js +0 -1
- package/esm2022/stepper/lib/stepper/stepper.types.js.map +0 -1
- package/esm2022/stepper/malva-ui-core-stepper.js +0 -5
- package/esm2022/stepper/malva-ui-core-stepper.js.map +0 -1
- package/esm2022/switch/index.js +0 -3
- package/esm2022/switch/index.js.map +0 -1
- package/esm2022/switch/lib/switch/switch.js +0 -190
- package/esm2022/switch/lib/switch/switch.js.map +0 -1
- package/esm2022/switch/lib/switch-group/switch-group.js +0 -68
- package/esm2022/switch/lib/switch-group/switch-group.js.map +0 -1
- package/esm2022/switch/lib/switch-group-token.js +0 -3
- package/esm2022/switch/lib/switch-group-token.js.map +0 -1
- package/esm2022/switch/malva-ui-core-switch.js +0 -5
- package/esm2022/switch/malva-ui-core-switch.js.map +0 -1
- package/esm2022/tabs/index.js +0 -9
- package/esm2022/tabs/index.js.map +0 -1
- package/esm2022/tabs/lib/tab/tab.js +0 -72
- package/esm2022/tabs/lib/tab/tab.js.map +0 -1
- package/esm2022/tabs/lib/tab-content/tab-content.js +0 -19
- package/esm2022/tabs/lib/tab-content/tab-content.js.map +0 -1
- package/esm2022/tabs/lib/tab-content-def.js +0 -14
- package/esm2022/tabs/lib/tab-content-def.js.map +0 -1
- package/esm2022/tabs/lib/tab-def.js +0 -17
- package/esm2022/tabs/lib/tab-def.js.map +0 -1
- package/esm2022/tabs/lib/tab-group-token.js +0 -3
- package/esm2022/tabs/lib/tab-group-token.js.map +0 -1
- package/esm2022/tabs/lib/tab-item/tab-item.js +0 -44
- package/esm2022/tabs/lib/tab-item/tab-item.js.map +0 -1
- package/esm2022/tabs/lib/tabs/tabs.js +0 -542
- package/esm2022/tabs/lib/tabs/tabs.js.map +0 -1
- package/esm2022/tabs/lib/tabs.service.js +0 -83
- package/esm2022/tabs/lib/tabs.service.js.map +0 -1
- package/esm2022/tabs/malva-ui-core-tabs.js +0 -5
- package/esm2022/tabs/malva-ui-core-tabs.js.map +0 -1
- package/esm2022/textarea/index.js +0 -2
- package/esm2022/textarea/index.js.map +0 -1
- package/esm2022/textarea/lib/textarea/textarea.js +0 -194
- package/esm2022/textarea/lib/textarea/textarea.js.map +0 -1
- package/esm2022/textarea/malva-ui-core-textarea.js +0 -5
- package/esm2022/textarea/malva-ui-core-textarea.js.map +0 -1
- package/esm2022/tile/index.js +0 -3
- package/esm2022/tile/index.js.map +0 -1
- package/esm2022/tile/lib/tile/tile.js +0 -39
- package/esm2022/tile/lib/tile/tile.js.map +0 -1
- package/esm2022/tile/lib/tile-header.js +0 -14
- package/esm2022/tile/lib/tile-header.js.map +0 -1
- package/esm2022/tile/malva-ui-core-tile.js +0 -5
- package/esm2022/tile/malva-ui-core-tile.js.map +0 -1
- package/esm2022/time-picker/index.js +0 -2
- package/esm2022/time-picker/index.js.map +0 -1
- package/esm2022/time-picker/lib/time-picker/time-picker.js +0 -310
- package/esm2022/time-picker/lib/time-picker/time-picker.js.map +0 -1
- package/esm2022/time-picker/lib/time-picker-column/time-picker-column.js +0 -216
- package/esm2022/time-picker/lib/time-picker-column/time-picker-column.js.map +0 -1
- package/esm2022/time-picker/malva-ui-core-time-picker.js +0 -5
- package/esm2022/time-picker/malva-ui-core-time-picker.js.map +0 -1
- package/esm2022/timeline/index.js +0 -6
- package/esm2022/timeline/index.js.map +0 -1
- package/esm2022/timeline/lib/timeline/timeline-item-icon.js +0 -31
- package/esm2022/timeline/lib/timeline/timeline-item-icon.js.map +0 -1
- package/esm2022/timeline/lib/timeline/timeline-item-meta.js +0 -31
- package/esm2022/timeline/lib/timeline/timeline-item-meta.js.map +0 -1
- package/esm2022/timeline/lib/timeline/timeline-item.js +0 -69
- package/esm2022/timeline/lib/timeline/timeline-item.js.map +0 -1
- package/esm2022/timeline/lib/timeline/timeline.js +0 -36
- package/esm2022/timeline/lib/timeline/timeline.js.map +0 -1
- package/esm2022/timeline/lib/timeline/timeline.types.js +0 -1
- package/esm2022/timeline/lib/timeline/timeline.types.js.map +0 -1
- package/esm2022/timeline/malva-ui-core-timeline.js +0 -5
- package/esm2022/timeline/malva-ui-core-timeline.js.map +0 -1
- package/esm2022/title/index.js +0 -2
- package/esm2022/title/index.js.map +0 -1
- package/esm2022/title/lib/title/title.js +0 -171
- package/esm2022/title/lib/title/title.js.map +0 -1
- package/esm2022/title/malva-ui-core-title.js +0 -5
- package/esm2022/title/malva-ui-core-title.js.map +0 -1
- package/esm2022/toast/index.js +0 -13
- package/esm2022/toast/index.js.map +0 -1
- package/esm2022/toast/lib/abstract-toast-container.js +0 -50
- package/esm2022/toast/lib/abstract-toast-container.js.map +0 -1
- package/esm2022/toast/lib/abstract-toast-item.js +0 -75
- package/esm2022/toast/lib/abstract-toast-item.js.map +0 -1
- package/esm2022/toast/lib/abstract-toast.service.js +0 -176
- package/esm2022/toast/lib/abstract-toast.service.js.map +0 -1
- package/esm2022/toast/lib/toast-container/toast-container.js +0 -61
- package/esm2022/toast/lib/toast-container/toast-container.js.map +0 -1
- package/esm2022/toast/lib/toast-item/toast-item.js +0 -62
- package/esm2022/toast/lib/toast-item/toast-item.js.map +0 -1
- package/esm2022/toast/lib/toast-ref.js +0 -54
- package/esm2022/toast/lib/toast-ref.js.map +0 -1
- package/esm2022/toast/lib/toast-timer.js +0 -37
- package/esm2022/toast/lib/toast-timer.js.map +0 -1
- package/esm2022/toast/lib/toast.directives.js +0 -76
- package/esm2022/toast/lib/toast.directives.js.map +0 -1
- package/esm2022/toast/lib/toast.service.js +0 -127
- package/esm2022/toast/lib/toast.service.js.map +0 -1
- package/esm2022/toast/lib/toast.types.js +0 -39
- package/esm2022/toast/lib/toast.types.js.map +0 -1
- package/esm2022/toast/malva-ui-core-toast.js +0 -5
- package/esm2022/toast/malva-ui-core-toast.js.map +0 -1
- package/esm2022/tokenizer/index.js +0 -4
- package/esm2022/tokenizer/index.js.map +0 -1
- package/esm2022/tokenizer/lib/token/token.js +0 -123
- package/esm2022/tokenizer/lib/token/token.js.map +0 -1
- package/esm2022/tokenizer/lib/token-template.js +0 -23
- package/esm2022/tokenizer/lib/token-template.js.map +0 -1
- package/esm2022/tokenizer/lib/tokenizer/tokenizer.js +0 -324
- package/esm2022/tokenizer/lib/tokenizer/tokenizer.js.map +0 -1
- package/esm2022/tokenizer/malva-ui-core-tokenizer.js +0 -5
- package/esm2022/tokenizer/malva-ui-core-tokenizer.js.map +0 -1
- package/esm2022/toolbar/index.js +0 -4
- package/esm2022/toolbar/index.js.map +0 -1
- package/esm2022/toolbar/lib/toolbar/toolbar-spacer.js +0 -13
- package/esm2022/toolbar/lib/toolbar/toolbar-spacer.js.map +0 -1
- package/esm2022/toolbar/lib/toolbar/toolbar-widget.js +0 -106
- package/esm2022/toolbar/lib/toolbar/toolbar-widget.js.map +0 -1
- package/esm2022/toolbar/lib/toolbar/toolbar.js +0 -19
- package/esm2022/toolbar/lib/toolbar/toolbar.js.map +0 -1
- package/esm2022/toolbar/malva-ui-core-toolbar.js +0 -5
- package/esm2022/toolbar/malva-ui-core-toolbar.js.map +0 -1
- package/esm2022/tooltip/index.js +0 -4
- package/esm2022/tooltip/index.js.map +0 -1
- package/esm2022/tooltip/lib/tooltip/tooltip-panel.js +0 -69
- package/esm2022/tooltip/lib/tooltip/tooltip-panel.js.map +0 -1
- package/esm2022/tooltip/lib/tooltip/tooltip.js +0 -352
- package/esm2022/tooltip/lib/tooltip/tooltip.js.map +0 -1
- package/esm2022/tooltip/lib/tooltip/tooltip.types.js +0 -1
- package/esm2022/tooltip/lib/tooltip/tooltip.types.js.map +0 -1
- package/esm2022/tooltip/malva-ui-core-tooltip.js +0 -5
- package/esm2022/tooltip/malva-ui-core-tooltip.js.map +0 -1
- package/esm2022/tree/index.js +0 -5
- package/esm2022/tree/index.js.map +0 -1
- package/esm2022/tree/lib/tree/tree-context.js +0 -7
- package/esm2022/tree/lib/tree/tree-context.js.map +0 -1
- package/esm2022/tree/lib/tree/tree-node-def.js +0 -34
- package/esm2022/tree/lib/tree/tree-node-def.js.map +0 -1
- package/esm2022/tree/lib/tree/tree-node.js +0 -1
- package/esm2022/tree/lib/tree/tree-node.js.map +0 -1
- package/esm2022/tree/lib/tree/tree-subtree.js +0 -107
- package/esm2022/tree/lib/tree/tree-subtree.js.map +0 -1
- package/esm2022/tree/lib/tree/tree.js +0 -362
- package/esm2022/tree/lib/tree/tree.js.map +0 -1
- package/esm2022/tree/malva-ui-core-tree.js +0 -5
- package/esm2022/tree/malva-ui-core-tree.js.map +0 -1
- package/expand/index.d.ts +0 -2
- package/expand/lib/expand/expand-content.d.ts +0 -26
- package/expand/lib/expand/expand.d.ts +0 -74
- package/expand/malva-ui-core-expand.d.ts +0 -5
- package/file-upload/index.d.ts +0 -4
- package/file-upload/lib/file-upload/file-upload.d.ts +0 -138
- package/file-upload/lib/file-upload/file-upload.types.d.ts +0 -42
- package/file-upload/lib/file-upload-action.d.ts +0 -53
- package/file-upload/lib/file-upload-item/file-upload-item.d.ts +0 -30
- package/file-upload/malva-ui-core-file-upload.d.ts +0 -5
- package/filter/index.d.ts +0 -3
- package/filter/lib/filter/filter.d.ts +0 -156
- package/filter/lib/filter.types.d.ts +0 -75
- package/filter/lib/smart-filter-bar/smart-filter-bar.d.ts +0 -153
- package/filter/malva-ui-core-filter.d.ts +0 -5
- package/form/index.d.ts +0 -6
- package/form/lib/fieldset/fieldset.d.ts +0 -58
- package/form/lib/fieldset-span.d.ts +0 -28
- package/form/lib/form/form.d.ts +0 -37
- package/form/lib/form-actions.d.ts +0 -20
- package/form/lib/form-gap.d.ts +0 -5
- package/form/lib/form-header.d.ts +0 -18
- package/form/lib/form.types.d.ts +0 -13
- package/form/malva-ui-core-form.d.ts +0 -5
- package/form-utils/index.d.ts +0 -15
- package/form-utils/lib/aria-value-bridge.d.ts +0 -45
- package/form-utils/lib/description/description.d.ts +0 -16
- package/form-utils/lib/focusable-group-base.d.ts +0 -76
- package/form-utils/lib/form-control-base/signal-form-control-base.d.ts +0 -159
- package/form-utils/lib/form-control-sides.d.ts +0 -20
- package/form-utils/lib/form-control-wrapper/form-control-wrapper-control.d.ts +0 -6
- package/form-utils/lib/form-control-wrapper/form-control-wrapper.d.ts +0 -20
- package/form-utils/lib/form-field/form-field.d.ts +0 -68
- package/form-utils/lib/hint/hint.d.ts +0 -5
- package/form-utils/lib/label/label.d.ts +0 -22
- package/form-utils/lib/message/message.d.ts +0 -7
- package/form-utils/lib/models/error-display-strategy.d.ts +0 -1
- package/form-utils/lib/models/form-control-connector.d.ts +0 -41
- package/form-utils/lib/models/form-state.d.ts +0 -1
- package/form-utils/lib/selection.service.d.ts +0 -27
- package/form-utils/malva-ui-core-form-utils.d.ts +0 -5
- package/form-utils/testing/index.d.ts +0 -1
- package/form-utils/testing/lib/forms-binding-matrix.d.ts +0 -47
- package/form-utils/testing/malva-ui-core-form-utils-testing.d.ts +0 -5
- package/index.d.ts +0 -69
- package/input/index.d.ts +0 -3
- package/input/lib/input/input-native.d.ts +0 -36
- package/input/lib/input/input-value-accessor.d.ts +0 -11
- package/input/lib/input/input.d.ts +0 -189
- package/input/lib/input/password-strength.d.ts +0 -34
- package/input/malva-ui-core-input.d.ts +0 -5
- package/kbd/index.d.ts +0 -1
- package/kbd/lib/kbd/kbd.d.ts +0 -52
- package/kbd/malva-ui-core-kbd.d.ts +0 -5
- package/layout/index.d.ts +0 -4
- package/layout/lib/layout/directives/MlvLayoutSide.d.ts +0 -6
- package/layout/lib/layout/directives/MlvLayoutTop.d.ts +0 -6
- package/layout/lib/layout/layout.d.ts +0 -20
- package/layout/lib/layout/services/theme.service.d.ts +0 -33
- package/layout/malva-ui-core-layout.d.ts +0 -5
- package/link/index.d.ts +0 -2
- package/link/lib/link/link.d.ts +0 -15
- package/link/lib/link/link.directives.d.ts +0 -10
- package/link/malva-ui-core-link.d.ts +0 -5
- package/list/index.d.ts +0 -13
- package/list/lib/list/list.d.ts +0 -25
- package/list/lib/list-item/list-item.d.ts +0 -67
- package/list/lib/list-item-actions.d.ts +0 -12
- package/list/lib/list-item-byline.d.ts +0 -5
- package/list/lib/list-item-group/list-item-group.d.ts +0 -11
- package/list/lib/list-item-link/list-item-link.d.ts +0 -8
- package/list/lib/list-item-media.d.ts +0 -5
- package/list/lib/list-item-meta.d.ts +0 -5
- package/list/lib/list-item-prefix.d.ts +0 -5
- package/list/lib/list-item-suffix.d.ts +0 -5
- package/list/lib/list-item-template.d.ts +0 -10
- package/list/lib/list-item-title.d.ts +0 -5
- package/list/lib/list-selectable.d.ts +0 -73
- package/list/malva-ui-core-list.d.ts +0 -5
- package/loader/index.d.ts +0 -1
- package/loader/lib/loader/loader.d.ts +0 -84
- package/loader/malva-ui-core-loader.d.ts +0 -5
- package/malva-ui-core.d.ts +0 -5
- package/menu/index.d.ts +0 -9
- package/menu/lib/menu/menu-group-label.d.ts +0 -22
- package/menu/lib/menu/menu-group.d.ts +0 -27
- package/menu/lib/menu/menu-item.d.ts +0 -76
- package/menu/lib/menu/menu-separator.d.ts +0 -18
- package/menu/lib/menu/menu-trigger.d.ts +0 -255
- package/menu/lib/menu/menu.d.ts +0 -149
- package/menu/lib/menu/menu.types.d.ts +0 -13
- package/menu/lib/menu/menubar.d.ts +0 -131
- package/menu/lib/menu/menubar.types.d.ts +0 -82
- package/menu/lib/menu/submenu-aim.d.ts +0 -10
- package/menu/malva-ui-core-menu.d.ts +0 -5
- package/notification/index.d.ts +0 -4
- package/notification/lib/notification-item/notification-item.d.ts +0 -20
- package/notification/lib/notification-ref.d.ts +0 -12
- package/notification/lib/notification.service.d.ts +0 -43
- package/notification/lib/notification.types.d.ts +0 -52
- package/notification/malva-ui-core-notification.d.ts +0 -5
- package/number-input/index.d.ts +0 -1
- package/number-input/lib/number-input/number-input.d.ts +0 -162
- package/number-input/malva-ui-core-number-input.d.ts +0 -5
- package/page/index.d.ts +0 -14
- package/page/lib/page/page-scroll.token.d.ts +0 -19
- package/page/lib/page/page-snap-controller.d.ts +0 -87
- package/page/lib/page/page-snap.directive.d.ts +0 -40
- package/page/lib/page/page.d.ts +0 -74
- package/page/lib/page-content/page-aside.d.ts +0 -7
- package/page/lib/page-content/page-content.d.ts +0 -37
- package/page/lib/page-dock/page-dock.d.ts +0 -50
- package/page/lib/page-dock/page-dock.slots.d.ts +0 -16
- package/page/lib/page-header/page-header.d.ts +0 -77
- package/page/lib/page-header/page-header.directives.d.ts +0 -50
- package/page/lib/page-shell/page-shell-color.d.ts +0 -48
- package/page/lib/page-shell/page-shell-css-color.d.ts +0 -20
- package/page/lib/page-shell/page-shell.d.ts +0 -44
- package/page/lib/page-shell/page-shell.slots.d.ts +0 -16
- package/page/lib/page-summary/page-summary-item.d.ts +0 -11
- package/page/lib/page-summary/page-summary.d.ts +0 -36
- package/page/malva-ui-core-page.d.ts +0 -5
- package/pagination/index.d.ts +0 -4
- package/pagination/lib/pagination/pagination.d.ts +0 -182
- package/pagination/lib/pagination/pagination.directives.d.ts +0 -44
- package/pagination/lib/pagination/pagination.model.d.ts +0 -6
- package/pagination/lib/pagination/pagination.service.d.ts +0 -26
- package/pagination/malva-ui-core-pagination.d.ts +0 -5
- package/pin-input/index.d.ts +0 -2
- package/pin-input/lib/pin-input/pin-input-separator.d.ts +0 -24
- package/pin-input/lib/pin-input/pin-input.d.ts +0 -176
- package/pin-input/malva-ui-core-pin-input.d.ts +0 -5
- package/popup/index.d.ts +0 -9
- package/popup/lib/popup/popup.d.ts +0 -343
- package/popup/lib/popup-container/popup-container.d.ts +0 -61
- package/popup/lib/popup-container/popup-container.token.d.ts +0 -34
- package/popup/lib/popup-content.d.ts +0 -6
- package/popup/lib/popup-header-content.d.ts +0 -18
- package/popup/lib/popup-pinned-content.d.ts +0 -17
- package/popup/lib/popup-positions.d.ts +0 -105
- package/popup/lib/popup-trigger/popup-trigger.d.ts +0 -102
- package/popup/lib/popup.service.d.ts +0 -159
- package/popup/malva-ui-core-popup.d.ts +0 -5
- package/progress/index.d.ts +0 -1
- package/progress/lib/progress/progress.d.ts +0 -69
- package/progress/malva-ui-core-progress.d.ts +0 -5
- package/radio/index.d.ts +0 -2
- package/radio/lib/radio/radio.d.ts +0 -87
- package/radio/lib/radio-group/radio-group.d.ts +0 -35
- package/radio/lib/radio-group-token.d.ts +0 -7
- package/radio/malva-ui-core-radio.d.ts +0 -5
- package/rating/index.d.ts +0 -1
- package/rating/lib/rating/rating.d.ts +0 -100
- package/rating/malva-ui-core-rating.d.ts +0 -5
- package/scrollbar/index.d.ts +0 -1
- package/scrollbar/lib/scrollbar/scrollbar.d.ts +0 -166
- package/scrollbar/malva-ui-core-scrollbar.d.ts +0 -5
- package/search-field/index.d.ts +0 -2
- package/search-field/lib/search-field/search-field.d.ts +0 -347
- package/search-field/lib/search-field/search-overlay-content.d.ts +0 -59
- package/search-field/malva-ui-core-search-field.d.ts +0 -5
- package/segmented/index.d.ts +0 -4
- package/segmented/lib/segmented/segmented.d.ts +0 -80
- package/segmented/lib/segmented-item/segmented-item.d.ts +0 -89
- package/segmented/lib/segmented-token.d.ts +0 -22
- package/segmented/lib/segmented.types.d.ts +0 -9
- package/segmented/malva-ui-core-segmented.d.ts +0 -5
- package/select/index.d.ts +0 -3
- package/select/lib/select/select.d.ts +0 -379
- package/select/lib/select-option.d.ts +0 -1
- package/select/lib/select-template.directives.d.ts +0 -14
- package/select/malva-ui-core-select.d.ts +0 -5
- package/sidebar/index.d.ts +0 -15
- package/sidebar/lib/sidebar/sidebar.d.ts +0 -134
- package/sidebar/lib/sidebar-content.d.ts +0 -11
- package/sidebar/lib/sidebar-context.d.ts +0 -23
- package/sidebar/lib/sidebar-footer.d.ts +0 -9
- package/sidebar/lib/sidebar-group/sidebar-group.d.ts +0 -127
- package/sidebar/lib/sidebar-header.d.ts +0 -9
- package/sidebar/lib/sidebar-item/sidebar-item.d.ts +0 -104
- package/sidebar/lib/sidebar-item-host.d.ts +0 -18
- package/sidebar/lib/sidebar-item-icon.d.ts +0 -6
- package/sidebar/lib/sidebar-mode.d.ts +0 -2
- package/sidebar/lib/sidebar-rail/sidebar-rail.d.ts +0 -54
- package/sidebar/lib/sidebar-trigger/sidebar-trigger.d.ts +0 -67
- package/sidebar/lib/sidebar-workspace/sidebar-workspace.d.ts +0 -54
- package/sidebar/lib/sidebar-workspace/sidebar-workspace.directives.d.ts +0 -19
- package/sidebar/lib/sidebar-workspace/sidebar-workspace.types.d.ts +0 -20
- package/sidebar/malva-ui-core-sidebar.d.ts +0 -5
- package/skeleton/index.d.ts +0 -1
- package/skeleton/lib/skeleton/skeleton.d.ts +0 -60
- package/skeleton/malva-ui-core-skeleton.d.ts +0 -5
- package/slider/index.d.ts +0 -2
- package/slider/lib/slider/slider-tooltip-def.d.ts +0 -39
- package/slider/lib/slider/slider.d.ts +0 -171
- package/slider/malva-ui-core-slider.d.ts +0 -5
- package/split-pane/index.d.ts +0 -3
- package/split-pane/lib/split-pane/split-pane-panel.d.ts +0 -34
- package/split-pane/lib/split-pane/split-pane.d.ts +0 -98
- package/split-pane/lib/split-pane/split-pane.types.d.ts +0 -7
- package/split-pane/malva-ui-core-split-pane.d.ts +0 -5
- package/status-indicator/index.d.ts +0 -1
- package/status-indicator/lib/status-indicator/status-indicator.d.ts +0 -61
- package/status-indicator/malva-ui-core-status-indicator.d.ts +0 -5
- package/stepper/index.d.ts +0 -4
- package/stepper/lib/stepper/step-header.d.ts +0 -34
- package/stepper/lib/stepper/step.d.ts +0 -51
- package/stepper/lib/stepper/stepper-token.d.ts +0 -13
- package/stepper/lib/stepper/stepper.d.ts +0 -98
- package/stepper/lib/stepper/stepper.types.d.ts +0 -4
- package/stepper/malva-ui-core-stepper.d.ts +0 -5
- package/switch/index.d.ts +0 -2
- package/switch/lib/switch/switch.d.ts +0 -118
- package/switch/lib/switch-group/switch-group.d.ts +0 -24
- package/switch/lib/switch-group-token.d.ts +0 -6
- package/switch/malva-ui-core-switch.d.ts +0 -5
- package/tabs/index.d.ts +0 -8
- package/tabs/lib/tab/tab.d.ts +0 -46
- package/tabs/lib/tab-content/tab-content.d.ts +0 -11
- package/tabs/lib/tab-content-def.d.ts +0 -6
- package/tabs/lib/tab-def.d.ts +0 -11
- package/tabs/lib/tab-group-token.d.ts +0 -10
- package/tabs/lib/tab-item/tab-item.d.ts +0 -28
- package/tabs/lib/tabs/tabs.d.ts +0 -202
- package/tabs/lib/tabs.service.d.ts +0 -24
- package/tabs/malva-ui-core-tabs.d.ts +0 -5
- package/textarea/index.d.ts +0 -1
- package/textarea/lib/textarea/textarea.d.ts +0 -77
- package/textarea/malva-ui-core-textarea.d.ts +0 -5
- package/tile/index.d.ts +0 -2
- package/tile/lib/tile/tile.d.ts +0 -20
- package/tile/lib/tile-header.d.ts +0 -6
- package/tile/malva-ui-core-tile.d.ts +0 -5
- package/time-picker/index.d.ts +0 -1
- package/time-picker/lib/time-picker/time-picker.d.ts +0 -135
- package/time-picker/lib/time-picker-column/time-picker-column.d.ts +0 -111
- package/time-picker/malva-ui-core-time-picker.d.ts +0 -5
- package/timeline/index.d.ts +0 -5
- package/timeline/lib/timeline/timeline-item-icon.d.ts +0 -24
- package/timeline/lib/timeline/timeline-item-meta.d.ts +0 -24
- package/timeline/lib/timeline/timeline-item.d.ts +0 -52
- package/timeline/lib/timeline/timeline.d.ts +0 -27
- package/timeline/lib/timeline/timeline.types.d.ts +0 -18
- package/timeline/malva-ui-core-timeline.d.ts +0 -5
- package/title/index.d.ts +0 -1
- package/title/lib/title/title.d.ts +0 -63
- package/title/malva-ui-core-title.d.ts +0 -5
- package/toast/index.d.ts +0 -10
- package/toast/lib/abstract-toast-container.d.ts +0 -29
- package/toast/lib/abstract-toast-item.d.ts +0 -44
- package/toast/lib/abstract-toast.service.d.ts +0 -75
- package/toast/lib/toast-container/toast-container.d.ts +0 -23
- package/toast/lib/toast-item/toast-item.d.ts +0 -25
- package/toast/lib/toast-ref.d.ts +0 -33
- package/toast/lib/toast-timer.d.ts +0 -24
- package/toast/lib/toast.directives.d.ts +0 -13
- package/toast/lib/toast.service.d.ts +0 -41
- package/toast/lib/toast.types.d.ts +0 -139
- package/toast/malva-ui-core-toast.d.ts +0 -5
- package/tokenizer/index.d.ts +0 -3
- package/tokenizer/lib/token/token.d.ts +0 -60
- package/tokenizer/lib/token-template.d.ts +0 -29
- package/tokenizer/lib/tokenizer/tokenizer.d.ts +0 -109
- package/tokenizer/malva-ui-core-tokenizer.d.ts +0 -5
- package/toolbar/index.d.ts +0 -3
- package/toolbar/lib/toolbar/toolbar-spacer.d.ts +0 -5
- package/toolbar/lib/toolbar/toolbar-widget.d.ts +0 -75
- package/toolbar/lib/toolbar/toolbar.d.ts +0 -8
- package/toolbar/malva-ui-core-toolbar.d.ts +0 -5
- package/tooltip/index.d.ts +0 -3
- package/tooltip/lib/tooltip/tooltip-panel.d.ts +0 -26
- package/tooltip/lib/tooltip/tooltip.d.ts +0 -148
- package/tooltip/lib/tooltip/tooltip.types.d.ts +0 -17
- package/tooltip/malva-ui-core-tooltip.d.ts +0 -5
- package/tree/index.d.ts +0 -4
- package/tree/lib/tree/tree-context.d.ts +0 -62
- package/tree/lib/tree/tree-node-def.d.ts +0 -33
- package/tree/lib/tree/tree-node.d.ts +0 -45
- package/tree/lib/tree/tree-subtree.d.ts +0 -63
- package/tree/lib/tree/tree.d.ts +0 -156
- 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
|