@ptsecurity/mosaic 13.4.0 → 13.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (922) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +6 -6
  3. package/_theming.scss +7141 -6963
  4. package/_visual.scss +2695 -2658
  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 -21
  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 -16
  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 -172
  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 -39
  110. package/design-tokens/legacy-2017/tokens/components/datepicker.json5 +64 -64
  111. package/design-tokens/legacy-2017/tokens/components/divider.json5 +14 -8
  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/modal.json5 +81 -81
  121. package/design-tokens/legacy-2017/tokens/components/navbar.json5 +70 -70
  122. package/design-tokens/legacy-2017/tokens/components/optgroup.json5 +10 -10
  123. package/design-tokens/legacy-2017/tokens/components/option.json5 +12 -12
  124. package/design-tokens/legacy-2017/tokens/components/popover.json5 +68 -68
  125. package/design-tokens/legacy-2017/tokens/components/popup.json5 +16 -18
  126. package/design-tokens/legacy-2017/tokens/components/progress-bar.json5 +13 -13
  127. package/design-tokens/legacy-2017/tokens/components/progress-spinner.json5 +7 -7
  128. package/design-tokens/legacy-2017/tokens/components/radio.json5 +45 -44
  129. package/design-tokens/legacy-2017/tokens/components/select.json5 +24 -24
  130. package/design-tokens/legacy-2017/tokens/components/sidepanel.json5 +44 -32
  131. package/design-tokens/legacy-2017/tokens/components/table.json5 +15 -15
  132. package/design-tokens/legacy-2017/tokens/components/tabs.json5 +101 -101
  133. package/design-tokens/legacy-2017/tokens/components/tags.json5 +134 -131
  134. package/design-tokens/legacy-2017/tokens/components/textarea.json5 +12 -12
  135. package/design-tokens/legacy-2017/tokens/components/timepicker.json5 +7 -7
  136. package/design-tokens/legacy-2017/tokens/components/toggle.json5 +79 -79
  137. package/design-tokens/legacy-2017/tokens/components/tooltip.json5 +83 -83
  138. package/design-tokens/legacy-2017/tokens/components/tree.json5 +15 -15
  139. package/design-tokens/legacy-2017/tokens/properties/aliases.json5 +3 -3
  140. package/design-tokens/legacy-2017/tokens/properties/colors.json5 +119 -118
  141. package/design-tokens/legacy-2017/tokens/properties/font.json5 +12 -12
  142. package/design-tokens/legacy-2017/tokens/properties/globals.json5 +49 -49
  143. package/design-tokens/legacy-2017/tokens/properties/padding.json5 +3 -3
  144. package/design-tokens/legacy-2017/tokens/properties/palette.json5 +163 -163
  145. package/design-tokens/legacy-2017/tokens/properties/typography.json5 +175 -175
  146. package/design-tokens/legacy-2017/tokens.d.ts +7844 -7810
  147. package/design-tokens/pt-2022/tokens/components/alert.json5 +83 -83
  148. package/design-tokens/pt-2022/tokens/components/autocomplete.json5 +11 -11
  149. package/design-tokens/pt-2022/tokens/components/badge.json5 +174 -174
  150. package/design-tokens/pt-2022/tokens/components/button-toggle.json5 +10 -10
  151. package/design-tokens/pt-2022/tokens/components/button.json5 +142 -142
  152. package/design-tokens/pt-2022/tokens/components/card.json5 +51 -51
  153. package/design-tokens/pt-2022/tokens/components/checkbox.json5 +97 -39
  154. package/design-tokens/pt-2022/tokens/components/datepicker.json5 +64 -64
  155. package/design-tokens/pt-2022/tokens/components/divider.json5 +14 -8
  156. package/design-tokens/pt-2022/tokens/components/dl.json5 +38 -38
  157. package/design-tokens/pt-2022/tokens/components/dropdown.json5 +48 -48
  158. package/design-tokens/pt-2022/tokens/components/form-field.json5 +92 -92
  159. package/design-tokens/pt-2022/tokens/components/forms.json5 +52 -52
  160. package/design-tokens/pt-2022/tokens/components/icon.json5 +104 -104
  161. package/design-tokens/pt-2022/tokens/components/input.json5 +12 -12
  162. package/design-tokens/pt-2022/tokens/components/link.json5 +50 -50
  163. package/design-tokens/pt-2022/tokens/components/list.json5 +13 -13
  164. package/design-tokens/pt-2022/tokens/components/modal.json5 +81 -81
  165. package/design-tokens/pt-2022/tokens/components/navbar.json5 +70 -70
  166. package/design-tokens/pt-2022/tokens/components/optgroup.json5 +10 -10
  167. package/design-tokens/pt-2022/tokens/components/option.json5 +12 -12
  168. package/design-tokens/pt-2022/tokens/components/popover.json5 +68 -68
  169. package/design-tokens/pt-2022/tokens/components/popup.json5 +16 -18
  170. package/design-tokens/pt-2022/tokens/components/progress-bar.json5 +13 -13
  171. package/design-tokens/pt-2022/tokens/components/progress-spinner.json5 +7 -7
  172. package/design-tokens/pt-2022/tokens/components/radio.json5 +45 -44
  173. package/design-tokens/pt-2022/tokens/components/select.json5 +24 -24
  174. package/design-tokens/pt-2022/tokens/components/sidepanel.json5 +44 -32
  175. package/design-tokens/pt-2022/tokens/components/table.json5 +15 -15
  176. package/design-tokens/pt-2022/tokens/components/tabs.json5 +101 -101
  177. package/design-tokens/pt-2022/tokens/components/tags.json5 +137 -131
  178. package/design-tokens/pt-2022/tokens/components/textarea.json5 +12 -12
  179. package/design-tokens/pt-2022/tokens/components/timepicker.json5 +7 -7
  180. package/design-tokens/pt-2022/tokens/components/toggle.json5 +79 -79
  181. package/design-tokens/pt-2022/tokens/components/tooltip.json5 +83 -83
  182. package/design-tokens/pt-2022/tokens/components/tree.json5 +15 -15
  183. package/design-tokens/pt-2022/tokens/properties/aliases.json5 +3 -3
  184. package/design-tokens/pt-2022/tokens/properties/colors.json5 +122 -120
  185. package/design-tokens/pt-2022/tokens/properties/font.json5 +15 -15
  186. package/design-tokens/pt-2022/tokens/properties/globals.json5 +49 -49
  187. package/design-tokens/pt-2022/tokens/properties/padding.json5 +3 -3
  188. package/design-tokens/pt-2022/tokens/properties/palette.json5 +232 -232
  189. package/design-tokens/pt-2022/tokens/properties/typography.json5 +175 -175
  190. package/design-tokens/pt-2022/tokens.d.ts +9176 -9139
  191. package/design-tokens/ptsecurity-mosaic-design-tokens.d.ts +5 -5
  192. package/design-tokens/public-api.d.ts +3 -3
  193. package/design-tokens/style-dictionary/build.js +63 -62
  194. package/design-tokens/style-dictionary/configs/css.js +13 -13
  195. package/design-tokens/style-dictionary/configs/index.js +48 -48
  196. package/design-tokens/style-dictionary/configs/js.js +9 -9
  197. package/design-tokens/style-dictionary/configs/scss.js +23 -23
  198. package/design-tokens/style-dictionary/filters/color.js +7 -7
  199. package/design-tokens/style-dictionary/filters/palette.js +7 -7
  200. package/design-tokens/style-dictionary/filters/size.js +7 -7
  201. package/design-tokens/style-dictionary/filters/typography.js +7 -7
  202. package/design-tokens/style-dictionary/formats/palette.js +25 -25
  203. package/design-tokens/style-dictionary/formats/typography.js +52 -52
  204. package/design-tokens/style-dictionary/transformGroups/css.js +13 -13
  205. package/design-tokens/style-dictionary/transformGroups/scss.js +12 -12
  206. package/design-tokens/style-dictionary/transformGroups/ts.js +11 -0
  207. package/design-tokens/style-dictionary/transforms/attribute/palette.js +9 -9
  208. package/design-tokens/style-dictionary/transforms/attribute/prefix.js +11 -11
  209. package/design-tokens/style-dictionary/transforms/attribute/size.js +8 -8
  210. package/design-tokens/style-dictionary/transforms/attribute/typography.js +9 -9
  211. package/divider/divider.component.d.ts +11 -11
  212. package/divider/divider.module.d.ts +8 -8
  213. package/divider/index.d.ts +1 -1
  214. package/divider/ptsecurity-mosaic-divider.d.ts +5 -5
  215. package/divider/public-api.d.ts +2 -2
  216. package/dl/dl.component.d.ts +26 -26
  217. package/dl/dl.module.d.ts +10 -10
  218. package/dl/index.d.ts +1 -1
  219. package/dl/ptsecurity-mosaic-dl.d.ts +5 -5
  220. package/dl/public-api.d.ts +2 -2
  221. package/dropdown/dropdown-animations.d.ts +11 -11
  222. package/dropdown/dropdown-content.directive.d.ts +32 -32
  223. package/dropdown/dropdown-errors.d.ts +17 -17
  224. package/dropdown/dropdown-item.component.d.ts +50 -50
  225. package/dropdown/dropdown-trigger.directive.d.ts +136 -136
  226. package/dropdown/dropdown.component.d.ts +121 -121
  227. package/dropdown/dropdown.module.d.ts +13 -13
  228. package/dropdown/dropdown.types.d.ts +53 -53
  229. package/dropdown/index.d.ts +1 -1
  230. package/dropdown/ptsecurity-mosaic-dropdown.d.ts +5 -5
  231. package/dropdown/public-api.d.ts +8 -8
  232. package/esm2020/autocomplete/autocomplete-origin.directive.mjs +21 -21
  233. package/esm2020/autocomplete/autocomplete-trigger.directive.mjs +555 -555
  234. package/esm2020/autocomplete/autocomplete.component.mjs +154 -154
  235. package/esm2020/autocomplete/autocomplete.module.mjs +34 -34
  236. package/esm2020/autocomplete/index.mjs +2 -2
  237. package/esm2020/autocomplete/ptsecurity-mosaic-autocomplete.mjs +4 -4
  238. package/esm2020/autocomplete/public-api.mjs +5 -5
  239. package/esm2020/button/button.component.mjs +137 -137
  240. package/esm2020/button/button.module.mjs +38 -38
  241. package/esm2020/button/index.mjs +2 -2
  242. package/esm2020/button/ptsecurity-mosaic-button.mjs +4 -4
  243. package/esm2020/button/public-api.mjs +3 -3
  244. package/esm2020/button-toggle/button-toggle.component.mjs +362 -362
  245. package/esm2020/button-toggle/button-toggle.module.mjs +19 -19
  246. package/esm2020/button-toggle/index.mjs +2 -2
  247. package/esm2020/button-toggle/ptsecurity-mosaic-button-toggle.mjs +4 -4
  248. package/esm2020/button-toggle/public-api.mjs +3 -3
  249. package/esm2020/card/card.component.mjs +80 -80
  250. package/esm2020/card/card.module.mjs +30 -30
  251. package/esm2020/card/index.mjs +2 -2
  252. package/esm2020/card/ptsecurity-mosaic-card.mjs +4 -4
  253. package/esm2020/card/public-api.mjs +3 -3
  254. package/esm2020/checkbox/checkbox-config.mjs +6 -6
  255. package/esm2020/checkbox/checkbox-module.mjs +19 -19
  256. package/esm2020/checkbox/checkbox-required-validator.mjs +27 -27
  257. package/esm2020/checkbox/checkbox.mjs +316 -315
  258. package/esm2020/checkbox/index.mjs +2 -2
  259. package/esm2020/checkbox/ptsecurity-mosaic-checkbox.mjs +4 -4
  260. package/esm2020/checkbox/public-api.mjs +5 -5
  261. package/esm2020/core/animation/animation.mjs +8 -8
  262. package/esm2020/core/animation/fade-animations.mjs +9 -9
  263. package/esm2020/core/animation/index.mjs +4 -4
  264. package/esm2020/core/animation/select-animations.mjs +45 -45
  265. package/esm2020/core/common-behaviors/color.mjs +30 -30
  266. package/esm2020/core/common-behaviors/common-module.mjs +83 -83
  267. package/esm2020/core/common-behaviors/constructor.mjs +2 -2
  268. package/esm2020/core/common-behaviors/disabled.mjs +17 -17
  269. package/esm2020/core/common-behaviors/error-state.mjs +31 -31
  270. package/esm2020/core/common-behaviors/index.mjs +6 -6
  271. package/esm2020/core/common-behaviors/tabindex.mjs +18 -18
  272. package/esm2020/core/error/error-options.mjs +26 -26
  273. package/esm2020/core/formatters/date/formatter.mjs +359 -359
  274. package/esm2020/core/formatters/date/templates/en-US.mjs +281 -281
  275. package/esm2020/core/formatters/date/templates/ru-RU.mjs +281 -281
  276. package/esm2020/core/formatters/index.mjs +20 -20
  277. package/esm2020/core/formatters/number/formatter.mjs +105 -105
  278. package/esm2020/core/forms/forms-module.mjs +24 -24
  279. package/esm2020/core/forms/forms.directive.mjs +66 -66
  280. package/esm2020/core/forms/index.mjs +3 -3
  281. package/esm2020/core/highlight/highlight.pipe.mjs +17 -17
  282. package/esm2020/core/highlight/index.mjs +19 -19
  283. package/esm2020/core/index.mjs +2 -2
  284. package/esm2020/core/label/label-options.mjs +4 -4
  285. package/esm2020/core/line/line.mjs +70 -70
  286. package/esm2020/core/option/action.mjs +121 -121
  287. package/esm2020/core/option/index.mjs +5 -5
  288. package/esm2020/core/option/optgroup.mjs +31 -31
  289. package/esm2020/core/option/option-module.mjs +21 -21
  290. package/esm2020/core/option/option.mjs +257 -257
  291. package/esm2020/core/overlay/overlay-position-map.mjs +244 -244
  292. package/esm2020/core/pop-up/constants.mjs +34 -34
  293. package/esm2020/core/pop-up/index.mjs +4 -4
  294. package/esm2020/core/pop-up/pop-up-trigger.mjs +239 -239
  295. package/esm2020/core/pop-up/pop-up.mjs +94 -94
  296. package/esm2020/core/ptsecurity-mosaic-core.mjs +4 -4
  297. package/esm2020/core/public-api.mjs +18 -18
  298. package/esm2020/core/select/constants.mjs +27 -27
  299. package/esm2020/core/select/errors.mjs +26 -26
  300. package/esm2020/core/select/events.mjs +2 -2
  301. package/esm2020/core/select/index.mjs +4 -4
  302. package/esm2020/core/selection/constants.mjs +6 -6
  303. package/esm2020/core/selection/index.mjs +4 -4
  304. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +49 -37
  305. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +18 -18
  306. package/esm2020/core/services/measure-scrollbar.service.mjs +48 -48
  307. package/esm2020/core/utils/index.mjs +2 -2
  308. package/esm2020/core/utils/public-api.mjs +2 -2
  309. package/esm2020/core/utils/utils.mjs +5 -5
  310. package/esm2020/core/validation/index.mjs +2 -2
  311. package/esm2020/core/validation/validation.mjs +118 -89
  312. package/esm2020/core/version.mjs +3 -3
  313. package/esm2020/datepicker/calendar-body.component.mjs +106 -106
  314. package/esm2020/datepicker/calendar.component.mjs +362 -362
  315. package/esm2020/datepicker/datepicker-animations.mjs +32 -32
  316. package/esm2020/datepicker/datepicker-errors.mjs +6 -6
  317. package/esm2020/datepicker/datepicker-input.directive.mjs +938 -900
  318. package/esm2020/datepicker/datepicker-intl.mjs +40 -40
  319. package/esm2020/datepicker/datepicker-module.mjs +107 -107
  320. package/esm2020/datepicker/datepicker-toggle.component.mjs +86 -86
  321. package/esm2020/datepicker/datepicker.component.mjs +404 -408
  322. package/esm2020/datepicker/index.mjs +2 -2
  323. package/esm2020/datepicker/month-view.component.mjs +257 -257
  324. package/esm2020/datepicker/multi-year-view.component.mjs +218 -218
  325. package/esm2020/datepicker/ptsecurity-mosaic-datepicker.mjs +4 -4
  326. package/esm2020/datepicker/public-api.mjs +12 -12
  327. package/esm2020/datepicker/year-view.component.mjs +253 -253
  328. package/esm2020/design-tokens/index.mjs +2 -2
  329. package/esm2020/design-tokens/legacy-2017/tokens.mjs +1138 -1104
  330. package/esm2020/design-tokens/pt-2022/tokens.mjs +1208 -1171
  331. package/esm2020/design-tokens/ptsecurity-mosaic-design-tokens.mjs +4 -4
  332. package/esm2020/design-tokens/public-api.mjs +4 -4
  333. package/esm2020/divider/divider.component.mjs +39 -39
  334. package/esm2020/divider/divider.module.mjs +18 -18
  335. package/esm2020/divider/index.mjs +2 -2
  336. package/esm2020/divider/ptsecurity-mosaic-divider.mjs +4 -4
  337. package/esm2020/divider/public-api.mjs +3 -3
  338. package/esm2020/dl/dl.component.mjs +78 -78
  339. package/esm2020/dl/dl.module.mjs +42 -42
  340. package/esm2020/dl/index.mjs +2 -2
  341. package/esm2020/dl/ptsecurity-mosaic-dl.mjs +4 -4
  342. package/esm2020/dl/public-api.mjs +3 -3
  343. package/esm2020/dropdown/dropdown-animations.mjs +41 -41
  344. package/esm2020/dropdown/dropdown-content.directive.mjs +64 -64
  345. package/esm2020/dropdown/dropdown-errors.mjs +29 -29
  346. package/esm2020/dropdown/dropdown-item.component.mjs +139 -139
  347. package/esm2020/dropdown/dropdown-trigger.directive.mjs +489 -489
  348. package/esm2020/dropdown/dropdown.component.mjs +292 -292
  349. package/esm2020/dropdown/dropdown.module.mjs +50 -50
  350. package/esm2020/dropdown/dropdown.types.mjs +24 -24
  351. package/esm2020/dropdown/index.mjs +2 -2
  352. package/esm2020/dropdown/ptsecurity-mosaic-dropdown.mjs +4 -4
  353. package/esm2020/dropdown/public-api.mjs +9 -9
  354. package/esm2020/form-field/cleaner.mjs +23 -23
  355. package/esm2020/form-field/form-field-control.mjs +5 -5
  356. package/esm2020/form-field/form-field-errors.mjs +7 -7
  357. package/esm2020/form-field/form-field.mjs +225 -225
  358. package/esm2020/form-field/form-field.module.mjs +57 -57
  359. package/esm2020/form-field/hint.mjs +23 -23
  360. package/esm2020/form-field/index.mjs +2 -2
  361. package/esm2020/form-field/password-hint.mjs +139 -134
  362. package/esm2020/form-field/prefix.mjs +13 -13
  363. package/esm2020/form-field/ptsecurity-mosaic-form-field.mjs +4 -4
  364. package/esm2020/form-field/public-api.mjs +11 -11
  365. package/esm2020/form-field/stepper.mjs +55 -55
  366. package/esm2020/form-field/suffix.mjs +13 -13
  367. package/esm2020/icon/icon.component.mjs +44 -44
  368. package/esm2020/icon/icon.module.mjs +38 -38
  369. package/esm2020/icon/index.mjs +2 -2
  370. package/esm2020/icon/ptsecurity-mosaic-icon.mjs +4 -4
  371. package/esm2020/icon/public-api.mjs +3 -3
  372. package/esm2020/index.mjs +2 -2
  373. package/esm2020/input/index.mjs +2 -2
  374. package/esm2020/input/input-errors.mjs +4 -4
  375. package/esm2020/input/input-number-validators.mjs +92 -92
  376. package/esm2020/input/input-number.mjs +163 -163
  377. package/esm2020/input/input-password.mjs +372 -368
  378. package/esm2020/input/input-value-accessor.mjs +3 -3
  379. package/esm2020/input/input.mjs +334 -334
  380. package/esm2020/input/input.module.mjs +65 -65
  381. package/esm2020/input/ptsecurity-mosaic-input.mjs +4 -4
  382. package/esm2020/input/public-api.mjs +7 -7
  383. package/esm2020/link/index.mjs +2 -2
  384. package/esm2020/link/link.component.mjs +107 -107
  385. package/esm2020/link/link.module.mjs +26 -26
  386. package/esm2020/link/ptsecurity-mosaic-link.mjs +4 -4
  387. package/esm2020/link/public-api.mjs +3 -3
  388. package/esm2020/list/index.mjs +2 -2
  389. package/esm2020/list/list-selection.component.mjs +686 -687
  390. package/esm2020/list/list.component.mjs +44 -44
  391. package/esm2020/list/list.module.mjs +55 -55
  392. package/esm2020/list/ptsecurity-mosaic-list.mjs +4 -4
  393. package/esm2020/list/public-api.mjs +4 -4
  394. package/esm2020/modal/css-unit.pipe.mjs +17 -17
  395. package/esm2020/modal/index.mjs +2 -2
  396. package/esm2020/modal/modal-control.service.mjs +85 -85
  397. package/esm2020/modal/modal-ref.class.mjs +8 -8
  398. package/esm2020/modal/modal-util.mjs +17 -17
  399. package/esm2020/modal/modal.component.mjs +501 -501
  400. package/esm2020/modal/modal.directive.mjs +52 -52
  401. package/esm2020/modal/modal.module.mjs +72 -72
  402. package/esm2020/modal/modal.service.mjs +124 -124
  403. package/esm2020/modal/modal.type.mjs +7 -7
  404. package/esm2020/modal/ptsecurity-mosaic-modal.mjs +4 -4
  405. package/esm2020/modal/public-api.mjs +7 -7
  406. package/esm2020/navbar/index.mjs +2 -2
  407. package/esm2020/navbar/navbar-item.component.mjs +582 -582
  408. package/esm2020/navbar/navbar.component.mjs +237 -237
  409. package/esm2020/navbar/navbar.module.mjs +92 -92
  410. package/esm2020/navbar/ptsecurity-mosaic-navbar.mjs +4 -4
  411. package/esm2020/navbar/public-api.mjs +5 -5
  412. package/esm2020/navbar/vertical-navbar.animation.mjs +10 -10
  413. package/esm2020/navbar/vertical-navbar.component.mjs +114 -114
  414. package/esm2020/popover/index.mjs +2 -2
  415. package/esm2020/popover/popover-animations.mjs +16 -16
  416. package/esm2020/popover/popover-confirm.component.mjs +108 -108
  417. package/esm2020/popover/popover.component.mjs +253 -253
  418. package/esm2020/popover/popover.module.mjs +24 -24
  419. package/esm2020/popover/ptsecurity-mosaic-popover.mjs +4 -4
  420. package/esm2020/popover/public-api.mjs +5 -5
  421. package/esm2020/progress-bar/index.mjs +2 -2
  422. package/esm2020/progress-bar/progress-bar.component.mjs +42 -42
  423. package/esm2020/progress-bar/progress-bar.module.mjs +30 -30
  424. package/esm2020/progress-bar/ptsecurity-mosaic-progress-bar.mjs +4 -4
  425. package/esm2020/progress-bar/public-api.mjs +3 -3
  426. package/esm2020/progress-spinner/index.mjs +2 -2
  427. package/esm2020/progress-spinner/progress-spinner.component.mjs +46 -46
  428. package/esm2020/progress-spinner/progress-spinner.module.mjs +30 -30
  429. package/esm2020/progress-spinner/ptsecurity-mosaic-progress-spinner.mjs +4 -4
  430. package/esm2020/progress-spinner/public-api.mjs +3 -3
  431. package/esm2020/ptsecurity-mosaic.mjs +4 -4
  432. package/esm2020/public-api.mjs +2 -2
  433. package/esm2020/radio/index.mjs +2 -2
  434. package/esm2020/radio/ptsecurity-mosaic-radio.mjs +4 -4
  435. package/esm2020/radio/public-api.mjs +3 -3
  436. package/esm2020/radio/radio.component.mjs +458 -458
  437. package/esm2020/radio/radio.module.mjs +20 -20
  438. package/esm2020/select/index.mjs +2 -2
  439. package/esm2020/select/ptsecurity-mosaic-select.mjs +4 -4
  440. package/esm2020/select/public-api.mjs +4 -4
  441. package/esm2020/select/select-option.directive.mjs +65 -65
  442. package/esm2020/select/select.component.mjs +1117 -1110
  443. package/esm2020/select/select.module.mjs +73 -73
  444. package/esm2020/sidebar/index.mjs +2 -2
  445. package/esm2020/sidebar/ptsecurity-mosaic-sidebar.mjs +4 -4
  446. package/esm2020/sidebar/public-api.mjs +3 -3
  447. package/esm2020/sidebar/sidebar-animations.mjs +23 -23
  448. package/esm2020/sidebar/sidebar.component.mjs +146 -146
  449. package/esm2020/sidebar/sidebar.module.mjs +30 -30
  450. package/esm2020/sidepanel/index.mjs +2 -2
  451. package/esm2020/sidepanel/ptsecurity-mosaic-sidepanel.mjs +4 -4
  452. package/esm2020/sidepanel/public-api.mjs +7 -7
  453. package/esm2020/sidepanel/sidepanel-animations.mjs +26 -26
  454. package/esm2020/sidepanel/sidepanel-config.mjs +26 -26
  455. package/esm2020/sidepanel/sidepanel-container.component.mjs +106 -106
  456. package/esm2020/sidepanel/sidepanel-directives.mjs +159 -159
  457. package/esm2020/sidepanel/sidepanel-ref.mjs +53 -53
  458. package/esm2020/sidepanel/sidepanel.module.mjs +74 -74
  459. package/esm2020/sidepanel/sidepanel.service.mjs +167 -167
  460. package/esm2020/splitter/index.mjs +2 -2
  461. package/esm2020/splitter/ptsecurity-mosaic-splitter.mjs +4 -4
  462. package/esm2020/splitter/public-api.mjs +3 -3
  463. package/esm2020/splitter/splitter.component.mjs +482 -482
  464. package/esm2020/splitter/splitter.module.mjs +40 -40
  465. package/esm2020/table/index.mjs +2 -2
  466. package/esm2020/table/ptsecurity-mosaic-table.mjs +4 -4
  467. package/esm2020/table/public-api.mjs +3 -3
  468. package/esm2020/table/table.component.mjs +16 -16
  469. package/esm2020/table/table.module.mjs +30 -30
  470. package/esm2020/tabs/index.mjs +2 -2
  471. package/esm2020/tabs/paginated-tab-header.mjs +479 -479
  472. package/esm2020/tabs/ptsecurity-mosaic-tabs.mjs +4 -4
  473. package/esm2020/tabs/public-api.mjs +11 -11
  474. package/esm2020/tabs/tab-body.component.mjs +178 -178
  475. package/esm2020/tabs/tab-content.directive.mjs +15 -15
  476. package/esm2020/tabs/tab-group.component.mjs +350 -350
  477. package/esm2020/tabs/tab-header.component.mjs +67 -67
  478. package/esm2020/tabs/tab-label-wrapper.directive.mjs +78 -78
  479. package/esm2020/tabs/tab-label.directive.mjs +17 -17
  480. package/esm2020/tabs/tab-nav-bar/index.mjs +2 -2
  481. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +110 -110
  482. package/esm2020/tabs/tab.component.mjs +133 -133
  483. package/esm2020/tabs/tabs-animations.mjs +24 -24
  484. package/esm2020/tabs/tabs.module.mjs +104 -104
  485. package/esm2020/tags/index.mjs +2 -2
  486. package/esm2020/tags/ptsecurity-mosaic-tags.mjs +4 -4
  487. package/esm2020/tags/public-api.mjs +6 -6
  488. package/esm2020/tags/tag-default-options.mjs +4 -4
  489. package/esm2020/tags/tag-input.mjs +229 -229
  490. package/esm2020/tags/tag-list.component.mjs +722 -722
  491. package/esm2020/tags/tag-text-control.mjs +2 -2
  492. package/esm2020/tags/tag.component.mjs +375 -375
  493. package/esm2020/tags/tag.module.mjs +56 -56
  494. package/esm2020/textarea/index.mjs +2 -2
  495. package/esm2020/textarea/ptsecurity-mosaic-textarea.mjs +4 -4
  496. package/esm2020/textarea/public-api.mjs +3 -3
  497. package/esm2020/textarea/textarea.component.mjs +269 -269
  498. package/esm2020/textarea/textarea.module.mjs +21 -21
  499. package/esm2020/timepicker/index.mjs +2 -2
  500. package/esm2020/timepicker/ptsecurity-mosaic-timepicker.mjs +4 -4
  501. package/esm2020/timepicker/public-api.mjs +4 -4
  502. package/esm2020/timepicker/timepicker.constants.mjs +25 -25
  503. package/esm2020/timepicker/timepicker.directive.mjs +665 -653
  504. package/esm2020/timepicker/timepicker.module.mjs +34 -34
  505. package/esm2020/toggle/index.mjs +2 -2
  506. package/esm2020/toggle/ptsecurity-mosaic-toggle.mjs +4 -4
  507. package/esm2020/toggle/public-api.mjs +3 -3
  508. package/esm2020/toggle/toggle.component.mjs +158 -158
  509. package/esm2020/toggle/toggle.module.mjs +20 -20
  510. package/esm2020/tooltip/index.mjs +2 -2
  511. package/esm2020/tooltip/ptsecurity-mosaic-tooltip.mjs +4 -4
  512. package/esm2020/tooltip/public-api.mjs +3 -3
  513. package/esm2020/tooltip/tooltip.animations.mjs +19 -19
  514. package/esm2020/tooltip/tooltip.component.mjs +295 -295
  515. package/esm2020/tooltip/tooltip.module.mjs +43 -43
  516. package/esm2020/tree/control/base-tree-control.mjs +60 -60
  517. package/esm2020/tree/control/flat-tree-control.mjs +126 -123
  518. package/esm2020/tree/control/nested-tree-control.mjs +41 -41
  519. package/esm2020/tree/control/tree-control.mjs +2 -2
  520. package/esm2020/tree/data-source/flat-data-source.mjs +162 -162
  521. package/esm2020/tree/data-source/nested-data-source.mjs +30 -30
  522. package/esm2020/tree/index.mjs +2 -2
  523. package/esm2020/tree/node.mjs +31 -31
  524. package/esm2020/tree/outlet.mjs +15 -15
  525. package/esm2020/tree/padding.directive.mjs +113 -110
  526. package/esm2020/tree/ptsecurity-mosaic-tree.mjs +4 -4
  527. package/esm2020/tree/public-api.mjs +16 -16
  528. package/esm2020/tree/toggle.mjs +80 -80
  529. package/esm2020/tree/tree-base.mjs +243 -243
  530. package/esm2020/tree/tree-errors.mjs +36 -36
  531. package/esm2020/tree/tree-option.component.mjs +248 -234
  532. package/esm2020/tree/tree-selection.component.mjs +540 -535
  533. package/esm2020/tree/tree.mjs +15 -15
  534. package/esm2020/tree/tree.module.mjs +57 -53
  535. package/esm2020/tree-select/index.mjs +2 -2
  536. package/esm2020/tree-select/ptsecurity-mosaic-tree-select.mjs +4 -4
  537. package/esm2020/tree-select/public-api.mjs +3 -3
  538. package/esm2020/tree-select/tree-select.component.mjs +939 -925
  539. package/esm2020/tree-select/tree-select.module.mjs +47 -47
  540. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs +726 -726
  541. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
  542. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs +367 -367
  543. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  544. package/fesm2015/ptsecurity-mosaic-button.mjs +160 -160
  545. package/fesm2015/ptsecurity-mosaic-button.mjs.map +1 -1
  546. package/fesm2015/ptsecurity-mosaic-card.mjs +96 -96
  547. package/fesm2015/ptsecurity-mosaic-card.mjs.map +1 -1
  548. package/fesm2015/ptsecurity-mosaic-checkbox.mjs +349 -348
  549. package/fesm2015/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  550. package/fesm2015/ptsecurity-mosaic-core.mjs +2653 -2613
  551. package/fesm2015/ptsecurity-mosaic-core.mjs.map +1 -1
  552. package/fesm2015/ptsecurity-mosaic-datepicker.mjs +2685 -2649
  553. package/fesm2015/ptsecurity-mosaic-datepicker.mjs.map +1 -1
  554. package/fesm2015/ptsecurity-mosaic-design-tokens.mjs +2391 -2286
  555. package/fesm2015/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
  556. package/fesm2015/ptsecurity-mosaic-divider.mjs +48 -48
  557. package/fesm2015/ptsecurity-mosaic-divider.mjs.map +1 -1
  558. package/fesm2015/ptsecurity-mosaic-dl.mjs +108 -108
  559. package/fesm2015/ptsecurity-mosaic-dl.mjs.map +1 -1
  560. package/fesm2015/ptsecurity-mosaic-dropdown.mjs +1069 -1069
  561. package/fesm2015/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  562. package/fesm2015/ptsecurity-mosaic-form-field.mjs +511 -506
  563. package/fesm2015/ptsecurity-mosaic-form-field.mjs.map +1 -1
  564. package/fesm2015/ptsecurity-mosaic-icon.mjs +73 -73
  565. package/fesm2015/ptsecurity-mosaic-icon.mjs.map +1 -1
  566. package/fesm2015/ptsecurity-mosaic-input.mjs +979 -975
  567. package/fesm2015/ptsecurity-mosaic-input.mjs.map +1 -1
  568. package/fesm2015/ptsecurity-mosaic-link.mjs +121 -121
  569. package/fesm2015/ptsecurity-mosaic-link.mjs.map +1 -1
  570. package/fesm2015/ptsecurity-mosaic-list.mjs +762 -763
  571. package/fesm2015/ptsecurity-mosaic-list.mjs.map +1 -1
  572. package/fesm2015/ptsecurity-mosaic-modal.mjs +824 -824
  573. package/fesm2015/ptsecurity-mosaic-modal.mjs.map +1 -1
  574. package/fesm2015/ptsecurity-mosaic-navbar.mjs +993 -993
  575. package/fesm2015/ptsecurity-mosaic-navbar.mjs.map +1 -1
  576. package/fesm2015/ptsecurity-mosaic-popover.mjs +364 -364
  577. package/fesm2015/ptsecurity-mosaic-popover.mjs.map +1 -1
  578. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs +61 -61
  579. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  580. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs +65 -65
  581. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  582. package/fesm2015/ptsecurity-mosaic-radio.mjs +464 -464
  583. package/fesm2015/ptsecurity-mosaic-radio.mjs.map +1 -1
  584. package/fesm2015/ptsecurity-mosaic-select.mjs +1213 -1205
  585. package/fesm2015/ptsecurity-mosaic-select.mjs.map +1 -1
  586. package/fesm2015/ptsecurity-mosaic-sidebar.mjs +185 -185
  587. package/fesm2015/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  588. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs +555 -555
  589. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  590. package/fesm2015/ptsecurity-mosaic-splitter.mjs +511 -511
  591. package/fesm2015/ptsecurity-mosaic-splitter.mjs.map +1 -1
  592. package/fesm2015/ptsecurity-mosaic-table.mjs +36 -36
  593. package/fesm2015/ptsecurity-mosaic-table.mjs.map +1 -1
  594. package/fesm2015/ptsecurity-mosaic-tabs.mjs +1460 -1460
  595. package/fesm2015/ptsecurity-mosaic-tabs.mjs.map +1 -1
  596. package/fesm2015/ptsecurity-mosaic-tags.mjs +1342 -1342
  597. package/fesm2015/ptsecurity-mosaic-tags.mjs.map +1 -1
  598. package/fesm2015/ptsecurity-mosaic-textarea.mjs +274 -274
  599. package/fesm2015/ptsecurity-mosaic-textarea.mjs.map +1 -1
  600. package/fesm2015/ptsecurity-mosaic-timepicker.mjs +707 -695
  601. package/fesm2015/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  602. package/fesm2015/ptsecurity-mosaic-toggle.mjs +163 -163
  603. package/fesm2015/ptsecurity-mosaic-toggle.mjs.map +1 -1
  604. package/fesm2015/ptsecurity-mosaic-tooltip.mjs +344 -344
  605. package/fesm2015/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  606. package/fesm2015/ptsecurity-mosaic-tree-select.mjs +955 -940
  607. package/fesm2015/ptsecurity-mosaic-tree-select.mjs.map +1 -1
  608. package/fesm2015/ptsecurity-mosaic-tree.mjs +1698 -1675
  609. package/fesm2015/ptsecurity-mosaic-tree.mjs.map +1 -1
  610. package/fesm2015/ptsecurity-mosaic.mjs +2 -2
  611. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs +722 -722
  612. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
  613. package/fesm2020/ptsecurity-mosaic-button-toggle.mjs +365 -365
  614. package/fesm2020/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  615. package/fesm2020/ptsecurity-mosaic-button.mjs +160 -160
  616. package/fesm2020/ptsecurity-mosaic-button.mjs.map +1 -1
  617. package/fesm2020/ptsecurity-mosaic-card.mjs +96 -96
  618. package/fesm2020/ptsecurity-mosaic-card.mjs.map +1 -1
  619. package/fesm2020/ptsecurity-mosaic-checkbox.mjs +347 -346
  620. package/fesm2020/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  621. package/fesm2020/ptsecurity-mosaic-core.mjs +2682 -2642
  622. package/fesm2020/ptsecurity-mosaic-core.mjs.map +1 -1
  623. package/fesm2020/ptsecurity-mosaic-datepicker.mjs +2670 -2635
  624. package/fesm2020/ptsecurity-mosaic-datepicker.mjs.map +1 -1
  625. package/fesm2020/ptsecurity-mosaic-design-tokens.mjs +2391 -2286
  626. package/fesm2020/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
  627. package/fesm2020/ptsecurity-mosaic-divider.mjs +48 -48
  628. package/fesm2020/ptsecurity-mosaic-divider.mjs.map +1 -1
  629. package/fesm2020/ptsecurity-mosaic-dl.mjs +108 -108
  630. package/fesm2020/ptsecurity-mosaic-dl.mjs.map +1 -1
  631. package/fesm2020/ptsecurity-mosaic-dropdown.mjs +1056 -1056
  632. package/fesm2020/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  633. package/fesm2020/ptsecurity-mosaic-form-field.mjs +496 -491
  634. package/fesm2020/ptsecurity-mosaic-form-field.mjs.map +1 -1
  635. package/fesm2020/ptsecurity-mosaic-icon.mjs +71 -71
  636. package/fesm2020/ptsecurity-mosaic-icon.mjs.map +1 -1
  637. package/fesm2020/ptsecurity-mosaic-input.mjs +968 -964
  638. package/fesm2020/ptsecurity-mosaic-input.mjs.map +1 -1
  639. package/fesm2020/ptsecurity-mosaic-link.mjs +120 -120
  640. package/fesm2020/ptsecurity-mosaic-link.mjs.map +1 -1
  641. package/fesm2020/ptsecurity-mosaic-list.mjs +755 -756
  642. package/fesm2020/ptsecurity-mosaic-list.mjs.map +1 -1
  643. package/fesm2020/ptsecurity-mosaic-modal.mjs +820 -820
  644. package/fesm2020/ptsecurity-mosaic-modal.mjs.map +1 -1
  645. package/fesm2020/ptsecurity-mosaic-navbar.mjs +977 -977
  646. package/fesm2020/ptsecurity-mosaic-navbar.mjs.map +1 -1
  647. package/fesm2020/ptsecurity-mosaic-popover.mjs +360 -360
  648. package/fesm2020/ptsecurity-mosaic-popover.mjs.map +1 -1
  649. package/fesm2020/ptsecurity-mosaic-progress-bar.mjs +61 -61
  650. package/fesm2020/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  651. package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs +65 -65
  652. package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  653. package/fesm2020/ptsecurity-mosaic-radio.mjs +462 -462
  654. package/fesm2020/ptsecurity-mosaic-radio.mjs.map +1 -1
  655. package/fesm2020/ptsecurity-mosaic-select.mjs +1208 -1201
  656. package/fesm2020/ptsecurity-mosaic-select.mjs.map +1 -1
  657. package/fesm2020/ptsecurity-mosaic-sidebar.mjs +185 -185
  658. package/fesm2020/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  659. package/fesm2020/ptsecurity-mosaic-sidepanel.mjs +552 -552
  660. package/fesm2020/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  661. package/fesm2020/ptsecurity-mosaic-splitter.mjs +511 -511
  662. package/fesm2020/ptsecurity-mosaic-splitter.mjs.map +1 -1
  663. package/fesm2020/ptsecurity-mosaic-table.mjs +36 -36
  664. package/fesm2020/ptsecurity-mosaic-table.mjs.map +1 -1
  665. package/fesm2020/ptsecurity-mosaic-tabs.mjs +1445 -1445
  666. package/fesm2020/ptsecurity-mosaic-tabs.mjs.map +1 -1
  667. package/fesm2020/ptsecurity-mosaic-tags.mjs +1335 -1335
  668. package/fesm2020/ptsecurity-mosaic-tags.mjs.map +1 -1
  669. package/fesm2020/ptsecurity-mosaic-textarea.mjs +272 -272
  670. package/fesm2020/ptsecurity-mosaic-textarea.mjs.map +1 -1
  671. package/fesm2020/ptsecurity-mosaic-timepicker.mjs +704 -692
  672. package/fesm2020/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  673. package/fesm2020/ptsecurity-mosaic-toggle.mjs +163 -163
  674. package/fesm2020/ptsecurity-mosaic-toggle.mjs.map +1 -1
  675. package/fesm2020/ptsecurity-mosaic-tooltip.mjs +336 -336
  676. package/fesm2020/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  677. package/fesm2020/ptsecurity-mosaic-tree-select.mjs +952 -938
  678. package/fesm2020/ptsecurity-mosaic-tree-select.mjs.map +1 -1
  679. package/fesm2020/ptsecurity-mosaic-tree.mjs +1685 -1662
  680. package/fesm2020/ptsecurity-mosaic-tree.mjs.map +1 -1
  681. package/fesm2020/ptsecurity-mosaic.mjs +2 -2
  682. package/form-field/cleaner.d.ts +7 -7
  683. package/form-field/form-field-control.d.ts +37 -37
  684. package/form-field/form-field-errors.d.ts +2 -2
  685. package/form-field/form-field.d.ts +69 -69
  686. package/form-field/form-field.module.d.ts +15 -15
  687. package/form-field/hint.d.ts +6 -6
  688. package/form-field/index.d.ts +1 -1
  689. package/form-field/password-hint.d.ts +40 -40
  690. package/form-field/prefix.d.ts +5 -5
  691. package/form-field/ptsecurity-mosaic-form-field.d.ts +5 -5
  692. package/form-field/public-api.d.ts +10 -10
  693. package/form-field/stepper.d.ts +11 -11
  694. package/form-field/suffix.d.ts +5 -5
  695. package/icon/icon.component.d.ts +18 -18
  696. package/icon/icon.module.d.ts +10 -10
  697. package/icon/index.d.ts +1 -1
  698. package/icon/ptsecurity-mosaic-icon.d.ts +5 -5
  699. package/icon/public-api.d.ts +2 -2
  700. package/index.d.ts +1 -1
  701. package/input/index.d.ts +1 -1
  702. package/input/input-errors.d.ts +1 -1
  703. package/input/input-number-validators.d.ts +39 -39
  704. package/input/input-number.d.ts +33 -33
  705. package/input/input-password.d.ts +123 -121
  706. package/input/input-value-accessor.d.ts +4 -4
  707. package/input/input.d.ts +116 -116
  708. package/input/input.module.d.ts +14 -14
  709. package/input/ptsecurity-mosaic-input.d.ts +5 -5
  710. package/input/public-api.d.ts +6 -6
  711. package/link/index.d.ts +1 -1
  712. package/link/link.component.d.ts +38 -38
  713. package/link/link.module.d.ts +9 -9
  714. package/link/ptsecurity-mosaic-link.d.ts +5 -5
  715. package/link/public-api.d.ts +2 -2
  716. package/list/index.d.ts +1 -1
  717. package/list/list-selection.component.d.ts +168 -168
  718. package/list/list.component.d.ts +18 -18
  719. package/list/list.module.d.ts +11 -11
  720. package/list/ptsecurity-mosaic-list.d.ts +5 -5
  721. package/list/public-api.d.ts +3 -3
  722. package/modal/README.md +33 -33
  723. package/modal/css-unit.pipe.d.ts +7 -7
  724. package/modal/index.d.ts +1 -1
  725. package/modal/modal-control.service.d.ts +20 -20
  726. package/modal/modal-ref.class.d.ts +36 -36
  727. package/modal/modal-util.d.ts +12 -12
  728. package/modal/modal.component.d.ts +126 -126
  729. package/modal/modal.directive.d.ts +17 -17
  730. package/modal/modal.module.d.ts +14 -14
  731. package/modal/modal.service.d.ts +33 -33
  732. package/modal/modal.type.d.ts +59 -59
  733. package/modal/ptsecurity-mosaic-modal.d.ts +5 -5
  734. package/modal/public-api.d.ts +6 -6
  735. package/navbar/README.md +41 -41
  736. package/navbar/index.d.ts +1 -1
  737. package/navbar/navbar-item.component.d.ts +161 -161
  738. package/navbar/navbar.component.d.ts +58 -58
  739. package/navbar/navbar.module.d.ts +14 -14
  740. package/navbar/ptsecurity-mosaic-navbar.d.ts +5 -5
  741. package/navbar/public-api.d.ts +4 -4
  742. package/navbar/vertical-navbar.animation.d.ts +2 -2
  743. package/navbar/vertical-navbar.component.d.ts +23 -23
  744. package/package.json +13 -10
  745. package/popover/README.md +32 -32
  746. package/popover/index.d.ts +1 -1
  747. package/popover/popover-animations.d.ts +4 -4
  748. package/popover/popover-confirm.component.d.ts +33 -33
  749. package/popover/popover.component.d.ts +74 -74
  750. package/popover/popover.module.d.ts +12 -12
  751. package/popover/ptsecurity-mosaic-popover.d.ts +5 -5
  752. package/popover/public-api.d.ts +4 -4
  753. package/prebuilt-themes/dark-theme.css +1 -1
  754. package/prebuilt-themes/default-theme.css +1 -1
  755. package/progress-bar/index.d.ts +1 -1
  756. package/progress-bar/progress-bar.component.d.ts +18 -18
  757. package/progress-bar/progress-bar.module.d.ts +9 -9
  758. package/progress-bar/ptsecurity-mosaic-progress-bar.d.ts +5 -5
  759. package/progress-bar/public-api.d.ts +2 -2
  760. package/progress-spinner/index.d.ts +1 -1
  761. package/progress-spinner/progress-spinner.component.d.ts +19 -19
  762. package/progress-spinner/progress-spinner.module.d.ts +9 -9
  763. package/progress-spinner/ptsecurity-mosaic-progress-spinner.d.ts +5 -5
  764. package/progress-spinner/public-api.d.ts +2 -2
  765. package/ptsecurity-mosaic.d.ts +5 -5
  766. package/public-api.d.ts +1 -1
  767. package/radio/index.d.ts +1 -1
  768. package/radio/ptsecurity-mosaic-radio.d.ts +5 -5
  769. package/radio/public-api.d.ts +2 -2
  770. package/radio/radio.component.d.ts +207 -207
  771. package/radio/radio.module.d.ts +10 -10
  772. package/schematics/README.md +35 -35
  773. package/select/index.d.ts +1 -1
  774. package/select/ptsecurity-mosaic-select.d.ts +5 -5
  775. package/select/public-api.d.ts +3 -3
  776. package/select/select-option.directive.d.ts +20 -20
  777. package/select/select.component.d.ts +310 -307
  778. package/select/select.module.d.ts +15 -15
  779. package/sidebar/index.d.ts +1 -1
  780. package/sidebar/ptsecurity-mosaic-sidebar.d.ts +5 -5
  781. package/sidebar/public-api.d.ts +2 -2
  782. package/sidebar/sidebar-animations.d.ts +8 -8
  783. package/sidebar/sidebar.component.d.ts +53 -53
  784. package/sidebar/sidebar.module.d.ts +8 -8
  785. package/sidepanel/index.d.ts +1 -1
  786. package/sidepanel/ptsecurity-mosaic-sidepanel.d.ts +5 -5
  787. package/sidepanel/public-api.d.ts +6 -6
  788. package/sidepanel/sidepanel-animations.d.ts +14 -14
  789. package/sidepanel/sidepanel-config.d.ts +25 -25
  790. package/sidepanel/sidepanel-container.component.d.ts +45 -45
  791. package/sidepanel/sidepanel-directives.d.ts +50 -50
  792. package/sidepanel/sidepanel-ref.d.ts +24 -24
  793. package/sidepanel/sidepanel.module.d.ts +15 -15
  794. package/sidepanel/sidepanel.service.d.ts +57 -57
  795. package/splitter/index.d.ts +1 -1
  796. package/splitter/ptsecurity-mosaic-splitter.d.ts +5 -5
  797. package/splitter/public-api.d.ts +2 -2
  798. package/splitter/splitter.component.d.ts +130 -130
  799. package/splitter/splitter.module.d.ts +9 -9
  800. package/table/index.d.ts +1 -1
  801. package/table/ptsecurity-mosaic-table.d.ts +5 -5
  802. package/table/public-api.d.ts +2 -2
  803. package/table/table.component.d.ts +5 -5
  804. package/table/table.module.d.ts +10 -10
  805. package/tabs/index.d.ts +1 -1
  806. package/tabs/paginated-tab-header.d.ts +179 -179
  807. package/tabs/ptsecurity-mosaic-tabs.d.ts +5 -5
  808. package/tabs/public-api.d.ts +10 -10
  809. package/tabs/tab-body.component.d.ts +95 -95
  810. package/tabs/tab-content.directive.d.ts +9 -9
  811. package/tabs/tab-group.component.d.ts +133 -133
  812. package/tabs/tab-header.component.d.ts +35 -35
  813. package/tabs/tab-label-wrapper.directive.d.ts +30 -30
  814. package/tabs/tab-label.directive.d.ts +9 -9
  815. package/tabs/tab-nav-bar/index.d.ts +1 -1
  816. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +38 -38
  817. package/tabs/tab.component.d.ts +66 -66
  818. package/tabs/tabs-animations.d.ts +4 -4
  819. package/tabs/tabs.module.d.ts +20 -20
  820. package/tags/index.d.ts +1 -1
  821. package/tags/ptsecurity-mosaic-tags.d.ts +5 -5
  822. package/tags/public-api.d.ts +5 -5
  823. package/tags/tag-default-options.d.ts +8 -8
  824. package/tags/tag-input.d.ts +77 -77
  825. package/tags/tag-list.component.d.ts +240 -240
  826. package/tags/tag-text-control.d.ts +10 -10
  827. package/tags/tag.component.d.ts +135 -135
  828. package/tags/tag.module.d.ts +11 -11
  829. package/textarea/index.d.ts +1 -1
  830. package/textarea/ptsecurity-mosaic-textarea.d.ts +5 -5
  831. package/textarea/public-api.d.ts +2 -2
  832. package/textarea/textarea.component.d.ts +111 -111
  833. package/textarea/textarea.module.d.ts +11 -11
  834. package/timepicker/index.d.ts +1 -1
  835. package/timepicker/ptsecurity-mosaic-timepicker.d.ts +5 -5
  836. package/timepicker/public-api.d.ts +3 -3
  837. package/timepicker/timepicker.constants.d.ts +20 -20
  838. package/timepicker/timepicker.directive.d.ts +146 -142
  839. package/timepicker/timepicker.module.d.ts +11 -11
  840. package/toggle/index.d.ts +1 -1
  841. package/toggle/ptsecurity-mosaic-toggle.d.ts +5 -5
  842. package/toggle/public-api.d.ts +2 -2
  843. package/toggle/toggle.component.d.ts +54 -54
  844. package/toggle/toggle.module.d.ts +10 -10
  845. package/tooltip/index.d.ts +1 -1
  846. package/tooltip/ptsecurity-mosaic-tooltip.d.ts +5 -5
  847. package/tooltip/public-api.d.ts +2 -2
  848. package/tooltip/tooltip.animations.d.ts +8 -8
  849. package/tooltip/tooltip.component.d.ts +91 -91
  850. package/tooltip/tooltip.module.d.ts +9 -9
  851. package/tree/control/base-tree-control.d.ts +40 -40
  852. package/tree/control/flat-tree-control.d.ts +52 -48
  853. package/tree/control/nested-tree-control.d.ts +19 -19
  854. package/tree/control/tree-control.d.ts +44 -44
  855. package/tree/data-source/flat-data-source.d.ts +80 -80
  856. package/tree/data-source/nested-data-source.d.ts +15 -15
  857. package/tree/index.d.ts +1 -1
  858. package/tree/node.d.ts +34 -34
  859. package/tree/outlet.d.ts +9 -9
  860. package/tree/padding.directive.d.ts +47 -45
  861. package/tree/ptsecurity-mosaic-tree.d.ts +5 -5
  862. package/tree/public-api.d.ts +15 -15
  863. package/tree/toggle.d.ts +28 -28
  864. package/tree/tree-base.d.ts +97 -97
  865. package/tree/tree-errors.d.ts +25 -25
  866. package/tree/tree-option.component.d.ts +72 -68
  867. package/tree/tree-selection.component.d.ts +132 -130
  868. package/tree/tree.d.ts +6 -6
  869. package/tree/tree.module.d.ts +16 -16
  870. package/tree-select/index.d.ts +1 -1
  871. package/tree-select/ptsecurity-mosaic-tree-select.d.ts +5 -5
  872. package/tree-select/public-api.d.ts +2 -2
  873. package/tree-select/tree-select.component.d.ts +277 -269
  874. package/tree-select/tree-select.module.d.ts +14 -14
  875. package/schematics/collection.json +0 -4
  876. package/schematics/migration.json +0 -10
  877. package/schematics/ng-update/data/attribute-selectors.d.ts +0 -2
  878. package/schematics/ng-update/data/attribute-selectors.js +0 -5
  879. package/schematics/ng-update/data/attribute-selectors.js.map +0 -1
  880. package/schematics/ng-update/data/class-names.d.ts +0 -2
  881. package/schematics/ng-update/data/class-names.js +0 -5
  882. package/schematics/ng-update/data/class-names.js.map +0 -1
  883. package/schematics/ng-update/data/constructor-checks.d.ts +0 -2
  884. package/schematics/ng-update/data/constructor-checks.js +0 -5
  885. package/schematics/ng-update/data/constructor-checks.js.map +0 -1
  886. package/schematics/ng-update/data/css-selectors.d.ts +0 -2
  887. package/schematics/ng-update/data/css-selectors.js +0 -5
  888. package/schematics/ng-update/data/css-selectors.js.map +0 -1
  889. package/schematics/ng-update/data/element-selectors.d.ts +0 -2
  890. package/schematics/ng-update/data/element-selectors.js +0 -5
  891. package/schematics/ng-update/data/element-selectors.js.map +0 -1
  892. package/schematics/ng-update/data/index.d.ts +0 -10
  893. package/schematics/ng-update/data/index.js +0 -14
  894. package/schematics/ng-update/data/index.js.map +0 -1
  895. package/schematics/ng-update/data/input-names.d.ts +0 -2
  896. package/schematics/ng-update/data/input-names.js +0 -35
  897. package/schematics/ng-update/data/input-names.js.map +0 -1
  898. package/schematics/ng-update/data/method-call-checks.d.ts +0 -2
  899. package/schematics/ng-update/data/method-call-checks.js +0 -5
  900. package/schematics/ng-update/data/method-call-checks.js.map +0 -1
  901. package/schematics/ng-update/data/output-names.d.ts +0 -2
  902. package/schematics/ng-update/data/output-names.js +0 -5
  903. package/schematics/ng-update/data/output-names.js.map +0 -1
  904. package/schematics/ng-update/data/property-names.d.ts +0 -2
  905. package/schematics/ng-update/data/property-names.js +0 -5
  906. package/schematics/ng-update/data/property-names.js.map +0 -1
  907. package/schematics/ng-update/data/symbol-removal.d.ts +0 -2
  908. package/schematics/ng-update/data/symbol-removal.js +0 -5
  909. package/schematics/ng-update/data/symbol-removal.js.map +0 -1
  910. package/schematics/ng-update/index.d.ts +0 -2
  911. package/schematics/ng-update/index.js +0 -23
  912. package/schematics/ng-update/index.js.map +0 -1
  913. package/schematics/ng-update/update-9.0.0/mosaic-symbols.json +0 -255
  914. package/schematics/ng-update/update-9.0.0/secondary-entry-points-migration.d.ts +0 -7
  915. package/schematics/ng-update/update-9.0.0/secondary-entry-points-migration.js +0 -154
  916. package/schematics/ng-update/update-9.0.0/secondary-entry-points-migration.js.map +0 -1
  917. package/schematics/ng-update/upgrade-data.d.ts +0 -2
  918. package/schematics/ng-update/upgrade-data.js +0 -17
  919. package/schematics/ng-update/upgrade-data.js.map +0 -1
  920. package/schematics/tsconfig.json +0 -29
  921. package/schematics/tsconfig.lib-test.json +0 -8
  922. package/schematics/tsconfig.lib.json +0 -17
@@ -17,1351 +17,1351 @@ import { Subject, merge } from 'rxjs';
17
17
  import { take, takeUntil, startWith } from 'rxjs/operators';
18
18
  import { McIcon } from '@ptsecurity/mosaic/icon';
19
19
 
20
- /** Injection token to be used to override the default options for the chips module. */
20
+ /** Injection token to be used to override the default options for the chips module. */
21
21
  const MC_TAGS_DEFAULT_OPTIONS = new InjectionToken('mc-tags-default-options');
22
22
 
23
- /** Event object emitted by McTag when selected or deselected. */
24
- class McTagSelectionChange {
25
- constructor(source, selected, isUserInput = false) {
26
- this.source = source;
27
- this.selected = selected;
28
- this.isUserInput = isUserInput;
29
- }
30
- }
31
- const TAG_ATTRIBUTE_NAMES = ['mc-basic-tag'];
32
- /**
33
- * Dummy directive to add CSS class to tag avatar.
34
- * @docs-private
35
- */
36
- class McTagAvatar {
37
- }
38
- /** @nocollapse */ /** @nocollapse */ McTagAvatar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagAvatar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
39
- /** @nocollapse */ /** @nocollapse */ McTagAvatar.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.7", type: McTagAvatar, selector: "mc-tag-avatar, [mcTagAvatar]", host: { classAttribute: "mc-tag-avatar" }, ngImport: i0 });
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagAvatar, decorators: [{
41
- type: Directive,
42
- args: [{
43
- selector: 'mc-tag-avatar, [mcTagAvatar]',
44
- host: { class: 'mc-tag-avatar' }
45
- }]
46
- }] });
47
- /**
48
- * Dummy directive to add CSS class to tag trailing icon.
49
- * @docs-private
50
- */
51
- class McTagTrailingIcon {
52
- }
53
- /** @nocollapse */ /** @nocollapse */ McTagTrailingIcon.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagTrailingIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
54
- /** @nocollapse */ /** @nocollapse */ McTagTrailingIcon.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.7", type: McTagTrailingIcon, selector: "mc-tag-trailing-icon, [mcTagTrailingIcon]", host: { classAttribute: "mc-tag-trailing-icon" }, ngImport: i0 });
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagTrailingIcon, decorators: [{
56
- type: Directive,
57
- args: [{
58
- selector: 'mc-tag-trailing-icon, [mcTagTrailingIcon]',
59
- host: { class: 'mc-tag-trailing-icon' }
60
- }]
61
- }] });
62
- class McTagBase {
63
- // tslint:disable-next-line:naming-convention
64
- constructor(_elementRef) {
65
- this._elementRef = _elementRef;
66
- }
67
- }
68
- // tslint:disable-next-line:naming-convention
69
- const McTagMixinBase = mixinColor(mixinDisabled(McTagBase));
70
- class McTag extends McTagMixinBase {
71
- constructor(elementRef, changeDetectorRef, _ngZone) {
72
- super(elementRef);
73
- this.elementRef = elementRef;
74
- this.changeDetectorRef = changeDetectorRef;
75
- this._ngZone = _ngZone;
76
- /** Emits when the tag is focused. */
77
- this.onFocus = new Subject();
78
- /** Emits when the tag is blured. */
79
- this.onBlur = new Subject();
80
- /** Whether the tag has focus. */
81
- this.hasFocus = false;
82
- /** Whether the tag list is selectable */
83
- this.tagListSelectable = true;
84
- /** Emitted when the tag is selected or deselected. */
85
- this.selectionChange = new EventEmitter();
86
- /** Emitted when the tag is destroyed. */
87
- this.destroyed = new EventEmitter();
88
- /** Emitted when a tag is to be removed. */
89
- this.removed = new EventEmitter();
90
- this._selected = false;
91
- this._selectable = true;
92
- this._removable = true;
93
- this._disabled = false;
94
- this.addHostClassName();
95
- this.nativeElement = elementRef.nativeElement;
96
- }
97
- /** Whether the tag is selected. */
98
- get selected() {
99
- return this._selected;
100
- }
101
- set selected(value) {
102
- const coercedValue = coerceBooleanProperty(value);
103
- if (coercedValue !== this._selected) {
104
- this._selected = coercedValue;
105
- this.dispatchSelectionChange();
106
- }
107
- }
108
- /** The value of the tag. Defaults to the content inside `<mc-tag>` tags. */
109
- get value() {
110
- return this._value !== undefined
111
- ? this._value
112
- : this.elementRef.nativeElement.textContent;
113
- }
114
- set value(value) {
115
- this._value = value;
116
- }
117
- /**
118
- * Whether or not the tag is selectable. When a tag is not selectable,
119
- * changes to its selected state are always ignored. By default a tag is
120
- * selectable, and it becomes non-selectable if its parent tag list is
121
- * not selectable.
122
- */
123
- get selectable() {
124
- return this._selectable && this.tagListSelectable;
125
- }
126
- set selectable(value) {
127
- this._selectable = coerceBooleanProperty(value);
128
- }
129
- /**
130
- * Determines whether or not the tag displays the remove styling and emits (removed) events.
131
- */
132
- get removable() {
133
- return this._removable;
134
- }
135
- set removable(value) {
136
- this._removable = coerceBooleanProperty(value);
137
- }
138
- get tabindex() {
139
- if (!this.selectable) {
140
- return null;
141
- }
142
- return this.disabled ? null : -1;
143
- }
144
- get disabled() {
145
- return this._disabled;
146
- }
147
- set disabled(value) {
148
- if (value !== this.disabled) {
149
- this._disabled = value;
150
- }
151
- }
152
- ngAfterContentInit() {
153
- this.addClassModificatorForIcons();
154
- }
155
- addClassModificatorForIcons() {
156
- const icons = this.contentChildren.map((item) => item._elementRef.nativeElement);
157
- if (icons.length === 1) {
158
- const iconElement = icons[0];
159
- if (iconElement.classList.contains('mc-tag-remove')) {
160
- iconElement.classList.add('mc-icon_right');
161
- this.nativeElement.classList.add('mc-right-icon');
162
- }
163
- else {
164
- iconElement.classList.add('mc-icon_left');
165
- this.nativeElement.classList.add('mc-left-icon');
166
- }
167
- }
168
- else if (icons.length > 1) {
169
- const firstIconElement = icons[0];
170
- const secondIconElement = icons[1];
171
- firstIconElement.classList.add('mc-icon_left');
172
- secondIconElement.classList.add('mc-icon_right');
173
- }
174
- }
175
- addHostClassName() {
176
- // Add class for the different tags
177
- for (const attr of TAG_ATTRIBUTE_NAMES) {
178
- if (this.elementRef.nativeElement.hasAttribute(attr) ||
179
- this.elementRef.nativeElement.tagName.toLowerCase() === attr) {
180
- this.elementRef.nativeElement.classList.add(attr);
181
- return;
182
- }
183
- }
184
- this.elementRef.nativeElement.classList.add('mc-standard-tag');
185
- }
186
- ngOnDestroy() {
187
- this.destroyed.emit({ tag: this });
188
- }
189
- select() {
190
- if (!this._selected) {
191
- this._selected = true;
192
- this.dispatchSelectionChange();
193
- }
194
- }
195
- deselect() {
196
- if (this._selected) {
197
- this._selected = false;
198
- this.dispatchSelectionChange();
199
- }
200
- }
201
- selectViaInteraction() {
202
- if (!this._selected) {
203
- this._selected = true;
204
- this.dispatchSelectionChange(true);
205
- }
206
- }
207
- toggleSelected(isUserInput = false) {
208
- this._selected = !this.selected;
209
- this.dispatchSelectionChange(isUserInput);
210
- return this.selected;
211
- }
212
- /** Allows for programmatic focusing of the tag. */
213
- focus() {
214
- if (!this.selectable) {
215
- return;
216
- }
217
- if (!this.hasFocus) {
218
- this.elementRef.nativeElement.focus();
219
- this.onFocus.next({ tag: this });
220
- Promise.resolve().then(() => {
221
- this.hasFocus = true;
222
- this.changeDetectorRef.markForCheck();
223
- });
224
- }
225
- }
226
- /**
227
- * Allows for programmatic removal of the tag. Called by the McTagList when the DELETE or
228
- * BACKSPACE keys are pressed.
229
- *
230
- * Informs any listeners of the removal request. Does not remove the tag from the DOM.
231
- */
232
- remove() {
233
- if (this.removable) {
234
- this.removed.emit({ tag: this });
235
- }
236
- }
237
- handleClick(event) {
238
- if (this.disabled) {
239
- event.preventDefault();
240
- }
241
- else {
242
- event.stopPropagation();
243
- }
244
- }
245
- handleKeydown(event) {
246
- if (this.disabled) {
247
- return;
248
- }
249
- // tslint:disable-next-line: deprecation
250
- switch (event.keyCode) {
251
- case DELETE:
252
- case BACKSPACE:
253
- // If we are removable, remove the focused tag
254
- this.remove();
255
- // Always prevent so page navigation does not occur
256
- event.preventDefault();
257
- break;
258
- case SPACE:
259
- // If we are selectable, toggle the focused tag
260
- if (this.selectable) {
261
- this.toggleSelected(true);
262
- }
263
- // Always prevent space from scrolling the page since the list has focus
264
- event.preventDefault();
265
- break;
266
- default:
267
- }
268
- }
269
- blur() {
270
- // When animations are enabled, Angular may end up removing the tag from the DOM a little
271
- // earlier than usual, causing it to be blurred and throwing off the logic in the tag list
272
- // that moves focus not the next item. To work around the issue, we defer marking the tag
273
- // as not focused until the next time the zone stabilizes.
274
- this._ngZone.onStable
275
- .asObservable()
276
- .pipe(take(1))
277
- .subscribe(() => {
278
- this._ngZone.run(() => {
279
- this.hasFocus = false;
280
- this.onBlur.next({ tag: this });
281
- });
282
- });
283
- }
284
- dispatchSelectionChange(isUserInput = false) {
285
- this.selectionChange.emit({
286
- source: this,
287
- isUserInput,
288
- selected: this._selected
289
- });
290
- }
291
- }
292
- /** @nocollapse */ /** @nocollapse */ McTag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTag, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
293
- /** @nocollapse */ /** @nocollapse */ McTag.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.7", type: McTag, selector: "mc-tag, [mc-tag], mc-basic-tag, [mc-basic-tag]", inputs: { color: "color", selected: "selected", value: "value", selectable: "selectable", removable: "removable", disabled: "disabled" }, outputs: { selectionChange: "selectionChange", destroyed: "destroyed", removed: "removed" }, host: { listeners: { "click": "handleClick($event)", "keydown": "handleKeydown($event)", "focus": "focus()", "blur": "blur()" }, properties: { "attr.tabindex": "tabindex", "attr.disabled": "disabled || null", "class.mc-selected": "selected", "class.mc-focused": "hasFocus", "class.mc-tag-with-avatar": "avatar", "class.mc-tag-with-icon": "contentChildren", "class.mc-tag-with-trailing-icon": "trailingIcon || removeIcon", "class.mc-disabled": "disabled" }, classAttribute: "mc-tag" }, queries: [{ propertyName: "avatar", first: true, predicate: McTagAvatar, descendants: true }, { propertyName: "trailingIcon", first: true, predicate: McTagTrailingIcon, descendants: true }, { propertyName: "removeIcon", first: true, predicate: i0.forwardRef(function () { return McTagRemove; }), descendants: true }, { propertyName: "contentChildren", predicate: McIcon }], exportAs: ["mcTag"], usesInheritance: true, ngImport: i0, template: "<div class=\"mc-tag__wrapper\">\n <ng-content select=\"[mc-icon]:not([mcTagRemove])\"></ng-content>\n <span class=\"mc-tag__text\"><ng-content></ng-content></span>\n <ng-content select=\"[mcTagRemove]\"></ng-content>\n</div>\n<div class=\"mc-tag-overlay\"></div> \n", styles: [".mc-tag{position:relative;display:inline-block;overflow:hidden;margin:var(--mc-tags-size-margin, 2px);height:var(--mc-tags-size-height, 24px);border-width:var(--mc-tags-size-border-width, 1px);border-style:solid;border-radius:var(--mc-tags-size-border-radius, 4px);cursor:default;outline:none;box-sizing:border-box}.mc-tag .mc-icon.mc-tag-remove:hover{cursor:pointer}.mc-tag.mc-disabled .mc-icon.mc-tag-remove:hover{cursor:default}.mc-tag .mc-tag__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mc-tag:not(.mc-tag-with-icon) .mc-tag__text{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper{display:flex;align-items:center;height:100%;flex:1 1 100%}.mc-tag__wrapper .mc-icon.mc-tag-remove{display:flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--mc-tags-size-height, 24px);padding-left:var(--mc-tags-size-icon-padding, 4px);padding-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper .mc-icon_left{margin-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper>.mc-icon:first-child{margin-left:calc(var(--mc-tags-size-icon-padding, 4px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:last-child{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:first-child{margin-left:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag-overlay{position:absolute;top:-1px;left:-1px;right:-1px;bottom:-1px;pointer-events:none;border-radius:inherit}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTag, decorators: [{
295
- type: Component,
296
- args: [{ selector: 'mc-tag, [mc-tag], mc-basic-tag, [mc-basic-tag]', exportAs: 'mcTag', inputs: ['color'], host: {
297
- class: 'mc-tag',
298
- '[attr.tabindex]': 'tabindex',
299
- '[attr.disabled]': 'disabled || null',
300
- '[class.mc-selected]': 'selected',
301
- '[class.mc-focused]': 'hasFocus',
302
- '[class.mc-tag-with-avatar]': 'avatar',
303
- '[class.mc-tag-with-icon]': 'contentChildren',
304
- '[class.mc-tag-with-trailing-icon]': 'trailingIcon || removeIcon',
305
- '[class.mc-disabled]': 'disabled',
306
- '(click)': 'handleClick($event)',
307
- '(keydown)': 'handleKeydown($event)',
308
- '(focus)': 'focus()',
309
- '(blur)': 'blur()'
310
- }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"mc-tag__wrapper\">\n <ng-content select=\"[mc-icon]:not([mcTagRemove])\"></ng-content>\n <span class=\"mc-tag__text\"><ng-content></ng-content></span>\n <ng-content select=\"[mcTagRemove]\"></ng-content>\n</div>\n<div class=\"mc-tag-overlay\"></div> \n", styles: [".mc-tag{position:relative;display:inline-block;overflow:hidden;margin:var(--mc-tags-size-margin, 2px);height:var(--mc-tags-size-height, 24px);border-width:var(--mc-tags-size-border-width, 1px);border-style:solid;border-radius:var(--mc-tags-size-border-radius, 4px);cursor:default;outline:none;box-sizing:border-box}.mc-tag .mc-icon.mc-tag-remove:hover{cursor:pointer}.mc-tag.mc-disabled .mc-icon.mc-tag-remove:hover{cursor:default}.mc-tag .mc-tag__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mc-tag:not(.mc-tag-with-icon) .mc-tag__text{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper{display:flex;align-items:center;height:100%;flex:1 1 100%}.mc-tag__wrapper .mc-icon.mc-tag-remove{display:flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--mc-tags-size-height, 24px);padding-left:var(--mc-tags-size-icon-padding, 4px);padding-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper .mc-icon_left{margin-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper>.mc-icon:first-child{margin-left:calc(var(--mc-tags-size-icon-padding, 4px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:last-child{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:first-child{margin-left:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag-overlay{position:absolute;top:-1px;left:-1px;right:-1px;bottom:-1px;pointer-events:none;border-radius:inherit}\n"] }]
311
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { contentChildren: [{
312
- type: ContentChildren,
313
- args: [McIcon]
314
- }], avatar: [{
315
- type: ContentChild,
316
- args: [McTagAvatar, { static: false }]
317
- }], trailingIcon: [{
318
- type: ContentChild,
319
- args: [McTagTrailingIcon, { static: false }]
320
- }], removeIcon: [{
321
- type: ContentChild,
322
- args: [forwardRef(() => McTagRemove), { static: false }]
323
- }], selectionChange: [{
324
- type: Output
325
- }], destroyed: [{
326
- type: Output
327
- }], removed: [{
328
- type: Output
329
- }], selected: [{
330
- type: Input
331
- }], value: [{
332
- type: Input
333
- }], selectable: [{
334
- type: Input
335
- }], removable: [{
336
- type: Input
337
- }], disabled: [{
338
- type: Input
339
- }] } });
340
- /**
341
- *
342
- * Example:
343
- *
344
- * `<mc-tag>
345
- * <mc-icon mcTagRemove>cancel</mc-icon>
346
- * </mc-tag>`
347
- *
348
- * You *may* use a custom icon, but you may need to override the `mc-tag-remove` positioning
349
- * styles to properly center the icon within the tag.
350
- */
351
- class McTagRemove {
352
- constructor(parentTag) {
353
- this.parentTag = parentTag;
354
- }
355
- focus($event) {
356
- $event.stopPropagation();
357
- }
358
- /** Calls the parent tag's public `remove()` method if applicable. */
359
- handleClick(event) {
360
- if (this.parentTag.removable) {
361
- this.parentTag.hasFocus = true;
362
- this.parentTag.remove();
363
- }
364
- // We need to stop event propagation because otherwise the event will bubble up to the
365
- // form field and cause the `onContainerClick` method to be invoked. This method would then
366
- // reset the focused tag that has been focused after tag removal. Usually the parent
367
- // the parent click listener of the `McTag` would prevent propagation, but it can happen
368
- // that the tag is being removed before the event bubbles up.
369
- event.stopPropagation();
370
- }
371
- }
372
- /** @nocollapse */ /** @nocollapse */ McTagRemove.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagRemove, deps: [{ token: forwardRef(() => McTag) }], target: i0.ɵɵFactoryTarget.Directive });
373
- /** @nocollapse */ /** @nocollapse */ McTagRemove.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.7", type: McTagRemove, selector: "[mcTagRemove]", host: { listeners: { "click": "handleClick($event)", "focus": "focus($event)" }, properties: { "attr.tabindex": "-1" }, classAttribute: "mc-tag-remove mc-tag-trailing-icon" }, ngImport: i0 });
374
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagRemove, decorators: [{
375
- type: Directive,
376
- args: [{
377
- selector: '[mcTagRemove]',
378
- host: {
379
- class: 'mc-tag-remove mc-tag-trailing-icon',
380
- '[attr.tabindex]': '-1',
381
- '(click)': 'handleClick($event)',
382
- '(focus)': 'focus($event)'
383
- }
384
- }]
385
- }], ctorParameters: function () { return [{ type: McTag, decorators: [{
386
- type: Inject,
387
- args: [forwardRef(() => McTag)]
23
+ /** Event object emitted by McTag when selected or deselected. */
24
+ class McTagSelectionChange {
25
+ constructor(source, selected, isUserInput = false) {
26
+ this.source = source;
27
+ this.selected = selected;
28
+ this.isUserInput = isUserInput;
29
+ }
30
+ }
31
+ const TAG_ATTRIBUTE_NAMES = ['mc-basic-tag'];
32
+ /**
33
+ * Dummy directive to add CSS class to tag avatar.
34
+ * @docs-private
35
+ */
36
+ class McTagAvatar {
37
+ }
38
+ /** @nocollapse */ /** @nocollapse */ McTagAvatar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagAvatar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
39
+ /** @nocollapse */ /** @nocollapse */ McTagAvatar.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McTagAvatar, selector: "mc-tag-avatar, [mcTagAvatar]", host: { classAttribute: "mc-tag-avatar" }, ngImport: i0 });
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagAvatar, decorators: [{
41
+ type: Directive,
42
+ args: [{
43
+ selector: 'mc-tag-avatar, [mcTagAvatar]',
44
+ host: { class: 'mc-tag-avatar' }
45
+ }]
46
+ }] });
47
+ /**
48
+ * Dummy directive to add CSS class to tag trailing icon.
49
+ * @docs-private
50
+ */
51
+ class McTagTrailingIcon {
52
+ }
53
+ /** @nocollapse */ /** @nocollapse */ McTagTrailingIcon.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagTrailingIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
54
+ /** @nocollapse */ /** @nocollapse */ McTagTrailingIcon.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McTagTrailingIcon, selector: "mc-tag-trailing-icon, [mcTagTrailingIcon]", host: { classAttribute: "mc-tag-trailing-icon" }, ngImport: i0 });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagTrailingIcon, decorators: [{
56
+ type: Directive,
57
+ args: [{
58
+ selector: 'mc-tag-trailing-icon, [mcTagTrailingIcon]',
59
+ host: { class: 'mc-tag-trailing-icon' }
60
+ }]
61
+ }] });
62
+ class McTagBase {
63
+ // tslint:disable-next-line:naming-convention
64
+ constructor(_elementRef) {
65
+ this._elementRef = _elementRef;
66
+ }
67
+ }
68
+ // tslint:disable-next-line:naming-convention
69
+ const McTagMixinBase = mixinColor(mixinDisabled(McTagBase));
70
+ class McTag extends McTagMixinBase {
71
+ constructor(elementRef, changeDetectorRef, _ngZone) {
72
+ super(elementRef);
73
+ this.elementRef = elementRef;
74
+ this.changeDetectorRef = changeDetectorRef;
75
+ this._ngZone = _ngZone;
76
+ /** Emits when the tag is focused. */
77
+ this.onFocus = new Subject();
78
+ /** Emits when the tag is blured. */
79
+ this.onBlur = new Subject();
80
+ /** Whether the tag has focus. */
81
+ this.hasFocus = false;
82
+ /** Whether the tag list is selectable */
83
+ this.tagListSelectable = true;
84
+ /** Emitted when the tag is selected or deselected. */
85
+ this.selectionChange = new EventEmitter();
86
+ /** Emitted when the tag is destroyed. */
87
+ this.destroyed = new EventEmitter();
88
+ /** Emitted when a tag is to be removed. */
89
+ this.removed = new EventEmitter();
90
+ this._selected = false;
91
+ this._selectable = true;
92
+ this._removable = true;
93
+ this._disabled = false;
94
+ this.addHostClassName();
95
+ this.nativeElement = elementRef.nativeElement;
96
+ }
97
+ /** Whether the tag is selected. */
98
+ get selected() {
99
+ return this._selected;
100
+ }
101
+ set selected(value) {
102
+ const coercedValue = coerceBooleanProperty(value);
103
+ if (coercedValue !== this._selected) {
104
+ this._selected = coercedValue;
105
+ this.dispatchSelectionChange();
106
+ }
107
+ }
108
+ /** The value of the tag. Defaults to the content inside `<mc-tag>` tags. */
109
+ get value() {
110
+ return this._value !== undefined
111
+ ? this._value
112
+ : this.elementRef.nativeElement.textContent;
113
+ }
114
+ set value(value) {
115
+ this._value = value;
116
+ }
117
+ /**
118
+ * Whether or not the tag is selectable. When a tag is not selectable,
119
+ * changes to its selected state are always ignored. By default a tag is
120
+ * selectable, and it becomes non-selectable if its parent tag list is
121
+ * not selectable.
122
+ */
123
+ get selectable() {
124
+ return this._selectable && this.tagListSelectable;
125
+ }
126
+ set selectable(value) {
127
+ this._selectable = coerceBooleanProperty(value);
128
+ }
129
+ /**
130
+ * Determines whether or not the tag displays the remove styling and emits (removed) events.
131
+ */
132
+ get removable() {
133
+ return this._removable;
134
+ }
135
+ set removable(value) {
136
+ this._removable = coerceBooleanProperty(value);
137
+ }
138
+ get tabindex() {
139
+ if (!this.selectable) {
140
+ return null;
141
+ }
142
+ return this.disabled ? null : -1;
143
+ }
144
+ get disabled() {
145
+ return this._disabled;
146
+ }
147
+ set disabled(value) {
148
+ if (value !== this.disabled) {
149
+ this._disabled = value;
150
+ }
151
+ }
152
+ ngAfterContentInit() {
153
+ this.addClassModificatorForIcons();
154
+ }
155
+ addClassModificatorForIcons() {
156
+ const icons = this.contentChildren.map((item) => item._elementRef.nativeElement);
157
+ if (icons.length === 1) {
158
+ const iconElement = icons[0];
159
+ if (iconElement.classList.contains('mc-tag-remove')) {
160
+ iconElement.classList.add('mc-icon_right');
161
+ this.nativeElement.classList.add('mc-right-icon');
162
+ }
163
+ else {
164
+ iconElement.classList.add('mc-icon_left');
165
+ this.nativeElement.classList.add('mc-left-icon');
166
+ }
167
+ }
168
+ else if (icons.length > 1) {
169
+ const firstIconElement = icons[0];
170
+ const secondIconElement = icons[1];
171
+ firstIconElement.classList.add('mc-icon_left');
172
+ secondIconElement.classList.add('mc-icon_right');
173
+ }
174
+ }
175
+ addHostClassName() {
176
+ // Add class for the different tags
177
+ for (const attr of TAG_ATTRIBUTE_NAMES) {
178
+ if (this.elementRef.nativeElement.hasAttribute(attr) ||
179
+ this.elementRef.nativeElement.tagName.toLowerCase() === attr) {
180
+ this.elementRef.nativeElement.classList.add(attr);
181
+ return;
182
+ }
183
+ }
184
+ this.elementRef.nativeElement.classList.add('mc-standard-tag');
185
+ }
186
+ ngOnDestroy() {
187
+ this.destroyed.emit({ tag: this });
188
+ }
189
+ select() {
190
+ if (!this._selected) {
191
+ this._selected = true;
192
+ this.dispatchSelectionChange();
193
+ }
194
+ }
195
+ deselect() {
196
+ if (this._selected) {
197
+ this._selected = false;
198
+ this.dispatchSelectionChange();
199
+ }
200
+ }
201
+ selectViaInteraction() {
202
+ if (!this._selected) {
203
+ this._selected = true;
204
+ this.dispatchSelectionChange(true);
205
+ }
206
+ }
207
+ toggleSelected(isUserInput = false) {
208
+ this._selected = !this.selected;
209
+ this.dispatchSelectionChange(isUserInput);
210
+ return this.selected;
211
+ }
212
+ /** Allows for programmatic focusing of the tag. */
213
+ focus() {
214
+ if (!this.selectable) {
215
+ return;
216
+ }
217
+ if (!this.hasFocus) {
218
+ this.elementRef.nativeElement.focus();
219
+ this.onFocus.next({ tag: this });
220
+ Promise.resolve().then(() => {
221
+ this.hasFocus = true;
222
+ this.changeDetectorRef.markForCheck();
223
+ });
224
+ }
225
+ }
226
+ /**
227
+ * Allows for programmatic removal of the tag. Called by the McTagList when the DELETE or
228
+ * BACKSPACE keys are pressed.
229
+ *
230
+ * Informs any listeners of the removal request. Does not remove the tag from the DOM.
231
+ */
232
+ remove() {
233
+ if (this.removable) {
234
+ this.removed.emit({ tag: this });
235
+ }
236
+ }
237
+ handleClick(event) {
238
+ if (this.disabled) {
239
+ event.preventDefault();
240
+ }
241
+ else {
242
+ event.stopPropagation();
243
+ }
244
+ }
245
+ handleKeydown(event) {
246
+ if (this.disabled) {
247
+ return;
248
+ }
249
+ // tslint:disable-next-line: deprecation
250
+ switch (event.keyCode) {
251
+ case DELETE:
252
+ case BACKSPACE:
253
+ // If we are removable, remove the focused tag
254
+ this.remove();
255
+ // Always prevent so page navigation does not occur
256
+ event.preventDefault();
257
+ break;
258
+ case SPACE:
259
+ // If we are selectable, toggle the focused tag
260
+ if (this.selectable) {
261
+ this.toggleSelected(true);
262
+ }
263
+ // Always prevent space from scrolling the page since the list has focus
264
+ event.preventDefault();
265
+ break;
266
+ default:
267
+ }
268
+ }
269
+ blur() {
270
+ // When animations are enabled, Angular may end up removing the tag from the DOM a little
271
+ // earlier than usual, causing it to be blurred and throwing off the logic in the tag list
272
+ // that moves focus not the next item. To work around the issue, we defer marking the tag
273
+ // as not focused until the next time the zone stabilizes.
274
+ this._ngZone.onStable
275
+ .asObservable()
276
+ .pipe(take(1))
277
+ .subscribe(() => {
278
+ this._ngZone.run(() => {
279
+ this.hasFocus = false;
280
+ this.onBlur.next({ tag: this });
281
+ });
282
+ });
283
+ }
284
+ dispatchSelectionChange(isUserInput = false) {
285
+ this.selectionChange.emit({
286
+ source: this,
287
+ isUserInput,
288
+ selected: this._selected
289
+ });
290
+ }
291
+ }
292
+ /** @nocollapse */ /** @nocollapse */ McTag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTag, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
293
+ /** @nocollapse */ /** @nocollapse */ McTag.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: McTag, selector: "mc-tag, [mc-tag], mc-basic-tag, [mc-basic-tag]", inputs: { color: "color", selected: "selected", value: "value", selectable: "selectable", removable: "removable", disabled: "disabled" }, outputs: { selectionChange: "selectionChange", destroyed: "destroyed", removed: "removed" }, host: { listeners: { "click": "handleClick($event)", "keydown": "handleKeydown($event)", "focus": "focus()", "blur": "blur()" }, properties: { "attr.tabindex": "tabindex", "attr.disabled": "disabled || null", "class.mc-selected": "selected", "class.mc-focused": "hasFocus", "class.mc-tag-with-avatar": "avatar", "class.mc-tag-with-icon": "contentChildren", "class.mc-tag-with-trailing-icon": "trailingIcon || removeIcon", "class.mc-disabled": "disabled" }, classAttribute: "mc-tag" }, queries: [{ propertyName: "avatar", first: true, predicate: McTagAvatar, descendants: true }, { propertyName: "trailingIcon", first: true, predicate: McTagTrailingIcon, descendants: true }, { propertyName: "removeIcon", first: true, predicate: i0.forwardRef(function () { return McTagRemove; }), descendants: true }, { propertyName: "contentChildren", predicate: McIcon }], exportAs: ["mcTag"], usesInheritance: true, ngImport: i0, template: "<div class=\"mc-tag__wrapper\">\r\n <ng-content select=\"[mc-icon]:not([mcTagRemove])\"></ng-content>\r\n <span class=\"mc-tag__text\"><ng-content></ng-content></span>\r\n <ng-content select=\"[mcTagRemove]\"></ng-content>\r\n</div>\r\n<div class=\"mc-tag-overlay\"></div> \r\n", styles: [".mc-tag{position:relative;display:inline-block;max-width:100%;margin:var(--mc-tags-size-margin, 2px);height:var(--mc-tags-size-height, 24px);border-width:var(--mc-tags-size-border-width, 1px);border-style:solid;border-radius:var(--mc-tags-size-border-radius, 4px);cursor:default;outline:none;box-sizing:border-box}.mc-tag .mc-icon.mc-tag-remove:hover{cursor:pointer}.mc-tag.mc-disabled .mc-icon.mc-tag-remove:hover{cursor:default}.mc-tag .mc-tag__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mc-tag:not(.mc-tag-with-icon) .mc-tag__text{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper{display:flex;align-items:center;height:100%;flex:1 1 100%}.mc-tag__wrapper .mc-icon.mc-tag-remove{display:flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--mc-tags-size-height, 24px);padding-left:var(--mc-tags-size-icon-padding, 4px);padding-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper .mc-icon_left{margin-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper>.mc-icon:first-child{margin-left:calc(var(--mc-tags-size-icon-padding, 4px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:last-child{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:first-child{margin-left:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag-overlay{position:absolute;top:-1px;left:-1px;right:-1px;bottom:-1px;pointer-events:none;border-radius:inherit}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTag, decorators: [{
295
+ type: Component,
296
+ args: [{ selector: 'mc-tag, [mc-tag], mc-basic-tag, [mc-basic-tag]', exportAs: 'mcTag', inputs: ['color'], host: {
297
+ class: 'mc-tag',
298
+ '[attr.tabindex]': 'tabindex',
299
+ '[attr.disabled]': 'disabled || null',
300
+ '[class.mc-selected]': 'selected',
301
+ '[class.mc-focused]': 'hasFocus',
302
+ '[class.mc-tag-with-avatar]': 'avatar',
303
+ '[class.mc-tag-with-icon]': 'contentChildren',
304
+ '[class.mc-tag-with-trailing-icon]': 'trailingIcon || removeIcon',
305
+ '[class.mc-disabled]': 'disabled',
306
+ '(click)': 'handleClick($event)',
307
+ '(keydown)': 'handleKeydown($event)',
308
+ '(focus)': 'focus()',
309
+ '(blur)': 'blur()'
310
+ }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"mc-tag__wrapper\">\r\n <ng-content select=\"[mc-icon]:not([mcTagRemove])\"></ng-content>\r\n <span class=\"mc-tag__text\"><ng-content></ng-content></span>\r\n <ng-content select=\"[mcTagRemove]\"></ng-content>\r\n</div>\r\n<div class=\"mc-tag-overlay\"></div> \r\n", styles: [".mc-tag{position:relative;display:inline-block;max-width:100%;margin:var(--mc-tags-size-margin, 2px);height:var(--mc-tags-size-height, 24px);border-width:var(--mc-tags-size-border-width, 1px);border-style:solid;border-radius:var(--mc-tags-size-border-radius, 4px);cursor:default;outline:none;box-sizing:border-box}.mc-tag .mc-icon.mc-tag-remove:hover{cursor:pointer}.mc-tag.mc-disabled .mc-icon.mc-tag-remove:hover{cursor:default}.mc-tag .mc-tag__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mc-tag:not(.mc-tag-with-icon) .mc-tag__text{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper{display:flex;align-items:center;height:100%;flex:1 1 100%}.mc-tag__wrapper .mc-icon.mc-tag-remove{display:flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--mc-tags-size-height, 24px);padding-left:var(--mc-tags-size-icon-padding, 4px);padding-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper .mc-icon_left{margin-right:var(--mc-tags-size-icon-padding, 4px)}.mc-tag__wrapper>.mc-icon:first-child{margin-left:calc(var(--mc-tags-size-icon-padding, 4px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:last-child{margin-right:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag__wrapper>.mc-tag__text:first-child{margin-left:calc(var(--mc-tags-size-text-margin, 8px) - var(--mc-tags-size-border-width, 1px))}.mc-tag-overlay{position:absolute;top:-1px;left:-1px;right:-1px;bottom:-1px;pointer-events:none;border-radius:inherit}\n"] }]
311
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { contentChildren: [{
312
+ type: ContentChildren,
313
+ args: [McIcon]
314
+ }], avatar: [{
315
+ type: ContentChild,
316
+ args: [McTagAvatar, { static: false }]
317
+ }], trailingIcon: [{
318
+ type: ContentChild,
319
+ args: [McTagTrailingIcon, { static: false }]
320
+ }], removeIcon: [{
321
+ type: ContentChild,
322
+ args: [forwardRef(() => McTagRemove), { static: false }]
323
+ }], selectionChange: [{
324
+ type: Output
325
+ }], destroyed: [{
326
+ type: Output
327
+ }], removed: [{
328
+ type: Output
329
+ }], selected: [{
330
+ type: Input
331
+ }], value: [{
332
+ type: Input
333
+ }], selectable: [{
334
+ type: Input
335
+ }], removable: [{
336
+ type: Input
337
+ }], disabled: [{
338
+ type: Input
339
+ }] } });
340
+ /**
341
+ *
342
+ * Example:
343
+ *
344
+ * `<mc-tag>
345
+ * <mc-icon mcTagRemove>cancel</mc-icon>
346
+ * </mc-tag>`
347
+ *
348
+ * You *may* use a custom icon, but you may need to override the `mc-tag-remove` positioning
349
+ * styles to properly center the icon within the tag.
350
+ */
351
+ class McTagRemove {
352
+ constructor(parentTag) {
353
+ this.parentTag = parentTag;
354
+ }
355
+ focus($event) {
356
+ $event.stopPropagation();
357
+ }
358
+ /** Calls the parent tag's public `remove()` method if applicable. */
359
+ handleClick(event) {
360
+ if (this.parentTag.removable) {
361
+ this.parentTag.hasFocus = true;
362
+ this.parentTag.remove();
363
+ }
364
+ // We need to stop event propagation because otherwise the event will bubble up to the
365
+ // form field and cause the `onContainerClick` method to be invoked. This method would then
366
+ // reset the focused tag that has been focused after tag removal. Usually the parent
367
+ // the parent click listener of the `McTag` would prevent propagation, but it can happen
368
+ // that the tag is being removed before the event bubbles up.
369
+ event.stopPropagation();
370
+ }
371
+ }
372
+ /** @nocollapse */ /** @nocollapse */ McTagRemove.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagRemove, deps: [{ token: forwardRef(() => McTag) }], target: i0.ɵɵFactoryTarget.Directive });
373
+ /** @nocollapse */ /** @nocollapse */ McTagRemove.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McTagRemove, selector: "[mcTagRemove]", host: { listeners: { "click": "handleClick($event)", "focus": "focus($event)" }, properties: { "attr.tabindex": "-1" }, classAttribute: "mc-tag-remove mc-tag-trailing-icon" }, ngImport: i0 });
374
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagRemove, decorators: [{
375
+ type: Directive,
376
+ args: [{
377
+ selector: '[mcTagRemove]',
378
+ host: {
379
+ class: 'mc-tag-remove mc-tag-trailing-icon',
380
+ '[attr.tabindex]': '-1',
381
+ '(click)': 'handleClick($event)',
382
+ '(focus)': 'focus($event)'
383
+ }
384
+ }]
385
+ }], ctorParameters: function () { return [{ type: McTag, decorators: [{
386
+ type: Inject,
387
+ args: [forwardRef(() => McTag)]
388
388
  }] }]; } });
389
389
 
390
- class McTagListBase {
391
- constructor(defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl) {
392
- this.defaultErrorStateMatcher = defaultErrorStateMatcher;
393
- this.parentForm = parentForm;
394
- this.parentFormGroup = parentFormGroup;
395
- this.ngControl = ngControl;
396
- }
397
- }
398
- // tslint:disable-next-line:naming-convention
399
- const McTagListMixinBase = mixinErrorState(McTagListBase);
400
- // Increasing integer for generating unique ids for tag-list components.
401
- let nextUniqueId$1 = 0;
402
- /** Change event object that is emitted when the tag list value has changed. */
403
- class McTagListChange {
404
- constructor(source, value) {
405
- this.source = source;
406
- this.value = value;
407
- }
408
- }
409
- class McTagList extends McTagListMixinBase {
410
- constructor(elementRef, changeDetectorRef, defaultErrorStateMatcher, rawValidators, mcValidation, dir, parentForm, parentFormGroup, ngControl, ngModel, formControlName) {
411
- super(defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl);
412
- this.elementRef = elementRef;
413
- this.changeDetectorRef = changeDetectorRef;
414
- this.rawValidators = rawValidators;
415
- this.mcValidation = mcValidation;
416
- this.dir = dir;
417
- this.ngModel = ngModel;
418
- this.formControlName = formControlName;
419
- this.controlType = 'tag-list';
420
- this._tabIndex = 0;
421
- /**
422
- * Event that emits whenever the raw value of the tag-list changes. This is here primarily
423
- * to facilitate the two-way binding for the `value` input.
424
- * @docs-private
425
- */
426
- this.valueChange = new EventEmitter();
427
- this.uid = `mc-tag-list-${nextUniqueId$1++}`;
428
- /**
429
- * User defined tab index.
430
- * When it is not null, use user defined tab index. Otherwise use tabIndex
431
- */
432
- this.userTabIndex = null;
433
- this.tagChanges = new EventEmitter();
434
- /** Orientation of the tag list. */
435
- this.orientation = 'horizontal';
436
- /** Event emitted when the selected tag list value has been changed by the user. */
437
- this.change = new EventEmitter();
438
- this._required = false;
439
- this._disabled = false;
440
- this._selectable = true;
441
- this._multiple = false;
442
- /**
443
- * When a tag is destroyed, we store the index of the destroyed tag until the tags
444
- * query list notifies about the update. This is necessary because we cannot determine an
445
- * appropriate tag that should receive focus until the array of tags updated completely.
446
- */
447
- this.lastDestroyedTagIndex = null;
448
- /** Subject that emits when the component has been destroyed. */
449
- this.destroyed = new Subject();
450
- // tslint:disable-next-line:no-empty
451
- this.onTouched = () => { };
452
- // tslint:disable-next-line:no-empty
453
- this.onChange = () => { };
454
- this._compareWith = (o1, o2) => o1 === o2;
455
- if (this.ngControl) {
456
- this.ngControl.valueAccessor = this;
457
- }
458
- }
459
- /** Combined stream of all of the child tags' selection change events. */
460
- get tagSelectionChanges() {
461
- return merge(...this.tags.map((tag) => tag.selectionChange));
462
- }
463
- /** Combined stream of all of the child tags' focus change events. */
464
- get tagFocusChanges() {
465
- return merge(...this.tags.map((tag) => tag.onFocus));
466
- }
467
- /** Combined stream of all of the child tags' blur change events. */
468
- get tagBlurChanges() {
469
- return merge(...this.tags.map((tag) => tag.onBlur));
470
- }
471
- /** Combined stream of all of the child tags' remove change events. */
472
- get tagRemoveChanges() {
473
- return merge(...this.tags.map((tag) => tag.destroyed));
474
- }
475
- /** The array of selected tags inside tag list. */
476
- get selected() {
477
- return this.multiple ? this.selectionModel.selected : this.selectionModel.selected[0];
478
- }
479
- get canShowCleaner() {
480
- return this.cleaner && this.tags.length > 0;
481
- }
482
- /** Whether the user should be allowed to select multiple tags. */
483
- get multiple() {
484
- return this._multiple;
485
- }
486
- set multiple(value) {
487
- this._multiple = coerceBooleanProperty(value);
488
- }
489
- /**
490
- * A function to compare the option values with the selected values. The first argument
491
- * is a value from an option. The second is a value from the selection. A boolean
492
- * should be returned.
493
- */
494
- get compareWith() {
495
- return this._compareWith;
496
- }
497
- set compareWith(fn) {
498
- this._compareWith = fn;
499
- if (this.selectionModel) {
500
- // A different comparator means the selection could change.
501
- this.initializeSelection();
502
- }
503
- }
504
- /**
505
- * Implemented as part of McFormFieldControl.
506
- * @docs-private
507
- */
508
- get value() {
509
- return this._value;
510
- }
511
- set value(value) {
512
- this.writeValue(value);
513
- this._value = value;
514
- }
515
- /**
516
- * Implemented as part of McFormFieldControl.
517
- * @docs-private
518
- */
519
- get id() {
520
- return this.tagInput ? this.tagInput.id : this.uid;
521
- }
522
- /**
523
- * Implemented as part of McFormFieldControl.
524
- * @docs-private
525
- */
526
- get required() {
527
- return this._required;
528
- }
529
- set required(value) {
530
- this._required = coerceBooleanProperty(value);
531
- this.stateChanges.next();
532
- }
533
- /**
534
- * Implemented as part of McFormFieldControl.
535
- * @docs-private
536
- */
537
- get placeholder() {
538
- return this.tagInput ? this.tagInput.placeholder : this._placeholder;
539
- }
540
- set placeholder(value) {
541
- this._placeholder = value;
542
- this.stateChanges.next();
543
- }
544
- /** Whether any tags or the mcTagInput inside of this tag-list has focus. */
545
- get focused() {
546
- return (this.tagInput && this.tagInput.focused) || this.hasFocusedTag();
547
- }
548
- /**
549
- * Implemented as part of McFormFieldControl.
550
- * @docs-private
551
- */
552
- get empty() {
553
- return (!this.tagInput || this.tagInput.empty) && this.tags.length === 0;
554
- }
555
- /**
556
- * Implemented as part of McFormFieldControl.
557
- * @docs-private
558
- */
559
- get shouldLabelFloat() {
560
- return !this.empty || this.focused;
561
- }
562
- /**
563
- * Implemented as part of McFormFieldControl.
564
- * @docs-private
565
- */
566
- get disabled() {
567
- return this.ngControl ? !!this.ngControl.disabled : this._disabled;
568
- }
569
- set disabled(value) {
570
- this._disabled = coerceBooleanProperty(value);
571
- this.syncTagsDisabledState();
572
- }
573
- /**
574
- * Whether or not this tag list is selectable. When a tag list is not selectable,
575
- * the selected states for all the tags inside the tag list are always ignored.
576
- */
577
- get selectable() {
578
- return this._selectable;
579
- }
580
- set selectable(value) {
581
- this._selectable = coerceBooleanProperty(value);
582
- if (this.tags) {
583
- this.tags.forEach((tag) => tag.tagListSelectable = this._selectable);
584
- }
585
- }
586
- get tabIndex() {
587
- return this._tabIndex;
588
- }
589
- set tabIndex(value) {
590
- this.userTabIndex = value;
591
- this._tabIndex = value;
592
- }
593
- ngAfterContentInit() {
594
- if (this.mcValidation.useValidation) {
595
- setMosaicValidation(this, this.changeDetectorRef);
596
- }
597
- this.keyManager = new FocusKeyManager(this.tags)
598
- .withVerticalOrientation()
599
- .withHorizontalOrientation(this.dir ? this.dir.value : 'ltr');
600
- if (this.dir) {
601
- this.dir.change
602
- .pipe(takeUntil(this.destroyed))
603
- .subscribe((dir) => this.keyManager.withHorizontalOrientation(dir));
604
- }
605
- // Prevents the tag list from capturing focus and redirecting
606
- // it back to the first tag when the user tabs out.
607
- this.keyManager.tabOut
608
- .pipe(takeUntil(this.destroyed))
609
- .subscribe(() => {
610
- this._tabIndex = -1;
611
- setTimeout(() => {
612
- this._tabIndex = this.userTabIndex || 0;
613
- this.changeDetectorRef.markForCheck();
614
- });
615
- });
616
- // When the list changes, re-subscribe
617
- this.tags.changes
618
- .pipe(startWith(null), takeUntil(this.destroyed))
619
- .subscribe(() => {
620
- if (this.disabled) {
621
- // Since this happens after the content has been
622
- // checked, we need to defer it to the next tick.
623
- Promise.resolve().then(() => { this.syncTagsDisabledState(); });
624
- }
625
- this.resetTags();
626
- // Reset tags selected/deselected status
627
- this.initializeSelection();
628
- // Check to see if we need to update our tab index
629
- this.updateTabIndex();
630
- // Check to see if we have a destroyed tag and need to refocus
631
- this.updateFocusForDestroyedTags();
632
- // Defer setting the value in order to avoid the "Expression
633
- // has changed after it was checked" errors from Angular.
634
- Promise.resolve().then(() => {
635
- this.tagChanges.emit(this.tags.toArray());
636
- this.stateChanges.next();
637
- this.propagateTagsChanges();
638
- });
639
- });
640
- }
641
- ngOnInit() {
642
- this.selectionModel = new SelectionModel(this.multiple, undefined, false);
643
- this.stateChanges.next();
644
- }
645
- ngDoCheck() {
646
- if (this.ngControl) {
647
- // We need to re-evaluate this on every change detection cycle, because there are some
648
- // error triggers that we can't subscribe to (e.g. parent form submissions). This means
649
- // that whatever logic is in here has to be super lean or we risk destroying the performance.
650
- this.updateErrorState();
651
- }
652
- }
653
- ngOnDestroy() {
654
- this.destroyed.next();
655
- this.destroyed.complete();
656
- this.stateChanges.complete();
657
- this.dropSubscriptions();
658
- }
659
- /** Associates an HTML input element with this tag list. */
660
- registerInput(inputElement) {
661
- this.tagInput = inputElement;
662
- // todo need rethink about it
663
- if (this.ngControl && inputElement.ngControl?.statusChanges) {
664
- inputElement.ngControl.statusChanges
665
- .subscribe(() => this.ngControl.control.setErrors(inputElement.ngControl.errors));
666
- }
667
- }
668
- // Implemented as part of ControlValueAccessor.
669
- writeValue(value) {
670
- if (this.tags) {
671
- this.setSelectionByValue(value, false);
672
- }
673
- }
674
- // Implemented as part of ControlValueAccessor.
675
- registerOnChange(fn) {
676
- this.onChange = fn;
677
- }
678
- // Implemented as part of ControlValueAccessor.
679
- registerOnTouched(fn) {
680
- this.onTouched = fn;
681
- }
682
- // Implemented as part of ControlValueAccessor.
683
- setDisabledState(isDisabled) {
684
- this.disabled = isDisabled;
685
- this.stateChanges.next();
686
- }
687
- /**
688
- * Implemented as part of McFormFieldControl.
689
- * @docs-private
690
- */
691
- onContainerClick(event) {
692
- if (!this.originatesFromTag(event)) {
693
- this.focus();
694
- }
695
- }
696
- /**
697
- * Focuses the first non-disabled tag in this tag list, or the associated input when there
698
- * are no eligible tags.
699
- */
700
- focus() {
701
- if (this.disabled) {
702
- return;
703
- }
704
- // TODO: ARIA says this should focus the first `selected` tag if any are selected.
705
- // Focus on first element if there's no tagInput inside tag-list
706
- if (this.tagInput && this.tagInput.focused) {
707
- // do nothing
708
- }
709
- else if (this.tags.length > 0) {
710
- this.keyManager.setFirstItemActive();
711
- this.stateChanges.next();
712
- }
713
- else {
714
- this.focusInput();
715
- this.stateChanges.next();
716
- }
717
- }
718
- /** Attempt to focus an input if we have one. */
719
- focusInput() {
720
- if (this.tagInput) {
721
- this.tagInput.focus();
722
- }
723
- }
724
- /**
725
- * Pass events to the keyboard manager. Available here for tests.
726
- */
727
- keydown(event) {
728
- const target = event.target;
729
- // If they are on an empty input and hit backspace, focus the last tag
730
- // tslint:disable-next-line: deprecation
731
- if (event.keyCode === BACKSPACE && this.isInputEmpty(target)) {
732
- this.keyManager.setLastItemActive();
733
- event.preventDefault();
734
- }
735
- else if (target && target.classList.contains('mc-tag')) {
736
- // tslint:disable-next-line: deprecation
737
- if (event.keyCode === HOME) {
738
- this.keyManager.setFirstItemActive();
739
- event.preventDefault();
740
- // tslint:disable-next-line: deprecation
741
- }
742
- else if (event.keyCode === END) {
743
- this.keyManager.setLastItemActive();
744
- event.preventDefault();
745
- }
746
- else {
747
- this.keyManager.onKeydown(event);
748
- }
749
- this.stateChanges.next();
750
- }
751
- }
752
- setSelectionByValue(value, isUserInput = true) {
753
- this.clearSelection();
754
- this.tags.forEach((tag) => tag.deselect());
755
- if (Array.isArray(value)) {
756
- value.forEach((currentValue) => this.selectValue(currentValue, isUserInput));
757
- this.sortValues();
758
- }
759
- else {
760
- const correspondingTag = this.selectValue(value, isUserInput);
761
- // Shift focus to the active item. Note that we shouldn't do this in multiple
762
- // mode, because we don't know what tag the user interacted with last.
763
- if (correspondingTag && isUserInput) {
764
- this.keyManager.setActiveItem(correspondingTag);
765
- }
766
- }
767
- }
768
- /** When blurred, mark the field as touched when focus moved outside the tag list. */
769
- blur() {
770
- if (!this.hasFocusedTag()) {
771
- this.keyManager.setActiveItem(-1);
772
- }
773
- if (!this.disabled) {
774
- if (this.tagInput) {
775
- // If there's a tag input, we should check whether the focus moved to tag input.
776
- // If the focus is not moved to tag input, mark the field as touched. If the focus moved
777
- // to tag input, do nothing.
778
- // Timeout is needed to wait for the focus() event trigger on tag input.
779
- setTimeout(() => {
780
- if (!this.focused) {
781
- this.markAsTouched();
782
- }
783
- });
784
- }
785
- else {
786
- // If there's no tag input, then mark the field as touched.
787
- this.markAsTouched();
788
- }
789
- }
790
- }
791
- /** Mark the field as touched */
792
- markAsTouched() {
793
- this.onTouched();
794
- this.changeDetectorRef.markForCheck();
795
- this.stateChanges.next();
796
- }
797
- /**
798
- * Check the tab index as you should not be allowed to focus an empty list.
799
- */
800
- updateTabIndex() {
801
- // If we have 0 tags, we should not allow keyboard focus
802
- this._tabIndex = this.userTabIndex || (this.tags.length === 0 ? -1 : 0);
803
- }
804
- /**
805
- * If the amount of tags changed, we need to update the
806
- * key manager state and focus the next closest tag.
807
- */
808
- updateFocusForDestroyedTags() {
809
- if (this.lastDestroyedTagIndex != null) {
810
- if (this.tags.length) {
811
- const newTagIndex = Math.min(this.lastDestroyedTagIndex, this.tags.length - 1);
812
- this.keyManager.setActiveItem(newTagIndex);
813
- }
814
- else {
815
- this.focusInput();
816
- }
817
- }
818
- this.lastDestroyedTagIndex = null;
819
- }
820
- /**
821
- * Utility to ensure all indexes are valid.
822
- *
823
- * @param index The index to be checked.
824
- * @returns True if the index is valid for our list of tags.
825
- */
826
- isValidIndex(index) {
827
- return index >= 0 && index < this.tags.length;
828
- }
829
- isInputEmpty(element) {
830
- if (element && element.nodeName.toLowerCase() === 'input') {
831
- const input = element;
832
- return !input.value;
833
- }
834
- return false;
835
- }
836
- /**
837
- * Finds and selects the tag based on its value.
838
- * @returns Tag that has the corresponding value.
839
- */
840
- selectValue(value, isUserInput = true) {
841
- const correspondingTag = this.tags.find((tag) => {
842
- return tag.value != null && this._compareWith(tag.value, value);
843
- });
844
- if (correspondingTag) {
845
- if (isUserInput) {
846
- correspondingTag.selectViaInteraction();
847
- }
848
- else {
849
- correspondingTag.select();
850
- }
851
- this.selectionModel.select(correspondingTag);
852
- }
853
- return correspondingTag;
854
- }
855
- initializeSelection() {
856
- // Defer setting the value in order to avoid the "Expression
857
- // has changed after it was checked" errors from Angular.
858
- Promise.resolve().then(() => {
859
- if (this.ngControl || this._value) {
860
- this.setSelectionByValue(this.ngControl ? this.ngControl.value : this._value, false);
861
- this.stateChanges.next();
862
- }
863
- });
864
- }
865
- /**
866
- * Deselects every tag in the list.
867
- * @param skip Tag that should not be deselected.
868
- */
869
- clearSelection(skip) {
870
- this.selectionModel.clear();
871
- this.tags.forEach((tag) => {
872
- if (tag !== skip) {
873
- tag.deselect();
874
- }
875
- });
876
- this.stateChanges.next();
877
- }
878
- /**
879
- * Sorts the model values, ensuring that they keep the same
880
- * order that they have in the panel.
881
- */
882
- sortValues() {
883
- if (this._multiple) {
884
- this.selectionModel.clear();
885
- this.tags.forEach((tag) => {
886
- if (tag.selected) {
887
- this.selectionModel.select(tag);
888
- }
889
- });
890
- this.stateChanges.next();
891
- }
892
- }
893
- /** Emits change event to set the model value. */
894
- // todo need rethink this method and selection logic
895
- propagateChanges(fallbackValue) {
896
- let valueToEmit = null;
897
- if (Array.isArray(this.selected)) {
898
- valueToEmit = this.selected.map((tag) => tag.value);
899
- }
900
- else {
901
- valueToEmit = this.selected ? this.selected.value : fallbackValue;
902
- }
903
- this._value = valueToEmit;
904
- this.change.emit(new McTagListChange(this, valueToEmit));
905
- this.valueChange.emit(valueToEmit);
906
- this.onChange(valueToEmit);
907
- this.changeDetectorRef.markForCheck();
908
- }
909
- propagateTagsChanges() {
910
- const valueToEmit = this.tags.map((tag) => tag.value);
911
- this._value = valueToEmit;
912
- this.change.emit(new McTagListChange(this, valueToEmit));
913
- this.valueChange.emit(valueToEmit);
914
- this.onChange(valueToEmit);
915
- this.changeDetectorRef.markForCheck();
916
- }
917
- resetTags() {
918
- this.dropSubscriptions();
919
- this.listenToTagsFocus();
920
- this.listenToTagsSelection();
921
- this.listenToTagsRemoved();
922
- }
923
- dropSubscriptions() {
924
- if (this.tagFocusSubscription) {
925
- this.tagFocusSubscription.unsubscribe();
926
- this.tagFocusSubscription = null;
927
- }
928
- if (this.tagBlurSubscription) {
929
- this.tagBlurSubscription.unsubscribe();
930
- this.tagBlurSubscription = null;
931
- }
932
- if (this.tagSelectionSubscription) {
933
- this.tagSelectionSubscription.unsubscribe();
934
- this.tagSelectionSubscription = null;
935
- }
936
- if (this.tagRemoveSubscription) {
937
- this.tagRemoveSubscription.unsubscribe();
938
- this.tagRemoveSubscription = null;
939
- }
940
- }
941
- /** Listens to user-generated selection events on each tag. */
942
- listenToTagsSelection() {
943
- this.tagSelectionSubscription = this.tagSelectionChanges.subscribe((event) => {
944
- if (event.source.selected) {
945
- this.selectionModel.select(event.source);
946
- }
947
- else {
948
- this.selectionModel.deselect(event.source);
949
- }
950
- // For single selection tag list, make sure the deselected value is unselected.
951
- if (!this.multiple) {
952
- this.tags.forEach((tag) => {
953
- if (!this.selectionModel.isSelected(tag) && tag.selected) {
954
- tag.deselect();
955
- }
956
- });
957
- }
958
- if (event.isUserInput) {
959
- this.propagateChanges();
960
- }
961
- });
962
- }
963
- /** Listens to user-generated selection events on each tag. */
964
- listenToTagsFocus() {
965
- this.tagFocusSubscription = this.tagFocusChanges
966
- .subscribe((event) => {
967
- const tagIndex = this.tags.toArray().indexOf(event.tag);
968
- if (this.isValidIndex(tagIndex)) {
969
- this.keyManager.updateActiveItem(tagIndex);
970
- }
971
- this.stateChanges.next();
972
- });
973
- this.tagBlurSubscription = this.tagBlurChanges
974
- .subscribe(() => {
975
- this.blur();
976
- this.stateChanges.next();
977
- });
978
- }
979
- listenToTagsRemoved() {
980
- this.tagRemoveSubscription = this.tagRemoveChanges
981
- .subscribe((event) => {
982
- const tag = event.tag;
983
- const tagIndex = this.tags.toArray().indexOf(event.tag);
984
- // In case the tag that will be removed is currently focused, we temporarily store
985
- // the index in order to be able to determine an appropriate sibling tag that will
986
- // receive focus.
987
- if (this.isValidIndex(tagIndex) && tag.hasFocus) {
988
- this.lastDestroyedTagIndex = tagIndex;
989
- }
990
- });
991
- }
992
- /** Checks whether an event comes from inside a tag element. */
993
- originatesFromTag(event) {
994
- let currentElement = event.target;
995
- while (currentElement && currentElement !== this.elementRef.nativeElement) {
996
- if (currentElement.classList.contains('mc-tag')) {
997
- return true;
998
- }
999
- currentElement = currentElement.parentElement;
1000
- }
1001
- return false;
1002
- }
1003
- /** Checks whether any of the tags is focused. */
1004
- hasFocusedTag() {
1005
- return this.tags.some((tag) => tag.hasFocus);
1006
- }
1007
- /** Syncs the list's disabled state with the individual tags. */
1008
- syncTagsDisabledState() {
1009
- if (this.tags) {
1010
- this.tags.forEach((tag) => {
1011
- tag.disabled = this._disabled;
1012
- });
1013
- }
1014
- }
1015
- }
1016
- /** @nocollapse */ /** @nocollapse */ McTagList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagList, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ErrorStateMatcher }, { token: NG_VALIDATORS, optional: true }, { token: MC_VALIDATION, optional: true }, { token: i2.Directionality, optional: true }, { token: i3.NgForm, optional: true }, { token: i3.FormGroupDirective, optional: true }, { token: i3.NgControl, optional: true, self: true }, { token: i3.NgModel, optional: true, self: true }, { token: i3.FormControlName, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
1017
- /** @nocollapse */ /** @nocollapse */ McTagList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.7", type: McTagList, selector: "mc-tag-list", inputs: { multiple: "multiple", compareWith: "compareWith", value: "value", required: "required", placeholder: "placeholder", disabled: "disabled", selectable: "selectable", tabIndex: "tabIndex", errorStateMatcher: "errorStateMatcher", orientation: "orientation" }, outputs: { valueChange: "valueChange", change: "change" }, host: { listeners: { "focus": "focus()", "blur": "blur()", "keydown": "keydown($event)" }, properties: { "class.mc-disabled": "disabled", "class.mc-invalid": "errorState", "attr.tabindex": "disabled ? null : tabIndex", "id": "uid" }, classAttribute: "mc-tag-list" }, providers: [{ provide: McFormFieldControl, useExisting: McTagList }], queries: [{ propertyName: "cleaner", first: true, predicate: ["mcTagListCleaner"], descendants: true, static: true }, { propertyName: "tags", predicate: McTag, descendants: true }], exportAs: ["mcTagList"], usesInheritance: true, ngImport: i0, template: "<div class=\"mc-tags-list__list-container\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"mc-tags-list__cleaner\"\n *ngIf=\"canShowCleaner\">\n <ng-content select=\"mc-cleaner\"></ng-content>\n</div>\n", styles: [".mc-tag-list{display:flex;flex-direction:row;box-sizing:border-box}.mc-tag-input{border:none;outline:none;background:transparent}.mc-tags-list__list-container{display:flex;flex-wrap:wrap;flex:1 1 100%;box-sizing:border-box;min-width:0;min-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);padding:var(--mc-tag-list-size-padding, 1px 12px)}.mc-tags-list__list-container .mc-tag-input{max-width:100%;flex:1 1 auto;height:var(--mc-tag-input-size-height, 22px);margin:var(--mc-tag-input-size-margin, 2px 4px)}.mc-tags-list__cleaner .mc-cleaner{height:30px}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1018
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagList, decorators: [{
1019
- type: Component,
1020
- args: [{ selector: 'mc-tag-list', exportAs: 'mcTagList', host: {
1021
- class: 'mc-tag-list',
1022
- '[class.mc-disabled]': 'disabled',
1023
- '[class.mc-invalid]': 'errorState',
1024
- '[attr.tabindex]': 'disabled ? null : tabIndex',
1025
- '[id]': 'uid',
1026
- '(focus)': 'focus()',
1027
- '(blur)': 'blur()',
1028
- '(keydown)': 'keydown($event)'
1029
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: McFormFieldControl, useExisting: McTagList }], template: "<div class=\"mc-tags-list__list-container\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"mc-tags-list__cleaner\"\n *ngIf=\"canShowCleaner\">\n <ng-content select=\"mc-cleaner\"></ng-content>\n</div>\n", styles: [".mc-tag-list{display:flex;flex-direction:row;box-sizing:border-box}.mc-tag-input{border:none;outline:none;background:transparent}.mc-tags-list__list-container{display:flex;flex-wrap:wrap;flex:1 1 100%;box-sizing:border-box;min-width:0;min-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);padding:var(--mc-tag-list-size-padding, 1px 12px)}.mc-tags-list__list-container .mc-tag-input{max-width:100%;flex:1 1 auto;height:var(--mc-tag-input-size-height, 22px);margin:var(--mc-tag-input-size-margin, 2px 4px)}.mc-tags-list__cleaner .mc-cleaner{height:30px}\n"] }]
1030
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ErrorStateMatcher }, { type: undefined, decorators: [{
1031
- type: Optional
1032
- }, {
1033
- type: Inject,
1034
- args: [NG_VALIDATORS]
1035
- }] }, { type: undefined, decorators: [{
1036
- type: Optional
1037
- }, {
1038
- type: Inject,
1039
- args: [MC_VALIDATION]
1040
- }] }, { type: i2.Directionality, decorators: [{
1041
- type: Optional
1042
- }] }, { type: i3.NgForm, decorators: [{
1043
- type: Optional
1044
- }] }, { type: i3.FormGroupDirective, decorators: [{
1045
- type: Optional
1046
- }] }, { type: i3.NgControl, decorators: [{
1047
- type: Optional
1048
- }, {
1049
- type: Self
1050
- }] }, { type: i3.NgModel, decorators: [{
1051
- type: Optional
1052
- }, {
1053
- type: Self
1054
- }] }, { type: i3.FormControlName, decorators: [{
1055
- type: Optional
1056
- }, {
1057
- type: Self
1058
- }] }]; }, propDecorators: { multiple: [{
1059
- type: Input
1060
- }], compareWith: [{
1061
- type: Input
1062
- }], value: [{
1063
- type: Input
1064
- }], required: [{
1065
- type: Input
1066
- }], placeholder: [{
1067
- type: Input
1068
- }], disabled: [{
1069
- type: Input
1070
- }], selectable: [{
1071
- type: Input
1072
- }], tabIndex: [{
1073
- type: Input
1074
- }], valueChange: [{
1075
- type: Output
1076
- }], errorStateMatcher: [{
1077
- type: Input
1078
- }], orientation: [{
1079
- type: Input,
1080
- args: ['orientation']
1081
- }], change: [{
1082
- type: Output
1083
- }], cleaner: [{
1084
- type: ContentChild,
1085
- args: ['mcTagListCleaner', { static: true }]
1086
- }], tags: [{
1087
- type: ContentChildren,
1088
- args: [McTag, {
1089
- // Need to use `descendants: true`,
1090
- // Ivy will no longer match indirect descendants if it's left as false.
1091
- descendants: true
1092
- }]
390
+ class McTagListBase {
391
+ constructor(defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl) {
392
+ this.defaultErrorStateMatcher = defaultErrorStateMatcher;
393
+ this.parentForm = parentForm;
394
+ this.parentFormGroup = parentFormGroup;
395
+ this.ngControl = ngControl;
396
+ }
397
+ }
398
+ // tslint:disable-next-line:naming-convention
399
+ const McTagListMixinBase = mixinErrorState(McTagListBase);
400
+ // Increasing integer for generating unique ids for tag-list components.
401
+ let nextUniqueId$1 = 0;
402
+ /** Change event object that is emitted when the tag list value has changed. */
403
+ class McTagListChange {
404
+ constructor(source, value) {
405
+ this.source = source;
406
+ this.value = value;
407
+ }
408
+ }
409
+ class McTagList extends McTagListMixinBase {
410
+ constructor(elementRef, changeDetectorRef, defaultErrorStateMatcher, rawValidators, mcValidation, dir, parentForm, parentFormGroup, ngControl, ngModel, formControlName) {
411
+ super(defaultErrorStateMatcher, parentForm, parentFormGroup, ngControl);
412
+ this.elementRef = elementRef;
413
+ this.changeDetectorRef = changeDetectorRef;
414
+ this.rawValidators = rawValidators;
415
+ this.mcValidation = mcValidation;
416
+ this.dir = dir;
417
+ this.ngModel = ngModel;
418
+ this.formControlName = formControlName;
419
+ this.controlType = 'tag-list';
420
+ this._tabIndex = 0;
421
+ /**
422
+ * Event that emits whenever the raw value of the tag-list changes. This is here primarily
423
+ * to facilitate the two-way binding for the `value` input.
424
+ * @docs-private
425
+ */
426
+ this.valueChange = new EventEmitter();
427
+ this.uid = `mc-tag-list-${nextUniqueId$1++}`;
428
+ /**
429
+ * User defined tab index.
430
+ * When it is not null, use user defined tab index. Otherwise use tabIndex
431
+ */
432
+ this.userTabIndex = null;
433
+ this.tagChanges = new EventEmitter();
434
+ /** Orientation of the tag list. */
435
+ this.orientation = 'horizontal';
436
+ /** Event emitted when the selected tag list value has been changed by the user. */
437
+ this.change = new EventEmitter();
438
+ this._required = false;
439
+ this._disabled = false;
440
+ this._selectable = true;
441
+ this._multiple = false;
442
+ /**
443
+ * When a tag is destroyed, we store the index of the destroyed tag until the tags
444
+ * query list notifies about the update. This is necessary because we cannot determine an
445
+ * appropriate tag that should receive focus until the array of tags updated completely.
446
+ */
447
+ this.lastDestroyedTagIndex = null;
448
+ /** Subject that emits when the component has been destroyed. */
449
+ this.destroyed = new Subject();
450
+ // tslint:disable-next-line:no-empty
451
+ this.onTouched = () => { };
452
+ // tslint:disable-next-line:no-empty
453
+ this.onChange = () => { };
454
+ this._compareWith = (o1, o2) => o1 === o2;
455
+ if (this.ngControl) {
456
+ this.ngControl.valueAccessor = this;
457
+ }
458
+ }
459
+ /** Combined stream of all of the child tags' selection change events. */
460
+ get tagSelectionChanges() {
461
+ return merge(...this.tags.map((tag) => tag.selectionChange));
462
+ }
463
+ /** Combined stream of all of the child tags' focus change events. */
464
+ get tagFocusChanges() {
465
+ return merge(...this.tags.map((tag) => tag.onFocus));
466
+ }
467
+ /** Combined stream of all of the child tags' blur change events. */
468
+ get tagBlurChanges() {
469
+ return merge(...this.tags.map((tag) => tag.onBlur));
470
+ }
471
+ /** Combined stream of all of the child tags' remove change events. */
472
+ get tagRemoveChanges() {
473
+ return merge(...this.tags.map((tag) => tag.destroyed));
474
+ }
475
+ /** The array of selected tags inside tag list. */
476
+ get selected() {
477
+ return this.multiple ? this.selectionModel.selected : this.selectionModel.selected[0];
478
+ }
479
+ get canShowCleaner() {
480
+ return this.cleaner && this.tags.length > 0;
481
+ }
482
+ /** Whether the user should be allowed to select multiple tags. */
483
+ get multiple() {
484
+ return this._multiple;
485
+ }
486
+ set multiple(value) {
487
+ this._multiple = coerceBooleanProperty(value);
488
+ }
489
+ /**
490
+ * A function to compare the option values with the selected values. The first argument
491
+ * is a value from an option. The second is a value from the selection. A boolean
492
+ * should be returned.
493
+ */
494
+ get compareWith() {
495
+ return this._compareWith;
496
+ }
497
+ set compareWith(fn) {
498
+ this._compareWith = fn;
499
+ if (this.selectionModel) {
500
+ // A different comparator means the selection could change.
501
+ this.initializeSelection();
502
+ }
503
+ }
504
+ /**
505
+ * Implemented as part of McFormFieldControl.
506
+ * @docs-private
507
+ */
508
+ get value() {
509
+ return this._value;
510
+ }
511
+ set value(value) {
512
+ this.writeValue(value);
513
+ this._value = value;
514
+ }
515
+ /**
516
+ * Implemented as part of McFormFieldControl.
517
+ * @docs-private
518
+ */
519
+ get id() {
520
+ return this.tagInput ? this.tagInput.id : this.uid;
521
+ }
522
+ /**
523
+ * Implemented as part of McFormFieldControl.
524
+ * @docs-private
525
+ */
526
+ get required() {
527
+ return this._required;
528
+ }
529
+ set required(value) {
530
+ this._required = coerceBooleanProperty(value);
531
+ this.stateChanges.next();
532
+ }
533
+ /**
534
+ * Implemented as part of McFormFieldControl.
535
+ * @docs-private
536
+ */
537
+ get placeholder() {
538
+ return this.tagInput ? this.tagInput.placeholder : this._placeholder;
539
+ }
540
+ set placeholder(value) {
541
+ this._placeholder = value;
542
+ this.stateChanges.next();
543
+ }
544
+ /** Whether any tags or the mcTagInput inside of this tag-list has focus. */
545
+ get focused() {
546
+ return (this.tagInput && this.tagInput.focused) || this.hasFocusedTag();
547
+ }
548
+ /**
549
+ * Implemented as part of McFormFieldControl.
550
+ * @docs-private
551
+ */
552
+ get empty() {
553
+ return (!this.tagInput || this.tagInput.empty) && this.tags.length === 0;
554
+ }
555
+ /**
556
+ * Implemented as part of McFormFieldControl.
557
+ * @docs-private
558
+ */
559
+ get shouldLabelFloat() {
560
+ return !this.empty || this.focused;
561
+ }
562
+ /**
563
+ * Implemented as part of McFormFieldControl.
564
+ * @docs-private
565
+ */
566
+ get disabled() {
567
+ return this.ngControl ? !!this.ngControl.disabled : this._disabled;
568
+ }
569
+ set disabled(value) {
570
+ this._disabled = coerceBooleanProperty(value);
571
+ this.syncTagsDisabledState();
572
+ }
573
+ /**
574
+ * Whether or not this tag list is selectable. When a tag list is not selectable,
575
+ * the selected states for all the tags inside the tag list are always ignored.
576
+ */
577
+ get selectable() {
578
+ return this._selectable;
579
+ }
580
+ set selectable(value) {
581
+ this._selectable = coerceBooleanProperty(value);
582
+ if (this.tags) {
583
+ this.tags.forEach((tag) => tag.tagListSelectable = this._selectable);
584
+ }
585
+ }
586
+ get tabIndex() {
587
+ return this._tabIndex;
588
+ }
589
+ set tabIndex(value) {
590
+ this.userTabIndex = value;
591
+ this._tabIndex = value;
592
+ }
593
+ ngAfterContentInit() {
594
+ if (this.mcValidation.useValidation) {
595
+ setMosaicValidation(this, this.changeDetectorRef);
596
+ }
597
+ this.keyManager = new FocusKeyManager(this.tags)
598
+ .withVerticalOrientation()
599
+ .withHorizontalOrientation(this.dir ? this.dir.value : 'ltr');
600
+ if (this.dir) {
601
+ this.dir.change
602
+ .pipe(takeUntil(this.destroyed))
603
+ .subscribe((dir) => this.keyManager.withHorizontalOrientation(dir));
604
+ }
605
+ // Prevents the tag list from capturing focus and redirecting
606
+ // it back to the first tag when the user tabs out.
607
+ this.keyManager.tabOut
608
+ .pipe(takeUntil(this.destroyed))
609
+ .subscribe(() => {
610
+ this._tabIndex = -1;
611
+ setTimeout(() => {
612
+ this._tabIndex = this.userTabIndex || 0;
613
+ this.changeDetectorRef.markForCheck();
614
+ });
615
+ });
616
+ // When the list changes, re-subscribe
617
+ this.tags.changes
618
+ .pipe(startWith(null), takeUntil(this.destroyed))
619
+ .subscribe(() => {
620
+ if (this.disabled) {
621
+ // Since this happens after the content has been
622
+ // checked, we need to defer it to the next tick.
623
+ Promise.resolve().then(() => { this.syncTagsDisabledState(); });
624
+ }
625
+ this.resetTags();
626
+ // Reset tags selected/deselected status
627
+ this.initializeSelection();
628
+ // Check to see if we need to update our tab index
629
+ this.updateTabIndex();
630
+ // Check to see if we have a destroyed tag and need to refocus
631
+ this.updateFocusForDestroyedTags();
632
+ // Defer setting the value in order to avoid the "Expression
633
+ // has changed after it was checked" errors from Angular.
634
+ Promise.resolve().then(() => {
635
+ this.tagChanges.emit(this.tags.toArray());
636
+ this.stateChanges.next();
637
+ this.propagateTagsChanges();
638
+ });
639
+ });
640
+ }
641
+ ngOnInit() {
642
+ this.selectionModel = new SelectionModel(this.multiple, undefined, false);
643
+ this.stateChanges.next();
644
+ }
645
+ ngDoCheck() {
646
+ if (this.ngControl) {
647
+ // We need to re-evaluate this on every change detection cycle, because there are some
648
+ // error triggers that we can't subscribe to (e.g. parent form submissions). This means
649
+ // that whatever logic is in here has to be super lean or we risk destroying the performance.
650
+ this.updateErrorState();
651
+ }
652
+ }
653
+ ngOnDestroy() {
654
+ this.destroyed.next();
655
+ this.destroyed.complete();
656
+ this.stateChanges.complete();
657
+ this.dropSubscriptions();
658
+ }
659
+ /** Associates an HTML input element with this tag list. */
660
+ registerInput(inputElement) {
661
+ this.tagInput = inputElement;
662
+ // todo need rethink about it
663
+ if (this.ngControl && inputElement.ngControl?.statusChanges) {
664
+ inputElement.ngControl.statusChanges
665
+ .subscribe(() => this.ngControl.control.setErrors(inputElement.ngControl.errors));
666
+ }
667
+ }
668
+ // Implemented as part of ControlValueAccessor.
669
+ writeValue(value) {
670
+ if (this.tags) {
671
+ this.setSelectionByValue(value, false);
672
+ }
673
+ }
674
+ // Implemented as part of ControlValueAccessor.
675
+ registerOnChange(fn) {
676
+ this.onChange = fn;
677
+ }
678
+ // Implemented as part of ControlValueAccessor.
679
+ registerOnTouched(fn) {
680
+ this.onTouched = fn;
681
+ }
682
+ // Implemented as part of ControlValueAccessor.
683
+ setDisabledState(isDisabled) {
684
+ this.disabled = isDisabled;
685
+ this.stateChanges.next();
686
+ }
687
+ /**
688
+ * Implemented as part of McFormFieldControl.
689
+ * @docs-private
690
+ */
691
+ onContainerClick(event) {
692
+ if (!this.originatesFromTag(event)) {
693
+ this.focus();
694
+ }
695
+ }
696
+ /**
697
+ * Focuses the first non-disabled tag in this tag list, or the associated input when there
698
+ * are no eligible tags.
699
+ */
700
+ focus() {
701
+ if (this.disabled) {
702
+ return;
703
+ }
704
+ // TODO: ARIA says this should focus the first `selected` tag if any are selected.
705
+ // Focus on first element if there's no tagInput inside tag-list
706
+ if (this.tagInput && this.tagInput.focused) {
707
+ // do nothing
708
+ }
709
+ else if (this.tags.length > 0) {
710
+ this.keyManager.setFirstItemActive();
711
+ this.stateChanges.next();
712
+ }
713
+ else {
714
+ this.focusInput();
715
+ this.stateChanges.next();
716
+ }
717
+ }
718
+ /** Attempt to focus an input if we have one. */
719
+ focusInput() {
720
+ if (this.tagInput) {
721
+ this.tagInput.focus();
722
+ }
723
+ }
724
+ /**
725
+ * Pass events to the keyboard manager. Available here for tests.
726
+ */
727
+ keydown(event) {
728
+ const target = event.target;
729
+ // If they are on an empty input and hit backspace, focus the last tag
730
+ // tslint:disable-next-line: deprecation
731
+ if (event.keyCode === BACKSPACE && this.isInputEmpty(target)) {
732
+ this.keyManager.setLastItemActive();
733
+ event.preventDefault();
734
+ }
735
+ else if (target && target.classList.contains('mc-tag')) {
736
+ // tslint:disable-next-line: deprecation
737
+ if (event.keyCode === HOME) {
738
+ this.keyManager.setFirstItemActive();
739
+ event.preventDefault();
740
+ // tslint:disable-next-line: deprecation
741
+ }
742
+ else if (event.keyCode === END) {
743
+ this.keyManager.setLastItemActive();
744
+ event.preventDefault();
745
+ }
746
+ else {
747
+ this.keyManager.onKeydown(event);
748
+ }
749
+ this.stateChanges.next();
750
+ }
751
+ }
752
+ setSelectionByValue(value, isUserInput = true) {
753
+ this.clearSelection();
754
+ this.tags.forEach((tag) => tag.deselect());
755
+ if (Array.isArray(value)) {
756
+ value.forEach((currentValue) => this.selectValue(currentValue, isUserInput));
757
+ this.sortValues();
758
+ }
759
+ else {
760
+ const correspondingTag = this.selectValue(value, isUserInput);
761
+ // Shift focus to the active item. Note that we shouldn't do this in multiple
762
+ // mode, because we don't know what tag the user interacted with last.
763
+ if (correspondingTag && isUserInput) {
764
+ this.keyManager.setActiveItem(correspondingTag);
765
+ }
766
+ }
767
+ }
768
+ /** When blurred, mark the field as touched when focus moved outside the tag list. */
769
+ blur() {
770
+ if (!this.hasFocusedTag()) {
771
+ this.keyManager.setActiveItem(-1);
772
+ }
773
+ if (!this.disabled) {
774
+ if (this.tagInput) {
775
+ // If there's a tag input, we should check whether the focus moved to tag input.
776
+ // If the focus is not moved to tag input, mark the field as touched. If the focus moved
777
+ // to tag input, do nothing.
778
+ // Timeout is needed to wait for the focus() event trigger on tag input.
779
+ setTimeout(() => {
780
+ if (!this.focused) {
781
+ this.markAsTouched();
782
+ }
783
+ });
784
+ }
785
+ else {
786
+ // If there's no tag input, then mark the field as touched.
787
+ this.markAsTouched();
788
+ }
789
+ }
790
+ }
791
+ /** Mark the field as touched */
792
+ markAsTouched() {
793
+ this.onTouched();
794
+ this.changeDetectorRef.markForCheck();
795
+ this.stateChanges.next();
796
+ }
797
+ /**
798
+ * Check the tab index as you should not be allowed to focus an empty list.
799
+ */
800
+ updateTabIndex() {
801
+ // If we have 0 tags, we should not allow keyboard focus
802
+ this._tabIndex = this.userTabIndex || (this.tags.length === 0 ? -1 : 0);
803
+ }
804
+ /**
805
+ * If the amount of tags changed, we need to update the
806
+ * key manager state and focus the next closest tag.
807
+ */
808
+ updateFocusForDestroyedTags() {
809
+ if (this.lastDestroyedTagIndex != null) {
810
+ if (this.tags.length) {
811
+ const newTagIndex = Math.min(this.lastDestroyedTagIndex, this.tags.length - 1);
812
+ this.keyManager.setActiveItem(newTagIndex);
813
+ }
814
+ else {
815
+ this.focusInput();
816
+ }
817
+ }
818
+ this.lastDestroyedTagIndex = null;
819
+ }
820
+ /**
821
+ * Utility to ensure all indexes are valid.
822
+ *
823
+ * @param index The index to be checked.
824
+ * @returns True if the index is valid for our list of tags.
825
+ */
826
+ isValidIndex(index) {
827
+ return index >= 0 && index < this.tags.length;
828
+ }
829
+ isInputEmpty(element) {
830
+ if (element && element.nodeName.toLowerCase() === 'input') {
831
+ const input = element;
832
+ return !input.value;
833
+ }
834
+ return false;
835
+ }
836
+ /**
837
+ * Finds and selects the tag based on its value.
838
+ * @returns Tag that has the corresponding value.
839
+ */
840
+ selectValue(value, isUserInput = true) {
841
+ const correspondingTag = this.tags.find((tag) => {
842
+ return tag.value != null && this._compareWith(tag.value, value);
843
+ });
844
+ if (correspondingTag) {
845
+ if (isUserInput) {
846
+ correspondingTag.selectViaInteraction();
847
+ }
848
+ else {
849
+ correspondingTag.select();
850
+ }
851
+ this.selectionModel.select(correspondingTag);
852
+ }
853
+ return correspondingTag;
854
+ }
855
+ initializeSelection() {
856
+ // Defer setting the value in order to avoid the "Expression
857
+ // has changed after it was checked" errors from Angular.
858
+ Promise.resolve().then(() => {
859
+ if (this.ngControl || this._value) {
860
+ this.setSelectionByValue(this.ngControl ? this.ngControl.value : this._value, false);
861
+ this.stateChanges.next();
862
+ }
863
+ });
864
+ }
865
+ /**
866
+ * Deselects every tag in the list.
867
+ * @param skip Tag that should not be deselected.
868
+ */
869
+ clearSelection(skip) {
870
+ this.selectionModel.clear();
871
+ this.tags.forEach((tag) => {
872
+ if (tag !== skip) {
873
+ tag.deselect();
874
+ }
875
+ });
876
+ this.stateChanges.next();
877
+ }
878
+ /**
879
+ * Sorts the model values, ensuring that they keep the same
880
+ * order that they have in the panel.
881
+ */
882
+ sortValues() {
883
+ if (this._multiple) {
884
+ this.selectionModel.clear();
885
+ this.tags.forEach((tag) => {
886
+ if (tag.selected) {
887
+ this.selectionModel.select(tag);
888
+ }
889
+ });
890
+ this.stateChanges.next();
891
+ }
892
+ }
893
+ /** Emits change event to set the model value. */
894
+ // todo need rethink this method and selection logic
895
+ propagateChanges(fallbackValue) {
896
+ let valueToEmit = null;
897
+ if (Array.isArray(this.selected)) {
898
+ valueToEmit = this.selected.map((tag) => tag.value);
899
+ }
900
+ else {
901
+ valueToEmit = this.selected ? this.selected.value : fallbackValue;
902
+ }
903
+ this._value = valueToEmit;
904
+ this.change.emit(new McTagListChange(this, valueToEmit));
905
+ this.valueChange.emit(valueToEmit);
906
+ this.onChange(valueToEmit);
907
+ this.changeDetectorRef.markForCheck();
908
+ }
909
+ propagateTagsChanges() {
910
+ const valueToEmit = this.tags.map((tag) => tag.value);
911
+ this._value = valueToEmit;
912
+ this.change.emit(new McTagListChange(this, valueToEmit));
913
+ this.valueChange.emit(valueToEmit);
914
+ this.onChange(valueToEmit);
915
+ this.changeDetectorRef.markForCheck();
916
+ }
917
+ resetTags() {
918
+ this.dropSubscriptions();
919
+ this.listenToTagsFocus();
920
+ this.listenToTagsSelection();
921
+ this.listenToTagsRemoved();
922
+ }
923
+ dropSubscriptions() {
924
+ if (this.tagFocusSubscription) {
925
+ this.tagFocusSubscription.unsubscribe();
926
+ this.tagFocusSubscription = null;
927
+ }
928
+ if (this.tagBlurSubscription) {
929
+ this.tagBlurSubscription.unsubscribe();
930
+ this.tagBlurSubscription = null;
931
+ }
932
+ if (this.tagSelectionSubscription) {
933
+ this.tagSelectionSubscription.unsubscribe();
934
+ this.tagSelectionSubscription = null;
935
+ }
936
+ if (this.tagRemoveSubscription) {
937
+ this.tagRemoveSubscription.unsubscribe();
938
+ this.tagRemoveSubscription = null;
939
+ }
940
+ }
941
+ /** Listens to user-generated selection events on each tag. */
942
+ listenToTagsSelection() {
943
+ this.tagSelectionSubscription = this.tagSelectionChanges.subscribe((event) => {
944
+ if (event.source.selected) {
945
+ this.selectionModel.select(event.source);
946
+ }
947
+ else {
948
+ this.selectionModel.deselect(event.source);
949
+ }
950
+ // For single selection tag list, make sure the deselected value is unselected.
951
+ if (!this.multiple) {
952
+ this.tags.forEach((tag) => {
953
+ if (!this.selectionModel.isSelected(tag) && tag.selected) {
954
+ tag.deselect();
955
+ }
956
+ });
957
+ }
958
+ if (event.isUserInput) {
959
+ this.propagateChanges();
960
+ }
961
+ });
962
+ }
963
+ /** Listens to user-generated selection events on each tag. */
964
+ listenToTagsFocus() {
965
+ this.tagFocusSubscription = this.tagFocusChanges
966
+ .subscribe((event) => {
967
+ const tagIndex = this.tags.toArray().indexOf(event.tag);
968
+ if (this.isValidIndex(tagIndex)) {
969
+ this.keyManager.updateActiveItem(tagIndex);
970
+ }
971
+ this.stateChanges.next();
972
+ });
973
+ this.tagBlurSubscription = this.tagBlurChanges
974
+ .subscribe(() => {
975
+ this.blur();
976
+ this.stateChanges.next();
977
+ });
978
+ }
979
+ listenToTagsRemoved() {
980
+ this.tagRemoveSubscription = this.tagRemoveChanges
981
+ .subscribe((event) => {
982
+ const tag = event.tag;
983
+ const tagIndex = this.tags.toArray().indexOf(event.tag);
984
+ // In case the tag that will be removed is currently focused, we temporarily store
985
+ // the index in order to be able to determine an appropriate sibling tag that will
986
+ // receive focus.
987
+ if (this.isValidIndex(tagIndex) && tag.hasFocus) {
988
+ this.lastDestroyedTagIndex = tagIndex;
989
+ }
990
+ });
991
+ }
992
+ /** Checks whether an event comes from inside a tag element. */
993
+ originatesFromTag(event) {
994
+ let currentElement = event.target;
995
+ while (currentElement && currentElement !== this.elementRef.nativeElement) {
996
+ if (currentElement.classList.contains('mc-tag')) {
997
+ return true;
998
+ }
999
+ currentElement = currentElement.parentElement;
1000
+ }
1001
+ return false;
1002
+ }
1003
+ /** Checks whether any of the tags is focused. */
1004
+ hasFocusedTag() {
1005
+ return this.tags.some((tag) => tag.hasFocus);
1006
+ }
1007
+ /** Syncs the list's disabled state with the individual tags. */
1008
+ syncTagsDisabledState() {
1009
+ if (this.tags) {
1010
+ this.tags.forEach((tag) => {
1011
+ tag.disabled = this._disabled;
1012
+ });
1013
+ }
1014
+ }
1015
+ }
1016
+ /** @nocollapse */ /** @nocollapse */ McTagList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagList, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.ErrorStateMatcher }, { token: NG_VALIDATORS, optional: true }, { token: MC_VALIDATION, optional: true }, { token: i2.Directionality, optional: true }, { token: i3.NgForm, optional: true }, { token: i3.FormGroupDirective, optional: true }, { token: i3.NgControl, optional: true, self: true }, { token: i3.NgModel, optional: true, self: true }, { token: i3.FormControlName, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
1017
+ /** @nocollapse */ /** @nocollapse */ McTagList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: McTagList, selector: "mc-tag-list", inputs: { multiple: "multiple", compareWith: "compareWith", value: "value", required: "required", placeholder: "placeholder", disabled: "disabled", selectable: "selectable", tabIndex: "tabIndex", errorStateMatcher: "errorStateMatcher", orientation: "orientation" }, outputs: { valueChange: "valueChange", change: "change" }, host: { listeners: { "focus": "focus()", "blur": "blur()", "keydown": "keydown($event)" }, properties: { "class.mc-disabled": "disabled", "class.mc-invalid": "errorState", "attr.tabindex": "disabled ? null : tabIndex", "id": "uid" }, classAttribute: "mc-tag-list" }, providers: [{ provide: McFormFieldControl, useExisting: McTagList }], queries: [{ propertyName: "cleaner", first: true, predicate: ["mcTagListCleaner"], descendants: true, static: true }, { propertyName: "tags", predicate: McTag, descendants: true }], exportAs: ["mcTagList"], usesInheritance: true, ngImport: i0, template: "<div class=\"mc-tags-list__list-container\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<div class=\"mc-tags-list__cleaner\"\r\n *ngIf=\"canShowCleaner\">\r\n <ng-content select=\"mc-cleaner\"></ng-content>\r\n</div>\r\n", styles: [".mc-tag-list{display:flex;flex-direction:row;box-sizing:border-box}.mc-tag-input{border:none;outline:none;background:transparent}.mc-tags-list__list-container{display:flex;flex-wrap:wrap;flex:1 1 100%;box-sizing:border-box;min-width:0;min-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);padding:var(--mc-tag-list-size-padding, 1px 12px)}.mc-tags-list__list-container .mc-tag-input{max-width:100%;flex:1 1 auto;height:var(--mc-tag-input-size-height, 22px);margin:var(--mc-tag-input-size-margin, 2px 4px)}.mc-tags-list__cleaner .mc-cleaner{height:30px}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1018
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagList, decorators: [{
1019
+ type: Component,
1020
+ args: [{ selector: 'mc-tag-list', exportAs: 'mcTagList', host: {
1021
+ class: 'mc-tag-list',
1022
+ '[class.mc-disabled]': 'disabled',
1023
+ '[class.mc-invalid]': 'errorState',
1024
+ '[attr.tabindex]': 'disabled ? null : tabIndex',
1025
+ '[id]': 'uid',
1026
+ '(focus)': 'focus()',
1027
+ '(blur)': 'blur()',
1028
+ '(keydown)': 'keydown($event)'
1029
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: McFormFieldControl, useExisting: McTagList }], template: "<div class=\"mc-tags-list__list-container\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<div class=\"mc-tags-list__cleaner\"\r\n *ngIf=\"canShowCleaner\">\r\n <ng-content select=\"mc-cleaner\"></ng-content>\r\n</div>\r\n", styles: [".mc-tag-list{display:flex;flex-direction:row;box-sizing:border-box}.mc-tag-input{border:none;outline:none;background:transparent}.mc-tags-list__list-container{display:flex;flex-wrap:wrap;flex:1 1 100%;box-sizing:border-box;min-width:0;min-height:calc(var(--mc-form-field-size-height, 32px) - var(--mc-form-field-size-border-width, 1px) * 2);padding:var(--mc-tag-list-size-padding, 1px 12px)}.mc-tags-list__list-container .mc-tag-input{max-width:100%;flex:1 1 auto;height:var(--mc-tag-input-size-height, 22px);margin:var(--mc-tag-input-size-margin, 2px 4px)}.mc-tags-list__cleaner .mc-cleaner{height:30px}\n"] }]
1030
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.ErrorStateMatcher }, { type: undefined, decorators: [{
1031
+ type: Optional
1032
+ }, {
1033
+ type: Inject,
1034
+ args: [NG_VALIDATORS]
1035
+ }] }, { type: undefined, decorators: [{
1036
+ type: Optional
1037
+ }, {
1038
+ type: Inject,
1039
+ args: [MC_VALIDATION]
1040
+ }] }, { type: i2.Directionality, decorators: [{
1041
+ type: Optional
1042
+ }] }, { type: i3.NgForm, decorators: [{
1043
+ type: Optional
1044
+ }] }, { type: i3.FormGroupDirective, decorators: [{
1045
+ type: Optional
1046
+ }] }, { type: i3.NgControl, decorators: [{
1047
+ type: Optional
1048
+ }, {
1049
+ type: Self
1050
+ }] }, { type: i3.NgModel, decorators: [{
1051
+ type: Optional
1052
+ }, {
1053
+ type: Self
1054
+ }] }, { type: i3.FormControlName, decorators: [{
1055
+ type: Optional
1056
+ }, {
1057
+ type: Self
1058
+ }] }]; }, propDecorators: { multiple: [{
1059
+ type: Input
1060
+ }], compareWith: [{
1061
+ type: Input
1062
+ }], value: [{
1063
+ type: Input
1064
+ }], required: [{
1065
+ type: Input
1066
+ }], placeholder: [{
1067
+ type: Input
1068
+ }], disabled: [{
1069
+ type: Input
1070
+ }], selectable: [{
1071
+ type: Input
1072
+ }], tabIndex: [{
1073
+ type: Input
1074
+ }], valueChange: [{
1075
+ type: Output
1076
+ }], errorStateMatcher: [{
1077
+ type: Input
1078
+ }], orientation: [{
1079
+ type: Input,
1080
+ args: ['orientation']
1081
+ }], change: [{
1082
+ type: Output
1083
+ }], cleaner: [{
1084
+ type: ContentChild,
1085
+ args: ['mcTagListCleaner', { static: true }]
1086
+ }], tags: [{
1087
+ type: ContentChildren,
1088
+ args: [McTag, {
1089
+ // Need to use `descendants: true`,
1090
+ // Ivy will no longer match indirect descendants if it's left as false.
1091
+ descendants: true
1092
+ }]
1093
1093
  }] } });
1094
1094
 
1095
- // Increasing integer for generating unique ids.
1096
- let nextUniqueId = 0;
1097
- /**
1098
- * Directive that adds tag-specific behaviors to an input element inside `<mc-form-field>`.
1099
- * May be placed inside or outside of an `<mc-tag-list>`.
1100
- */
1101
- class McTagInput {
1102
- constructor(elementRef, renderer, defaultOptions, ngControl) {
1103
- this.elementRef = elementRef;
1104
- this.renderer = renderer;
1105
- this.defaultOptions = defaultOptions;
1106
- this.ngControl = ngControl;
1107
- /** Whether the control is focused. */
1108
- this.focused = false;
1109
- /**
1110
- * The list of key codes that will trigger a tagEnd event.
1111
- *
1112
- * Defaults to `[ENTER]`.
1113
- */
1114
- this.separatorKeyCodes = this.defaultOptions.separatorKeyCodes;
1115
- /** Emitted when a tag is to be added. */
1116
- this.tagEnd = new EventEmitter();
1117
- /** The input's placeholder text. */
1118
- this.placeholder = '';
1119
- /** Unique id for the input. */
1120
- this.id = `mc-tag-list-input-${nextUniqueId++}`;
1121
- this._addOnBlur = true;
1122
- this._disabled = false;
1123
- this.countOfSymbolsForUpdateWidth = 3;
1124
- // tslint:disable-next-line: no-unnecessary-type-assertion
1125
- this.inputElement = this.elementRef.nativeElement;
1126
- this.setDefaultInputWidth();
1127
- }
1128
- /** Register input for tag list */
1129
- set tagList(value) {
1130
- if (value) {
1131
- this._tagList = value;
1132
- this._tagList.registerInput(this);
1133
- }
1134
- }
1135
- /**
1136
- * Whether or not the tagEnd event will be emitted when the input is blurred.
1137
- */
1138
- get addOnBlur() {
1139
- return this._addOnBlur;
1140
- }
1141
- set addOnBlur(value) {
1142
- this._addOnBlur = coerceBooleanProperty(value);
1143
- }
1144
- /** Whether the input is disabled. */
1145
- get disabled() {
1146
- return this._disabled || (this._tagList && this._tagList.disabled);
1147
- }
1148
- set disabled(value) {
1149
- this._disabled = coerceBooleanProperty(value);
1150
- }
1151
- /** Whether the input is empty. */
1152
- get empty() {
1153
- return !this.inputElement.value;
1154
- }
1155
- ngOnChanges() {
1156
- this._tagList.stateChanges.next();
1157
- }
1158
- onKeydown(event) {
1159
- if (!this.inputElement.value) {
1160
- this._tagList.keydown(event);
1161
- }
1162
- if (this.isSeparatorKey(event)) {
1163
- this.emitTagEnd();
1164
- event.preventDefault();
1165
- }
1166
- }
1167
- /** Checks to see if the blur should emit the (tagEnd) event. */
1168
- blur() {
1169
- this.focused = false;
1170
- // Blur the tag list if it is not focused
1171
- if (!this._tagList.focused) {
1172
- this.triggerValidation();
1173
- this._tagList.blur();
1174
- }
1175
- // tslint:disable-next-line: no-unnecessary-type-assertion
1176
- if (this.addOnBlur) {
1177
- this.emitTagEnd();
1178
- }
1179
- this._tagList.stateChanges.next();
1180
- }
1181
- triggerValidation() {
1182
- if (!this.hasControl()) {
1183
- return;
1184
- }
1185
- this.ngControl.statusChanges.emit(this.ngControl.status);
1186
- }
1187
- /** Checks to see if the (tagEnd) event needs to be emitted. */
1188
- emitTagEnd() {
1189
- if (!this.hasControl() || (this.hasControl() && !this.ngControl.invalid)) {
1190
- this.tagEnd.emit({ input: this.inputElement, value: this.inputElement.value });
1191
- this.updateInputWidth();
1192
- }
1193
- }
1194
- onInput() {
1195
- this.updateInputWidth();
1196
- // Let tag list know whenever the value changes.
1197
- this._tagList.stateChanges.next();
1198
- }
1199
- onPaste($event) {
1200
- if (!$event.clipboardData) {
1201
- return;
1202
- }
1203
- const data = $event.clipboardData.getData('text');
1204
- if (data && data.length === 0) {
1205
- return;
1206
- }
1207
- const items = [];
1208
- for (const key of this.separatorKeyCodes) {
1209
- const separator = this.separatorKeyToSymbol(key);
1210
- if (data.search(separator) > -1) {
1211
- items.push(...data.split(separator));
1212
- break;
1213
- }
1214
- }
1215
- if (items.length === 0) {
1216
- items.push(data);
1217
- }
1218
- items.forEach((item) => this.tagEnd.emit({ input: this.inputElement, value: item }));
1219
- this.updateInputWidth();
1220
- $event.preventDefault();
1221
- $event.stopPropagation();
1222
- }
1223
- updateInputWidth() {
1224
- const length = this.inputElement.value.length;
1225
- this.renderer.setStyle(this.inputElement, 'max-width', 0);
1226
- this.oneSymbolWidth = this.inputElement.scrollWidth / length;
1227
- this.renderer.setStyle(this.inputElement, 'max-width', '');
1228
- if (length > this.countOfSymbolsForUpdateWidth) {
1229
- this.renderer.setStyle(this.inputElement, 'width', `${length * this.oneSymbolWidth}px`);
1230
- }
1231
- else {
1232
- this.setDefaultInputWidth();
1233
- }
1234
- }
1235
- onFocus() {
1236
- this.focused = true;
1237
- this._tagList.stateChanges.next();
1238
- }
1239
- /** Focuses the input. */
1240
- focus() {
1241
- this.inputElement.focus();
1242
- }
1243
- separatorKeyToSymbol(k) {
1244
- const sep = {
1245
- [ENTER]: /\r?\n/,
1246
- [TAB]: /\t/,
1247
- [SPACE]: / /,
1248
- [COMMA]: /,/
1249
- }[k];
1250
- if (sep) {
1251
- return sep;
1252
- }
1253
- return k;
1254
- }
1255
- hasControl() {
1256
- return !!this.ngControl;
1257
- }
1258
- setDefaultInputWidth() {
1259
- this.renderer.setStyle(this.inputElement, 'width', '30px');
1260
- }
1261
- /** Checks whether a keycode is one of the configured separators. */
1262
- isSeparatorKey(event) {
1263
- if (hasModifierKey(event)) {
1264
- return false;
1265
- }
1266
- // tslint:disable-next-line: deprecation
1267
- return this.separatorKeyCodes.indexOf(event.keyCode) > -1;
1268
- }
1269
- }
1270
- /** @nocollapse */ /** @nocollapse */ McTagInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagInput, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: MC_TAGS_DEFAULT_OPTIONS }, { token: i3.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Directive });
1271
- /** @nocollapse */ /** @nocollapse */ McTagInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.7", type: McTagInput, selector: "input[mcTagInputFor]", inputs: { separatorKeyCodes: ["mcTagInputSeparatorKeyCodes", "separatorKeyCodes"], placeholder: "placeholder", id: "id", tagList: ["mcTagInputFor", "tagList"], addOnBlur: ["mcTagInputAddOnBlur", "addOnBlur"], disabled: "disabled" }, outputs: { tagEnd: "mcTagInputTokenEnd" }, host: { listeners: { "keydown": "onKeydown($event)", "blur": "blur()", "focus": "onFocus()", "input": "onInput()", "paste": "onPaste($event)" }, properties: { "id": "id", "attr.disabled": "disabled || null", "attr.placeholder": "placeholder || null" }, classAttribute: "mc-tag-input" }, exportAs: ["mcTagInput", "mcTagInputFor"], usesOnChanges: true, ngImport: i0 });
1272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagInput, decorators: [{
1273
- type: Directive,
1274
- args: [{
1275
- selector: 'input[mcTagInputFor]',
1276
- exportAs: 'mcTagInput, mcTagInputFor',
1277
- host: {
1278
- class: 'mc-tag-input',
1279
- '[id]': 'id',
1280
- '[attr.disabled]': 'disabled || null',
1281
- '[attr.placeholder]': 'placeholder || null',
1282
- '(keydown)': 'onKeydown($event)',
1283
- '(blur)': 'blur()',
1284
- '(focus)': 'onFocus()',
1285
- '(input)': 'onInput()',
1286
- '(paste)': 'onPaste($event)'
1287
- }
1288
- }]
1289
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
1290
- type: Inject,
1291
- args: [MC_TAGS_DEFAULT_OPTIONS]
1292
- }] }, { type: i3.NgControl, decorators: [{
1293
- type: Optional
1294
- }, {
1295
- type: Self
1296
- }] }]; }, propDecorators: { separatorKeyCodes: [{
1297
- type: Input,
1298
- args: ['mcTagInputSeparatorKeyCodes']
1299
- }], tagEnd: [{
1300
- type: Output,
1301
- args: ['mcTagInputTokenEnd']
1302
- }], placeholder: [{
1303
- type: Input
1304
- }], id: [{
1305
- type: Input
1306
- }], tagList: [{
1307
- type: Input,
1308
- args: ['mcTagInputFor']
1309
- }], addOnBlur: [{
1310
- type: Input,
1311
- args: ['mcTagInputAddOnBlur']
1312
- }], disabled: [{
1313
- type: Input
1095
+ // Increasing integer for generating unique ids.
1096
+ let nextUniqueId = 0;
1097
+ /**
1098
+ * Directive that adds tag-specific behaviors to an input element inside `<mc-form-field>`.
1099
+ * May be placed inside or outside of an `<mc-tag-list>`.
1100
+ */
1101
+ class McTagInput {
1102
+ constructor(elementRef, renderer, defaultOptions, ngControl) {
1103
+ this.elementRef = elementRef;
1104
+ this.renderer = renderer;
1105
+ this.defaultOptions = defaultOptions;
1106
+ this.ngControl = ngControl;
1107
+ /** Whether the control is focused. */
1108
+ this.focused = false;
1109
+ /**
1110
+ * The list of key codes that will trigger a tagEnd event.
1111
+ *
1112
+ * Defaults to `[ENTER]`.
1113
+ */
1114
+ this.separatorKeyCodes = this.defaultOptions.separatorKeyCodes;
1115
+ /** Emitted when a tag is to be added. */
1116
+ this.tagEnd = new EventEmitter();
1117
+ /** The input's placeholder text. */
1118
+ this.placeholder = '';
1119
+ /** Unique id for the input. */
1120
+ this.id = `mc-tag-list-input-${nextUniqueId++}`;
1121
+ this._addOnBlur = true;
1122
+ this._disabled = false;
1123
+ this.countOfSymbolsForUpdateWidth = 3;
1124
+ // tslint:disable-next-line: no-unnecessary-type-assertion
1125
+ this.inputElement = this.elementRef.nativeElement;
1126
+ this.setDefaultInputWidth();
1127
+ }
1128
+ /** Register input for tag list */
1129
+ set tagList(value) {
1130
+ if (value) {
1131
+ this._tagList = value;
1132
+ this._tagList.registerInput(this);
1133
+ }
1134
+ }
1135
+ /**
1136
+ * Whether or not the tagEnd event will be emitted when the input is blurred.
1137
+ */
1138
+ get addOnBlur() {
1139
+ return this._addOnBlur;
1140
+ }
1141
+ set addOnBlur(value) {
1142
+ this._addOnBlur = coerceBooleanProperty(value);
1143
+ }
1144
+ /** Whether the input is disabled. */
1145
+ get disabled() {
1146
+ return this._disabled || (this._tagList && this._tagList.disabled);
1147
+ }
1148
+ set disabled(value) {
1149
+ this._disabled = coerceBooleanProperty(value);
1150
+ }
1151
+ /** Whether the input is empty. */
1152
+ get empty() {
1153
+ return !this.inputElement.value;
1154
+ }
1155
+ ngOnChanges() {
1156
+ this._tagList.stateChanges.next();
1157
+ }
1158
+ onKeydown(event) {
1159
+ if (!this.inputElement.value) {
1160
+ this._tagList.keydown(event);
1161
+ }
1162
+ if (this.isSeparatorKey(event)) {
1163
+ this.emitTagEnd();
1164
+ event.preventDefault();
1165
+ }
1166
+ }
1167
+ /** Checks to see if the blur should emit the (tagEnd) event. */
1168
+ blur() {
1169
+ this.focused = false;
1170
+ // Blur the tag list if it is not focused
1171
+ if (!this._tagList.focused) {
1172
+ this.triggerValidation();
1173
+ this._tagList.blur();
1174
+ }
1175
+ // tslint:disable-next-line: no-unnecessary-type-assertion
1176
+ if (this.addOnBlur) {
1177
+ this.emitTagEnd();
1178
+ }
1179
+ this._tagList.stateChanges.next();
1180
+ }
1181
+ triggerValidation() {
1182
+ if (!this.hasControl()) {
1183
+ return;
1184
+ }
1185
+ this.ngControl.statusChanges.emit(this.ngControl.status);
1186
+ }
1187
+ /** Checks to see if the (tagEnd) event needs to be emitted. */
1188
+ emitTagEnd() {
1189
+ if (!this.hasControl() || (this.hasControl() && !this.ngControl.invalid)) {
1190
+ this.tagEnd.emit({ input: this.inputElement, value: this.inputElement.value });
1191
+ this.updateInputWidth();
1192
+ }
1193
+ }
1194
+ onInput() {
1195
+ this.updateInputWidth();
1196
+ // Let tag list know whenever the value changes.
1197
+ this._tagList.stateChanges.next();
1198
+ }
1199
+ onPaste($event) {
1200
+ if (!$event.clipboardData) {
1201
+ return;
1202
+ }
1203
+ const data = $event.clipboardData.getData('text');
1204
+ if (data && data.length === 0) {
1205
+ return;
1206
+ }
1207
+ const items = [];
1208
+ for (const key of this.separatorKeyCodes) {
1209
+ const separator = this.separatorKeyToSymbol(key);
1210
+ if (data.search(separator) > -1) {
1211
+ items.push(...data.split(separator));
1212
+ break;
1213
+ }
1214
+ }
1215
+ if (items.length === 0) {
1216
+ items.push(data);
1217
+ }
1218
+ items.forEach((item) => this.tagEnd.emit({ input: this.inputElement, value: item }));
1219
+ this.updateInputWidth();
1220
+ $event.preventDefault();
1221
+ $event.stopPropagation();
1222
+ }
1223
+ updateInputWidth() {
1224
+ const length = this.inputElement.value.length;
1225
+ this.renderer.setStyle(this.inputElement, 'max-width', 0);
1226
+ this.oneSymbolWidth = this.inputElement.scrollWidth / length;
1227
+ this.renderer.setStyle(this.inputElement, 'max-width', '');
1228
+ if (length > this.countOfSymbolsForUpdateWidth) {
1229
+ this.renderer.setStyle(this.inputElement, 'width', `${length * this.oneSymbolWidth}px`);
1230
+ }
1231
+ else {
1232
+ this.setDefaultInputWidth();
1233
+ }
1234
+ }
1235
+ onFocus() {
1236
+ this.focused = true;
1237
+ this._tagList.stateChanges.next();
1238
+ }
1239
+ /** Focuses the input. */
1240
+ focus() {
1241
+ this.inputElement.focus();
1242
+ }
1243
+ separatorKeyToSymbol(k) {
1244
+ const sep = {
1245
+ [ENTER]: /\r?\n/,
1246
+ [TAB]: /\t/,
1247
+ [SPACE]: / /,
1248
+ [COMMA]: /,/
1249
+ }[k];
1250
+ if (sep) {
1251
+ return sep;
1252
+ }
1253
+ return k;
1254
+ }
1255
+ hasControl() {
1256
+ return !!this.ngControl;
1257
+ }
1258
+ setDefaultInputWidth() {
1259
+ this.renderer.setStyle(this.inputElement, 'width', '30px');
1260
+ }
1261
+ /** Checks whether a keycode is one of the configured separators. */
1262
+ isSeparatorKey(event) {
1263
+ if (hasModifierKey(event)) {
1264
+ return false;
1265
+ }
1266
+ // tslint:disable-next-line: deprecation
1267
+ return this.separatorKeyCodes.indexOf(event.keyCode) > -1;
1268
+ }
1269
+ }
1270
+ /** @nocollapse */ /** @nocollapse */ McTagInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagInput, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: MC_TAGS_DEFAULT_OPTIONS }, { token: i3.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Directive });
1271
+ /** @nocollapse */ /** @nocollapse */ McTagInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: McTagInput, selector: "input[mcTagInputFor]", inputs: { separatorKeyCodes: ["mcTagInputSeparatorKeyCodes", "separatorKeyCodes"], placeholder: "placeholder", id: "id", tagList: ["mcTagInputFor", "tagList"], addOnBlur: ["mcTagInputAddOnBlur", "addOnBlur"], disabled: "disabled" }, outputs: { tagEnd: "mcTagInputTokenEnd" }, host: { listeners: { "keydown": "onKeydown($event)", "blur": "blur()", "focus": "onFocus()", "input": "onInput()", "paste": "onPaste($event)" }, properties: { "id": "id", "attr.disabled": "disabled || null", "attr.placeholder": "placeholder || null" }, classAttribute: "mc-tag-input" }, exportAs: ["mcTagInput", "mcTagInputFor"], usesOnChanges: true, ngImport: i0 });
1272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagInput, decorators: [{
1273
+ type: Directive,
1274
+ args: [{
1275
+ selector: 'input[mcTagInputFor]',
1276
+ exportAs: 'mcTagInput, mcTagInputFor',
1277
+ host: {
1278
+ class: 'mc-tag-input',
1279
+ '[id]': 'id',
1280
+ '[attr.disabled]': 'disabled || null',
1281
+ '[attr.placeholder]': 'placeholder || null',
1282
+ '(keydown)': 'onKeydown($event)',
1283
+ '(blur)': 'blur()',
1284
+ '(focus)': 'onFocus()',
1285
+ '(input)': 'onInput()',
1286
+ '(paste)': 'onPaste($event)'
1287
+ }
1288
+ }]
1289
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
1290
+ type: Inject,
1291
+ args: [MC_TAGS_DEFAULT_OPTIONS]
1292
+ }] }, { type: i3.NgControl, decorators: [{
1293
+ type: Optional
1294
+ }, {
1295
+ type: Self
1296
+ }] }]; }, propDecorators: { separatorKeyCodes: [{
1297
+ type: Input,
1298
+ args: ['mcTagInputSeparatorKeyCodes']
1299
+ }], tagEnd: [{
1300
+ type: Output,
1301
+ args: ['mcTagInputTokenEnd']
1302
+ }], placeholder: [{
1303
+ type: Input
1304
+ }], id: [{
1305
+ type: Input
1306
+ }], tagList: [{
1307
+ type: Input,
1308
+ args: ['mcTagInputFor']
1309
+ }], addOnBlur: [{
1310
+ type: Input,
1311
+ args: ['mcTagInputAddOnBlur']
1312
+ }], disabled: [{
1313
+ type: Input
1314
1314
  }] } });
1315
1315
 
1316
- class McTagsModule {
1317
- }
1318
- /** @nocollapse */ /** @nocollapse */ McTagsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1319
- /** @nocollapse */ /** @nocollapse */ McTagsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagsModule, declarations: [McTagList,
1320
- McTag,
1321
- McTagInput,
1322
- McTagTrailingIcon,
1323
- McTagAvatar,
1324
- McTagRemove], imports: [CommonModule, PlatformModule], exports: [McTagList,
1325
- McTag,
1326
- McTagInput,
1327
- McTagTrailingIcon,
1328
- McTagAvatar,
1329
- McTagRemove] });
1330
- /** @nocollapse */ /** @nocollapse */ McTagsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagsModule, providers: [{
1331
- provide: MC_TAGS_DEFAULT_OPTIONS,
1332
- // tslint:disable-next-line: no-object-literal-type-assertion
1333
- useValue: { separatorKeyCodes: [ENTER] }
1334
- }], imports: [[CommonModule, PlatformModule]] });
1335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McTagsModule, decorators: [{
1336
- type: NgModule,
1337
- args: [{
1338
- imports: [CommonModule, PlatformModule],
1339
- exports: [
1340
- McTagList,
1341
- McTag,
1342
- McTagInput,
1343
- McTagTrailingIcon,
1344
- McTagAvatar,
1345
- McTagRemove
1346
- ],
1347
- declarations: [
1348
- McTagList,
1349
- McTag,
1350
- McTagInput,
1351
- McTagTrailingIcon,
1352
- McTagAvatar,
1353
- McTagRemove
1354
- ],
1355
- providers: [{
1356
- provide: MC_TAGS_DEFAULT_OPTIONS,
1357
- // tslint:disable-next-line: no-object-literal-type-assertion
1358
- useValue: { separatorKeyCodes: [ENTER] }
1359
- }]
1360
- }]
1316
+ class McTagsModule {
1317
+ }
1318
+ /** @nocollapse */ /** @nocollapse */ McTagsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1319
+ /** @nocollapse */ /** @nocollapse */ McTagsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagsModule, declarations: [McTagList,
1320
+ McTag,
1321
+ McTagInput,
1322
+ McTagTrailingIcon,
1323
+ McTagAvatar,
1324
+ McTagRemove], imports: [CommonModule, PlatformModule], exports: [McTagList,
1325
+ McTag,
1326
+ McTagInput,
1327
+ McTagTrailingIcon,
1328
+ McTagAvatar,
1329
+ McTagRemove] });
1330
+ /** @nocollapse */ /** @nocollapse */ McTagsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagsModule, providers: [{
1331
+ provide: MC_TAGS_DEFAULT_OPTIONS,
1332
+ // tslint:disable-next-line: no-object-literal-type-assertion
1333
+ useValue: { separatorKeyCodes: [ENTER] }
1334
+ }], imports: [[CommonModule, PlatformModule]] });
1335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McTagsModule, decorators: [{
1336
+ type: NgModule,
1337
+ args: [{
1338
+ imports: [CommonModule, PlatformModule],
1339
+ exports: [
1340
+ McTagList,
1341
+ McTag,
1342
+ McTagInput,
1343
+ McTagTrailingIcon,
1344
+ McTagAvatar,
1345
+ McTagRemove
1346
+ ],
1347
+ declarations: [
1348
+ McTagList,
1349
+ McTag,
1350
+ McTagInput,
1351
+ McTagTrailingIcon,
1352
+ McTagAvatar,
1353
+ McTagRemove
1354
+ ],
1355
+ providers: [{
1356
+ provide: MC_TAGS_DEFAULT_OPTIONS,
1357
+ // tslint:disable-next-line: no-object-literal-type-assertion
1358
+ useValue: { separatorKeyCodes: [ENTER] }
1359
+ }]
1360
+ }]
1361
1361
  }] });
1362
1362
 
1363
- /**
1364
- * Generated bundle index. Do not edit.
1363
+ /**
1364
+ * Generated bundle index. Do not edit.
1365
1365
  */
1366
1366
 
1367
1367
  export { MC_TAGS_DEFAULT_OPTIONS, McTag, McTagAvatar, McTagBase, McTagInput, McTagList, McTagListBase, McTagListChange, McTagListMixinBase, McTagMixinBase, McTagRemove, McTagSelectionChange, McTagTrailingIcon, McTagsModule };