@ptsecurity/mosaic 13.6.1 → 13.7.2

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 (907) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +6 -6
  3. package/_theming.scss +7238 -7141
  4. package/_visual.scss +2724 -2695
  5. package/autocomplete/autocomplete-origin.directive.d.ts +12 -12
  6. package/autocomplete/autocomplete-trigger.directive.d.ts +167 -167
  7. package/autocomplete/autocomplete.component.d.ts +73 -73
  8. package/autocomplete/autocomplete.module.d.ts +12 -12
  9. package/autocomplete/index.d.ts +1 -1
  10. package/autocomplete/ptsecurity-mosaic-autocomplete.d.ts +5 -5
  11. package/autocomplete/public-api.d.ts +4 -4
  12. package/button/button.component.d.ts +40 -40
  13. package/button/button.module.d.ts +10 -10
  14. package/button/index.d.ts +1 -1
  15. package/button/ptsecurity-mosaic-button.d.ts +5 -5
  16. package/button/public-api.d.ts +2 -2
  17. package/button-toggle/button-toggle.component.d.ts +141 -141
  18. package/button-toggle/button-toggle.module.d.ts +9 -9
  19. package/button-toggle/index.d.ts +1 -1
  20. package/button-toggle/ptsecurity-mosaic-button-toggle.d.ts +5 -5
  21. package/button-toggle/public-api.d.ts +2 -2
  22. package/card/card.component.d.ts +26 -26
  23. package/card/card.module.d.ts +10 -10
  24. package/card/index.d.ts +1 -1
  25. package/card/ptsecurity-mosaic-card.d.ts +5 -5
  26. package/card/public-api.d.ts +2 -2
  27. package/checkbox/README.md +1 -1
  28. package/checkbox/checkbox-config.d.ts +13 -13
  29. package/checkbox/checkbox-module.d.ts +9 -9
  30. package/checkbox/checkbox-required-validator.d.ts +13 -13
  31. package/checkbox/checkbox.d.ts +140 -140
  32. package/checkbox/index.d.ts +1 -1
  33. package/checkbox/ptsecurity-mosaic-checkbox.d.ts +5 -5
  34. package/checkbox/public-api.d.ts +4 -4
  35. package/core/animation/animation.d.ts +6 -6
  36. package/core/animation/fade-animations.d.ts +2 -2
  37. package/core/animation/index.d.ts +3 -3
  38. package/core/animation/select-animations.d.ts +12 -12
  39. package/core/common-behaviors/color.d.ts +19 -19
  40. package/core/common-behaviors/common-module.d.ts +25 -25
  41. package/core/common-behaviors/constructor.d.ts +9 -9
  42. package/core/common-behaviors/disabled.d.ts +8 -8
  43. package/core/common-behaviors/error-state.d.ts +25 -25
  44. package/core/common-behaviors/index.d.ts +5 -5
  45. package/core/common-behaviors/tabindex.d.ts +8 -8
  46. package/core/error/error-options.d.ts +14 -14
  47. package/core/formatters/date/formatter.d.ts +203 -203
  48. package/core/formatters/date/templates/en-US.d.ts +74 -74
  49. package/core/formatters/date/templates/ru-RU.d.ts +74 -74
  50. package/core/formatters/index.d.ts +9 -9
  51. package/core/formatters/number/formatter.d.ts +27 -27
  52. package/core/forms/forms-module.d.ts +7 -7
  53. package/core/forms/forms.directive.d.ts +22 -22
  54. package/core/forms/index.d.ts +2 -2
  55. package/core/highlight/highlight.pipe.d.ts +7 -7
  56. package/core/highlight/index.d.ts +9 -9
  57. package/core/index.d.ts +1 -1
  58. package/core/label/label-options.d.ts +13 -13
  59. package/core/line/line.d.ts +28 -28
  60. package/core/option/action.d.ts +42 -42
  61. package/core/option/index.d.ts +4 -4
  62. package/core/option/optgroup.d.ts +16 -16
  63. package/core/option/option-module.d.ts +11 -11
  64. package/core/option/option.d.ts +115 -115
  65. package/core/overlay/overlay-position-map.d.ts +34 -34
  66. package/core/pop-up/constants.d.ts +29 -29
  67. package/core/pop-up/index.d.ts +3 -3
  68. package/core/pop-up/pop-up-trigger.d.ts +70 -70
  69. package/core/pop-up/pop-up.d.ts +36 -36
  70. package/core/ptsecurity-mosaic-core.d.ts +5 -5
  71. package/core/public-api.d.ts +17 -17
  72. package/core/select/constants.d.ts +23 -23
  73. package/core/select/errors.d.ts +19 -19
  74. package/core/select/events.d.ts +1 -1
  75. package/core/select/index.d.ts +3 -3
  76. package/core/selection/constants.d.ts +4 -4
  77. package/core/selection/index.d.ts +3 -3
  78. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +30 -30
  79. package/core/selection/pseudo-checkbox/pseudo-checkbox.module.d.ts +8 -8
  80. package/core/services/measure-scrollbar.service.d.ts +11 -11
  81. package/core/utils/index.d.ts +1 -1
  82. package/core/utils/public-api.d.ts +1 -1
  83. package/core/utils/utils.d.ts +2 -2
  84. package/core/validation/index.d.ts +1 -1
  85. package/core/validation/validation.d.ts +18 -18
  86. package/core/version.d.ts +2 -2
  87. package/datepicker/calendar-body.component.d.ts +63 -63
  88. package/datepicker/calendar.component.d.ts +151 -151
  89. package/datepicker/datepicker-animations.d.ts +9 -9
  90. package/datepicker/datepicker-errors.d.ts +2 -2
  91. package/datepicker/datepicker-input.directive.d.ts +178 -178
  92. package/datepicker/datepicker-intl.d.ts +32 -32
  93. package/datepicker/datepicker-module.d.ts +20 -20
  94. package/datepicker/datepicker-toggle.component.d.ts +35 -35
  95. package/datepicker/datepicker.component.d.ts +158 -158
  96. package/datepicker/index.d.ts +1 -1
  97. package/datepicker/month-view.component.d.ts +93 -93
  98. package/datepicker/multi-year-view.component.d.ts +72 -72
  99. package/datepicker/ptsecurity-mosaic-datepicker.d.ts +5 -5
  100. package/datepicker/public-api.d.ts +11 -11
  101. package/datepicker/year-view.component.d.ts +90 -90
  102. package/design-tokens/index.d.ts +1 -1
  103. package/design-tokens/legacy-2017/tokens/components/alert.json5 +83 -83
  104. package/design-tokens/legacy-2017/tokens/components/autocomplete.json5 +11 -11
  105. package/design-tokens/legacy-2017/tokens/components/badge.json5 +174 -174
  106. package/design-tokens/legacy-2017/tokens/components/button-toggle.json5 +10 -10
  107. package/design-tokens/legacy-2017/tokens/components/button.json5 +142 -142
  108. package/design-tokens/legacy-2017/tokens/components/card.json5 +51 -51
  109. package/design-tokens/legacy-2017/tokens/components/checkbox.json5 +97 -97
  110. package/design-tokens/legacy-2017/tokens/components/datepicker.json5 +64 -64
  111. package/design-tokens/legacy-2017/tokens/components/divider.json5 +14 -14
  112. package/design-tokens/legacy-2017/tokens/components/dl.json5 +38 -38
  113. package/design-tokens/legacy-2017/tokens/components/dropdown.json5 +48 -48
  114. package/design-tokens/legacy-2017/tokens/components/form-field.json5 +92 -92
  115. package/design-tokens/legacy-2017/tokens/components/forms.json5 +52 -52
  116. package/design-tokens/legacy-2017/tokens/components/icon.json5 +104 -104
  117. package/design-tokens/legacy-2017/tokens/components/input.json5 +12 -12
  118. package/design-tokens/legacy-2017/tokens/components/link.json5 +50 -50
  119. package/design-tokens/legacy-2017/tokens/components/list.json5 +13 -13
  120. package/design-tokens/legacy-2017/tokens/components/loader-overlay.json5 +23 -0
  121. package/design-tokens/legacy-2017/tokens/components/modal.json5 +81 -81
  122. package/design-tokens/legacy-2017/tokens/components/navbar.json5 +70 -70
  123. package/design-tokens/legacy-2017/tokens/components/optgroup.json5 +10 -10
  124. package/design-tokens/legacy-2017/tokens/components/option.json5 +12 -12
  125. package/design-tokens/legacy-2017/tokens/components/popover.json5 +68 -68
  126. package/design-tokens/legacy-2017/tokens/components/popup.json5 +16 -16
  127. package/design-tokens/legacy-2017/tokens/components/progress-bar.json5 +13 -13
  128. package/design-tokens/legacy-2017/tokens/components/progress-spinner.json5 +7 -7
  129. package/design-tokens/legacy-2017/tokens/components/radio.json5 +45 -45
  130. package/design-tokens/legacy-2017/tokens/components/select.json5 +24 -24
  131. package/design-tokens/legacy-2017/tokens/components/sidepanel.json5 +44 -44
  132. package/design-tokens/legacy-2017/tokens/components/table.json5 +15 -15
  133. package/design-tokens/legacy-2017/tokens/components/tabs.json5 +101 -101
  134. package/design-tokens/legacy-2017/tokens/components/tags.json5 +134 -134
  135. package/design-tokens/legacy-2017/tokens/components/textarea.json5 +12 -12
  136. package/design-tokens/legacy-2017/tokens/components/timepicker.json5 +7 -7
  137. package/design-tokens/legacy-2017/tokens/components/toggle.json5 +79 -79
  138. package/design-tokens/legacy-2017/tokens/components/tooltip.json5 +83 -83
  139. package/design-tokens/legacy-2017/tokens/components/tree.json5 +15 -15
  140. package/design-tokens/legacy-2017/tokens/properties/aliases.json5 +3 -3
  141. package/design-tokens/legacy-2017/tokens/properties/colors.json5 +119 -119
  142. package/design-tokens/legacy-2017/tokens/properties/font.json5 +12 -12
  143. package/design-tokens/legacy-2017/tokens/properties/globals.json5 +49 -49
  144. package/design-tokens/legacy-2017/tokens/properties/padding.json5 +3 -3
  145. package/design-tokens/legacy-2017/tokens/properties/palette.json5 +163 -163
  146. package/design-tokens/legacy-2017/tokens/properties/typography.json5 +175 -175
  147. package/design-tokens/legacy-2017/tokens.d.ts +7873 -7844
  148. package/design-tokens/pt-2022/tokens/components/alert.json5 +83 -83
  149. package/design-tokens/pt-2022/tokens/components/autocomplete.json5 +11 -11
  150. package/design-tokens/pt-2022/tokens/components/badge.json5 +174 -174
  151. package/design-tokens/pt-2022/tokens/components/button-toggle.json5 +10 -10
  152. package/design-tokens/pt-2022/tokens/components/button.json5 +142 -142
  153. package/design-tokens/pt-2022/tokens/components/card.json5 +51 -51
  154. package/design-tokens/pt-2022/tokens/components/checkbox.json5 +97 -97
  155. package/design-tokens/pt-2022/tokens/components/datepicker.json5 +64 -64
  156. package/design-tokens/pt-2022/tokens/components/divider.json5 +14 -14
  157. package/design-tokens/pt-2022/tokens/components/dl.json5 +38 -38
  158. package/design-tokens/pt-2022/tokens/components/dropdown.json5 +48 -48
  159. package/design-tokens/pt-2022/tokens/components/form-field.json5 +92 -92
  160. package/design-tokens/pt-2022/tokens/components/forms.json5 +52 -52
  161. package/design-tokens/pt-2022/tokens/components/icon.json5 +104 -104
  162. package/design-tokens/pt-2022/tokens/components/input.json5 +12 -12
  163. package/design-tokens/pt-2022/tokens/components/link.json5 +50 -50
  164. package/design-tokens/pt-2022/tokens/components/list.json5 +13 -13
  165. package/design-tokens/pt-2022/tokens/components/loader-overlay.json5 +23 -0
  166. package/design-tokens/pt-2022/tokens/components/modal.json5 +81 -81
  167. package/design-tokens/pt-2022/tokens/components/navbar.json5 +70 -70
  168. package/design-tokens/pt-2022/tokens/components/optgroup.json5 +10 -10
  169. package/design-tokens/pt-2022/tokens/components/option.json5 +12 -12
  170. package/design-tokens/pt-2022/tokens/components/popover.json5 +68 -68
  171. package/design-tokens/pt-2022/tokens/components/popup.json5 +16 -16
  172. package/design-tokens/pt-2022/tokens/components/progress-bar.json5 +13 -13
  173. package/design-tokens/pt-2022/tokens/components/progress-spinner.json5 +7 -7
  174. package/design-tokens/pt-2022/tokens/components/radio.json5 +45 -45
  175. package/design-tokens/pt-2022/tokens/components/select.json5 +24 -24
  176. package/design-tokens/pt-2022/tokens/components/sidepanel.json5 +44 -44
  177. package/design-tokens/pt-2022/tokens/components/table.json5 +15 -15
  178. package/design-tokens/pt-2022/tokens/components/tabs.json5 +101 -101
  179. package/design-tokens/pt-2022/tokens/components/tags.json5 +137 -137
  180. package/design-tokens/pt-2022/tokens/components/textarea.json5 +12 -12
  181. package/design-tokens/pt-2022/tokens/components/timepicker.json5 +7 -7
  182. package/design-tokens/pt-2022/tokens/components/toggle.json5 +79 -79
  183. package/design-tokens/pt-2022/tokens/components/tooltip.json5 +83 -83
  184. package/design-tokens/pt-2022/tokens/components/tree.json5 +15 -15
  185. package/design-tokens/pt-2022/tokens/properties/aliases.json5 +3 -3
  186. package/design-tokens/pt-2022/tokens/properties/colors.json5 +122 -122
  187. package/design-tokens/pt-2022/tokens/properties/font.json5 +15 -15
  188. package/design-tokens/pt-2022/tokens/properties/globals.json5 +49 -49
  189. package/design-tokens/pt-2022/tokens/properties/padding.json5 +3 -3
  190. package/design-tokens/pt-2022/tokens/properties/palette.json5 +232 -232
  191. package/design-tokens/pt-2022/tokens/properties/typography.json5 +175 -175
  192. package/design-tokens/pt-2022/tokens.d.ts +9205 -9176
  193. package/design-tokens/ptsecurity-mosaic-design-tokens.d.ts +5 -5
  194. package/design-tokens/public-api.d.ts +3 -3
  195. package/design-tokens/style-dictionary/build.js +76 -63
  196. package/design-tokens/style-dictionary/configs/css.js +13 -13
  197. package/design-tokens/style-dictionary/configs/figma.js +11 -0
  198. package/design-tokens/style-dictionary/configs/index.js +48 -48
  199. package/design-tokens/style-dictionary/configs/js.js +9 -9
  200. package/design-tokens/style-dictionary/configs/scss.js +23 -23
  201. package/design-tokens/style-dictionary/figma-types.js +41 -0
  202. package/design-tokens/style-dictionary/filters/color.js +7 -7
  203. package/design-tokens/style-dictionary/filters/palette.js +7 -7
  204. package/design-tokens/style-dictionary/filters/size.js +7 -7
  205. package/design-tokens/style-dictionary/filters/typography.js +7 -7
  206. package/design-tokens/style-dictionary/formats/figma.js +104 -0
  207. package/design-tokens/style-dictionary/formats/palette.js +25 -25
  208. package/design-tokens/style-dictionary/formats/typography.js +52 -52
  209. package/design-tokens/style-dictionary/transformGroups/css.js +13 -13
  210. package/design-tokens/style-dictionary/transformGroups/figma.js +21 -0
  211. package/design-tokens/style-dictionary/transformGroups/scss.js +12 -12
  212. package/design-tokens/style-dictionary/transformGroups/ts.js +11 -11
  213. package/design-tokens/style-dictionary/transforms/attribute/figma-border.js +18 -0
  214. package/design-tokens/style-dictionary/transforms/attribute/figma-color.js +25 -0
  215. package/design-tokens/style-dictionary/transforms/attribute/figma-default.js +10 -0
  216. package/design-tokens/style-dictionary/transforms/attribute/figma-font.js +31 -0
  217. package/design-tokens/style-dictionary/transforms/attribute/figma-group.js +17 -0
  218. package/design-tokens/style-dictionary/transforms/attribute/figma-opacity.js +10 -0
  219. package/design-tokens/style-dictionary/transforms/attribute/figma-shadow.js +66 -0
  220. package/design-tokens/style-dictionary/transforms/attribute/figma-sizing.js +16 -0
  221. package/design-tokens/style-dictionary/transforms/attribute/figma-spacing.js +15 -0
  222. package/design-tokens/style-dictionary/transforms/attribute/figma-typography.js +24 -0
  223. package/design-tokens/style-dictionary/transforms/attribute/palette.js +9 -9
  224. package/design-tokens/style-dictionary/transforms/attribute/prefix.js +11 -11
  225. package/design-tokens/style-dictionary/transforms/attribute/size.js +8 -8
  226. package/design-tokens/style-dictionary/transforms/attribute/typography.js +9 -9
  227. package/design-tokens/style-dictionary/transforms/value/figma-values.js +7 -0
  228. package/divider/divider.component.d.ts +11 -11
  229. package/divider/divider.module.d.ts +8 -8
  230. package/divider/index.d.ts +1 -1
  231. package/divider/ptsecurity-mosaic-divider.d.ts +5 -5
  232. package/divider/public-api.d.ts +2 -2
  233. package/dl/dl.component.d.ts +26 -26
  234. package/dl/dl.module.d.ts +10 -10
  235. package/dl/index.d.ts +1 -1
  236. package/dl/ptsecurity-mosaic-dl.d.ts +5 -5
  237. package/dl/public-api.d.ts +2 -2
  238. package/dropdown/dropdown-animations.d.ts +11 -11
  239. package/dropdown/dropdown-content.directive.d.ts +32 -32
  240. package/dropdown/dropdown-errors.d.ts +17 -17
  241. package/dropdown/dropdown-item.component.d.ts +50 -50
  242. package/dropdown/dropdown-trigger.directive.d.ts +136 -136
  243. package/dropdown/dropdown.component.d.ts +121 -121
  244. package/dropdown/dropdown.module.d.ts +13 -13
  245. package/dropdown/dropdown.types.d.ts +53 -53
  246. package/dropdown/index.d.ts +1 -1
  247. package/dropdown/ptsecurity-mosaic-dropdown.d.ts +5 -5
  248. package/dropdown/public-api.d.ts +8 -8
  249. package/esm2020/autocomplete/autocomplete-origin.directive.mjs +21 -21
  250. package/esm2020/autocomplete/autocomplete-trigger.directive.mjs +555 -555
  251. package/esm2020/autocomplete/autocomplete.component.mjs +154 -154
  252. package/esm2020/autocomplete/autocomplete.module.mjs +34 -34
  253. package/esm2020/autocomplete/index.mjs +2 -2
  254. package/esm2020/autocomplete/ptsecurity-mosaic-autocomplete.mjs +4 -4
  255. package/esm2020/autocomplete/public-api.mjs +5 -5
  256. package/esm2020/button/button.component.mjs +137 -137
  257. package/esm2020/button/button.module.mjs +38 -38
  258. package/esm2020/button/index.mjs +2 -2
  259. package/esm2020/button/ptsecurity-mosaic-button.mjs +4 -4
  260. package/esm2020/button/public-api.mjs +3 -3
  261. package/esm2020/button-toggle/button-toggle.component.mjs +362 -362
  262. package/esm2020/button-toggle/button-toggle.module.mjs +19 -19
  263. package/esm2020/button-toggle/index.mjs +2 -2
  264. package/esm2020/button-toggle/ptsecurity-mosaic-button-toggle.mjs +4 -4
  265. package/esm2020/button-toggle/public-api.mjs +3 -3
  266. package/esm2020/card/card.component.mjs +80 -80
  267. package/esm2020/card/card.module.mjs +30 -30
  268. package/esm2020/card/index.mjs +2 -2
  269. package/esm2020/card/ptsecurity-mosaic-card.mjs +4 -4
  270. package/esm2020/card/public-api.mjs +3 -3
  271. package/esm2020/checkbox/checkbox-config.mjs +6 -6
  272. package/esm2020/checkbox/checkbox-module.mjs +19 -19
  273. package/esm2020/checkbox/checkbox-required-validator.mjs +27 -27
  274. package/esm2020/checkbox/checkbox.mjs +316 -316
  275. package/esm2020/checkbox/index.mjs +2 -2
  276. package/esm2020/checkbox/ptsecurity-mosaic-checkbox.mjs +4 -4
  277. package/esm2020/checkbox/public-api.mjs +5 -5
  278. package/esm2020/core/animation/animation.mjs +8 -8
  279. package/esm2020/core/animation/fade-animations.mjs +9 -9
  280. package/esm2020/core/animation/index.mjs +4 -4
  281. package/esm2020/core/animation/select-animations.mjs +45 -45
  282. package/esm2020/core/common-behaviors/color.mjs +30 -30
  283. package/esm2020/core/common-behaviors/common-module.mjs +83 -83
  284. package/esm2020/core/common-behaviors/constructor.mjs +2 -2
  285. package/esm2020/core/common-behaviors/disabled.mjs +17 -17
  286. package/esm2020/core/common-behaviors/error-state.mjs +31 -31
  287. package/esm2020/core/common-behaviors/index.mjs +6 -6
  288. package/esm2020/core/common-behaviors/tabindex.mjs +18 -18
  289. package/esm2020/core/error/error-options.mjs +26 -26
  290. package/esm2020/core/formatters/date/formatter.mjs +359 -359
  291. package/esm2020/core/formatters/date/templates/en-US.mjs +281 -281
  292. package/esm2020/core/formatters/date/templates/ru-RU.mjs +281 -281
  293. package/esm2020/core/formatters/index.mjs +20 -20
  294. package/esm2020/core/formatters/number/formatter.mjs +105 -105
  295. package/esm2020/core/forms/forms-module.mjs +24 -24
  296. package/esm2020/core/forms/forms.directive.mjs +66 -66
  297. package/esm2020/core/forms/index.mjs +3 -3
  298. package/esm2020/core/highlight/highlight.pipe.mjs +17 -17
  299. package/esm2020/core/highlight/index.mjs +19 -19
  300. package/esm2020/core/index.mjs +2 -2
  301. package/esm2020/core/label/label-options.mjs +4 -4
  302. package/esm2020/core/line/line.mjs +70 -70
  303. package/esm2020/core/option/action.mjs +121 -121
  304. package/esm2020/core/option/index.mjs +5 -5
  305. package/esm2020/core/option/optgroup.mjs +31 -31
  306. package/esm2020/core/option/option-module.mjs +21 -21
  307. package/esm2020/core/option/option.mjs +257 -257
  308. package/esm2020/core/overlay/overlay-position-map.mjs +244 -244
  309. package/esm2020/core/pop-up/constants.mjs +34 -34
  310. package/esm2020/core/pop-up/index.mjs +4 -4
  311. package/esm2020/core/pop-up/pop-up-trigger.mjs +239 -239
  312. package/esm2020/core/pop-up/pop-up.mjs +94 -94
  313. package/esm2020/core/ptsecurity-mosaic-core.mjs +4 -4
  314. package/esm2020/core/public-api.mjs +18 -18
  315. package/esm2020/core/select/constants.mjs +27 -27
  316. package/esm2020/core/select/errors.mjs +26 -26
  317. package/esm2020/core/select/events.mjs +2 -2
  318. package/esm2020/core/select/index.mjs +4 -4
  319. package/esm2020/core/selection/constants.mjs +6 -6
  320. package/esm2020/core/selection/index.mjs +4 -4
  321. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +49 -49
  322. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +18 -18
  323. package/esm2020/core/services/measure-scrollbar.service.mjs +48 -48
  324. package/esm2020/core/utils/index.mjs +2 -2
  325. package/esm2020/core/utils/public-api.mjs +2 -2
  326. package/esm2020/core/utils/utils.mjs +5 -5
  327. package/esm2020/core/validation/index.mjs +2 -2
  328. package/esm2020/core/validation/validation.mjs +118 -118
  329. package/esm2020/core/version.mjs +3 -3
  330. package/esm2020/datepicker/calendar-body.component.mjs +106 -106
  331. package/esm2020/datepicker/calendar.component.mjs +362 -362
  332. package/esm2020/datepicker/datepicker-animations.mjs +32 -32
  333. package/esm2020/datepicker/datepicker-errors.mjs +6 -6
  334. package/esm2020/datepicker/datepicker-input.directive.mjs +938 -938
  335. package/esm2020/datepicker/datepicker-intl.mjs +40 -40
  336. package/esm2020/datepicker/datepicker-module.mjs +107 -107
  337. package/esm2020/datepicker/datepicker-toggle.component.mjs +86 -86
  338. package/esm2020/datepicker/datepicker.component.mjs +404 -404
  339. package/esm2020/datepicker/index.mjs +2 -2
  340. package/esm2020/datepicker/month-view.component.mjs +257 -257
  341. package/esm2020/datepicker/multi-year-view.component.mjs +218 -218
  342. package/esm2020/datepicker/ptsecurity-mosaic-datepicker.mjs +4 -4
  343. package/esm2020/datepicker/public-api.mjs +12 -12
  344. package/esm2020/datepicker/year-view.component.mjs +253 -253
  345. package/esm2020/design-tokens/index.mjs +2 -2
  346. package/esm2020/design-tokens/legacy-2017/tokens.mjs +1167 -1138
  347. package/esm2020/design-tokens/pt-2022/tokens.mjs +1237 -1208
  348. package/esm2020/design-tokens/ptsecurity-mosaic-design-tokens.mjs +4 -4
  349. package/esm2020/design-tokens/public-api.mjs +4 -4
  350. package/esm2020/divider/divider.component.mjs +39 -39
  351. package/esm2020/divider/divider.module.mjs +18 -18
  352. package/esm2020/divider/index.mjs +2 -2
  353. package/esm2020/divider/ptsecurity-mosaic-divider.mjs +4 -4
  354. package/esm2020/divider/public-api.mjs +3 -3
  355. package/esm2020/dl/dl.component.mjs +78 -78
  356. package/esm2020/dl/dl.module.mjs +42 -42
  357. package/esm2020/dl/index.mjs +2 -2
  358. package/esm2020/dl/ptsecurity-mosaic-dl.mjs +4 -4
  359. package/esm2020/dl/public-api.mjs +3 -3
  360. package/esm2020/dropdown/dropdown-animations.mjs +41 -41
  361. package/esm2020/dropdown/dropdown-content.directive.mjs +64 -64
  362. package/esm2020/dropdown/dropdown-errors.mjs +29 -29
  363. package/esm2020/dropdown/dropdown-item.component.mjs +139 -139
  364. package/esm2020/dropdown/dropdown-trigger.directive.mjs +489 -489
  365. package/esm2020/dropdown/dropdown.component.mjs +292 -292
  366. package/esm2020/dropdown/dropdown.module.mjs +50 -50
  367. package/esm2020/dropdown/dropdown.types.mjs +24 -24
  368. package/esm2020/dropdown/index.mjs +2 -2
  369. package/esm2020/dropdown/ptsecurity-mosaic-dropdown.mjs +4 -4
  370. package/esm2020/dropdown/public-api.mjs +9 -9
  371. package/esm2020/form-field/cleaner.mjs +23 -23
  372. package/esm2020/form-field/form-field-control.mjs +5 -5
  373. package/esm2020/form-field/form-field-errors.mjs +7 -7
  374. package/esm2020/form-field/form-field.mjs +225 -225
  375. package/esm2020/form-field/form-field.module.mjs +57 -57
  376. package/esm2020/form-field/hint.mjs +34 -23
  377. package/esm2020/form-field/index.mjs +2 -2
  378. package/esm2020/form-field/password-hint.mjs +139 -139
  379. package/esm2020/form-field/prefix.mjs +13 -13
  380. package/esm2020/form-field/ptsecurity-mosaic-form-field.mjs +4 -4
  381. package/esm2020/form-field/public-api.mjs +11 -11
  382. package/esm2020/form-field/stepper.mjs +55 -55
  383. package/esm2020/form-field/suffix.mjs +13 -13
  384. package/esm2020/icon/icon.component.mjs +44 -44
  385. package/esm2020/icon/icon.module.mjs +38 -38
  386. package/esm2020/icon/index.mjs +2 -2
  387. package/esm2020/icon/ptsecurity-mosaic-icon.mjs +4 -4
  388. package/esm2020/icon/public-api.mjs +3 -3
  389. package/esm2020/index.mjs +2 -2
  390. package/esm2020/input/index.mjs +2 -2
  391. package/esm2020/input/input-errors.mjs +4 -4
  392. package/esm2020/input/input-number-validators.mjs +92 -92
  393. package/esm2020/input/input-number.mjs +163 -163
  394. package/esm2020/input/input-password.mjs +372 -372
  395. package/esm2020/input/input-value-accessor.mjs +3 -3
  396. package/esm2020/input/input.mjs +334 -334
  397. package/esm2020/input/input.module.mjs +65 -65
  398. package/esm2020/input/ptsecurity-mosaic-input.mjs +4 -4
  399. package/esm2020/input/public-api.mjs +7 -7
  400. package/esm2020/link/index.mjs +2 -2
  401. package/esm2020/link/link.component.mjs +107 -107
  402. package/esm2020/link/link.module.mjs +26 -26
  403. package/esm2020/link/ptsecurity-mosaic-link.mjs +4 -4
  404. package/esm2020/link/public-api.mjs +3 -3
  405. package/esm2020/list/index.mjs +2 -2
  406. package/esm2020/list/list-selection.component.mjs +689 -686
  407. package/esm2020/list/list.component.mjs +44 -44
  408. package/esm2020/list/list.module.mjs +55 -55
  409. package/esm2020/list/ptsecurity-mosaic-list.mjs +4 -4
  410. package/esm2020/list/public-api.mjs +4 -4
  411. package/esm2020/loader-overlay/index.mjs +2 -0
  412. package/esm2020/loader-overlay/loader-overlay.component.mjs +99 -0
  413. package/esm2020/loader-overlay/loader-overlay.module.mjs +50 -0
  414. package/esm2020/loader-overlay/ptsecurity-mosaic-loader-overlay.mjs +5 -0
  415. package/esm2020/loader-overlay/public-api.mjs +3 -0
  416. package/esm2020/modal/css-unit.pipe.mjs +17 -17
  417. package/esm2020/modal/index.mjs +2 -2
  418. package/esm2020/modal/modal-control.service.mjs +85 -85
  419. package/esm2020/modal/modal-ref.class.mjs +8 -8
  420. package/esm2020/modal/modal-util.mjs +17 -17
  421. package/esm2020/modal/modal.component.mjs +509 -501
  422. package/esm2020/modal/modal.directive.mjs +52 -52
  423. package/esm2020/modal/modal.module.mjs +72 -72
  424. package/esm2020/modal/modal.service.mjs +124 -124
  425. package/esm2020/modal/modal.type.mjs +7 -7
  426. package/esm2020/modal/ptsecurity-mosaic-modal.mjs +4 -4
  427. package/esm2020/modal/public-api.mjs +7 -7
  428. package/esm2020/navbar/index.mjs +2 -2
  429. package/esm2020/navbar/navbar-item.component.mjs +582 -582
  430. package/esm2020/navbar/navbar.component.mjs +239 -237
  431. package/esm2020/navbar/navbar.module.mjs +92 -92
  432. package/esm2020/navbar/ptsecurity-mosaic-navbar.mjs +4 -4
  433. package/esm2020/navbar/public-api.mjs +5 -5
  434. package/esm2020/navbar/vertical-navbar.animation.mjs +10 -10
  435. package/esm2020/navbar/vertical-navbar.component.mjs +114 -114
  436. package/esm2020/popover/index.mjs +2 -2
  437. package/esm2020/popover/popover-animations.mjs +16 -16
  438. package/esm2020/popover/popover-confirm.component.mjs +108 -108
  439. package/esm2020/popover/popover.component.mjs +253 -253
  440. package/esm2020/popover/popover.module.mjs +24 -24
  441. package/esm2020/popover/ptsecurity-mosaic-popover.mjs +4 -4
  442. package/esm2020/popover/public-api.mjs +5 -5
  443. package/esm2020/progress-bar/index.mjs +2 -2
  444. package/esm2020/progress-bar/progress-bar.component.mjs +42 -42
  445. package/esm2020/progress-bar/progress-bar.module.mjs +30 -30
  446. package/esm2020/progress-bar/ptsecurity-mosaic-progress-bar.mjs +4 -4
  447. package/esm2020/progress-bar/public-api.mjs +3 -3
  448. package/esm2020/progress-spinner/index.mjs +2 -2
  449. package/esm2020/progress-spinner/progress-spinner.component.mjs +46 -46
  450. package/esm2020/progress-spinner/progress-spinner.module.mjs +30 -30
  451. package/esm2020/progress-spinner/ptsecurity-mosaic-progress-spinner.mjs +4 -4
  452. package/esm2020/progress-spinner/public-api.mjs +3 -3
  453. package/esm2020/ptsecurity-mosaic.mjs +4 -4
  454. package/esm2020/public-api.mjs +2 -2
  455. package/esm2020/radio/index.mjs +2 -2
  456. package/esm2020/radio/ptsecurity-mosaic-radio.mjs +4 -4
  457. package/esm2020/radio/public-api.mjs +3 -3
  458. package/esm2020/radio/radio.component.mjs +458 -458
  459. package/esm2020/radio/radio.module.mjs +20 -20
  460. package/esm2020/select/index.mjs +2 -2
  461. package/esm2020/select/ptsecurity-mosaic-select.mjs +4 -4
  462. package/esm2020/select/public-api.mjs +4 -4
  463. package/esm2020/select/select-option.directive.mjs +65 -65
  464. package/esm2020/select/select.component.mjs +1117 -1117
  465. package/esm2020/select/select.module.mjs +73 -73
  466. package/esm2020/sidebar/index.mjs +2 -2
  467. package/esm2020/sidebar/ptsecurity-mosaic-sidebar.mjs +4 -4
  468. package/esm2020/sidebar/public-api.mjs +3 -3
  469. package/esm2020/sidebar/sidebar-animations.mjs +23 -23
  470. package/esm2020/sidebar/sidebar.component.mjs +146 -146
  471. package/esm2020/sidebar/sidebar.module.mjs +30 -30
  472. package/esm2020/sidepanel/index.mjs +2 -2
  473. package/esm2020/sidepanel/ptsecurity-mosaic-sidepanel.mjs +4 -4
  474. package/esm2020/sidepanel/public-api.mjs +7 -7
  475. package/esm2020/sidepanel/sidepanel-animations.mjs +26 -26
  476. package/esm2020/sidepanel/sidepanel-config.mjs +26 -26
  477. package/esm2020/sidepanel/sidepanel-container.component.mjs +106 -106
  478. package/esm2020/sidepanel/sidepanel-directives.mjs +159 -159
  479. package/esm2020/sidepanel/sidepanel-ref.mjs +53 -53
  480. package/esm2020/sidepanel/sidepanel.module.mjs +74 -74
  481. package/esm2020/sidepanel/sidepanel.service.mjs +167 -167
  482. package/esm2020/splitter/index.mjs +2 -2
  483. package/esm2020/splitter/ptsecurity-mosaic-splitter.mjs +4 -4
  484. package/esm2020/splitter/public-api.mjs +3 -3
  485. package/esm2020/splitter/splitter.component.mjs +482 -482
  486. package/esm2020/splitter/splitter.module.mjs +40 -40
  487. package/esm2020/table/index.mjs +2 -2
  488. package/esm2020/table/ptsecurity-mosaic-table.mjs +4 -4
  489. package/esm2020/table/public-api.mjs +3 -3
  490. package/esm2020/table/table.component.mjs +16 -16
  491. package/esm2020/table/table.module.mjs +30 -30
  492. package/esm2020/tabs/index.mjs +2 -2
  493. package/esm2020/tabs/paginated-tab-header.mjs +479 -479
  494. package/esm2020/tabs/ptsecurity-mosaic-tabs.mjs +4 -4
  495. package/esm2020/tabs/public-api.mjs +11 -11
  496. package/esm2020/tabs/tab-body.component.mjs +178 -178
  497. package/esm2020/tabs/tab-content.directive.mjs +15 -15
  498. package/esm2020/tabs/tab-group.component.mjs +350 -350
  499. package/esm2020/tabs/tab-header.component.mjs +67 -67
  500. package/esm2020/tabs/tab-label-wrapper.directive.mjs +78 -78
  501. package/esm2020/tabs/tab-label.directive.mjs +17 -17
  502. package/esm2020/tabs/tab-nav-bar/index.mjs +2 -2
  503. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +110 -110
  504. package/esm2020/tabs/tab.component.mjs +133 -133
  505. package/esm2020/tabs/tabs-animations.mjs +24 -24
  506. package/esm2020/tabs/tabs.module.mjs +104 -104
  507. package/esm2020/tags/index.mjs +2 -2
  508. package/esm2020/tags/ptsecurity-mosaic-tags.mjs +4 -4
  509. package/esm2020/tags/public-api.mjs +6 -6
  510. package/esm2020/tags/tag-default-options.mjs +4 -4
  511. package/esm2020/tags/tag-input.mjs +229 -229
  512. package/esm2020/tags/tag-list.component.mjs +722 -722
  513. package/esm2020/tags/tag-text-control.mjs +2 -2
  514. package/esm2020/tags/tag.component.mjs +375 -375
  515. package/esm2020/tags/tag.module.mjs +56 -56
  516. package/esm2020/textarea/index.mjs +2 -2
  517. package/esm2020/textarea/ptsecurity-mosaic-textarea.mjs +4 -4
  518. package/esm2020/textarea/public-api.mjs +3 -3
  519. package/esm2020/textarea/textarea.component.mjs +269 -269
  520. package/esm2020/textarea/textarea.module.mjs +21 -21
  521. package/esm2020/timepicker/index.mjs +2 -2
  522. package/esm2020/timepicker/ptsecurity-mosaic-timepicker.mjs +4 -4
  523. package/esm2020/timepicker/public-api.mjs +4 -4
  524. package/esm2020/timepicker/timepicker.constants.mjs +25 -25
  525. package/esm2020/timepicker/timepicker.directive.mjs +665 -665
  526. package/esm2020/timepicker/timepicker.module.mjs +34 -34
  527. package/esm2020/toggle/index.mjs +2 -2
  528. package/esm2020/toggle/ptsecurity-mosaic-toggle.mjs +4 -4
  529. package/esm2020/toggle/public-api.mjs +3 -3
  530. package/esm2020/toggle/toggle.component.mjs +158 -158
  531. package/esm2020/toggle/toggle.module.mjs +20 -20
  532. package/esm2020/tooltip/index.mjs +2 -2
  533. package/esm2020/tooltip/ptsecurity-mosaic-tooltip.mjs +4 -4
  534. package/esm2020/tooltip/public-api.mjs +3 -3
  535. package/esm2020/tooltip/tooltip.animations.mjs +19 -19
  536. package/esm2020/tooltip/tooltip.component.mjs +295 -295
  537. package/esm2020/tooltip/tooltip.module.mjs +43 -43
  538. package/esm2020/tree/control/base-tree-control.mjs +60 -60
  539. package/esm2020/tree/control/flat-tree-control.mjs +126 -126
  540. package/esm2020/tree/control/nested-tree-control.mjs +41 -41
  541. package/esm2020/tree/control/tree-control.mjs +2 -2
  542. package/esm2020/tree/data-source/flat-data-source.mjs +162 -162
  543. package/esm2020/tree/data-source/nested-data-source.mjs +30 -30
  544. package/esm2020/tree/index.mjs +2 -2
  545. package/esm2020/tree/node.mjs +31 -31
  546. package/esm2020/tree/outlet.mjs +15 -15
  547. package/esm2020/tree/padding.directive.mjs +113 -113
  548. package/esm2020/tree/ptsecurity-mosaic-tree.mjs +4 -4
  549. package/esm2020/tree/public-api.mjs +16 -16
  550. package/esm2020/tree/toggle.mjs +80 -80
  551. package/esm2020/tree/tree-base.mjs +243 -243
  552. package/esm2020/tree/tree-errors.mjs +36 -36
  553. package/esm2020/tree/tree-option.component.mjs +248 -248
  554. package/esm2020/tree/tree-selection.component.mjs +541 -540
  555. package/esm2020/tree/tree.mjs +15 -15
  556. package/esm2020/tree/tree.module.mjs +57 -57
  557. package/esm2020/tree-select/index.mjs +2 -2
  558. package/esm2020/tree-select/ptsecurity-mosaic-tree-select.mjs +4 -4
  559. package/esm2020/tree-select/public-api.mjs +3 -3
  560. package/esm2020/tree-select/tree-select.component.mjs +939 -939
  561. package/esm2020/tree-select/tree-select.module.mjs +47 -47
  562. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs +726 -726
  563. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
  564. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs +367 -367
  565. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  566. package/fesm2015/ptsecurity-mosaic-button.mjs +160 -160
  567. package/fesm2015/ptsecurity-mosaic-button.mjs.map +1 -1
  568. package/fesm2015/ptsecurity-mosaic-card.mjs +96 -96
  569. package/fesm2015/ptsecurity-mosaic-card.mjs.map +1 -1
  570. package/fesm2015/ptsecurity-mosaic-checkbox.mjs +348 -348
  571. package/fesm2015/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  572. package/fesm2015/ptsecurity-mosaic-core.mjs +2652 -2652
  573. package/fesm2015/ptsecurity-mosaic-core.mjs.map +1 -1
  574. package/fesm2015/ptsecurity-mosaic-datepicker.mjs +2682 -2682
  575. package/fesm2015/ptsecurity-mosaic-datepicker.mjs.map +1 -1
  576. package/fesm2015/ptsecurity-mosaic-design-tokens.mjs +2432 -2345
  577. package/fesm2015/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
  578. package/fesm2015/ptsecurity-mosaic-divider.mjs +48 -48
  579. package/fesm2015/ptsecurity-mosaic-divider.mjs.map +1 -1
  580. package/fesm2015/ptsecurity-mosaic-dl.mjs +108 -108
  581. package/fesm2015/ptsecurity-mosaic-dl.mjs.map +1 -1
  582. package/fesm2015/ptsecurity-mosaic-dropdown.mjs +1069 -1069
  583. package/fesm2015/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  584. package/fesm2015/ptsecurity-mosaic-form-field.mjs +522 -512
  585. package/fesm2015/ptsecurity-mosaic-form-field.mjs.map +1 -1
  586. package/fesm2015/ptsecurity-mosaic-icon.mjs +73 -73
  587. package/fesm2015/ptsecurity-mosaic-icon.mjs.map +1 -1
  588. package/fesm2015/ptsecurity-mosaic-input.mjs +979 -979
  589. package/fesm2015/ptsecurity-mosaic-input.mjs.map +1 -1
  590. package/fesm2015/ptsecurity-mosaic-link.mjs +121 -121
  591. package/fesm2015/ptsecurity-mosaic-link.mjs.map +1 -1
  592. package/fesm2015/ptsecurity-mosaic-list.mjs +765 -762
  593. package/fesm2015/ptsecurity-mosaic-list.mjs.map +1 -1
  594. package/fesm2015/ptsecurity-mosaic-loader-overlay.mjs +155 -0
  595. package/fesm2015/ptsecurity-mosaic-loader-overlay.mjs.map +1 -0
  596. package/fesm2015/ptsecurity-mosaic-modal.mjs +833 -824
  597. package/fesm2015/ptsecurity-mosaic-modal.mjs.map +1 -1
  598. package/fesm2015/ptsecurity-mosaic-navbar.mjs +996 -994
  599. package/fesm2015/ptsecurity-mosaic-navbar.mjs.map +1 -1
  600. package/fesm2015/ptsecurity-mosaic-popover.mjs +364 -364
  601. package/fesm2015/ptsecurity-mosaic-popover.mjs.map +1 -1
  602. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs +61 -61
  603. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  604. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs +65 -65
  605. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  606. package/fesm2015/ptsecurity-mosaic-radio.mjs +464 -464
  607. package/fesm2015/ptsecurity-mosaic-radio.mjs.map +1 -1
  608. package/fesm2015/ptsecurity-mosaic-select.mjs +1213 -1213
  609. package/fesm2015/ptsecurity-mosaic-select.mjs.map +1 -1
  610. package/fesm2015/ptsecurity-mosaic-sidebar.mjs +185 -185
  611. package/fesm2015/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  612. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs +555 -555
  613. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  614. package/fesm2015/ptsecurity-mosaic-splitter.mjs +511 -511
  615. package/fesm2015/ptsecurity-mosaic-splitter.mjs.map +1 -1
  616. package/fesm2015/ptsecurity-mosaic-table.mjs +36 -36
  617. package/fesm2015/ptsecurity-mosaic-table.mjs.map +1 -1
  618. package/fesm2015/ptsecurity-mosaic-tabs.mjs +1460 -1460
  619. package/fesm2015/ptsecurity-mosaic-tabs.mjs.map +1 -1
  620. package/fesm2015/ptsecurity-mosaic-tags.mjs +1342 -1342
  621. package/fesm2015/ptsecurity-mosaic-tags.mjs.map +1 -1
  622. package/fesm2015/ptsecurity-mosaic-textarea.mjs +274 -274
  623. package/fesm2015/ptsecurity-mosaic-textarea.mjs.map +1 -1
  624. package/fesm2015/ptsecurity-mosaic-timepicker.mjs +703 -703
  625. package/fesm2015/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  626. package/fesm2015/ptsecurity-mosaic-toggle.mjs +163 -163
  627. package/fesm2015/ptsecurity-mosaic-toggle.mjs.map +1 -1
  628. package/fesm2015/ptsecurity-mosaic-tooltip.mjs +344 -344
  629. package/fesm2015/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  630. package/fesm2015/ptsecurity-mosaic-tree-select.mjs +954 -954
  631. package/fesm2015/ptsecurity-mosaic-tree-select.mjs.map +1 -1
  632. package/fesm2015/ptsecurity-mosaic-tree.mjs +1689 -1688
  633. package/fesm2015/ptsecurity-mosaic-tree.mjs.map +1 -1
  634. package/fesm2015/ptsecurity-mosaic.mjs +2 -2
  635. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs +722 -722
  636. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
  637. package/fesm2020/ptsecurity-mosaic-button-toggle.mjs +365 -365
  638. package/fesm2020/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  639. package/fesm2020/ptsecurity-mosaic-button.mjs +160 -160
  640. package/fesm2020/ptsecurity-mosaic-button.mjs.map +1 -1
  641. package/fesm2020/ptsecurity-mosaic-card.mjs +96 -96
  642. package/fesm2020/ptsecurity-mosaic-card.mjs.map +1 -1
  643. package/fesm2020/ptsecurity-mosaic-checkbox.mjs +346 -346
  644. package/fesm2020/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  645. package/fesm2020/ptsecurity-mosaic-core.mjs +2681 -2681
  646. package/fesm2020/ptsecurity-mosaic-core.mjs.map +1 -1
  647. package/fesm2020/ptsecurity-mosaic-datepicker.mjs +2667 -2667
  648. package/fesm2020/ptsecurity-mosaic-datepicker.mjs.map +1 -1
  649. package/fesm2020/ptsecurity-mosaic-design-tokens.mjs +2432 -2345
  650. package/fesm2020/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
  651. package/fesm2020/ptsecurity-mosaic-divider.mjs +48 -48
  652. package/fesm2020/ptsecurity-mosaic-divider.mjs.map +1 -1
  653. package/fesm2020/ptsecurity-mosaic-dl.mjs +108 -108
  654. package/fesm2020/ptsecurity-mosaic-dl.mjs.map +1 -1
  655. package/fesm2020/ptsecurity-mosaic-dropdown.mjs +1056 -1056
  656. package/fesm2020/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  657. package/fesm2020/ptsecurity-mosaic-form-field.mjs +507 -497
  658. package/fesm2020/ptsecurity-mosaic-form-field.mjs.map +1 -1
  659. package/fesm2020/ptsecurity-mosaic-icon.mjs +71 -71
  660. package/fesm2020/ptsecurity-mosaic-icon.mjs.map +1 -1
  661. package/fesm2020/ptsecurity-mosaic-input.mjs +968 -968
  662. package/fesm2020/ptsecurity-mosaic-input.mjs.map +1 -1
  663. package/fesm2020/ptsecurity-mosaic-link.mjs +120 -120
  664. package/fesm2020/ptsecurity-mosaic-link.mjs.map +1 -1
  665. package/fesm2020/ptsecurity-mosaic-list.mjs +758 -755
  666. package/fesm2020/ptsecurity-mosaic-list.mjs.map +1 -1
  667. package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs +153 -0
  668. package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs.map +1 -0
  669. package/fesm2020/ptsecurity-mosaic-modal.mjs +828 -820
  670. package/fesm2020/ptsecurity-mosaic-modal.mjs.map +1 -1
  671. package/fesm2020/ptsecurity-mosaic-navbar.mjs +980 -978
  672. package/fesm2020/ptsecurity-mosaic-navbar.mjs.map +1 -1
  673. package/fesm2020/ptsecurity-mosaic-popover.mjs +360 -360
  674. package/fesm2020/ptsecurity-mosaic-popover.mjs.map +1 -1
  675. package/fesm2020/ptsecurity-mosaic-progress-bar.mjs +61 -61
  676. package/fesm2020/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  677. package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs +65 -65
  678. package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  679. package/fesm2020/ptsecurity-mosaic-radio.mjs +462 -462
  680. package/fesm2020/ptsecurity-mosaic-radio.mjs.map +1 -1
  681. package/fesm2020/ptsecurity-mosaic-select.mjs +1208 -1208
  682. package/fesm2020/ptsecurity-mosaic-select.mjs.map +1 -1
  683. package/fesm2020/ptsecurity-mosaic-sidebar.mjs +185 -185
  684. package/fesm2020/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  685. package/fesm2020/ptsecurity-mosaic-sidepanel.mjs +552 -552
  686. package/fesm2020/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  687. package/fesm2020/ptsecurity-mosaic-splitter.mjs +511 -511
  688. package/fesm2020/ptsecurity-mosaic-splitter.mjs.map +1 -1
  689. package/fesm2020/ptsecurity-mosaic-table.mjs +36 -36
  690. package/fesm2020/ptsecurity-mosaic-table.mjs.map +1 -1
  691. package/fesm2020/ptsecurity-mosaic-tabs.mjs +1445 -1445
  692. package/fesm2020/ptsecurity-mosaic-tabs.mjs.map +1 -1
  693. package/fesm2020/ptsecurity-mosaic-tags.mjs +1335 -1335
  694. package/fesm2020/ptsecurity-mosaic-tags.mjs.map +1 -1
  695. package/fesm2020/ptsecurity-mosaic-textarea.mjs +272 -272
  696. package/fesm2020/ptsecurity-mosaic-textarea.mjs.map +1 -1
  697. package/fesm2020/ptsecurity-mosaic-timepicker.mjs +700 -700
  698. package/fesm2020/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  699. package/fesm2020/ptsecurity-mosaic-toggle.mjs +163 -163
  700. package/fesm2020/ptsecurity-mosaic-toggle.mjs.map +1 -1
  701. package/fesm2020/ptsecurity-mosaic-tooltip.mjs +336 -336
  702. package/fesm2020/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  703. package/fesm2020/ptsecurity-mosaic-tree-select.mjs +951 -951
  704. package/fesm2020/ptsecurity-mosaic-tree-select.mjs.map +1 -1
  705. package/fesm2020/ptsecurity-mosaic-tree.mjs +1676 -1675
  706. package/fesm2020/ptsecurity-mosaic-tree.mjs.map +1 -1
  707. package/fesm2020/ptsecurity-mosaic.mjs +2 -2
  708. package/form-field/cleaner.d.ts +7 -7
  709. package/form-field/form-field-control.d.ts +37 -37
  710. package/form-field/form-field-errors.d.ts +2 -2
  711. package/form-field/form-field.d.ts +69 -69
  712. package/form-field/form-field.module.d.ts +15 -15
  713. package/form-field/hint.d.ts +14 -6
  714. package/form-field/index.d.ts +1 -1
  715. package/form-field/password-hint.d.ts +40 -40
  716. package/form-field/prefix.d.ts +5 -5
  717. package/form-field/ptsecurity-mosaic-form-field.d.ts +5 -5
  718. package/form-field/public-api.d.ts +10 -10
  719. package/form-field/stepper.d.ts +11 -11
  720. package/form-field/suffix.d.ts +5 -5
  721. package/icon/icon.component.d.ts +18 -18
  722. package/icon/icon.module.d.ts +10 -10
  723. package/icon/index.d.ts +1 -1
  724. package/icon/ptsecurity-mosaic-icon.d.ts +5 -5
  725. package/icon/public-api.d.ts +2 -2
  726. package/index.d.ts +1 -1
  727. package/input/index.d.ts +1 -1
  728. package/input/input-errors.d.ts +1 -1
  729. package/input/input-number-validators.d.ts +39 -39
  730. package/input/input-number.d.ts +33 -33
  731. package/input/input-password.d.ts +123 -123
  732. package/input/input-value-accessor.d.ts +4 -4
  733. package/input/input.d.ts +116 -116
  734. package/input/input.module.d.ts +14 -14
  735. package/input/ptsecurity-mosaic-input.d.ts +5 -5
  736. package/input/public-api.d.ts +6 -6
  737. package/link/index.d.ts +1 -1
  738. package/link/link.component.d.ts +38 -38
  739. package/link/link.module.d.ts +9 -9
  740. package/link/ptsecurity-mosaic-link.d.ts +5 -5
  741. package/link/public-api.d.ts +2 -2
  742. package/list/index.d.ts +1 -1
  743. package/list/list-selection.component.d.ts +168 -168
  744. package/list/list.component.d.ts +18 -18
  745. package/list/list.module.d.ts +11 -11
  746. package/list/ptsecurity-mosaic-list.d.ts +5 -5
  747. package/list/public-api.d.ts +3 -3
  748. package/{toggle → loader-overlay}/README.md +0 -0
  749. package/loader-overlay/index.d.ts +1 -0
  750. package/loader-overlay/loader-overlay.component.d.ts +33 -0
  751. package/loader-overlay/loader-overlay.module.d.ts +11 -0
  752. package/loader-overlay/package.json +10 -0
  753. package/loader-overlay/ptsecurity-mosaic-loader-overlay.d.ts +5 -0
  754. package/loader-overlay/public-api.d.ts +2 -0
  755. package/modal/README.md +33 -33
  756. package/modal/css-unit.pipe.d.ts +7 -7
  757. package/modal/index.d.ts +1 -1
  758. package/modal/modal-control.service.d.ts +20 -20
  759. package/modal/modal-ref.class.d.ts +36 -36
  760. package/modal/modal-util.d.ts +12 -12
  761. package/modal/modal.component.d.ts +128 -126
  762. package/modal/modal.directive.d.ts +17 -17
  763. package/modal/modal.module.d.ts +14 -14
  764. package/modal/modal.service.d.ts +33 -33
  765. package/modal/modal.type.d.ts +60 -59
  766. package/modal/ptsecurity-mosaic-modal.d.ts +5 -5
  767. package/modal/public-api.d.ts +6 -6
  768. package/navbar/README.md +41 -41
  769. package/navbar/index.d.ts +1 -1
  770. package/navbar/navbar-item.component.d.ts +161 -161
  771. package/navbar/navbar.component.d.ts +58 -58
  772. package/navbar/navbar.module.d.ts +14 -14
  773. package/navbar/ptsecurity-mosaic-navbar.d.ts +5 -5
  774. package/navbar/public-api.d.ts +4 -4
  775. package/navbar/vertical-navbar.animation.d.ts +2 -2
  776. package/navbar/vertical-navbar.component.d.ts +23 -23
  777. package/package.json +12 -4
  778. package/popover/README.md +32 -32
  779. package/popover/index.d.ts +1 -1
  780. package/popover/popover-animations.d.ts +4 -4
  781. package/popover/popover-confirm.component.d.ts +33 -33
  782. package/popover/popover.component.d.ts +74 -74
  783. package/popover/popover.module.d.ts +12 -12
  784. package/popover/ptsecurity-mosaic-popover.d.ts +5 -5
  785. package/popover/public-api.d.ts +4 -4
  786. package/prebuilt-themes/dark-theme.css +1 -1
  787. package/prebuilt-themes/default-theme.css +1 -1
  788. package/progress-bar/index.d.ts +1 -1
  789. package/progress-bar/progress-bar.component.d.ts +18 -18
  790. package/progress-bar/progress-bar.module.d.ts +9 -9
  791. package/progress-bar/ptsecurity-mosaic-progress-bar.d.ts +5 -5
  792. package/progress-bar/public-api.d.ts +2 -2
  793. package/progress-spinner/index.d.ts +1 -1
  794. package/progress-spinner/progress-spinner.component.d.ts +19 -19
  795. package/progress-spinner/progress-spinner.module.d.ts +9 -9
  796. package/progress-spinner/ptsecurity-mosaic-progress-spinner.d.ts +5 -5
  797. package/progress-spinner/public-api.d.ts +2 -2
  798. package/ptsecurity-mosaic.d.ts +5 -5
  799. package/public-api.d.ts +1 -1
  800. package/radio/index.d.ts +1 -1
  801. package/radio/ptsecurity-mosaic-radio.d.ts +5 -5
  802. package/radio/public-api.d.ts +2 -2
  803. package/radio/radio.component.d.ts +207 -207
  804. package/radio/radio.module.d.ts +10 -10
  805. package/schematics/README.md +35 -35
  806. package/select/index.d.ts +1 -1
  807. package/select/ptsecurity-mosaic-select.d.ts +5 -5
  808. package/select/public-api.d.ts +3 -3
  809. package/select/select-option.directive.d.ts +20 -20
  810. package/select/select.component.d.ts +310 -310
  811. package/select/select.module.d.ts +15 -15
  812. package/sidebar/index.d.ts +1 -1
  813. package/sidebar/ptsecurity-mosaic-sidebar.d.ts +5 -5
  814. package/sidebar/public-api.d.ts +2 -2
  815. package/sidebar/sidebar-animations.d.ts +8 -8
  816. package/sidebar/sidebar.component.d.ts +53 -53
  817. package/sidebar/sidebar.module.d.ts +8 -8
  818. package/sidepanel/index.d.ts +1 -1
  819. package/sidepanel/ptsecurity-mosaic-sidepanel.d.ts +5 -5
  820. package/sidepanel/public-api.d.ts +6 -6
  821. package/sidepanel/sidepanel-animations.d.ts +14 -14
  822. package/sidepanel/sidepanel-config.d.ts +25 -25
  823. package/sidepanel/sidepanel-container.component.d.ts +45 -45
  824. package/sidepanel/sidepanel-directives.d.ts +50 -50
  825. package/sidepanel/sidepanel-ref.d.ts +24 -24
  826. package/sidepanel/sidepanel.module.d.ts +15 -15
  827. package/sidepanel/sidepanel.service.d.ts +57 -57
  828. package/splitter/index.d.ts +1 -1
  829. package/splitter/ptsecurity-mosaic-splitter.d.ts +5 -5
  830. package/splitter/public-api.d.ts +2 -2
  831. package/splitter/splitter.component.d.ts +130 -130
  832. package/splitter/splitter.module.d.ts +9 -9
  833. package/table/index.d.ts +1 -1
  834. package/table/ptsecurity-mosaic-table.d.ts +5 -5
  835. package/table/public-api.d.ts +2 -2
  836. package/table/table.component.d.ts +5 -5
  837. package/table/table.module.d.ts +10 -10
  838. package/tabs/index.d.ts +1 -1
  839. package/tabs/paginated-tab-header.d.ts +179 -179
  840. package/tabs/ptsecurity-mosaic-tabs.d.ts +5 -5
  841. package/tabs/public-api.d.ts +10 -10
  842. package/tabs/tab-body.component.d.ts +95 -95
  843. package/tabs/tab-content.directive.d.ts +9 -9
  844. package/tabs/tab-group.component.d.ts +133 -133
  845. package/tabs/tab-header.component.d.ts +35 -35
  846. package/tabs/tab-label-wrapper.directive.d.ts +30 -30
  847. package/tabs/tab-label.directive.d.ts +9 -9
  848. package/tabs/tab-nav-bar/index.d.ts +1 -1
  849. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +38 -38
  850. package/tabs/tab.component.d.ts +66 -66
  851. package/tabs/tabs-animations.d.ts +4 -4
  852. package/tabs/tabs.module.d.ts +20 -20
  853. package/tags/index.d.ts +1 -1
  854. package/tags/ptsecurity-mosaic-tags.d.ts +5 -5
  855. package/tags/public-api.d.ts +5 -5
  856. package/tags/tag-default-options.d.ts +8 -8
  857. package/tags/tag-input.d.ts +77 -77
  858. package/tags/tag-list.component.d.ts +240 -240
  859. package/tags/tag-text-control.d.ts +10 -10
  860. package/tags/tag.component.d.ts +135 -135
  861. package/tags/tag.module.d.ts +11 -11
  862. package/textarea/index.d.ts +1 -1
  863. package/textarea/ptsecurity-mosaic-textarea.d.ts +5 -5
  864. package/textarea/public-api.d.ts +2 -2
  865. package/textarea/textarea.component.d.ts +111 -111
  866. package/textarea/textarea.module.d.ts +11 -11
  867. package/timepicker/index.d.ts +1 -1
  868. package/timepicker/ptsecurity-mosaic-timepicker.d.ts +5 -5
  869. package/timepicker/public-api.d.ts +3 -3
  870. package/timepicker/timepicker.constants.d.ts +20 -20
  871. package/timepicker/timepicker.directive.d.ts +146 -146
  872. package/timepicker/timepicker.module.d.ts +11 -11
  873. package/toggle/index.d.ts +1 -1
  874. package/toggle/ptsecurity-mosaic-toggle.d.ts +5 -5
  875. package/toggle/public-api.d.ts +2 -2
  876. package/toggle/toggle.component.d.ts +54 -54
  877. package/toggle/toggle.module.d.ts +10 -10
  878. package/tooltip/index.d.ts +1 -1
  879. package/tooltip/ptsecurity-mosaic-tooltip.d.ts +5 -5
  880. package/tooltip/public-api.d.ts +2 -2
  881. package/tooltip/tooltip.animations.d.ts +8 -8
  882. package/tooltip/tooltip.component.d.ts +91 -91
  883. package/tooltip/tooltip.module.d.ts +9 -9
  884. package/tree/control/base-tree-control.d.ts +40 -40
  885. package/tree/control/flat-tree-control.d.ts +52 -52
  886. package/tree/control/nested-tree-control.d.ts +19 -19
  887. package/tree/control/tree-control.d.ts +44 -44
  888. package/tree/data-source/flat-data-source.d.ts +80 -80
  889. package/tree/data-source/nested-data-source.d.ts +15 -15
  890. package/tree/index.d.ts +1 -1
  891. package/tree/node.d.ts +34 -34
  892. package/tree/outlet.d.ts +9 -9
  893. package/tree/padding.directive.d.ts +47 -47
  894. package/tree/ptsecurity-mosaic-tree.d.ts +5 -5
  895. package/tree/public-api.d.ts +15 -15
  896. package/tree/toggle.d.ts +28 -28
  897. package/tree/tree-base.d.ts +97 -97
  898. package/tree/tree-errors.d.ts +25 -25
  899. package/tree/tree-option.component.d.ts +72 -72
  900. package/tree/tree-selection.component.d.ts +132 -132
  901. package/tree/tree.d.ts +6 -6
  902. package/tree/tree.module.d.ts +16 -16
  903. package/tree-select/index.d.ts +1 -1
  904. package/tree-select/ptsecurity-mosaic-tree-select.d.ts +5 -5
  905. package/tree-select/public-api.d.ts +2 -2
  906. package/tree-select/tree-select.component.d.ts +277 -277
  907. package/tree-select/tree-select.module.d.ts +14 -14
@@ -24,1220 +24,1220 @@ import { McInput } from '@ptsecurity/mosaic/input';
24
24
  import { Subscription, Subject, defer, merge } from 'rxjs';
25
25
  import { take, switchMap, filter, map, distinctUntilChanged, takeUntil, startWith } from 'rxjs/operators';
26
26
 
27
- class McOptionTooltip extends McTooltipTrigger {
28
- constructor(option, overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction) {
29
- super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction);
30
- this.option = option;
31
- }
32
- get textElement() {
33
- return this.option.textElement.nativeElement;
34
- }
35
- get isOverflown() {
36
- return this.textElement.clientWidth < this.textElement.scrollWidth;
37
- }
38
- ngAfterViewInit() {
39
- this.content = this.option.viewValue;
40
- this.resizeObserver = new ResizeObserver(() => this.disabled = !this.isOverflown);
41
- this.mutationObserver = new MutationObserver(() => this.content = this.option.viewValue);
42
- this.mutationObserver.observe(this.textElement, {
43
- characterData: true, attributes: false, childList: true, subtree: true
44
- });
45
- }
46
- ngOnDestroy() {
47
- super.ngOnDestroy();
48
- if (this.resizeObserver) {
49
- this.resizeObserver.unobserve(this.textElement);
50
- this.resizeObserver.disconnect();
51
- }
52
- if (this.mutationObserver) {
53
- this.mutationObserver.disconnect();
54
- }
55
- }
56
- onMouseEnter() {
57
- this.resizeObserver.observe(this.textElement);
58
- this.disabled = !this.isOverflown;
59
- }
60
- onMouseLeave() {
61
- this.resizeObserver.unobserve(this.textElement);
62
- this.disabled = true;
63
- }
64
- }
65
- /** @nocollapse */ /** @nocollapse */ McOptionTooltip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McOptionTooltip, deps: [{ token: i1.McOption }, { token: i2.Overlay }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i2.ScrollDispatcher }, { token: i0.ViewContainerRef }, { token: MC_TOOLTIP_SCROLL_STRATEGY }, { token: i3.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
66
- /** @nocollapse */ /** @nocollapse */ McOptionTooltip.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McOptionTooltip, selector: "mc-option", host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesInheritance: true, ngImport: i0 });
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McOptionTooltip, decorators: [{
68
- type: Directive,
69
- args: [{
70
- selector: 'mc-option',
71
- host: {
72
- '(mouseenter)': 'onMouseEnter()',
73
- '(mouseleave)': 'onMouseLeave()'
74
- }
75
- }]
76
- }], ctorParameters: function () { return [{ type: i1.McOption }, { type: i2.Overlay }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i2.ScrollDispatcher }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
77
- type: Inject,
78
- args: [MC_TOOLTIP_SCROLL_STRATEGY]
79
- }] }, { type: i3.Directionality, decorators: [{
80
- type: Optional
27
+ class McOptionTooltip extends McTooltipTrigger {
28
+ constructor(option, overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction) {
29
+ super(overlay, elementRef, ngZone, scrollDispatcher, hostView, scrollStrategy, direction);
30
+ this.option = option;
31
+ }
32
+ get textElement() {
33
+ return this.option.textElement.nativeElement;
34
+ }
35
+ get isOverflown() {
36
+ return this.textElement.clientWidth < this.textElement.scrollWidth;
37
+ }
38
+ ngAfterViewInit() {
39
+ this.content = this.option.viewValue;
40
+ this.resizeObserver = new ResizeObserver(() => this.disabled = !this.isOverflown);
41
+ this.mutationObserver = new MutationObserver(() => this.content = this.option.viewValue);
42
+ this.mutationObserver.observe(this.textElement, {
43
+ characterData: true, attributes: false, childList: true, subtree: true
44
+ });
45
+ }
46
+ ngOnDestroy() {
47
+ super.ngOnDestroy();
48
+ if (this.resizeObserver) {
49
+ this.resizeObserver.unobserve(this.textElement);
50
+ this.resizeObserver.disconnect();
51
+ }
52
+ if (this.mutationObserver) {
53
+ this.mutationObserver.disconnect();
54
+ }
55
+ }
56
+ onMouseEnter() {
57
+ this.resizeObserver.observe(this.textElement);
58
+ this.disabled = !this.isOverflown;
59
+ }
60
+ onMouseLeave() {
61
+ this.resizeObserver.unobserve(this.textElement);
62
+ this.disabled = true;
63
+ }
64
+ }
65
+ /** @nocollapse */ /** @nocollapse */ McOptionTooltip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McOptionTooltip, deps: [{ token: i1.McOption }, { token: i2.Overlay }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i2.ScrollDispatcher }, { token: i0.ViewContainerRef }, { token: MC_TOOLTIP_SCROLL_STRATEGY }, { token: i3.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
66
+ /** @nocollapse */ /** @nocollapse */ McOptionTooltip.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McOptionTooltip, selector: "mc-option", host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesInheritance: true, ngImport: i0 });
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McOptionTooltip, decorators: [{
68
+ type: Directive,
69
+ args: [{
70
+ selector: 'mc-option',
71
+ host: {
72
+ '(mouseenter)': 'onMouseEnter()',
73
+ '(mouseleave)': 'onMouseLeave()'
74
+ }
75
+ }]
76
+ }], ctorParameters: function () { return [{ type: i1.McOption }, { type: i2.Overlay }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i2.ScrollDispatcher }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
77
+ type: Inject,
78
+ args: [MC_TOOLTIP_SCROLL_STRATEGY]
79
+ }] }, { type: i3.Directionality, decorators: [{
80
+ type: Optional
81
81
  }] }]; } });
82
82
 
83
- /* tslint:disable:no-empty */
84
- let nextUniqueId = 0;
85
- /** Change event object that is emitted when the select value has changed. */
86
- class McSelectChange {
87
- constructor(source, value) {
88
- this.source = source;
89
- this.value = value;
90
- }
91
- }
92
- class McSelectSearch {
93
- constructor(formField) {
94
- this.searchChangesSubscription = new Subscription();
95
- this.isSearchChanged = false;
96
- formField.canCleanerClearByEsc = false;
97
- }
98
- focus() {
99
- this.input.focus();
100
- }
101
- reset() {
102
- this.input.ngControl.reset();
103
- }
104
- ngAfterContentInit() {
105
- if (!this.input) {
106
- throw Error('McSelectSearch does not work without mcInput');
107
- }
108
- if (!this.input.ngControl) {
109
- throw Error('McSelectSearch does not work without ngControl');
110
- }
111
- Promise.resolve().then(() => {
112
- this.searchChangesSubscription = this.input.ngControl.valueChanges.subscribe(() => {
113
- this.isSearchChanged = true;
114
- });
115
- });
116
- }
117
- ngOnDestroy() {
118
- this.searchChangesSubscription.unsubscribe();
119
- }
120
- handleKeydown(event) {
121
- // tslint:disable-next-line:deprecation
122
- if (event.keyCode === ESCAPE) {
123
- if (this.input.value) {
124
- this.reset();
125
- event.stopPropagation();
126
- }
127
- }
128
- // tslint:disable-next-line:deprecation
129
- if ([SPACE, HOME, END].includes(event.keyCode)) {
130
- event.stopPropagation();
131
- }
132
- }
133
- }
134
- /** @nocollapse */ /** @nocollapse */ McSelectSearch.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearch, deps: [{ token: i1$1.McFormField }], target: i0.ɵɵFactoryTarget.Directive });
135
- /** @nocollapse */ /** @nocollapse */ McSelectSearch.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McSelectSearch, selector: "[mcSelectSearch]", host: { listeners: { "keydown": "handleKeydown($event)" } }, queries: [{ propertyName: "input", first: true, predicate: McInput, descendants: true }], exportAs: ["mcSelectSearch"], ngImport: i0 });
136
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearch, decorators: [{
137
- type: Directive,
138
- args: [{
139
- selector: '[mcSelectSearch]',
140
- exportAs: 'mcSelectSearch',
141
- host: {
142
- '(keydown)': 'handleKeydown($event)'
143
- }
144
- }]
145
- }], ctorParameters: function () { return [{ type: i1$1.McFormField }]; }, propDecorators: { input: [{
146
- type: ContentChild,
147
- args: [McInput, { static: false }]
148
- }] } });
149
- class McSelectSearchEmptyResult {
150
- }
151
- /** @nocollapse */ /** @nocollapse */ McSelectSearchEmptyResult.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearchEmptyResult, deps: [], target: i0.ɵɵFactoryTarget.Directive });
152
- /** @nocollapse */ /** @nocollapse */ McSelectSearchEmptyResult.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McSelectSearchEmptyResult, selector: "[mc-select-search-empty-result]", exportAs: ["mcSelectSearchEmptyResult"], ngImport: i0 });
153
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearchEmptyResult, decorators: [{
154
- type: Directive,
155
- args: [{
156
- selector: '[mc-select-search-empty-result]',
157
- exportAs: 'mcSelectSearchEmptyResult'
158
- }]
159
- }] });
160
- class McSelectTrigger {
161
- }
162
- /** @nocollapse */ /** @nocollapse */ McSelectTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
163
- /** @nocollapse */ /** @nocollapse */ McSelectTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McSelectTrigger, selector: "mc-select-trigger", ngImport: i0 });
164
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectTrigger, decorators: [{
165
- type: Directive,
166
- args: [{ selector: 'mc-select-trigger' }]
167
- }] });
168
- class McSelectBase {
169
- constructor(elementRef, defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl) {
170
- this.elementRef = elementRef;
171
- this.defaultErrorStateMatcher = defaultErrorStateMatcher;
172
- this.parentForm = parentForm;
173
- this.parentFormGroup = parentFormGroup;
174
- this.ngControl = ngControl;
175
- }
176
- }
177
- // tslint:disable-next-line:naming-convention
178
- const McSelectMixinBase = mixinTabIndex(mixinDisabled(mixinErrorState(McSelectBase)));
179
- class McSelect extends McSelectMixinBase {
180
- constructor(_changeDetectorRef, _ngZone, _renderer, defaultErrorStateMatcher, elementRef, rawValidators, _dir, parentForm, parentFormGroup, _parentFormField, ngControl, ngModel, formControlName, _scrollStrategyFactory, mcValidation) {
181
- super(elementRef, defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl);
182
- this._changeDetectorRef = _changeDetectorRef;
183
- this._ngZone = _ngZone;
184
- this._renderer = _renderer;
185
- this.rawValidators = rawValidators;
186
- this._dir = _dir;
187
- this._parentFormField = _parentFormField;
188
- this.ngModel = ngModel;
189
- this.formControlName = formControlName;
190
- this._scrollStrategyFactory = _scrollStrategyFactory;
191
- this.mcValidation = mcValidation;
192
- /** A name for this control that can be used by `mc-form-field`. */
193
- this.controlType = 'select';
194
- this.hiddenItems = 0;
195
- /** The cached font-size of the trigger element. */
196
- this.triggerFontSize = 0;
197
- this.previousSelectionModelSelected = [];
198
- /** The value of the select panel's transform-origin property. */
199
- this.transformOrigin = 'top';
200
- /** Emits when the panel element is finished transforming in. */
201
- this.panelDoneAnimatingStream = new Subject();
202
- /** Strategy that will be used to handle scrolling while the select panel is open. */
203
- this.scrollStrategy = this._scrollStrategyFactory();
204
- /**
205
- * The y-offset of the overlay panel in relation to the trigger's top start corner.
206
- * This must be adjusted to align the selected option text over the trigger text.
207
- * when the panel opens. Will change based on the y-position of the selected option.
208
- */
209
- this.offsetY = 0;
210
- /**
211
- * This position config ensures that the top "start" corner of the overlay
212
- * is aligned with with the top "start" of the origin by default (overlapping
213
- * the trigger completely). If the panel cannot fit below the trigger, it
214
- * will fall back to a position above the trigger.
215
- */
216
- this.positions = [
217
- {
218
- originX: 'start',
219
- originY: 'bottom',
220
- overlayX: 'start',
221
- overlayY: 'top'
222
- },
223
- {
224
- originX: 'start',
225
- originY: 'top',
226
- overlayX: 'start',
227
- overlayY: 'bottom'
228
- }
229
- ];
230
- this.hiddenItemsText = '...ещё';
231
- this.backdropClass = 'cdk-overlay-transparent-backdrop';
232
- /** Combined stream of all of the child options' change events. */
233
- this.optionSelectionChanges = defer(() => {
234
- if (this.options) {
235
- return merge(...this.options.map((option) => option.onSelectionChange), ...this.selectionModel.selected.map((option) => option.onSelectionChange));
236
- }
237
- return this._ngZone.onStable
238
- .asObservable()
239
- .pipe(take(1), switchMap(() => this.optionSelectionChanges));
240
- });
241
- /** Event emitted when the select panel has been toggled. */
242
- this.openedChange = new EventEmitter();
243
- /** Event emitted when the select has been opened. */
244
- this.openedStream = this.openedChange.pipe(filter((o) => o), map(() => { }));
245
- /** Event emitted when the select has been closed. */
246
- this.closedStream = this.openedChange.pipe(filter((o) => !o), map(() => { }));
247
- /** Event emitted when the selected value has been changed by the user. */
248
- this.selectionChange = new EventEmitter();
249
- /**
250
- * Event that emits whenever the raw value of the select changes. This is here primarily
251
- * to facilitate the two-way binding for the `value` input.
252
- * @docs-private
253
- */
254
- this.valueChange = new EventEmitter();
255
- this._hasBackdrop = false;
256
- this._required = false;
257
- this._multiple = false;
258
- this._disabled = false;
259
- this._focused = false;
260
- this.panelOpen = false;
261
- this.closeSubscription = Subscription.EMPTY;
262
- /** The scroll position of the overlay panel, calculated to center the selected option. */
263
- this.scrollTop = 0;
264
- /** Unique id for this input. */
265
- this.uid = `mc-select-${nextUniqueId++}`;
266
- /** Emits whenever the component is destroyed. */
267
- this.destroy = new Subject();
268
- /** `View -> model callback called when value changes` */
269
- this.onChange = () => { };
270
- /** `View -> model callback called when select has been touched` */
271
- this.onTouched = () => { };
272
- /** Comparison function to specify which option is displayed. Defaults to object equality. */
273
- this._compareWith = (o1, o2) => o1 === o2;
274
- if (this.ngControl) {
275
- // Note: we provide the value accessor through here, instead of
276
- // the `providers` to avoid running into a circular import.
277
- this.ngControl.valueAccessor = this;
278
- }
279
- // Force setter to be called in case id was not specified.
280
- this.id = this.id;
281
- }
282
- get hasBackdrop() {
283
- return this._hasBackdrop;
284
- }
285
- set hasBackdrop(value) {
286
- this._hasBackdrop = coerceBooleanProperty(value);
287
- }
288
- get placeholder() {
289
- return this._placeholder;
290
- }
291
- set placeholder(value) {
292
- this._placeholder = value;
293
- this.stateChanges.next();
294
- }
295
- get required() {
296
- return this._required;
297
- }
298
- set required(value) {
299
- this._required = coerceBooleanProperty(value);
300
- this.stateChanges.next();
301
- }
302
- get multiple() {
303
- return this._multiple;
304
- }
305
- set multiple(value) {
306
- if (this.selectionModel) {
307
- throw getMcSelectDynamicMultipleError();
308
- }
309
- this._multiple = coerceBooleanProperty(value);
310
- }
311
- /**
312
- * Function to compare the option values with the selected values. The first argument
313
- * is a value from an option. The second is a value from the selection. A boolean
314
- * should be returned.
315
- */
316
- get compareWith() {
317
- return this._compareWith;
318
- }
319
- set compareWith(fn) {
320
- /* tslint:disable-next-line:strict-type-predicates */
321
- if (typeof fn !== 'function') {
322
- throw getMcSelectNonFunctionValueError();
323
- }
324
- this._compareWith = fn;
325
- if (this.selectionModel) {
326
- // A different comparator means the selection could change.
327
- this.initializeSelection();
328
- }
329
- }
330
- /** Value of the select control. */
331
- get value() {
332
- return this._value;
333
- }
334
- set value(newValue) {
335
- if (newValue !== this._value) {
336
- this.writeValue(newValue);
337
- this._value = newValue;
338
- }
339
- }
340
- get id() {
341
- return this._id;
342
- }
343
- set id(value) {
344
- this._id = value || this.uid;
345
- this.stateChanges.next();
346
- }
347
- get disabled() {
348
- return this._disabled;
349
- }
350
- set disabled(value) {
351
- this._disabled = coerceBooleanProperty(value);
352
- if (this._parentFormField) {
353
- this._disabled ? this._parentFormField.stopFocusMonitor() : this._parentFormField.runFocusMonitor();
354
- }
355
- }
356
- /** Whether the select is focused. */
357
- get focused() {
358
- return this._focused || this.panelOpen;
359
- }
360
- set focused(value) {
361
- this._focused = value;
362
- }
363
- get isEmptySearchResult() {
364
- return this.search && this.options.length === 0 && !!this.search.input.value;
365
- }
366
- get canShowCleaner() {
367
- return !this.disabled && this.cleaner && this.selectionModel.hasValue();
368
- }
369
- get selected() {
370
- return this.multiple ? this.selectionModel.selected : this.selectionModel.selected[0];
371
- }
372
- get triggerValue() {
373
- if (this.empty) {
374
- return '';
375
- }
376
- return this.selectionModel.selected[0].viewValue;
377
- }
378
- get triggerValues() {
379
- if (this.empty) {
380
- return [];
381
- }
382
- const selectedOptions = this.selectionModel.selected;
383
- if (this.isRtl()) {
384
- selectedOptions.reverse();
385
- }
386
- return selectedOptions;
387
- }
388
- get empty() {
389
- return !this.selectionModel || this.selectionModel.isEmpty();
390
- }
391
- ngOnInit() {
392
- this.selectionModel = new SelectionModel(this.multiple);
393
- this.stateChanges.next();
394
- // We need `distinctUntilChanged` here, because some browsers will
395
- // fire the animation end event twice for the same animation. See:
396
- // https://github.com/angular/angular/issues/24084
397
- this.panelDoneAnimatingStream
398
- .pipe(distinctUntilChanged(), takeUntil(this.destroy))
399
- .subscribe(() => {
400
- if (this.panelOpen) {
401
- this.scrollTop = 0;
402
- if (this.search) {
403
- this.search.focus();
404
- }
405
- this.openedChange.emit(true);
406
- }
407
- else {
408
- this.openedChange.emit(false);
409
- this._changeDetectorRef.markForCheck();
410
- }
411
- });
412
- }
413
- ngAfterContentInit() {
414
- if (this.mcValidation.useValidation) {
415
- setMosaicValidation(this, this._changeDetectorRef);
416
- }
417
- this.initKeyManager();
418
- this.selectionModel.changed
419
- .pipe(takeUntil(this.destroy))
420
- .subscribe((event) => {
421
- event.added.forEach((option) => option.select());
422
- event.removed.forEach((option) => option.deselect());
423
- });
424
- this.options.changes
425
- .pipe(startWith(null), takeUntil(this.destroy))
426
- .subscribe(() => {
427
- this.resetOptions();
428
- this.initializeSelection();
429
- });
430
- }
431
- ngAfterViewInit() {
432
- this.tags.changes
433
- .subscribe(() => {
434
- setTimeout(() => this.calculateHiddenItems(), 0);
435
- });
436
- }
437
- ngDoCheck() {
438
- if (this.ngControl) {
439
- this.updateErrorState();
440
- }
441
- }
442
- ngOnChanges(changes) {
443
- // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let
444
- // the parent form field know to run change detection when the disabled state changes.
445
- if (changes.disabled) {
446
- this.stateChanges.next();
447
- }
448
- }
449
- ngOnDestroy() {
450
- this.destroy.next();
451
- this.destroy.complete();
452
- this.stateChanges.complete();
453
- this.closeSubscription.unsubscribe();
454
- }
455
- hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) {
456
- return `${hiddenItemsText} ${hiddenItems}`;
457
- }
458
- clearValue($event) {
459
- $event.stopPropagation();
460
- this.selectionModel.clear();
461
- this.keyManager.setActiveItem(-1);
462
- this.propagateChanges();
463
- }
464
- resetSearch() {
465
- if (!this.search) {
466
- return;
467
- }
468
- this.search.reset();
469
- /*
470
- todo the incorrect behaviour of keyManager is possible here
471
- to avoid first item selection (to provide correct options flipping on closed select)
472
- we should process options update like it is the first options appearance
473
- */
474
- this.search.isSearchChanged = false;
475
- }
476
- /** Toggles the overlay panel open or closed. */
477
- toggle() {
478
- if (this.panelOpen) {
479
- this.close();
480
- }
481
- else {
482
- this.open();
483
- }
484
- }
485
- /** Opens the overlay panel. */
486
- open() {
487
- if (this.disabled || !this.options?.length || this.panelOpen) {
488
- return;
489
- }
490
- this.triggerRect = this.trigger.nativeElement.getBoundingClientRect();
491
- // Note: The computed font-size will be a string pixel value (e.g. "16px").
492
- // `parseInt` ignores the trailing 'px' and converts this to a number.
493
- this.triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement)['font-size']);
494
- this.panelOpen = true;
495
- this.keyManager.withHorizontalOrientation(null);
496
- this.highlightCorrectOption();
497
- this._changeDetectorRef.markForCheck();
498
- // Set the font size on the panel element once it exists.
499
- this._ngZone.onStable.asObservable()
500
- .pipe(take(1))
501
- .subscribe(() => {
502
- this.scrollActiveOptionIntoView();
503
- if (this.triggerFontSize && this.overlayDir.overlayRef && this.overlayDir.overlayRef.overlayElement) {
504
- this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
505
- }
506
- });
507
- }
508
- /** Closes the overlay panel and focuses the host element. */
509
- close() {
510
- if (!this.panelOpen) {
511
- return;
512
- }
513
- // the order of calls is important
514
- this.resetSearch();
515
- this.panelOpen = false;
516
- this.keyManager.withHorizontalOrientation(this.isRtl() ? 'rtl' : 'ltr');
517
- this._changeDetectorRef.markForCheck();
518
- this.onTouched();
519
- }
520
- /**
521
- * Sets the select's value. Part of the ControlValueAccessor interface
522
- * required to integrate with Angular's core forms API.
523
- *
524
- * @param value New value to be written to the model.
525
- */
526
- writeValue(value) {
527
- if (this.options) {
528
- this.setSelectionByValue(value);
529
- }
530
- }
531
- /**
532
- * Saves a callback function to be invoked when the select's value
533
- * changes from user input. Part of the ControlValueAccessor interface
534
- * required to integrate with Angular's core forms API.
535
- *
536
- * @param fn Callback to be triggered when the value changes.
537
- */
538
- registerOnChange(fn) {
539
- this.onChange = fn;
540
- }
541
- /**
542
- * Saves a callback function to be invoked when the select is blurred
543
- * by the user. Part of the ControlValueAccessor interface required
544
- * to integrate with Angular's core forms API.
545
- *
546
- * @param fn Callback to be triggered when the component has been touched.
547
- */
548
- registerOnTouched(fn) {
549
- this.onTouched = fn;
550
- }
551
- /**
552
- * Disables the select. Part of the ControlValueAccessor interface required
553
- * to integrate with Angular's core forms API.
554
- *
555
- * @param isDisabled Sets whether the component is disabled.
556
- */
557
- setDisabledState(isDisabled) {
558
- this.disabled = isDisabled;
559
- this._changeDetectorRef.markForCheck();
560
- this.stateChanges.next();
561
- }
562
- isRtl() {
563
- return this._dir ? this._dir.value === 'rtl' : false;
564
- }
565
- handleKeydown(event) {
566
- if (this.disabled) {
567
- return;
568
- }
569
- if (this.panelOpen) {
570
- this.handleOpenKeydown(event);
571
- }
572
- else {
573
- this.handleClosedKeydown(event);
574
- }
575
- }
576
- onFocus() {
577
- if (!this.disabled) {
578
- this._focused = true;
579
- this.stateChanges.next();
580
- }
581
- }
582
- /**
583
- * Calls the touched callback only if the panel is closed. Otherwise, the trigger will
584
- * "blur" to the panel when it opens, causing a false positive.
585
- */
586
- onBlur() {
587
- this._focused = false;
588
- if (!this.disabled && !this.panelOpen) {
589
- this.onTouched();
590
- this._changeDetectorRef.markForCheck();
591
- this.stateChanges.next();
592
- }
593
- }
594
- /**
595
- * Callback that is invoked when the overlay panel has been attached.
596
- */
597
- onAttached() {
598
- this.overlayDir.positionChange
599
- .pipe(take(1))
600
- .subscribe(() => {
601
- this._changeDetectorRef.detectChanges();
602
- this.setOverlayPosition();
603
- this.optionsContainer.nativeElement.scrollTop = this.scrollTop;
604
- this.updateScrollSize();
605
- });
606
- this.closeSubscription = this.closingActions()
607
- .subscribe(() => this.close());
608
- }
609
- /** Returns the theme to be used on the panel. */
610
- getPanelTheme() {
611
- return this._parentFormField ? `mc-${this._parentFormField.color}` : '';
612
- }
613
- /** Focuses the select element. */
614
- focus() {
615
- this.elementRef.nativeElement.focus();
616
- }
617
- /**
618
- * Implemented as part of McFormFieldControl.
619
- * @docs-private
620
- */
621
- onContainerClick() {
622
- this.focus();
623
- }
624
- /** Invoked when an option is clicked. */
625
- onRemoveMatcherItem(option, $event) {
626
- $event.stopPropagation();
627
- option.deselect();
628
- }
629
- calculateHiddenItems() {
630
- if (this.customTrigger || this.empty || !this.multiple) {
631
- return;
632
- }
633
- let visibleItems = 0;
634
- const totalItemsWidth = this.getTotalItemsWidthInMatcher();
635
- let totalVisibleItemsWidth = 0;
636
- this.tags.forEach((tag) => {
637
- if (tag.nativeElement.offsetTop < tag.nativeElement.offsetHeight) {
638
- totalVisibleItemsWidth += this.getItemWidth(tag.nativeElement);
639
- visibleItems++;
640
- }
641
- });
642
- this.hiddenItems = this.selected.length - visibleItems;
643
- if (this.hiddenItems) {
644
- const itemsCounter = this.trigger.nativeElement.querySelector('.mc-select__match-hidden-text');
645
- const matcherList = this.trigger.nativeElement.querySelector('.mc-select__match-list');
646
- const itemsCounterShowed = itemsCounter.offsetTop < itemsCounter.offsetHeight;
647
- // const itemsCounterWidth: number = itemsCounter.getBoundingClientRect().width;
648
- const itemsCounterWidth = 86;
649
- const matcherListWidth = Math.floor(matcherList.getBoundingClientRect().width);
650
- const matcherWidth = matcherListWidth + (itemsCounterShowed ? itemsCounterWidth : 0);
651
- if (itemsCounterShowed && (totalItemsWidth < matcherWidth)) {
652
- this.hiddenItems = 0;
653
- }
654
- if (totalVisibleItemsWidth === matcherListWidth ||
655
- (totalVisibleItemsWidth + itemsCounterWidth) < matcherListWidth) {
656
- this._changeDetectorRef.markForCheck();
657
- return;
658
- }
659
- else if (!itemsCounterShowed && (totalItemsWidth + itemsCounterWidth) > matcherWidth) {
660
- this.hiddenItems++;
661
- }
662
- }
663
- this._changeDetectorRef.markForCheck();
664
- }
665
- getItemHeight() {
666
- return this.options.first ? this.options.first.getHeight() : 0;
667
- }
668
- closingActions() {
669
- return merge(this.overlayDir.overlayRef.outsidePointerEvents()
670
- .pipe(filter((event) => !this.elementRef.nativeElement.contains(event.target))), this.overlayDir.overlayRef.detachments());
671
- }
672
- getHeightOfOptionsContainer() {
673
- return this.optionsContainer.nativeElement.getClientRects()[0].height;
674
- }
675
- updateScrollSize() {
676
- if (!this.options.first) {
677
- return;
678
- }
679
- this.keyManager.withScrollSize(Math.floor(this.getHeightOfOptionsContainer() / this.options.first.getHeight()));
680
- }
681
- getTotalItemsWidthInMatcher() {
682
- const triggerClone = this.trigger.nativeElement.cloneNode(true);
683
- triggerClone.querySelector('.mc-select__match-hidden-text').remove();
684
- this._renderer.setStyle(triggerClone, 'position', 'absolute');
685
- this._renderer.setStyle(triggerClone, 'visibility', 'hidden');
686
- this._renderer.setStyle(triggerClone, 'top', '-100%');
687
- this._renderer.setStyle(triggerClone, 'left', '0');
688
- this._renderer.appendChild(this.trigger.nativeElement, triggerClone);
689
- let totalItemsWidth = 0;
690
- triggerClone.querySelectorAll('mc-tag').forEach((item) => {
691
- totalItemsWidth += this.getItemWidth(item);
692
- });
693
- triggerClone.remove();
694
- return totalItemsWidth;
695
- }
696
- getItemWidth(element) {
697
- const computedStyle = window.getComputedStyle(element);
698
- const width = parseInt(computedStyle.width);
699
- const marginLeft = parseInt(computedStyle.marginLeft);
700
- const marginRight = parseInt(computedStyle.marginRight);
701
- return width + marginLeft + marginRight;
702
- }
703
- /** Handles keyboard events while the select is closed. */
704
- handleClosedKeydown(event) {
705
- /* tslint:disable-next-line */
706
- const keyCode = event.keyCode;
707
- const isArrowKey = [DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW].includes(keyCode);
708
- const isOpenKey = [ENTER, SPACE].includes(keyCode);
709
- // Open the select on ALT + arrow key to match the native <select>
710
- if (isOpenKey || ((this.multiple || event.altKey) && isArrowKey)) {
711
- event.preventDefault(); // prevents the page from scrolling down when pressing space
712
- this.open();
713
- }
714
- else if (!this.multiple) {
715
- this.keyManager.onKeydown(event);
716
- }
717
- }
718
- /** Handles keyboard events when the selected is open. */
719
- handleOpenKeydown(event) {
720
- /* tslint:disable-next-line */
721
- const keyCode = event.keyCode;
722
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
723
- if (isArrowKey && event.altKey) {
724
- // Close the select on ALT + arrow key to match the native <select>
725
- event.preventDefault();
726
- this.close();
727
- }
728
- else if (keyCode === HOME) {
729
- event.preventDefault();
730
- this.keyManager.setFirstItemActive();
731
- }
732
- else if (keyCode === END) {
733
- event.preventDefault();
734
- this.keyManager.setLastItemActive();
735
- }
736
- else if (keyCode === PAGE_UP) {
737
- event.preventDefault();
738
- this.keyManager.setPreviousPageItemActive();
739
- }
740
- else if (keyCode === PAGE_DOWN) {
741
- event.preventDefault();
742
- this.keyManager.setNextPageItemActive();
743
- }
744
- else if ((keyCode === ENTER || keyCode === SPACE) && this.keyManager.activeItem) {
745
- event.preventDefault();
746
- this.keyManager.activeItem.selectViaInteraction();
747
- }
748
- else if (this._multiple && keyCode === A && event.ctrlKey) {
749
- event.preventDefault();
750
- const hasDeselectedOptions = this.options.some((option) => !option.selected);
751
- this.options.forEach((option) => {
752
- if (hasDeselectedOptions && !option.disabled) {
753
- option.select();
754
- }
755
- else {
756
- option.deselect();
757
- }
758
- });
759
- }
760
- else {
761
- const previouslyFocusedIndex = this.keyManager.activeItemIndex;
762
- this.keyManager.onKeydown(event);
763
- if (this._multiple && isArrowKey && event.shiftKey && this.keyManager.activeItem &&
764
- this.keyManager.activeItemIndex !== previouslyFocusedIndex) {
765
- this.keyManager.activeItem.selectViaInteraction();
766
- }
767
- if (this.search) {
768
- this.search.focus();
769
- }
770
- }
771
- }
772
- initializeSelection() {
773
- // Defer setting the value in order to avoid the "Expression
774
- // has changed after it was checked" errors from Angular.
775
- Promise.resolve().then(() => {
776
- this.setSelectionByValue(this.ngControl ? this.ngControl.value : this._value);
777
- });
778
- }
779
- /**
780
- * Sets the selected option based on a value. If no option can be
781
- * found with the designated value, the select trigger is cleared.
782
- */
783
- setSelectionByValue(value) {
784
- this.previousSelectionModelSelected = this.selectionModel.selected;
785
- if (this.multiple && value) {
786
- if (!Array.isArray(value)) {
787
- throw getMcSelectNonArrayValueError();
788
- }
789
- this.selectionModel.clear();
790
- value.forEach((currentValue) => this.selectValue(currentValue));
791
- this.sortValues();
792
- }
793
- else {
794
- this.selectionModel.clear();
795
- const correspondingOption = this.selectValue(value);
796
- // Shift focus to the active item. Note that we shouldn't do this in multiple
797
- // mode, because we don't know what option the user interacted with last.
798
- if (correspondingOption) {
799
- this.keyManager.setActiveItem(correspondingOption);
800
- }
801
- }
802
- this._changeDetectorRef.markForCheck();
803
- }
804
- getCorrespondOption(value) {
805
- return [
806
- ...this.options.toArray(),
807
- ...this.previousSelectionModelSelected
808
- ].find((option) => {
809
- try {
810
- // Treat null as a special reset value.
811
- return option.value != null && this.compareWith(option.value, value);
812
- }
813
- catch (error) {
814
- if (isDevMode()) {
815
- // Notify developers of errors in their comparator.
816
- console.warn(error);
817
- }
818
- return false;
819
- }
820
- });
821
- }
822
- /**
823
- * Finds and selects and option based on its value.
824
- * @returns Option that has the corresponding value.
825
- */
826
- selectValue(value) {
827
- const correspondingOption = this.getCorrespondOption(value);
828
- if (correspondingOption) {
829
- this.selectionModel.select(correspondingOption);
830
- }
831
- return correspondingOption;
832
- }
833
- /** Sets up a key manager to listen to keyboard events on the overlay panel. */
834
- initKeyManager() {
835
- const typeAheadDebounce = 200;
836
- this.keyManager = new ActiveDescendantKeyManager(this.options)
837
- .withTypeAhead(typeAheadDebounce, this.search ? -1 : 0)
838
- .withVerticalOrientation()
839
- .withHorizontalOrientation(this.isRtl() ? 'rtl' : 'ltr');
840
- this.keyManager.tabOut
841
- .pipe(takeUntil(this.destroy))
842
- .subscribe(() => {
843
- // Restore focus to the trigger before closing. Ensures that the focus
844
- // position won't be lost if the user got focus into the overlay.
845
- this.focus();
846
- this.close();
847
- });
848
- this.keyManager.change
849
- .pipe(takeUntil(this.destroy))
850
- .subscribe(() => {
851
- if (this.panelOpen && this.panel) {
852
- this.scrollActiveOptionIntoView();
853
- }
854
- else if (!this.panelOpen && !this.multiple && this.keyManager.activeItem) {
855
- this.keyManager.activeItem.selectViaInteraction();
856
- }
857
- });
858
- }
859
- /** Drops current option subscriptions and IDs and resets from scratch. */
860
- resetOptions() {
861
- const changedOrDestroyed = merge(this.options.changes, this.destroy);
862
- this.optionSelectionChanges
863
- .pipe(takeUntil(changedOrDestroyed))
864
- .subscribe((event) => {
865
- this.onSelect(event.source, event.isUserInput);
866
- if (this.search && this.search.isSearchChanged) {
867
- Promise.resolve().then(() => this.keyManager.updateActiveItem(0));
868
- this.search.isSearchChanged = false;
869
- }
870
- if (event.isUserInput && !this.multiple && this.panelOpen) {
871
- this.close();
872
- this.focus();
873
- }
874
- });
875
- // Listen to changes in the internal state of the options and react accordingly.
876
- // Handles cases like the labels of the selected options changing.
877
- merge(...this.options.map((option) => option.stateChanges))
878
- .pipe(takeUntil(changedOrDestroyed))
879
- .subscribe(() => {
880
- this._changeDetectorRef.markForCheck();
881
- this.stateChanges.next();
882
- });
883
- }
884
- /** Invoked when an option is clicked. */
885
- onSelect(option, isUserInput) {
886
- const wasSelected = this.selectionModel.isSelected(option);
887
- if (option.value == null && !this._multiple) {
888
- option.deselect();
889
- this.selectionModel.clear();
890
- this.propagateChanges(option.value);
891
- }
892
- else {
893
- if (option.selected) {
894
- this.selectionModel.select(option);
895
- }
896
- else {
897
- this.selectionModel.deselect(option);
898
- }
899
- if (isUserInput) {
900
- this.keyManager.setActiveItem(option);
901
- }
902
- if (this.multiple) {
903
- this.sortValues();
904
- if (isUserInput) {
905
- // In case the user selected the option with their mouse, we
906
- // want to restore focus back to the trigger, in order to
907
- // prevent the select keyboard controls from clashing with
908
- // the ones from `mc-option`.
909
- // If search is avaliable then we focus search again.
910
- if (this.search) {
911
- this.search.focus();
912
- }
913
- else {
914
- this.focus();
915
- }
916
- }
917
- }
918
- }
919
- if (wasSelected !== this.selectionModel.isSelected(option)) {
920
- this.propagateChanges();
921
- }
922
- this.stateChanges.next();
923
- }
924
- /** Sorts the selected values in the selected based on their order in the panel. */
925
- sortValues() {
926
- if (this.multiple) {
927
- const options = this.options.toArray();
928
- this.selectionModel.sort((a, b) => {
929
- return this.sortComparator ? this.sortComparator(a, b, options) :
930
- options.indexOf(a) - options.indexOf(b);
931
- });
932
- this.stateChanges.next();
933
- }
934
- }
935
- /** Emits change event to set the model value. */
936
- propagateChanges(fallbackValue) {
937
- let valueToEmit = null;
938
- if (this.multiple) {
939
- valueToEmit = this.selected.map((option) => option.value);
940
- }
941
- else {
942
- valueToEmit = this.selected ? this.selected.value : fallbackValue;
943
- }
944
- this._value = valueToEmit;
945
- this.valueChange.emit(valueToEmit);
946
- this.onChange(valueToEmit);
947
- this.selectionChange.emit(new McSelectChange(this, valueToEmit));
948
- this._changeDetectorRef.markForCheck();
949
- }
950
- /**
951
- * Highlights the selected item. If no option is selected, it will highlight
952
- * the first item instead.
953
- */
954
- highlightCorrectOption() {
955
- if (this.keyManager) {
956
- if (this.empty) {
957
- this.keyManager.setFirstItemActive();
958
- }
959
- else {
960
- this.keyManager.setActiveItem(this.selectionModel.selected[0]);
961
- }
962
- }
963
- }
964
- /** Scrolls the active option into view. */
965
- scrollActiveOptionIntoView() {
966
- this.keyManager.activeItem?.focus();
967
- }
968
- /**
969
- * Sets the x-offset of the overlay panel in relation to the trigger's top start corner.
970
- * This must be adjusted to align the selected option text over the trigger text when
971
- * the panel opens. Will change based on LTR or RTL text direction. Note that the offset
972
- * can't be calculated until the panel has been attached, because we need to know the
973
- * content width in order to constrain the panel within the viewport.
974
- */
975
- setOverlayPosition() {
976
- this.resetOverlay();
977
- const overlayRect = this.getOverlayRect();
978
- // Window width without scrollbar
979
- const windowWidth = this.getOverlayWidth();
980
- const isRtl = this.isRtl();
981
- /* tslint:disable-next-line:no-magic-numbers */
982
- const paddingWidth = SELECT_PANEL_PADDING_X * 2;
983
- let offsetX;
984
- let overlayMaxWidth;
985
- const selected = this.selectionModel.selected[0] || this.options.first;
986
- offsetX = selected && selected.group ? SELECT_PANEL_INDENT_PADDING_X : SELECT_PANEL_PADDING_X;
987
- // Invert the offset in LTR.
988
- if (!isRtl) {
989
- offsetX *= -1;
990
- }
991
- // Determine if select overflows on either side.
992
- const leftOverflow = 0 - (overlayRect.left + offsetX - (isRtl ? paddingWidth : 0));
993
- const rightOverflow = overlayRect.right + offsetX - windowWidth
994
- + (isRtl ? 0 : paddingWidth);
995
- // If the element overflows on either side, reduce the offset to allow it to fit.
996
- if (leftOverflow > 0 || rightOverflow > 0) {
997
- [offsetX, overlayMaxWidth] = this.calculateOverlayXPosition(overlayRect, windowWidth, offsetX);
998
- this.overlayDir.overlayRef.overlayElement.style.maxWidth = `${overlayMaxWidth}px`;
999
- }
1000
- // Set the offset directly in order to avoid having to go through change detection and
1001
- // potentially triggering "changed after it was checked" errors. Round the value to avoid
1002
- // blurry content in some browsers.
1003
- this.overlayDir.offsetX = Math.round(offsetX);
1004
- this.overlayDir.overlayRef.updatePosition();
1005
- }
1006
- calculateOverlayXPosition(overlayRect, windowWidth, basicOffsetX) {
1007
- let offsetX = basicOffsetX;
1008
- const leftIndent = this.triggerRect.left;
1009
- const rightIndent = windowWidth - this.triggerRect.right;
1010
- // Setting direction of dropdown expansion
1011
- const isRightDirection = leftIndent <= rightIndent;
1012
- let maxDropdownWidth;
1013
- let overlayMaxWidth;
1014
- const triggerWidth = this.triggerRect.width + SELECT_PANEL_INDENT_PADDING_X;
1015
- if (isRightDirection) {
1016
- maxDropdownWidth = rightIndent + triggerWidth - SELECT_PANEL_VIEWPORT_PADDING;
1017
- overlayMaxWidth = overlayRect.width < maxDropdownWidth ? overlayRect.width : maxDropdownWidth;
1018
- }
1019
- else {
1020
- let leftOffset;
1021
- maxDropdownWidth = leftIndent + triggerWidth - SELECT_PANEL_VIEWPORT_PADDING;
1022
- if (overlayRect.width < maxDropdownWidth) {
1023
- overlayMaxWidth = overlayRect.width;
1024
- leftOffset = this.triggerRect.right - overlayMaxWidth;
1025
- }
1026
- else {
1027
- overlayMaxWidth = maxDropdownWidth;
1028
- leftOffset = this.triggerRect.right - (overlayMaxWidth - SELECT_PANEL_INDENT_PADDING_X);
1029
- }
1030
- offsetX -= this.triggerRect.left - leftOffset;
1031
- }
1032
- return [offsetX, overlayMaxWidth];
1033
- }
1034
- resetOverlay() {
1035
- this.overlayDir.offsetX = 0;
1036
- this.overlayDir.overlayRef.overlayElement.style.maxWidth = 'unset';
1037
- this.overlayDir.overlayRef.updatePosition();
1038
- }
1039
- getOverlayRect() {
1040
- return this.overlayDir.overlayRef.overlayElement.getBoundingClientRect();
1041
- }
1042
- getOverlayWidth() {
1043
- return this.scrollStrategy._overlayRef.hostElement.clientWidth;
1044
- }
1045
- }
1046
- /** @nocollapse */ /** @nocollapse */ McSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelect, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i1.ErrorStateMatcher }, { token: i0.ElementRef }, { token: NG_VALIDATORS, optional: true }, { token: i3.Directionality, optional: true }, { token: i4.NgForm, optional: true }, { token: i4.FormGroupDirective, optional: true }, { token: i1$1.McFormField, optional: true }, { token: i4.NgControl, optional: true, self: true }, { token: i4.NgModel, optional: true, self: true }, { token: i4.FormControlName, optional: true, self: true }, { token: MC_SELECT_SCROLL_STRATEGY }, { token: MC_VALIDATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1047
- /** @nocollapse */ /** @nocollapse */ McSelect.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: McSelect, selector: "mc-select", inputs: { disabled: "disabled", tabIndex: "tabIndex", hiddenItemsText: "hiddenItemsText", panelClass: "panelClass", backdropClass: "backdropClass", errorStateMatcher: "errorStateMatcher", sortComparator: "sortComparator", hasBackdrop: "hasBackdrop", placeholder: "placeholder", required: "required", multiple: "multiple", compareWith: "compareWith", value: "value", id: "id", hiddenItemsTextFormatter: "hiddenItemsTextFormatter" }, outputs: { openedChange: "openedChange", openedStream: "opened", closedStream: "closed", selectionChange: "selectionChange", valueChange: "valueChange" }, host: { listeners: { "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()", "window:resize": "calculateHiddenItems()" }, properties: { "attr.id": "id", "attr.tabindex": "tabIndex", "attr.disabled": "disabled || null", "class.mc-disabled": "disabled", "class.mc-invalid": "errorState" }, classAttribute: "mc-select" }, providers: [
1048
- { provide: McFormFieldControl, useExisting: McSelect },
1049
- { provide: MC_OPTION_PARENT_COMPONENT, useExisting: McSelect }
1050
- ], queries: [{ propertyName: "customTrigger", first: true, predicate: McSelectTrigger, descendants: true }, { propertyName: "cleaner", first: true, predicate: ["mcSelectCleaner"], descendants: true, static: true }, { propertyName: "search", first: true, predicate: McSelectSearch, descendants: true }, { propertyName: "options", predicate: McOption, descendants: true }, { propertyName: "optionGroups", predicate: McOptgroup }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: McTag, descendants: true }], exportAs: ["mcSelect"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div cdk-overlay-origin\r\n class=\"mc-select__trigger\"\r\n (click)=\"toggle()\"\r\n [class.mc-select__trigger_multiple]=\"multiple\"\r\n #origin=\"cdkOverlayOrigin\"\r\n #trigger>\r\n <div class=\"mc-select__matcher\" [ngSwitch]=\"empty\">\r\n <span class=\"mc-select__placeholder\" *ngSwitchCase=\"true\">{{ placeholder || '\\u00A0' }}</span>\r\n <span *ngSwitchCase=\"false\" [ngSwitch]=\"!!customTrigger\">\r\n <div *ngSwitchDefault [ngSwitch]=\"multiple\" class=\"mc-select__match-container\">\r\n <span *ngSwitchCase=\"false\" class=\"mc-select__matcher-text\">{{ triggerValue }}</span>\r\n <div *ngSwitchCase=\"true\" class=\"mc-select__match-list\">\r\n <mc-tag *ngFor=\"let option of triggerValues\"\r\n [disabled]=\"option.disabled || disabled\"\r\n [selectable]=\"false\"\r\n [class.mc-error]=\"errorState\">\r\n {{ option.viewValue }}\r\n <i mc-icon=\"mc-close-S_16\"\r\n *ngIf=\"!option.disabled && !disabled\"\r\n (click)=\"onRemoveMatcherItem(option, $event)\">\r\n </i>\r\n </mc-tag>\r\n </div>\r\n <div class=\"mc-select__match-hidden-text\" [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\">\r\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\r\n </div>\r\n </div>\r\n <ng-content select=\"mc-select-trigger\" *ngSwitchCase=\"true\"></ng-content>\r\n </span>\r\n </div>\r\n\r\n <div class=\"mc-select__cleaner\" *ngIf=\"canShowCleaner\" (click)=\"clearValue($event)\">\r\n <ng-content select=\"mc-cleaner\"></ng-content>\r\n </div>\r\n\r\n <div class=\"mc-select__arrow-wrapper\">\r\n <i class=\"mc-select__arrow\" mc-icon=\"mc-angle-down-S_16\"></i>\r\n </div>\r\n</div>\r\n\r\n<ng-template\r\n cdk-connected-overlay\r\n cdkConnectedOverlayLockPosition\r\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\r\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\r\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"panelOpen\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayMinWidth]=\"triggerRect?.width!\"\r\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\r\n (backdropClick)=\"close()\"\r\n (attach)=\"onAttached()\"\r\n (detach)=\"close()\">\r\n <div\r\n #panel\r\n class=\"mc-select__panel {{ getPanelTheme() }}\"\r\n [ngClass]=\"panelClass\"\r\n [style.transformOrigin]=\"transformOrigin\"\r\n [style.font-size.px]=\"triggerFontSize\"\r\n (keydown)=\"handleKeydown($event)\">\r\n\r\n <div *ngIf=\"search\" class=\"mc-select__search-container\">\r\n <ng-content select=\"[mcSelectSearch]\"></ng-content>\r\n </div>\r\n\r\n <div #optionsContainer\r\n class=\"mc-select__content\"\r\n [@fadeInContent]=\"'showing'\"\r\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\">\r\n\r\n <div *ngIf=\"isEmptySearchResult\" class=\"mc-select__no-options-message\">\r\n <ng-content select=\"[mc-select-search-empty-result]\"></ng-content>\r\n </div>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [".mc-option{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);border:var(--mc-option-size-border-width, 2px) solid transparent;cursor:pointer;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px);-webkit-tap-highlight-color:transparent}.mc-option.mc-disabled{cursor:default}.mc-option .mc-pseudo-checkbox{margin-right:8px}.mc-option .mc-option-overlay{position:absolute;top:calc(-1 * var(--mc-option-size-border-width, 2px));left:calc(-1 * var(--mc-option-size-border-width, 2px));right:calc(-1 * var(--mc-option-size-border-width, 2px));bottom:calc(-1 * var(--mc-option-size-border-width, 2px));pointer-events:none;border-radius:inherit}.mc-option-text{display:inline-block;flex-grow:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mc-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.mc-select .mc-select__trigger{display:flex;box-sizing:border-box;position:relative;height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);cursor:pointer;padding-left:calc(var(--mc-select-size-left-padding, 12px) - var(--mc-form-field-size-border-width, 1px));padding-right:calc(var(--mc-select-size-right-padding, 6px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple{padding-left:calc(var(--mc-select-size-left-padding-multiple, 12px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple .mc-tag.mc-disabled .mc-tag__text{margin-right:7px}.mc-select.mc-disabled .mc-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.mc-select__no-options-message{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);cursor:default;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px)}.mc-select__matcher{display:flex;align-items:center;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mc-select__matcher>span{width:100%}.mc-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;max-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2)}.mc-select__match-list .mc-tag{margin-right:4px}.mc-select__match-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.mc-select__match-container .mc-select__match-hidden-text{flex:0 0 70px;align-self:center;padding:0 8px;text-align:right}.mc-select__arrow-wrapper{align-self:center}.mc-form-field-appearance-fill .mc-select__arrow-wrapper,.mc-form-field-appearance-standard .mc-select__arrow-wrapper{transform:translateY(-50%)}.mc-form-field-appearance-outline .mc-select__arrow-wrapper{transform:translateY(-25%)}.mc-select__panel{min-width:100%;max-width:var(--mc-select-panel-size-max-width, 640px);overflow:hidden;border-width:var(--mc-select-panel-size-border-width, 1px);border-style:solid;border-bottom-left-radius:var(--mc-select-panel-size-border-radius, 4px);border-bottom-right-radius:var(--mc-select-panel-size-border-radius, 4px)}.mc-select__panel .mc-optgroup-label,.mc-select__panel .mc-option{font-size:inherit;line-height:var(--mc-option-size-height, 32px);height:var(--mc-option-size-height, 32px)}.mc-select__content{max-height:var(--mc-select-panel-size-max-height, 232px);padding:var(--mc-select-panel-size-vertical-padding, 4px) 0;overflow:auto}.mc-select__content .cdk-virtual-scroll-viewport{min-height:var(--mc-select-panel-size-max-height, 232px)-8px;max-height:var(--mc-select-panel-size-max-height, 232px)-8px}.mc-form-field-type-select:not(.mc-disabled) .mc-form-field-flex{cursor:pointer}.mc-select__search-container{border-bottom-width:1px;border-bottom-style:solid}\n"], components: [{ type: i5.McTag, selector: "mc-tag, [mc-tag], mc-basic-tag, [mc-basic-tag]", inputs: ["color", "selected", "value", "selectable", "removable", "disabled"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["mcTag"] }, { type: i6.McIcon, selector: "[mc-icon]", inputs: ["color"] }], directives: [{ type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i8.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.McIconCSSStyler, selector: "[mc-icon]" }, { type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
1051
- mcSelectAnimations.transformPanel,
1052
- mcSelectAnimations.fadeInContent
1053
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1054
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelect, decorators: [{
1055
- type: Component,
1056
- args: [{ selector: 'mc-select', exportAs: 'mcSelect', inputs: ['disabled', 'tabIndex'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1057
- '[attr.id]': 'id',
1058
- '[attr.tabindex]': 'tabIndex',
1059
- '[attr.disabled]': 'disabled || null',
1060
- class: 'mc-select',
1061
- '[class.mc-disabled]': 'disabled',
1062
- '[class.mc-invalid]': 'errorState',
1063
- '(keydown)': 'handleKeydown($event)',
1064
- '(focus)': 'onFocus()',
1065
- '(blur)': 'onBlur()',
1066
- '(window:resize)': 'calculateHiddenItems()'
1067
- }, animations: [
1068
- mcSelectAnimations.transformPanel,
1069
- mcSelectAnimations.fadeInContent
1070
- ], providers: [
1071
- { provide: McFormFieldControl, useExisting: McSelect },
1072
- { provide: MC_OPTION_PARENT_COMPONENT, useExisting: McSelect }
1073
- ], template: "<div cdk-overlay-origin\r\n class=\"mc-select__trigger\"\r\n (click)=\"toggle()\"\r\n [class.mc-select__trigger_multiple]=\"multiple\"\r\n #origin=\"cdkOverlayOrigin\"\r\n #trigger>\r\n <div class=\"mc-select__matcher\" [ngSwitch]=\"empty\">\r\n <span class=\"mc-select__placeholder\" *ngSwitchCase=\"true\">{{ placeholder || '\\u00A0' }}</span>\r\n <span *ngSwitchCase=\"false\" [ngSwitch]=\"!!customTrigger\">\r\n <div *ngSwitchDefault [ngSwitch]=\"multiple\" class=\"mc-select__match-container\">\r\n <span *ngSwitchCase=\"false\" class=\"mc-select__matcher-text\">{{ triggerValue }}</span>\r\n <div *ngSwitchCase=\"true\" class=\"mc-select__match-list\">\r\n <mc-tag *ngFor=\"let option of triggerValues\"\r\n [disabled]=\"option.disabled || disabled\"\r\n [selectable]=\"false\"\r\n [class.mc-error]=\"errorState\">\r\n {{ option.viewValue }}\r\n <i mc-icon=\"mc-close-S_16\"\r\n *ngIf=\"!option.disabled && !disabled\"\r\n (click)=\"onRemoveMatcherItem(option, $event)\">\r\n </i>\r\n </mc-tag>\r\n </div>\r\n <div class=\"mc-select__match-hidden-text\" [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\">\r\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\r\n </div>\r\n </div>\r\n <ng-content select=\"mc-select-trigger\" *ngSwitchCase=\"true\"></ng-content>\r\n </span>\r\n </div>\r\n\r\n <div class=\"mc-select__cleaner\" *ngIf=\"canShowCleaner\" (click)=\"clearValue($event)\">\r\n <ng-content select=\"mc-cleaner\"></ng-content>\r\n </div>\r\n\r\n <div class=\"mc-select__arrow-wrapper\">\r\n <i class=\"mc-select__arrow\" mc-icon=\"mc-angle-down-S_16\"></i>\r\n </div>\r\n</div>\r\n\r\n<ng-template\r\n cdk-connected-overlay\r\n cdkConnectedOverlayLockPosition\r\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\r\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\r\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\r\n [cdkConnectedOverlayOrigin]=\"origin\"\r\n [cdkConnectedOverlayOpen]=\"panelOpen\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayMinWidth]=\"triggerRect?.width!\"\r\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\r\n (backdropClick)=\"close()\"\r\n (attach)=\"onAttached()\"\r\n (detach)=\"close()\">\r\n <div\r\n #panel\r\n class=\"mc-select__panel {{ getPanelTheme() }}\"\r\n [ngClass]=\"panelClass\"\r\n [style.transformOrigin]=\"transformOrigin\"\r\n [style.font-size.px]=\"triggerFontSize\"\r\n (keydown)=\"handleKeydown($event)\">\r\n\r\n <div *ngIf=\"search\" class=\"mc-select__search-container\">\r\n <ng-content select=\"[mcSelectSearch]\"></ng-content>\r\n </div>\r\n\r\n <div #optionsContainer\r\n class=\"mc-select__content\"\r\n [@fadeInContent]=\"'showing'\"\r\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\">\r\n\r\n <div *ngIf=\"isEmptySearchResult\" class=\"mc-select__no-options-message\">\r\n <ng-content select=\"[mc-select-search-empty-result]\"></ng-content>\r\n </div>\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [".mc-option{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);border:var(--mc-option-size-border-width, 2px) solid transparent;cursor:pointer;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px);-webkit-tap-highlight-color:transparent}.mc-option.mc-disabled{cursor:default}.mc-option .mc-pseudo-checkbox{margin-right:8px}.mc-option .mc-option-overlay{position:absolute;top:calc(-1 * var(--mc-option-size-border-width, 2px));left:calc(-1 * var(--mc-option-size-border-width, 2px));right:calc(-1 * var(--mc-option-size-border-width, 2px));bottom:calc(-1 * var(--mc-option-size-border-width, 2px));pointer-events:none;border-radius:inherit}.mc-option-text{display:inline-block;flex-grow:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mc-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.mc-select .mc-select__trigger{display:flex;box-sizing:border-box;position:relative;height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);cursor:pointer;padding-left:calc(var(--mc-select-size-left-padding, 12px) - var(--mc-form-field-size-border-width, 1px));padding-right:calc(var(--mc-select-size-right-padding, 6px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple{padding-left:calc(var(--mc-select-size-left-padding-multiple, 12px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple .mc-tag.mc-disabled .mc-tag__text{margin-right:7px}.mc-select.mc-disabled .mc-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.mc-select__no-options-message{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);cursor:default;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px)}.mc-select__matcher{display:flex;align-items:center;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mc-select__matcher>span{width:100%}.mc-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;max-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2)}.mc-select__match-list .mc-tag{margin-right:4px}.mc-select__match-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.mc-select__match-container .mc-select__match-hidden-text{flex:0 0 70px;align-self:center;padding:0 8px;text-align:right}.mc-select__arrow-wrapper{align-self:center}.mc-form-field-appearance-fill .mc-select__arrow-wrapper,.mc-form-field-appearance-standard .mc-select__arrow-wrapper{transform:translateY(-50%)}.mc-form-field-appearance-outline .mc-select__arrow-wrapper{transform:translateY(-25%)}.mc-select__panel{min-width:100%;max-width:var(--mc-select-panel-size-max-width, 640px);overflow:hidden;border-width:var(--mc-select-panel-size-border-width, 1px);border-style:solid;border-bottom-left-radius:var(--mc-select-panel-size-border-radius, 4px);border-bottom-right-radius:var(--mc-select-panel-size-border-radius, 4px)}.mc-select__panel .mc-optgroup-label,.mc-select__panel .mc-option{font-size:inherit;line-height:var(--mc-option-size-height, 32px);height:var(--mc-option-size-height, 32px)}.mc-select__content{max-height:var(--mc-select-panel-size-max-height, 232px);padding:var(--mc-select-panel-size-vertical-padding, 4px) 0;overflow:auto}.mc-select__content .cdk-virtual-scroll-viewport{min-height:var(--mc-select-panel-size-max-height, 232px)-8px;max-height:var(--mc-select-panel-size-max-height, 232px)-8px}.mc-form-field-type-select:not(.mc-disabled) .mc-form-field-flex{cursor:pointer}.mc-select__search-container{border-bottom-width:1px;border-bottom-style:solid}\n"] }]
1074
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i1.ErrorStateMatcher }, { type: i0.ElementRef }, { type: undefined, decorators: [{
1075
- type: Optional
1076
- }, {
1077
- type: Inject,
1078
- args: [NG_VALIDATORS]
1079
- }] }, { type: i3.Directionality, decorators: [{
1080
- type: Optional
1081
- }] }, { type: i4.NgForm, decorators: [{
1082
- type: Optional
1083
- }] }, { type: i4.FormGroupDirective, decorators: [{
1084
- type: Optional
1085
- }] }, { type: i1$1.McFormField, decorators: [{
1086
- type: Optional
1087
- }] }, { type: i4.NgControl, decorators: [{
1088
- type: Self
1089
- }, {
1090
- type: Optional
1091
- }] }, { type: i4.NgModel, decorators: [{
1092
- type: Optional
1093
- }, {
1094
- type: Self
1095
- }] }, { type: i4.FormControlName, decorators: [{
1096
- type: Optional
1097
- }, {
1098
- type: Self
1099
- }] }, { type: undefined, decorators: [{
1100
- type: Inject,
1101
- args: [MC_SELECT_SCROLL_STRATEGY]
1102
- }] }, { type: undefined, decorators: [{
1103
- type: Optional
1104
- }, {
1105
- type: Inject,
1106
- args: [MC_VALIDATION]
1107
- }] }]; }, propDecorators: { trigger: [{
1108
- type: ViewChild,
1109
- args: ['trigger', { static: false }]
1110
- }], panel: [{
1111
- type: ViewChild,
1112
- args: ['panel', { static: false }]
1113
- }], optionsContainer: [{
1114
- type: ViewChild,
1115
- args: ['optionsContainer', { static: false }]
1116
- }], overlayDir: [{
1117
- type: ViewChild,
1118
- args: [CdkConnectedOverlay, { static: false }]
1119
- }], tags: [{
1120
- type: ViewChildren,
1121
- args: [McTag]
1122
- }], customTrigger: [{
1123
- type: ContentChild,
1124
- args: [McSelectTrigger, { static: false }]
1125
- }], cleaner: [{
1126
- type: ContentChild,
1127
- args: ['mcSelectCleaner', { static: true }]
1128
- }], options: [{
1129
- type: ContentChildren,
1130
- args: [McOption, { descendants: true }]
1131
- }], optionGroups: [{
1132
- type: ContentChildren,
1133
- args: [McOptgroup]
1134
- }], search: [{
1135
- type: ContentChild,
1136
- args: [McSelectSearch, { static: false }]
1137
- }], hiddenItemsText: [{
1138
- type: Input
1139
- }], panelClass: [{
1140
- type: Input
1141
- }], backdropClass: [{
1142
- type: Input
1143
- }], errorStateMatcher: [{
1144
- type: Input
1145
- }], sortComparator: [{
1146
- type: Input
1147
- }], openedChange: [{
1148
- type: Output
1149
- }], openedStream: [{
1150
- type: Output,
1151
- args: ['opened']
1152
- }], closedStream: [{
1153
- type: Output,
1154
- args: ['closed']
1155
- }], selectionChange: [{
1156
- type: Output
1157
- }], valueChange: [{
1158
- type: Output
1159
- }], hasBackdrop: [{
1160
- type: Input
1161
- }], placeholder: [{
1162
- type: Input
1163
- }], required: [{
1164
- type: Input
1165
- }], multiple: [{
1166
- type: Input
1167
- }], compareWith: [{
1168
- type: Input
1169
- }], value: [{
1170
- type: Input
1171
- }], id: [{
1172
- type: Input
1173
- }], hiddenItemsTextFormatter: [{
1174
- type: Input
83
+ /* tslint:disable:no-empty */
84
+ let nextUniqueId = 0;
85
+ /** Change event object that is emitted when the select value has changed. */
86
+ class McSelectChange {
87
+ constructor(source, value) {
88
+ this.source = source;
89
+ this.value = value;
90
+ }
91
+ }
92
+ class McSelectSearch {
93
+ constructor(formField) {
94
+ this.searchChangesSubscription = new Subscription();
95
+ this.isSearchChanged = false;
96
+ formField.canCleanerClearByEsc = false;
97
+ }
98
+ focus() {
99
+ this.input.focus();
100
+ }
101
+ reset() {
102
+ this.input.ngControl.reset();
103
+ }
104
+ ngAfterContentInit() {
105
+ if (!this.input) {
106
+ throw Error('McSelectSearch does not work without mcInput');
107
+ }
108
+ if (!this.input.ngControl) {
109
+ throw Error('McSelectSearch does not work without ngControl');
110
+ }
111
+ Promise.resolve().then(() => {
112
+ this.searchChangesSubscription = this.input.ngControl.valueChanges.subscribe(() => {
113
+ this.isSearchChanged = true;
114
+ });
115
+ });
116
+ }
117
+ ngOnDestroy() {
118
+ this.searchChangesSubscription.unsubscribe();
119
+ }
120
+ handleKeydown(event) {
121
+ // tslint:disable-next-line:deprecation
122
+ if (event.keyCode === ESCAPE) {
123
+ if (this.input.value) {
124
+ this.reset();
125
+ event.stopPropagation();
126
+ }
127
+ }
128
+ // tslint:disable-next-line:deprecation
129
+ if ([SPACE, HOME, END].includes(event.keyCode)) {
130
+ event.stopPropagation();
131
+ }
132
+ }
133
+ }
134
+ /** @nocollapse */ /** @nocollapse */ McSelectSearch.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearch, deps: [{ token: i1$1.McFormField }], target: i0.ɵɵFactoryTarget.Directive });
135
+ /** @nocollapse */ /** @nocollapse */ McSelectSearch.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McSelectSearch, selector: "[mcSelectSearch]", host: { listeners: { "keydown": "handleKeydown($event)" } }, queries: [{ propertyName: "input", first: true, predicate: McInput, descendants: true }], exportAs: ["mcSelectSearch"], ngImport: i0 });
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearch, decorators: [{
137
+ type: Directive,
138
+ args: [{
139
+ selector: '[mcSelectSearch]',
140
+ exportAs: 'mcSelectSearch',
141
+ host: {
142
+ '(keydown)': 'handleKeydown($event)'
143
+ }
144
+ }]
145
+ }], ctorParameters: function () { return [{ type: i1$1.McFormField }]; }, propDecorators: { input: [{
146
+ type: ContentChild,
147
+ args: [McInput, { static: false }]
148
+ }] } });
149
+ class McSelectSearchEmptyResult {
150
+ }
151
+ /** @nocollapse */ /** @nocollapse */ McSelectSearchEmptyResult.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearchEmptyResult, deps: [], target: i0.ɵɵFactoryTarget.Directive });
152
+ /** @nocollapse */ /** @nocollapse */ McSelectSearchEmptyResult.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McSelectSearchEmptyResult, selector: "[mc-select-search-empty-result]", exportAs: ["mcSelectSearchEmptyResult"], ngImport: i0 });
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectSearchEmptyResult, decorators: [{
154
+ type: Directive,
155
+ args: [{
156
+ selector: '[mc-select-search-empty-result]',
157
+ exportAs: 'mcSelectSearchEmptyResult'
158
+ }]
159
+ }] });
160
+ class McSelectTrigger {
161
+ }
162
+ /** @nocollapse */ /** @nocollapse */ McSelectTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
163
+ /** @nocollapse */ /** @nocollapse */ McSelectTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McSelectTrigger, selector: "mc-select-trigger", ngImport: i0 });
164
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectTrigger, decorators: [{
165
+ type: Directive,
166
+ args: [{ selector: 'mc-select-trigger' }]
167
+ }] });
168
+ class McSelectBase {
169
+ constructor(elementRef, defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl) {
170
+ this.elementRef = elementRef;
171
+ this.defaultErrorStateMatcher = defaultErrorStateMatcher;
172
+ this.parentForm = parentForm;
173
+ this.parentFormGroup = parentFormGroup;
174
+ this.ngControl = ngControl;
175
+ }
176
+ }
177
+ // tslint:disable-next-line:naming-convention
178
+ const McSelectMixinBase = mixinTabIndex(mixinDisabled(mixinErrorState(McSelectBase)));
179
+ class McSelect extends McSelectMixinBase {
180
+ constructor(_changeDetectorRef, _ngZone, _renderer, defaultErrorStateMatcher, elementRef, rawValidators, _dir, parentForm, parentFormGroup, _parentFormField, ngControl, ngModel, formControlName, _scrollStrategyFactory, mcValidation) {
181
+ super(elementRef, defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl);
182
+ this._changeDetectorRef = _changeDetectorRef;
183
+ this._ngZone = _ngZone;
184
+ this._renderer = _renderer;
185
+ this.rawValidators = rawValidators;
186
+ this._dir = _dir;
187
+ this._parentFormField = _parentFormField;
188
+ this.ngModel = ngModel;
189
+ this.formControlName = formControlName;
190
+ this._scrollStrategyFactory = _scrollStrategyFactory;
191
+ this.mcValidation = mcValidation;
192
+ /** A name for this control that can be used by `mc-form-field`. */
193
+ this.controlType = 'select';
194
+ this.hiddenItems = 0;
195
+ /** The cached font-size of the trigger element. */
196
+ this.triggerFontSize = 0;
197
+ this.previousSelectionModelSelected = [];
198
+ /** The value of the select panel's transform-origin property. */
199
+ this.transformOrigin = 'top';
200
+ /** Emits when the panel element is finished transforming in. */
201
+ this.panelDoneAnimatingStream = new Subject();
202
+ /** Strategy that will be used to handle scrolling while the select panel is open. */
203
+ this.scrollStrategy = this._scrollStrategyFactory();
204
+ /**
205
+ * The y-offset of the overlay panel in relation to the trigger's top start corner.
206
+ * This must be adjusted to align the selected option text over the trigger text.
207
+ * when the panel opens. Will change based on the y-position of the selected option.
208
+ */
209
+ this.offsetY = 0;
210
+ /**
211
+ * This position config ensures that the top "start" corner of the overlay
212
+ * is aligned with with the top "start" of the origin by default (overlapping
213
+ * the trigger completely). If the panel cannot fit below the trigger, it
214
+ * will fall back to a position above the trigger.
215
+ */
216
+ this.positions = [
217
+ {
218
+ originX: 'start',
219
+ originY: 'bottom',
220
+ overlayX: 'start',
221
+ overlayY: 'top'
222
+ },
223
+ {
224
+ originX: 'start',
225
+ originY: 'top',
226
+ overlayX: 'start',
227
+ overlayY: 'bottom'
228
+ }
229
+ ];
230
+ this.hiddenItemsText = '...ещё';
231
+ this.backdropClass = 'cdk-overlay-transparent-backdrop';
232
+ /** Combined stream of all of the child options' change events. */
233
+ this.optionSelectionChanges = defer(() => {
234
+ if (this.options) {
235
+ return merge(...this.options.map((option) => option.onSelectionChange), ...this.selectionModel.selected.map((option) => option.onSelectionChange));
236
+ }
237
+ return this._ngZone.onStable
238
+ .asObservable()
239
+ .pipe(take(1), switchMap(() => this.optionSelectionChanges));
240
+ });
241
+ /** Event emitted when the select panel has been toggled. */
242
+ this.openedChange = new EventEmitter();
243
+ /** Event emitted when the select has been opened. */
244
+ this.openedStream = this.openedChange.pipe(filter((o) => o), map(() => { }));
245
+ /** Event emitted when the select has been closed. */
246
+ this.closedStream = this.openedChange.pipe(filter((o) => !o), map(() => { }));
247
+ /** Event emitted when the selected value has been changed by the user. */
248
+ this.selectionChange = new EventEmitter();
249
+ /**
250
+ * Event that emits whenever the raw value of the select changes. This is here primarily
251
+ * to facilitate the two-way binding for the `value` input.
252
+ * @docs-private
253
+ */
254
+ this.valueChange = new EventEmitter();
255
+ this._hasBackdrop = false;
256
+ this._required = false;
257
+ this._multiple = false;
258
+ this._disabled = false;
259
+ this._focused = false;
260
+ this.panelOpen = false;
261
+ this.closeSubscription = Subscription.EMPTY;
262
+ /** The scroll position of the overlay panel, calculated to center the selected option. */
263
+ this.scrollTop = 0;
264
+ /** Unique id for this input. */
265
+ this.uid = `mc-select-${nextUniqueId++}`;
266
+ /** Emits whenever the component is destroyed. */
267
+ this.destroy = new Subject();
268
+ /** `View -> model callback called when value changes` */
269
+ this.onChange = () => { };
270
+ /** `View -> model callback called when select has been touched` */
271
+ this.onTouched = () => { };
272
+ /** Comparison function to specify which option is displayed. Defaults to object equality. */
273
+ this._compareWith = (o1, o2) => o1 === o2;
274
+ if (this.ngControl) {
275
+ // Note: we provide the value accessor through here, instead of
276
+ // the `providers` to avoid running into a circular import.
277
+ this.ngControl.valueAccessor = this;
278
+ }
279
+ // Force setter to be called in case id was not specified.
280
+ this.id = this.id;
281
+ }
282
+ get hasBackdrop() {
283
+ return this._hasBackdrop;
284
+ }
285
+ set hasBackdrop(value) {
286
+ this._hasBackdrop = coerceBooleanProperty(value);
287
+ }
288
+ get placeholder() {
289
+ return this._placeholder;
290
+ }
291
+ set placeholder(value) {
292
+ this._placeholder = value;
293
+ this.stateChanges.next();
294
+ }
295
+ get required() {
296
+ return this._required;
297
+ }
298
+ set required(value) {
299
+ this._required = coerceBooleanProperty(value);
300
+ this.stateChanges.next();
301
+ }
302
+ get multiple() {
303
+ return this._multiple;
304
+ }
305
+ set multiple(value) {
306
+ if (this.selectionModel) {
307
+ throw getMcSelectDynamicMultipleError();
308
+ }
309
+ this._multiple = coerceBooleanProperty(value);
310
+ }
311
+ /**
312
+ * Function to compare the option values with the selected values. The first argument
313
+ * is a value from an option. The second is a value from the selection. A boolean
314
+ * should be returned.
315
+ */
316
+ get compareWith() {
317
+ return this._compareWith;
318
+ }
319
+ set compareWith(fn) {
320
+ /* tslint:disable-next-line:strict-type-predicates */
321
+ if (typeof fn !== 'function') {
322
+ throw getMcSelectNonFunctionValueError();
323
+ }
324
+ this._compareWith = fn;
325
+ if (this.selectionModel) {
326
+ // A different comparator means the selection could change.
327
+ this.initializeSelection();
328
+ }
329
+ }
330
+ /** Value of the select control. */
331
+ get value() {
332
+ return this._value;
333
+ }
334
+ set value(newValue) {
335
+ if (newValue !== this._value) {
336
+ this.writeValue(newValue);
337
+ this._value = newValue;
338
+ }
339
+ }
340
+ get id() {
341
+ return this._id;
342
+ }
343
+ set id(value) {
344
+ this._id = value || this.uid;
345
+ this.stateChanges.next();
346
+ }
347
+ get disabled() {
348
+ return this._disabled;
349
+ }
350
+ set disabled(value) {
351
+ this._disabled = coerceBooleanProperty(value);
352
+ if (this._parentFormField) {
353
+ this._disabled ? this._parentFormField.stopFocusMonitor() : this._parentFormField.runFocusMonitor();
354
+ }
355
+ }
356
+ /** Whether the select is focused. */
357
+ get focused() {
358
+ return this._focused || this.panelOpen;
359
+ }
360
+ set focused(value) {
361
+ this._focused = value;
362
+ }
363
+ get isEmptySearchResult() {
364
+ return this.search && this.options.length === 0 && !!this.search.input.value;
365
+ }
366
+ get canShowCleaner() {
367
+ return !this.disabled && this.cleaner && this.selectionModel.hasValue();
368
+ }
369
+ get selected() {
370
+ return this.multiple ? this.selectionModel.selected : this.selectionModel.selected[0];
371
+ }
372
+ get triggerValue() {
373
+ if (this.empty) {
374
+ return '';
375
+ }
376
+ return this.selectionModel.selected[0].viewValue;
377
+ }
378
+ get triggerValues() {
379
+ if (this.empty) {
380
+ return [];
381
+ }
382
+ const selectedOptions = this.selectionModel.selected;
383
+ if (this.isRtl()) {
384
+ selectedOptions.reverse();
385
+ }
386
+ return selectedOptions;
387
+ }
388
+ get empty() {
389
+ return !this.selectionModel || this.selectionModel.isEmpty();
390
+ }
391
+ ngOnInit() {
392
+ this.selectionModel = new SelectionModel(this.multiple);
393
+ this.stateChanges.next();
394
+ // We need `distinctUntilChanged` here, because some browsers will
395
+ // fire the animation end event twice for the same animation. See:
396
+ // https://github.com/angular/angular/issues/24084
397
+ this.panelDoneAnimatingStream
398
+ .pipe(distinctUntilChanged(), takeUntil(this.destroy))
399
+ .subscribe(() => {
400
+ if (this.panelOpen) {
401
+ this.scrollTop = 0;
402
+ if (this.search) {
403
+ this.search.focus();
404
+ }
405
+ this.openedChange.emit(true);
406
+ }
407
+ else {
408
+ this.openedChange.emit(false);
409
+ this._changeDetectorRef.markForCheck();
410
+ }
411
+ });
412
+ }
413
+ ngAfterContentInit() {
414
+ if (this.mcValidation.useValidation) {
415
+ setMosaicValidation(this, this._changeDetectorRef);
416
+ }
417
+ this.initKeyManager();
418
+ this.selectionModel.changed
419
+ .pipe(takeUntil(this.destroy))
420
+ .subscribe((event) => {
421
+ event.added.forEach((option) => option.select());
422
+ event.removed.forEach((option) => option.deselect());
423
+ });
424
+ this.options.changes
425
+ .pipe(startWith(null), takeUntil(this.destroy))
426
+ .subscribe(() => {
427
+ this.resetOptions();
428
+ this.initializeSelection();
429
+ });
430
+ }
431
+ ngAfterViewInit() {
432
+ this.tags.changes
433
+ .subscribe(() => {
434
+ setTimeout(() => this.calculateHiddenItems(), 0);
435
+ });
436
+ }
437
+ ngDoCheck() {
438
+ if (this.ngControl) {
439
+ this.updateErrorState();
440
+ }
441
+ }
442
+ ngOnChanges(changes) {
443
+ // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let
444
+ // the parent form field know to run change detection when the disabled state changes.
445
+ if (changes.disabled) {
446
+ this.stateChanges.next();
447
+ }
448
+ }
449
+ ngOnDestroy() {
450
+ this.destroy.next();
451
+ this.destroy.complete();
452
+ this.stateChanges.complete();
453
+ this.closeSubscription.unsubscribe();
454
+ }
455
+ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) {
456
+ return `${hiddenItemsText} ${hiddenItems}`;
457
+ }
458
+ clearValue($event) {
459
+ $event.stopPropagation();
460
+ this.selectionModel.clear();
461
+ this.keyManager.setActiveItem(-1);
462
+ this.propagateChanges();
463
+ }
464
+ resetSearch() {
465
+ if (!this.search) {
466
+ return;
467
+ }
468
+ this.search.reset();
469
+ /*
470
+ todo the incorrect behaviour of keyManager is possible here
471
+ to avoid first item selection (to provide correct options flipping on closed select)
472
+ we should process options update like it is the first options appearance
473
+ */
474
+ this.search.isSearchChanged = false;
475
+ }
476
+ /** Toggles the overlay panel open or closed. */
477
+ toggle() {
478
+ if (this.panelOpen) {
479
+ this.close();
480
+ }
481
+ else {
482
+ this.open();
483
+ }
484
+ }
485
+ /** Opens the overlay panel. */
486
+ open() {
487
+ if (this.disabled || !this.options?.length || this.panelOpen) {
488
+ return;
489
+ }
490
+ this.triggerRect = this.trigger.nativeElement.getBoundingClientRect();
491
+ // Note: The computed font-size will be a string pixel value (e.g. "16px").
492
+ // `parseInt` ignores the trailing 'px' and converts this to a number.
493
+ this.triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement)['font-size']);
494
+ this.panelOpen = true;
495
+ this.keyManager.withHorizontalOrientation(null);
496
+ this.highlightCorrectOption();
497
+ this._changeDetectorRef.markForCheck();
498
+ // Set the font size on the panel element once it exists.
499
+ this._ngZone.onStable.asObservable()
500
+ .pipe(take(1))
501
+ .subscribe(() => {
502
+ this.scrollActiveOptionIntoView();
503
+ if (this.triggerFontSize && this.overlayDir.overlayRef && this.overlayDir.overlayRef.overlayElement) {
504
+ this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
505
+ }
506
+ });
507
+ }
508
+ /** Closes the overlay panel and focuses the host element. */
509
+ close() {
510
+ if (!this.panelOpen) {
511
+ return;
512
+ }
513
+ // the order of calls is important
514
+ this.resetSearch();
515
+ this.panelOpen = false;
516
+ this.keyManager.withHorizontalOrientation(this.isRtl() ? 'rtl' : 'ltr');
517
+ this._changeDetectorRef.markForCheck();
518
+ this.onTouched();
519
+ }
520
+ /**
521
+ * Sets the select's value. Part of the ControlValueAccessor interface
522
+ * required to integrate with Angular's core forms API.
523
+ *
524
+ * @param value New value to be written to the model.
525
+ */
526
+ writeValue(value) {
527
+ if (this.options) {
528
+ this.setSelectionByValue(value);
529
+ }
530
+ }
531
+ /**
532
+ * Saves a callback function to be invoked when the select's value
533
+ * changes from user input. Part of the ControlValueAccessor interface
534
+ * required to integrate with Angular's core forms API.
535
+ *
536
+ * @param fn Callback to be triggered when the value changes.
537
+ */
538
+ registerOnChange(fn) {
539
+ this.onChange = fn;
540
+ }
541
+ /**
542
+ * Saves a callback function to be invoked when the select is blurred
543
+ * by the user. Part of the ControlValueAccessor interface required
544
+ * to integrate with Angular's core forms API.
545
+ *
546
+ * @param fn Callback to be triggered when the component has been touched.
547
+ */
548
+ registerOnTouched(fn) {
549
+ this.onTouched = fn;
550
+ }
551
+ /**
552
+ * Disables the select. Part of the ControlValueAccessor interface required
553
+ * to integrate with Angular's core forms API.
554
+ *
555
+ * @param isDisabled Sets whether the component is disabled.
556
+ */
557
+ setDisabledState(isDisabled) {
558
+ this.disabled = isDisabled;
559
+ this._changeDetectorRef.markForCheck();
560
+ this.stateChanges.next();
561
+ }
562
+ isRtl() {
563
+ return this._dir ? this._dir.value === 'rtl' : false;
564
+ }
565
+ handleKeydown(event) {
566
+ if (this.disabled) {
567
+ return;
568
+ }
569
+ if (this.panelOpen) {
570
+ this.handleOpenKeydown(event);
571
+ }
572
+ else {
573
+ this.handleClosedKeydown(event);
574
+ }
575
+ }
576
+ onFocus() {
577
+ if (!this.disabled) {
578
+ this._focused = true;
579
+ this.stateChanges.next();
580
+ }
581
+ }
582
+ /**
583
+ * Calls the touched callback only if the panel is closed. Otherwise, the trigger will
584
+ * "blur" to the panel when it opens, causing a false positive.
585
+ */
586
+ onBlur() {
587
+ this._focused = false;
588
+ if (!this.disabled && !this.panelOpen) {
589
+ this.onTouched();
590
+ this._changeDetectorRef.markForCheck();
591
+ this.stateChanges.next();
592
+ }
593
+ }
594
+ /**
595
+ * Callback that is invoked when the overlay panel has been attached.
596
+ */
597
+ onAttached() {
598
+ this.overlayDir.positionChange
599
+ .pipe(take(1))
600
+ .subscribe(() => {
601
+ this._changeDetectorRef.detectChanges();
602
+ this.setOverlayPosition();
603
+ this.optionsContainer.nativeElement.scrollTop = this.scrollTop;
604
+ this.updateScrollSize();
605
+ });
606
+ this.closeSubscription = this.closingActions()
607
+ .subscribe(() => this.close());
608
+ }
609
+ /** Returns the theme to be used on the panel. */
610
+ getPanelTheme() {
611
+ return this._parentFormField ? `mc-${this._parentFormField.color}` : '';
612
+ }
613
+ /** Focuses the select element. */
614
+ focus() {
615
+ this.elementRef.nativeElement.focus();
616
+ }
617
+ /**
618
+ * Implemented as part of McFormFieldControl.
619
+ * @docs-private
620
+ */
621
+ onContainerClick() {
622
+ this.focus();
623
+ }
624
+ /** Invoked when an option is clicked. */
625
+ onRemoveMatcherItem(option, $event) {
626
+ $event.stopPropagation();
627
+ option.deselect();
628
+ }
629
+ calculateHiddenItems() {
630
+ if (this.customTrigger || this.empty || !this.multiple) {
631
+ return;
632
+ }
633
+ let visibleItems = 0;
634
+ const totalItemsWidth = this.getTotalItemsWidthInMatcher();
635
+ let totalVisibleItemsWidth = 0;
636
+ this.tags.forEach((tag) => {
637
+ if (tag.nativeElement.offsetTop < tag.nativeElement.offsetHeight) {
638
+ totalVisibleItemsWidth += this.getItemWidth(tag.nativeElement);
639
+ visibleItems++;
640
+ }
641
+ });
642
+ this.hiddenItems = this.selected.length - visibleItems;
643
+ if (this.hiddenItems) {
644
+ const itemsCounter = this.trigger.nativeElement.querySelector('.mc-select__match-hidden-text');
645
+ const matcherList = this.trigger.nativeElement.querySelector('.mc-select__match-list');
646
+ const itemsCounterShowed = itemsCounter.offsetTop < itemsCounter.offsetHeight;
647
+ // const itemsCounterWidth: number = itemsCounter.getBoundingClientRect().width;
648
+ const itemsCounterWidth = 86;
649
+ const matcherListWidth = Math.floor(matcherList.getBoundingClientRect().width);
650
+ const matcherWidth = matcherListWidth + (itemsCounterShowed ? itemsCounterWidth : 0);
651
+ if (itemsCounterShowed && (totalItemsWidth < matcherWidth)) {
652
+ this.hiddenItems = 0;
653
+ }
654
+ if (totalVisibleItemsWidth === matcherListWidth ||
655
+ (totalVisibleItemsWidth + itemsCounterWidth) < matcherListWidth) {
656
+ this._changeDetectorRef.markForCheck();
657
+ return;
658
+ }
659
+ else if (!itemsCounterShowed && (totalItemsWidth + itemsCounterWidth) > matcherWidth) {
660
+ this.hiddenItems++;
661
+ }
662
+ }
663
+ this._changeDetectorRef.markForCheck();
664
+ }
665
+ getItemHeight() {
666
+ return this.options.first ? this.options.first.getHeight() : 0;
667
+ }
668
+ closingActions() {
669
+ return merge(this.overlayDir.overlayRef.outsidePointerEvents()
670
+ .pipe(filter((event) => !this.elementRef.nativeElement.contains(event.target))), this.overlayDir.overlayRef.detachments());
671
+ }
672
+ getHeightOfOptionsContainer() {
673
+ return this.optionsContainer.nativeElement.getClientRects()[0].height;
674
+ }
675
+ updateScrollSize() {
676
+ if (!this.options.first) {
677
+ return;
678
+ }
679
+ this.keyManager.withScrollSize(Math.floor(this.getHeightOfOptionsContainer() / this.options.first.getHeight()));
680
+ }
681
+ getTotalItemsWidthInMatcher() {
682
+ const triggerClone = this.trigger.nativeElement.cloneNode(true);
683
+ triggerClone.querySelector('.mc-select__match-hidden-text').remove();
684
+ this._renderer.setStyle(triggerClone, 'position', 'absolute');
685
+ this._renderer.setStyle(triggerClone, 'visibility', 'hidden');
686
+ this._renderer.setStyle(triggerClone, 'top', '-100%');
687
+ this._renderer.setStyle(triggerClone, 'left', '0');
688
+ this._renderer.appendChild(this.trigger.nativeElement, triggerClone);
689
+ let totalItemsWidth = 0;
690
+ triggerClone.querySelectorAll('mc-tag').forEach((item) => {
691
+ totalItemsWidth += this.getItemWidth(item);
692
+ });
693
+ triggerClone.remove();
694
+ return totalItemsWidth;
695
+ }
696
+ getItemWidth(element) {
697
+ const computedStyle = window.getComputedStyle(element);
698
+ const width = parseInt(computedStyle.width);
699
+ const marginLeft = parseInt(computedStyle.marginLeft);
700
+ const marginRight = parseInt(computedStyle.marginRight);
701
+ return width + marginLeft + marginRight;
702
+ }
703
+ /** Handles keyboard events while the select is closed. */
704
+ handleClosedKeydown(event) {
705
+ /* tslint:disable-next-line */
706
+ const keyCode = event.keyCode;
707
+ const isArrowKey = [DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW].includes(keyCode);
708
+ const isOpenKey = [ENTER, SPACE].includes(keyCode);
709
+ // Open the select on ALT + arrow key to match the native <select>
710
+ if (isOpenKey || ((this.multiple || event.altKey) && isArrowKey)) {
711
+ event.preventDefault(); // prevents the page from scrolling down when pressing space
712
+ this.open();
713
+ }
714
+ else if (!this.multiple) {
715
+ this.keyManager.onKeydown(event);
716
+ }
717
+ }
718
+ /** Handles keyboard events when the selected is open. */
719
+ handleOpenKeydown(event) {
720
+ /* tslint:disable-next-line */
721
+ const keyCode = event.keyCode;
722
+ const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
723
+ if (isArrowKey && event.altKey) {
724
+ // Close the select on ALT + arrow key to match the native <select>
725
+ event.preventDefault();
726
+ this.close();
727
+ }
728
+ else if (keyCode === HOME) {
729
+ event.preventDefault();
730
+ this.keyManager.setFirstItemActive();
731
+ }
732
+ else if (keyCode === END) {
733
+ event.preventDefault();
734
+ this.keyManager.setLastItemActive();
735
+ }
736
+ else if (keyCode === PAGE_UP) {
737
+ event.preventDefault();
738
+ this.keyManager.setPreviousPageItemActive();
739
+ }
740
+ else if (keyCode === PAGE_DOWN) {
741
+ event.preventDefault();
742
+ this.keyManager.setNextPageItemActive();
743
+ }
744
+ else if ((keyCode === ENTER || keyCode === SPACE) && this.keyManager.activeItem) {
745
+ event.preventDefault();
746
+ this.keyManager.activeItem.selectViaInteraction();
747
+ }
748
+ else if (this._multiple && keyCode === A && event.ctrlKey) {
749
+ event.preventDefault();
750
+ const hasDeselectedOptions = this.options.some((option) => !option.selected);
751
+ this.options.forEach((option) => {
752
+ if (hasDeselectedOptions && !option.disabled) {
753
+ option.select();
754
+ }
755
+ else {
756
+ option.deselect();
757
+ }
758
+ });
759
+ }
760
+ else {
761
+ const previouslyFocusedIndex = this.keyManager.activeItemIndex;
762
+ this.keyManager.onKeydown(event);
763
+ if (this._multiple && isArrowKey && event.shiftKey && this.keyManager.activeItem &&
764
+ this.keyManager.activeItemIndex !== previouslyFocusedIndex) {
765
+ this.keyManager.activeItem.selectViaInteraction();
766
+ }
767
+ if (this.search) {
768
+ this.search.focus();
769
+ }
770
+ }
771
+ }
772
+ initializeSelection() {
773
+ // Defer setting the value in order to avoid the "Expression
774
+ // has changed after it was checked" errors from Angular.
775
+ Promise.resolve().then(() => {
776
+ this.setSelectionByValue(this.ngControl ? this.ngControl.value : this._value);
777
+ });
778
+ }
779
+ /**
780
+ * Sets the selected option based on a value. If no option can be
781
+ * found with the designated value, the select trigger is cleared.
782
+ */
783
+ setSelectionByValue(value) {
784
+ this.previousSelectionModelSelected = this.selectionModel.selected;
785
+ if (this.multiple && value) {
786
+ if (!Array.isArray(value)) {
787
+ throw getMcSelectNonArrayValueError();
788
+ }
789
+ this.selectionModel.clear();
790
+ value.forEach((currentValue) => this.selectValue(currentValue));
791
+ this.sortValues();
792
+ }
793
+ else {
794
+ this.selectionModel.clear();
795
+ const correspondingOption = this.selectValue(value);
796
+ // Shift focus to the active item. Note that we shouldn't do this in multiple
797
+ // mode, because we don't know what option the user interacted with last.
798
+ if (correspondingOption) {
799
+ this.keyManager.setActiveItem(correspondingOption);
800
+ }
801
+ }
802
+ this._changeDetectorRef.markForCheck();
803
+ }
804
+ getCorrespondOption(value) {
805
+ return [
806
+ ...this.options.toArray(),
807
+ ...this.previousSelectionModelSelected
808
+ ].find((option) => {
809
+ try {
810
+ // Treat null as a special reset value.
811
+ return option.value != null && this.compareWith(option.value, value);
812
+ }
813
+ catch (error) {
814
+ if (isDevMode()) {
815
+ // Notify developers of errors in their comparator.
816
+ console.warn(error);
817
+ }
818
+ return false;
819
+ }
820
+ });
821
+ }
822
+ /**
823
+ * Finds and selects and option based on its value.
824
+ * @returns Option that has the corresponding value.
825
+ */
826
+ selectValue(value) {
827
+ const correspondingOption = this.getCorrespondOption(value);
828
+ if (correspondingOption) {
829
+ this.selectionModel.select(correspondingOption);
830
+ }
831
+ return correspondingOption;
832
+ }
833
+ /** Sets up a key manager to listen to keyboard events on the overlay panel. */
834
+ initKeyManager() {
835
+ const typeAheadDebounce = 200;
836
+ this.keyManager = new ActiveDescendantKeyManager(this.options)
837
+ .withTypeAhead(typeAheadDebounce, this.search ? -1 : 0)
838
+ .withVerticalOrientation()
839
+ .withHorizontalOrientation(this.isRtl() ? 'rtl' : 'ltr');
840
+ this.keyManager.tabOut
841
+ .pipe(takeUntil(this.destroy))
842
+ .subscribe(() => {
843
+ // Restore focus to the trigger before closing. Ensures that the focus
844
+ // position won't be lost if the user got focus into the overlay.
845
+ this.focus();
846
+ this.close();
847
+ });
848
+ this.keyManager.change
849
+ .pipe(takeUntil(this.destroy))
850
+ .subscribe(() => {
851
+ if (this.panelOpen && this.panel) {
852
+ this.scrollActiveOptionIntoView();
853
+ }
854
+ else if (!this.panelOpen && !this.multiple && this.keyManager.activeItem) {
855
+ this.keyManager.activeItem.selectViaInteraction();
856
+ }
857
+ });
858
+ }
859
+ /** Drops current option subscriptions and IDs and resets from scratch. */
860
+ resetOptions() {
861
+ const changedOrDestroyed = merge(this.options.changes, this.destroy);
862
+ this.optionSelectionChanges
863
+ .pipe(takeUntil(changedOrDestroyed))
864
+ .subscribe((event) => {
865
+ this.onSelect(event.source, event.isUserInput);
866
+ if (this.search && this.search.isSearchChanged) {
867
+ Promise.resolve().then(() => this.keyManager.updateActiveItem(0));
868
+ this.search.isSearchChanged = false;
869
+ }
870
+ if (event.isUserInput && !this.multiple && this.panelOpen) {
871
+ this.close();
872
+ this.focus();
873
+ }
874
+ });
875
+ // Listen to changes in the internal state of the options and react accordingly.
876
+ // Handles cases like the labels of the selected options changing.
877
+ merge(...this.options.map((option) => option.stateChanges))
878
+ .pipe(takeUntil(changedOrDestroyed))
879
+ .subscribe(() => {
880
+ this._changeDetectorRef.markForCheck();
881
+ this.stateChanges.next();
882
+ });
883
+ }
884
+ /** Invoked when an option is clicked. */
885
+ onSelect(option, isUserInput) {
886
+ const wasSelected = this.selectionModel.isSelected(option);
887
+ if (option.value == null && !this._multiple) {
888
+ option.deselect();
889
+ this.selectionModel.clear();
890
+ this.propagateChanges(option.value);
891
+ }
892
+ else {
893
+ if (option.selected) {
894
+ this.selectionModel.select(option);
895
+ }
896
+ else {
897
+ this.selectionModel.deselect(option);
898
+ }
899
+ if (isUserInput) {
900
+ this.keyManager.setActiveItem(option);
901
+ }
902
+ if (this.multiple) {
903
+ this.sortValues();
904
+ if (isUserInput) {
905
+ // In case the user selected the option with their mouse, we
906
+ // want to restore focus back to the trigger, in order to
907
+ // prevent the select keyboard controls from clashing with
908
+ // the ones from `mc-option`.
909
+ // If search is avaliable then we focus search again.
910
+ if (this.search) {
911
+ this.search.focus();
912
+ }
913
+ else {
914
+ this.focus();
915
+ }
916
+ }
917
+ }
918
+ }
919
+ if (wasSelected !== this.selectionModel.isSelected(option)) {
920
+ this.propagateChanges();
921
+ }
922
+ this.stateChanges.next();
923
+ }
924
+ /** Sorts the selected values in the selected based on their order in the panel. */
925
+ sortValues() {
926
+ if (this.multiple) {
927
+ const options = this.options.toArray();
928
+ this.selectionModel.sort((a, b) => {
929
+ return this.sortComparator ? this.sortComparator(a, b, options) :
930
+ options.indexOf(a) - options.indexOf(b);
931
+ });
932
+ this.stateChanges.next();
933
+ }
934
+ }
935
+ /** Emits change event to set the model value. */
936
+ propagateChanges(fallbackValue) {
937
+ let valueToEmit = null;
938
+ if (this.multiple) {
939
+ valueToEmit = this.selected.map((option) => option.value);
940
+ }
941
+ else {
942
+ valueToEmit = this.selected ? this.selected.value : fallbackValue;
943
+ }
944
+ this._value = valueToEmit;
945
+ this.valueChange.emit(valueToEmit);
946
+ this.onChange(valueToEmit);
947
+ this.selectionChange.emit(new McSelectChange(this, valueToEmit));
948
+ this._changeDetectorRef.markForCheck();
949
+ }
950
+ /**
951
+ * Highlights the selected item. If no option is selected, it will highlight
952
+ * the first item instead.
953
+ */
954
+ highlightCorrectOption() {
955
+ if (this.keyManager) {
956
+ if (this.empty) {
957
+ this.keyManager.setFirstItemActive();
958
+ }
959
+ else {
960
+ this.keyManager.setActiveItem(this.selectionModel.selected[0]);
961
+ }
962
+ }
963
+ }
964
+ /** Scrolls the active option into view. */
965
+ scrollActiveOptionIntoView() {
966
+ this.keyManager.activeItem?.focus();
967
+ }
968
+ /**
969
+ * Sets the x-offset of the overlay panel in relation to the trigger's top start corner.
970
+ * This must be adjusted to align the selected option text over the trigger text when
971
+ * the panel opens. Will change based on LTR or RTL text direction. Note that the offset
972
+ * can't be calculated until the panel has been attached, because we need to know the
973
+ * content width in order to constrain the panel within the viewport.
974
+ */
975
+ setOverlayPosition() {
976
+ this.resetOverlay();
977
+ const overlayRect = this.getOverlayRect();
978
+ // Window width without scrollbar
979
+ const windowWidth = this.getOverlayWidth();
980
+ const isRtl = this.isRtl();
981
+ /* tslint:disable-next-line:no-magic-numbers */
982
+ const paddingWidth = SELECT_PANEL_PADDING_X * 2;
983
+ let offsetX;
984
+ let overlayMaxWidth;
985
+ const selected = this.selectionModel.selected[0] || this.options.first;
986
+ offsetX = selected && selected.group ? SELECT_PANEL_INDENT_PADDING_X : SELECT_PANEL_PADDING_X;
987
+ // Invert the offset in LTR.
988
+ if (!isRtl) {
989
+ offsetX *= -1;
990
+ }
991
+ // Determine if select overflows on either side.
992
+ const leftOverflow = 0 - (overlayRect.left + offsetX - (isRtl ? paddingWidth : 0));
993
+ const rightOverflow = overlayRect.right + offsetX - windowWidth
994
+ + (isRtl ? 0 : paddingWidth);
995
+ // If the element overflows on either side, reduce the offset to allow it to fit.
996
+ if (leftOverflow > 0 || rightOverflow > 0) {
997
+ [offsetX, overlayMaxWidth] = this.calculateOverlayXPosition(overlayRect, windowWidth, offsetX);
998
+ this.overlayDir.overlayRef.overlayElement.style.maxWidth = `${overlayMaxWidth}px`;
999
+ }
1000
+ // Set the offset directly in order to avoid having to go through change detection and
1001
+ // potentially triggering "changed after it was checked" errors. Round the value to avoid
1002
+ // blurry content in some browsers.
1003
+ this.overlayDir.offsetX = Math.round(offsetX);
1004
+ this.overlayDir.overlayRef.updatePosition();
1005
+ }
1006
+ calculateOverlayXPosition(overlayRect, windowWidth, basicOffsetX) {
1007
+ let offsetX = basicOffsetX;
1008
+ const leftIndent = this.triggerRect.left;
1009
+ const rightIndent = windowWidth - this.triggerRect.right;
1010
+ // Setting direction of dropdown expansion
1011
+ const isRightDirection = leftIndent <= rightIndent;
1012
+ let maxDropdownWidth;
1013
+ let overlayMaxWidth;
1014
+ const triggerWidth = this.triggerRect.width + SELECT_PANEL_INDENT_PADDING_X;
1015
+ if (isRightDirection) {
1016
+ maxDropdownWidth = rightIndent + triggerWidth - SELECT_PANEL_VIEWPORT_PADDING;
1017
+ overlayMaxWidth = overlayRect.width < maxDropdownWidth ? overlayRect.width : maxDropdownWidth;
1018
+ }
1019
+ else {
1020
+ let leftOffset;
1021
+ maxDropdownWidth = leftIndent + triggerWidth - SELECT_PANEL_VIEWPORT_PADDING;
1022
+ if (overlayRect.width < maxDropdownWidth) {
1023
+ overlayMaxWidth = overlayRect.width;
1024
+ leftOffset = this.triggerRect.right - overlayMaxWidth;
1025
+ }
1026
+ else {
1027
+ overlayMaxWidth = maxDropdownWidth;
1028
+ leftOffset = this.triggerRect.right - (overlayMaxWidth - SELECT_PANEL_INDENT_PADDING_X);
1029
+ }
1030
+ offsetX -= this.triggerRect.left - leftOffset;
1031
+ }
1032
+ return [offsetX, overlayMaxWidth];
1033
+ }
1034
+ resetOverlay() {
1035
+ this.overlayDir.offsetX = 0;
1036
+ this.overlayDir.overlayRef.overlayElement.style.maxWidth = 'unset';
1037
+ this.overlayDir.overlayRef.updatePosition();
1038
+ }
1039
+ getOverlayRect() {
1040
+ return this.overlayDir.overlayRef.overlayElement.getBoundingClientRect();
1041
+ }
1042
+ getOverlayWidth() {
1043
+ return this.scrollStrategy._overlayRef.hostElement.clientWidth;
1044
+ }
1045
+ }
1046
+ /** @nocollapse */ /** @nocollapse */ McSelect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelect, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i1.ErrorStateMatcher }, { token: i0.ElementRef }, { token: NG_VALIDATORS, optional: true }, { token: i3.Directionality, optional: true }, { token: i4.NgForm, optional: true }, { token: i4.FormGroupDirective, optional: true }, { token: i1$1.McFormField, optional: true }, { token: i4.NgControl, optional: true, self: true }, { token: i4.NgModel, optional: true, self: true }, { token: i4.FormControlName, optional: true, self: true }, { token: MC_SELECT_SCROLL_STRATEGY }, { token: MC_VALIDATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1047
+ /** @nocollapse */ /** @nocollapse */ McSelect.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: McSelect, selector: "mc-select", inputs: { disabled: "disabled", tabIndex: "tabIndex", hiddenItemsText: "hiddenItemsText", panelClass: "panelClass", backdropClass: "backdropClass", errorStateMatcher: "errorStateMatcher", sortComparator: "sortComparator", hasBackdrop: "hasBackdrop", placeholder: "placeholder", required: "required", multiple: "multiple", compareWith: "compareWith", value: "value", id: "id", hiddenItemsTextFormatter: "hiddenItemsTextFormatter" }, outputs: { openedChange: "openedChange", openedStream: "opened", closedStream: "closed", selectionChange: "selectionChange", valueChange: "valueChange" }, host: { listeners: { "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()", "window:resize": "calculateHiddenItems()" }, properties: { "attr.id": "id", "attr.tabindex": "tabIndex", "attr.disabled": "disabled || null", "class.mc-disabled": "disabled", "class.mc-invalid": "errorState" }, classAttribute: "mc-select" }, providers: [
1048
+ { provide: McFormFieldControl, useExisting: McSelect },
1049
+ { provide: MC_OPTION_PARENT_COMPONENT, useExisting: McSelect }
1050
+ ], queries: [{ propertyName: "customTrigger", first: true, predicate: McSelectTrigger, descendants: true }, { propertyName: "cleaner", first: true, predicate: ["mcSelectCleaner"], descendants: true, static: true }, { propertyName: "search", first: true, predicate: McSelectSearch, descendants: true }, { propertyName: "options", predicate: McOption, descendants: true }, { propertyName: "optionGroups", predicate: McOptgroup }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: McTag, descendants: true }], exportAs: ["mcSelect"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div cdk-overlay-origin\n class=\"mc-select__trigger\"\n (click)=\"toggle()\"\n [class.mc-select__trigger_multiple]=\"multiple\"\n #origin=\"cdkOverlayOrigin\"\n #trigger>\n <div class=\"mc-select__matcher\" [ngSwitch]=\"empty\">\n <span class=\"mc-select__placeholder\" *ngSwitchCase=\"true\">{{ placeholder || '\\u00A0' }}</span>\n <span *ngSwitchCase=\"false\" [ngSwitch]=\"!!customTrigger\">\n <div *ngSwitchDefault [ngSwitch]=\"multiple\" class=\"mc-select__match-container\">\n <span *ngSwitchCase=\"false\" class=\"mc-select__matcher-text\">{{ triggerValue }}</span>\n <div *ngSwitchCase=\"true\" class=\"mc-select__match-list\">\n <mc-tag *ngFor=\"let option of triggerValues\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n [class.mc-error]=\"errorState\">\n {{ option.viewValue }}\n <i mc-icon=\"mc-close-S_16\" mcTagRemove\n *ngIf=\"!option.disabled && !disabled\"\n (click)=\"onRemoveMatcherItem(option, $event)\">\n </i>\n </mc-tag>\n </div>\n <div class=\"mc-select__match-hidden-text\" [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\">\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n </div>\n <ng-content select=\"mc-select-trigger\" *ngSwitchCase=\"true\"></ng-content>\n </span>\n </div>\n\n <div class=\"mc-select__cleaner\" *ngIf=\"canShowCleaner\" (click)=\"clearValue($event)\">\n <ng-content select=\"mc-cleaner\"></ng-content>\n </div>\n\n <div class=\"mc-select__arrow-wrapper\">\n <i class=\"mc-select__arrow\" mc-icon=\"mc-angle-down-S_16\"></i>\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"triggerRect?.width!\"\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\n (backdropClick)=\"close()\"\n (attach)=\"onAttached()\"\n (detach)=\"close()\">\n <div\n #panel\n class=\"mc-select__panel {{ getPanelTheme() }}\"\n [ngClass]=\"panelClass\"\n [style.transformOrigin]=\"transformOrigin\"\n [style.font-size.px]=\"triggerFontSize\"\n (keydown)=\"handleKeydown($event)\">\n\n <div *ngIf=\"search\" class=\"mc-select__search-container\">\n <ng-content select=\"[mcSelectSearch]\"></ng-content>\n </div>\n\n <div #optionsContainer\n class=\"mc-select__content\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\">\n\n <div *ngIf=\"isEmptySearchResult\" class=\"mc-select__no-options-message\">\n <ng-content select=\"[mc-select-search-empty-result]\"></ng-content>\n </div>\n <ng-content></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: [".mc-option{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);border:var(--mc-option-size-border-width, 2px) solid transparent;cursor:pointer;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px);-webkit-tap-highlight-color:transparent}.mc-option.mc-disabled{cursor:default}.mc-option .mc-pseudo-checkbox{margin-right:8px}.mc-option .mc-option-overlay{position:absolute;top:calc(-1 * var(--mc-option-size-border-width, 2px));left:calc(-1 * var(--mc-option-size-border-width, 2px));right:calc(-1 * var(--mc-option-size-border-width, 2px));bottom:calc(-1 * var(--mc-option-size-border-width, 2px));pointer-events:none;border-radius:inherit}.mc-option-text{display:inline-block;flex-grow:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mc-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.mc-select .mc-select__trigger{display:flex;box-sizing:border-box;position:relative;height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);cursor:pointer;padding-left:calc(var(--mc-select-size-left-padding, 12px) - var(--mc-form-field-size-border-width, 1px));padding-right:calc(var(--mc-select-size-right-padding, 6px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple{padding-left:calc(var(--mc-select-size-left-padding-multiple, 12px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple .mc-tag.mc-disabled .mc-tag__text{margin-right:7px}.mc-select.mc-disabled .mc-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.mc-select__no-options-message{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);cursor:default;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px)}.mc-select__matcher{display:flex;align-items:center;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mc-select__matcher>span{width:100%}.mc-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;max-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2)}.mc-select__match-list .mc-tag{margin-right:4px}.mc-select__match-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.mc-select__match-container .mc-select__match-hidden-text{flex:0 0 70px;align-self:center;padding:0 8px;text-align:right}.mc-select__arrow-wrapper{align-self:center}.mc-form-field-appearance-fill .mc-select__arrow-wrapper,.mc-form-field-appearance-standard .mc-select__arrow-wrapper{transform:translateY(-50%)}.mc-form-field-appearance-outline .mc-select__arrow-wrapper{transform:translateY(-25%)}.mc-select__panel{min-width:100%;max-width:var(--mc-select-panel-size-max-width, 640px);overflow:hidden;border-width:var(--mc-select-panel-size-border-width, 1px);border-style:solid;border-bottom-left-radius:var(--mc-select-panel-size-border-radius, 4px);border-bottom-right-radius:var(--mc-select-panel-size-border-radius, 4px)}.mc-select__panel .mc-optgroup-label,.mc-select__panel .mc-option{font-size:inherit;line-height:var(--mc-option-size-height, 32px);height:var(--mc-option-size-height, 32px)}.mc-select__content{max-height:var(--mc-select-panel-size-max-height, 232px);padding:var(--mc-select-panel-size-vertical-padding, 4px) 0;overflow:auto}.mc-select__content .cdk-virtual-scroll-viewport{min-height:var(--mc-select-panel-size-max-height, 232px)-8px;max-height:var(--mc-select-panel-size-max-height, 232px)-8px}.mc-form-field-type-select:not(.mc-disabled) .mc-form-field-flex{cursor:pointer}.mc-select__search-container{border-bottom-width:1px;border-bottom-style:solid}\n"], components: [{ type: i5.McTag, selector: "mc-tag, [mc-tag], mc-basic-tag, [mc-basic-tag]", inputs: ["color", "selected", "value", "selectable", "removable", "disabled"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["mcTag"] }, { type: i6.McIcon, selector: "[mc-icon]", inputs: ["color"] }], directives: [{ type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i8.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.McIconCSSStyler, selector: "[mc-icon]" }, { type: i5.McTagRemove, selector: "[mcTagRemove]" }, { type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
1051
+ mcSelectAnimations.transformPanel,
1052
+ mcSelectAnimations.fadeInContent
1053
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1054
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelect, decorators: [{
1055
+ type: Component,
1056
+ args: [{ selector: 'mc-select', exportAs: 'mcSelect', inputs: ['disabled', 'tabIndex'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1057
+ '[attr.id]': 'id',
1058
+ '[attr.tabindex]': 'tabIndex',
1059
+ '[attr.disabled]': 'disabled || null',
1060
+ class: 'mc-select',
1061
+ '[class.mc-disabled]': 'disabled',
1062
+ '[class.mc-invalid]': 'errorState',
1063
+ '(keydown)': 'handleKeydown($event)',
1064
+ '(focus)': 'onFocus()',
1065
+ '(blur)': 'onBlur()',
1066
+ '(window:resize)': 'calculateHiddenItems()'
1067
+ }, animations: [
1068
+ mcSelectAnimations.transformPanel,
1069
+ mcSelectAnimations.fadeInContent
1070
+ ], providers: [
1071
+ { provide: McFormFieldControl, useExisting: McSelect },
1072
+ { provide: MC_OPTION_PARENT_COMPONENT, useExisting: McSelect }
1073
+ ], template: "<div cdk-overlay-origin\n class=\"mc-select__trigger\"\n (click)=\"toggle()\"\n [class.mc-select__trigger_multiple]=\"multiple\"\n #origin=\"cdkOverlayOrigin\"\n #trigger>\n <div class=\"mc-select__matcher\" [ngSwitch]=\"empty\">\n <span class=\"mc-select__placeholder\" *ngSwitchCase=\"true\">{{ placeholder || '\\u00A0' }}</span>\n <span *ngSwitchCase=\"false\" [ngSwitch]=\"!!customTrigger\">\n <div *ngSwitchDefault [ngSwitch]=\"multiple\" class=\"mc-select__match-container\">\n <span *ngSwitchCase=\"false\" class=\"mc-select__matcher-text\">{{ triggerValue }}</span>\n <div *ngSwitchCase=\"true\" class=\"mc-select__match-list\">\n <mc-tag *ngFor=\"let option of triggerValues\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n [class.mc-error]=\"errorState\">\n {{ option.viewValue }}\n <i mc-icon=\"mc-close-S_16\" mcTagRemove\n *ngIf=\"!option.disabled && !disabled\"\n (click)=\"onRemoveMatcherItem(option, $event)\">\n </i>\n </mc-tag>\n </div>\n <div class=\"mc-select__match-hidden-text\" [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\">\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n </div>\n <ng-content select=\"mc-select-trigger\" *ngSwitchCase=\"true\"></ng-content>\n </span>\n </div>\n\n <div class=\"mc-select__cleaner\" *ngIf=\"canShowCleaner\" (click)=\"clearValue($event)\">\n <ng-content select=\"mc-cleaner\"></ng-content>\n </div>\n\n <div class=\"mc-select__arrow-wrapper\">\n <i class=\"mc-select__arrow\" mc-icon=\"mc-angle-down-S_16\"></i>\n </div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"triggerRect?.width!\"\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\n (backdropClick)=\"close()\"\n (attach)=\"onAttached()\"\n (detach)=\"close()\">\n <div\n #panel\n class=\"mc-select__panel {{ getPanelTheme() }}\"\n [ngClass]=\"panelClass\"\n [style.transformOrigin]=\"transformOrigin\"\n [style.font-size.px]=\"triggerFontSize\"\n (keydown)=\"handleKeydown($event)\">\n\n <div *ngIf=\"search\" class=\"mc-select__search-container\">\n <ng-content select=\"[mcSelectSearch]\"></ng-content>\n </div>\n\n <div #optionsContainer\n class=\"mc-select__content\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\">\n\n <div *ngIf=\"isEmptySearchResult\" class=\"mc-select__no-options-message\">\n <ng-content select=\"[mc-select-search-empty-result]\"></ng-content>\n </div>\n <ng-content></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: [".mc-option{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);border:var(--mc-option-size-border-width, 2px) solid transparent;cursor:pointer;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px);-webkit-tap-highlight-color:transparent}.mc-option.mc-disabled{cursor:default}.mc-option .mc-pseudo-checkbox{margin-right:8px}.mc-option .mc-option-overlay{position:absolute;top:calc(-1 * var(--mc-option-size-border-width, 2px));left:calc(-1 * var(--mc-option-size-border-width, 2px));right:calc(-1 * var(--mc-option-size-border-width, 2px));bottom:calc(-1 * var(--mc-option-size-border-width, 2px));pointer-events:none;border-radius:inherit}.mc-option-text{display:inline-block;flex-grow:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mc-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.mc-select .mc-select__trigger{display:flex;box-sizing:border-box;position:relative;height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);cursor:pointer;padding-left:calc(var(--mc-select-size-left-padding, 12px) - var(--mc-form-field-size-border-width, 1px));padding-right:calc(var(--mc-select-size-right-padding, 6px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple{padding-left:calc(var(--mc-select-size-left-padding-multiple, 12px) - var(--mc-form-field-size-border-width, 1px))}.mc-select .mc-select__trigger.mc-select__trigger_multiple .mc-tag.mc-disabled .mc-tag__text{margin-right:7px}.mc-select.mc-disabled .mc-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.mc-select__no-options-message{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--mc-option-size-height, 32px);cursor:default;outline:none;padding-left:var(--mc-option-size-horizontal-padding, 12px);padding-right:var(--mc-option-size-horizontal-padding, 12px)}.mc-select__matcher{display:flex;align-items:center;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mc-select__matcher>span{width:100%}.mc-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;max-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2)}.mc-select__match-list .mc-tag{margin-right:4px}.mc-select__match-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.mc-select__match-container .mc-select__match-hidden-text{flex:0 0 70px;align-self:center;padding:0 8px;text-align:right}.mc-select__arrow-wrapper{align-self:center}.mc-form-field-appearance-fill .mc-select__arrow-wrapper,.mc-form-field-appearance-standard .mc-select__arrow-wrapper{transform:translateY(-50%)}.mc-form-field-appearance-outline .mc-select__arrow-wrapper{transform:translateY(-25%)}.mc-select__panel{min-width:100%;max-width:var(--mc-select-panel-size-max-width, 640px);overflow:hidden;border-width:var(--mc-select-panel-size-border-width, 1px);border-style:solid;border-bottom-left-radius:var(--mc-select-panel-size-border-radius, 4px);border-bottom-right-radius:var(--mc-select-panel-size-border-radius, 4px)}.mc-select__panel .mc-optgroup-label,.mc-select__panel .mc-option{font-size:inherit;line-height:var(--mc-option-size-height, 32px);height:var(--mc-option-size-height, 32px)}.mc-select__content{max-height:var(--mc-select-panel-size-max-height, 232px);padding:var(--mc-select-panel-size-vertical-padding, 4px) 0;overflow:auto}.mc-select__content .cdk-virtual-scroll-viewport{min-height:var(--mc-select-panel-size-max-height, 232px)-8px;max-height:var(--mc-select-panel-size-max-height, 232px)-8px}.mc-form-field-type-select:not(.mc-disabled) .mc-form-field-flex{cursor:pointer}.mc-select__search-container{border-bottom-width:1px;border-bottom-style:solid}\n"] }]
1074
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i1.ErrorStateMatcher }, { type: i0.ElementRef }, { type: undefined, decorators: [{
1075
+ type: Optional
1076
+ }, {
1077
+ type: Inject,
1078
+ args: [NG_VALIDATORS]
1079
+ }] }, { type: i3.Directionality, decorators: [{
1080
+ type: Optional
1081
+ }] }, { type: i4.NgForm, decorators: [{
1082
+ type: Optional
1083
+ }] }, { type: i4.FormGroupDirective, decorators: [{
1084
+ type: Optional
1085
+ }] }, { type: i1$1.McFormField, decorators: [{
1086
+ type: Optional
1087
+ }] }, { type: i4.NgControl, decorators: [{
1088
+ type: Self
1089
+ }, {
1090
+ type: Optional
1091
+ }] }, { type: i4.NgModel, decorators: [{
1092
+ type: Optional
1093
+ }, {
1094
+ type: Self
1095
+ }] }, { type: i4.FormControlName, decorators: [{
1096
+ type: Optional
1097
+ }, {
1098
+ type: Self
1099
+ }] }, { type: undefined, decorators: [{
1100
+ type: Inject,
1101
+ args: [MC_SELECT_SCROLL_STRATEGY]
1102
+ }] }, { type: undefined, decorators: [{
1103
+ type: Optional
1104
+ }, {
1105
+ type: Inject,
1106
+ args: [MC_VALIDATION]
1107
+ }] }]; }, propDecorators: { trigger: [{
1108
+ type: ViewChild,
1109
+ args: ['trigger', { static: false }]
1110
+ }], panel: [{
1111
+ type: ViewChild,
1112
+ args: ['panel', { static: false }]
1113
+ }], optionsContainer: [{
1114
+ type: ViewChild,
1115
+ args: ['optionsContainer', { static: false }]
1116
+ }], overlayDir: [{
1117
+ type: ViewChild,
1118
+ args: [CdkConnectedOverlay, { static: false }]
1119
+ }], tags: [{
1120
+ type: ViewChildren,
1121
+ args: [McTag]
1122
+ }], customTrigger: [{
1123
+ type: ContentChild,
1124
+ args: [McSelectTrigger, { static: false }]
1125
+ }], cleaner: [{
1126
+ type: ContentChild,
1127
+ args: ['mcSelectCleaner', { static: true }]
1128
+ }], options: [{
1129
+ type: ContentChildren,
1130
+ args: [McOption, { descendants: true }]
1131
+ }], optionGroups: [{
1132
+ type: ContentChildren,
1133
+ args: [McOptgroup]
1134
+ }], search: [{
1135
+ type: ContentChild,
1136
+ args: [McSelectSearch, { static: false }]
1137
+ }], hiddenItemsText: [{
1138
+ type: Input
1139
+ }], panelClass: [{
1140
+ type: Input
1141
+ }], backdropClass: [{
1142
+ type: Input
1143
+ }], errorStateMatcher: [{
1144
+ type: Input
1145
+ }], sortComparator: [{
1146
+ type: Input
1147
+ }], openedChange: [{
1148
+ type: Output
1149
+ }], openedStream: [{
1150
+ type: Output,
1151
+ args: ['opened']
1152
+ }], closedStream: [{
1153
+ type: Output,
1154
+ args: ['closed']
1155
+ }], selectionChange: [{
1156
+ type: Output
1157
+ }], valueChange: [{
1158
+ type: Output
1159
+ }], hasBackdrop: [{
1160
+ type: Input
1161
+ }], placeholder: [{
1162
+ type: Input
1163
+ }], required: [{
1164
+ type: Input
1165
+ }], multiple: [{
1166
+ type: Input
1167
+ }], compareWith: [{
1168
+ type: Input
1169
+ }], value: [{
1170
+ type: Input
1171
+ }], id: [{
1172
+ type: Input
1173
+ }], hiddenItemsTextFormatter: [{
1174
+ type: Input
1175
1175
  }] } });
1176
1176
 
1177
- class McSelectModule {
1178
- }
1179
- /** @nocollapse */ /** @nocollapse */ McSelectModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1180
- /** @nocollapse */ /** @nocollapse */ McSelectModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, declarations: [McSelect,
1181
- McSelectSearch,
1182
- McSelectSearchEmptyResult,
1183
- McSelectTrigger,
1184
- McOptionTooltip], imports: [CommonModule,
1185
- OverlayModule,
1186
- McOptionModule,
1187
- McIconModule,
1188
- McTagsModule,
1189
- McToolTipModule], exports: [McFormFieldModule,
1190
- McSelect,
1191
- McSelectSearch,
1192
- McSelectSearchEmptyResult,
1193
- McSelectTrigger,
1194
- McOptionTooltip,
1195
- McOptionModule,
1196
- CommonModule] });
1197
- /** @nocollapse */ /** @nocollapse */ McSelectModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, providers: [MC_SELECT_SCROLL_STRATEGY_PROVIDER], imports: [[
1198
- CommonModule,
1199
- OverlayModule,
1200
- McOptionModule,
1201
- McIconModule,
1202
- McTagsModule,
1203
- McToolTipModule
1204
- ], McFormFieldModule,
1205
- McOptionModule,
1206
- CommonModule] });
1207
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, decorators: [{
1208
- type: NgModule,
1209
- args: [{
1210
- imports: [
1211
- CommonModule,
1212
- OverlayModule,
1213
- McOptionModule,
1214
- McIconModule,
1215
- McTagsModule,
1216
- McToolTipModule
1217
- ],
1218
- exports: [
1219
- McFormFieldModule,
1220
- McSelect,
1221
- McSelectSearch,
1222
- McSelectSearchEmptyResult,
1223
- McSelectTrigger,
1224
- McOptionTooltip,
1225
- McOptionModule,
1226
- CommonModule
1227
- ],
1228
- declarations: [
1229
- McSelect,
1230
- McSelectSearch,
1231
- McSelectSearchEmptyResult,
1232
- McSelectTrigger,
1233
- McOptionTooltip
1234
- ],
1235
- providers: [MC_SELECT_SCROLL_STRATEGY_PROVIDER]
1236
- }]
1177
+ class McSelectModule {
1178
+ }
1179
+ /** @nocollapse */ /** @nocollapse */ McSelectModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1180
+ /** @nocollapse */ /** @nocollapse */ McSelectModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, declarations: [McSelect,
1181
+ McSelectSearch,
1182
+ McSelectSearchEmptyResult,
1183
+ McSelectTrigger,
1184
+ McOptionTooltip], imports: [CommonModule,
1185
+ OverlayModule,
1186
+ McOptionModule,
1187
+ McIconModule,
1188
+ McTagsModule,
1189
+ McToolTipModule], exports: [McFormFieldModule,
1190
+ McSelect,
1191
+ McSelectSearch,
1192
+ McSelectSearchEmptyResult,
1193
+ McSelectTrigger,
1194
+ McOptionTooltip,
1195
+ McOptionModule,
1196
+ CommonModule] });
1197
+ /** @nocollapse */ /** @nocollapse */ McSelectModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, providers: [MC_SELECT_SCROLL_STRATEGY_PROVIDER], imports: [[
1198
+ CommonModule,
1199
+ OverlayModule,
1200
+ McOptionModule,
1201
+ McIconModule,
1202
+ McTagsModule,
1203
+ McToolTipModule
1204
+ ], McFormFieldModule,
1205
+ McOptionModule,
1206
+ CommonModule] });
1207
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McSelectModule, decorators: [{
1208
+ type: NgModule,
1209
+ args: [{
1210
+ imports: [
1211
+ CommonModule,
1212
+ OverlayModule,
1213
+ McOptionModule,
1214
+ McIconModule,
1215
+ McTagsModule,
1216
+ McToolTipModule
1217
+ ],
1218
+ exports: [
1219
+ McFormFieldModule,
1220
+ McSelect,
1221
+ McSelectSearch,
1222
+ McSelectSearchEmptyResult,
1223
+ McSelectTrigger,
1224
+ McOptionTooltip,
1225
+ McOptionModule,
1226
+ CommonModule
1227
+ ],
1228
+ declarations: [
1229
+ McSelect,
1230
+ McSelectSearch,
1231
+ McSelectSearchEmptyResult,
1232
+ McSelectTrigger,
1233
+ McOptionTooltip
1234
+ ],
1235
+ providers: [MC_SELECT_SCROLL_STRATEGY_PROVIDER]
1236
+ }]
1237
1237
  }] });
1238
1238
 
1239
- /**
1240
- * Generated bundle index. Do not edit.
1239
+ /**
1240
+ * Generated bundle index. Do not edit.
1241
1241
  */
1242
1242
 
1243
1243
  export { McOptionTooltip, McSelect, McSelectBase, McSelectChange, McSelectModule, McSelectSearch, McSelectSearchEmptyResult, McSelectTrigger };