@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.
Files changed (414) hide show
  1. package/fesm2022/natec-mef-dev-ui-kit.mjs +9541 -0
  2. package/fesm2022/natec-mef-dev-ui-kit.mjs.map +1 -0
  3. package/index.d.ts +4418 -0
  4. package/index.d.ts.map +1 -0
  5. package/package.json +44 -48
  6. package/src/lib/styles/core.scss +51 -195
  7. package/src/lib/styles/pg/modules/_typography.scss +1 -8
  8. package/src/lib/styles/pg/vendor/ng-datatable.scss +7 -0
  9. package/src/lib/styles/vars.scss +8 -8
  10. package/documentation/classes/FiltredItemModel.html +0 -358
  11. package/documentation/classes/TabChangeEvent.html +0 -231
  12. package/documentation/components/CardComponent.html +0 -576
  13. package/documentation/components/CardLongComponent.html +0 -712
  14. package/documentation/components/CardSimpleComponent.html +0 -372
  15. package/documentation/components/CentralPageComponent.html +0 -312
  16. package/documentation/components/CentralPageRowComponent.html +0 -244
  17. package/documentation/components/CollapseComponent.html +0 -755
  18. package/documentation/components/CollapseSetComponent.html +0 -767
  19. package/documentation/components/DatepickerComponent.html +0 -1397
  20. package/documentation/components/FillComponent.html +0 -736
  21. package/documentation/components/FilteredFieldContainerComponent.html +0 -513
  22. package/documentation/components/FilteredFieldItemComponent.html +0 -451
  23. package/documentation/components/HelpBlockComponent.html +0 -398
  24. package/documentation/components/ManagePageComponent.html +0 -423
  25. package/documentation/components/MefDevOptionComponent.html +0 -689
  26. package/documentation/components/MefDevProgressComponent.html +0 -562
  27. package/documentation/components/MefDevSelectComponent.html +0 -4797
  28. package/documentation/components/MefDevSliderComponent.html +0 -686
  29. package/documentation/components/MefDevSpecFlowTestComponent.html +0 -474
  30. package/documentation/components/MefDevSwitchComponent.html +0 -1480
  31. package/documentation/components/MefDevTabBodyComponent.html +0 -271
  32. package/documentation/components/MefDevTabComponent.html +0 -681
  33. package/documentation/components/MefDevTabSetComponent.html +0 -1889
  34. package/documentation/components/MefDevTabsNavComponent.html +0 -2013
  35. package/documentation/components/MefdevExecutorPageComponent.html +0 -497
  36. package/documentation/components/ProfileComponent.html +0 -608
  37. package/documentation/components/RightFilterComponent.html +0 -423
  38. package/documentation/components/SlideRightComponent.html +0 -762
  39. package/documentation/components/SlideUpComponent.html +0 -692
  40. package/documentation/components/StepExecutorComponent.html +0 -1437
  41. package/documentation/components/TablePageComponent.html +0 -327
  42. package/documentation/dependencies.html +0 -135
  43. package/documentation/directives/MefDevTabLabelDirective.html +0 -532
  44. package/documentation/directives/MefDevTabsInkBarDirective.html +0 -865
  45. package/documentation/fonts/ionicons.eot +0 -0
  46. package/documentation/fonts/ionicons.svg +0 -2090
  47. package/documentation/fonts/ionicons.ttf +0 -0
  48. package/documentation/fonts/ionicons.woff +0 -0
  49. package/documentation/fonts/ionicons.woff2 +0 -0
  50. package/documentation/fonts/roboto-v15-latin-300.eot +0 -0
  51. package/documentation/fonts/roboto-v15-latin-300.svg +0 -314
  52. package/documentation/fonts/roboto-v15-latin-300.ttf +0 -0
  53. package/documentation/fonts/roboto-v15-latin-300.woff +0 -0
  54. package/documentation/fonts/roboto-v15-latin-300.woff2 +0 -0
  55. package/documentation/fonts/roboto-v15-latin-700.eot +0 -0
  56. package/documentation/fonts/roboto-v15-latin-700.svg +0 -310
  57. package/documentation/fonts/roboto-v15-latin-700.ttf +0 -0
  58. package/documentation/fonts/roboto-v15-latin-700.woff +0 -0
  59. package/documentation/fonts/roboto-v15-latin-700.woff2 +0 -0
  60. package/documentation/fonts/roboto-v15-latin-italic.eot +0 -0
  61. package/documentation/fonts/roboto-v15-latin-italic.svg +0 -323
  62. package/documentation/fonts/roboto-v15-latin-italic.ttf +0 -0
  63. package/documentation/fonts/roboto-v15-latin-italic.woff +0 -0
  64. package/documentation/fonts/roboto-v15-latin-italic.woff2 +0 -0
  65. package/documentation/fonts/roboto-v15-latin-regular.eot +0 -0
  66. package/documentation/fonts/roboto-v15-latin-regular.svg +0 -308
  67. package/documentation/fonts/roboto-v15-latin-regular.ttf +0 -0
  68. package/documentation/fonts/roboto-v15-latin-regular.woff +0 -0
  69. package/documentation/fonts/roboto-v15-latin-regular.woff2 +0 -0
  70. package/documentation/graph/dependencies.svg +0 -1160
  71. package/documentation/images/compodoc-vectorise-inverted.png +0 -0
  72. package/documentation/images/compodoc-vectorise-inverted.svg +0 -201
  73. package/documentation/images/compodoc-vectorise.png +0 -0
  74. package/documentation/images/compodoc-vectorise.svg +0 -201
  75. package/documentation/images/favicon.ico +0 -0
  76. package/documentation/index.html +0 -246
  77. package/documentation/injectables/FilteredFieldService.html +0 -420
  78. package/documentation/injectables/ProgressConfig.html +0 -236
  79. package/documentation/interfaces/AnimatedInterface.html +0 -246
  80. package/documentation/js/compodoc.js +0 -14
  81. package/documentation/js/lazy-load-graphs.js +0 -44
  82. package/documentation/js/libs/EventDispatcher.js +0 -5
  83. package/documentation/js/libs/bootstrap-native.js +0 -1
  84. package/documentation/js/libs/clipboard.min.js +0 -7
  85. package/documentation/js/libs/custom-elements-es5-adapter.js +0 -15
  86. package/documentation/js/libs/custom-elements.min.js +0 -38
  87. package/documentation/js/libs/d3.v3.min.js +0 -2
  88. package/documentation/js/libs/deep-iterator.js +0 -2
  89. package/documentation/js/libs/es6-shim.min.js +0 -11
  90. package/documentation/js/libs/htmlparser.js +0 -23
  91. package/documentation/js/libs/innersvg.js +0 -9
  92. package/documentation/js/libs/lit-html.js +0 -1
  93. package/documentation/js/libs/prism.js +0 -46
  94. package/documentation/js/libs/promise.min.js +0 -6
  95. package/documentation/js/libs/svg-pan-zoom.min.js +0 -3
  96. package/documentation/js/libs/tablesort.min.js +0 -6
  97. package/documentation/js/libs/tablesort.number.min.js +0 -6
  98. package/documentation/js/libs/vis.min.js +0 -47
  99. package/documentation/js/libs/zepto.min.js +0 -2
  100. package/documentation/js/menu-wc.js +0 -455
  101. package/documentation/js/menu-wc_es5.js +0 -42
  102. package/documentation/js/menu.js +0 -325
  103. package/documentation/js/routes.js +0 -301
  104. package/documentation/js/search/lunr.min.js +0 -6
  105. package/documentation/js/search/search-lunr.js +0 -67
  106. package/documentation/js/search/search.js +0 -268
  107. package/documentation/js/search/search_index.js +0 -4
  108. package/documentation/js/sourceCode.js +0 -58
  109. package/documentation/js/svg-pan-zoom.controls.js +0 -53
  110. package/documentation/js/tabs.js +0 -21
  111. package/documentation/js/tree.js +0 -147
  112. package/documentation/miscellaneous/enumerations.html +0 -223
  113. package/documentation/miscellaneous/functions.html +0 -251
  114. package/documentation/miscellaneous/typealiases.html +0 -257
  115. package/documentation/miscellaneous/variables.html +0 -357
  116. package/documentation/modules/MefDevCardModule/dependencies.svg +0 -142
  117. package/documentation/modules/MefDevCardModule.html +0 -349
  118. package/documentation/modules/MefDevCollapseModule/dependencies.svg +0 -90
  119. package/documentation/modules/MefDevCollapseModule.html +0 -316
  120. package/documentation/modules/MefDevDatepickerModule/dependencies.svg +0 -82
  121. package/documentation/modules/MefDevDatepickerModule.html +0 -274
  122. package/documentation/modules/MefDevFilteredFieldModule/dependencies.svg +0 -90
  123. package/documentation/modules/MefDevFilteredFieldModule.html +0 -278
  124. package/documentation/modules/MefDevHelpBlockModule/dependencies.svg +0 -82
  125. package/documentation/modules/MefDevHelpBlockModule.html +0 -274
  126. package/documentation/modules/MefDevModalModule/dependencies.svg +0 -154
  127. package/documentation/modules/MefDevModalModule.html +0 -364
  128. package/documentation/modules/MefDevPageLayoutsModule/dependencies.svg +0 -162
  129. package/documentation/modules/MefDevPageLayoutsModule.html +0 -368
  130. package/documentation/modules/MefDevProgressModule/dependencies.svg +0 -66
  131. package/documentation/modules/MefDevProgressModule.html +0 -286
  132. package/documentation/modules/MefDevSelectModule/dependencies.svg +0 -140
  133. package/documentation/modules/MefDevSelectModule.html +0 -334
  134. package/documentation/modules/MefDevSliderModule/dependencies.svg +0 -66
  135. package/documentation/modules/MefDevSliderModule.html +0 -248
  136. package/documentation/modules/MefDevSpecFlowTestModule/dependencies.svg +0 -66
  137. package/documentation/modules/MefDevSpecFlowTestModule.html +0 -286
  138. package/documentation/modules/MefDevStepExecutorModule/dependencies.svg +0 -106
  139. package/documentation/modules/MefDevStepExecutorModule.html +0 -304
  140. package/documentation/modules/MefDevSwitchModule/dependencies.svg +0 -88
  141. package/documentation/modules/MefDevSwitchModule.html +0 -270
  142. package/documentation/modules/MefDevTabsModule/dependencies.svg +0 -186
  143. package/documentation/modules/MefDevTabsModule.html +0 -398
  144. package/documentation/modules.html +0 -357
  145. package/documentation/overview.html +0 -1351
  146. package/documentation/pipes/OptionPipe.html +0 -238
  147. package/documentation/properties.html +0 -125
  148. package/documentation/styles/bootstrap-card.css +0 -219
  149. package/documentation/styles/bootstrap.min.css +0 -6
  150. package/documentation/styles/compodoc.css +0 -1121
  151. package/documentation/styles/dark.css +0 -121
  152. package/documentation/styles/ionicons.min.css +0 -11
  153. package/documentation/styles/laravel.css +0 -113
  154. package/documentation/styles/material.css +0 -131
  155. package/documentation/styles/original.css +0 -51
  156. package/documentation/styles/postmark.css +0 -238
  157. package/documentation/styles/prism.css +0 -301
  158. package/documentation/styles/readthedocs.css +0 -117
  159. package/documentation/styles/reset.css +0 -129
  160. package/documentation/styles/stripe.css +0 -106
  161. package/documentation/styles/style.css +0 -7
  162. package/documentation/styles/tablesort.css +0 -33
  163. package/documentation/styles/vagrant.css +0 -130
  164. package/karma.conf.js +0 -44
  165. package/ng-package.json +0 -18
  166. package/src/lib/markup-kit/card/card/card.component.html +0 -44
  167. package/src/lib/markup-kit/card/card/card.component.scss +0 -65
  168. package/src/lib/markup-kit/card/card/card.component.ts +0 -109
  169. package/src/lib/markup-kit/card/card-long/card-long.component.html +0 -53
  170. package/src/lib/markup-kit/card/card-long/card-long.component.scss +0 -72
  171. package/src/lib/markup-kit/card/card-long/card-long.component.ts +0 -158
  172. package/src/lib/markup-kit/card/card-long/cart-type-colors.enum.ts +0 -5
  173. package/src/lib/markup-kit/card/card-simple/card-simple.component.html +0 -12
  174. package/src/lib/markup-kit/card/card-simple/card-simple.component.scss +0 -12
  175. package/src/lib/markup-kit/card/card-simple/card-simple.component.ts +0 -48
  176. package/src/lib/markup-kit/card/card.module.ts +0 -21
  177. package/src/lib/markup-kit/card/index.ts +0 -6
  178. package/src/lib/markup-kit/collapse/collapse/collapse.component.html +0 -17
  179. package/src/lib/markup-kit/collapse/collapse/collapse.component.scss +0 -17
  180. package/src/lib/markup-kit/collapse/collapse/collapse.component.ts +0 -131
  181. package/src/lib/markup-kit/collapse/collapse-set/collapse-set.component.html +0 -3
  182. package/src/lib/markup-kit/collapse/collapse-set/collapse-set.component.scss +0 -0
  183. package/src/lib/markup-kit/collapse/collapse-set/collapse-set.component.ts +0 -110
  184. package/src/lib/markup-kit/collapse/collapse.module.ts +0 -20
  185. package/src/lib/markup-kit/collapse/index.ts +0 -3
  186. package/src/lib/markup-kit/executors/index.ts +0 -4
  187. package/src/lib/markup-kit/executors/mefdev-executor-page/mefdev-executor-page.component.ts +0 -111
  188. package/src/lib/markup-kit/executors/stage/stage.component.html +0 -23
  189. package/src/lib/markup-kit/executors/stage/stage.component.scss +0 -9
  190. package/src/lib/markup-kit/executors/stage/stage.component.ts +0 -21
  191. package/src/lib/markup-kit/executors/step-executor/step-executor.component.html +0 -127
  192. package/src/lib/markup-kit/executors/step-executor/step-executor.component.scss +0 -225
  193. package/src/lib/markup-kit/executors/step-executor/step-executor.component.ts +0 -295
  194. package/src/lib/markup-kit/executors/step-executor.module.ts +0 -27
  195. package/src/lib/markup-kit/modals/fill/fill.component.html +0 -15
  196. package/src/lib/markup-kit/modals/fill/fill.component.scss +0 -42
  197. package/src/lib/markup-kit/modals/fill/fill.component.ts +0 -126
  198. package/src/lib/markup-kit/modals/index.ts +0 -6
  199. package/src/lib/markup-kit/modals/markup-kit.module.ts +0 -25
  200. package/src/lib/markup-kit/modals/modal-size.enum.ts +0 -5
  201. package/src/lib/markup-kit/modals/right-filter/right-filter.component.html +0 -11
  202. package/src/lib/markup-kit/modals/right-filter/right-filter.component.scss +0 -15
  203. package/src/lib/markup-kit/modals/right-filter/right-filter.component.ts +0 -49
  204. package/src/lib/markup-kit/modals/slide-right/slide-right.component.html +0 -14
  205. package/src/lib/markup-kit/modals/slide-right/slide-right.component.scss +0 -42
  206. package/src/lib/markup-kit/modals/slide-right/slide-right.component.ts +0 -121
  207. package/src/lib/markup-kit/modals/slide-up/slide-up.component.html +0 -15
  208. package/src/lib/markup-kit/modals/slide-up/slide-up.component.scss +0 -47
  209. package/src/lib/markup-kit/modals/slide-up/slide-up.component.ts +0 -105
  210. package/src/lib/markup-kit/page-layouts/central-page/central-page.component.html +0 -6
  211. package/src/lib/markup-kit/page-layouts/central-page/central-page.component.scss +0 -10
  212. package/src/lib/markup-kit/page-layouts/central-page/central-page.component.ts +0 -58
  213. package/src/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.html +0 -3
  214. package/src/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.scss +0 -5
  215. package/src/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.ts +0 -30
  216. package/src/lib/markup-kit/page-layouts/index.ts +0 -6
  217. package/src/lib/markup-kit/page-layouts/manage-page/manage-page.component.html +0 -10
  218. package/src/lib/markup-kit/page-layouts/manage-page/manage-page.component.scss +0 -33
  219. package/src/lib/markup-kit/page-layouts/manage-page/manage-page.component.ts +0 -70
  220. package/src/lib/markup-kit/page-layouts/page-layouts.module.ts +0 -26
  221. package/src/lib/markup-kit/page-layouts/profile/profile.component.html +0 -31
  222. package/src/lib/markup-kit/page-layouts/profile/profile.component.scss +0 -99
  223. package/src/lib/markup-kit/page-layouts/profile/profile.component.ts +0 -129
  224. package/src/lib/markup-kit/page-layouts/table-page/table-page.component.html +0 -9
  225. package/src/lib/markup-kit/page-layouts/table-page/table-page.component.scss +0 -0
  226. package/src/lib/markup-kit/page-layouts/table-page/table-page.component.ts +0 -42
  227. package/src/lib/markup-kit/slider/index.ts +0 -2
  228. package/src/lib/markup-kit/slider/slider/slider.component.html +0 -11
  229. package/src/lib/markup-kit/slider/slider/slider.component.scss +0 -106
  230. package/src/lib/markup-kit/slider/slider/slider.component.ts +0 -124
  231. package/src/lib/markup-kit/slider/slider.module.ts +0 -20
  232. package/src/lib/markup-kit/utils/datepicker/datepicker/datepicker.component.html +0 -87
  233. package/src/lib/markup-kit/utils/datepicker/datepicker/datepicker.component.scss +0 -132
  234. package/src/lib/markup-kit/utils/datepicker/datepicker/datepicker.component.ts +0 -643
  235. package/src/lib/markup-kit/utils/datepicker/datepicker.module.ts +0 -15
  236. package/src/lib/markup-kit/utils/datepicker/index.ts +0 -2
  237. package/src/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.html +0 -3
  238. package/src/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.scss +0 -4
  239. package/src/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.ts +0 -79
  240. package/src/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.html +0 -4
  241. package/src/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.scss +0 -12
  242. package/src/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.ts +0 -75
  243. package/src/lib/markup-kit/utils/filtered-field/filtered-field.module.ts +0 -19
  244. package/src/lib/markup-kit/utils/filtered-field/filtered-field.service.ts +0 -44
  245. package/src/lib/markup-kit/utils/filtered-field/filtred-item.model.ts +0 -15
  246. package/src/lib/markup-kit/utils/filtered-field/index.ts +0 -5
  247. package/src/lib/markup-kit/utils/help-block/help-block.component.html +0 -19
  248. package/src/lib/markup-kit/utils/help-block/help-block.component.scss +0 -22
  249. package/src/lib/markup-kit/utils/help-block/help-block.component.ts +0 -70
  250. package/src/lib/markup-kit/utils/help-block/hepl-block.module.ts +0 -14
  251. package/src/lib/markup-kit/utils/help-block/index.ts +0 -2
  252. package/src/lib/pg-components/card/card.components.html +0 -66
  253. package/src/lib/pg-components/card/card.components.ts +0 -451
  254. package/src/lib/pg-components/card/card.module.ts +0 -17
  255. package/src/lib/pg-components/card/index.ts +0 -2
  256. package/src/lib/pg-components/progress/index.ts +0 -3
  257. package/src/lib/pg-components/progress/progress.component.html +0 -28
  258. package/src/lib/pg-components/progress/progress.component.ts +0 -73
  259. package/src/lib/pg-components/progress/progress.config.ts +0 -7
  260. package/src/lib/pg-components/progress/progress.module.ts +0 -16
  261. package/src/lib/pg-components/select/index.ts +0 -4
  262. package/src/lib/pg-components/select/option.component.html +0 -1
  263. package/src/lib/pg-components/select/option.component.ts +0 -105
  264. package/src/lib/pg-components/select/option.pipe.ts +0 -44
  265. package/src/lib/pg-components/select/select.component.html +0 -83
  266. package/src/lib/pg-components/select/select.component.ts +0 -814
  267. package/src/lib/pg-components/select/select.module.ts +0 -14
  268. package/src/lib/pg-components/spec-flow-test/index.ts +0 -2
  269. package/src/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.html +0 -6
  270. package/src/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.scss +0 -0
  271. package/src/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.ts +0 -37
  272. package/src/lib/pg-components/spec-flow-test/spec-flow-test.module.ts +0 -18
  273. package/src/lib/pg-components/switch/index.ts +0 -2
  274. package/src/lib/pg-components/switch/switch.component.html +0 -10
  275. package/src/lib/pg-components/switch/switch.component.ts +0 -286
  276. package/src/lib/pg-components/switch/switch.module.ts +0 -11
  277. package/src/lib/pg-components/tabs/index.ts +0 -7
  278. package/src/lib/pg-components/tabs/tab-body.component.html +0 -1
  279. package/src/lib/pg-components/tabs/tab-body.component.ts +0 -17
  280. package/src/lib/pg-components/tabs/tab-label.directive.ts +0 -41
  281. package/src/lib/pg-components/tabs/tab.component.html +0 -3
  282. package/src/lib/pg-components/tabs/tab.component.ts +0 -109
  283. package/src/lib/pg-components/tabs/tabs-ink-bar.directive.ts +0 -78
  284. package/src/lib/pg-components/tabs/tabs-nav.component.html +0 -20
  285. package/src/lib/pg-components/tabs/tabs-nav.component.ts +0 -324
  286. package/src/lib/pg-components/tabs/tabs.module.ts +0 -15
  287. package/src/lib/pg-components/tabs/tabset.component.html +0 -39
  288. package/src/lib/pg-components/tabs/tabset.component.ts +0 -270
  289. package/src/lib/pg-components/util/convert.ts +0 -3
  290. package/src/lib/pg-components/util/request-animation.ts +0 -31
  291. package/src/lib/v2/autocomplete/autocomplete-origin.ts +0 -12
  292. package/src/lib/v2/autocomplete/autocomplete.html +0 -17
  293. package/src/lib/v2/autocomplete/autocomplete.module.ts +0 -28
  294. package/src/lib/v2/autocomplete/autocomplete.scss +0 -62
  295. package/src/lib/v2/autocomplete/autocomplete.trigger.ts +0 -759
  296. package/src/lib/v2/autocomplete/autocomplete.ts +0 -201
  297. package/src/lib/v2/autocomplete/index.ts +0 -1
  298. package/src/lib/v2/card/card-header.html +0 -9
  299. package/src/lib/v2/card/card-title-group.html +0 -15
  300. package/src/lib/v2/card/card.html +0 -1
  301. package/src/lib/v2/card/card.module.ts +0 -40
  302. package/src/lib/v2/card/card.scss +0 -185
  303. package/src/lib/v2/card/card.ts +0 -274
  304. package/src/lib/v2/card/index.ts +0 -2
  305. package/src/lib/v2/checkbox/checkbox.html +0 -38
  306. package/src/lib/v2/checkbox/checkbox.module.ts +0 -8
  307. package/src/lib/v2/checkbox/checkbox.scss +0 -318
  308. package/src/lib/v2/checkbox/checkbox.ts +0 -507
  309. package/src/lib/v2/checkbox/index.ts +0 -1
  310. package/src/lib/v2/chips/chip-action.ts +0 -102
  311. package/src/lib/v2/chips/chip-edit-input.ts +0 -44
  312. package/src/lib/v2/chips/chip-grid.ts +0 -412
  313. package/src/lib/v2/chips/chip-icons.ts +0 -91
  314. package/src/lib/v2/chips/chip-input.ts +0 -208
  315. package/src/lib/v2/chips/chip-listbox.ts +0 -291
  316. package/src/lib/v2/chips/chip-option.html +0 -37
  317. package/src/lib/v2/chips/chip-option.ts +0 -163
  318. package/src/lib/v2/chips/chip-row.html +0 -42
  319. package/src/lib/v2/chips/chip-row.ts +0 -191
  320. package/src/lib/v2/chips/chip-set.scss +0 -86
  321. package/src/lib/v2/chips/chip-set.ts +0 -261
  322. package/src/lib/v2/chips/chip-text-control.ts +0 -15
  323. package/src/lib/v2/chips/chip.html +0 -21
  324. package/src/lib/v2/chips/chip.scss +0 -646
  325. package/src/lib/v2/chips/chip.ts +0 -281
  326. package/src/lib/v2/chips/chips-module.ts +0 -44
  327. package/src/lib/v2/chips/index.ts +0 -12
  328. package/src/lib/v2/chips/tokens.ts +0 -29
  329. package/src/lib/v2/collapse/accordion-base.ts +0 -20
  330. package/src/lib/v2/collapse/accordion.ts +0 -92
  331. package/src/lib/v2/collapse/collapse.module.ts +0 -22
  332. package/src/lib/v2/collapse/expansion-panel-base.ts +0 -10
  333. package/src/lib/v2/collapse/expansion-panel-content.ts +0 -12
  334. package/src/lib/v2/collapse/expansion-panel-header.html +0 -17
  335. package/src/lib/v2/collapse/expansion-panel-header.scss +0 -165
  336. package/src/lib/v2/collapse/expansion-panel-header.ts +0 -237
  337. package/src/lib/v2/collapse/expansion-panel.html +0 -14
  338. package/src/lib/v2/collapse/expansion-panel.scss +0 -113
  339. package/src/lib/v2/collapse/expansion-panel.ts +0 -279
  340. package/src/lib/v2/collapse/index.ts +0 -7
  341. package/src/lib/v2/executors/index.ts +0 -10
  342. package/src/lib/v2/executors/step-content.ts +0 -19
  343. package/src/lib/v2/executors/step-footer.ts +0 -7
  344. package/src/lib/v2/executors/step-header.html +0 -59
  345. package/src/lib/v2/executors/step-header.scss +0 -205
  346. package/src/lib/v2/executors/step-header.ts +0 -151
  347. package/src/lib/v2/executors/step-label.ts +0 -16
  348. package/src/lib/v2/executors/step.html +0 -4
  349. package/src/lib/v2/executors/stepper-button.ts +0 -40
  350. package/src/lib/v2/executors/stepper-icon.ts +0 -42
  351. package/src/lib/v2/executors/stepper-intl.ts +0 -46
  352. package/src/lib/v2/executors/stepper-module.ts +0 -42
  353. package/src/lib/v2/executors/stepper.html +0 -90
  354. package/src/lib/v2/executors/stepper.scss +0 -299
  355. package/src/lib/v2/executors/stepper.ts +0 -360
  356. package/src/lib/v2/modals/dialog-config.ts +0 -56
  357. package/src/lib/v2/modals/dialog-container.html +0 -5
  358. package/src/lib/v2/modals/dialog-container.ts +0 -243
  359. package/src/lib/v2/modals/dialog-content-directives.ts +0 -217
  360. package/src/lib/v2/modals/dialog-ref.ts +0 -242
  361. package/src/lib/v2/modals/dialog.scss +0 -307
  362. package/src/lib/v2/modals/dialog.ts +0 -239
  363. package/src/lib/v2/modals/index.ts +0 -11
  364. package/src/lib/v2/modals/modal-module.ts +0 -23
  365. package/src/lib/v2/radio-button/public-api.ts +0 -2
  366. package/src/lib/v2/radio-button/radio.html +0 -25
  367. package/src/lib/v2/radio-button/radio.module.ts +0 -8
  368. package/src/lib/v2/radio-button/radio.scss +0 -298
  369. package/src/lib/v2/radio-button/radio.ts +0 -640
  370. package/src/lib/v2/select/index.ts +0 -5
  371. package/src/lib/v2/select/option-group.html +0 -9
  372. package/src/lib/v2/select/option-group.scss +0 -33
  373. package/src/lib/v2/select/option-group.ts +0 -66
  374. package/src/lib/v2/select/option-module.ts +0 -11
  375. package/src/lib/v2/select/option.html +0 -22
  376. package/src/lib/v2/select/option.scss +0 -59
  377. package/src/lib/v2/select/option.ts +0 -288
  378. package/src/lib/v2/select/pseudo-checkbox-module.ts +0 -9
  379. package/src/lib/v2/select/pseudo-checkbox.scss +0 -121
  380. package/src/lib/v2/select/pseudo-checkbox.ts +0 -60
  381. package/src/lib/v2/select/select.html +0 -56
  382. package/src/lib/v2/select/select.module.ts +0 -14
  383. package/src/lib/v2/select/select.scss +0 -118
  384. package/src/lib/v2/select/select.ts +0 -824
  385. package/src/lib/v2/switch/base-editor-helper.ts +0 -148
  386. package/src/lib/v2/switch/index.ts +0 -2
  387. package/src/lib/v2/switch/switch.component.html +0 -15
  388. package/src/lib/v2/switch/switch.component.scss +0 -93
  389. package/src/lib/v2/switch/switch.component.ts +0 -203
  390. package/src/lib/v2/switch/switch.module.ts +0 -10
  391. package/src/lib/v2/tabs/config.ts +0 -94
  392. package/src/lib/v2/tabs/index.ts +0 -28
  393. package/src/lib/v2/tabs/ink-bar.ts +0 -226
  394. package/src/lib/v2/tabs/paginated-tab-header.ts +0 -536
  395. package/src/lib/v2/tabs/tab-body.html +0 -9
  396. package/src/lib/v2/tabs/tab-body.scss +0 -60
  397. package/src/lib/v2/tabs/tab-body.ts +0 -310
  398. package/src/lib/v2/tabs/tab-content.ts +0 -12
  399. package/src/lib/v2/tabs/tab-group.html +0 -74
  400. package/src/lib/v2/tabs/tab-group.scss +0 -362
  401. package/src/lib/v2/tabs/tab-group.ts +0 -491
  402. package/src/lib/v2/tabs/tab-header.html +0 -35
  403. package/src/lib/v2/tabs/tab-header.scss +0 -127
  404. package/src/lib/v2/tabs/tab-header.ts +0 -91
  405. package/src/lib/v2/tabs/tab-label-wrapper.ts +0 -49
  406. package/src/lib/v2/tabs/tab-label.ts +0 -34
  407. package/src/lib/v2/tabs/tab.html +0 -1
  408. package/src/lib/v2/tabs/tab.ts +0 -155
  409. package/src/lib/v2/tabs/tabs.module.ts +0 -12
  410. package/src/public-api.ts +0 -33
  411. package/tsconfig.doc.json +0 -4
  412. package/tsconfig.lib.json +0 -19
  413. package/tsconfig.lib.prod.json +0 -10
  414. 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 {}