@malva-ui/core 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -1
- package/LICENSE +21 -0
- package/README.md +69 -3
- 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 +195 -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,1898 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, inject, DestroyRef, computed, Injectable, InjectionToken, input, viewChild, NgZone, ElementRef, afterNextRender, afterRenderEffect, ChangeDetectionStrategy, ViewEncapsulation, Component, Directive, TemplateRef, model, output, contentChild, Injector, effect } from '@angular/core';
|
|
3
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
4
|
+
import { mlvNextId, MlvBreakpointService, MlvStructural, MlvResizeObserverService } from '@malva-ui/cdk/utils';
|
|
5
|
+
import { MlvScrollbar } from '@malva-ui/core/scrollbar';
|
|
6
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
7
|
+
import { MlvDrawer, MlvDrawerContent } from '@malva-ui/core/drawer';
|
|
8
|
+
import { RouterLink } from '@angular/router';
|
|
9
|
+
import { LucideChevronLeft, LucideChevronUp, LucidePin, LucidePinOff } from '@lucide/angular';
|
|
10
|
+
import { MlvButton } from '@malva-ui/core/button';
|
|
11
|
+
import { MlvLink, MlvLinkBefore } from '@malva-ui/core/link';
|
|
12
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Owns the snap progress of a page's collapsing top chrome.
|
|
16
|
+
*
|
|
17
|
+
* Progress is **scroll-scrubbed**: `main[mlvPage]` maps its scroll offset onto
|
|
18
|
+
* a 0..1 timeline (`snapRange` pixels of scroll = the full timeline), so
|
|
19
|
+
* chrome motion is proportional to scrolling instead of a time-based
|
|
20
|
+
* animation. The effective value is published as the `--mlv-page-snap` CSS
|
|
21
|
+
* custom property on the page host; elements interpolate their own state from
|
|
22
|
+
* it (see `MlvPageSnap`).
|
|
23
|
+
*
|
|
24
|
+
* Pinning distinguishes its origin:
|
|
25
|
+
* - **Manual** (chevron toggle): an explicit choice — while manually pinned
|
|
26
|
+
* collapsed, the geometry-compensation spacer is reclaimed (`spacerScale`
|
|
27
|
+
* tweens to 0) so no dead space remains above the content, including at the
|
|
28
|
+
* top of the page.
|
|
29
|
+
* - **Scroll** (pin button freezing a scroll-derived state): the frozen state
|
|
30
|
+
* is a scroll artifact — when the user returns to the top, the controller
|
|
31
|
+
* unpins automatically and the chrome expands.
|
|
32
|
+
*
|
|
33
|
+
* `expand()` / `collapse()` drive the same manual pin imperatively; `expand()`
|
|
34
|
+
* additionally reveals every registered `MlvPageSnapRegion` on the spot, so
|
|
35
|
+
* consumers can focus a control inside chrome the scroll had collapsed.
|
|
36
|
+
*
|
|
37
|
+
* Provided by `MlvPage`. Inject optionally from header/summary components and
|
|
38
|
+
* snap directives — absence simply means "no scroll-linked behaviour".
|
|
39
|
+
*/
|
|
40
|
+
class MlvPageSnapController {
|
|
41
|
+
/** @private Raw scroll-derived progress, 0 (top) .. 1 (fully snapped). */
|
|
42
|
+
_scrollProgress = signal(0, /* @ts-ignore */
|
|
43
|
+
...(ngDevMode ? [{ debugName: "_scrollProgress" }] : /* istanbul ignore next */ []));
|
|
44
|
+
/**
|
|
45
|
+
* @private Frozen progress while pinned or after a manual toggle;
|
|
46
|
+
* `null` means the progress follows the scroll position.
|
|
47
|
+
*/
|
|
48
|
+
_frozen = signal(null, /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "_frozen" }] : /* istanbul ignore next */ []));
|
|
50
|
+
/** @private How the current frozen state was produced. */
|
|
51
|
+
_pinOrigin = null;
|
|
52
|
+
/**
|
|
53
|
+
* @private Scale applied by `MlvPage` to the geometry-compensation spacer;
|
|
54
|
+
* tweens to 0 while manually pinned collapsed (dead space reclaimed).
|
|
55
|
+
*/
|
|
56
|
+
_spacerScale = signal(1, /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "_spacerScale" }] : /* istanbul ignore next */ []));
|
|
58
|
+
/** @private Frame handles of the running tweens, per animated signal. */
|
|
59
|
+
_tweenFrames = new Map();
|
|
60
|
+
/** @private Adapter so the frozen tween can share the signal tween helper. */
|
|
61
|
+
_frozenNumber = signal(0, /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "_frozenNumber" }] : /* istanbul ignore next */ []));
|
|
63
|
+
/** @private Cancels pending tweens when the owning page is destroyed. */
|
|
64
|
+
_destroyRef = inject(DestroyRef);
|
|
65
|
+
/** @private Snap regions that `expand()` reveals ahead of the tween. */
|
|
66
|
+
_regions = new Set();
|
|
67
|
+
/** @private Backs the `revealing` bridge flag. */
|
|
68
|
+
_revealing = signal(false, /* @ts-ignore */
|
|
69
|
+
...(ngDevMode ? [{ debugName: "_revealing" }] : /* istanbul ignore next */ []));
|
|
70
|
+
/** Effective snap progress: 0 fully expanded, 1 fully snapped. */
|
|
71
|
+
progress = computed(() => this._frozen() ?? this._scrollProgress(), /* @ts-ignore */
|
|
72
|
+
...(ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []));
|
|
73
|
+
/** True while the chrome state is frozen and ignores scrolling. */
|
|
74
|
+
pinned = computed(() => this._frozen() !== null, /* @ts-ignore */
|
|
75
|
+
...(ngDevMode ? [{ debugName: "pinned" }] : /* istanbul ignore next */ []));
|
|
76
|
+
/** True once the chrome is closer to its snapped state than the open one. */
|
|
77
|
+
snapped = computed(() => this.progress() >= 0.5, /* @ts-ignore */
|
|
78
|
+
...(ngDevMode ? [{ debugName: "snapped" }] : /* istanbul ignore next */ []));
|
|
79
|
+
/**
|
|
80
|
+
* @internal True while `expand()` bridges its own tween: snap regions stay
|
|
81
|
+
* visible — and therefore focusable — from the call itself until the
|
|
82
|
+
* progress has left their window. Read by `MlvPageSnap`.
|
|
83
|
+
*/
|
|
84
|
+
revealing = this._revealing;
|
|
85
|
+
/**
|
|
86
|
+
* Multiplier for the geometry-compensation spacer, 1 (full compensation)
|
|
87
|
+
* .. 0 (reclaimed). Consumed by `MlvPage`.
|
|
88
|
+
*/
|
|
89
|
+
spacerScale = this._spacerScale;
|
|
90
|
+
constructor() {
|
|
91
|
+
this._destroyRef.onDestroy(() => {
|
|
92
|
+
for (const frame of this._tweenFrames.values()) {
|
|
93
|
+
cancelAnimationFrame(frame);
|
|
94
|
+
}
|
|
95
|
+
this._tweenFrames.clear();
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @internal Registers a snap region so `expand()` can reveal it. Called by
|
|
100
|
+
* `MlvPageSnap`; the returned callback unregisters on destroy.
|
|
101
|
+
*/
|
|
102
|
+
registerRegion(region) {
|
|
103
|
+
this._regions.add(region);
|
|
104
|
+
return () => {
|
|
105
|
+
this._regions.delete(region);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @internal Called by `MlvPage` on every scroll event of its viewport.
|
|
110
|
+
* A pinned controller keeps reporting the frozen value; a scroll-origin
|
|
111
|
+
* pin releases itself once the user returns to the top, where the frozen
|
|
112
|
+
* scroll artifact would only leave dead space.
|
|
113
|
+
*/
|
|
114
|
+
updateFromScroll(scrollTop, snapRange) {
|
|
115
|
+
const progress = snapRange > 0 ? Math.min(Math.max(scrollTop / snapRange, 0), 1) : 0;
|
|
116
|
+
this._scrollProgress.set(progress);
|
|
117
|
+
if (this.pinned() && this._pinOrigin === 'scroll' && scrollTop <= 1) {
|
|
118
|
+
this.setPinned(false);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Pins the chrome at its current progress (`true`) or releases it back to
|
|
123
|
+
* scroll-following (`false`, animating to the scroll-derived value). A pin
|
|
124
|
+
* taken from a scroll-following state is a scroll-origin pin; pinning while
|
|
125
|
+
* already frozen by the chevron keeps the manual origin.
|
|
126
|
+
*/
|
|
127
|
+
setPinned(pinned) {
|
|
128
|
+
if (pinned === this.pinned()) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (pinned) {
|
|
132
|
+
this._cancelTween(this._frozenNumber);
|
|
133
|
+
this._pinOrigin ??= 'scroll';
|
|
134
|
+
this._frozen.set(this.progress());
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this._pinOrigin = null;
|
|
138
|
+
// Releasing the pin cancels a running expand tween as well.
|
|
139
|
+
this._endReveal();
|
|
140
|
+
this._animateSignal(this._spacerScale, 1);
|
|
141
|
+
this._animateFrozenTo(this._scrollProgress(), () => this._frozen.set(null));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Snaps the chrome fully open or closed (the chevron control). The result
|
|
145
|
+
* is a manual pin — otherwise the very next scroll event would undo the
|
|
146
|
+
* choice. Collapsing manually also reclaims the compensation spacer so no
|
|
147
|
+
* dead space remains above the content.
|
|
148
|
+
*/
|
|
149
|
+
toggle() {
|
|
150
|
+
if (this.snapped()) {
|
|
151
|
+
this.expand();
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.collapse();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Expands the chrome regardless of the scroll position and pins it there
|
|
159
|
+
* (a manual pin, like the chevron control). Every registered snap region is
|
|
160
|
+
* revealed **synchronously**, before the tween starts, so a consumer can
|
|
161
|
+
* move focus into collapsed chrome in the same task:
|
|
162
|
+
*
|
|
163
|
+
* ```ts
|
|
164
|
+
* this.snap.expand();
|
|
165
|
+
* headerTab.focus();
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
expand() {
|
|
169
|
+
for (const region of this._regions) {
|
|
170
|
+
region.reveal();
|
|
171
|
+
}
|
|
172
|
+
this._revealing.set(true);
|
|
173
|
+
this._pinOrigin = 'manual';
|
|
174
|
+
this._animateSignal(this._spacerScale, 1);
|
|
175
|
+
this._animateFrozenTo(0, () => this._endReveal());
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Collapses the chrome regardless of the scroll position and pins it there,
|
|
179
|
+
* reclaiming the compensation spacer so no dead space remains above the
|
|
180
|
+
* content.
|
|
181
|
+
*/
|
|
182
|
+
collapse() {
|
|
183
|
+
// Collapsing cancels the expand tween, so the bridge that outlived it
|
|
184
|
+
// would strand every region visible-but-scrubbed — an invisible tab stop.
|
|
185
|
+
this._endReveal();
|
|
186
|
+
this._pinOrigin = 'manual';
|
|
187
|
+
this._animateSignal(this._spacerScale, 0);
|
|
188
|
+
this._animateFrozenTo(1);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* @private Ends the reveal bridge and hands every region back its own
|
|
192
|
+
* hidden state. `reveal()` writes the DOM ahead of change detection, so a
|
|
193
|
+
* bridge that opens and closes without a render in between would otherwise
|
|
194
|
+
* leave the host binding's cached value disagreeing with the element.
|
|
195
|
+
*/
|
|
196
|
+
_endReveal() {
|
|
197
|
+
if (!this._revealing()) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
this._revealing.set(false);
|
|
201
|
+
for (const region of this._regions) {
|
|
202
|
+
region.syncHiddenState();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** @private Tweens the frozen progress via the shared signal tween. */
|
|
206
|
+
_animateFrozenTo(target, done) {
|
|
207
|
+
this._frozenNumber.set(this.progress());
|
|
208
|
+
this._frozen.set(this.progress());
|
|
209
|
+
this._animateSignal(this._frozenNumber, target, done, (value) => this._frozen.set(value));
|
|
210
|
+
}
|
|
211
|
+
/** @private rAF tween so manual state changes stay smooth. */
|
|
212
|
+
_animateSignal(target, to, done, mirror) {
|
|
213
|
+
this._cancelTween(target);
|
|
214
|
+
const from = target();
|
|
215
|
+
const reducedMotion = typeof matchMedia !== 'undefined' &&
|
|
216
|
+
matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
217
|
+
if (reducedMotion ||
|
|
218
|
+
typeof requestAnimationFrame === 'undefined' ||
|
|
219
|
+
Math.abs(to - from) < 0.001) {
|
|
220
|
+
target.set(to);
|
|
221
|
+
mirror?.(to);
|
|
222
|
+
done?.();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const durationMs = 200;
|
|
226
|
+
let startTime = null;
|
|
227
|
+
const step = (now) => {
|
|
228
|
+
startTime ??= now;
|
|
229
|
+
const t = Math.min((now - startTime) / durationMs, 1);
|
|
230
|
+
const eased = 1 - (1 - t) ** 3;
|
|
231
|
+
const value = from + (to - from) * eased;
|
|
232
|
+
target.set(value);
|
|
233
|
+
mirror?.(value);
|
|
234
|
+
if (t < 1) {
|
|
235
|
+
this._tweenFrames.set(target, requestAnimationFrame(step));
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
this._tweenFrames.delete(target);
|
|
239
|
+
done?.();
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
this._tweenFrames.set(target, requestAnimationFrame(step));
|
|
243
|
+
}
|
|
244
|
+
/** @private Stops the running tween of one signal, if any. */
|
|
245
|
+
_cancelTween(target) {
|
|
246
|
+
const frame = this._tweenFrames.get(target);
|
|
247
|
+
if (frame !== undefined) {
|
|
248
|
+
cancelAnimationFrame(frame);
|
|
249
|
+
this._tweenFrames.delete(target);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnapController, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
253
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnapController });
|
|
254
|
+
}
|
|
255
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnapController, decorators: [{
|
|
256
|
+
type: Injectable
|
|
257
|
+
}], ctorParameters: () => [] });
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Injection token provided by `main[mlvPage]` so descendants can react to the
|
|
261
|
+
* page's scroll position without knowing which element owns scrolling.
|
|
262
|
+
* Inject optionally — components keep working outside a page, just without
|
|
263
|
+
* scroll-linked behaviour.
|
|
264
|
+
*/
|
|
265
|
+
const MLV_PAGE_SCROLL = new InjectionToken('MLV_PAGE_SCROLL');
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Scroll offset in pixels below which the page reports itself as unscrolled.
|
|
269
|
+
* The small hysteresis avoids flicker from sub-pixel scroll positions.
|
|
270
|
+
*/
|
|
271
|
+
const SCROLLED_THRESHOLD = 4;
|
|
272
|
+
/**
|
|
273
|
+
* Main page surface and scroll owner. Apply it to the page's native `<main>`
|
|
274
|
+
* landmark and compose headers, content grids, and feature components inside.
|
|
275
|
+
*
|
|
276
|
+
* Provides `MLV_PAGE_SCROLL` so descendants such as `mlv-page-header` and
|
|
277
|
+
* `mlv-page-summary` can react to the page's scroll position, and
|
|
278
|
+
* `MlvPageSnapController`, whose scroll-scrubbed progress it publishes as the
|
|
279
|
+
* `--mlv-page-snap` custom property (0 expanded .. 1 snapped) for descendants
|
|
280
|
+
* to interpolate their snap state from.
|
|
281
|
+
*/
|
|
282
|
+
class MlvPage {
|
|
283
|
+
/** Unique landmark id; set explicitly when targeting the page from a skip link. */
|
|
284
|
+
id = input(mlvNextId('mlv-page'), /* @ts-ignore */
|
|
285
|
+
...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
286
|
+
/** Selects whether the page or a consumer-owned region handles scrolling. */
|
|
287
|
+
scroll = input('auto', /* @ts-ignore */
|
|
288
|
+
...(ngDevMode ? [{ debugName: "scroll" }] : /* istanbul ignore next */ []));
|
|
289
|
+
/** Optional maximum width for the centred inner page canvas. */
|
|
290
|
+
maxWidth = input(null, /* @ts-ignore */
|
|
291
|
+
...(ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []));
|
|
292
|
+
/** Selects the responsive inset applied around projected page content. */
|
|
293
|
+
padding = input('m', /* @ts-ignore */
|
|
294
|
+
...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
|
|
295
|
+
/** Selects the anchored rounded canvas or a completely flat surface. */
|
|
296
|
+
surface = input('anchored', /* @ts-ignore */
|
|
297
|
+
...(ngDevMode ? [{ debugName: "surface" }] : /* istanbul ignore next */ []));
|
|
298
|
+
/** Makes projected page headers sticky within this page's scroll container. */
|
|
299
|
+
stickyHeader = input(true, { ...(ngDevMode ? { debugName: "stickyHeader" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
300
|
+
/**
|
|
301
|
+
* Scroll distance in pixels mapped onto the full snap timeline: scrolling
|
|
302
|
+
* this far takes the top chrome from fully expanded to fully snapped.
|
|
303
|
+
*/
|
|
304
|
+
snapRange = input(96, /* @ts-ignore */
|
|
305
|
+
...(ngDevMode ? [{ debugName: "snapRange" }] : /* istanbul ignore next */ []));
|
|
306
|
+
/** Current vertical scroll offset of the page scroll owner, in pixels. */
|
|
307
|
+
get scrollTop() {
|
|
308
|
+
return this._scrollTop.asReadonly();
|
|
309
|
+
}
|
|
310
|
+
/** True once the page has scrolled past a small hysteresis threshold. */
|
|
311
|
+
get scrolled() {
|
|
312
|
+
return this._scrolled.asReadonly();
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Snap controller of this page's collapsing top chrome. Descendants inject
|
|
316
|
+
* `MlvPageSnapController` directly; a component that only *hosts* the page
|
|
317
|
+
* reaches it from outside through `viewChild(MlvPage).snap` — for instance
|
|
318
|
+
* to `expand()` the chrome before moving focus into it.
|
|
319
|
+
*/
|
|
320
|
+
get snap() {
|
|
321
|
+
return this._snap;
|
|
322
|
+
}
|
|
323
|
+
/** @private Writable source behind the public `scrollTop` signal. */
|
|
324
|
+
_scrollTop = signal(0, /* @ts-ignore */
|
|
325
|
+
...(ngDevMode ? [{ debugName: "_scrollTop" }] : /* istanbul ignore next */ []));
|
|
326
|
+
/** @private Writable source behind the public `scrolled` signal. */
|
|
327
|
+
_scrolled = signal(false, /* @ts-ignore */
|
|
328
|
+
...(ngDevMode ? [{ debugName: "_scrolled" }] : /* istanbul ignore next */ []));
|
|
329
|
+
/** @private The page-owned scrollbar whose viewport is observed. */
|
|
330
|
+
_scrollbar = viewChild.required(MlvScrollbar, /* @ts-ignore */
|
|
331
|
+
...(ngDevMode ? [{ debugName: "_scrollbar" }] : /* istanbul ignore next */ []));
|
|
332
|
+
/** @private Zone reference; the scroll listener runs outside the zone. */
|
|
333
|
+
_ngZone = inject(NgZone);
|
|
334
|
+
/** @private Cleans up the native scroll listener. */
|
|
335
|
+
_destroyRef = inject(DestroyRef);
|
|
336
|
+
/** @private Snap state provided to descendants and scrubbed from scroll. */
|
|
337
|
+
_snap = inject(MlvPageSnapController);
|
|
338
|
+
/** @private Host element carrying the published snap custom property. */
|
|
339
|
+
_elementRef = inject(ElementRef);
|
|
340
|
+
constructor() {
|
|
341
|
+
afterNextRender(() => {
|
|
342
|
+
const viewport = this._scrollbar().viewportElement;
|
|
343
|
+
const onScroll = () => {
|
|
344
|
+
const top = viewport.scrollTop;
|
|
345
|
+
this._scrollTop.set(top);
|
|
346
|
+
this._scrolled.set(top > SCROLLED_THRESHOLD);
|
|
347
|
+
this._snap.updateFromScroll(top, this.snapRange());
|
|
348
|
+
};
|
|
349
|
+
// Signal writes propagate through the reactivity graph without zone
|
|
350
|
+
// involvement, so the frequent listener can stay outside the zone.
|
|
351
|
+
this._ngZone.runOutsideAngular(() => {
|
|
352
|
+
viewport.addEventListener('scroll', onScroll, { passive: true });
|
|
353
|
+
});
|
|
354
|
+
this._destroyRef.onDestroy(() => {
|
|
355
|
+
viewport.removeEventListener('scroll', onScroll);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
// Publish the effective snap progress as a CSS custom property so
|
|
359
|
+
// descendant styles can scrub their state with pure calc() interpolation,
|
|
360
|
+
// then rebalance the chrome spacer against the freshly applied progress.
|
|
361
|
+
afterRenderEffect(() => {
|
|
362
|
+
const progress = this._snap.progress();
|
|
363
|
+
// Track the spacer scale too: the reclaim tween must republish.
|
|
364
|
+
this._snap.spacerScale();
|
|
365
|
+
this._elementRef.nativeElement.style.setProperty('--mlv-page-snap', String(Math.round(progress * 1000) / 1000));
|
|
366
|
+
this._measureSnapOffset();
|
|
367
|
+
});
|
|
368
|
+
afterNextRender(() => {
|
|
369
|
+
const host = this._elementRef.nativeElement;
|
|
370
|
+
this._snapChrome = Array.from(host.querySelectorAll('.mlv-page__inner > .mlv-page-header, .mlv-page__inner > .mlv-page-summary'));
|
|
371
|
+
this._measureSnapOffset();
|
|
372
|
+
// Re-measure when chrome content itself resizes (wrapping, data).
|
|
373
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
374
|
+
const observer = new ResizeObserver(() => this._measureSnapOffset());
|
|
375
|
+
this._snapChrome.forEach((element) => observer.observe(element));
|
|
376
|
+
this._destroyRef.onDestroy(() => observer.disconnect());
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
/** @private Direct chrome children whose snapping height is compensated. */
|
|
381
|
+
_snapChrome = [];
|
|
382
|
+
/** @private Expanded (progress 0) chrome height, the compensation baseline. */
|
|
383
|
+
_snapExpandedHeight = 0;
|
|
384
|
+
/**
|
|
385
|
+
* @private Snapping shrinks in-flow chrome (the header with its projected
|
|
386
|
+
* summary row), which would shift the content and the scroll height while
|
|
387
|
+
* the user is still scrolling — a feedback loop that reads as mid-scroll
|
|
388
|
+
* jumping. The removed height is re-added as a spacer after the chrome
|
|
389
|
+
* (`--mlv-page-snap-offset`), keeping the document geometry stable so
|
|
390
|
+
* content tracks the scroll 1:1. The controller's `spacerScale` scales the
|
|
391
|
+
* spacer away while the chrome is manually pinned collapsed — a frozen
|
|
392
|
+
* chrome never changes height mid-scroll, so the spacer is pure dead space.
|
|
393
|
+
*/
|
|
394
|
+
_measureSnapOffset() {
|
|
395
|
+
if (this._snapChrome.length === 0) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const total = this._snapChrome.reduce((sum, element) => sum + element.offsetHeight, 0);
|
|
399
|
+
if (this._snap.progress() <= 0.001) {
|
|
400
|
+
this._snapExpandedHeight = total;
|
|
401
|
+
}
|
|
402
|
+
const offset = Math.max(0, this._snapExpandedHeight - total) * this._snap.spacerScale();
|
|
403
|
+
this._elementRef.nativeElement.style.setProperty('--mlv-page-snap-offset', `${Math.round(offset * 100) / 100}px`);
|
|
404
|
+
}
|
|
405
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
406
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: MlvPage, isStandalone: true, selector: "main[mlvPage]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, scroll: { classPropertyName: "scroll", publicName: "scroll", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, snapRange: { classPropertyName: "snapRange", publicName: "snapRange", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, properties: { "id": "id()", "class.mlv-page--scroll-auto": "scroll() === \"auto\"", "class.mlv-page--scroll-none": "scroll() === \"none\"", "class.mlv-page--padding-none": "padding() === \"none\"", "class.mlv-page--padding-s": "padding() === \"s\"", "class.mlv-page--padding-m": "padding() === \"m\"", "class.mlv-page--padding-l": "padding() === \"l\"", "class.mlv-page--surface-anchored": "surface() === \"anchored\"", "class.mlv-page--surface-flat": "surface() === \"flat\"", "class.mlv-page--sticky-header": "stickyHeader()", "class.mlv-page--scrolled": "scrolled()", "style.--mlv-page-max-width": "maxWidth()" }, classAttribute: "mlv-page" }, providers: [
|
|
407
|
+
{ provide: MLV_PAGE_SCROLL, useExisting: MlvPage },
|
|
408
|
+
MlvPageSnapController,
|
|
409
|
+
], viewQueries: [{ propertyName: "_scrollbar", first: true, predicate: MlvScrollbar, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
410
|
+
<mlv-scrollbar class="mlv-page__scrollbar" [disabled]="scroll() === 'none'">
|
|
411
|
+
<div class="mlv-page__inner"><ng-content /></div>
|
|
412
|
+
</mlv-scrollbar>
|
|
413
|
+
`, isInline: true, styles: ["@layer mlv.components{.mlv-page{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page *{box-sizing:border-box}.mlv-page{display:block;flex:1 1 auto;min-width:0;min-height:0;color:var(--mlv-text-primary);background:var(--mlv-background-base);outline:none;isolation:isolate;--mlv-page-surface-radius: 0rem}.mlv-page__scrollbar{width:100%;height:100%;min-height:0}.mlv-page__scrollbar .mlv-scrollbar__viewport{overflow-x:hidden;scroll-padding-top:var(--mlv-page-header-offset, 6rem);overflow-anchor:none}.mlv-page__inner{container-type:inline-size;width:100%;min-height:100%;max-width:var(--mlv-page-max-width, none);margin-inline:auto}.mlv-page--surface-anchored{--mlv-page-surface-radius: calc( var(--mlv-radius-xl) - .0625rem );border:.0625rem solid var(--mlv-border-subtle);border-bottom:0;border-radius:var(--mlv-radius-xl) var(--mlv-radius-xl) 0 0}.mlv-page--surface-flat{--mlv-page-surface-radius: 0rem;border-radius:0}.mlv-page--scroll-auto,.mlv-page--scroll-none,.mlv-page--scroll-none .mlv-page__scrollbar .mlv-scrollbar__viewport{overflow:clip}.mlv-page--padding-none .mlv-page__inner{--mlv-page-inset: 0rem;padding:0}.mlv-page--padding-s .mlv-page__inner{--mlv-page-inset: var(--mlv-spacing-1-5);padding:var(--mlv-page-inset)}.mlv-page--padding-m .mlv-page__inner{--mlv-page-inset: var(--mlv-spacing-2);padding:var(--mlv-page-inset)}.mlv-page--padding-l .mlv-page__inner{--mlv-page-inset: var(--mlv-spacing-3);padding:var(--mlv-page-inset)}.mlv-page__inner>.mlv-page-header,.mlv-page__inner>.mlv-page-summary{margin-inline:calc(-1 * var(--mlv-page-inset, 0rem))}.mlv-page__inner>.mlv-page-header{margin-top:calc(-1 * var(--mlv-page-inset, 0rem));border-radius:0}.mlv-page__inner>.mlv-page-header:first-child,.mlv-page__inner>.mlv-page-summary:first-child{border-radius:var(--mlv-page-surface-radius, 0rem) var(--mlv-page-surface-radius, 0rem) 0 0}.mlv-page__inner>.mlv-page-summary,.mlv-page__inner>.mlv-page-header:not(:has(~.mlv-page-summary)){margin-bottom:var(--mlv-page-snap-offset, 0rem)}.mlv-page--sticky-header .mlv-page-header{position:sticky;top:0;z-index:10}.mlv-page:focus-visible{outline:var(--mlv-stroke-width-medium) solid var(--mlv-border-focus);outline-offset:calc(var(--mlv-focus-ring-offset) * -1)}.mlv-page-snap--hide,.mlv-page-snap--fade{--mlv-snap-progress: clamp( 0, (var(--mlv-page-snap, 0) - var(--mlv-snap-from, 0)) * var(--mlv-snap-scale, 1), 1 )}.mlv-page-snap--fade{opacity:calc(1 - var(--mlv-snap-progress))}.mlv-page-snap--hide{max-height:calc(var(--mlv-snap-size, 3rem) * (1 - var(--mlv-snap-progress)));overflow:hidden;opacity:calc(1 - var(--mlv-snap-progress) * 1.5);transform:translateY(calc(-.5rem * var(--mlv-snap-progress)))}.mlv-page-snap--revealed{--mlv-snap-progress: 0}@media(prefers-reduced-motion:reduce){.mlv-page,.mlv-page *,.mlv-page:before,.mlv-page:after,[class^=mlv-page__],[class*=\" mlv-page__\"],[class^=mlv-page--],[class*=\" mlv-page--\"]{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:var(--mlv-duration-instant)!important}}}\n"], dependencies: [{ kind: "component", type: MlvScrollbar, selector: "mlv-scrollbar", inputs: ["orientation", "scrollbarSize", "disabled", "ariaLabel", "viewportTabIndex"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
414
|
+
}
|
|
415
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPage, decorators: [{
|
|
416
|
+
type: Component,
|
|
417
|
+
args: [{ selector: 'main[mlvPage]', template: `
|
|
418
|
+
<mlv-scrollbar class="mlv-page__scrollbar" [disabled]="scroll() === 'none'">
|
|
419
|
+
<div class="mlv-page__inner"><ng-content /></div>
|
|
420
|
+
</mlv-scrollbar>
|
|
421
|
+
`, imports: [MlvScrollbar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
422
|
+
{ provide: MLV_PAGE_SCROLL, useExisting: MlvPage },
|
|
423
|
+
MlvPageSnapController,
|
|
424
|
+
], host: {
|
|
425
|
+
class: 'mlv-page',
|
|
426
|
+
'[id]': 'id()',
|
|
427
|
+
tabindex: '-1',
|
|
428
|
+
'[class.mlv-page--scroll-auto]': 'scroll() === "auto"',
|
|
429
|
+
'[class.mlv-page--scroll-none]': 'scroll() === "none"',
|
|
430
|
+
'[class.mlv-page--padding-none]': 'padding() === "none"',
|
|
431
|
+
'[class.mlv-page--padding-s]': 'padding() === "s"',
|
|
432
|
+
'[class.mlv-page--padding-m]': 'padding() === "m"',
|
|
433
|
+
'[class.mlv-page--padding-l]': 'padding() === "l"',
|
|
434
|
+
'[class.mlv-page--surface-anchored]': 'surface() === "anchored"',
|
|
435
|
+
'[class.mlv-page--surface-flat]': 'surface() === "flat"',
|
|
436
|
+
'[class.mlv-page--sticky-header]': 'stickyHeader()',
|
|
437
|
+
'[class.mlv-page--scrolled]': 'scrolled()',
|
|
438
|
+
'[style.--mlv-page-max-width]': 'maxWidth()',
|
|
439
|
+
}, styles: ["@layer mlv.components{.mlv-page{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page *{box-sizing:border-box}.mlv-page{display:block;flex:1 1 auto;min-width:0;min-height:0;color:var(--mlv-text-primary);background:var(--mlv-background-base);outline:none;isolation:isolate;--mlv-page-surface-radius: 0rem}.mlv-page__scrollbar{width:100%;height:100%;min-height:0}.mlv-page__scrollbar .mlv-scrollbar__viewport{overflow-x:hidden;scroll-padding-top:var(--mlv-page-header-offset, 6rem);overflow-anchor:none}.mlv-page__inner{container-type:inline-size;width:100%;min-height:100%;max-width:var(--mlv-page-max-width, none);margin-inline:auto}.mlv-page--surface-anchored{--mlv-page-surface-radius: calc( var(--mlv-radius-xl) - .0625rem );border:.0625rem solid var(--mlv-border-subtle);border-bottom:0;border-radius:var(--mlv-radius-xl) var(--mlv-radius-xl) 0 0}.mlv-page--surface-flat{--mlv-page-surface-radius: 0rem;border-radius:0}.mlv-page--scroll-auto,.mlv-page--scroll-none,.mlv-page--scroll-none .mlv-page__scrollbar .mlv-scrollbar__viewport{overflow:clip}.mlv-page--padding-none .mlv-page__inner{--mlv-page-inset: 0rem;padding:0}.mlv-page--padding-s .mlv-page__inner{--mlv-page-inset: var(--mlv-spacing-1-5);padding:var(--mlv-page-inset)}.mlv-page--padding-m .mlv-page__inner{--mlv-page-inset: var(--mlv-spacing-2);padding:var(--mlv-page-inset)}.mlv-page--padding-l .mlv-page__inner{--mlv-page-inset: var(--mlv-spacing-3);padding:var(--mlv-page-inset)}.mlv-page__inner>.mlv-page-header,.mlv-page__inner>.mlv-page-summary{margin-inline:calc(-1 * var(--mlv-page-inset, 0rem))}.mlv-page__inner>.mlv-page-header{margin-top:calc(-1 * var(--mlv-page-inset, 0rem));border-radius:0}.mlv-page__inner>.mlv-page-header:first-child,.mlv-page__inner>.mlv-page-summary:first-child{border-radius:var(--mlv-page-surface-radius, 0rem) var(--mlv-page-surface-radius, 0rem) 0 0}.mlv-page__inner>.mlv-page-summary,.mlv-page__inner>.mlv-page-header:not(:has(~.mlv-page-summary)){margin-bottom:var(--mlv-page-snap-offset, 0rem)}.mlv-page--sticky-header .mlv-page-header{position:sticky;top:0;z-index:10}.mlv-page:focus-visible{outline:var(--mlv-stroke-width-medium) solid var(--mlv-border-focus);outline-offset:calc(var(--mlv-focus-ring-offset) * -1)}.mlv-page-snap--hide,.mlv-page-snap--fade{--mlv-snap-progress: clamp( 0, (var(--mlv-page-snap, 0) - var(--mlv-snap-from, 0)) * var(--mlv-snap-scale, 1), 1 )}.mlv-page-snap--fade{opacity:calc(1 - var(--mlv-snap-progress))}.mlv-page-snap--hide{max-height:calc(var(--mlv-snap-size, 3rem) * (1 - var(--mlv-snap-progress)));overflow:hidden;opacity:calc(1 - var(--mlv-snap-progress) * 1.5);transform:translateY(calc(-.5rem * var(--mlv-snap-progress)))}.mlv-page-snap--revealed{--mlv-snap-progress: 0}@media(prefers-reduced-motion:reduce){.mlv-page,.mlv-page *,.mlv-page:before,.mlv-page:after,[class^=mlv-page__],[class*=\" mlv-page__\"],[class^=mlv-page--],[class*=\" mlv-page--\"]{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:var(--mlv-duration-instant)!important}}}\n"] }]
|
|
440
|
+
}], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], scroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "scroll", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], snapRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapRange", required: false }] }], _scrollbar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MlvScrollbar), { isSignal: true }] }] } });
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Shared focus contract for page chrome that the scroll timeline collapses —
|
|
444
|
+
* `MlvPageSnap` regions and `MlvPageSummary`.
|
|
445
|
+
*
|
|
446
|
+
* A fully collapsed region is `visibility: hidden` so it leaves the
|
|
447
|
+
* accessibility tree and, crucially, the tab order: a control nobody can see
|
|
448
|
+
* must not be an invisible tab stop. The state is driven by **scrolling**
|
|
449
|
+
* though, not by a user action, so hiding it unconditionally would let a
|
|
450
|
+
* scroll blur whatever the user had focused — the browser drops that focus to
|
|
451
|
+
* `<body>`, destroying the user's place in the tab order.
|
|
452
|
+
*
|
|
453
|
+
* Two exceptions therefore lift the hide:
|
|
454
|
+
* - **Focus inside the region** ({@link _revealed}) — the region steps off the
|
|
455
|
+
* timeline and renders fully expanded for as long as it holds focus. Focus
|
|
456
|
+
* is never relocated implicitly, and the focused control stays visible.
|
|
457
|
+
* - **`MlvPageSnapController.expand()`** — reveals every registered region up
|
|
458
|
+
* front (see {@link reveal}) so a consumer can move focus into chrome the
|
|
459
|
+
* scroll had collapsed.
|
|
460
|
+
*
|
|
461
|
+
* Subclasses supply {@link _elapsed} (their own end-of-window test) and bind
|
|
462
|
+
* {@link _hidden} / {@link _revealed} plus the two focus listeners in their
|
|
463
|
+
* own `host` object — the class names differ per block.
|
|
464
|
+
*/
|
|
465
|
+
class MlvPageSnapRegionBase {
|
|
466
|
+
/**
|
|
467
|
+
* @protected Snap state of the owning page, when rendered inside one.
|
|
468
|
+
* Absent outside `main[mlvPage]`, where nothing collapses.
|
|
469
|
+
*/
|
|
470
|
+
_snapController = inject(MlvPageSnapController, {
|
|
471
|
+
optional: true,
|
|
472
|
+
});
|
|
473
|
+
/** @private Host element, for the eager reveal and the focus containment test. */
|
|
474
|
+
_regionHost = inject(ElementRef);
|
|
475
|
+
/** @private True while this region contains the active element. */
|
|
476
|
+
_focusWithin = signal(false, /* @ts-ignore */
|
|
477
|
+
...(ngDevMode ? [{ debugName: "_focusWithin" }] : /* istanbul ignore next */ []));
|
|
478
|
+
/**
|
|
479
|
+
* @protected Holds the region at its expanded state while it has focus:
|
|
480
|
+
* a focused control has to stay visible, and a region that stays visible
|
|
481
|
+
* cannot have its focus dropped by the next scroll event.
|
|
482
|
+
*/
|
|
483
|
+
_revealed = computed(() => this._focusWithin(), /* @ts-ignore */
|
|
484
|
+
...(ngDevMode ? [{ debugName: "_revealed" }] : /* istanbul ignore next */ []));
|
|
485
|
+
/**
|
|
486
|
+
* @protected Takes the collapsed region out of the accessibility tree and
|
|
487
|
+
* the tab order — unless it holds focus, or the controller is revealing it
|
|
488
|
+
* for one.
|
|
489
|
+
*/
|
|
490
|
+
_hidden = computed(() => this._elapsed() &&
|
|
491
|
+
!this._focusWithin() &&
|
|
492
|
+
!(this._snapController?.revealing() ?? false), /* @ts-ignore */
|
|
493
|
+
...(ngDevMode ? [{ debugName: "_hidden" }] : /* istanbul ignore next */ []));
|
|
494
|
+
constructor() {
|
|
495
|
+
const unregister = this._snapController?.registerRegion(this);
|
|
496
|
+
inject(DestroyRef).onDestroy(() => unregister?.());
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Reveals the region immediately, ahead of the controller's expand tween.
|
|
500
|
+
* Host bindings only flush on the next change detection pass, so the inline
|
|
501
|
+
* hide is cleared eagerly — otherwise a `focus()` issued in the same task
|
|
502
|
+
* would still be refused on a `visibility: hidden` element. The controller's
|
|
503
|
+
* `revealing` flag keeps the binding in agreement until the progress has
|
|
504
|
+
* left this region's window.
|
|
505
|
+
*/
|
|
506
|
+
reveal() {
|
|
507
|
+
this._regionHost.nativeElement.style.visibility = '';
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Re-applies the hidden state after the controller's reveal window closes.
|
|
511
|
+
* A reveal that opens and closes without a render in between leaves the
|
|
512
|
+
* `[style.visibility]` binding holding a value it never rewrote, so the
|
|
513
|
+
* region would stay visible — and its controls would become invisible tab
|
|
514
|
+
* stops — until something else changed.
|
|
515
|
+
*/
|
|
516
|
+
syncHiddenState() {
|
|
517
|
+
this._regionHost.nativeElement.style.visibility = this._hidden()
|
|
518
|
+
? 'hidden'
|
|
519
|
+
: '';
|
|
520
|
+
}
|
|
521
|
+
/** @protected Records that focus entered this region. */
|
|
522
|
+
_onRegionFocusIn() {
|
|
523
|
+
this._focusWithin.set(true);
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* @protected Releases the focus reveal only when focus actually left the
|
|
527
|
+
* region — moving between two controls inside it also fires `focusout`.
|
|
528
|
+
*/
|
|
529
|
+
_onRegionFocusOut(event) {
|
|
530
|
+
const next = event.relatedTarget;
|
|
531
|
+
this._focusWithin.set(next instanceof Node && this._regionHost.nativeElement.contains(next));
|
|
532
|
+
}
|
|
533
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnapRegionBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
534
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageSnapRegionBase, isStandalone: true, ngImport: i0 });
|
|
535
|
+
}
|
|
536
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnapRegionBase, decorators: [{
|
|
537
|
+
type: Directive
|
|
538
|
+
}], ctorParameters: () => [] });
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Lets any element inside `main[mlvPage]` define its own state on the snap
|
|
542
|
+
* timeline. The element reads the page-level `--mlv-page-snap` progress,
|
|
543
|
+
* remaps it into its own stagger window (`snapFrom`..`snapTo`), and applies
|
|
544
|
+
* the chosen behaviour with pure CSS `calc()` interpolation — so the motion
|
|
545
|
+
* is scrubbed by scrolling, not played on a clock.
|
|
546
|
+
*
|
|
547
|
+
* A fully elapsed region is `visibility: hidden` and therefore leaves the
|
|
548
|
+
* accessibility tree and the tab order — except while it holds focus, when it
|
|
549
|
+
* reveals itself instead (`mlv-page-snap--revealed`) so that scrolling can
|
|
550
|
+
* never blur a focused control into `<body>`. See {@link MlvPageSnapRegionBase}.
|
|
551
|
+
*
|
|
552
|
+
* ```html
|
|
553
|
+
* <div mlvPageSnap="hide" [snapFrom]="0.2" [snapTo]="0.7" snapSize="3rem">…</div>
|
|
554
|
+
* ```
|
|
555
|
+
*/
|
|
556
|
+
class MlvPageSnap extends MlvPageSnapRegionBase {
|
|
557
|
+
/** Behaviour on the snap timeline. An empty attribute value means `hide`. */
|
|
558
|
+
mlvPageSnap = input('', /* @ts-ignore */
|
|
559
|
+
...(ngDevMode ? [{ debugName: "mlvPageSnap" }] : /* istanbul ignore next */ []));
|
|
560
|
+
/** Progress at which this element starts reacting (0..1). */
|
|
561
|
+
snapFrom = input(0, /* @ts-ignore */
|
|
562
|
+
...(ngDevMode ? [{ debugName: "snapFrom" }] : /* istanbul ignore next */ []));
|
|
563
|
+
/** Progress at which this element reaches its final state (0..1). */
|
|
564
|
+
snapTo = input(1, /* @ts-ignore */
|
|
565
|
+
...(ngDevMode ? [{ debugName: "snapTo" }] : /* istanbul ignore next */ []));
|
|
566
|
+
/**
|
|
567
|
+
* Nominal expanded size used by the `hide` behaviour's height scrub.
|
|
568
|
+
* Must be at least the element's natural height.
|
|
569
|
+
*/
|
|
570
|
+
snapSize = input('3rem', /* @ts-ignore */
|
|
571
|
+
...(ngDevMode ? [{ debugName: "snapSize" }] : /* istanbul ignore next */ []));
|
|
572
|
+
/** @protected Effective behaviour; the bare attribute defaults to `hide`. */
|
|
573
|
+
_mode = computed(() => this.mlvPageSnap() || 'hide', /* @ts-ignore */
|
|
574
|
+
...(ngDevMode ? [{ debugName: "_mode" }] : /* istanbul ignore next */ []));
|
|
575
|
+
/** @protected Multiplier remapping page progress into the stagger window. */
|
|
576
|
+
_scale = computed(() => 1 / Math.max(this.snapTo() - this.snapFrom(), 0.001), /* @ts-ignore */
|
|
577
|
+
...(ngDevMode ? [{ debugName: "_scale" }] : /* istanbul ignore next */ []));
|
|
578
|
+
/**
|
|
579
|
+
* @protected Fully elapsed once the page progress passes this element's
|
|
580
|
+
* `snapTo`; a `keep` element never elapses.
|
|
581
|
+
*/
|
|
582
|
+
_elapsed = computed(() => this._mode() !== 'keep' &&
|
|
583
|
+
(this._snapController?.progress() ?? 0) >= Math.min(this.snapTo(), 1), /* @ts-ignore */
|
|
584
|
+
...(ngDevMode ? [{ debugName: "_elapsed" }] : /* istanbul ignore next */ []));
|
|
585
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnap, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
586
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MlvPageSnap, isStandalone: true, selector: "[mlvPageSnap]", inputs: { mlvPageSnap: { classPropertyName: "mlvPageSnap", publicName: "mlvPageSnap", isSignal: true, isRequired: false, transformFunction: null }, snapFrom: { classPropertyName: "snapFrom", publicName: "snapFrom", isSignal: true, isRequired: false, transformFunction: null }, snapTo: { classPropertyName: "snapTo", publicName: "snapTo", isSignal: true, isRequired: false, transformFunction: null }, snapSize: { classPropertyName: "snapSize", publicName: "snapSize", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "_onRegionFocusIn()", "focusout": "_onRegionFocusOut($event)" }, properties: { "class.mlv-page-snap--hide": "_mode() === \"hide\"", "class.mlv-page-snap--fade": "_mode() === \"fade\"", "class.mlv-page-snap--revealed": "_revealed()", "style.--mlv-snap-from": "snapFrom()", "style.--mlv-snap-scale": "_scale()", "style.--mlv-snap-size": "snapSize()", "style.visibility": "_hidden() ? \"hidden\" : null" } }, usesInheritance: true, ngImport: i0 });
|
|
587
|
+
}
|
|
588
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSnap, decorators: [{
|
|
589
|
+
type: Directive,
|
|
590
|
+
args: [{
|
|
591
|
+
selector: '[mlvPageSnap]',
|
|
592
|
+
host: {
|
|
593
|
+
'[class.mlv-page-snap--hide]': '_mode() === "hide"',
|
|
594
|
+
'[class.mlv-page-snap--fade]': '_mode() === "fade"',
|
|
595
|
+
'[class.mlv-page-snap--revealed]': '_revealed()',
|
|
596
|
+
'[style.--mlv-snap-from]': 'snapFrom()',
|
|
597
|
+
'[style.--mlv-snap-scale]': '_scale()',
|
|
598
|
+
'[style.--mlv-snap-size]': 'snapSize()',
|
|
599
|
+
'[style.visibility]': '_hidden() ? "hidden" : null',
|
|
600
|
+
'(focusin)': '_onRegionFocusIn()',
|
|
601
|
+
'(focusout)': '_onRegionFocusOut($event)',
|
|
602
|
+
},
|
|
603
|
+
}]
|
|
604
|
+
}], propDecorators: { mlvPageSnap: [{ type: i0.Input, args: [{ isSignal: true, alias: "mlvPageSnap", required: false }] }], snapFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapFrom", required: false }] }], snapTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapTo", required: false }] }], snapSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapSize", required: false }] }] } });
|
|
605
|
+
|
|
606
|
+
/** Opaque black, used as one endpoint for automatic contrast. */
|
|
607
|
+
const BLACK = { red: 0, green: 0, blue: 0, alpha: 1 };
|
|
608
|
+
/** Opaque white, used as one endpoint for automatic contrast. */
|
|
609
|
+
const WHITE = {
|
|
610
|
+
red: 255,
|
|
611
|
+
green: 255,
|
|
612
|
+
blue: 255,
|
|
613
|
+
alpha: 1,
|
|
614
|
+
};
|
|
615
|
+
/**
|
|
616
|
+
* Parses an RGB value emitted by the browser CSSOM.
|
|
617
|
+
*
|
|
618
|
+
* @param value Computed `rgb(...)` or `rgba(...)` string.
|
|
619
|
+
* @returns The normalized color, or `null` when the value is not parseable.
|
|
620
|
+
*/
|
|
621
|
+
function parseComputedColor(value) {
|
|
622
|
+
const normalized = value.trim().toLowerCase();
|
|
623
|
+
if (normalized === 'transparent') {
|
|
624
|
+
return { red: 0, green: 0, blue: 0, alpha: 0 };
|
|
625
|
+
}
|
|
626
|
+
const match = /^rgba?\((.*)\)$/i.exec(normalized);
|
|
627
|
+
if (!match) {
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
const body = match[1].trim();
|
|
631
|
+
const commaSeparated = body.includes(',');
|
|
632
|
+
let channelValues;
|
|
633
|
+
let alphaValue;
|
|
634
|
+
if (commaSeparated) {
|
|
635
|
+
const parts = body.split(',').map((part) => part.trim());
|
|
636
|
+
if (parts.length !== 3 && parts.length !== 4) {
|
|
637
|
+
return null;
|
|
638
|
+
}
|
|
639
|
+
channelValues = parts.slice(0, 3);
|
|
640
|
+
alphaValue = parts[3];
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
const slashParts = body.split('/').map((part) => part.trim());
|
|
644
|
+
if (slashParts.length > 2) {
|
|
645
|
+
return null;
|
|
646
|
+
}
|
|
647
|
+
channelValues = slashParts[0].split(/\s+/);
|
|
648
|
+
alphaValue = slashParts[1];
|
|
649
|
+
}
|
|
650
|
+
if (channelValues.length !== 3) {
|
|
651
|
+
return null;
|
|
652
|
+
}
|
|
653
|
+
const channels = channelValues.map(_parseChannel);
|
|
654
|
+
const alpha = alphaValue === undefined ? 1 : _parseAlpha(alphaValue);
|
|
655
|
+
if (channels.some((channel) => channel === null) || alpha === null) {
|
|
656
|
+
return null;
|
|
657
|
+
}
|
|
658
|
+
return {
|
|
659
|
+
red: channels[0],
|
|
660
|
+
green: channels[1],
|
|
661
|
+
blue: channels[2],
|
|
662
|
+
alpha,
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Composites one sRGB color over another using source-over alpha blending.
|
|
667
|
+
*
|
|
668
|
+
* @param foreground Color painted above the background.
|
|
669
|
+
* @param background Color painted below the foreground.
|
|
670
|
+
* @returns The effective blended color.
|
|
671
|
+
*/
|
|
672
|
+
function compositeColors(foreground, background) {
|
|
673
|
+
const alpha = foreground.alpha + background.alpha * (1 - foreground.alpha);
|
|
674
|
+
if (alpha === 0) {
|
|
675
|
+
return { red: 0, green: 0, blue: 0, alpha: 0 };
|
|
676
|
+
}
|
|
677
|
+
return {
|
|
678
|
+
red: _compositeChannel(foreground.red, background.red, foreground.alpha, background.alpha, alpha),
|
|
679
|
+
green: _compositeChannel(foreground.green, background.green, foreground.alpha, background.alpha, alpha),
|
|
680
|
+
blue: _compositeChannel(foreground.blue, background.blue, foreground.alpha, background.alpha, alpha),
|
|
681
|
+
alpha,
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Serializes a normalized color to modern CSS RGB syntax.
|
|
686
|
+
*
|
|
687
|
+
* @param color Color to serialize.
|
|
688
|
+
* @returns A CSS `rgb(...)` value.
|
|
689
|
+
*/
|
|
690
|
+
function toCssColor(color) {
|
|
691
|
+
const channels = [color.red, color.green, color.blue]
|
|
692
|
+
.map(_formatNumber)
|
|
693
|
+
.join(', ');
|
|
694
|
+
if (color.alpha >= 1) {
|
|
695
|
+
return `rgb(${channels})`;
|
|
696
|
+
}
|
|
697
|
+
return `rgba(${channels}, ${_formatNumber(color.alpha)})`;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Computes the WCAG contrast ratio between two opaque effective colors.
|
|
701
|
+
*
|
|
702
|
+
* @param first First effective color.
|
|
703
|
+
* @param second Second effective color.
|
|
704
|
+
* @returns Contrast ratio in the inclusive range 1–21.
|
|
705
|
+
*/
|
|
706
|
+
function contrastRatio(first, second) {
|
|
707
|
+
const firstLuminance = _relativeLuminance(first);
|
|
708
|
+
const secondLuminance = _relativeLuminance(second);
|
|
709
|
+
const lighter = Math.max(firstLuminance, secondLuminance);
|
|
710
|
+
const darker = Math.min(firstLuminance, secondLuminance);
|
|
711
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Selects the black or white endpoint with the strongest WCAG contrast.
|
|
715
|
+
*
|
|
716
|
+
* @param background Opaque effective background color.
|
|
717
|
+
* @returns An opaque CSS black or white value.
|
|
718
|
+
*/
|
|
719
|
+
function chooseContrastForeground(background) {
|
|
720
|
+
return contrastRatio(background, BLACK) >= contrastRatio(background, WHITE)
|
|
721
|
+
? 'rgb(0, 0, 0)'
|
|
722
|
+
: 'rgb(255, 255, 255)';
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Parses an RGB channel expressed as a number or percentage.
|
|
726
|
+
*
|
|
727
|
+
* @param value Serialized channel.
|
|
728
|
+
* @returns A channel in the range 0–255, or `null` when invalid.
|
|
729
|
+
*/
|
|
730
|
+
function _parseChannel(value) {
|
|
731
|
+
const isPercentage = value.endsWith('%');
|
|
732
|
+
const parsed = Number(isPercentage ? value.slice(0, -1) : value);
|
|
733
|
+
const channel = isPercentage ? (parsed / 100) * 255 : parsed;
|
|
734
|
+
return Number.isFinite(channel) && channel >= 0 && channel <= 255
|
|
735
|
+
? channel
|
|
736
|
+
: null;
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Parses an alpha channel expressed as a number or percentage.
|
|
740
|
+
*
|
|
741
|
+
* @param value Serialized alpha channel.
|
|
742
|
+
* @returns A channel in the range 0–1, or `null` when invalid.
|
|
743
|
+
*/
|
|
744
|
+
function _parseAlpha(value) {
|
|
745
|
+
const isPercentage = value.endsWith('%');
|
|
746
|
+
const parsed = Number(isPercentage ? value.slice(0, -1) : value);
|
|
747
|
+
const alpha = isPercentage ? parsed / 100 : parsed;
|
|
748
|
+
return Number.isFinite(alpha) && alpha >= 0 && alpha <= 1 ? alpha : null;
|
|
749
|
+
}
|
|
750
|
+
/**
|
|
751
|
+
* Blends one channel using source-over alpha compositing.
|
|
752
|
+
*
|
|
753
|
+
* @param foreground Foreground channel.
|
|
754
|
+
* @param background Background channel.
|
|
755
|
+
* @param foregroundAlpha Foreground alpha.
|
|
756
|
+
* @param backgroundAlpha Background alpha.
|
|
757
|
+
* @param outputAlpha Resulting alpha.
|
|
758
|
+
* @returns Blended channel.
|
|
759
|
+
*/
|
|
760
|
+
function _compositeChannel(foreground, background, foregroundAlpha, backgroundAlpha, outputAlpha) {
|
|
761
|
+
return ((foreground * foregroundAlpha +
|
|
762
|
+
background * backgroundAlpha * (1 - foregroundAlpha)) /
|
|
763
|
+
outputAlpha);
|
|
764
|
+
}
|
|
765
|
+
/**
|
|
766
|
+
* Computes WCAG relative luminance for an sRGB color.
|
|
767
|
+
*
|
|
768
|
+
* @param color Effective color.
|
|
769
|
+
* @returns Relative luminance in the range 0–1.
|
|
770
|
+
*/
|
|
771
|
+
function _relativeLuminance(color) {
|
|
772
|
+
const red = _linearizeChannel(color.red);
|
|
773
|
+
const green = _linearizeChannel(color.green);
|
|
774
|
+
const blue = _linearizeChannel(color.blue);
|
|
775
|
+
return 0.2126 * red + 0.7152 * green + 0.0722 * blue;
|
|
776
|
+
}
|
|
777
|
+
/**
|
|
778
|
+
* Converts an sRGB channel to linear light for luminance calculation.
|
|
779
|
+
*
|
|
780
|
+
* @param channel Channel in the range 0–255.
|
|
781
|
+
* @returns Linearized channel in the range 0–1.
|
|
782
|
+
*/
|
|
783
|
+
function _linearizeChannel(channel) {
|
|
784
|
+
const normalized = channel / 255;
|
|
785
|
+
return normalized <= 0.04045
|
|
786
|
+
? normalized / 12.92
|
|
787
|
+
: ((normalized + 0.055) / 1.055) ** 2.4;
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Produces a compact, stable decimal for CSS serialization.
|
|
791
|
+
*
|
|
792
|
+
* @param value Numeric value.
|
|
793
|
+
* @returns Rounded decimal without trailing zeroes.
|
|
794
|
+
*/
|
|
795
|
+
function _formatNumber(value) {
|
|
796
|
+
return String(Math.round(value * 1000) / 1000);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
/** Stable opaque base matching the default page-shell chrome background. */
|
|
800
|
+
const DEFAULT_SHELL_BACKGROUND = {
|
|
801
|
+
red: 23,
|
|
802
|
+
green: 23,
|
|
803
|
+
blue: 23,
|
|
804
|
+
alpha: 1,
|
|
805
|
+
};
|
|
806
|
+
/**
|
|
807
|
+
* Resolves a CSS color in an element's actual inheritance context.
|
|
808
|
+
* Two inherited sentinel colors distinguish a valid result from an unresolved
|
|
809
|
+
* value that silently falls back to `inherit`.
|
|
810
|
+
*
|
|
811
|
+
* @param host Element whose cascade resolves custom properties.
|
|
812
|
+
* @param value Candidate CSS color.
|
|
813
|
+
* @returns Browser-resolved sRGB channels, or `null` when unresolved.
|
|
814
|
+
*/
|
|
815
|
+
function resolveCssColor(host, value) {
|
|
816
|
+
const rawCandidate = value?.trim();
|
|
817
|
+
if (!rawCandidate ||
|
|
818
|
+
/^(currentcolor|inherit|initial|unset|revert|revert-layer)$/i.test(rawCandidate)) {
|
|
819
|
+
return null;
|
|
820
|
+
}
|
|
821
|
+
const view = host.ownerDocument.defaultView;
|
|
822
|
+
if (!view) {
|
|
823
|
+
return null;
|
|
824
|
+
}
|
|
825
|
+
const candidate = _resolveCustomProperties(host, rawCandidate);
|
|
826
|
+
if (!candidate) {
|
|
827
|
+
return null;
|
|
828
|
+
}
|
|
829
|
+
const first = _createColorProbe(host, 'rgb(1, 2, 3)', candidate);
|
|
830
|
+
const second = _createColorProbe(host, 'rgb(4, 5, 6)', candidate);
|
|
831
|
+
host.append(first.wrapper, second.wrapper);
|
|
832
|
+
const firstColor = parseComputedColor(view.getComputedStyle(first.probe).color);
|
|
833
|
+
const secondColor = parseComputedColor(view.getComputedStyle(second.probe).color);
|
|
834
|
+
first.wrapper.remove();
|
|
835
|
+
second.wrapper.remove();
|
|
836
|
+
return firstColor && secondColor && _colorsEqual(firstColor, secondColor)
|
|
837
|
+
? firstColor
|
|
838
|
+
: null;
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* Resolves the visible backdrop beneath a translucent shell color.
|
|
842
|
+
* Ancestor backgrounds are composited from nearest to farthest before the
|
|
843
|
+
* stable shell default is used as the final opaque base.
|
|
844
|
+
*
|
|
845
|
+
* @param host Shell whose ancestor cascade supplies the backdrop.
|
|
846
|
+
* @returns Opaque effective backdrop.
|
|
847
|
+
*/
|
|
848
|
+
function resolveBackdropBackground(host) {
|
|
849
|
+
const view = host.ownerDocument.defaultView;
|
|
850
|
+
let backdrop = {
|
|
851
|
+
red: 0,
|
|
852
|
+
green: 0,
|
|
853
|
+
blue: 0,
|
|
854
|
+
alpha: 0,
|
|
855
|
+
};
|
|
856
|
+
let current = host.parentElement;
|
|
857
|
+
while (view && current) {
|
|
858
|
+
const ancestorBackground = parseComputedColor(view.getComputedStyle(current).backgroundColor);
|
|
859
|
+
if (ancestorBackground) {
|
|
860
|
+
backdrop = compositeColors(backdrop, ancestorBackground);
|
|
861
|
+
if (backdrop.alpha >= 1) {
|
|
862
|
+
return backdrop;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
current = current.parentElement;
|
|
866
|
+
}
|
|
867
|
+
const fallback = resolveCssColor(host, 'var(--mlv-palette-neutral-900)') ??
|
|
868
|
+
DEFAULT_SHELL_BACKGROUND;
|
|
869
|
+
return compositeColors(backdrop, fallback);
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Resolves `var(...)` references from the host's computed cascade.
|
|
873
|
+
* The browser remains responsible for the custom-property cascade; this
|
|
874
|
+
* substitution handles CSSOM implementations that do not expand variables
|
|
875
|
+
* when serializing a computed `color` value.
|
|
876
|
+
*
|
|
877
|
+
* @param host Element whose cascade owns the custom properties.
|
|
878
|
+
* @param value CSS value that may contain custom-property references.
|
|
879
|
+
* @param seen Custom properties currently being expanded, for cycle safety.
|
|
880
|
+
* @param depth Expansion depth guard.
|
|
881
|
+
* @returns Value with variables substituted, or `null` when unresolved.
|
|
882
|
+
*/
|
|
883
|
+
function _resolveCustomProperties(host, value, seen = new Set(), depth = 0) {
|
|
884
|
+
if (depth > 16) {
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
const range = _findFirstVarFunction(value);
|
|
888
|
+
if (!range) {
|
|
889
|
+
return value;
|
|
890
|
+
}
|
|
891
|
+
const content = value.slice(range.contentStart, range.contentEnd);
|
|
892
|
+
const [namePart, fallback] = _splitCustomPropertyArguments(content);
|
|
893
|
+
const name = namePart.trim();
|
|
894
|
+
if (!/^--[a-z0-9_-]+$/i.test(name)) {
|
|
895
|
+
return null;
|
|
896
|
+
}
|
|
897
|
+
const view = host.ownerDocument.defaultView;
|
|
898
|
+
let replacement = view?.getComputedStyle(host).getPropertyValue(name).trim() ?? '';
|
|
899
|
+
if (!replacement || seen.has(name)) {
|
|
900
|
+
replacement = fallback?.trim() ?? '';
|
|
901
|
+
}
|
|
902
|
+
if (!replacement) {
|
|
903
|
+
return null;
|
|
904
|
+
}
|
|
905
|
+
const nextSeen = new Set(seen);
|
|
906
|
+
nextSeen.add(name);
|
|
907
|
+
const resolvedReplacement = _resolveCustomProperties(host, replacement, nextSeen, depth + 1);
|
|
908
|
+
if (!resolvedReplacement) {
|
|
909
|
+
if (!fallback) {
|
|
910
|
+
return null;
|
|
911
|
+
}
|
|
912
|
+
const resolvedFallback = _resolveCustomProperties(host, fallback.trim(), seen, depth + 1);
|
|
913
|
+
if (!resolvedFallback) {
|
|
914
|
+
return null;
|
|
915
|
+
}
|
|
916
|
+
return _resolveCustomProperties(host, `${value.slice(0, range.start)}${resolvedFallback}${value.slice(range.end)}`, seen, depth + 1);
|
|
917
|
+
}
|
|
918
|
+
return _resolveCustomProperties(host, `${value.slice(0, range.start)}${resolvedReplacement}${value.slice(range.end)}`, seen, depth + 1);
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Locates the first balanced CSS `var(...)` function.
|
|
922
|
+
*
|
|
923
|
+
* @param value CSS value to scan.
|
|
924
|
+
* @returns Function and content offsets, or `null` when absent/malformed.
|
|
925
|
+
*/
|
|
926
|
+
function _findFirstVarFunction(value) {
|
|
927
|
+
const start = value.toLowerCase().indexOf('var(');
|
|
928
|
+
if (start < 0) {
|
|
929
|
+
return null;
|
|
930
|
+
}
|
|
931
|
+
let parentheses = 1;
|
|
932
|
+
for (let index = start + 4; index < value.length; index++) {
|
|
933
|
+
if (value[index] === '(') {
|
|
934
|
+
parentheses++;
|
|
935
|
+
}
|
|
936
|
+
else if (value[index] === ')') {
|
|
937
|
+
parentheses--;
|
|
938
|
+
if (parentheses === 0) {
|
|
939
|
+
return {
|
|
940
|
+
start,
|
|
941
|
+
end: index + 1,
|
|
942
|
+
contentStart: start + 4,
|
|
943
|
+
contentEnd: index,
|
|
944
|
+
};
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
return null;
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* Splits a custom-property name from its optional top-level fallback.
|
|
952
|
+
*
|
|
953
|
+
* @param content Contents of a `var(...)` function.
|
|
954
|
+
* @returns Name and optional fallback.
|
|
955
|
+
*/
|
|
956
|
+
function _splitCustomPropertyArguments(content) {
|
|
957
|
+
let parentheses = 0;
|
|
958
|
+
for (let index = 0; index < content.length; index++) {
|
|
959
|
+
if (content[index] === '(') {
|
|
960
|
+
parentheses++;
|
|
961
|
+
}
|
|
962
|
+
else if (content[index] === ')') {
|
|
963
|
+
parentheses--;
|
|
964
|
+
}
|
|
965
|
+
else if (content[index] === ',' && parentheses === 0) {
|
|
966
|
+
return [content.slice(0, index), content.slice(index + 1)];
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
return [content, undefined];
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Creates a hidden color probe and its sentinel-colored wrapper.
|
|
973
|
+
*
|
|
974
|
+
* @param host Element whose document creates the probes.
|
|
975
|
+
* @param sentinel Inherited color used to detect unresolved candidates.
|
|
976
|
+
* @param candidate Candidate assigned to the probe.
|
|
977
|
+
* @returns Wrapper and probe elements.
|
|
978
|
+
*/
|
|
979
|
+
function _createColorProbe(host, sentinel, candidate) {
|
|
980
|
+
const document = host.ownerDocument;
|
|
981
|
+
const wrapper = document.createElement('span');
|
|
982
|
+
const probe = document.createElement('span');
|
|
983
|
+
wrapper.setAttribute('aria-hidden', 'true');
|
|
984
|
+
wrapper.style.cssText =
|
|
985
|
+
`position:fixed;inline-size:0;block-size:0;overflow:hidden;` +
|
|
986
|
+
`visibility:hidden;pointer-events:none;color:${sentinel}`;
|
|
987
|
+
probe.style.color = candidate;
|
|
988
|
+
wrapper.append(probe);
|
|
989
|
+
return { wrapper, probe };
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Compares two normalized colors exactly as emitted by CSSOM.
|
|
993
|
+
*
|
|
994
|
+
* @param first First resolved color.
|
|
995
|
+
* @param second Second resolved color.
|
|
996
|
+
* @returns Whether all four channels match.
|
|
997
|
+
*/
|
|
998
|
+
function _colorsEqual(first, second) {
|
|
999
|
+
return (first.red === second.red &&
|
|
1000
|
+
first.green === second.green &&
|
|
1001
|
+
first.blue === second.blue &&
|
|
1002
|
+
first.alpha === second.alpha);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
/**
|
|
1006
|
+
* Application-page shell that joins global top navigation, one or two sidebars,
|
|
1007
|
+
* and the Page canvas without taking ownership of their component behaviour.
|
|
1008
|
+
*/
|
|
1009
|
+
class MlvPageShell {
|
|
1010
|
+
/**
|
|
1011
|
+
* Optional CSS color for the shell chrome background.
|
|
1012
|
+
* Browser-resolved values such as `var(--brand-color)` are supported.
|
|
1013
|
+
*/
|
|
1014
|
+
color = input(null, /* @ts-ignore */
|
|
1015
|
+
...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
1016
|
+
/**
|
|
1017
|
+
* Optional CSS color overriding the automatically selected chrome foreground.
|
|
1018
|
+
*/
|
|
1019
|
+
foreground = input(null, /* @ts-ignore */
|
|
1020
|
+
...(ngDevMode ? [{ debugName: "foreground" }] : /* istanbul ignore next */ []));
|
|
1021
|
+
/** @protected Browser-resolved background applied through the host style. */
|
|
1022
|
+
_resolvedBackground = signal(null, /* @ts-ignore */
|
|
1023
|
+
...(ngDevMode ? [{ debugName: "_resolvedBackground" }] : /* istanbul ignore next */ []));
|
|
1024
|
+
/** @protected Browser-resolved foreground applied through the host style. */
|
|
1025
|
+
_resolvedForeground = signal(null, /* @ts-ignore */
|
|
1026
|
+
...(ngDevMode ? [{ debugName: "_resolvedForeground" }] : /* istanbul ignore next */ []));
|
|
1027
|
+
/** @private Native shell host used as the CSS inheritance context. */
|
|
1028
|
+
_host = inject(ElementRef);
|
|
1029
|
+
/** @private Angular destruction hook for frame and observer cleanup. */
|
|
1030
|
+
_destroyRef = inject(DestroyRef);
|
|
1031
|
+
/** @private Identifier of the pending color-resolution animation frame. */
|
|
1032
|
+
_resolutionFrameId = null;
|
|
1033
|
+
/** @private Watches theme and custom-property changes in the shell cascade. */
|
|
1034
|
+
_mutationObserver = null;
|
|
1035
|
+
constructor() {
|
|
1036
|
+
afterRenderEffect(() => {
|
|
1037
|
+
this.color();
|
|
1038
|
+
this.foreground();
|
|
1039
|
+
this._startColorObservation();
|
|
1040
|
+
this._scheduleColorResolution();
|
|
1041
|
+
});
|
|
1042
|
+
this._destroyRef.onDestroy(() => {
|
|
1043
|
+
this._mutationObserver?.disconnect();
|
|
1044
|
+
const view = this._host.nativeElement.ownerDocument.defaultView;
|
|
1045
|
+
if (this._resolutionFrameId !== null && view) {
|
|
1046
|
+
view.cancelAnimationFrame(this._resolutionFrameId);
|
|
1047
|
+
}
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
/**
|
|
1051
|
+
* @private Observes the shell and its ancestors for cascade-affecting
|
|
1052
|
+
* attribute changes. One observer can watch every node in the chain.
|
|
1053
|
+
*/
|
|
1054
|
+
_startColorObservation() {
|
|
1055
|
+
if (this._mutationObserver) {
|
|
1056
|
+
return;
|
|
1057
|
+
}
|
|
1058
|
+
const host = this._host.nativeElement;
|
|
1059
|
+
const view = host.ownerDocument.defaultView;
|
|
1060
|
+
if (!view || typeof view.MutationObserver === 'undefined') {
|
|
1061
|
+
return;
|
|
1062
|
+
}
|
|
1063
|
+
this._mutationObserver = new view.MutationObserver(() => {
|
|
1064
|
+
this._scheduleColorResolution();
|
|
1065
|
+
});
|
|
1066
|
+
let current = host;
|
|
1067
|
+
while (current) {
|
|
1068
|
+
this._mutationObserver.observe(current, {
|
|
1069
|
+
attributes: true,
|
|
1070
|
+
attributeFilter: [
|
|
1071
|
+
'class',
|
|
1072
|
+
'style',
|
|
1073
|
+
'mlvtheme',
|
|
1074
|
+
'mlvTheme',
|
|
1075
|
+
'data-theme',
|
|
1076
|
+
],
|
|
1077
|
+
});
|
|
1078
|
+
current = current.parentElement;
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* @private Coalesces CSS reads and signal writes into the next render frame.
|
|
1083
|
+
*/
|
|
1084
|
+
_scheduleColorResolution() {
|
|
1085
|
+
if (this._resolutionFrameId !== null) {
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
const view = this._host.nativeElement.ownerDocument.defaultView;
|
|
1089
|
+
if (!view) {
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
this._resolutionFrameId = view.requestAnimationFrame(() => {
|
|
1093
|
+
this._resolutionFrameId = null;
|
|
1094
|
+
this._resolveColors();
|
|
1095
|
+
});
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* @private Resolves the input colors and updates the internal host variables.
|
|
1099
|
+
*/
|
|
1100
|
+
_resolveColors() {
|
|
1101
|
+
const host = this._host.nativeElement;
|
|
1102
|
+
const background = resolveCssColor(host, this.color());
|
|
1103
|
+
const explicitForeground = resolveCssColor(host, this.foreground());
|
|
1104
|
+
this._resolvedBackground.set(background ? toCssColor(background) : null);
|
|
1105
|
+
if (explicitForeground) {
|
|
1106
|
+
this._resolvedForeground.set(toCssColor(explicitForeground));
|
|
1107
|
+
return;
|
|
1108
|
+
}
|
|
1109
|
+
if (!background) {
|
|
1110
|
+
this._resolvedForeground.set(null);
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
const effectiveBackground = background.alpha < 1
|
|
1114
|
+
? compositeColors(background, resolveBackdropBackground(host))
|
|
1115
|
+
: background;
|
|
1116
|
+
this._resolvedForeground.set(chooseContrastForeground(effectiveBackground));
|
|
1117
|
+
}
|
|
1118
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageShell, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1119
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MlvPageShell, isStandalone: true, selector: "mlv-page-shell", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, foreground: { classPropertyName: "foreground", publicName: "foreground", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--mlv-page-shell-resolved-background": "_resolvedBackground()", "style.--mlv-page-shell-resolved-foreground": "_resolvedForeground()", "style.background": "_resolvedBackground()", "style.color": "_resolvedForeground()" }, classAttribute: "mlv-page-shell" }, ngImport: i0, template: "<ng-content select=\"[mlvPageTopbar]\" />\n<div class=\"mlv-page-shell__body\">\n <ng-content select=\"[mlvPageSidebar]\" />\n <div class=\"mlv-page-shell__content\"><ng-content /></div>\n <ng-content select=\"[mlvPageEndSidebar], mlv-page-end-pane\" />\n</div>\n", styles: ["@layer mlv.components{.mlv-page-shell{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-shell *{box-sizing:border-box}.mlv-page-shell{--mlv-page-shell-chrome-background: var(--mlv-palette-neutral-900);--mlv-page-shell-chrome-foreground: var(--mlv-palette-neutral-50);--mlv-page-shell-effective-background: var( --mlv-page-shell-resolved-background, var(--mlv-page-shell-chrome-background) );--mlv-page-shell-effective-foreground: var( --mlv-page-shell-resolved-foreground, var(--mlv-page-shell-chrome-foreground) );display:flex;flex-direction:column;width:100%;min-width:0;min-height:0;overflow:hidden;background:var(--mlv-page-shell-effective-background);color:var(--mlv-page-shell-effective-foreground)}.mlv-page-shell__topbar{flex:0 0 auto}.mlv-page-shell__topbar.mlv-action-bar{--mlv-action-bar-bg: var(--mlv-page-shell-effective-background);--mlv-action-bar-fg: var(--mlv-page-shell-effective-foreground);--mlv-action-bar-border: transparent;--mlv-action-bar-shadow: none;min-height:3.25rem;background:var(--mlv-page-shell-effective-background);-webkit-backdrop-filter:none;backdrop-filter:none}.mlv-page-shell__body{display:flex;flex:1 1 auto;min-width:0;min-height:0}.mlv-page-shell__body>[mlvPageSidebar]{flex:0 0 auto;min-width:0}.mlv-page-shell__body>[mlvPageSidebar]+[mlvPageSidebar]{border-inline-start:var(--mlv-stroke-width) solid color-mix(in srgb,var(--mlv-page-shell-effective-foreground) 16%,var(--mlv-page-shell-effective-background))}.mlv-page-shell__body>[mlvPageEndSidebar],.mlv-page-shell__body>mlv-page-end-pane{flex:0 0 auto;min-width:0}.mlv-page-shell__content{display:flex;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.mlv-page-shell__content>.mlv-page{height:100%}.mlv-page-shell__sidebar{flex:0 0 auto;min-height:0}.mlv-page-shell__topbar .mlv-form-control-wrapper,.mlv-page-shell__sidebar .mlv-form-control-wrapper{--container-background-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 10%, var(--mlv-page-shell-effective-background) );--container-border-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 30%, var(--mlv-page-shell-effective-background) );--container-side-content-color: var( --mlv-page-shell-effective-foreground );--container-action-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 78%, var(--mlv-page-shell-effective-background) );--mlv-text-primary: var(--mlv-page-shell-effective-foreground);--mlv-text-secondary: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 78%, var(--mlv-page-shell-effective-background) );--mlv-text-tertiary: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 60%, var(--mlv-page-shell-effective-background) );--mlv-border-focus: var(--mlv-page-shell-effective-foreground)}.mlv-page-shell__topbar .mlv-form-control-wrapper.mlv-form-control-wrapper--state-default:hover,.mlv-page-shell__sidebar .mlv-form-control-wrapper.mlv-form-control-wrapper--state-default:hover{--container-border-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 40%, var(--mlv-page-shell-effective-background) )}.mlv-page-shell__topbar .mlv-form-control-wrapper.mlv-form-control-wrapper--focused,.mlv-page-shell__sidebar .mlv-form-control-wrapper.mlv-form-control-wrapper--focused{--container-border-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 50%, var(--mlv-page-shell-effective-background) )}.mlv-page-shell__sidebar.mlv-sidebar--offcanvas{width:0;min-width:0;overflow:visible}.mlv-page-shell__sidebar.mlv-sidebar{--mlv-sidebar-border-width: 0rem;--mlv-text-secondary: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 78%, var(--mlv-page-shell-effective-background) );--mlv-text-primary: var(--mlv-page-shell-effective-foreground);--mlv-text-action: var(--mlv-page-shell-effective-foreground);--mlv-background-neutral-1: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );--mlv-background-neutral-1-hover: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );--mlv-background-neutral-1-active: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 12%, var(--mlv-page-shell-effective-background) );--mlv-border-focus: var(--mlv-page-shell-effective-foreground);--mlv-sidebar-hover-bg: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );--mlv-sidebar-active-bg: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 12%, var(--mlv-page-shell-effective-background) );--mlv-sidebar-rail-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 24%, var(--mlv-page-shell-effective-background) );--mlv-text-on-selected: var(--mlv-page-shell-effective-foreground);--mlv-background-selected: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 12%, var(--mlv-page-shell-effective-background) );--mlv-background-selected-hover: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );height:100%;border:0;border-radius:0;box-shadow:none;background:transparent}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1120
|
+
}
|
|
1121
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageShell, decorators: [{
|
|
1122
|
+
type: Component,
|
|
1123
|
+
args: [{ selector: 'mlv-page-shell', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1124
|
+
class: 'mlv-page-shell',
|
|
1125
|
+
'[style.--mlv-page-shell-resolved-background]': '_resolvedBackground()',
|
|
1126
|
+
'[style.--mlv-page-shell-resolved-foreground]': '_resolvedForeground()',
|
|
1127
|
+
'[style.background]': '_resolvedBackground()',
|
|
1128
|
+
'[style.color]': '_resolvedForeground()',
|
|
1129
|
+
}, template: "<ng-content select=\"[mlvPageTopbar]\" />\n<div class=\"mlv-page-shell__body\">\n <ng-content select=\"[mlvPageSidebar]\" />\n <div class=\"mlv-page-shell__content\"><ng-content /></div>\n <ng-content select=\"[mlvPageEndSidebar], mlv-page-end-pane\" />\n</div>\n", styles: ["@layer mlv.components{.mlv-page-shell{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-shell *{box-sizing:border-box}.mlv-page-shell{--mlv-page-shell-chrome-background: var(--mlv-palette-neutral-900);--mlv-page-shell-chrome-foreground: var(--mlv-palette-neutral-50);--mlv-page-shell-effective-background: var( --mlv-page-shell-resolved-background, var(--mlv-page-shell-chrome-background) );--mlv-page-shell-effective-foreground: var( --mlv-page-shell-resolved-foreground, var(--mlv-page-shell-chrome-foreground) );display:flex;flex-direction:column;width:100%;min-width:0;min-height:0;overflow:hidden;background:var(--mlv-page-shell-effective-background);color:var(--mlv-page-shell-effective-foreground)}.mlv-page-shell__topbar{flex:0 0 auto}.mlv-page-shell__topbar.mlv-action-bar{--mlv-action-bar-bg: var(--mlv-page-shell-effective-background);--mlv-action-bar-fg: var(--mlv-page-shell-effective-foreground);--mlv-action-bar-border: transparent;--mlv-action-bar-shadow: none;min-height:3.25rem;background:var(--mlv-page-shell-effective-background);-webkit-backdrop-filter:none;backdrop-filter:none}.mlv-page-shell__body{display:flex;flex:1 1 auto;min-width:0;min-height:0}.mlv-page-shell__body>[mlvPageSidebar]{flex:0 0 auto;min-width:0}.mlv-page-shell__body>[mlvPageSidebar]+[mlvPageSidebar]{border-inline-start:var(--mlv-stroke-width) solid color-mix(in srgb,var(--mlv-page-shell-effective-foreground) 16%,var(--mlv-page-shell-effective-background))}.mlv-page-shell__body>[mlvPageEndSidebar],.mlv-page-shell__body>mlv-page-end-pane{flex:0 0 auto;min-width:0}.mlv-page-shell__content{display:flex;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.mlv-page-shell__content>.mlv-page{height:100%}.mlv-page-shell__sidebar{flex:0 0 auto;min-height:0}.mlv-page-shell__topbar .mlv-form-control-wrapper,.mlv-page-shell__sidebar .mlv-form-control-wrapper{--container-background-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 10%, var(--mlv-page-shell-effective-background) );--container-border-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 30%, var(--mlv-page-shell-effective-background) );--container-side-content-color: var( --mlv-page-shell-effective-foreground );--container-action-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 78%, var(--mlv-page-shell-effective-background) );--mlv-text-primary: var(--mlv-page-shell-effective-foreground);--mlv-text-secondary: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 78%, var(--mlv-page-shell-effective-background) );--mlv-text-tertiary: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 60%, var(--mlv-page-shell-effective-background) );--mlv-border-focus: var(--mlv-page-shell-effective-foreground)}.mlv-page-shell__topbar .mlv-form-control-wrapper.mlv-form-control-wrapper--state-default:hover,.mlv-page-shell__sidebar .mlv-form-control-wrapper.mlv-form-control-wrapper--state-default:hover{--container-border-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 40%, var(--mlv-page-shell-effective-background) )}.mlv-page-shell__topbar .mlv-form-control-wrapper.mlv-form-control-wrapper--focused,.mlv-page-shell__sidebar .mlv-form-control-wrapper.mlv-form-control-wrapper--focused{--container-border-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 50%, var(--mlv-page-shell-effective-background) )}.mlv-page-shell__sidebar.mlv-sidebar--offcanvas{width:0;min-width:0;overflow:visible}.mlv-page-shell__sidebar.mlv-sidebar{--mlv-sidebar-border-width: 0rem;--mlv-text-secondary: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 78%, var(--mlv-page-shell-effective-background) );--mlv-text-primary: var(--mlv-page-shell-effective-foreground);--mlv-text-action: var(--mlv-page-shell-effective-foreground);--mlv-background-neutral-1: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );--mlv-background-neutral-1-hover: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );--mlv-background-neutral-1-active: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 12%, var(--mlv-page-shell-effective-background) );--mlv-border-focus: var(--mlv-page-shell-effective-foreground);--mlv-sidebar-hover-bg: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );--mlv-sidebar-active-bg: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 12%, var(--mlv-page-shell-effective-background) );--mlv-sidebar-rail-color: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 24%, var(--mlv-page-shell-effective-background) );--mlv-text-on-selected: var(--mlv-page-shell-effective-foreground);--mlv-background-selected: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 12%, var(--mlv-page-shell-effective-background) );--mlv-background-selected-hover: color-mix( in srgb, var(--mlv-page-shell-effective-foreground) 8%, var(--mlv-page-shell-effective-background) );height:100%;border:0;border-radius:0;box-shadow:none;background:transparent}}\n"] }]
|
|
1130
|
+
}], ctorParameters: () => [], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], foreground: [{ type: i0.Input, args: [{ isSignal: true, alias: "foreground", required: false }] }] } });
|
|
1131
|
+
|
|
1132
|
+
/** Marks the global top-navigation element projected into `mlv-page-shell`. */
|
|
1133
|
+
class MlvPageTopbar {
|
|
1134
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageTopbar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1135
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageTopbar, isStandalone: true, selector: "[mlvPageTopbar]", host: { classAttribute: "mlv-page-shell__topbar" }, ngImport: i0 });
|
|
1136
|
+
}
|
|
1137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageTopbar, decorators: [{
|
|
1138
|
+
type: Directive,
|
|
1139
|
+
args: [{
|
|
1140
|
+
selector: '[mlvPageTopbar]',
|
|
1141
|
+
host: { class: 'mlv-page-shell__topbar' },
|
|
1142
|
+
}]
|
|
1143
|
+
}] });
|
|
1144
|
+
/** Marks the primary navigation sidebar projected into `mlv-page-shell`. */
|
|
1145
|
+
class MlvPageSidebar {
|
|
1146
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSidebar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1147
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageSidebar, isStandalone: true, selector: "[mlvPageSidebar]", host: { classAttribute: "mlv-page-shell__sidebar" }, ngImport: i0 });
|
|
1148
|
+
}
|
|
1149
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSidebar, decorators: [{
|
|
1150
|
+
type: Directive,
|
|
1151
|
+
args: [{
|
|
1152
|
+
selector: '[mlvPageSidebar]',
|
|
1153
|
+
host: { class: 'mlv-page-shell__sidebar' },
|
|
1154
|
+
}]
|
|
1155
|
+
}] });
|
|
1156
|
+
/** Marks an optional second, trailing sidebar projected into `mlv-page-shell`. */
|
|
1157
|
+
class MlvPageEndSidebar {
|
|
1158
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndSidebar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1159
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageEndSidebar, isStandalone: true, selector: "[mlvPageEndSidebar]", host: { classAttribute: "mlv-page-shell__sidebar mlv-page-shell__sidebar--end" }, ngImport: i0 });
|
|
1160
|
+
}
|
|
1161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndSidebar, decorators: [{
|
|
1162
|
+
type: Directive,
|
|
1163
|
+
args: [{
|
|
1164
|
+
selector: '[mlvPageEndSidebar]',
|
|
1165
|
+
host: {
|
|
1166
|
+
class: 'mlv-page-shell__sidebar mlv-page-shell__sidebar--end',
|
|
1167
|
+
},
|
|
1168
|
+
}]
|
|
1169
|
+
}] });
|
|
1170
|
+
|
|
1171
|
+
/** Owns the single template rendered by a responsive Page end pane. */
|
|
1172
|
+
class MlvPageEndPaneContent {
|
|
1173
|
+
/** Template projected into either the inline aside or compact Drawer. */
|
|
1174
|
+
templateRef = inject(TemplateRef);
|
|
1175
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndPaneContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1176
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageEndPaneContent, isStandalone: true, selector: "ng-template[mlvPageEndPaneContent]", ngImport: i0 });
|
|
1177
|
+
}
|
|
1178
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndPaneContent, decorators: [{
|
|
1179
|
+
type: Directive,
|
|
1180
|
+
args: [{ selector: 'ng-template[mlvPageEndPaneContent]' }]
|
|
1181
|
+
}] });
|
|
1182
|
+
|
|
1183
|
+
/**
|
|
1184
|
+
* Responsive trailing Page pane that renders one content template inline or
|
|
1185
|
+
* in a modal Drawer while preserving one logical open and focus lifecycle.
|
|
1186
|
+
*/
|
|
1187
|
+
class MlvPageEndPane {
|
|
1188
|
+
/** Two-way bindable logical open state shared by both renderers. */
|
|
1189
|
+
opened = model(false, /* @ts-ignore */
|
|
1190
|
+
...(ngDevMode ? [{ debugName: "opened" }] : /* istanbul ignore next */ []));
|
|
1191
|
+
/** Inline pane width and compact Drawer size. */
|
|
1192
|
+
width = input('20rem', /* @ts-ignore */
|
|
1193
|
+
...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
|
|
1194
|
+
/** Breakpoint below which the pane renders in a modal Drawer. */
|
|
1195
|
+
collapseBelow = input(null, /* @ts-ignore */
|
|
1196
|
+
...(ngDevMode ? [{ debugName: "collapseBelow" }] : /* istanbul ignore next */ []));
|
|
1197
|
+
/** Accessible name applied to the active aside or dialog surface. */
|
|
1198
|
+
ariaLabel = input.required(/* @ts-ignore */
|
|
1199
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
1200
|
+
/** Whether a compact Drawer's backdrop click closes the logical pane. */
|
|
1201
|
+
closeOnBackdropClick = input(true, { ...(ngDevMode ? { debugName: "closeOnBackdropClick" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
1202
|
+
/** Whether Escape closes the logical pane in compact Drawer mode. */
|
|
1203
|
+
closeOnEscape = input(true, { ...(ngDevMode ? { debugName: "closeOnEscape" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
1204
|
+
/** Initial focus strategy used by the compact Drawer renderer. */
|
|
1205
|
+
initialFocus = input('auto', /* @ts-ignore */
|
|
1206
|
+
...(ngDevMode ? [{ debugName: "initialFocus" }] : /* istanbul ignore next */ []));
|
|
1207
|
+
/** Emitted once for each logical false-to-true open transition. */
|
|
1208
|
+
afterOpened = output();
|
|
1209
|
+
/** Emitted once after a logical close's active renderer is gone. */
|
|
1210
|
+
afterClosed = output();
|
|
1211
|
+
/** Stable id referenced by every Page end-pane trigger. */
|
|
1212
|
+
panelId = mlvNextId('mlv-page-end-pane');
|
|
1213
|
+
/** @protected Single content template shared by both renderers. */
|
|
1214
|
+
_content = contentChild.required(MlvPageEndPaneContent, /* @ts-ignore */
|
|
1215
|
+
...(ngDevMode ? [{ debugName: "_content" }] : /* istanbul ignore next */ []));
|
|
1216
|
+
/** @protected Whether the configured breakpoint currently selects Drawer rendering. */
|
|
1217
|
+
_compact = computed(() => {
|
|
1218
|
+
const breakpoint = this.collapseBelow();
|
|
1219
|
+
return breakpoint !== null && this._breakpoints.isDown(breakpoint)();
|
|
1220
|
+
}, /* @ts-ignore */
|
|
1221
|
+
...(ngDevMode ? [{ debugName: "_compact" }] : /* istanbul ignore next */ []));
|
|
1222
|
+
/** @protected Width reserved in Page Shell only for an open inline pane. */
|
|
1223
|
+
_hostWidth = computed(() => this.opened() && !this._compact() ? this.width() : '0px', /* @ts-ignore */
|
|
1224
|
+
...(ngDevMode ? [{ debugName: "_hostWidth" }] : /* istanbul ignore next */ []));
|
|
1225
|
+
/** @private Shared viewport breakpoint state. */
|
|
1226
|
+
_breakpoints = inject(MlvBreakpointService);
|
|
1227
|
+
/** @private Injector used to finish inline closes after the renderer is removed. */
|
|
1228
|
+
_injector = inject(Injector);
|
|
1229
|
+
/** @private Logical state observed during the preceding effect pass. */
|
|
1230
|
+
_previousOpened = false;
|
|
1231
|
+
/** @private Element focused immediately before the current logical open. */
|
|
1232
|
+
_restoreTarget = null;
|
|
1233
|
+
/** @private Whether a real logical close is waiting for renderer disposal. */
|
|
1234
|
+
_closePending = false;
|
|
1235
|
+
constructor() {
|
|
1236
|
+
effect(() => {
|
|
1237
|
+
const opened = this.opened();
|
|
1238
|
+
if (opened === this._previousOpened) {
|
|
1239
|
+
return;
|
|
1240
|
+
}
|
|
1241
|
+
this._previousOpened = opened;
|
|
1242
|
+
if (opened) {
|
|
1243
|
+
this._closePending = false;
|
|
1244
|
+
this._restoreTarget = document.activeElement;
|
|
1245
|
+
this.afterOpened.emit();
|
|
1246
|
+
return;
|
|
1247
|
+
}
|
|
1248
|
+
this._closePending = true;
|
|
1249
|
+
if (!this._compact()) {
|
|
1250
|
+
this._scheduleInlineCloseCompletion();
|
|
1251
|
+
}
|
|
1252
|
+
});
|
|
1253
|
+
}
|
|
1254
|
+
/** Opens the logical pane. */
|
|
1255
|
+
open() {
|
|
1256
|
+
this.opened.set(true);
|
|
1257
|
+
}
|
|
1258
|
+
/** Closes the logical pane and waits for its active renderer to disappear. */
|
|
1259
|
+
close() {
|
|
1260
|
+
if (!this.opened()) {
|
|
1261
|
+
return;
|
|
1262
|
+
}
|
|
1263
|
+
this._closePending = true;
|
|
1264
|
+
this.opened.set(false);
|
|
1265
|
+
}
|
|
1266
|
+
/** Toggles the logical pane open state. */
|
|
1267
|
+
toggle() {
|
|
1268
|
+
if (this.opened()) {
|
|
1269
|
+
this.close();
|
|
1270
|
+
}
|
|
1271
|
+
else {
|
|
1272
|
+
this.open();
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
/** @protected Synchronizes internal Drawer dismissal with the logical model. */
|
|
1276
|
+
_onDrawerOpenedChange(opened) {
|
|
1277
|
+
if (!opened && this.opened()) {
|
|
1278
|
+
this.close();
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
/** @protected Completes a pending logical close after the Drawer is disposed. */
|
|
1282
|
+
_onDrawerDisposed() {
|
|
1283
|
+
this._completeClose();
|
|
1284
|
+
}
|
|
1285
|
+
/** @private Defers inline completion until Angular removes the aside view. */
|
|
1286
|
+
_scheduleInlineCloseCompletion() {
|
|
1287
|
+
afterNextRender(() => this._completeClose(), {
|
|
1288
|
+
injector: this._injector,
|
|
1289
|
+
});
|
|
1290
|
+
}
|
|
1291
|
+
/** @private Restores focus and emits one close event for a real logical close. */
|
|
1292
|
+
_completeClose() {
|
|
1293
|
+
if (!this._closePending) {
|
|
1294
|
+
return;
|
|
1295
|
+
}
|
|
1296
|
+
this._closePending = false;
|
|
1297
|
+
const restoreTarget = this._restoreTarget;
|
|
1298
|
+
this._restoreTarget = null;
|
|
1299
|
+
if (restoreTarget?.isConnected) {
|
|
1300
|
+
restoreTarget.focus();
|
|
1301
|
+
}
|
|
1302
|
+
this.afterClosed.emit();
|
|
1303
|
+
}
|
|
1304
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndPane, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1305
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvPageEndPane, isStandalone: true, selector: "mlv-page-end-pane", inputs: { opened: { classPropertyName: "opened", publicName: "opened", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, collapseBelow: { classPropertyName: "collapseBelow", publicName: "collapseBelow", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: true, transformFunction: null }, closeOnBackdropClick: { classPropertyName: "closeOnBackdropClick", publicName: "closeOnBackdropClick", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, initialFocus: { classPropertyName: "initialFocus", publicName: "initialFocus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "openedChange", afterOpened: "afterOpened", afterClosed: "afterClosed" }, host: { properties: { "class.mlv-page-end-pane--overlay": "_compact()", "attr.id": "panelId", "style.--mlv-page-end-pane-width": "_hostWidth()" }, classAttribute: "mlv-page-end-pane" }, queries: [{ propertyName: "_content", first: true, predicate: MlvPageEndPaneContent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (_compact()) {\n<mlv-drawer\n [opened]=\"opened()\"\n position=\"right\"\n [size]=\"width()\"\n [ariaLabel]=\"ariaLabel()\"\n [closeOnBackdropClick]=\"closeOnBackdropClick()\"\n [closeOnEscape]=\"closeOnEscape()\"\n [initialFocus]=\"initialFocus()\"\n [restoreFocus]=\"false\"\n (openedChange)=\"_onDrawerOpenedChange($event)\"\n (afterClosed)=\"_onDrawerDisposed()\"\n>\n <ng-template mlvDrawerContent>\n <ng-container [ngTemplateOutlet]=\"_content().templateRef\" />\n </ng-template>\n</mlv-drawer>\n} @else if (opened()) {\n<aside class=\"mlv-page-end-pane__surface\" [attr.aria-label]=\"ariaLabel()\">\n <ng-container [ngTemplateOutlet]=\"_content().templateRef\" />\n</aside>\n}\n", styles: ["@layer mlv.components{.mlv-page-end-pane{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-end-pane *{box-sizing:border-box}.mlv-page-end-pane{display:flex;flex:0 0 var(--mlv-page-end-pane-width);width:var(--mlv-page-end-pane-width);min-width:0;min-height:0}.mlv-page-end-pane--overlay{flex-basis:0;width:0;overflow:visible}.mlv-page-end-pane__surface{width:100%;min-width:0;min-height:0;overflow:auto;background:var(--mlv-background-base);border-inline-start:var(--mlv-stroke-width) solid var(--mlv-border-subtle)}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MlvDrawer, selector: "mlv-drawer", inputs: ["position", "ariaLabel", "ariaLabelledBy", "size", "resizable", "snapPoints", "defaultSnap", "minSize", "maxSize"] }, { kind: "directive", type: MlvDrawerContent, selector: "[mlvDrawerContent]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1306
|
+
}
|
|
1307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndPane, decorators: [{
|
|
1308
|
+
type: Component,
|
|
1309
|
+
args: [{ selector: 'mlv-page-end-pane', imports: [NgTemplateOutlet, MlvDrawer, MlvDrawerContent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1310
|
+
class: 'mlv-page-end-pane',
|
|
1311
|
+
'[class.mlv-page-end-pane--overlay]': '_compact()',
|
|
1312
|
+
'[attr.id]': 'panelId',
|
|
1313
|
+
'[style.--mlv-page-end-pane-width]': '_hostWidth()',
|
|
1314
|
+
}, template: "@if (_compact()) {\n<mlv-drawer\n [opened]=\"opened()\"\n position=\"right\"\n [size]=\"width()\"\n [ariaLabel]=\"ariaLabel()\"\n [closeOnBackdropClick]=\"closeOnBackdropClick()\"\n [closeOnEscape]=\"closeOnEscape()\"\n [initialFocus]=\"initialFocus()\"\n [restoreFocus]=\"false\"\n (openedChange)=\"_onDrawerOpenedChange($event)\"\n (afterClosed)=\"_onDrawerDisposed()\"\n>\n <ng-template mlvDrawerContent>\n <ng-container [ngTemplateOutlet]=\"_content().templateRef\" />\n </ng-template>\n</mlv-drawer>\n} @else if (opened()) {\n<aside class=\"mlv-page-end-pane__surface\" [attr.aria-label]=\"ariaLabel()\">\n <ng-container [ngTemplateOutlet]=\"_content().templateRef\" />\n</aside>\n}\n", styles: ["@layer mlv.components{.mlv-page-end-pane{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-end-pane *{box-sizing:border-box}.mlv-page-end-pane{display:flex;flex:0 0 var(--mlv-page-end-pane-width);width:var(--mlv-page-end-pane-width);min-width:0;min-height:0}.mlv-page-end-pane--overlay{flex-basis:0;width:0;overflow:visible}.mlv-page-end-pane__surface{width:100%;min-width:0;min-height:0;overflow:auto;background:var(--mlv-background-base);border-inline-start:var(--mlv-stroke-width) solid var(--mlv-border-subtle)}}\n"] }]
|
|
1315
|
+
}], ctorParameters: () => [], propDecorators: { opened: [{ type: i0.Input, args: [{ isSignal: true, alias: "opened", required: false }] }, { type: i0.Output, args: ["openedChange"] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], collapseBelow: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseBelow", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], closeOnBackdropClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdropClick", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], initialFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialFocus", required: false }] }], afterOpened: [{ type: i0.Output, args: ["afterOpened"] }], afterClosed: [{ type: i0.Output, args: ["afterClosed"] }], _content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageEndPaneContent), { isSignal: true }] }] } });
|
|
1316
|
+
|
|
1317
|
+
/** Native-button trigger that toggles and describes a Page end pane. */
|
|
1318
|
+
class MlvPageEndPaneTrigger {
|
|
1319
|
+
/** Page end pane controlled by this native button. */
|
|
1320
|
+
mlvPageEndPaneTrigger = input.required(/* @ts-ignore */
|
|
1321
|
+
...(ngDevMode ? [{ debugName: "mlvPageEndPaneTrigger" }] : /* istanbul ignore next */ []));
|
|
1322
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndPaneTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1323
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MlvPageEndPaneTrigger, isStandalone: true, selector: "button[mlvPageEndPaneTrigger]", inputs: { mlvPageEndPaneTrigger: { classPropertyName: "mlvPageEndPaneTrigger", publicName: "mlvPageEndPaneTrigger", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "click": "mlvPageEndPaneTrigger().toggle()" }, properties: { "attr.aria-expanded": "mlvPageEndPaneTrigger().opened()", "attr.aria-controls": "mlvPageEndPaneTrigger().panelId" } }, ngImport: i0 });
|
|
1324
|
+
}
|
|
1325
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageEndPaneTrigger, decorators: [{
|
|
1326
|
+
type: Directive,
|
|
1327
|
+
args: [{
|
|
1328
|
+
selector: 'button[mlvPageEndPaneTrigger]',
|
|
1329
|
+
host: {
|
|
1330
|
+
'(click)': 'mlvPageEndPaneTrigger().toggle()',
|
|
1331
|
+
'[attr.aria-expanded]': 'mlvPageEndPaneTrigger().opened()',
|
|
1332
|
+
'[attr.aria-controls]': 'mlvPageEndPaneTrigger().panelId',
|
|
1333
|
+
},
|
|
1334
|
+
}]
|
|
1335
|
+
}], propDecorators: { mlvPageEndPaneTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "mlvPageEndPaneTrigger", required: true }] }] } });
|
|
1336
|
+
|
|
1337
|
+
/** Marks the breadcrumb template rendered at the start of a page header. */
|
|
1338
|
+
class MlvPageBreadcrumb extends MlvStructural {
|
|
1339
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageBreadcrumb, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1340
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageBreadcrumb, isStandalone: true, selector: "[mlvPageBreadcrumb]", usesInheritance: true, ngImport: i0 });
|
|
1341
|
+
}
|
|
1342
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageBreadcrumb, decorators: [{
|
|
1343
|
+
type: Directive,
|
|
1344
|
+
args: [{ selector: '[mlvPageBreadcrumb]' }]
|
|
1345
|
+
}] });
|
|
1346
|
+
/** Marks the decorative leading icon beside the page title. */
|
|
1347
|
+
class MlvPageHeaderIcon extends MlvStructural {
|
|
1348
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderIcon, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1349
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderIcon, isStandalone: true, selector: "[mlvPageHeaderIcon]", usesInheritance: true, ngImport: i0 });
|
|
1350
|
+
}
|
|
1351
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderIcon, decorators: [{
|
|
1352
|
+
type: Directive,
|
|
1353
|
+
args: [{ selector: '[mlvPageHeaderIcon]' }]
|
|
1354
|
+
}] });
|
|
1355
|
+
/** Marks the page title template. Consumers should project one semantic `<h1>`. */
|
|
1356
|
+
class MlvPageTitle extends MlvStructural {
|
|
1357
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageTitle, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1358
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageTitle, isStandalone: true, selector: "[mlvPageTitle]", usesInheritance: true, ngImport: i0 });
|
|
1359
|
+
}
|
|
1360
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageTitle, decorators: [{
|
|
1361
|
+
type: Directive,
|
|
1362
|
+
args: [{ selector: '[mlvPageTitle]' }]
|
|
1363
|
+
}] });
|
|
1364
|
+
/**
|
|
1365
|
+
* Marks inline status content rendered directly after the page title,
|
|
1366
|
+
* such as draft/live badges or an unsaved-changes indicator.
|
|
1367
|
+
*/
|
|
1368
|
+
class MlvPageHeaderStatus extends MlvStructural {
|
|
1369
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderStatus, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1370
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderStatus, isStandalone: true, selector: "[mlvPageHeaderStatus]", usesInheritance: true, ngImport: i0 });
|
|
1371
|
+
}
|
|
1372
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderStatus, decorators: [{
|
|
1373
|
+
type: Directive,
|
|
1374
|
+
args: [{ selector: '[mlvPageHeaderStatus]' }]
|
|
1375
|
+
}] });
|
|
1376
|
+
/** Marks the primary actions rendered after the page title. */
|
|
1377
|
+
class MlvPageHeaderActions extends MlvStructural {
|
|
1378
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderActions, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1379
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderActions, isStandalone: true, selector: "[mlvPageHeaderActions]", usesInheritance: true, ngImport: i0 });
|
|
1380
|
+
}
|
|
1381
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderActions, decorators: [{
|
|
1382
|
+
type: Directive,
|
|
1383
|
+
args: [{ selector: '[mlvPageHeaderActions]' }]
|
|
1384
|
+
}] });
|
|
1385
|
+
/** Marks supporting descriptive content below the title row. */
|
|
1386
|
+
class MlvPageHeaderDescription extends MlvStructural {
|
|
1387
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderDescription, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1388
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderDescription, isStandalone: true, selector: "[mlvPageHeaderDescription]", usesInheritance: true, ngImport: i0 });
|
|
1389
|
+
}
|
|
1390
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderDescription, decorators: [{
|
|
1391
|
+
type: Directive,
|
|
1392
|
+
args: [{ selector: '[mlvPageHeaderDescription]' }]
|
|
1393
|
+
}] });
|
|
1394
|
+
/** Marks page metadata such as ownership, visibility, or last-updated time. */
|
|
1395
|
+
class MlvPageHeaderMeta extends MlvStructural {
|
|
1396
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderMeta, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1397
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderMeta, isStandalone: true, selector: "[mlvPageHeaderMeta]", usesInheritance: true, ngImport: i0 });
|
|
1398
|
+
}
|
|
1399
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderMeta, decorators: [{
|
|
1400
|
+
type: Directive,
|
|
1401
|
+
args: [{ selector: '[mlvPageHeaderMeta]' }]
|
|
1402
|
+
}] });
|
|
1403
|
+
/** Marks navigation tabs rendered at the bottom of the header. */
|
|
1404
|
+
class MlvPageHeaderTabs extends MlvStructural {
|
|
1405
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderTabs, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1406
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderTabs, isStandalone: true, selector: "[mlvPageHeaderTabs]", usesInheritance: true, ngImport: i0 });
|
|
1407
|
+
}
|
|
1408
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderTabs, decorators: [{
|
|
1409
|
+
type: Directive,
|
|
1410
|
+
args: [{ selector: '[mlvPageHeaderTabs]' }]
|
|
1411
|
+
}] });
|
|
1412
|
+
/** Marks actions aligned to the trailing edge of the page-tabs row. */
|
|
1413
|
+
class MlvPageHeaderTabsActions extends MlvStructural {
|
|
1414
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderTabsActions, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1415
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageHeaderTabsActions, isStandalone: true, selector: "[mlvPageHeaderTabsActions]", usesInheritance: true, ngImport: i0 });
|
|
1416
|
+
}
|
|
1417
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeaderTabsActions, decorators: [{
|
|
1418
|
+
type: Directive,
|
|
1419
|
+
args: [{ selector: '[mlvPageHeaderTabsActions]' }]
|
|
1420
|
+
}] });
|
|
1421
|
+
|
|
1422
|
+
/**
|
|
1423
|
+
* Structured page heading with optional breadcrumb, actions, status, metadata,
|
|
1424
|
+
* and tabs. `size="s"` renders the compact record-editor header.
|
|
1425
|
+
*
|
|
1426
|
+
* Inside `main[mlvPage]` the header participates in the scroll-scrubbed snap
|
|
1427
|
+
* timeline (`--mlv-page-snap`): the title interpolates down one type scale and
|
|
1428
|
+
* the breadcrumb and tabs rows collapse, each over its own stagger window.
|
|
1429
|
+
* With `snapControls`, chevron/pin controls float on the header's bottom edge
|
|
1430
|
+
* — always visible while the header is sticky. The chevron snaps the chrome
|
|
1431
|
+
* open/closed; the pin freezes the current state regardless of scrolling.
|
|
1432
|
+
*/
|
|
1433
|
+
class MlvPageHeader {
|
|
1434
|
+
/** Optional router destination for the built-in back link. */
|
|
1435
|
+
back = input(null, /* @ts-ignore */
|
|
1436
|
+
...(ngDevMode ? [{ debugName: "back" }] : /* istanbul ignore next */ []));
|
|
1437
|
+
/** Accessible and visible text for the built-in back link. */
|
|
1438
|
+
backLabel = input('Back', /* @ts-ignore */
|
|
1439
|
+
...(ngDevMode ? [{ debugName: "backLabel" }] : /* istanbul ignore next */ []));
|
|
1440
|
+
/** Makes this header sticky independently of the containing page. */
|
|
1441
|
+
sticky = input(false, { ...(ngDevMode ? { debugName: "sticky" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
1442
|
+
/**
|
|
1443
|
+
* Visual scale. `'m'` is the default hero header; `'s'` is the compact
|
|
1444
|
+
* single-row variant for record-editor pages, with a smaller title scale.
|
|
1445
|
+
*/
|
|
1446
|
+
size = input('m', /* @ts-ignore */
|
|
1447
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
1448
|
+
/** Aligns the tabs row to the start (default) or centers it. */
|
|
1449
|
+
tabsAlign = input('start', /* @ts-ignore */
|
|
1450
|
+
...(ngDevMode ? [{ debugName: "tabsAlign" }] : /* istanbul ignore next */ []));
|
|
1451
|
+
/**
|
|
1452
|
+
* Shows the floating chevron/pin snap controls on the header's bottom edge.
|
|
1453
|
+
* Requires the header to be inside `main[mlvPage]`.
|
|
1454
|
+
*/
|
|
1455
|
+
snapControls = input(false, { ...(ngDevMode ? { debugName: "snapControls" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
1456
|
+
/** Accessible label for the chevron snap-toggle control. */
|
|
1457
|
+
toggleLabel = input('Toggle header', /* @ts-ignore */
|
|
1458
|
+
...(ngDevMode ? [{ debugName: "toggleLabel" }] : /* istanbul ignore next */ []));
|
|
1459
|
+
/** Accessible label for the pin control. */
|
|
1460
|
+
pinLabel = input('Pin header state', /* @ts-ignore */
|
|
1461
|
+
...(ngDevMode ? [{ debugName: "pinLabel" }] : /* istanbul ignore next */ []));
|
|
1462
|
+
/** Emits when the built-in back link is activated. */
|
|
1463
|
+
backClick = output();
|
|
1464
|
+
/** @protected Breadcrumb template projected via `[mlvPageBreadcrumb]`. */
|
|
1465
|
+
_breadcrumbRef = contentChild(MlvPageBreadcrumb, /* @ts-ignore */
|
|
1466
|
+
...(ngDevMode ? [{ debugName: "_breadcrumbRef" }] : /* istanbul ignore next */ []));
|
|
1467
|
+
/** @protected Decorative leading icon projected via `[mlvPageHeaderIcon]`. */
|
|
1468
|
+
_iconRef = contentChild(MlvPageHeaderIcon, /* @ts-ignore */
|
|
1469
|
+
...(ngDevMode ? [{ debugName: "_iconRef" }] : /* istanbul ignore next */ []));
|
|
1470
|
+
/** @protected Page title template projected via `[mlvPageTitle]`. */
|
|
1471
|
+
_titleRef = contentChild(MlvPageTitle, /* @ts-ignore */
|
|
1472
|
+
...(ngDevMode ? [{ debugName: "_titleRef" }] : /* istanbul ignore next */ []));
|
|
1473
|
+
/** @protected Inline status content projected via `[mlvPageHeaderStatus]`. */
|
|
1474
|
+
_statusRef = contentChild(MlvPageHeaderStatus, /* @ts-ignore */
|
|
1475
|
+
...(ngDevMode ? [{ debugName: "_statusRef" }] : /* istanbul ignore next */ []));
|
|
1476
|
+
/** @protected Header actions projected via `[mlvPageHeaderActions]`. */
|
|
1477
|
+
_actionsRef = contentChild(MlvPageHeaderActions, /* @ts-ignore */
|
|
1478
|
+
...(ngDevMode ? [{ debugName: "_actionsRef" }] : /* istanbul ignore next */ []));
|
|
1479
|
+
/** @protected Description projected via `[mlvPageHeaderDescription]`. */
|
|
1480
|
+
_descriptionRef = contentChild(MlvPageHeaderDescription, /* @ts-ignore */
|
|
1481
|
+
...(ngDevMode ? [{ debugName: "_descriptionRef" }] : /* istanbul ignore next */ []));
|
|
1482
|
+
/** @protected Metadata projected via `[mlvPageHeaderMeta]`. */
|
|
1483
|
+
_metaRef = contentChild(MlvPageHeaderMeta, /* @ts-ignore */
|
|
1484
|
+
...(ngDevMode ? [{ debugName: "_metaRef" }] : /* istanbul ignore next */ []));
|
|
1485
|
+
/** @protected Tabs projected via `[mlvPageHeaderTabs]`. */
|
|
1486
|
+
_tabsRef = contentChild(MlvPageHeaderTabs, /* @ts-ignore */
|
|
1487
|
+
...(ngDevMode ? [{ debugName: "_tabsRef" }] : /* istanbul ignore next */ []));
|
|
1488
|
+
/** @protected Trailing tabs-row actions projected via `[mlvPageHeaderTabsActions]`. */
|
|
1489
|
+
_tabsActionsRef = contentChild(MlvPageHeaderTabsActions, /* @ts-ignore */
|
|
1490
|
+
...(ngDevMode ? [{ debugName: "_tabsActionsRef" }] : /* istanbul ignore next */ []));
|
|
1491
|
+
/** @private Scroll state of the owning page, when rendered inside one. */
|
|
1492
|
+
_pageScroll = inject(MLV_PAGE_SCROLL, { optional: true });
|
|
1493
|
+
/** @private Snap controller of the owning page, when rendered inside one. */
|
|
1494
|
+
_snap = inject(MlvPageSnapController, { optional: true });
|
|
1495
|
+
/** @protected Controller behind the floating controls, when enabled. */
|
|
1496
|
+
_controls = computed(() => this.snapControls() && this._snap ? this._snap : null, /* @ts-ignore */
|
|
1497
|
+
...(ngDevMode ? [{ debugName: "_controls" }] : /* istanbul ignore next */ []));
|
|
1498
|
+
/** @protected True while the chrome is closer to snapped than expanded. */
|
|
1499
|
+
_snapped = computed(() => this._snap?.snapped() ?? false, /* @ts-ignore */
|
|
1500
|
+
...(ngDevMode ? [{ debugName: "_snapped" }] : /* istanbul ignore next */ []));
|
|
1501
|
+
/** @protected True while the snap state is frozen against scrolling. */
|
|
1502
|
+
_pinned = computed(() => this._snap?.pinned() ?? false, /* @ts-ignore */
|
|
1503
|
+
...(ngDevMode ? [{ debugName: "_pinned" }] : /* istanbul ignore next */ []));
|
|
1504
|
+
/** @protected True while the owning page is scrolled away from the top. */
|
|
1505
|
+
_scrolled = computed(() => this._snap
|
|
1506
|
+
? this._snap.progress() > 0.02
|
|
1507
|
+
: (this._pageScroll?.scrolled() ?? false), /* @ts-ignore */
|
|
1508
|
+
...(ngDevMode ? [{ debugName: "_scrolled" }] : /* istanbul ignore next */ []));
|
|
1509
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1510
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvPageHeader, isStandalone: true, selector: "mlv-page-header", inputs: { back: { classPropertyName: "back", publicName: "back", isSignal: true, isRequired: false, transformFunction: null }, backLabel: { classPropertyName: "backLabel", publicName: "backLabel", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, tabsAlign: { classPropertyName: "tabsAlign", publicName: "tabsAlign", isSignal: true, isRequired: false, transformFunction: null }, snapControls: { classPropertyName: "snapControls", publicName: "snapControls", isSignal: true, isRequired: false, transformFunction: null }, toggleLabel: { classPropertyName: "toggleLabel", publicName: "toggleLabel", isSignal: true, isRequired: false, transformFunction: null }, pinLabel: { classPropertyName: "pinLabel", publicName: "pinLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { backClick: "backClick" }, host: { properties: { "class.mlv-page-header--sticky": "sticky()", "class.mlv-page-header--size-s": "size() === \"s\"", "class.mlv-page-header--tabs-center": "tabsAlign() === \"center\"", "class.mlv-page-header--scrolled": "_scrolled()" }, classAttribute: "mlv-page-header" }, queries: [{ propertyName: "_breadcrumbRef", first: true, predicate: MlvPageBreadcrumb, descendants: true, isSignal: true }, { propertyName: "_iconRef", first: true, predicate: MlvPageHeaderIcon, descendants: true, isSignal: true }, { propertyName: "_titleRef", first: true, predicate: MlvPageTitle, descendants: true, isSignal: true }, { propertyName: "_statusRef", first: true, predicate: MlvPageHeaderStatus, descendants: true, isSignal: true }, { propertyName: "_actionsRef", first: true, predicate: MlvPageHeaderActions, descendants: true, isSignal: true }, { propertyName: "_descriptionRef", first: true, predicate: MlvPageHeaderDescription, descendants: true, isSignal: true }, { propertyName: "_metaRef", first: true, predicate: MlvPageHeaderMeta, descendants: true, isSignal: true }, { propertyName: "_tabsRef", first: true, predicate: MlvPageHeaderTabs, descendants: true, isSignal: true }, { propertyName: "_tabsActionsRef", first: true, predicate: MlvPageHeaderTabsActions, descendants: true, isSignal: true }], ngImport: i0, template: "@if (_breadcrumbRef()?.templateRef; as breadcrumbTpl) {\n<div\n class=\"mlv-page-header__breadcrumb\"\n mlvPageSnap=\"hide\"\n [snapFrom]=\"0\"\n [snapTo]=\"0.5\"\n snapSize=\"3rem\"\n>\n <ng-template [ngTemplateOutlet]=\"breadcrumbTpl\" />\n</div>\n} @if (back(); as backTarget) {\n<a\n mlvLink\n class=\"mlv-page-header__back\"\n variant=\"subtle\"\n [routerLink]=\"backTarget\"\n (click)=\"backClick.emit($event)\"\n>\n <ng-template mlvLinkBefore>\n <svg lucideChevronLeft [size]=\"16\" aria-hidden=\"true\" />\n </ng-template>\n {{ backLabel() }}\n</a>\n}\n\n<div class=\"mlv-page-header__title-row\">\n @if (_iconRef()?.templateRef; as iconTpl) {\n <span class=\"mlv-page-header__icon\" aria-hidden=\"true\">\n <ng-template [ngTemplateOutlet]=\"iconTpl\" />\n </span>\n } @if (_titleRef()?.templateRef; as titleTpl) {\n <div class=\"mlv-page-header__title\">\n <ng-template [ngTemplateOutlet]=\"titleTpl\" />\n </div>\n } @if (_statusRef()?.templateRef; as statusTpl) {\n <div class=\"mlv-page-header__status\">\n <ng-template [ngTemplateOutlet]=\"statusTpl\" />\n </div>\n }\n <span class=\"mlv-page-header__spacer\" aria-hidden=\"true\"></span>\n @if (_actionsRef()?.templateRef; as actionsTpl) {\n <div class=\"mlv-page-header__actions\">\n <ng-template [ngTemplateOutlet]=\"actionsTpl\" />\n </div>\n }\n</div>\n\n@if (_descriptionRef()?.templateRef; as descriptionTpl) {\n<div class=\"mlv-page-header__description\">\n <ng-template [ngTemplateOutlet]=\"descriptionTpl\" />\n</div>\n} @if (_metaRef()?.templateRef; as metaTpl) {\n<div class=\"mlv-page-header__meta\">\n <ng-template [ngTemplateOutlet]=\"metaTpl\" />\n</div>\n} @if (_tabsRef()?.templateRef || _tabsActionsRef()?.templateRef) {\n<div\n class=\"mlv-page-header__tabs-row\"\n mlvPageSnap=\"hide\"\n [snapFrom]=\"0.3\"\n [snapTo]=\"0.85\"\n snapSize=\"5rem\"\n>\n @if (_tabsRef()?.templateRef; as tabsTpl) {\n <div class=\"mlv-page-header__tabs\">\n <ng-template [ngTemplateOutlet]=\"tabsTpl\" />\n </div>\n }\n <span class=\"mlv-page-header__spacer\" aria-hidden=\"true\"></span>\n @if (_tabsActionsRef()?.templateRef; as tabsActionsTpl) {\n <div class=\"mlv-page-header__tabs-actions\">\n <ng-template [ngTemplateOutlet]=\"tabsActionsTpl\" />\n </div>\n }\n</div>\n}\n\n<!-- A projected summary strip renders as the chrome's bottom row, sharing\n this header's single glass surface. -->\n<ng-content select=\"mlv-page-summary\" />\n\n@if (_controls(); as snap) {\n<div class=\"mlv-page-header__snap-controls\">\n <button\n mlvButton\n type=\"button\"\n variant=\"outlined\"\n shape=\"circle\"\n mlvDensity=\"tight\"\n class=\"mlv-page-header__snap-toggle\"\n [attr.aria-label]=\"toggleLabel()\"\n [attr.aria-expanded]=\"!_snapped()\"\n (click)=\"snap.toggle()\"\n >\n <svg lucideChevronUp [size]=\"12\" aria-hidden=\"true\" />\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"outlined\"\n shape=\"circle\"\n mlvDensity=\"tight\"\n class=\"mlv-page-header__snap-pin\"\n [class.mlv-page-header__snap-pin--active]=\"_pinned()\"\n [attr.aria-label]=\"pinLabel()\"\n [attr.aria-pressed]=\"_pinned()\"\n (click)=\"snap.setPinned(!_pinned())\"\n >\n @if (_pinned()) {\n <svg lucidePinOff [size]=\"12\" aria-hidden=\"true\" />\n } @else {\n <svg lucidePin [size]=\"12\" aria-hidden=\"true\" />\n }\n </button>\n</div>\n}\n", styles: ["@layer mlv.components{.mlv-page-header{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-header *{box-sizing:border-box}.mlv-page-header{--mlv-page-header-snap: clamp(0, var(--mlv-page-snap, 0), 1);--mlv-page-chrome-bg: color-mix( in srgb, var(--mlv-elevation-bg-3), transparent 50% );--mlv-page-chrome-border: var(--mlv-border-subtle);position:relative;display:flex;flex-direction:column;gap:var(--mlv-spacing-2);min-width:0;background-color:var(--mlv-page-chrome-bg);border-bottom:.0625rem solid var(--mlv-page-chrome-border);border-radius:var(--mlv-radius-l) var(--mlv-radius-l) 0 0;backdrop-filter:blur(1.25rem);-webkit-backdrop-filter:blur(1.25rem);padding:var(--mlv-spacing-2) max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3));box-shadow:var(--mlv-shadow-raised);transition:box-shadow var(--mlv-duration-fast) var(--mlv-ease-default)}.mlv-page-header--sticky{position:sticky;top:0;z-index:10}.mlv-page-header--scrolled{box-shadow:var(--mlv-shadow-floating)}.mlv-page-header__breadcrumb,.mlv-page-header__description,.mlv-page-header__meta,.mlv-page-header__tabs,.mlv-page-header__title{min-width:0}.mlv-page-header__back{align-self:flex-start}.mlv-page-header__title-row,.mlv-page-header__tabs-row{display:flex;align-items:center;gap:var(--mlv-spacing-3);min-width:0}.mlv-page-header__title-row{min-height:var(--mlv-height-l)}.mlv-page-header__icon{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;color:var(--mlv-text-secondary)}.mlv-page-header__title h1{margin:0;font-size:calc(var(--mlv-typography-heading-h2-size) + (var(--mlv-typography-heading-h4-size) - var(--mlv-typography-heading-h2-size)) * var(--mlv-page-header-snap));line-height:calc(var(--mlv-typography-heading-h2-line-height) + (var(--mlv-typography-heading-h4-line-height) - var(--mlv-typography-heading-h2-line-height)) * var(--mlv-page-header-snap));letter-spacing:var(--mlv-typography-heading-h2-letter-spacing)}.mlv-page-header__spacer{flex:1 1 auto}.mlv-page-header__actions,.mlv-page-header__tabs-actions{display:flex;flex:0 0 auto;align-items:center;gap:var(--mlv-spacing-2)}.mlv-page-header__actions button,.mlv-page-header__actions a,.mlv-page-header__tabs-actions button,.mlv-page-header__tabs-actions a{white-space:nowrap}.mlv-page-header__description{max-width:48rem;color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-m-size);line-height:var(--mlv-typography-body-m-line-height)}.mlv-page-header__meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--mlv-spacing-2);color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-header__tabs-row{margin-bottom:calc(0rem - var(--mlv-spacing-2))}.mlv-page-header__tabs{flex:1 1 auto;overflow:hidden}.mlv-page-header__tabs>.mlv-tab-group{width:100%}.mlv-page-header__status{display:inline-flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:var(--mlv-spacing-1)}.mlv-page-header__snap-controls{position:absolute;bottom:0;left:50%;z-index:1;display:flex;gap:var(--mlv-spacing-1);transform:translate(-50%,50%)}.mlv-page-header__snap-toggle,.mlv-page-header__snap-pin{background:var(--mlv-background-raised);box-shadow:var(--mlv-shadow-raised)}.mlv-page-header__snap-toggle svg{rotate:calc(180deg * var(--mlv-page-header-snap))}.mlv-page-header__snap-pin--active{color:var(--mlv-text-action);border-color:var(--mlv-border-focus)}.mlv-page-header--tabs-center .mlv-page-header__tabs-row{justify-content:center}.mlv-page-header--tabs-center .mlv-page-header__tabs-row .mlv-page-header__spacer{flex:0 0 0}.mlv-page-header--tabs-center .mlv-page-header__tabs{flex:0 1 auto}.mlv-page-header--tabs-center .mlv-page-header__tabs>.mlv-tab-group{width:auto}.mlv-page-header--size-s{gap:var(--mlv-spacing-1)}.mlv-page-header--size-s .mlv-page-header__title-row{min-height:var(--mlv-height-m)}.mlv-page-header--size-s .mlv-page-header__title h1{font-size:calc(var(--mlv-typography-heading-h4-size) + (var(--mlv-typography-heading-h6-size) - var(--mlv-typography-heading-h4-size)) * var(--mlv-page-header-snap));line-height:calc(var(--mlv-typography-heading-h4-line-height) + (var(--mlv-typography-heading-h6-line-height) - var(--mlv-typography-heading-h4-line-height)) * var(--mlv-page-header-snap));letter-spacing:var(--mlv-letter-spacing-normal)}.mlv-page-header--size-s .mlv-page-header__description{font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-header>.mlv-page-summary{position:static;z-index:auto;margin-inline:calc(-1*max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3)));background:transparent;border-bottom:none;backdrop-filter:none;-webkit-backdrop-filter:none}@container (max-width: 40rem){.mlv-page-header__title-row{flex-wrap:wrap;row-gap:var(--mlv-spacing-1)}.mlv-page-header__title-row .mlv-page-header__spacer{display:none}.mlv-page-header__actions{flex:1 1 100%;flex-wrap:wrap;justify-content:flex-start}}@media(prefers-reduced-motion:reduce){.mlv-page-header,.mlv-page-header *,.mlv-page-header:before,.mlv-page-header:after,[class^=mlv-page-header__],[class*=\" mlv-page-header__\"],[class^=mlv-page-header--],[class*=\" mlv-page-header--\"]{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:var(--mlv-duration-instant)!important}}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronUp, selector: "svg[lucideChevronUp]" }, { kind: "component", type: LucidePin, selector: "svg[lucidePin]" }, { kind: "component", type: LucidePinOff, selector: "svg[lucidePinOff]" }, { kind: "component", type: MlvButton, selector: "button[mlvButton], a[mlvButton]", inputs: ["variant", "shape", "disabled", "loading", "selected"] }, { kind: "component", type: MlvLink, selector: "a[mlvLink]", inputs: ["variant", "disabled"] }, { kind: "directive", type: MlvLinkBefore, selector: "[mlvLinkBefore]" }, { kind: "directive", type: MlvPageSnap, selector: "[mlvPageSnap]", inputs: ["mlvPageSnap", "snapFrom", "snapTo", "snapSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1511
|
+
}
|
|
1512
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageHeader, decorators: [{
|
|
1513
|
+
type: Component,
|
|
1514
|
+
args: [{ selector: 'mlv-page-header', imports: [
|
|
1515
|
+
NgTemplateOutlet,
|
|
1516
|
+
RouterLink,
|
|
1517
|
+
LucideChevronLeft,
|
|
1518
|
+
LucideChevronUp,
|
|
1519
|
+
LucidePin,
|
|
1520
|
+
LucidePinOff,
|
|
1521
|
+
MlvButton,
|
|
1522
|
+
MlvLink,
|
|
1523
|
+
MlvLinkBefore,
|
|
1524
|
+
MlvPageSnap,
|
|
1525
|
+
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1526
|
+
class: 'mlv-page-header',
|
|
1527
|
+
'[class.mlv-page-header--sticky]': 'sticky()',
|
|
1528
|
+
'[class.mlv-page-header--size-s]': 'size() === "s"',
|
|
1529
|
+
'[class.mlv-page-header--tabs-center]': 'tabsAlign() === "center"',
|
|
1530
|
+
'[class.mlv-page-header--scrolled]': '_scrolled()',
|
|
1531
|
+
}, template: "@if (_breadcrumbRef()?.templateRef; as breadcrumbTpl) {\n<div\n class=\"mlv-page-header__breadcrumb\"\n mlvPageSnap=\"hide\"\n [snapFrom]=\"0\"\n [snapTo]=\"0.5\"\n snapSize=\"3rem\"\n>\n <ng-template [ngTemplateOutlet]=\"breadcrumbTpl\" />\n</div>\n} @if (back(); as backTarget) {\n<a\n mlvLink\n class=\"mlv-page-header__back\"\n variant=\"subtle\"\n [routerLink]=\"backTarget\"\n (click)=\"backClick.emit($event)\"\n>\n <ng-template mlvLinkBefore>\n <svg lucideChevronLeft [size]=\"16\" aria-hidden=\"true\" />\n </ng-template>\n {{ backLabel() }}\n</a>\n}\n\n<div class=\"mlv-page-header__title-row\">\n @if (_iconRef()?.templateRef; as iconTpl) {\n <span class=\"mlv-page-header__icon\" aria-hidden=\"true\">\n <ng-template [ngTemplateOutlet]=\"iconTpl\" />\n </span>\n } @if (_titleRef()?.templateRef; as titleTpl) {\n <div class=\"mlv-page-header__title\">\n <ng-template [ngTemplateOutlet]=\"titleTpl\" />\n </div>\n } @if (_statusRef()?.templateRef; as statusTpl) {\n <div class=\"mlv-page-header__status\">\n <ng-template [ngTemplateOutlet]=\"statusTpl\" />\n </div>\n }\n <span class=\"mlv-page-header__spacer\" aria-hidden=\"true\"></span>\n @if (_actionsRef()?.templateRef; as actionsTpl) {\n <div class=\"mlv-page-header__actions\">\n <ng-template [ngTemplateOutlet]=\"actionsTpl\" />\n </div>\n }\n</div>\n\n@if (_descriptionRef()?.templateRef; as descriptionTpl) {\n<div class=\"mlv-page-header__description\">\n <ng-template [ngTemplateOutlet]=\"descriptionTpl\" />\n</div>\n} @if (_metaRef()?.templateRef; as metaTpl) {\n<div class=\"mlv-page-header__meta\">\n <ng-template [ngTemplateOutlet]=\"metaTpl\" />\n</div>\n} @if (_tabsRef()?.templateRef || _tabsActionsRef()?.templateRef) {\n<div\n class=\"mlv-page-header__tabs-row\"\n mlvPageSnap=\"hide\"\n [snapFrom]=\"0.3\"\n [snapTo]=\"0.85\"\n snapSize=\"5rem\"\n>\n @if (_tabsRef()?.templateRef; as tabsTpl) {\n <div class=\"mlv-page-header__tabs\">\n <ng-template [ngTemplateOutlet]=\"tabsTpl\" />\n </div>\n }\n <span class=\"mlv-page-header__spacer\" aria-hidden=\"true\"></span>\n @if (_tabsActionsRef()?.templateRef; as tabsActionsTpl) {\n <div class=\"mlv-page-header__tabs-actions\">\n <ng-template [ngTemplateOutlet]=\"tabsActionsTpl\" />\n </div>\n }\n</div>\n}\n\n<!-- A projected summary strip renders as the chrome's bottom row, sharing\n this header's single glass surface. -->\n<ng-content select=\"mlv-page-summary\" />\n\n@if (_controls(); as snap) {\n<div class=\"mlv-page-header__snap-controls\">\n <button\n mlvButton\n type=\"button\"\n variant=\"outlined\"\n shape=\"circle\"\n mlvDensity=\"tight\"\n class=\"mlv-page-header__snap-toggle\"\n [attr.aria-label]=\"toggleLabel()\"\n [attr.aria-expanded]=\"!_snapped()\"\n (click)=\"snap.toggle()\"\n >\n <svg lucideChevronUp [size]=\"12\" aria-hidden=\"true\" />\n </button>\n <button\n mlvButton\n type=\"button\"\n variant=\"outlined\"\n shape=\"circle\"\n mlvDensity=\"tight\"\n class=\"mlv-page-header__snap-pin\"\n [class.mlv-page-header__snap-pin--active]=\"_pinned()\"\n [attr.aria-label]=\"pinLabel()\"\n [attr.aria-pressed]=\"_pinned()\"\n (click)=\"snap.setPinned(!_pinned())\"\n >\n @if (_pinned()) {\n <svg lucidePinOff [size]=\"12\" aria-hidden=\"true\" />\n } @else {\n <svg lucidePin [size]=\"12\" aria-hidden=\"true\" />\n }\n </button>\n</div>\n}\n", styles: ["@layer mlv.components{.mlv-page-header{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-header *{box-sizing:border-box}.mlv-page-header{--mlv-page-header-snap: clamp(0, var(--mlv-page-snap, 0), 1);--mlv-page-chrome-bg: color-mix( in srgb, var(--mlv-elevation-bg-3), transparent 50% );--mlv-page-chrome-border: var(--mlv-border-subtle);position:relative;display:flex;flex-direction:column;gap:var(--mlv-spacing-2);min-width:0;background-color:var(--mlv-page-chrome-bg);border-bottom:.0625rem solid var(--mlv-page-chrome-border);border-radius:var(--mlv-radius-l) var(--mlv-radius-l) 0 0;backdrop-filter:blur(1.25rem);-webkit-backdrop-filter:blur(1.25rem);padding:var(--mlv-spacing-2) max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3));box-shadow:var(--mlv-shadow-raised);transition:box-shadow var(--mlv-duration-fast) var(--mlv-ease-default)}.mlv-page-header--sticky{position:sticky;top:0;z-index:10}.mlv-page-header--scrolled{box-shadow:var(--mlv-shadow-floating)}.mlv-page-header__breadcrumb,.mlv-page-header__description,.mlv-page-header__meta,.mlv-page-header__tabs,.mlv-page-header__title{min-width:0}.mlv-page-header__back{align-self:flex-start}.mlv-page-header__title-row,.mlv-page-header__tabs-row{display:flex;align-items:center;gap:var(--mlv-spacing-3);min-width:0}.mlv-page-header__title-row{min-height:var(--mlv-height-l)}.mlv-page-header__icon{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;color:var(--mlv-text-secondary)}.mlv-page-header__title h1{margin:0;font-size:calc(var(--mlv-typography-heading-h2-size) + (var(--mlv-typography-heading-h4-size) - var(--mlv-typography-heading-h2-size)) * var(--mlv-page-header-snap));line-height:calc(var(--mlv-typography-heading-h2-line-height) + (var(--mlv-typography-heading-h4-line-height) - var(--mlv-typography-heading-h2-line-height)) * var(--mlv-page-header-snap));letter-spacing:var(--mlv-typography-heading-h2-letter-spacing)}.mlv-page-header__spacer{flex:1 1 auto}.mlv-page-header__actions,.mlv-page-header__tabs-actions{display:flex;flex:0 0 auto;align-items:center;gap:var(--mlv-spacing-2)}.mlv-page-header__actions button,.mlv-page-header__actions a,.mlv-page-header__tabs-actions button,.mlv-page-header__tabs-actions a{white-space:nowrap}.mlv-page-header__description{max-width:48rem;color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-m-size);line-height:var(--mlv-typography-body-m-line-height)}.mlv-page-header__meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--mlv-spacing-2);color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-header__tabs-row{margin-bottom:calc(0rem - var(--mlv-spacing-2))}.mlv-page-header__tabs{flex:1 1 auto;overflow:hidden}.mlv-page-header__tabs>.mlv-tab-group{width:100%}.mlv-page-header__status{display:inline-flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:var(--mlv-spacing-1)}.mlv-page-header__snap-controls{position:absolute;bottom:0;left:50%;z-index:1;display:flex;gap:var(--mlv-spacing-1);transform:translate(-50%,50%)}.mlv-page-header__snap-toggle,.mlv-page-header__snap-pin{background:var(--mlv-background-raised);box-shadow:var(--mlv-shadow-raised)}.mlv-page-header__snap-toggle svg{rotate:calc(180deg * var(--mlv-page-header-snap))}.mlv-page-header__snap-pin--active{color:var(--mlv-text-action);border-color:var(--mlv-border-focus)}.mlv-page-header--tabs-center .mlv-page-header__tabs-row{justify-content:center}.mlv-page-header--tabs-center .mlv-page-header__tabs-row .mlv-page-header__spacer{flex:0 0 0}.mlv-page-header--tabs-center .mlv-page-header__tabs{flex:0 1 auto}.mlv-page-header--tabs-center .mlv-page-header__tabs>.mlv-tab-group{width:auto}.mlv-page-header--size-s{gap:var(--mlv-spacing-1)}.mlv-page-header--size-s .mlv-page-header__title-row{min-height:var(--mlv-height-m)}.mlv-page-header--size-s .mlv-page-header__title h1{font-size:calc(var(--mlv-typography-heading-h4-size) + (var(--mlv-typography-heading-h6-size) - var(--mlv-typography-heading-h4-size)) * var(--mlv-page-header-snap));line-height:calc(var(--mlv-typography-heading-h4-line-height) + (var(--mlv-typography-heading-h6-line-height) - var(--mlv-typography-heading-h4-line-height)) * var(--mlv-page-header-snap));letter-spacing:var(--mlv-letter-spacing-normal)}.mlv-page-header--size-s .mlv-page-header__description{font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-header>.mlv-page-summary{position:static;z-index:auto;margin-inline:calc(-1*max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3)));background:transparent;border-bottom:none;backdrop-filter:none;-webkit-backdrop-filter:none}@container (max-width: 40rem){.mlv-page-header__title-row{flex-wrap:wrap;row-gap:var(--mlv-spacing-1)}.mlv-page-header__title-row .mlv-page-header__spacer{display:none}.mlv-page-header__actions{flex:1 1 100%;flex-wrap:wrap;justify-content:flex-start}}@media(prefers-reduced-motion:reduce){.mlv-page-header,.mlv-page-header *,.mlv-page-header:before,.mlv-page-header:after,[class^=mlv-page-header__],[class*=\" mlv-page-header__\"],[class^=mlv-page-header--],[class*=\" mlv-page-header--\"]{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:var(--mlv-duration-instant)!important}}}\n"] }]
|
|
1532
|
+
}], propDecorators: { back: [{ type: i0.Input, args: [{ isSignal: true, alias: "back", required: false }] }], backLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "backLabel", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], tabsAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabsAlign", required: false }] }], snapControls: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapControls", required: false }] }], toggleLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggleLabel", required: false }] }], pinLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pinLabel", required: false }] }], backClick: [{ type: i0.Output, args: ["backClick"] }], _breadcrumbRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageBreadcrumb), { isSignal: true }] }], _iconRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderIcon), { isSignal: true }] }], _titleRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageTitle), { isSignal: true }] }], _statusRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderStatus), { isSignal: true }] }], _actionsRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderActions), { isSignal: true }] }], _descriptionRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderDescription), { isSignal: true }] }], _metaRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderMeta), { isSignal: true }] }], _tabsRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderTabs), { isSignal: true }] }], _tabsActionsRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageHeaderTabsActions), { isSignal: true }] }] } });
|
|
1533
|
+
|
|
1534
|
+
/** Marks content rendered in the complementary page-aside landmark. */
|
|
1535
|
+
class MlvPageAside extends MlvStructural {
|
|
1536
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageAside, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
1537
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageAside, isStandalone: true, selector: "[mlvPageAside]", usesInheritance: true, ngImport: i0 });
|
|
1538
|
+
}
|
|
1539
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageAside, decorators: [{
|
|
1540
|
+
type: Directive,
|
|
1541
|
+
args: [{ selector: '[mlvPageAside]' }]
|
|
1542
|
+
}] });
|
|
1543
|
+
|
|
1544
|
+
/** Responsive main-content and complementary-aside grid. */
|
|
1545
|
+
class MlvPageContent {
|
|
1546
|
+
/** Places the complementary column before or after the main content. */
|
|
1547
|
+
asidePlacement = input('end', /* @ts-ignore */
|
|
1548
|
+
...(ngDevMode ? [{ debugName: "asidePlacement" }] : /* istanbul ignore next */ []));
|
|
1549
|
+
/** Preferred width of the complementary column while rendered inline. */
|
|
1550
|
+
asideWidth = input('20rem', /* @ts-ignore */
|
|
1551
|
+
...(ngDevMode ? [{ debugName: "asideWidth" }] : /* istanbul ignore next */ []));
|
|
1552
|
+
/** Keeps the complementary column visible while the page scrolls. */
|
|
1553
|
+
asideSticky = input(true, { ...(ngDevMode ? { debugName: "asideSticky" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
1554
|
+
/** Selects the spacing between the main and complementary columns. */
|
|
1555
|
+
gap = input('m', /* @ts-ignore */
|
|
1556
|
+
...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
|
|
1557
|
+
/** Container width in CSS pixels below which the columns stack. */
|
|
1558
|
+
stackBelow = input(1024, /* @ts-ignore */
|
|
1559
|
+
...(ngDevMode ? [{ debugName: "stackBelow" }] : /* istanbul ignore next */ []));
|
|
1560
|
+
/** Accessible name for the complementary `<aside>` landmark. */
|
|
1561
|
+
asideLabel = input('Related content', /* @ts-ignore */
|
|
1562
|
+
...(ngDevMode ? [{ debugName: "asideLabel" }] : /* istanbul ignore next */ []));
|
|
1563
|
+
/** @protected Optional complementary content projected via `[mlvPageAside]`. */
|
|
1564
|
+
_asideRef = contentChild(MlvPageAside, /* @ts-ignore */
|
|
1565
|
+
...(ngDevMode ? [{ debugName: "_asideRef" }] : /* istanbul ignore next */ []));
|
|
1566
|
+
/**
|
|
1567
|
+
* @protected Whether complementary content is actually projected.
|
|
1568
|
+
*
|
|
1569
|
+
* The grid only reserves the aside track while this is `true`, so a consumer
|
|
1570
|
+
* that projects no `[mlvPageAside]` keeps the full inline size for its main
|
|
1571
|
+
* column instead of silently losing `asideWidth` to an empty track.
|
|
1572
|
+
*/
|
|
1573
|
+
_hasAside = computed(() => !!this._asideRef()?.templateRef, /* @ts-ignore */
|
|
1574
|
+
...(ngDevMode ? [{ debugName: "_hasAside" }] : /* istanbul ignore next */ []));
|
|
1575
|
+
/** @private Host element observed so responsiveness follows available content width. */
|
|
1576
|
+
_elementRef = inject((ElementRef));
|
|
1577
|
+
/** @private Shared observer used to measure the page-content container. */
|
|
1578
|
+
_resizeObserver = inject(MlvResizeObserverService);
|
|
1579
|
+
/** @private Destroy scope for the resize-observer subscription. */
|
|
1580
|
+
_destroyRef = inject(DestroyRef);
|
|
1581
|
+
/** @private Latest measured inline size in CSS pixels. */
|
|
1582
|
+
_containerWidth = signal(0, /* @ts-ignore */
|
|
1583
|
+
...(ngDevMode ? [{ debugName: "_containerWidth" }] : /* istanbul ignore next */ []));
|
|
1584
|
+
/** @protected Whether the current container is narrower than `stackBelow`. */
|
|
1585
|
+
_stacked = computed(() => {
|
|
1586
|
+
const width = this._containerWidth();
|
|
1587
|
+
return width > 0 && width < this.stackBelow();
|
|
1588
|
+
}, /* @ts-ignore */
|
|
1589
|
+
...(ngDevMode ? [{ debugName: "_stacked" }] : /* istanbul ignore next */ []));
|
|
1590
|
+
constructor() {
|
|
1591
|
+
this._resizeObserver
|
|
1592
|
+
.observe(this._elementRef)
|
|
1593
|
+
.pipe(takeUntilDestroyed(this._destroyRef))
|
|
1594
|
+
.subscribe((entries) => {
|
|
1595
|
+
const width = entries[entries.length - 1]?.contentRect.width;
|
|
1596
|
+
if (width !== undefined)
|
|
1597
|
+
this._containerWidth.set(width);
|
|
1598
|
+
});
|
|
1599
|
+
}
|
|
1600
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1601
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MlvPageContent, isStandalone: true, selector: "mlv-page-content", inputs: { asidePlacement: { classPropertyName: "asidePlacement", publicName: "asidePlacement", isSignal: true, isRequired: false, transformFunction: null }, asideWidth: { classPropertyName: "asideWidth", publicName: "asideWidth", isSignal: true, isRequired: false, transformFunction: null }, asideSticky: { classPropertyName: "asideSticky", publicName: "asideSticky", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, stackBelow: { classPropertyName: "stackBelow", publicName: "stackBelow", isSignal: true, isRequired: false, transformFunction: null }, asideLabel: { classPropertyName: "asideLabel", publicName: "asideLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.mlv-page-content--aside-start": "asidePlacement() === \"start\"", "class.mlv-page-content--aside-end": "asidePlacement() === \"end\"", "class.mlv-page-content--aside-sticky": "asideSticky()", "class.mlv-page-content--gap-s": "gap() === \"s\"", "class.mlv-page-content--gap-m": "gap() === \"m\"", "class.mlv-page-content--gap-l": "gap() === \"l\"", "class.mlv-page-content--stacked": "_stacked()", "class.mlv-page-content--has-aside": "_hasAside()", "style.--mlv-page-aside-width": "asideWidth()" }, classAttribute: "mlv-page-content" }, queries: [{ propertyName: "_asideRef", first: true, predicate: MlvPageAside, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"mlv-page-content__main\"><ng-content /></div>\n\n@if (_asideRef()?.templateRef; as asideTpl) {\n<aside class=\"mlv-page-content__aside\" [attr.aria-label]=\"asideLabel()\">\n <ng-template [ngTemplateOutlet]=\"asideTpl\" />\n</aside>\n}\n", styles: ["@layer mlv.components{.mlv-page-content{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-content *{box-sizing:border-box}.mlv-page-content{display:grid;grid-template-columns:minmax(0,1fr);grid-template-areas:\"main\";align-items:start;min-width:0;padding-top:var(--mlv-spacing-2)}.mlv-page-content--gap-s{gap:var(--mlv-spacing-2)}.mlv-page-content--gap-m{gap:var(--mlv-spacing-4)}.mlv-page-content--gap-l{gap:var(--mlv-spacing-6)}.mlv-page-content--has-aside:not(.mlv-page-content--stacked){grid-template-columns:minmax(0,1fr) minmax(0,var(--mlv-page-aside-width, 20rem));grid-template-areas:\"main aside\"}.mlv-page-content--has-aside:not(.mlv-page-content--stacked).mlv-page-content--aside-start{grid-template-columns:minmax(0,var(--mlv-page-aside-width, 20rem)) minmax(0,1fr);grid-template-areas:\"aside main\"}.mlv-page-content__main{grid-area:main;min-width:0}.mlv-page-content__aside{grid-area:aside;min-width:0}.mlv-page-content--aside-sticky .mlv-page-content__aside{position:sticky;top:var(--mlv-page-aside-offset, var(--mlv-spacing-4))}.mlv-page-content--stacked{grid-template-columns:minmax(0,1fr);grid-template-areas:\"main\"}.mlv-page-content--stacked.mlv-page-content--has-aside{grid-template-areas:\"main\" \"aside\"}.mlv-page-content--stacked.mlv-page-content--has-aside.mlv-page-content--aside-start{grid-template-areas:\"aside\" \"main\"}.mlv-page-content--stacked .mlv-page-content__aside{position:static}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1602
|
+
}
|
|
1603
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageContent, decorators: [{
|
|
1604
|
+
type: Component,
|
|
1605
|
+
args: [{ selector: 'mlv-page-content', imports: [NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1606
|
+
class: 'mlv-page-content',
|
|
1607
|
+
'[class.mlv-page-content--aside-start]': 'asidePlacement() === "start"',
|
|
1608
|
+
'[class.mlv-page-content--aside-end]': 'asidePlacement() === "end"',
|
|
1609
|
+
'[class.mlv-page-content--aside-sticky]': 'asideSticky()',
|
|
1610
|
+
'[class.mlv-page-content--gap-s]': 'gap() === "s"',
|
|
1611
|
+
'[class.mlv-page-content--gap-m]': 'gap() === "m"',
|
|
1612
|
+
'[class.mlv-page-content--gap-l]': 'gap() === "l"',
|
|
1613
|
+
'[class.mlv-page-content--stacked]': '_stacked()',
|
|
1614
|
+
'[class.mlv-page-content--has-aside]': '_hasAside()',
|
|
1615
|
+
'[style.--mlv-page-aside-width]': 'asideWidth()',
|
|
1616
|
+
}, template: "<div class=\"mlv-page-content__main\"><ng-content /></div>\n\n@if (_asideRef()?.templateRef; as asideTpl) {\n<aside class=\"mlv-page-content__aside\" [attr.aria-label]=\"asideLabel()\">\n <ng-template [ngTemplateOutlet]=\"asideTpl\" />\n</aside>\n}\n", styles: ["@layer mlv.components{.mlv-page-content{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-content *{box-sizing:border-box}.mlv-page-content{display:grid;grid-template-columns:minmax(0,1fr);grid-template-areas:\"main\";align-items:start;min-width:0;padding-top:var(--mlv-spacing-2)}.mlv-page-content--gap-s{gap:var(--mlv-spacing-2)}.mlv-page-content--gap-m{gap:var(--mlv-spacing-4)}.mlv-page-content--gap-l{gap:var(--mlv-spacing-6)}.mlv-page-content--has-aside:not(.mlv-page-content--stacked){grid-template-columns:minmax(0,1fr) minmax(0,var(--mlv-page-aside-width, 20rem));grid-template-areas:\"main aside\"}.mlv-page-content--has-aside:not(.mlv-page-content--stacked).mlv-page-content--aside-start{grid-template-columns:minmax(0,var(--mlv-page-aside-width, 20rem)) minmax(0,1fr);grid-template-areas:\"aside main\"}.mlv-page-content__main{grid-area:main;min-width:0}.mlv-page-content__aside{grid-area:aside;min-width:0}.mlv-page-content--aside-sticky .mlv-page-content__aside{position:sticky;top:var(--mlv-page-aside-offset, var(--mlv-spacing-4))}.mlv-page-content--stacked{grid-template-columns:minmax(0,1fr);grid-template-areas:\"main\"}.mlv-page-content--stacked.mlv-page-content--has-aside{grid-template-areas:\"main\" \"aside\"}.mlv-page-content--stacked.mlv-page-content--has-aside.mlv-page-content--aside-start{grid-template-areas:\"aside\" \"main\"}.mlv-page-content--stacked .mlv-page-content__aside{position:static}}\n"] }]
|
|
1617
|
+
}], ctorParameters: () => [], propDecorators: { asidePlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "asidePlacement", required: false }] }], asideWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "asideWidth", required: false }] }], asideSticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "asideSticky", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], stackBelow: [{ type: i0.Input, args: [{ isSignal: true, alias: "stackBelow", required: false }] }], asideLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "asideLabel", required: false }] }], _asideRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MlvPageAside), { isSignal: true }] }] } });
|
|
1618
|
+
|
|
1619
|
+
/**
|
|
1620
|
+
* Key-facts strip rendered under a page header. Projects
|
|
1621
|
+
* `mlv-page-summary-item` children in a wrapping row.
|
|
1622
|
+
*
|
|
1623
|
+
* Inside `main[mlvPage]` the strip participates in the scroll-scrubbed snap
|
|
1624
|
+
* timeline: its height and opacity are interpolated from the page-level
|
|
1625
|
+
* `--mlv-page-snap` progress over the `snapFrom`..`snapTo` stagger window.
|
|
1626
|
+
* Collapse/expand and pinning are controlled by the header's snap controls
|
|
1627
|
+
* (`mlv-page-header[snapControls]`) through `MlvPageSnapController` — the
|
|
1628
|
+
* strip itself is purely presentational.
|
|
1629
|
+
*
|
|
1630
|
+
* A fully collapsed strip is `visibility: hidden` and therefore leaves the
|
|
1631
|
+
* accessibility tree and the tab order — except while it holds focus, when it
|
|
1632
|
+
* reveals itself instead (`mlv-page-summary--revealed`) so that scrolling can
|
|
1633
|
+
* never blur a focused control into `<body>`. See {@link MlvPageSnapRegionBase}.
|
|
1634
|
+
*/
|
|
1635
|
+
class MlvPageSummary extends MlvPageSnapRegionBase {
|
|
1636
|
+
/** Accessible name for the facts region. */
|
|
1637
|
+
summaryLabel = input('Page summary', /* @ts-ignore */
|
|
1638
|
+
...(ngDevMode ? [{ debugName: "summaryLabel" }] : /* istanbul ignore next */ []));
|
|
1639
|
+
/** Progress at which the strip starts collapsing (0..1). */
|
|
1640
|
+
snapFrom = input(0.1, /* @ts-ignore */
|
|
1641
|
+
...(ngDevMode ? [{ debugName: "snapFrom" }] : /* istanbul ignore next */ []));
|
|
1642
|
+
/** Progress at which the strip is fully collapsed (0..1). */
|
|
1643
|
+
snapTo = input(0.95, /* @ts-ignore */
|
|
1644
|
+
...(ngDevMode ? [{ debugName: "snapTo" }] : /* istanbul ignore next */ []));
|
|
1645
|
+
/** @protected Multiplier remapping page progress into the stagger window. */
|
|
1646
|
+
_scale = computed(() => 1 / Math.max(this.snapTo() - this.snapFrom(), 0.001), /* @ts-ignore */
|
|
1647
|
+
...(ngDevMode ? [{ debugName: "_scale" }] : /* istanbul ignore next */ []));
|
|
1648
|
+
/**
|
|
1649
|
+
* @protected True once the strip has fully collapsed; unless it holds
|
|
1650
|
+
* focus, that also removes it from the accessibility tree and tab order.
|
|
1651
|
+
*/
|
|
1652
|
+
_elapsed = computed(() => (this._snapController?.progress() ?? 0) >= Math.min(this.snapTo(), 1), /* @ts-ignore */
|
|
1653
|
+
...(ngDevMode ? [{ debugName: "_elapsed" }] : /* istanbul ignore next */ []));
|
|
1654
|
+
/** @protected Natural height of the items row, driving the height scrub. */
|
|
1655
|
+
_measuredHeight = signal(null, /* @ts-ignore */
|
|
1656
|
+
...(ngDevMode ? [{ debugName: "_measuredHeight" }] : /* istanbul ignore next */ []));
|
|
1657
|
+
/** @private The measured items row. */
|
|
1658
|
+
_items = viewChild.required('items', /* @ts-ignore */
|
|
1659
|
+
...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
|
|
1660
|
+
constructor() {
|
|
1661
|
+
super();
|
|
1662
|
+
const resizeObserver = inject(MlvResizeObserverService);
|
|
1663
|
+
const destroyRef = inject(DestroyRef);
|
|
1664
|
+
afterNextRender(() => {
|
|
1665
|
+
const itemsEl = this._items().nativeElement;
|
|
1666
|
+
// offsetHeight includes the row's own padding, matching the host
|
|
1667
|
+
// max-height the scrub interpolates against.
|
|
1668
|
+
this._measuredHeight.set(itemsEl.offsetHeight);
|
|
1669
|
+
const subscription = resizeObserver.observe(itemsEl).subscribe(() => {
|
|
1670
|
+
if (itemsEl.offsetHeight > 0) {
|
|
1671
|
+
this._measuredHeight.set(itemsEl.offsetHeight);
|
|
1672
|
+
}
|
|
1673
|
+
});
|
|
1674
|
+
destroyRef.onDestroy(() => subscription.unsubscribe());
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSummary, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1678
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.7", type: MlvPageSummary, isStandalone: true, selector: "mlv-page-summary", inputs: { summaryLabel: { classPropertyName: "summaryLabel", publicName: "summaryLabel", isSignal: true, isRequired: false, transformFunction: null }, snapFrom: { classPropertyName: "snapFrom", publicName: "snapFrom", isSignal: true, isRequired: false, transformFunction: null }, snapTo: { classPropertyName: "snapTo", publicName: "snapTo", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "_onRegionFocusIn()", "focusout": "_onRegionFocusOut($event)" }, properties: { "class.mlv-page-summary--snapped": "_elapsed()", "class.mlv-page-summary--revealed": "_revealed()", "style.--mlv-snap-from": "snapFrom()", "style.--mlv-snap-scale": "_scale()", "style.--mlv-page-summary-size": "_measuredHeight()", "style.visibility": "_hidden() ? \"hidden\" : null" }, classAttribute: "mlv-page-summary" }, viewQueries: [{ propertyName: "_items", first: true, predicate: ["items"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `<div
|
|
1679
|
+
#items
|
|
1680
|
+
class="mlv-page-summary__items"
|
|
1681
|
+
role="group"
|
|
1682
|
+
[attr.aria-label]="summaryLabel()"
|
|
1683
|
+
>
|
|
1684
|
+
<ng-content />
|
|
1685
|
+
</div>`, isInline: true, styles: ["@layer mlv.components{.mlv-page-summary{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-summary *{box-sizing:border-box}.mlv-page-summary{--mlv-page-summary-snap: clamp( 0, (var(--mlv-page-snap, 0) - var(--mlv-snap-from, .1)) * var(--mlv-snap-scale, 1.18), 1 );position:relative;z-index:9;display:block;min-width:0;max-height:calc(var(--mlv-page-summary-size, 480) * 1px * (1 - var(--mlv-page-summary-snap)));overflow:hidden;background-color:var(--mlv-page-chrome-bg, color-mix(in srgb, var(--mlv-elevation-bg-3), transparent 50%));border-bottom:.0625rem solid var(--mlv-page-chrome-border, var(--mlv-border-subtle));backdrop-filter:blur(1.25rem);-webkit-backdrop-filter:blur(1.25rem);opacity:calc(1 - var(--mlv-page-summary-snap) * 1.25)}.mlv-page-summary--revealed{--mlv-page-summary-snap: 0}.mlv-page-summary__items{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--mlv-spacing-2) var(--mlv-spacing-4);padding:var(--mlv-spacing-2) max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3)) var(--mlv-spacing-4)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1686
|
+
}
|
|
1687
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSummary, decorators: [{
|
|
1688
|
+
type: Component,
|
|
1689
|
+
args: [{ selector: 'mlv-page-summary', template: `<div
|
|
1690
|
+
#items
|
|
1691
|
+
class="mlv-page-summary__items"
|
|
1692
|
+
role="group"
|
|
1693
|
+
[attr.aria-label]="summaryLabel()"
|
|
1694
|
+
>
|
|
1695
|
+
<ng-content />
|
|
1696
|
+
</div>`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1697
|
+
class: 'mlv-page-summary',
|
|
1698
|
+
'[class.mlv-page-summary--snapped]': '_elapsed()',
|
|
1699
|
+
'[class.mlv-page-summary--revealed]': '_revealed()',
|
|
1700
|
+
'[style.--mlv-snap-from]': 'snapFrom()',
|
|
1701
|
+
'[style.--mlv-snap-scale]': '_scale()',
|
|
1702
|
+
'[style.--mlv-page-summary-size]': '_measuredHeight()',
|
|
1703
|
+
'[style.visibility]': '_hidden() ? "hidden" : null',
|
|
1704
|
+
'(focusin)': '_onRegionFocusIn()',
|
|
1705
|
+
'(focusout)': '_onRegionFocusOut($event)',
|
|
1706
|
+
}, styles: ["@layer mlv.components{.mlv-page-summary{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-summary *{box-sizing:border-box}.mlv-page-summary{--mlv-page-summary-snap: clamp( 0, (var(--mlv-page-snap, 0) - var(--mlv-snap-from, .1)) * var(--mlv-snap-scale, 1.18), 1 );position:relative;z-index:9;display:block;min-width:0;max-height:calc(var(--mlv-page-summary-size, 480) * 1px * (1 - var(--mlv-page-summary-snap)));overflow:hidden;background-color:var(--mlv-page-chrome-bg, color-mix(in srgb, var(--mlv-elevation-bg-3), transparent 50%));border-bottom:.0625rem solid var(--mlv-page-chrome-border, var(--mlv-border-subtle));backdrop-filter:blur(1.25rem);-webkit-backdrop-filter:blur(1.25rem);opacity:calc(1 - var(--mlv-page-summary-snap) * 1.25)}.mlv-page-summary--revealed{--mlv-page-summary-snap: 0}.mlv-page-summary__items{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--mlv-spacing-2) var(--mlv-spacing-4);padding:var(--mlv-spacing-2) max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3)) var(--mlv-spacing-4)}}\n"] }]
|
|
1707
|
+
}], ctorParameters: () => [], propDecorators: { summaryLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "summaryLabel", required: false }] }], snapFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapFrom", required: false }] }], snapTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapTo", required: false }] }], _items: [{ type: i0.ViewChild, args: ['items', { isSignal: true }] }] } });
|
|
1708
|
+
|
|
1709
|
+
/**
|
|
1710
|
+
* One labelled key fact inside `mlv-page-summary`. The label renders above
|
|
1711
|
+
* the projected value content.
|
|
1712
|
+
*/
|
|
1713
|
+
class MlvPageSummaryItem {
|
|
1714
|
+
/** Visible label describing the projected value. */
|
|
1715
|
+
label = input.required(/* @ts-ignore */
|
|
1716
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
1717
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSummaryItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1718
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MlvPageSummaryItem, isStandalone: true, selector: "mlv-page-summary-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "mlv-page-summary-item" }, ngImport: i0, template: `
|
|
1719
|
+
<span class="mlv-page-summary-item__label">{{ label() }}</span>
|
|
1720
|
+
<div class="mlv-page-summary-item__value"><ng-content /></div>
|
|
1721
|
+
`, isInline: true, styles: ["@layer mlv.components{.mlv-page-summary-item{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-summary-item *{box-sizing:border-box}.mlv-page-summary-item{display:flex;flex:1 1 10rem;flex-direction:column;gap:var(--mlv-spacing-0-5);min-width:0}.mlv-page-summary-item__label{color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-summary-item__value{overflow:hidden;color:var(--mlv-text-primary);font-size:var(--mlv-typography-body-m-size);line-height:var(--mlv-typography-body-m-line-height);text-overflow:ellipsis;white-space:nowrap}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1722
|
+
}
|
|
1723
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageSummaryItem, decorators: [{
|
|
1724
|
+
type: Component,
|
|
1725
|
+
args: [{ selector: 'mlv-page-summary-item', template: `
|
|
1726
|
+
<span class="mlv-page-summary-item__label">{{ label() }}</span>
|
|
1727
|
+
<div class="mlv-page-summary-item__value"><ng-content /></div>
|
|
1728
|
+
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1729
|
+
class: 'mlv-page-summary-item',
|
|
1730
|
+
}, styles: ["@layer mlv.components{.mlv-page-summary-item{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-summary-item *{box-sizing:border-box}.mlv-page-summary-item{display:flex;flex:1 1 10rem;flex-direction:column;gap:var(--mlv-spacing-0-5);min-width:0}.mlv-page-summary-item__label{color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-summary-item__value{overflow:hidden;color:var(--mlv-text-primary);font-size:var(--mlv-typography-body-m-size);line-height:var(--mlv-typography-body-m-line-height);text-overflow:ellipsis;white-space:nowrap}}\n"] }]
|
|
1731
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }] } });
|
|
1732
|
+
|
|
1733
|
+
/**
|
|
1734
|
+
* Custom property published on `document.documentElement` while at least one
|
|
1735
|
+
* sticky dock is on screen. Viewport-anchored overlays — most importantly the
|
|
1736
|
+
* bottom toast positions — read it so they never render underneath the dock.
|
|
1737
|
+
*/
|
|
1738
|
+
const DOCK_HEIGHT_PROPERTY = '--mlv-page-dock-height';
|
|
1739
|
+
/**
|
|
1740
|
+
* @internal Heights contributed by the sticky docks currently alive, keyed by
|
|
1741
|
+
* the owning component. Two pages can be mounted at once (a route transition,
|
|
1742
|
+
* a page inside a dialog), so the published value is the tallest contribution
|
|
1743
|
+
* rather than whichever dock rendered last.
|
|
1744
|
+
*/
|
|
1745
|
+
const stickyDockHeights = new Map();
|
|
1746
|
+
/**
|
|
1747
|
+
* @internal Republishes {@link DOCK_HEIGHT_PROPERTY} after a contribution
|
|
1748
|
+
* changed. Passing `null` withdraws the owner's contribution; the property is
|
|
1749
|
+
* removed entirely once the last sticky dock is gone, so a page without a dock
|
|
1750
|
+
* never leaves a stale offset behind.
|
|
1751
|
+
*/
|
|
1752
|
+
function publishStickyDockHeight(owner, height) {
|
|
1753
|
+
// The teardown path also runs during server rendering, where there is no
|
|
1754
|
+
// document to publish to.
|
|
1755
|
+
if (typeof document === 'undefined') {
|
|
1756
|
+
return;
|
|
1757
|
+
}
|
|
1758
|
+
if (height === null) {
|
|
1759
|
+
stickyDockHeights.delete(owner);
|
|
1760
|
+
}
|
|
1761
|
+
else {
|
|
1762
|
+
stickyDockHeights.set(owner, height);
|
|
1763
|
+
}
|
|
1764
|
+
const root = document.documentElement;
|
|
1765
|
+
if (stickyDockHeights.size === 0) {
|
|
1766
|
+
root.style.removeProperty(DOCK_HEIGHT_PROPERTY);
|
|
1767
|
+
return;
|
|
1768
|
+
}
|
|
1769
|
+
const tallest = Math.max(...stickyDockHeights.values());
|
|
1770
|
+
root.style.setProperty(DOCK_HEIGHT_PROPERTY, `${Math.round(tallest * 100) / 100}px`);
|
|
1771
|
+
}
|
|
1772
|
+
/**
|
|
1773
|
+
* Bottom action bar for workflow pages. Projects content marked with
|
|
1774
|
+
* `[mlvPageDockStart]`, `[mlvPageDockCenter]`, and `[mlvPageDockEnd]` into a
|
|
1775
|
+
* three-region row and, by default, sticks to the bottom edge of the owning
|
|
1776
|
+
* page's scroll area. Typical composition: pending-change status at the
|
|
1777
|
+
* start, a floating tool cluster in the center, and discard/schedule/save/
|
|
1778
|
+
* publish actions at the end.
|
|
1779
|
+
*
|
|
1780
|
+
* `appearance="floating"` drops the dock's own glass surface — whatever floats
|
|
1781
|
+
* inside it, e.g. a pill action bar, brings its own — and replaces it with the
|
|
1782
|
+
* `mlvFloatingContainer` recipe from `@malva-ui/cdk/floating-container`: a
|
|
1783
|
+
* gradient-masked backdrop plus safe-area block-end padding, so content fades
|
|
1784
|
+
* out beneath the actions instead of scrolling straight into them. Override
|
|
1785
|
+
* the backdrop fill with `--mlv-page-dock-backdrop` (defaults to
|
|
1786
|
+
* `--mlv-background-base`).
|
|
1787
|
+
*
|
|
1788
|
+
* The dock derives its full-bleed margins from the inherited
|
|
1789
|
+
* `--mlv-page-inset`, so the geometry survives a wrapper element (a `<form>`,
|
|
1790
|
+
* a `<section>`) between the page canvas and the dock, and collapses to zero
|
|
1791
|
+
* outside a page.
|
|
1792
|
+
*
|
|
1793
|
+
* While `sticky`, the dock publishes its measured height as
|
|
1794
|
+
* `--mlv-page-dock-height` on `document.documentElement`; bottom-anchored
|
|
1795
|
+
* toasts offset themselves by it so they are never covered by the dock.
|
|
1796
|
+
*/
|
|
1797
|
+
class MlvPageDock {
|
|
1798
|
+
/** Keeps the dock attached to the bottom edge of the page scroll area. */
|
|
1799
|
+
sticky = input(true, { ...(ngDevMode ? { debugName: "sticky" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
|
|
1800
|
+
/** Solid bar with a top border, or a floating gradient-masked backdrop. */
|
|
1801
|
+
appearance = input('bar', /* @ts-ignore */
|
|
1802
|
+
...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
|
|
1803
|
+
/** @private Host element whose border-box height is published. */
|
|
1804
|
+
_host = inject(ElementRef);
|
|
1805
|
+
/** @private Shared resize observation used to track the dock's height. */
|
|
1806
|
+
_resizeObserver = inject(MlvResizeObserverService);
|
|
1807
|
+
/** @private Withdraws this dock's height contribution on teardown. */
|
|
1808
|
+
_destroyRef = inject(DestroyRef);
|
|
1809
|
+
/**
|
|
1810
|
+
* @private Latest measured border-box height of the dock, in pixels. Only
|
|
1811
|
+
* written in a browser — during server rendering it stays at 0 and nothing
|
|
1812
|
+
* is published.
|
|
1813
|
+
*/
|
|
1814
|
+
_measuredHeight = signal(0, /* @ts-ignore */
|
|
1815
|
+
...(ngDevMode ? [{ debugName: "_measuredHeight" }] : /* istanbul ignore next */ []));
|
|
1816
|
+
constructor() {
|
|
1817
|
+
// `afterNextRender` / `afterRenderEffect` never run on the server, so the
|
|
1818
|
+
// document is only touched in a browser.
|
|
1819
|
+
afterNextRender(() => {
|
|
1820
|
+
this._measuredHeight.set(this._host.nativeElement.offsetHeight);
|
|
1821
|
+
this._resizeObserver
|
|
1822
|
+
.observe(this._host)
|
|
1823
|
+
.pipe(takeUntilDestroyed(this._destroyRef))
|
|
1824
|
+
.subscribe(() => {
|
|
1825
|
+
this._measuredHeight.set(this._host.nativeElement.offsetHeight);
|
|
1826
|
+
});
|
|
1827
|
+
});
|
|
1828
|
+
afterRenderEffect(() => {
|
|
1829
|
+
// A non-sticky dock scrolls away with the content, so it never covers a
|
|
1830
|
+
// viewport-anchored overlay and must not reserve space for one.
|
|
1831
|
+
const height = this.sticky() ? this._measuredHeight() : null;
|
|
1832
|
+
publishStickyDockHeight(this, height);
|
|
1833
|
+
});
|
|
1834
|
+
this._destroyRef.onDestroy(() => publishStickyDockHeight(this, null));
|
|
1835
|
+
}
|
|
1836
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDock, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1837
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MlvPageDock, isStandalone: true, selector: "mlv-page-dock", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.mlv-page-dock--sticky": "sticky()", "class.mlv-page-dock--floating": "appearance() === \"floating\"" }, classAttribute: "mlv-page-dock" }, ngImport: i0, template: `
|
|
1838
|
+
<ng-content select="[mlvPageDockStart]" />
|
|
1839
|
+
<ng-content select="[mlvPageDockCenter]" />
|
|
1840
|
+
<ng-content select="[mlvPageDockEnd]" />
|
|
1841
|
+
`, isInline: true, styles: ["@layer mlv.components{.mlv-page-dock{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-dock *{box-sizing:border-box}.mlv-page-dock{position:relative;display:grid;grid-template-columns:1fr minmax(0,auto) 1fr;align-items:center;gap:var(--mlv-spacing-2);min-width:0;margin-inline:calc(-1 * var(--mlv-page-inset, 0rem));margin-bottom:calc(-1 * var(--mlv-page-inset, 0rem));padding:var(--mlv-spacing-1-5) max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3));background-color:var(--mlv-page-chrome-bg, color-mix(in srgb, var(--mlv-elevation-bg-3), transparent 50%));border-top:.0625rem solid var(--mlv-page-chrome-border, var(--mlv-border-subtle));backdrop-filter:blur(1.25rem);-webkit-backdrop-filter:blur(1.25rem)}.mlv-page-dock button,.mlv-page-dock a{white-space:nowrap}.mlv-page-dock--sticky{position:sticky;bottom:0;z-index:10}.mlv-page-dock--floating:before{content:\"\";position:absolute;inset:-2.5rem 0 0;z-index:-1;background:var(--mlv-page-dock-backdrop, var(--mlv-background-base));-webkit-mask-image:linear-gradient(180deg,transparent,black 2.5rem);mask-image:linear-gradient(180deg,transparent,black 2.5rem);pointer-events:none}.mlv-page-dock--floating{padding-block-end:max(var(--mlv-spacing-1-5),env(safe-area-inset-bottom));isolation:isolate;background:transparent;border-top:none;backdrop-filter:none;-webkit-backdrop-filter:none}.mlv-page-dock__start,.mlv-page-dock__center,.mlv-page-dock__end{flex-wrap:wrap}.mlv-page-dock__start{display:flex;align-items:center;gap:var(--mlv-spacing-2);min-width:0;color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-dock__center{display:flex;grid-column:2;align-items:center;gap:var(--mlv-spacing-1);min-width:0}.mlv-page-dock__end{display:flex;grid-column:3;align-items:center;justify-content:flex-end;gap:var(--mlv-spacing-2)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1842
|
+
}
|
|
1843
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDock, decorators: [{
|
|
1844
|
+
type: Component,
|
|
1845
|
+
args: [{ selector: 'mlv-page-dock', template: `
|
|
1846
|
+
<ng-content select="[mlvPageDockStart]" />
|
|
1847
|
+
<ng-content select="[mlvPageDockCenter]" />
|
|
1848
|
+
<ng-content select="[mlvPageDockEnd]" />
|
|
1849
|
+
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
1850
|
+
class: 'mlv-page-dock',
|
|
1851
|
+
'[class.mlv-page-dock--sticky]': 'sticky()',
|
|
1852
|
+
'[class.mlv-page-dock--floating]': 'appearance() === "floating"',
|
|
1853
|
+
}, styles: ["@layer mlv.components{.mlv-page-dock{box-sizing:border-box;padding:0;margin:0;font-family:var(--mlv-typography-family-text);font-size:var(--mlv-font-size-m)}.mlv-page-dock *{box-sizing:border-box}.mlv-page-dock{position:relative;display:grid;grid-template-columns:1fr minmax(0,auto) 1fr;align-items:center;gap:var(--mlv-spacing-2);min-width:0;margin-inline:calc(-1 * var(--mlv-page-inset, 0rem));margin-bottom:calc(-1 * var(--mlv-page-inset, 0rem));padding:var(--mlv-spacing-1-5) max(var(--mlv-page-inset, 0rem),var(--mlv-spacing-3));background-color:var(--mlv-page-chrome-bg, color-mix(in srgb, var(--mlv-elevation-bg-3), transparent 50%));border-top:.0625rem solid var(--mlv-page-chrome-border, var(--mlv-border-subtle));backdrop-filter:blur(1.25rem);-webkit-backdrop-filter:blur(1.25rem)}.mlv-page-dock button,.mlv-page-dock a{white-space:nowrap}.mlv-page-dock--sticky{position:sticky;bottom:0;z-index:10}.mlv-page-dock--floating:before{content:\"\";position:absolute;inset:-2.5rem 0 0;z-index:-1;background:var(--mlv-page-dock-backdrop, var(--mlv-background-base));-webkit-mask-image:linear-gradient(180deg,transparent,black 2.5rem);mask-image:linear-gradient(180deg,transparent,black 2.5rem);pointer-events:none}.mlv-page-dock--floating{padding-block-end:max(var(--mlv-spacing-1-5),env(safe-area-inset-bottom));isolation:isolate;background:transparent;border-top:none;backdrop-filter:none;-webkit-backdrop-filter:none}.mlv-page-dock__start,.mlv-page-dock__center,.mlv-page-dock__end{flex-wrap:wrap}.mlv-page-dock__start{display:flex;align-items:center;gap:var(--mlv-spacing-2);min-width:0;color:var(--mlv-text-secondary);font-size:var(--mlv-typography-body-s-size);line-height:var(--mlv-typography-body-s-line-height)}.mlv-page-dock__center{display:flex;grid-column:2;align-items:center;gap:var(--mlv-spacing-1);min-width:0}.mlv-page-dock__end{display:flex;grid-column:3;align-items:center;justify-content:flex-end;gap:var(--mlv-spacing-2)}}\n"] }]
|
|
1854
|
+
}], ctorParameters: () => [], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }] } });
|
|
1855
|
+
|
|
1856
|
+
/** Marks leading dock content, typically pending-change status text. */
|
|
1857
|
+
class MlvPageDockStart {
|
|
1858
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDockStart, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1859
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageDockStart, isStandalone: true, selector: "[mlvPageDockStart]", host: { classAttribute: "mlv-page-dock__start" }, ngImport: i0 });
|
|
1860
|
+
}
|
|
1861
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDockStart, decorators: [{
|
|
1862
|
+
type: Directive,
|
|
1863
|
+
args: [{
|
|
1864
|
+
selector: '[mlvPageDockStart]',
|
|
1865
|
+
host: { class: 'mlv-page-dock__start' },
|
|
1866
|
+
}]
|
|
1867
|
+
}] });
|
|
1868
|
+
/** Marks the centered dock content, typically a floating tool cluster. */
|
|
1869
|
+
class MlvPageDockCenter {
|
|
1870
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDockCenter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1871
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageDockCenter, isStandalone: true, selector: "[mlvPageDockCenter]", host: { classAttribute: "mlv-page-dock__center" }, ngImport: i0 });
|
|
1872
|
+
}
|
|
1873
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDockCenter, decorators: [{
|
|
1874
|
+
type: Directive,
|
|
1875
|
+
args: [{
|
|
1876
|
+
selector: '[mlvPageDockCenter]',
|
|
1877
|
+
host: { class: 'mlv-page-dock__center' },
|
|
1878
|
+
}]
|
|
1879
|
+
}] });
|
|
1880
|
+
/** Marks trailing dock content, typically the primary workflow actions. */
|
|
1881
|
+
class MlvPageDockEnd {
|
|
1882
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDockEnd, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1883
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: MlvPageDockEnd, isStandalone: true, selector: "[mlvPageDockEnd]", host: { classAttribute: "mlv-page-dock__end" }, ngImport: i0 });
|
|
1884
|
+
}
|
|
1885
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MlvPageDockEnd, decorators: [{
|
|
1886
|
+
type: Directive,
|
|
1887
|
+
args: [{
|
|
1888
|
+
selector: '[mlvPageDockEnd]',
|
|
1889
|
+
host: { class: 'mlv-page-dock__end' },
|
|
1890
|
+
}]
|
|
1891
|
+
}] });
|
|
1892
|
+
|
|
1893
|
+
/**
|
|
1894
|
+
* Generated bundle index. Do not edit.
|
|
1895
|
+
*/
|
|
1896
|
+
|
|
1897
|
+
export { MLV_PAGE_SCROLL, MlvPage, MlvPageAside, MlvPageBreadcrumb, MlvPageContent, MlvPageDock, MlvPageDockCenter, MlvPageDockEnd, MlvPageDockStart, MlvPageEndPane, MlvPageEndPaneContent, MlvPageEndPaneTrigger, MlvPageEndSidebar, MlvPageHeader, MlvPageHeaderActions, MlvPageHeaderDescription, MlvPageHeaderIcon, MlvPageHeaderMeta, MlvPageHeaderStatus, MlvPageHeaderTabs, MlvPageHeaderTabsActions, MlvPageShell, MlvPageSidebar, MlvPageSnap, MlvPageSnapController, MlvPageSnapRegionBase, MlvPageSummary, MlvPageSummaryItem, MlvPageTitle, MlvPageTopbar };
|
|
1898
|
+
//# sourceMappingURL=malva-ui-core-page.mjs.map
|