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