@natec/mef-dev-ui-kit 20.0.0-beta.1 → 20.0.1
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/fesm2022/natec-mef-dev-ui-kit.mjs +9541 -0
- package/fesm2022/natec-mef-dev-ui-kit.mjs.map +1 -0
- package/index.d.ts +4418 -0
- package/index.d.ts.map +1 -0
- package/package.json +44 -48
- package/src/lib/styles/core.scss +51 -195
- package/src/lib/styles/pg/modules/_typography.scss +1 -8
- package/src/lib/styles/pg/vendor/ng-datatable.scss +7 -0
- package/src/lib/styles/vars.scss +8 -8
- package/documentation/classes/FiltredItemModel.html +0 -358
- package/documentation/classes/TabChangeEvent.html +0 -231
- package/documentation/components/CardComponent.html +0 -576
- package/documentation/components/CardLongComponent.html +0 -712
- package/documentation/components/CardSimpleComponent.html +0 -372
- package/documentation/components/CentralPageComponent.html +0 -312
- package/documentation/components/CentralPageRowComponent.html +0 -244
- package/documentation/components/CollapseComponent.html +0 -755
- package/documentation/components/CollapseSetComponent.html +0 -767
- package/documentation/components/DatepickerComponent.html +0 -1397
- package/documentation/components/FillComponent.html +0 -736
- package/documentation/components/FilteredFieldContainerComponent.html +0 -513
- package/documentation/components/FilteredFieldItemComponent.html +0 -451
- package/documentation/components/HelpBlockComponent.html +0 -398
- package/documentation/components/ManagePageComponent.html +0 -423
- package/documentation/components/MefDevOptionComponent.html +0 -689
- package/documentation/components/MefDevProgressComponent.html +0 -562
- package/documentation/components/MefDevSelectComponent.html +0 -4797
- package/documentation/components/MefDevSliderComponent.html +0 -686
- package/documentation/components/MefDevSpecFlowTestComponent.html +0 -474
- package/documentation/components/MefDevSwitchComponent.html +0 -1480
- package/documentation/components/MefDevTabBodyComponent.html +0 -271
- package/documentation/components/MefDevTabComponent.html +0 -681
- package/documentation/components/MefDevTabSetComponent.html +0 -1889
- package/documentation/components/MefDevTabsNavComponent.html +0 -2013
- package/documentation/components/MefdevExecutorPageComponent.html +0 -497
- package/documentation/components/ProfileComponent.html +0 -608
- package/documentation/components/RightFilterComponent.html +0 -423
- package/documentation/components/SlideRightComponent.html +0 -762
- package/documentation/components/SlideUpComponent.html +0 -692
- package/documentation/components/StepExecutorComponent.html +0 -1437
- package/documentation/components/TablePageComponent.html +0 -327
- package/documentation/dependencies.html +0 -135
- package/documentation/directives/MefDevTabLabelDirective.html +0 -532
- package/documentation/directives/MefDevTabsInkBarDirective.html +0 -865
- package/documentation/fonts/ionicons.eot +0 -0
- package/documentation/fonts/ionicons.svg +0 -2090
- package/documentation/fonts/ionicons.ttf +0 -0
- package/documentation/fonts/ionicons.woff +0 -0
- package/documentation/fonts/ionicons.woff2 +0 -0
- package/documentation/fonts/roboto-v15-latin-300.eot +0 -0
- package/documentation/fonts/roboto-v15-latin-300.svg +0 -314
- package/documentation/fonts/roboto-v15-latin-300.ttf +0 -0
- package/documentation/fonts/roboto-v15-latin-300.woff +0 -0
- package/documentation/fonts/roboto-v15-latin-300.woff2 +0 -0
- package/documentation/fonts/roboto-v15-latin-700.eot +0 -0
- package/documentation/fonts/roboto-v15-latin-700.svg +0 -310
- package/documentation/fonts/roboto-v15-latin-700.ttf +0 -0
- package/documentation/fonts/roboto-v15-latin-700.woff +0 -0
- package/documentation/fonts/roboto-v15-latin-700.woff2 +0 -0
- package/documentation/fonts/roboto-v15-latin-italic.eot +0 -0
- package/documentation/fonts/roboto-v15-latin-italic.svg +0 -323
- package/documentation/fonts/roboto-v15-latin-italic.ttf +0 -0
- package/documentation/fonts/roboto-v15-latin-italic.woff +0 -0
- package/documentation/fonts/roboto-v15-latin-italic.woff2 +0 -0
- package/documentation/fonts/roboto-v15-latin-regular.eot +0 -0
- package/documentation/fonts/roboto-v15-latin-regular.svg +0 -308
- package/documentation/fonts/roboto-v15-latin-regular.ttf +0 -0
- package/documentation/fonts/roboto-v15-latin-regular.woff +0 -0
- package/documentation/fonts/roboto-v15-latin-regular.woff2 +0 -0
- package/documentation/graph/dependencies.svg +0 -1160
- package/documentation/images/compodoc-vectorise-inverted.png +0 -0
- package/documentation/images/compodoc-vectorise-inverted.svg +0 -201
- package/documentation/images/compodoc-vectorise.png +0 -0
- package/documentation/images/compodoc-vectorise.svg +0 -201
- package/documentation/images/favicon.ico +0 -0
- package/documentation/index.html +0 -246
- package/documentation/injectables/FilteredFieldService.html +0 -420
- package/documentation/injectables/ProgressConfig.html +0 -236
- package/documentation/interfaces/AnimatedInterface.html +0 -246
- package/documentation/js/compodoc.js +0 -14
- package/documentation/js/lazy-load-graphs.js +0 -44
- package/documentation/js/libs/EventDispatcher.js +0 -5
- package/documentation/js/libs/bootstrap-native.js +0 -1
- package/documentation/js/libs/clipboard.min.js +0 -7
- package/documentation/js/libs/custom-elements-es5-adapter.js +0 -15
- package/documentation/js/libs/custom-elements.min.js +0 -38
- package/documentation/js/libs/d3.v3.min.js +0 -2
- package/documentation/js/libs/deep-iterator.js +0 -2
- package/documentation/js/libs/es6-shim.min.js +0 -11
- package/documentation/js/libs/htmlparser.js +0 -23
- package/documentation/js/libs/innersvg.js +0 -9
- package/documentation/js/libs/lit-html.js +0 -1
- package/documentation/js/libs/prism.js +0 -46
- package/documentation/js/libs/promise.min.js +0 -6
- package/documentation/js/libs/svg-pan-zoom.min.js +0 -3
- package/documentation/js/libs/tablesort.min.js +0 -6
- package/documentation/js/libs/tablesort.number.min.js +0 -6
- package/documentation/js/libs/vis.min.js +0 -47
- package/documentation/js/libs/zepto.min.js +0 -2
- package/documentation/js/menu-wc.js +0 -455
- package/documentation/js/menu-wc_es5.js +0 -42
- package/documentation/js/menu.js +0 -325
- package/documentation/js/routes.js +0 -301
- package/documentation/js/search/lunr.min.js +0 -6
- package/documentation/js/search/search-lunr.js +0 -67
- package/documentation/js/search/search.js +0 -268
- package/documentation/js/search/search_index.js +0 -4
- package/documentation/js/sourceCode.js +0 -58
- package/documentation/js/svg-pan-zoom.controls.js +0 -53
- package/documentation/js/tabs.js +0 -21
- package/documentation/js/tree.js +0 -147
- package/documentation/miscellaneous/enumerations.html +0 -223
- package/documentation/miscellaneous/functions.html +0 -251
- package/documentation/miscellaneous/typealiases.html +0 -257
- package/documentation/miscellaneous/variables.html +0 -357
- package/documentation/modules/MefDevCardModule/dependencies.svg +0 -142
- package/documentation/modules/MefDevCardModule.html +0 -349
- package/documentation/modules/MefDevCollapseModule/dependencies.svg +0 -90
- package/documentation/modules/MefDevCollapseModule.html +0 -316
- package/documentation/modules/MefDevDatepickerModule/dependencies.svg +0 -82
- package/documentation/modules/MefDevDatepickerModule.html +0 -274
- package/documentation/modules/MefDevFilteredFieldModule/dependencies.svg +0 -90
- package/documentation/modules/MefDevFilteredFieldModule.html +0 -278
- package/documentation/modules/MefDevHelpBlockModule/dependencies.svg +0 -82
- package/documentation/modules/MefDevHelpBlockModule.html +0 -274
- package/documentation/modules/MefDevModalModule/dependencies.svg +0 -154
- package/documentation/modules/MefDevModalModule.html +0 -364
- package/documentation/modules/MefDevPageLayoutsModule/dependencies.svg +0 -162
- package/documentation/modules/MefDevPageLayoutsModule.html +0 -368
- package/documentation/modules/MefDevProgressModule/dependencies.svg +0 -66
- package/documentation/modules/MefDevProgressModule.html +0 -286
- package/documentation/modules/MefDevSelectModule/dependencies.svg +0 -140
- package/documentation/modules/MefDevSelectModule.html +0 -334
- package/documentation/modules/MefDevSliderModule/dependencies.svg +0 -66
- package/documentation/modules/MefDevSliderModule.html +0 -248
- package/documentation/modules/MefDevSpecFlowTestModule/dependencies.svg +0 -66
- package/documentation/modules/MefDevSpecFlowTestModule.html +0 -286
- package/documentation/modules/MefDevStepExecutorModule/dependencies.svg +0 -106
- package/documentation/modules/MefDevStepExecutorModule.html +0 -304
- package/documentation/modules/MefDevSwitchModule/dependencies.svg +0 -88
- package/documentation/modules/MefDevSwitchModule.html +0 -270
- package/documentation/modules/MefDevTabsModule/dependencies.svg +0 -186
- package/documentation/modules/MefDevTabsModule.html +0 -398
- package/documentation/modules.html +0 -357
- package/documentation/overview.html +0 -1351
- package/documentation/pipes/OptionPipe.html +0 -238
- package/documentation/properties.html +0 -125
- package/documentation/styles/bootstrap-card.css +0 -219
- package/documentation/styles/bootstrap.min.css +0 -6
- package/documentation/styles/compodoc.css +0 -1121
- package/documentation/styles/dark.css +0 -121
- package/documentation/styles/ionicons.min.css +0 -11
- package/documentation/styles/laravel.css +0 -113
- package/documentation/styles/material.css +0 -131
- package/documentation/styles/original.css +0 -51
- package/documentation/styles/postmark.css +0 -238
- package/documentation/styles/prism.css +0 -301
- package/documentation/styles/readthedocs.css +0 -117
- package/documentation/styles/reset.css +0 -129
- package/documentation/styles/stripe.css +0 -106
- package/documentation/styles/style.css +0 -7
- package/documentation/styles/tablesort.css +0 -33
- package/documentation/styles/vagrant.css +0 -130
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -18
- package/src/lib/markup-kit/card/card/card.component.html +0 -44
- package/src/lib/markup-kit/card/card/card.component.scss +0 -65
- package/src/lib/markup-kit/card/card/card.component.ts +0 -109
- package/src/lib/markup-kit/card/card-long/card-long.component.html +0 -53
- package/src/lib/markup-kit/card/card-long/card-long.component.scss +0 -72
- package/src/lib/markup-kit/card/card-long/card-long.component.ts +0 -158
- package/src/lib/markup-kit/card/card-long/cart-type-colors.enum.ts +0 -5
- package/src/lib/markup-kit/card/card-simple/card-simple.component.html +0 -12
- package/src/lib/markup-kit/card/card-simple/card-simple.component.scss +0 -12
- package/src/lib/markup-kit/card/card-simple/card-simple.component.ts +0 -48
- package/src/lib/markup-kit/card/card.module.ts +0 -21
- package/src/lib/markup-kit/card/index.ts +0 -6
- package/src/lib/markup-kit/collapse/collapse/collapse.component.html +0 -17
- package/src/lib/markup-kit/collapse/collapse/collapse.component.scss +0 -17
- package/src/lib/markup-kit/collapse/collapse/collapse.component.ts +0 -131
- package/src/lib/markup-kit/collapse/collapse-set/collapse-set.component.html +0 -3
- package/src/lib/markup-kit/collapse/collapse-set/collapse-set.component.scss +0 -0
- package/src/lib/markup-kit/collapse/collapse-set/collapse-set.component.ts +0 -110
- package/src/lib/markup-kit/collapse/collapse.module.ts +0 -20
- package/src/lib/markup-kit/collapse/index.ts +0 -3
- package/src/lib/markup-kit/executors/index.ts +0 -4
- package/src/lib/markup-kit/executors/mefdev-executor-page/mefdev-executor-page.component.ts +0 -111
- package/src/lib/markup-kit/executors/stage/stage.component.html +0 -23
- package/src/lib/markup-kit/executors/stage/stage.component.scss +0 -9
- package/src/lib/markup-kit/executors/stage/stage.component.ts +0 -21
- package/src/lib/markup-kit/executors/step-executor/step-executor.component.html +0 -127
- package/src/lib/markup-kit/executors/step-executor/step-executor.component.scss +0 -225
- package/src/lib/markup-kit/executors/step-executor/step-executor.component.ts +0 -295
- package/src/lib/markup-kit/executors/step-executor.module.ts +0 -27
- package/src/lib/markup-kit/modals/fill/fill.component.html +0 -15
- package/src/lib/markup-kit/modals/fill/fill.component.scss +0 -42
- package/src/lib/markup-kit/modals/fill/fill.component.ts +0 -126
- package/src/lib/markup-kit/modals/index.ts +0 -6
- package/src/lib/markup-kit/modals/markup-kit.module.ts +0 -25
- package/src/lib/markup-kit/modals/modal-size.enum.ts +0 -5
- package/src/lib/markup-kit/modals/right-filter/right-filter.component.html +0 -11
- package/src/lib/markup-kit/modals/right-filter/right-filter.component.scss +0 -15
- package/src/lib/markup-kit/modals/right-filter/right-filter.component.ts +0 -49
- package/src/lib/markup-kit/modals/slide-right/slide-right.component.html +0 -14
- package/src/lib/markup-kit/modals/slide-right/slide-right.component.scss +0 -42
- package/src/lib/markup-kit/modals/slide-right/slide-right.component.ts +0 -121
- package/src/lib/markup-kit/modals/slide-up/slide-up.component.html +0 -15
- package/src/lib/markup-kit/modals/slide-up/slide-up.component.scss +0 -47
- package/src/lib/markup-kit/modals/slide-up/slide-up.component.ts +0 -105
- package/src/lib/markup-kit/page-layouts/central-page/central-page.component.html +0 -6
- package/src/lib/markup-kit/page-layouts/central-page/central-page.component.scss +0 -10
- package/src/lib/markup-kit/page-layouts/central-page/central-page.component.ts +0 -58
- package/src/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.html +0 -3
- package/src/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.scss +0 -5
- package/src/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.ts +0 -30
- package/src/lib/markup-kit/page-layouts/index.ts +0 -6
- package/src/lib/markup-kit/page-layouts/manage-page/manage-page.component.html +0 -10
- package/src/lib/markup-kit/page-layouts/manage-page/manage-page.component.scss +0 -33
- package/src/lib/markup-kit/page-layouts/manage-page/manage-page.component.ts +0 -70
- package/src/lib/markup-kit/page-layouts/page-layouts.module.ts +0 -26
- package/src/lib/markup-kit/page-layouts/profile/profile.component.html +0 -31
- package/src/lib/markup-kit/page-layouts/profile/profile.component.scss +0 -99
- package/src/lib/markup-kit/page-layouts/profile/profile.component.ts +0 -129
- package/src/lib/markup-kit/page-layouts/table-page/table-page.component.html +0 -9
- package/src/lib/markup-kit/page-layouts/table-page/table-page.component.scss +0 -0
- package/src/lib/markup-kit/page-layouts/table-page/table-page.component.ts +0 -42
- package/src/lib/markup-kit/slider/index.ts +0 -2
- package/src/lib/markup-kit/slider/slider/slider.component.html +0 -11
- package/src/lib/markup-kit/slider/slider/slider.component.scss +0 -106
- package/src/lib/markup-kit/slider/slider/slider.component.ts +0 -124
- package/src/lib/markup-kit/slider/slider.module.ts +0 -20
- package/src/lib/markup-kit/utils/datepicker/datepicker/datepicker.component.html +0 -87
- package/src/lib/markup-kit/utils/datepicker/datepicker/datepicker.component.scss +0 -132
- package/src/lib/markup-kit/utils/datepicker/datepicker/datepicker.component.ts +0 -643
- package/src/lib/markup-kit/utils/datepicker/datepicker.module.ts +0 -15
- package/src/lib/markup-kit/utils/datepicker/index.ts +0 -2
- package/src/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.html +0 -3
- package/src/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.scss +0 -4
- package/src/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.ts +0 -79
- package/src/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.html +0 -4
- package/src/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.scss +0 -12
- package/src/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.ts +0 -75
- package/src/lib/markup-kit/utils/filtered-field/filtered-field.module.ts +0 -19
- package/src/lib/markup-kit/utils/filtered-field/filtered-field.service.ts +0 -44
- package/src/lib/markup-kit/utils/filtered-field/filtred-item.model.ts +0 -15
- package/src/lib/markup-kit/utils/filtered-field/index.ts +0 -5
- package/src/lib/markup-kit/utils/help-block/help-block.component.html +0 -19
- package/src/lib/markup-kit/utils/help-block/help-block.component.scss +0 -22
- package/src/lib/markup-kit/utils/help-block/help-block.component.ts +0 -70
- package/src/lib/markup-kit/utils/help-block/hepl-block.module.ts +0 -14
- package/src/lib/markup-kit/utils/help-block/index.ts +0 -2
- package/src/lib/pg-components/card/card.components.html +0 -66
- package/src/lib/pg-components/card/card.components.ts +0 -451
- package/src/lib/pg-components/card/card.module.ts +0 -17
- package/src/lib/pg-components/card/index.ts +0 -2
- package/src/lib/pg-components/progress/index.ts +0 -3
- package/src/lib/pg-components/progress/progress.component.html +0 -28
- package/src/lib/pg-components/progress/progress.component.ts +0 -73
- package/src/lib/pg-components/progress/progress.config.ts +0 -7
- package/src/lib/pg-components/progress/progress.module.ts +0 -16
- package/src/lib/pg-components/select/index.ts +0 -4
- package/src/lib/pg-components/select/option.component.html +0 -1
- package/src/lib/pg-components/select/option.component.ts +0 -105
- package/src/lib/pg-components/select/option.pipe.ts +0 -44
- package/src/lib/pg-components/select/select.component.html +0 -83
- package/src/lib/pg-components/select/select.component.ts +0 -814
- package/src/lib/pg-components/select/select.module.ts +0 -14
- package/src/lib/pg-components/spec-flow-test/index.ts +0 -2
- package/src/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.html +0 -6
- package/src/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.scss +0 -0
- package/src/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.ts +0 -37
- package/src/lib/pg-components/spec-flow-test/spec-flow-test.module.ts +0 -18
- package/src/lib/pg-components/switch/index.ts +0 -2
- package/src/lib/pg-components/switch/switch.component.html +0 -10
- package/src/lib/pg-components/switch/switch.component.ts +0 -286
- package/src/lib/pg-components/switch/switch.module.ts +0 -11
- package/src/lib/pg-components/tabs/index.ts +0 -7
- package/src/lib/pg-components/tabs/tab-body.component.html +0 -1
- package/src/lib/pg-components/tabs/tab-body.component.ts +0 -17
- package/src/lib/pg-components/tabs/tab-label.directive.ts +0 -41
- package/src/lib/pg-components/tabs/tab.component.html +0 -3
- package/src/lib/pg-components/tabs/tab.component.ts +0 -109
- package/src/lib/pg-components/tabs/tabs-ink-bar.directive.ts +0 -78
- package/src/lib/pg-components/tabs/tabs-nav.component.html +0 -20
- package/src/lib/pg-components/tabs/tabs-nav.component.ts +0 -324
- package/src/lib/pg-components/tabs/tabs.module.ts +0 -15
- package/src/lib/pg-components/tabs/tabset.component.html +0 -39
- package/src/lib/pg-components/tabs/tabset.component.ts +0 -270
- package/src/lib/pg-components/util/convert.ts +0 -3
- package/src/lib/pg-components/util/request-animation.ts +0 -31
- package/src/lib/v2/autocomplete/autocomplete-origin.ts +0 -12
- package/src/lib/v2/autocomplete/autocomplete.html +0 -17
- package/src/lib/v2/autocomplete/autocomplete.module.ts +0 -28
- package/src/lib/v2/autocomplete/autocomplete.scss +0 -62
- package/src/lib/v2/autocomplete/autocomplete.trigger.ts +0 -759
- package/src/lib/v2/autocomplete/autocomplete.ts +0 -201
- package/src/lib/v2/autocomplete/index.ts +0 -1
- package/src/lib/v2/card/card-header.html +0 -9
- package/src/lib/v2/card/card-title-group.html +0 -15
- package/src/lib/v2/card/card.html +0 -1
- package/src/lib/v2/card/card.module.ts +0 -40
- package/src/lib/v2/card/card.scss +0 -185
- package/src/lib/v2/card/card.ts +0 -274
- package/src/lib/v2/card/index.ts +0 -2
- package/src/lib/v2/checkbox/checkbox.html +0 -38
- package/src/lib/v2/checkbox/checkbox.module.ts +0 -8
- package/src/lib/v2/checkbox/checkbox.scss +0 -318
- package/src/lib/v2/checkbox/checkbox.ts +0 -507
- package/src/lib/v2/checkbox/index.ts +0 -1
- package/src/lib/v2/chips/chip-action.ts +0 -102
- package/src/lib/v2/chips/chip-edit-input.ts +0 -44
- package/src/lib/v2/chips/chip-grid.ts +0 -412
- package/src/lib/v2/chips/chip-icons.ts +0 -91
- package/src/lib/v2/chips/chip-input.ts +0 -208
- package/src/lib/v2/chips/chip-listbox.ts +0 -291
- package/src/lib/v2/chips/chip-option.html +0 -37
- package/src/lib/v2/chips/chip-option.ts +0 -163
- package/src/lib/v2/chips/chip-row.html +0 -42
- package/src/lib/v2/chips/chip-row.ts +0 -191
- package/src/lib/v2/chips/chip-set.scss +0 -86
- package/src/lib/v2/chips/chip-set.ts +0 -261
- package/src/lib/v2/chips/chip-text-control.ts +0 -15
- package/src/lib/v2/chips/chip.html +0 -21
- package/src/lib/v2/chips/chip.scss +0 -646
- package/src/lib/v2/chips/chip.ts +0 -281
- package/src/lib/v2/chips/chips-module.ts +0 -44
- package/src/lib/v2/chips/index.ts +0 -12
- package/src/lib/v2/chips/tokens.ts +0 -29
- package/src/lib/v2/collapse/accordion-base.ts +0 -20
- package/src/lib/v2/collapse/accordion.ts +0 -92
- package/src/lib/v2/collapse/collapse.module.ts +0 -22
- package/src/lib/v2/collapse/expansion-panel-base.ts +0 -10
- package/src/lib/v2/collapse/expansion-panel-content.ts +0 -12
- package/src/lib/v2/collapse/expansion-panel-header.html +0 -17
- package/src/lib/v2/collapse/expansion-panel-header.scss +0 -165
- package/src/lib/v2/collapse/expansion-panel-header.ts +0 -237
- package/src/lib/v2/collapse/expansion-panel.html +0 -14
- package/src/lib/v2/collapse/expansion-panel.scss +0 -113
- package/src/lib/v2/collapse/expansion-panel.ts +0 -279
- package/src/lib/v2/collapse/index.ts +0 -7
- package/src/lib/v2/executors/index.ts +0 -10
- package/src/lib/v2/executors/step-content.ts +0 -19
- package/src/lib/v2/executors/step-footer.ts +0 -7
- package/src/lib/v2/executors/step-header.html +0 -59
- package/src/lib/v2/executors/step-header.scss +0 -205
- package/src/lib/v2/executors/step-header.ts +0 -151
- package/src/lib/v2/executors/step-label.ts +0 -16
- package/src/lib/v2/executors/step.html +0 -4
- package/src/lib/v2/executors/stepper-button.ts +0 -40
- package/src/lib/v2/executors/stepper-icon.ts +0 -42
- package/src/lib/v2/executors/stepper-intl.ts +0 -46
- package/src/lib/v2/executors/stepper-module.ts +0 -42
- package/src/lib/v2/executors/stepper.html +0 -90
- package/src/lib/v2/executors/stepper.scss +0 -299
- package/src/lib/v2/executors/stepper.ts +0 -360
- package/src/lib/v2/modals/dialog-config.ts +0 -56
- package/src/lib/v2/modals/dialog-container.html +0 -5
- package/src/lib/v2/modals/dialog-container.ts +0 -243
- package/src/lib/v2/modals/dialog-content-directives.ts +0 -217
- package/src/lib/v2/modals/dialog-ref.ts +0 -242
- package/src/lib/v2/modals/dialog.scss +0 -307
- package/src/lib/v2/modals/dialog.ts +0 -239
- package/src/lib/v2/modals/index.ts +0 -11
- package/src/lib/v2/modals/modal-module.ts +0 -23
- package/src/lib/v2/radio-button/public-api.ts +0 -2
- package/src/lib/v2/radio-button/radio.html +0 -25
- package/src/lib/v2/radio-button/radio.module.ts +0 -8
- package/src/lib/v2/radio-button/radio.scss +0 -298
- package/src/lib/v2/radio-button/radio.ts +0 -640
- package/src/lib/v2/select/index.ts +0 -5
- package/src/lib/v2/select/option-group.html +0 -9
- package/src/lib/v2/select/option-group.scss +0 -33
- package/src/lib/v2/select/option-group.ts +0 -66
- package/src/lib/v2/select/option-module.ts +0 -11
- package/src/lib/v2/select/option.html +0 -22
- package/src/lib/v2/select/option.scss +0 -59
- package/src/lib/v2/select/option.ts +0 -288
- package/src/lib/v2/select/pseudo-checkbox-module.ts +0 -9
- package/src/lib/v2/select/pseudo-checkbox.scss +0 -121
- package/src/lib/v2/select/pseudo-checkbox.ts +0 -60
- package/src/lib/v2/select/select.html +0 -56
- package/src/lib/v2/select/select.module.ts +0 -14
- package/src/lib/v2/select/select.scss +0 -118
- package/src/lib/v2/select/select.ts +0 -824
- package/src/lib/v2/switch/base-editor-helper.ts +0 -148
- package/src/lib/v2/switch/index.ts +0 -2
- package/src/lib/v2/switch/switch.component.html +0 -15
- package/src/lib/v2/switch/switch.component.scss +0 -93
- package/src/lib/v2/switch/switch.component.ts +0 -203
- package/src/lib/v2/switch/switch.module.ts +0 -10
- package/src/lib/v2/tabs/config.ts +0 -94
- package/src/lib/v2/tabs/index.ts +0 -28
- package/src/lib/v2/tabs/ink-bar.ts +0 -226
- package/src/lib/v2/tabs/paginated-tab-header.ts +0 -536
- package/src/lib/v2/tabs/tab-body.html +0 -9
- package/src/lib/v2/tabs/tab-body.scss +0 -60
- package/src/lib/v2/tabs/tab-body.ts +0 -310
- package/src/lib/v2/tabs/tab-content.ts +0 -12
- package/src/lib/v2/tabs/tab-group.html +0 -74
- package/src/lib/v2/tabs/tab-group.scss +0 -362
- package/src/lib/v2/tabs/tab-group.ts +0 -491
- package/src/lib/v2/tabs/tab-header.html +0 -35
- package/src/lib/v2/tabs/tab-header.scss +0 -127
- package/src/lib/v2/tabs/tab-header.ts +0 -91
- package/src/lib/v2/tabs/tab-label-wrapper.ts +0 -49
- package/src/lib/v2/tabs/tab-label.ts +0 -34
- package/src/lib/v2/tabs/tab.html +0 -1
- package/src/lib/v2/tabs/tab.ts +0 -155
- package/src/lib/v2/tabs/tabs.module.ts +0 -12
- package/src/public-api.ts +0 -33
- package/tsconfig.doc.json +0 -4
- package/tsconfig.lib.json +0 -19
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
|
@@ -1,824 +0,0 @@
|
|
|
1
|
-
import { SelectionModel } from '@angular/cdk/collections';
|
|
2
|
-
import {
|
|
3
|
-
CdkConnectedOverlay,
|
|
4
|
-
CdkOverlayOrigin,
|
|
5
|
-
ConnectedPosition,
|
|
6
|
-
Overlay,
|
|
7
|
-
ScrollStrategy,
|
|
8
|
-
ViewportRuler,
|
|
9
|
-
} from '@angular/cdk/overlay';
|
|
10
|
-
import { NgClass } from '@angular/common';
|
|
11
|
-
import {
|
|
12
|
-
booleanAttribute,
|
|
13
|
-
ChangeDetectionStrategy,
|
|
14
|
-
ChangeDetectorRef,
|
|
15
|
-
Component,
|
|
16
|
-
ContentChild,
|
|
17
|
-
ContentChildren,
|
|
18
|
-
Directive,
|
|
19
|
-
ElementRef,
|
|
20
|
-
EventEmitter,
|
|
21
|
-
forwardRef,
|
|
22
|
-
inject,
|
|
23
|
-
InjectionToken,
|
|
24
|
-
Input,
|
|
25
|
-
numberAttribute,
|
|
26
|
-
OnChanges,
|
|
27
|
-
OnDestroy,
|
|
28
|
-
OnInit,
|
|
29
|
-
Output,
|
|
30
|
-
QueryList,
|
|
31
|
-
Renderer2,
|
|
32
|
-
SimpleChanges,
|
|
33
|
-
ViewChild,
|
|
34
|
-
ViewEncapsulation,
|
|
35
|
-
} from '@angular/core';
|
|
36
|
-
import { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, Validators } from '@angular/forms';
|
|
37
|
-
import { _countGroupLabelsBeforeOption, _getOptionScrollPosition, MDOption, MDOptionSelectionChange } from './option';
|
|
38
|
-
import { MDOptionGroup } from './option-group';
|
|
39
|
-
import { _IdGenerator, ActiveDescendantKeyManager } from '@angular/cdk/a11y';
|
|
40
|
-
import { Directionality } from '@angular/cdk/bidi';
|
|
41
|
-
import { defer, filter, map, merge, Observable, startWith, Subject, switchMap, take, takeUntil, tap } from 'rxjs';
|
|
42
|
-
import {
|
|
43
|
-
A,
|
|
44
|
-
DOWN_ARROW,
|
|
45
|
-
ENTER,
|
|
46
|
-
ESCAPE,
|
|
47
|
-
hasModifierKey,
|
|
48
|
-
LEFT_ARROW,
|
|
49
|
-
RIGHT_ARROW,
|
|
50
|
-
SPACE,
|
|
51
|
-
UP_ARROW,
|
|
52
|
-
} from '@angular/cdk/keycodes';
|
|
53
|
-
|
|
54
|
-
/** Event payload emitted when the select's value changes. */
|
|
55
|
-
export class SelectChange<T = any> {
|
|
56
|
-
constructor(public source: MDSelect, public value: T) {}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** Token for projecting a custom trigger template (optional). */
|
|
60
|
-
export const MD_SELECT_TRIGGER = new InjectionToken<MDSelectTrigger>('MDSelectTrigger');
|
|
61
|
-
|
|
62
|
-
@Component({
|
|
63
|
-
selector: 'md-select',
|
|
64
|
-
templateUrl: './select.html',
|
|
65
|
-
styleUrls: ['./select.scss'],
|
|
66
|
-
encapsulation: ViewEncapsulation.None,
|
|
67
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
68
|
-
host: {
|
|
69
|
-
role: 'combobox',
|
|
70
|
-
'aria-haspopup': 'listbox',
|
|
71
|
-
class: 'mdc-select',
|
|
72
|
-
'[attr.id]': 'id',
|
|
73
|
-
'[attr.tabindex]': 'disabled ? -1 : tabIndex',
|
|
74
|
-
'[attr.aria-controls]': 'panelOpen ? id + "-panel" : null',
|
|
75
|
-
'[attr.aria-expanded]': 'panelOpen',
|
|
76
|
-
'[attr.aria-label]': 'ariaLabel || null',
|
|
77
|
-
'[attr.aria-required]': 'required.toString()',
|
|
78
|
-
'[attr.aria-disabled]': 'disabled.toString()',
|
|
79
|
-
'[attr.aria-invalid]': 'errorState',
|
|
80
|
-
'[attr.aria-activedescendant]': '_getAriaActiveDescendant()',
|
|
81
|
-
'[class.mdc-select-disabled]': 'disabled',
|
|
82
|
-
'[class.mdc-select-invalid]': 'errorState',
|
|
83
|
-
'[class.mdc-select-required]': 'required',
|
|
84
|
-
'[class.mdc-select-empty]': 'empty',
|
|
85
|
-
'[class.mdc-select-multiple]': 'multiple',
|
|
86
|
-
'(keydown)': '_handleKeydown($event)',
|
|
87
|
-
'(focus)': '_onFocus()',
|
|
88
|
-
'(blur)': '_onBlur()',
|
|
89
|
-
'(click)': 'onContainerClick()',
|
|
90
|
-
},
|
|
91
|
-
standalone: true,
|
|
92
|
-
imports: [CdkOverlayOrigin, CdkConnectedOverlay, NgClass],
|
|
93
|
-
})
|
|
94
|
-
/**
|
|
95
|
-
* Material-like Select component with overlayed panel, single/multiple selection,
|
|
96
|
-
* full a11y (combobox + listbox semantics), and CVA integration.
|
|
97
|
-
*
|
|
98
|
-
* @remarks
|
|
99
|
-
* - Uses `ActiveDescendantKeyManager` for keyboard navigation & typeahead.
|
|
100
|
-
* - Supports custom value comparison via `compareWith`.
|
|
101
|
-
* - Works with {@link MDOption} and {@link MDOptionGroup} descendants.
|
|
102
|
-
* - Emits `valueChange`, and structured `selectionChange` ({@link SelectChange}).
|
|
103
|
-
*/
|
|
104
|
-
export class MDSelect implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {
|
|
105
|
-
/** Viewport ruler for resize/orientation tracking to recompute overlay width. */
|
|
106
|
-
protected _viewportRuler = inject(ViewportRuler);
|
|
107
|
-
|
|
108
|
-
/** Change detector for OnPush; used throughout for manual marks. */
|
|
109
|
-
protected _changeDetectorRef = inject(ChangeDetectorRef);
|
|
110
|
-
|
|
111
|
-
/** Host element reference. */
|
|
112
|
-
readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);
|
|
113
|
-
|
|
114
|
-
/** CDK Overlay service. */
|
|
115
|
-
readonly _overlay = inject(Overlay);
|
|
116
|
-
|
|
117
|
-
/** RTL/LTR direction (optional). */
|
|
118
|
-
private _dir = inject(Directionality, { optional: true });
|
|
119
|
-
|
|
120
|
-
/** Emits once content is fully initialized. */
|
|
121
|
-
private _initialized = new Subject<void>();
|
|
122
|
-
|
|
123
|
-
/** Control accessor hookup (if used inside forms). */
|
|
124
|
-
ngControl = inject(NgControl, { self: true, optional: true })!;
|
|
125
|
-
|
|
126
|
-
/** Id generator for trigger/value elements. */
|
|
127
|
-
private _idGenerator = inject(_IdGenerator);
|
|
128
|
-
|
|
129
|
-
/** Cleanup fn for overlay detach (animation end / fallback). */
|
|
130
|
-
private _cleanupDetach: (() => void) | undefined;
|
|
131
|
-
|
|
132
|
-
/** Renderer for low-level DOM ops. */
|
|
133
|
-
private _renderer = inject(Renderer2);
|
|
134
|
-
|
|
135
|
-
/** CSS class(es) applied to the overlay panel container. */
|
|
136
|
-
@Input() panelClass: string | string[] | Set<string> | { [key: string]: any };
|
|
137
|
-
|
|
138
|
-
/** Disabled state for the whole control. */
|
|
139
|
-
@Input({ transform: booleanAttribute }) disabled: boolean = false;
|
|
140
|
-
|
|
141
|
-
/** Multiple selection toggle. */
|
|
142
|
-
@Input({ transform: booleanAttribute })
|
|
143
|
-
get multiple(): boolean {
|
|
144
|
-
return this._multiple;
|
|
145
|
-
}
|
|
146
|
-
set multiple(value: boolean) {
|
|
147
|
-
this._multiple = value;
|
|
148
|
-
}
|
|
149
|
-
private _multiple: boolean = false;
|
|
150
|
-
|
|
151
|
-
/** Current model value (single or array for multiple). */
|
|
152
|
-
@Input()
|
|
153
|
-
get value(): any {
|
|
154
|
-
return this._value;
|
|
155
|
-
}
|
|
156
|
-
set value(newValue: any) {
|
|
157
|
-
const hasAssigned = this._assignValue(newValue);
|
|
158
|
-
if (hasAssigned) {
|
|
159
|
-
this._onChange(newValue);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
private _value: any;
|
|
163
|
-
|
|
164
|
-
/** Host tabindex (applies when not disabled). */
|
|
165
|
-
@Input({
|
|
166
|
-
transform: (value: unknown) => (value == null ? 0 : numberAttribute(value)),
|
|
167
|
-
})
|
|
168
|
-
tabIndex: number = 0;
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Required flag; auto-derives from `Validators.required` on the bound control
|
|
172
|
-
* if not provided explicitly.
|
|
173
|
-
*/
|
|
174
|
-
@Input({ transform: booleanAttribute })
|
|
175
|
-
get required(): boolean {
|
|
176
|
-
return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;
|
|
177
|
-
}
|
|
178
|
-
set required(value: boolean) {
|
|
179
|
-
this._required = value;
|
|
180
|
-
this.stateChanges.next();
|
|
181
|
-
}
|
|
182
|
-
private _required: boolean | undefined;
|
|
183
|
-
|
|
184
|
-
/** Custom comparator for complex option values. */
|
|
185
|
-
@Input()
|
|
186
|
-
get compareWith() {
|
|
187
|
-
return this._compareWith;
|
|
188
|
-
}
|
|
189
|
-
set compareWith(fn: (o1: any, o2: any) => boolean) {
|
|
190
|
-
this._compareWith = fn;
|
|
191
|
-
if (this._selectionModel) {
|
|
192
|
-
this._initializeSelection();
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
private _compareWith = (o1: any, o2: any) => o1 === o2;
|
|
196
|
-
|
|
197
|
-
/** Placeholder/label when nothing is selected. */
|
|
198
|
-
@Input()
|
|
199
|
-
get placeholder(): string {
|
|
200
|
-
return this._placeholder;
|
|
201
|
-
}
|
|
202
|
-
set placeholder(value: string) {
|
|
203
|
-
this._placeholder = value;
|
|
204
|
-
this.stateChanges.next();
|
|
205
|
-
}
|
|
206
|
-
private _placeholder: string = 'placeholder';
|
|
207
|
-
|
|
208
|
-
/** Allow selecting null/undefined values in single mode. */
|
|
209
|
-
@Input({ transform: booleanAttribute })
|
|
210
|
-
canSelectNullableOptions: boolean = false;
|
|
211
|
-
|
|
212
|
-
/** Optional custom sorting for selected values (multiple mode). */
|
|
213
|
-
@Input() sortComparator: (a: MDOption, b: MDOption, options: MDOption[]) => number;
|
|
214
|
-
|
|
215
|
-
/** Emits raw value whenever internal value changes. */
|
|
216
|
-
@Output() readonly valueChange: EventEmitter<any> = new EventEmitter<any>();
|
|
217
|
-
|
|
218
|
-
/** Emits {@link SelectChange} with source/value when selection changes. */
|
|
219
|
-
@Output() readonly selectionChange = new EventEmitter<SelectChange>();
|
|
220
|
-
|
|
221
|
-
/** Emits `true/false` when panel opens/closes. */
|
|
222
|
-
@Output() readonly openedChange: EventEmitter<boolean> = new EventEmitter<boolean>();
|
|
223
|
-
|
|
224
|
-
/** Convenience stream: fires once on open. */
|
|
225
|
-
@Output('opened') readonly _openedStream: Observable<void> = this.openedChange.pipe(
|
|
226
|
-
filter((o) => o),
|
|
227
|
-
map(() => {})
|
|
228
|
-
);
|
|
229
|
-
|
|
230
|
-
/** Convenience stream: fires once on close. */
|
|
231
|
-
@Output('closed') readonly _closedStream: Observable<void> = this.openedChange.pipe(
|
|
232
|
-
filter((o) => !o),
|
|
233
|
-
map(() => {})
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
/** Trigger element ref (default trigger template). */
|
|
237
|
-
@ViewChild('trigger') trigger: ElementRef;
|
|
238
|
-
|
|
239
|
-
/** Panel container ref. */
|
|
240
|
-
@ViewChild('panel') panel: ElementRef;
|
|
241
|
-
|
|
242
|
-
/** Overlay directive for positioning/attach/detach. */
|
|
243
|
-
@ViewChild(CdkConnectedOverlay) protected _overlayDir: CdkConnectedOverlay;
|
|
244
|
-
|
|
245
|
-
/** Optional projected custom trigger via injection token. */
|
|
246
|
-
@ContentChild(MD_SELECT_TRIGGER) customTrigger: MDSelectTrigger;
|
|
247
|
-
|
|
248
|
-
/** Descendant options in the content. */
|
|
249
|
-
@ContentChildren(MDOption, { descendants: true }) options: QueryList<MDOption>;
|
|
250
|
-
|
|
251
|
-
/** Descendant option groups in the content. */
|
|
252
|
-
@ContentChildren(MDOptionGroup, { descendants: true }) optionGroups: QueryList<MDOptionGroup>;
|
|
253
|
-
|
|
254
|
-
/** Preferred connected positions for overlay. */
|
|
255
|
-
_positions: ConnectedPosition[] = [
|
|
256
|
-
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
|
|
257
|
-
{ originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' },
|
|
258
|
-
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },
|
|
259
|
-
{ originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },
|
|
260
|
-
];
|
|
261
|
-
|
|
262
|
-
/** True when host is focused or panel is open. */
|
|
263
|
-
get focused(): boolean {
|
|
264
|
-
return this._focused || this._panelOpen;
|
|
265
|
-
}
|
|
266
|
-
private _focused = false;
|
|
267
|
-
|
|
268
|
-
/** Emits when any input that affects layout/state changes. */
|
|
269
|
-
readonly stateChanges = new Subject<void>();
|
|
270
|
-
|
|
271
|
-
/** Destroy notifier for subscriptions. */
|
|
272
|
-
protected readonly _destroy = new Subject<void>();
|
|
273
|
-
|
|
274
|
-
/** Panel visibility flag. */
|
|
275
|
-
private _panelOpen = false;
|
|
276
|
-
|
|
277
|
-
/** Computed overlay width (synced on viewport size changes). */
|
|
278
|
-
_overlayWidth: string | number;
|
|
279
|
-
|
|
280
|
-
/** Scroll strategy for overlay panel. */
|
|
281
|
-
_scrollStrategy: ScrollStrategy = this._overlay.scrollStrategies.reposition();
|
|
282
|
-
|
|
283
|
-
/** Selected options model. */
|
|
284
|
-
_selectionModel: SelectionModel<any>;
|
|
285
|
-
|
|
286
|
-
/** ControlValueAccessor change fn. */
|
|
287
|
-
_onChange: (value: any) => void = () => {};
|
|
288
|
-
|
|
289
|
-
/** ControlValueAccessor touched fn. */
|
|
290
|
-
_onTouched = () => {};
|
|
291
|
-
|
|
292
|
-
/** Keyboard manager for activeDescendant/roving focus/typeahead. */
|
|
293
|
-
_keyManager: ActiveDescendantKeyManager<MDOption>;
|
|
294
|
-
|
|
295
|
-
/** Stream of child option selection events, lazily wired. */
|
|
296
|
-
readonly optionSelectionChanges: Observable<MDOptionSelectionChange> = defer(() => {
|
|
297
|
-
const options = this.options;
|
|
298
|
-
if (options) {
|
|
299
|
-
return options.changes.pipe(
|
|
300
|
-
startWith(options),
|
|
301
|
-
switchMap(() => merge(...options.map((option) => option.onSelectionChange)))
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
return this._initialized.pipe(switchMap(() => this.optionSelectionChanges));
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
/** Id for the trigger value region (for aria). */
|
|
308
|
-
_valueId = this._idGenerator.getId('select-value-');
|
|
309
|
-
|
|
310
|
-
/** True when no selection is present. */
|
|
311
|
-
get empty(): boolean {
|
|
312
|
-
return !this._selectionModel || this._selectionModel.isEmpty();
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
constructor() {
|
|
316
|
-
if (this.ngControl) {
|
|
317
|
-
this.ngControl.valueAccessor = this;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/** Lifecycle: react to `@Input` changes (reserved for future use). */
|
|
322
|
-
ngOnChanges(changes: SimpleChanges): void {}
|
|
323
|
-
|
|
324
|
-
/** After content init: wire key manager, selection model synchronization. */
|
|
325
|
-
ngAfterContentInit(): void {
|
|
326
|
-
this._initialized.next();
|
|
327
|
-
this._initialized.complete();
|
|
328
|
-
this._initKeyManager();
|
|
329
|
-
|
|
330
|
-
this._selectionModel.changed.pipe(takeUntil(this._destroy)).subscribe((event) => {
|
|
331
|
-
event.added.forEach((option) => option.select());
|
|
332
|
-
event.removed.forEach((option) => option.deselect());
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {
|
|
336
|
-
this._resetOptions();
|
|
337
|
-
this._initializeSelection();
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/** Initialize selection model and subscribe to viewport changes. */
|
|
342
|
-
ngOnInit() {
|
|
343
|
-
this._selectionModel = new SelectionModel<MDOption>(this.multiple);
|
|
344
|
-
this.stateChanges.next();
|
|
345
|
-
|
|
346
|
-
this._viewportRuler
|
|
347
|
-
.change()
|
|
348
|
-
.pipe(takeUntil(this._destroy))
|
|
349
|
-
.subscribe(() => {
|
|
350
|
-
if (this.panelOpen) {
|
|
351
|
-
this._overlayWidth = this._getOverlayWidth();
|
|
352
|
-
this._changeDetectorRef.detectChanges();
|
|
353
|
-
}
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/** Cleanup listeners/subscriptions. */
|
|
358
|
-
ngOnDestroy(): void {
|
|
359
|
-
this._keyManager?.destroy();
|
|
360
|
-
this._destroy.next();
|
|
361
|
-
this._destroy.complete();
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/** Public: whether the panel is currently open. */
|
|
365
|
-
get panelOpen(): boolean {
|
|
366
|
-
return this._panelOpen;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
/** Public: current selection (single `MDOption` or array for multiple). */
|
|
370
|
-
get selected(): MDOption | MDOption[] {
|
|
371
|
-
return this.multiple ? this._selectionModel?.selected || [] : this._selectionModel?.selected[0];
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/** Human-readable value for the trigger display. */
|
|
375
|
-
get triggerValue(): string {
|
|
376
|
-
if (this.empty) return '';
|
|
377
|
-
if (this._multiple) {
|
|
378
|
-
const selectedOptions = this._selectionModel.selected.map((option) => option.viewValue);
|
|
379
|
-
if (this._isRtl()) selectedOptions.reverse();
|
|
380
|
-
return selectedOptions.join(', ');
|
|
381
|
-
}
|
|
382
|
-
return this._selectionModel.selected[0].viewValue;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// ───────────────────────────── ControlValueAccessor ─────────────────────────────
|
|
386
|
-
|
|
387
|
-
writeValue(value: any): void {
|
|
388
|
-
this._assignValue(value);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
registerOnChange(fn: (value: any) => void): void {
|
|
392
|
-
this._onChange = fn;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
registerOnTouched(fn: () => {}): void {
|
|
396
|
-
this._onTouched = fn;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// ───────────────────────────── Opening / Closing ─────────────────────────────
|
|
400
|
-
|
|
401
|
-
/** Guard: can we open now (not disabled, have options, overlay ready)? */
|
|
402
|
-
protected _canOpen(): boolean {
|
|
403
|
-
return !this._panelOpen && !this.disabled && this.options?.length > 0 && !!this._overlayDir;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/** Open the panel and prepare keyboard/scroll state. */
|
|
407
|
-
open(): void {
|
|
408
|
-
if (!this._canOpen()) return;
|
|
409
|
-
|
|
410
|
-
this._cleanupDetach?.();
|
|
411
|
-
this._overlayWidth = this._getOverlayWidth();
|
|
412
|
-
this._panelOpen = true;
|
|
413
|
-
|
|
414
|
-
this._overlayDir.positionChange.pipe(take(1)).subscribe(() => {
|
|
415
|
-
this._changeDetectorRef.detectChanges();
|
|
416
|
-
this._positioningSettled();
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
this._overlayDir.attachOverlay();
|
|
420
|
-
this._keyManager.withHorizontalOrientation(null);
|
|
421
|
-
this._highlightCorrectOption();
|
|
422
|
-
this._changeDetectorRef.markForCheck();
|
|
423
|
-
this.stateChanges.next();
|
|
424
|
-
|
|
425
|
-
Promise.resolve().then(() => this.openedChange.emit(true));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
/** Pick initial active item on open (first enabled or selected). */
|
|
429
|
-
private _highlightCorrectOption(): void {
|
|
430
|
-
if (!this._keyManager) return;
|
|
431
|
-
|
|
432
|
-
if (this.empty) {
|
|
433
|
-
let firstEnabledOptionIndex = -1;
|
|
434
|
-
for (let index = 0; index < this.options.length; index++) {
|
|
435
|
-
const option = this.options.get(index)!;
|
|
436
|
-
if (!option.disabled) {
|
|
437
|
-
firstEnabledOptionIndex = index;
|
|
438
|
-
break;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
this._keyManager.setActiveItem(firstEnabledOptionIndex);
|
|
442
|
-
} else {
|
|
443
|
-
this._keyManager.setActiveItem(this._selectionModel.selected[0]);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
/** After attach: ensure active option is scrolled into view. */
|
|
448
|
-
private _positioningSettled() {
|
|
449
|
-
this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
/** Close panel, restore orientation, mark touched, and emit. */
|
|
453
|
-
close(): void {
|
|
454
|
-
if (!this._panelOpen) return;
|
|
455
|
-
|
|
456
|
-
this._panelOpen = false;
|
|
457
|
-
this._exitAndDetach();
|
|
458
|
-
this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');
|
|
459
|
-
this._changeDetectorRef.markForCheck();
|
|
460
|
-
this._onTouched();
|
|
461
|
-
this.stateChanges.next();
|
|
462
|
-
|
|
463
|
-
Promise.resolve().then(() => this.openedChange.emit(false));
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
/** Play exit animation (if available), then detach overlay. */
|
|
467
|
-
private _exitAndDetach() {
|
|
468
|
-
if (!this.panel) {
|
|
469
|
-
this._detachOverlay();
|
|
470
|
-
return;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
this._cleanupDetach?.();
|
|
474
|
-
this._cleanupDetach = () => {
|
|
475
|
-
cleanupEvent();
|
|
476
|
-
clearTimeout(exitFallbackTimer);
|
|
477
|
-
this._cleanupDetach = undefined;
|
|
478
|
-
};
|
|
479
|
-
|
|
480
|
-
const panel: HTMLElement = this.panel.nativeElement;
|
|
481
|
-
const cleanupEvent = this._renderer.listen(panel, 'animationend', (event: AnimationEvent) => {
|
|
482
|
-
if (event.animationName === 'select-exit') {
|
|
483
|
-
this._cleanupDetach?.();
|
|
484
|
-
this._detachOverlay();
|
|
485
|
-
}
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
const exitFallbackTimer = setTimeout(() => {
|
|
489
|
-
this._cleanupDetach?.();
|
|
490
|
-
this._detachOverlay();
|
|
491
|
-
}, 200);
|
|
492
|
-
|
|
493
|
-
panel.classList.add('select-panel-exit');
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/** Detach overlay and request change detection. */
|
|
497
|
-
private _detachOverlay() {
|
|
498
|
-
this._overlayDir.detachOverlay();
|
|
499
|
-
this._changeDetectorRef.markForCheck();
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// ───────────────────────────── Keyboard handling ─────────────────────────────
|
|
503
|
-
|
|
504
|
-
/** RTL helper. */
|
|
505
|
-
_isRtl(): boolean {
|
|
506
|
-
return this._dir ? this._dir.value === 'rtl' : false;
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
_handleKeydown(event: KeyboardEvent): void {
|
|
510
|
-
if (this.disabled) return;
|
|
511
|
-
this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/** When closed: open with Enter/Space; navigate single selection. */
|
|
515
|
-
private _handleClosedKeydown(event: KeyboardEvent): void {
|
|
516
|
-
const keyCode = event.keyCode;
|
|
517
|
-
const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW || keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;
|
|
518
|
-
const isOpenKey = keyCode === ENTER || keyCode === SPACE;
|
|
519
|
-
const manager = this._keyManager;
|
|
520
|
-
|
|
521
|
-
if ((!manager.isTyping() && isOpenKey && !hasModifierKey(event)) || ((this.multiple || event.altKey) && isArrowKey)) {
|
|
522
|
-
event.preventDefault();
|
|
523
|
-
this.open();
|
|
524
|
-
} else if (!this.multiple) {
|
|
525
|
-
const previouslySelectedOption = this.selected;
|
|
526
|
-
manager.onKeydown(event);
|
|
527
|
-
const selectedOption = this.selected;
|
|
528
|
-
// Example: announce selection change to screen readers if needed.
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
/** When open: navigate/select, Ctrl+A (multiple), Alt+Arrow closes. */
|
|
533
|
-
private _handleOpenKeydown(event: KeyboardEvent): void {
|
|
534
|
-
const manager = this._keyManager;
|
|
535
|
-
const keyCode = event.keyCode;
|
|
536
|
-
const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
|
|
537
|
-
const isTyping = manager.isTyping();
|
|
538
|
-
|
|
539
|
-
if (isArrowKey && event.altKey) {
|
|
540
|
-
event.preventDefault();
|
|
541
|
-
this.close();
|
|
542
|
-
} else if (!isTyping && (keyCode === ENTER || keyCode === SPACE) && manager.activeItem && !hasModifierKey(event)) {
|
|
543
|
-
event.preventDefault();
|
|
544
|
-
manager.activeItem._selectViaInteraction();
|
|
545
|
-
} else if (!isTyping && this._multiple && keyCode === A && event.ctrlKey) {
|
|
546
|
-
event.preventDefault();
|
|
547
|
-
const hasDeselectedOptions = this.options.some((opt) => !opt.disabled && !opt.selected);
|
|
548
|
-
this.options.forEach((option) => {
|
|
549
|
-
if (!option.disabled) hasDeselectedOptions ? option.select() : option.deselect();
|
|
550
|
-
});
|
|
551
|
-
} else {
|
|
552
|
-
const previouslyFocusedIndex = manager.activeItemIndex;
|
|
553
|
-
manager.onKeydown(event);
|
|
554
|
-
|
|
555
|
-
if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem && manager.activeItemIndex !== previouslyFocusedIndex) {
|
|
556
|
-
manager.activeItem._selectViaInteraction();
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
/** For overlay container keydown (ESC closes). */
|
|
562
|
-
protected _handleOverlayKeydown(event: KeyboardEvent): void {
|
|
563
|
-
if (event.keyCode === ESCAPE && !hasModifierKey(event)) {
|
|
564
|
-
event.preventDefault();
|
|
565
|
-
this.close();
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
// ───────────────────────────── Selection & value sync ─────────────────────────────
|
|
570
|
-
|
|
571
|
-
/** Assign value and synchronize selection from external model. */
|
|
572
|
-
private _assignValue(newValue: any | any[]): boolean {
|
|
573
|
-
if (newValue !== this._value || (this._multiple && Array.isArray(newValue))) {
|
|
574
|
-
if (this.options) {
|
|
575
|
-
this._setSelectionByValue(newValue);
|
|
576
|
-
}
|
|
577
|
-
this._value = newValue;
|
|
578
|
-
return true;
|
|
579
|
-
}
|
|
580
|
-
return false;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
/** Compute overlay width from host bounding box. */
|
|
584
|
-
private _getOverlayWidth(): string | number {
|
|
585
|
-
return this._elementRef.nativeElement.getBoundingClientRect().width;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
/** Update selection based on a (possibly array) value. */
|
|
589
|
-
private _setSelectionByValue(value: any | any[]): void {
|
|
590
|
-
this.options.forEach((option) => option.setInactiveStyles());
|
|
591
|
-
this._selectionModel.clear();
|
|
592
|
-
|
|
593
|
-
if (this.multiple && value) {
|
|
594
|
-
value.forEach((currentValue: any) => this._selectOptionByValue(currentValue));
|
|
595
|
-
this._sortValues();
|
|
596
|
-
} else {
|
|
597
|
-
const correspondingOption = this._selectOptionByValue(value);
|
|
598
|
-
if (correspondingOption) {
|
|
599
|
-
this._keyManager.updateActiveItem(correspondingOption);
|
|
600
|
-
} else if (!this.panelOpen) {
|
|
601
|
-
this._keyManager.updateActiveItem(-1);
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
this._changeDetectorRef.markForCheck();
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
/** Find option that matches value (using compareWith) and select it. */
|
|
609
|
-
private _selectOptionByValue(value: any): MDOption | undefined {
|
|
610
|
-
const correspondingOption = this.options.find((option: MDOption) => {
|
|
611
|
-
if (this._selectionModel.isSelected(option)) return false;
|
|
612
|
-
try {
|
|
613
|
-
return (option.value != null || this.canSelectNullableOptions) && this._compareWith(option.value, value);
|
|
614
|
-
} catch (error) {
|
|
615
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) console.warn(error);
|
|
616
|
-
return false;
|
|
617
|
-
}
|
|
618
|
-
});
|
|
619
|
-
|
|
620
|
-
if (correspondingOption) this._selectionModel.select(correspondingOption);
|
|
621
|
-
return correspondingOption;
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
/** Move focus to host (useful after closing). */
|
|
625
|
-
focus(options?: FocusOptions): void {
|
|
626
|
-
this._elementRef.nativeElement.focus(options);
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
/** Default container click behavior: focus + open. */
|
|
630
|
-
onContainerClick() {
|
|
631
|
-
this.focus();
|
|
632
|
-
this.open();
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
/** Initialize selection from bound form control or internal value. */
|
|
636
|
-
private _initializeSelection(): void {
|
|
637
|
-
Promise.resolve().then(() => {
|
|
638
|
-
if (this.ngControl) {
|
|
639
|
-
this._value = this.ngControl.value;
|
|
640
|
-
}
|
|
641
|
-
this._setSelectionByValue(this._value);
|
|
642
|
-
this.stateChanges.next();
|
|
643
|
-
});
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
/** Skip disabled options while panel is closed (for key manager). */
|
|
647
|
-
private _skipPredicate = (option: MDOption) => {
|
|
648
|
-
if (this.panelOpen) return false;
|
|
649
|
-
return option.disabled;
|
|
650
|
-
};
|
|
651
|
-
|
|
652
|
-
/** Ensure a given option index is fully visible inside the panel. */
|
|
653
|
-
_scrollOptionIntoView(index: number): void {
|
|
654
|
-
const option = this.options.toArray()[index];
|
|
655
|
-
if (!option) return;
|
|
656
|
-
|
|
657
|
-
const panel: HTMLElement = this.panel.nativeElement;
|
|
658
|
-
const labelCount = _countGroupLabelsBeforeOption(index, this.options, this.optionGroups);
|
|
659
|
-
const element = option._getHostElement();
|
|
660
|
-
|
|
661
|
-
if (index === 0 && labelCount === 1) {
|
|
662
|
-
panel.scrollTop = 0;
|
|
663
|
-
} else {
|
|
664
|
-
panel.scrollTop = _getOptionScrollPosition(
|
|
665
|
-
element.offsetTop,
|
|
666
|
-
element.offsetHeight,
|
|
667
|
-
panel.scrollTop,
|
|
668
|
-
panel.offsetHeight
|
|
669
|
-
);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
/** Wire option streams and handle user-driven selection/changes. */
|
|
674
|
-
private _resetOptions(): void {
|
|
675
|
-
const changedOrDestroyed = merge(this.options.changes, this._destroy);
|
|
676
|
-
|
|
677
|
-
this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe((event) => {
|
|
678
|
-
this._onSelect(event.source, event.isUserInput);
|
|
679
|
-
if (event.isUserInput && !this.multiple && this._panelOpen) {
|
|
680
|
-
this.close();
|
|
681
|
-
this.focus();
|
|
682
|
-
}
|
|
683
|
-
});
|
|
684
|
-
|
|
685
|
-
merge(...this.options.map((option) => option._stateChanges))
|
|
686
|
-
.pipe(takeUntil(changedOrDestroyed))
|
|
687
|
-
.subscribe(() => {
|
|
688
|
-
this._changeDetectorRef.detectChanges();
|
|
689
|
-
this.stateChanges.next();
|
|
690
|
-
});
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
/** Handle a single option's (de)selection and propagate changes. */
|
|
694
|
-
private _onSelect(option: MDOption, isUserInput: boolean): void {
|
|
695
|
-
const wasSelected = this._selectionModel.isSelected(option);
|
|
696
|
-
|
|
697
|
-
if (option.value == null && !this._multiple) {
|
|
698
|
-
option.deselect();
|
|
699
|
-
this._selectionModel.clear();
|
|
700
|
-
|
|
701
|
-
if (this.value != null) {
|
|
702
|
-
this._propagateChanges(option.value);
|
|
703
|
-
}
|
|
704
|
-
} else {
|
|
705
|
-
if (wasSelected !== option.selected) {
|
|
706
|
-
option.selected ? this._selectionModel.select(option) : this._selectionModel.deselect(option);
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
if (isUserInput) {
|
|
710
|
-
this._keyManager.setActiveItem(option);
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
if (this.multiple) {
|
|
714
|
-
this._sortValues();
|
|
715
|
-
if (isUserInput) this.focus();
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
if (wasSelected !== this._selectionModel.isSelected(option)) {
|
|
720
|
-
this._propagateChanges();
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
this.stateChanges.next();
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
/** Sort selected values using custom comparator or DOM order. */
|
|
727
|
-
private _sortValues() {
|
|
728
|
-
if (!this.multiple) return;
|
|
729
|
-
|
|
730
|
-
const options = this.options.toArray();
|
|
731
|
-
this._selectionModel.sort((a, b) => {
|
|
732
|
-
return this.sortComparator ? this.sortComparator(a, b, options) : options.indexOf(a) - options.indexOf(b);
|
|
733
|
-
});
|
|
734
|
-
this.stateChanges.next();
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
/** Build `SelectChange` payload. */
|
|
738
|
-
private _getChangeEvent(value: any) {
|
|
739
|
-
return new SelectChange(this, value);
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
/** Emit valueChange, call CVA onChange, emit selectionChange, mark for check. */
|
|
743
|
-
private _propagateChanges(fallbackValue?: any): void {
|
|
744
|
-
let valueToEmit: any;
|
|
745
|
-
|
|
746
|
-
if (this.multiple) {
|
|
747
|
-
valueToEmit = (this.selected as MDOption[]).map((option) => option.value);
|
|
748
|
-
} else {
|
|
749
|
-
valueToEmit = this.selected ? (this.selected as MDOption).value : fallbackValue;
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
this._value = valueToEmit;
|
|
753
|
-
this.valueChange.emit(valueToEmit);
|
|
754
|
-
this._onChange(valueToEmit);
|
|
755
|
-
this.selectionChange.emit(this._getChangeEvent(valueToEmit));
|
|
756
|
-
this._changeDetectorRef.markForCheck();
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
/** Initialize keyboard manager for navigation, typeahead, and tabOut. */
|
|
760
|
-
private _initKeyManager() {
|
|
761
|
-
this._keyManager = new ActiveDescendantKeyManager<MDOption>(this.options)
|
|
762
|
-
.withTypeAhead(200)
|
|
763
|
-
.withVerticalOrientation()
|
|
764
|
-
.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')
|
|
765
|
-
.withHomeAndEnd()
|
|
766
|
-
.withPageUpDown()
|
|
767
|
-
.withAllowedModifierKeys(['shiftKey'])
|
|
768
|
-
.skipPredicate(this._skipPredicate);
|
|
769
|
-
|
|
770
|
-
this._keyManager.tabOut.subscribe(() => {
|
|
771
|
-
if (this.panelOpen) {
|
|
772
|
-
if (!this.multiple && this._keyManager.activeItem) {
|
|
773
|
-
this._keyManager.activeItem._selectViaInteraction();
|
|
774
|
-
}
|
|
775
|
-
this.focus();
|
|
776
|
-
this.close();
|
|
777
|
-
}
|
|
778
|
-
});
|
|
779
|
-
|
|
780
|
-
this._keyManager.change.subscribe(() => {
|
|
781
|
-
if (this._panelOpen && this.panel) {
|
|
782
|
-
this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
|
|
783
|
-
} else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {
|
|
784
|
-
this._keyManager.activeItem._selectViaInteraction();
|
|
785
|
-
}
|
|
786
|
-
});
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
/** `aria-activedescendant` points to the active option when panel is open. */
|
|
790
|
-
_getAriaActiveDescendant(): string | null {
|
|
791
|
-
if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {
|
|
792
|
-
return this._keyManager.activeItem.id;
|
|
793
|
-
}
|
|
794
|
-
return null;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
/** Focus-in handler: set focused state (unless disabled). */
|
|
798
|
-
_onFocus() {
|
|
799
|
-
if (!this.disabled) {
|
|
800
|
-
this._focused = true;
|
|
801
|
-
this.stateChanges.next();
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
/** Focus-out handler: mark touched when closed; cancel typeahead. */
|
|
806
|
-
_onBlur() {
|
|
807
|
-
this._focused = false;
|
|
808
|
-
this._keyManager?.cancelTypeahead();
|
|
809
|
-
|
|
810
|
-
if (!this.disabled && !this.panelOpen) {
|
|
811
|
-
this._onTouched();
|
|
812
|
-
this._changeDetectorRef.markForCheck();
|
|
813
|
-
this.stateChanges.next();
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
/** Optional directive to project a custom trigger area for the select. */
|
|
819
|
-
@Directive({
|
|
820
|
-
selector: 'select-trigger',
|
|
821
|
-
providers: [{ provide: MD_SELECT_TRIGGER, useExisting: MDSelectTrigger }],
|
|
822
|
-
standalone: false,
|
|
823
|
-
})
|
|
824
|
-
export class MDSelectTrigger {}
|