@tekus/design-system 4.0.2 → 5.0.0

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 (268) hide show
  1. package/assets/img/avatar.png +0 -0
  2. package/assets/img/pexels-jodaarba-4250980.jpg +0 -0
  3. package/assets/img/shadown.png +0 -0
  4. package/assets/img/tk-logo-compound-dark.svg +9 -0
  5. package/assets/img/tk-logo-minimal-dark.svg +16 -0
  6. package/assets/img/tk-logo-minimal-light.svg +16 -0
  7. package/assets/img/tk-logo-normal-dark.svg +12 -0
  8. package/assets/img/tk-logo-normal-light.svg +12 -0
  9. package/assets/styles/_index.scss +10 -0
  10. package/assets/styles/docs/_branding.doc.scss +69 -0
  11. package/assets/styles/docs/_grids.doc.scss +13 -0
  12. package/assets/styles/docs/_icons.doc.scss +102 -0
  13. package/assets/styles/docs/_illustrations.doc.scss +86 -0
  14. package/assets/styles/docs/_paginador.doc.scss +16 -0
  15. package/assets/styles/docs/_table-of-content.scss +22 -0
  16. package/components/{tk-typography → branding}/index.d.ts +1 -1
  17. package/components/branding/public-api.d.ts +1 -0
  18. package/components/branding/src/branding-register-logo.d.ts +22 -0
  19. package/components/branding/src/branding.component.d.ts +54 -0
  20. package/components/{tk-search-bar → button}/index.d.ts +1 -1
  21. package/components/button/public-api.d.ts +1 -0
  22. package/components/button/src/button.component.d.ts +99 -0
  23. package/components/{tk-dropdown-list → dropdown-list}/index.d.ts +1 -1
  24. package/components/dropdown-list/public-api.d.ts +1 -0
  25. package/components/{tk-dropdown-list/tk-dropdown-list.component.d.ts → dropdown-list/src/dropdown-list.component.d.ts} +7 -7
  26. package/components/fallback-view/index.d.ts +5 -0
  27. package/components/fallback-view/public-api.d.ts +1 -0
  28. package/components/fallback-view/src/fallback-view.component.d.ts +149 -0
  29. package/components/forms/form-autocomplete-field/index.d.ts +5 -0
  30. package/components/forms/form-autocomplete-field/public-api.d.ts +1 -0
  31. package/components/forms/{tk-form-autocomplete-field/tk-form-autocomplete-field.component.d.ts → form-autocomplete-field/src/form-autocomplete-field.component.d.ts} +16 -6
  32. package/components/forms/form-chips-autocomplete-field/index.d.ts +5 -0
  33. package/components/forms/form-chips-autocomplete-field/public-api.d.ts +1 -0
  34. package/components/forms/{tk-form-chips-autocomplete-field/tk-form-chips-autocomplete-field.component.d.ts → form-chips-autocomplete-field/src/form-chips-autocomplete-field.component.d.ts} +18 -8
  35. package/components/forms/form-input-field/index.d.ts +5 -0
  36. package/components/forms/form-input-field/public-api.d.ts +1 -0
  37. package/components/forms/{tk-form-input-field/tk-form-input-field.component.d.ts → form-input-field/src/form-input-field.component.d.ts} +4 -4
  38. package/components/forms/public-api.d.ts +3 -3
  39. package/components/grid-container/index.d.ts +5 -0
  40. package/components/grid-container/public-api.d.ts +1 -0
  41. package/components/grid-container/src/grid-container.component.d.ts +121 -0
  42. package/components/icon/core/icon-catalog.d.ts +76 -0
  43. package/components/icon/core/icons/ads.icons.d.ts +2 -0
  44. package/components/icon/core/icons/angle.icons.d.ts +2 -0
  45. package/components/icon/core/icons/arrow.icons.d.ts +2 -0
  46. package/components/icon/core/icons/bars.icons.d.ts +2 -0
  47. package/components/icon/core/icons/bolt.icons.d.ts +2 -0
  48. package/components/icon/core/icons/book.icons.d.ts +2 -0
  49. package/components/icon/core/icons/calendar.icons.d.ts +2 -0
  50. package/components/icon/core/icons/camera.icons.d.ts +2 -0
  51. package/components/icon/core/icons/chart.icons.d.ts +2 -0
  52. package/components/icon/core/icons/check.icons.d.ts +2 -0
  53. package/components/icon/core/icons/chevron.icons.d.ts +2 -0
  54. package/components/icon/core/icons/circle.icons.d.ts +2 -0
  55. package/components/icon/core/icons/clock.icons.d.ts +2 -0
  56. package/components/icon/core/icons/clone.icons.d.ts +2 -0
  57. package/components/icon/core/icons/download.icons.d.ts +2 -0
  58. package/components/icon/core/icons/ellipsis.icons.d.ts +2 -0
  59. package/components/icon/core/icons/eye.icons.d.ts +2 -0
  60. package/components/icon/core/icons/filter.icons.d.ts +2 -0
  61. package/components/icon/core/icons/folders.icons.d.ts +2 -0
  62. package/components/icon/core/icons/gears.icons.d.ts +2 -0
  63. package/components/icon/core/icons/hand.icons.d.ts +2 -0
  64. package/components/icon/core/icons/language.icons.d.ts +2 -0
  65. package/components/icon/core/icons/layer.icons.d.ts +2 -0
  66. package/components/icon/core/icons/link.icons.d.ts +2 -0
  67. package/components/icon/core/icons/list.icons.d.ts +2 -0
  68. package/components/icon/core/icons/location.icons.d.ts +2 -0
  69. package/components/icon/core/icons/lock.icons.d.ts +2 -0
  70. package/components/icon/core/icons/magnifying-glass.icons.d.ts +2 -0
  71. package/components/icon/core/icons/media.icons.d.ts +2 -0
  72. package/components/icon/core/icons/megaphone.icons.d.ts +2 -0
  73. package/components/icon/core/icons/money.icons.d.ts +2 -0
  74. package/components/icon/core/icons/pen.icons.d.ts +2 -0
  75. package/components/icon/core/icons/pencil.icons.d.ts +2 -0
  76. package/components/icon/core/icons/plug.icons.d.ts +2 -0
  77. package/components/icon/core/icons/plus.icons.d.ts +2 -0
  78. package/components/icon/core/icons/qr-code.icons.d.ts +2 -0
  79. package/components/icon/core/icons/screwdriver-wrench.icons.d.ts +2 -0
  80. package/components/icon/core/icons/shuffle.icons.d.ts +2 -0
  81. package/components/icon/core/icons/square.icons.d.ts +2 -0
  82. package/components/icon/core/icons/tag.icons.d.ts +2 -0
  83. package/components/icon/core/icons/thumbs.icons.d.ts +2 -0
  84. package/components/icon/core/icons/trash.icons.d.ts +2 -0
  85. package/components/icon/core/icons/triangle.icons.d.ts +2 -0
  86. package/components/icon/core/icons/user.icons.d.ts +2 -0
  87. package/components/icon/core/icons/xmark.icons.d.ts +2 -0
  88. package/components/icon/core/svg-icons/ads-icon.svg.d.ts +2 -0
  89. package/components/icon/core/svg-icons/index.d.ts +1 -0
  90. package/components/icon/index.d.ts +5 -0
  91. package/components/icon/public-api.d.ts +2 -0
  92. package/components/icon/src/icon.component.d.ts +79 -0
  93. package/components/illustration/assets/illustrations/tk-catalogs.svg.d.ts +2 -0
  94. package/components/illustration/assets/illustrations/tk-categories.svg.d.ts +2 -0
  95. package/components/illustration/assets/illustrations/tk-confirmation-action.svg.d.ts +2 -0
  96. package/components/illustration/assets/illustrations/tk-create-an-account.svg.d.ts +2 -0
  97. package/components/illustration/assets/illustrations/tk-custom-design.svg.d.ts +2 -0
  98. package/components/illustration/assets/illustrations/tk-delete.svg.d.ts +2 -0
  99. package/components/illustration/assets/illustrations/tk-download-AKF.svg.d.ts +2 -0
  100. package/components/illustration/assets/illustrations/tk-error.svg.d.ts +2 -0
  101. package/components/illustration/assets/illustrations/tk-graphics.svg.d.ts +2 -0
  102. package/components/illustration/assets/illustrations/tk-items.svg.d.ts +2 -0
  103. package/components/illustration/assets/illustrations/tk-kiosk.svg.d.ts +2 -0
  104. package/components/illustration/assets/illustrations/tk-list.svg.d.ts +2 -0
  105. package/components/illustration/assets/illustrations/tk-locations.svg.d.ts +2 -0
  106. package/components/illustration/assets/illustrations/tk-login.svg.d.ts +2 -0
  107. package/components/illustration/assets/illustrations/tk-multimedia.svg.d.ts +2 -0
  108. package/components/illustration/assets/illustrations/tk-no-connection.svg.d.ts +2 -0
  109. package/components/illustration/assets/illustrations/tk-no-found.svg.d.ts +2 -0
  110. package/components/illustration/assets/illustrations/tk-order.svg.d.ts +2 -0
  111. package/components/illustration/assets/illustrations/tk-playlist.svg.d.ts +2 -0
  112. package/components/illustration/assets/illustrations/tk-screens.svg.d.ts +2 -0
  113. package/components/illustration/assets/illustrations/tk-success.svg.d.ts +2 -0
  114. package/components/illustration/assets/illustrations/tk-support.svg.d.ts +2 -0
  115. package/components/illustration/assets/illustrations/tk-technical-failure.svg.d.ts +2 -0
  116. package/components/illustration/assets/illustrations/tk-tip.svg.d.ts +2 -0
  117. package/components/illustration/assets/illustrations/tk-upload.svg.d.ts +2 -0
  118. package/components/illustration/assets/illustrations/tk-void.svg.d.ts +2 -0
  119. package/components/illustration/assets/illustrations/tk-warning.svg.d.ts +2 -0
  120. package/components/illustration/assets/illustrations/tk-welcome.svg.d.ts +2 -0
  121. package/components/illustration/assets/illustrations/tk-without-catalogs.svg.d.ts +2 -0
  122. package/components/illustration/illustrations.registry.d.ts +5 -0
  123. package/components/illustration/index.d.ts +5 -0
  124. package/components/illustration/public-api.d.ts +1 -0
  125. package/components/illustration/src/illustration.component.d.ts +117 -0
  126. package/components/search-bar/index.d.ts +5 -0
  127. package/components/search-bar/public-api.d.ts +1 -0
  128. package/components/{tk-search-bar/tk-search-bar.component.d.ts → search-bar/src/search-bar.component.d.ts} +3 -3
  129. package/components/typography/index.d.ts +5 -0
  130. package/components/typography/public-api.d.ts +1 -0
  131. package/components/typography/src/typography.component.d.ts +10 -0
  132. package/core/index.d.ts +5 -0
  133. package/core/public-api.d.ts +1 -0
  134. package/core/types/index.d.ts +5 -0
  135. package/core/types/public-api.d.ts +9 -0
  136. package/core/types/src/branding/branding.types.d.ts +15 -0
  137. package/core/types/src/branding/index.d.ts +1 -0
  138. package/core/types/src/breakpoints/breakpoints.d.ts +10 -0
  139. package/core/types/src/breakpoints/index.d.ts +1 -0
  140. package/core/types/src/grids/grid.enum.d.ts +18 -0
  141. package/core/types/src/grids/grid.model.d.ts +10 -0
  142. package/core/types/src/grids/grid.type.d.ts +40 -0
  143. package/core/types/src/grids/index.d.ts +3 -0
  144. package/core/types/src/illustration-config/illustration-config.model.d.ts +4 -0
  145. package/core/types/src/illustration-config/index.d.ts +1 -0
  146. package/core/types/src/option/index.d.ts +1 -0
  147. package/core/types/src/option/option.model.d.ts +8 -0
  148. package/core/types/src/theme/theme.provider.d.ts +1 -0
  149. package/core/types/src/theme/tk-preset.d.ts +1 -0
  150. package/core/types/src/typography-styles/index.d.ts +1 -0
  151. package/core/types/src/validator-with-message/index.d.ts +1 -0
  152. package/directives/gird-item/index.d.ts +5 -0
  153. package/directives/gird-item/public-api.d.ts +1 -0
  154. package/directives/gird-item/src/grid-item.directive.d.ts +42 -0
  155. package/fesm2022/tekus-design-system-components-branding.mjs +93 -0
  156. package/fesm2022/tekus-design-system-components-branding.mjs.map +1 -0
  157. package/fesm2022/tekus-design-system-components-button.mjs +129 -0
  158. package/fesm2022/tekus-design-system-components-button.mjs.map +1 -0
  159. package/fesm2022/tekus-design-system-components-dropdown-list.mjs +147 -0
  160. package/fesm2022/tekus-design-system-components-dropdown-list.mjs.map +1 -0
  161. package/fesm2022/tekus-design-system-components-fallback-view.mjs +187 -0
  162. package/fesm2022/tekus-design-system-components-fallback-view.mjs.map +1 -0
  163. package/fesm2022/tekus-design-system-components-forms-form-autocomplete-field.mjs +268 -0
  164. package/fesm2022/tekus-design-system-components-forms-form-autocomplete-field.mjs.map +1 -0
  165. package/fesm2022/{tekus-design-system-components-forms-tk-form-chips-autocomplete-field.mjs → tekus-design-system-components-forms-form-chips-autocomplete-field.mjs} +34 -15
  166. package/fesm2022/tekus-design-system-components-forms-form-chips-autocomplete-field.mjs.map +1 -0
  167. package/fesm2022/{tekus-design-system-components-forms-tk-form-input-field.mjs → tekus-design-system-components-forms-form-input-field.mjs} +8 -9
  168. package/fesm2022/tekus-design-system-components-forms-form-input-field.mjs.map +1 -0
  169. package/fesm2022/tekus-design-system-components-forms.mjs +257 -221
  170. package/fesm2022/tekus-design-system-components-forms.mjs.map +1 -1
  171. package/fesm2022/tekus-design-system-components-grid-container.mjs +193 -0
  172. package/fesm2022/tekus-design-system-components-grid-container.mjs.map +1 -0
  173. package/fesm2022/tekus-design-system-components-icon.mjs +1206 -0
  174. package/fesm2022/tekus-design-system-components-icon.mjs.map +1 -0
  175. package/fesm2022/tekus-design-system-components-illustration.mjs +3893 -0
  176. package/fesm2022/tekus-design-system-components-illustration.mjs.map +1 -0
  177. package/fesm2022/tekus-design-system-components-search-bar.mjs +56 -0
  178. package/fesm2022/tekus-design-system-components-search-bar.mjs.map +1 -0
  179. package/fesm2022/tekus-design-system-components-typography.mjs +36 -0
  180. package/fesm2022/tekus-design-system-components-typography.mjs.map +1 -0
  181. package/fesm2022/tekus-design-system-core-types.mjs +307 -0
  182. package/fesm2022/tekus-design-system-core-types.mjs.map +1 -0
  183. package/fesm2022/tekus-design-system-core.mjs +307 -0
  184. package/fesm2022/tekus-design-system-core.mjs.map +1 -0
  185. package/fesm2022/tekus-design-system-directives-gird-item.mjs +95 -0
  186. package/fesm2022/tekus-design-system-directives-gird-item.mjs.map +1 -0
  187. package/fesm2022/tekus-design-system-services-design-tokens.mjs +47 -0
  188. package/fesm2022/tekus-design-system-services-design-tokens.mjs.map +1 -0
  189. package/fesm2022/tekus-design-system-services-typography.mjs +3 -3
  190. package/fesm2022/tekus-design-system-services-typography.mjs.map +1 -1
  191. package/fesm2022/tekus-design-system-utils-sanitizer-utils.mjs +53 -0
  192. package/fesm2022/tekus-design-system-utils-sanitizer-utils.mjs.map +1 -0
  193. package/package.json +65 -39
  194. package/services/design-tokens/index.d.ts +5 -0
  195. package/services/design-tokens/public-api.d.ts +1 -0
  196. package/services/design-tokens/src/design-tokens.service.d.ts +10 -0
  197. package/services/typography/public-api.d.ts +1 -1
  198. package/services/typography/{typography.service.d.ts → src/typography.service.d.ts} +1 -1
  199. package/tokens/blur/_blur.scss +11 -0
  200. package/tokens/colors/_colors.scss +97 -0
  201. package/tokens/index.scss +6 -0
  202. package/tokens/shadow/_shadow.scss +10 -0
  203. package/tokens/shapes/_shapes.scss +9 -0
  204. package/tokens/spacing/_spacing.scss +25 -0
  205. package/tokens/typography/_typography.scss +6 -0
  206. package/tokens/typography/font-size/_font-size.scss +16 -0
  207. package/tokens/typography/font-weight/_font-weight.scss +14 -0
  208. package/tokens/typography/letter-spacing/_letter-spacing.scss +12 -0
  209. package/tokens/typography/line-height/_line-height.scss +16 -0
  210. package/tokens/typography/variants/_variants.scss +211 -0
  211. package/utils/sanitizer-utils/index.d.ts +5 -0
  212. package/utils/sanitizer-utils/public-api.d.ts +1 -0
  213. package/utils/sanitizer-utils/src/sanitizer-utils.d.ts +20 -0
  214. package/components/forms/tk-form-autocomplete-field/index.d.ts +0 -5
  215. package/components/forms/tk-form-autocomplete-field/models/option.model.d.ts +0 -4
  216. package/components/forms/tk-form-autocomplete-field/public-api.d.ts +0 -1
  217. package/components/forms/tk-form-chips-autocomplete-field/index.d.ts +0 -5
  218. package/components/forms/tk-form-chips-autocomplete-field/models/option.model.d.ts +0 -4
  219. package/components/forms/tk-form-chips-autocomplete-field/public-api.d.ts +0 -1
  220. package/components/forms/tk-form-input-field/index.d.ts +0 -5
  221. package/components/forms/tk-form-input-field/public-api.d.ts +0 -1
  222. package/components/tk-dropdown-list/models/dropdown-list-item.model.d.ts +0 -4
  223. package/components/tk-dropdown-list/public-api.d.ts +0 -1
  224. package/components/tk-search-bar/public-api.d.ts +0 -1
  225. package/components/tk-typography/public-api.d.ts +0 -1
  226. package/components/tk-typography/tk-typography.component.d.ts +0 -10
  227. package/esm2022/components/forms/public-api.mjs +0 -4
  228. package/esm2022/components/forms/tekus-design-system-components-forms.mjs +0 -5
  229. package/esm2022/components/forms/tk-form-autocomplete-field/models/option.model.mjs +0 -2
  230. package/esm2022/components/forms/tk-form-autocomplete-field/public-api.mjs +0 -2
  231. package/esm2022/components/forms/tk-form-autocomplete-field/tekus-design-system-components-forms-tk-form-autocomplete-field.mjs +0 -5
  232. package/esm2022/components/forms/tk-form-autocomplete-field/tk-form-autocomplete-field.component.mjs +0 -245
  233. package/esm2022/components/forms/tk-form-chips-autocomplete-field/models/option.model.mjs +0 -2
  234. package/esm2022/components/forms/tk-form-chips-autocomplete-field/public-api.mjs +0 -2
  235. package/esm2022/components/forms/tk-form-chips-autocomplete-field/tekus-design-system-components-forms-tk-form-chips-autocomplete-field.mjs +0 -5
  236. package/esm2022/components/forms/tk-form-chips-autocomplete-field/tk-form-chips-autocomplete-field.component.mjs +0 -167
  237. package/esm2022/components/forms/tk-form-input-field/models/validator-with-message.model.mjs +0 -2
  238. package/esm2022/components/forms/tk-form-input-field/public-api.mjs +0 -2
  239. package/esm2022/components/forms/tk-form-input-field/tekus-design-system-components-forms-tk-form-input-field.mjs +0 -5
  240. package/esm2022/components/forms/tk-form-input-field/tk-form-input-field.component.mjs +0 -206
  241. package/esm2022/components/tk-dropdown-list/models/dropdown-list-item.model.mjs +0 -2
  242. package/esm2022/components/tk-dropdown-list/public-api.mjs +0 -2
  243. package/esm2022/components/tk-dropdown-list/tekus-design-system-components-tk-dropdown-list.mjs +0 -5
  244. package/esm2022/components/tk-dropdown-list/tk-dropdown-list.component.mjs +0 -137
  245. package/esm2022/components/tk-search-bar/public-api.mjs +0 -2
  246. package/esm2022/components/tk-search-bar/tekus-design-system-components-tk-search-bar.mjs +0 -5
  247. package/esm2022/components/tk-search-bar/tk-search-bar.component.mjs +0 -49
  248. package/esm2022/components/tk-typography/public-api.mjs +0 -2
  249. package/esm2022/components/tk-typography/tekus-design-system-components-tk-typography.mjs +0 -5
  250. package/esm2022/components/tk-typography/tk-typography.component.mjs +0 -29
  251. package/esm2022/index.mjs +0 -2
  252. package/esm2022/services/typography/models/typographyStyles.model.mjs +0 -2
  253. package/esm2022/services/typography/public-api.mjs +0 -2
  254. package/esm2022/services/typography/tekus-design-system-services-typography.mjs +0 -5
  255. package/esm2022/services/typography/typography.service.mjs +0 -84
  256. package/esm2022/tekus-design-system.mjs +0 -5
  257. package/fesm2022/tekus-design-system-components-forms-tk-form-autocomplete-field.mjs +0 -252
  258. package/fesm2022/tekus-design-system-components-forms-tk-form-autocomplete-field.mjs.map +0 -1
  259. package/fesm2022/tekus-design-system-components-forms-tk-form-chips-autocomplete-field.mjs.map +0 -1
  260. package/fesm2022/tekus-design-system-components-forms-tk-form-input-field.mjs.map +0 -1
  261. package/fesm2022/tekus-design-system-components-tk-dropdown-list.mjs +0 -144
  262. package/fesm2022/tekus-design-system-components-tk-dropdown-list.mjs.map +0 -1
  263. package/fesm2022/tekus-design-system-components-tk-search-bar.mjs +0 -56
  264. package/fesm2022/tekus-design-system-components-tk-search-bar.mjs.map +0 -1
  265. package/fesm2022/tekus-design-system-components-tk-typography.mjs +0 -36
  266. package/fesm2022/tekus-design-system-components-tk-typography.mjs.map +0 -1
  267. /package/{services/typography/models → core/types/src/typography-styles}/typographyStyles.model.d.ts +0 -0
  268. /package/{components/forms/tk-form-input-field/models → core/types/src/validator-with-message}/validator-with-message.model.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tekus-design-system-components-forms.mjs","sources":["../../../projects/design-system/components/forms/tk-form-input-field/tk-form-input-field.component.ts","../../../projects/design-system/components/forms/tk-form-input-field/tk-form-input-field.component.html","../../../projects/design-system/components/forms/tk-form-autocomplete-field/tk-form-autocomplete-field.component.ts","../../../projects/design-system/components/forms/tk-form-autocomplete-field/tk-form-autocomplete-field.component.html","../../../projects/design-system/components/forms/tk-form-chips-autocomplete-field/tk-form-chips-autocomplete-field.component.ts","../../../projects/design-system/components/forms/tk-form-chips-autocomplete-field/tk-form-chips-autocomplete-field.component.html","../../../projects/design-system/components/forms/tekus-design-system-components-forms.ts"],"sourcesContent":["import {\n Input,\n OnInit,\n Output,\n Component,\n OnChanges,\n EventEmitter,\n SimpleChanges,\n} from '@angular/core';\nimport {\n FormControl,\n FormsModule,\n ValidatorFn,\n AsyncValidatorFn,\n ValidationErrors,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { merge } from 'rxjs';\nimport {\n FloatLabelType,\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport { NgStyle } from '@angular/common';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ValidatorWithMessage } from './models/validator-with-message.model';\n\n@Component({\n selector: 'lib-tk-form-input-field',\n standalone: true,\n imports: [\n NgStyle,\n FormsModule,\n MatInputModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n ],\n templateUrl: './tk-form-input-field.component.html',\n styleUrl: './tk-form-input-field.component.scss',\n})\nexport class TkFormInputFieldComponent implements OnInit, OnChanges {\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Optional field input type\n * @default 'text'\n */\n @Input()\n public type = 'text';\n\n /**\n * Whether the field is required\n * @default true\n */\n @Input()\n public required = true;\n\n /**\n * Form field label behavior\n * @default 'auto'\n */\n @Input()\n public floatLabel: FloatLabelType = 'auto';\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Optional Input field text prefix\n * @default ''\n */\n @Input()\n public inputPrefix?: string;\n\n /**\n * Optional Input field text suffix\n * @default ''\n */\n @Input()\n public inputSuffix?: string;\n\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl('');\n\n /**\n * Input field error message\n * @ignore\n */\n public errorMessage: string = '';\n\n /**\n * Optional validators for the field\n * @default ''\n */\n @Input()\n public validatorsWithMessages: { [key: string]: ValidatorWithMessage } = {};\n\n /**\n * Optional async validators for the field\n * @default ''\n */\n @Input()\n public asyncValidatorsWithMessages: { [key: string]: ValidatorWithMessage } =\n {};\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * @ignore\n * Class constructor\n */\n constructor() {\n merge(this.formControl.statusChanges, this.formControl.valueChanges)\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n this.updateErrorMessage();\n });\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnInit(): void {\n this.applyValidators();\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes['validatorsWithMessages'] ||\n changes['asyncValidatorsWithMessages']\n ) {\n this.applyValidators();\n }\n }\n\n /**\n * @ignore\n * Component lifecycle method\n */\n private isThereAnyValidator(validatorsWithMessages: {\n [key: string]: ValidatorWithMessage;\n }): boolean {\n return Object.keys(validatorsWithMessages).length > 0;\n }\n\n /**\n * Applies all the passed validators\n * @ignore\n */\n private applyValidators(): void {\n const hasSyncValidators = this.isThereAnyValidator(\n this.validatorsWithMessages\n );\n\n const hasAsyncValidators = this.isThereAnyValidator(\n this.asyncValidatorsWithMessages\n );\n\n const activeValidators: ValidatorFn[] = hasSyncValidators\n ? Object.values(this.validatorsWithMessages).map(\n validatorWithMessage => validatorWithMessage.validator\n )\n : [];\n\n const activeAsyncValidators: AsyncValidatorFn[] = hasAsyncValidators\n ? Object.values(this.asyncValidatorsWithMessages).map(\n validatorWithMessage =>\n validatorWithMessage.validator as AsyncValidatorFn\n )\n : [];\n\n if (hasSyncValidators || hasAsyncValidators) {\n this.formControl.setValidators(activeValidators);\n this.formControl.setAsyncValidators(activeAsyncValidators);\n this.formControl.updateValueAndValidity();\n }\n }\n\n /**\n * Checks if there is any validation error\n * @ignore\n */\n private checkValidationErrors(\n errors: ValidationErrors | null,\n validatorsWithMessages: {\n [key: string]: ValidatorWithMessage;\n }\n ): void {\n for (const errorKey in errors) {\n if (validatorsWithMessages[errorKey]) {\n this.errorMessage = validatorsWithMessages[errorKey].message;\n }\n }\n }\n\n /**\n * Emits the formControl variable every time the field value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Updates the error message every time the input value changes\n * @ignore\n */\n public updateErrorMessage(): void {\n this.errorMessage = '';\n const errors = this.formControl.errors;\n\n if (!errors) {\n this.errorMessage = '';\n return;\n }\n\n this.checkValidationErrors(errors, this.validatorsWithMessages);\n this.checkValidationErrors(errors, this.asyncValidatorsWithMessages);\n this.onInputChanged();\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [floatLabel]=\"floatLabel\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n [required]=\"required\"\n (input)=\"onInputChanged()\"\n [placeholder]=\"placeHolder\"\n [formControl]=\"formControl\"\n (blur)=\"updateErrorMessage()\" />\n @if (inputPrefix) {\n <span class=\"form__field__label\" matTextPrefix\n >{{ inputPrefix }}&nbsp;</span\n >\n }\n @if (inputSuffix) {\n <span class=\"form__field__label\" matTextSuffix>{{ inputSuffix }}</span>\n }\n @if (formControl.invalid) {\n <mat-error class=\"form__field__error\">{{ errorMessage }}</mat-error>\n }\n </mat-form-field>\n</div>\n","import {\n Input,\n Output,\n OnInit,\n Component,\n ViewChild,\n OnDestroy,\n EventEmitter,\n AfterViewInit,\n} from '@angular/core';\nimport {\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n} from '@angular/material/autocomplete';\nimport { Option } from './models/option.model';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { map, Observable, startWith, Subscription } from 'rxjs';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'lib-tk-form-autocomplete-field',\n standalone: true,\n imports: [\n NgStyle,\n AsyncPipe,\n FormsModule,\n MatInputModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n ],\n templateUrl: './tk-form-autocomplete-field.component.html',\n styleUrl: './tk-form-autocomplete-field.component.scss',\n})\nexport class TkFormAutocompleteFieldComponent\n implements OnInit, OnDestroy, AfterViewInit\n{\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl<string | Option>('');\n\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Whether the first option should be highlighted when the autocomplete panel is opened\n * @default true\n */\n @Input()\n public autoActiveFirstOption?: boolean = true;\n\n /**\n * Whether the active option should be selected as the user is navigating.\n * @default true\n */\n @Input()\n public autoSelectActiveOption?: boolean = true;\n\n /**\n * Optional field input type\n * @default 'text'\n */\n @Input()\n public type = 'text';\n\n /**\n * Whether the field is required\n * @default true\n */\n @Input()\n public required = true;\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Filtered options\n * @ignore\n */\n public filteredOptions!: Observable<Option[]>;\n\n /**\n * Options to be displayed\n * @ignore\n */\n @Input()\n public options: Option[] = [];\n\n /**\n * Option changes handler\n */\n @Output()\n public optionSelected = new EventEmitter<string | number>();\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * Autocomplete bottom reached handler\n */\n @Output()\n public bottomReached = new EventEmitter<void>();\n\n /**\n * Subscriptions property to handle all subscriptions\n * @ignore\n */\n private subscriptions: Subscription = new Subscription();\n\n /**\n * Mat-autocomplete reference\n * @ignore\n */\n @ViewChild('auto') matAutocomplete!: MatAutocomplete;\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnInit(): void {\n this.filteredOptions = this.formControl.valueChanges.pipe(\n startWith(''),\n map(value => {\n const option = typeof value === 'string' ? value : value?.ViewValue;\n return option ? this._filterOptions(option) : this.options.slice();\n })\n );\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngAfterViewInit(): void {\n this.initAutocompleteListener();\n }\n\n /**\n * Starts the autocomplete subscriptions\n * @ignore\n */\n public initAutocompleteListener(): void {\n const openedSubscription = this.onAutocompleteOpened();\n const closedSubscription = this.onAutocompleteClosed();\n\n this.subscriptions.add(openedSubscription);\n this.subscriptions.add(closedSubscription);\n }\n\n /**\n * Handles the autocomplete opened event\n * @ignore\n */\n private onAutocompleteOpened(): Subscription {\n return this.matAutocomplete.opened.subscribe(() => {\n setTimeout(() => {\n const panel = this.matAutocomplete.panel?.nativeElement;\n if (panel) {\n panel.addEventListener('scroll', this.onScroll.bind(this));\n }\n });\n });\n }\n\n /**\n * Handles the autocomplete closed event\n * @ignore\n */\n private onAutocompleteClosed(): Subscription {\n return this.matAutocomplete.closed.subscribe(() => {\n const panel = this.matAutocomplete.panel?.nativeElement;\n if (panel) {\n panel.removeEventListener('scroll', this.onScroll.bind(this));\n }\n });\n }\n\n /**\n * Handles the scrolling event\n * @ignore\n */\n private onScroll(event: Event) {\n const panel = event.target as HTMLElement;\n const scrollTop = panel.scrollTop;\n const scrollHeight = panel.scrollHeight;\n const offsetHeight = panel.offsetHeight;\n\n if (scrollTop + offsetHeight >= scrollHeight) {\n this.onScrolledToEnd();\n }\n }\n\n /**\n * Emits the bottomReached when the user reaches the end of the autocomplete panel\n * @ignore\n */\n private onScrolledToEnd(): void {\n this.bottomReached.emit();\n }\n\n /**\n * Conditions the options' view to display the view value\n * @ignore\n */\n public displayFn(option: Option | null): string {\n return option?.ViewValue ? option.ViewValue : '';\n }\n\n /**\n * Filters the options according to the input value\n * @ignore\n */\n private _filterOptions(value: string): Option[] {\n const filterValue = value.toLowerCase();\n\n return this.options.filter(option =>\n option.ViewValue.toLowerCase().includes(filterValue)\n );\n }\n\n /**\n * Emits the selected option every time it changes\n * @ignore\n */\n public onSelectionChanged(option: Option): void {\n this.optionSelected.emit(option.Value);\n }\n\n /**\n * Emits the formControl variable every time the input value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Unsubscribe from all subscriptions when the component is destroyed\n * @ignore\n */\n ngOnDestroy() {\n this.subscriptions?.unsubscribe();\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n aria-label=\"Option\"\n [required]=\"required\"\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChanged()\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\" />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [autoActiveFirstOption]=\"autoActiveFirstOption\"\n [autoSelectActiveOption]=\"autoSelectActiveOption\"\n (optionSelected)=\"onSelectionChanged($event.option.value)\">\n @for (option of filteredOptions | async; track option.Value) {\n <mat-option [value]=\"option\">\n <span>{{ option.ViewValue }}</span>\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n","import {\n Input,\n Output,\n Component,\n ViewChild,\n ElementRef,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport {\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n} from '@angular/material/autocomplete';\nimport { Option } from './models/option.model';\nimport { map, Observable, startWith } from 'rxjs';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'lib-tk-form-chips-autocomplete-field',\n standalone: true,\n imports: [\n NgStyle,\n AsyncPipe,\n FormsModule,\n MatIconModule,\n MatChipsModule,\n MatButtonModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './tk-form-chips-autocomplete-field.component.html',\n styleUrl: './tk-form-chips-autocomplete-field.component.scss',\n})\nexport class TkFormChipsAutocompleteFieldComponent {\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl('');\n /**\n * Selected keywords\n * @ignore\n */\n public keywords: Option[] = [];\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * Keywords changes handler\n */\n @Output()\n public selectedKeywords = new EventEmitter<(string | number)[]>();\n\n /**\n * Separator constants\n * @ignore\n */\n public readonly separatorKeysCodes: number[] = [ENTER, COMMA];\n\n /**\n * Options to be displayed\n * @ignore\n */\n @Input()\n public allKeywords: Option[] = [];\n\n /**\n * Filtered keywords after the input field changes\n * @ignore\n */\n public readonly filteredKeywords: Observable<Option[]>;\n\n /**\n * Keyword Input element reference\n * @ignore\n */\n @ViewChild('keywordInput') keywordInput!: ElementRef<HTMLInputElement>;\n\n /**\n * @ignore\n * Class constructor\n */\n constructor() {\n this.filteredKeywords = this.formControl.valueChanges.pipe(\n startWith(null),\n map((keyword: string | null) =>\n keyword ? this._filter(String(keyword)) : this.allKeywords.slice()\n )\n );\n }\n\n /**\n * Handles every keyword deletion\n * @ignore\n */\n public remove(keyword: Option): void {\n const index = this.keywords.indexOf(keyword);\n\n if (index >= 0) {\n this.keywords.splice(index, 1);\n this.onKeywordsChanged();\n }\n }\n\n /**\n * Emits the formControl variable every time the field value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Emits the selected keywords every time they changed\n * @ignore\n */\n public onKeywordsChanged(): void {\n this.selectedKeywords.emit(this.keywords.map(keyword => keyword.Value));\n }\n\n /**\n * Handles the autocomplete selection\n * @ignore\n */\n public selected(event: MatAutocompleteSelectedEvent): void {\n const value = event.option.value;\n const selectedKeyword = this.allKeywords.find(\n option => option.Value === value\n );\n\n if (\n selectedKeyword &&\n !this.keywords.some(keyword => keyword.Value === selectedKeyword.Value)\n ) {\n this.keywords.push(selectedKeyword);\n this.onKeywordsChanged();\n }\n\n this.keywordInput.nativeElement.value = '';\n this.formControl.setValue(null);\n }\n\n /**\n * Filters the keywords based on the input\n * @ignore\n */\n private _filter(value: string): Option[] {\n this.onInputChanged();\n const filterValue = value.toLowerCase();\n\n return this.allKeywords.filter(keyword =>\n keyword.ViewValue.toLowerCase().includes(filterValue)\n );\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Keyword selection\">\n @for (keyword of keywords; track keyword.Value) {\n <mat-chip-row (removed)=\"remove(keyword)\">\n {{ keyword.ViewValue }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + keyword.ViewValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #keywordInput\n [matAutocomplete]=\"auto\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selected($event)\">\n @for (keyword of filteredKeywords | async; track keyword.Value) {\n <mat-option [value]=\"keyword.Value\">{{ keyword.ViewValue }}</mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i4","i5","i6"],"mappings":"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"}
1
+ {"version":3,"file":"tekus-design-system-components-forms.mjs","sources":["../../../projects/design-system/components/forms/form-autocomplete-field/src/form-autocomplete-field.component.ts","../../../projects/design-system/components/forms/form-autocomplete-field/src/form-autocomplete-field.component.html","../../../projects/design-system/components/forms/form-input-field/src/form-input-field.component.ts","../../../projects/design-system/components/forms/form-input-field/src/form-input-field.component.html","../../../projects/design-system/components/forms/form-chips-autocomplete-field/src/form-chips-autocomplete-field.component.ts","../../../projects/design-system/components/forms/form-chips-autocomplete-field/src/form-chips-autocomplete-field.component.html","../../../projects/design-system/components/forms/tekus-design-system-components-forms.ts"],"sourcesContent":["import {\n Input,\n Output,\n OnInit,\n Component,\n ViewChild,\n OnDestroy,\n OnChanges,\n EventEmitter,\n AfterViewInit,\n SimpleChanges,\n} from '@angular/core';\nimport {\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n} from '@angular/material/autocomplete';\nimport { Option } from '@tekus/design-system/core/types'\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { map, Observable, startWith, Subscription } from 'rxjs';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'tk-form-autocomplete-field',\n standalone: true,\n imports: [\n NgStyle,\n AsyncPipe,\n FormsModule,\n MatInputModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n ],\n templateUrl: './form-autocomplete-field.component.html',\n styleUrl: './form-autocomplete-field.component.scss',\n})\nexport class FormAutocompleteFieldComponent\n implements OnInit, OnDestroy, AfterViewInit, OnChanges\n{\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl<string | Option>('');\n\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Whether the first option should be highlighted when the autocomplete panel is opened\n * @default true\n */\n @Input()\n public autoActiveFirstOption?: boolean = true;\n\n /**\n * Whether the active option should be selected as the user is navigating.\n * @default true\n */\n @Input()\n public autoSelectActiveOption?: boolean = true;\n\n /**\n * Optional field input type\n * @default 'text'\n */\n @Input()\n public type = 'text';\n\n /**\n * Whether the field is required\n * @default true\n */\n @Input()\n public required = true;\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Filtered options\n * @ignore\n */\n public filteredOptions!: Observable<Option[]>;\n\n /**\n * Options to be displayed\n * @ignore\n */\n @Input()\n public options: Option[] = [];\n\n /**\n * Option changes handler\n */\n @Output()\n public optionSelected = new EventEmitter<string | number>();\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * Autocomplete bottom reached handler\n */\n @Output()\n public bottomReached = new EventEmitter<void>();\n\n /**\n * Subscriptions property to handle all subscriptions\n * @ignore\n */\n private readonly subscriptions: Subscription = new Subscription();\n\n /**\n * Mat-autocomplete reference\n * @ignore\n */\n @ViewChild('auto') matAutocomplete!: MatAutocomplete;\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnInit(): void {\n this.updateFilteredOptions();\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngAfterViewInit(): void {\n this.initAutocompleteListener();\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes) {\n this.updateFilteredOptions();\n }\n }\n\n /**\n * Handles options updates\n * @ignore\n */\n private updateFilteredOptions(): void {\n this.filteredOptions = this.formControl.valueChanges.pipe(\n startWith(''),\n map(value => {\n const option = typeof value === 'string' ? value : value?.ViewValue;\n return option\n ? this._filterOptions(option)\n : (this.options ?? []).slice();\n })\n );\n }\n\n /**\n * Starts the autocomplete subscriptions\n * @ignore\n */\n public initAutocompleteListener(): void {\n const openedSubscription = this.onAutocompleteOpened();\n const closedSubscription = this.onAutocompleteClosed();\n\n this.subscriptions.add(openedSubscription);\n this.subscriptions.add(closedSubscription);\n }\n\n /**\n * Handles the autocomplete opened event\n * @ignore\n */\n private onAutocompleteOpened(): Subscription {\n return this.matAutocomplete.opened.subscribe(() => {\n setTimeout(() => {\n const panel = this.matAutocomplete.panel?.nativeElement;\n if (panel) {\n panel.addEventListener('scroll', this.onScroll.bind(this));\n }\n });\n });\n }\n\n /**\n * Handles the autocomplete closed event\n * @ignore\n */\n private onAutocompleteClosed(): Subscription {\n return this.matAutocomplete.closed.subscribe(() => {\n const panel = this.matAutocomplete.panel?.nativeElement;\n if (panel) {\n panel.removeEventListener('scroll', this.onScroll.bind(this));\n }\n });\n }\n\n /**\n * Handles the scrolling event\n * @ignore\n */\n private onScroll(event: Event) {\n const panel = event.target as HTMLElement;\n const scrollTop = panel.scrollTop;\n const scrollHeight = panel.scrollHeight;\n const offsetHeight = panel.offsetHeight;\n\n if (scrollTop + offsetHeight >= scrollHeight) {\n this.onScrolledToEnd();\n }\n }\n\n /**\n * Emits the bottomReached when the user reaches the end of the autocomplete panel\n * @ignore\n */\n private onScrolledToEnd(): void {\n this.bottomReached.emit();\n }\n\n /**\n * Conditions the options' view to display the view value\n * @ignore\n */\n public displayFn(option: Option | null): string {\n return option?.ViewValue ? option.ViewValue : '';\n }\n\n /**\n * Filters the options according to the input value\n * @ignore\n */\n private _filterOptions(value: string): Option[] {\n const filterValue = value.toLowerCase();\n\n return this.options.filter(option =>\n option.ViewValue.toLowerCase().includes(filterValue)\n );\n }\n\n /**\n * Emits the selected option every time it changes\n * @ignore\n */\n public onSelectionChanged(option: Option): void {\n this.optionSelected.emit(option.Value);\n }\n\n /**\n * Emits the formControl variable every time the input value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Unsubscribe from all subscriptions when the component is destroyed\n * @ignore\n */\n ngOnDestroy() {\n this.subscriptions?.unsubscribe();\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n aria-label=\"Option\"\n [required]=\"required\"\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChanged()\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\" />\n <mat-autocomplete\n requireSelection\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [autoActiveFirstOption]=\"autoActiveFirstOption\"\n [autoSelectActiveOption]=\"autoSelectActiveOption\"\n (optionSelected)=\"onSelectionChanged($event.option.value)\">\n @for (option of filteredOptions | async; track option.Value) {\n <mat-option [value]=\"option\">\n <span>{{ option.ViewValue }}</span>\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n","import {\n Input,\n OnInit,\n Output,\n Component,\n OnChanges,\n EventEmitter,\n SimpleChanges,\n} from '@angular/core';\nimport {\n FormControl,\n FormsModule,\n ValidatorFn,\n AsyncValidatorFn,\n ValidationErrors,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { merge } from 'rxjs';\nimport {\n FloatLabelType,\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport { NgStyle } from '@angular/common';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ValidatorWithMessage } from '@tekus/design-system/core/types';\n\n@Component({\n selector: 'tk-form-input-field',\n standalone: true,\n imports: [\n NgStyle,\n FormsModule,\n MatInputModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n ],\n templateUrl: './form-input-field.component.html',\n styleUrl: './form-input-field.component.scss',\n})\nexport class FormInputFieldComponent implements OnInit, OnChanges {\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Optional field input type\n * @default 'text'\n */\n @Input()\n public type = 'text';\n\n /**\n * Whether the field is required\n * @default true\n */\n @Input()\n public required = true;\n\n /**\n * Form field label behavior\n * @default 'auto'\n */\n @Input()\n public floatLabel: FloatLabelType = 'auto';\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Optional Input field text prefix\n * @default ''\n */\n @Input()\n public inputPrefix?: string;\n\n /**\n * Optional Input field text suffix\n * @default ''\n */\n @Input()\n public inputSuffix?: string;\n\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl('');\n\n /**\n * Input field error message\n * @ignore\n */\n public errorMessage: string = '';\n\n /**\n * Optional validators for the field\n * @default ''\n */\n @Input()\n public validatorsWithMessages: { [key: string]: ValidatorWithMessage } = {};\n\n /**\n * Optional async validators for the field\n * @default ''\n */\n @Input()\n public asyncValidatorsWithMessages: { [key: string]: ValidatorWithMessage } =\n {};\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * @ignore\n * Class constructor\n */\n constructor() {\n merge(this.formControl.statusChanges, this.formControl.valueChanges)\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n this.updateErrorMessage();\n });\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnInit(): void {\n this.applyValidators();\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes['validatorsWithMessages'] ||\n changes['asyncValidatorsWithMessages']\n ) {\n this.applyValidators();\n }\n }\n\n /**\n * @ignore\n * Component lifecycle method\n */\n private isThereAnyValidator(validatorsWithMessages: {\n [key: string]: ValidatorWithMessage;\n }): boolean {\n return Object.keys(validatorsWithMessages).length > 0;\n }\n\n /**\n * Applies all the passed validators\n * @ignore\n */\n private applyValidators(): void {\n const hasSyncValidators = this.isThereAnyValidator(\n this.validatorsWithMessages\n );\n\n const hasAsyncValidators = this.isThereAnyValidator(\n this.asyncValidatorsWithMessages\n );\n\n const activeValidators: ValidatorFn[] = hasSyncValidators\n ? Object.values(this.validatorsWithMessages).map(\n validatorWithMessage => validatorWithMessage.validator\n )\n : [];\n\n const activeAsyncValidators: AsyncValidatorFn[] = hasAsyncValidators\n ? Object.values(this.asyncValidatorsWithMessages).map(\n validatorWithMessage =>\n validatorWithMessage.validator as AsyncValidatorFn\n )\n : [];\n\n if (hasSyncValidators || hasAsyncValidators) {\n this.formControl.setValidators(activeValidators);\n this.formControl.setAsyncValidators(activeAsyncValidators);\n this.formControl.updateValueAndValidity();\n }\n }\n\n /**\n * Checks if there is any validation error\n * @ignore\n */\n private checkValidationErrors(\n errors: ValidationErrors | null,\n validatorsWithMessages: {\n [key: string]: ValidatorWithMessage;\n }\n ): void {\n for (const errorKey in errors) {\n if (validatorsWithMessages[errorKey]) {\n this.errorMessage = validatorsWithMessages[errorKey].message;\n }\n }\n }\n\n /**\n * Emits the formControl variable every time the field value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Updates the error message every time the input value changes\n * @ignore\n */\n public updateErrorMessage(): void {\n this.errorMessage = '';\n const errors = this.formControl.errors;\n\n if (!errors) {\n this.errorMessage = '';\n return;\n }\n\n this.checkValidationErrors(errors, this.validatorsWithMessages);\n this.checkValidationErrors(errors, this.asyncValidatorsWithMessages);\n this.onInputChanged();\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [floatLabel]=\"floatLabel\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n [required]=\"required\"\n (input)=\"onInputChanged()\"\n [placeholder]=\"placeHolder\"\n [formControl]=\"formControl\"\n (blur)=\"updateErrorMessage()\" />\n @if (inputPrefix) {\n <span class=\"form__field__label\" matTextPrefix\n >{{ inputPrefix }}&nbsp;</span\n >\n }\n @if (inputSuffix) {\n <span class=\"form__field__label\" matTextSuffix>{{ inputSuffix }}</span>\n }\n @if (formControl.invalid) {\n <mat-error class=\"form__field__error\">{{ errorMessage }}</mat-error>\n }\n </mat-form-field>\n</div>\n","import {\n Input,\n Output,\n OnInit,\n Component,\n ViewChild,\n OnChanges,\n ElementRef,\n EventEmitter,\n SimpleChanges,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport {\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n} from '@angular/material/autocomplete';\nimport { Option } from '@tekus/design-system/core/types';\nimport { map, Observable, startWith } from 'rxjs';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'tk-form-chips-autocomplete-field',\n standalone: true,\n imports: [\n NgStyle,\n AsyncPipe,\n FormsModule,\n MatIconModule,\n MatChipsModule,\n MatButtonModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-chips-autocomplete-field.component.html',\n styleUrl: './form-chips-autocomplete-field.component.scss',\n})\nexport class FormChipsAutocompleteFieldComponent\n implements OnInit, OnChanges\n{\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl('');\n\n /**\n * Selected keywords\n * @ignore\n */\n public keywords: Option[] = [];\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * Keywords changes handler\n */\n @Output()\n public selectedKeywords = new EventEmitter<(string | number)[]>();\n\n /**\n * Separator constants\n * @ignore\n */\n public readonly separatorKeysCodes: number[] = [ENTER, COMMA];\n\n /**\n * Options to be displayed\n * @ignore\n */\n @Input()\n public allKeywords: Option[] = [];\n\n /**\n * Filtered keywords after the input field changes\n * @ignore\n */\n public filteredKeywords: Observable<Option[]> | undefined;\n\n /**\n * Keyword Input element reference\n * @ignore\n */\n @ViewChild('keywordInput') keywordInput!: ElementRef<HTMLInputElement>;\n\n /**\n * @ignore\n * Lifecycle method\n */\n ngOnInit(): void {\n this.updateFilteredKeywords();\n }\n\n /**\n * @ignore\n * Lifecycle method\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['allKeywords']) {\n this.updateFilteredKeywords();\n }\n }\n\n /**\n * Updates the filtered keywords when allKeywords changes\n * @ignore\n */\n private updateFilteredKeywords(): void {\n this.filteredKeywords = this.formControl.valueChanges.pipe(\n startWith(null),\n map((keyword: string | null) =>\n keyword\n ? this._filter(String(keyword))\n : (this.allKeywords ?? []).slice()\n )\n );\n }\n\n /**\n * Handles every keyword deletion\n * @ignore\n */\n public remove(keyword: Option): void {\n const index = this.keywords.indexOf(keyword);\n\n if (index >= 0) {\n this.keywords.splice(index, 1);\n this.onKeywordsChanged();\n }\n }\n\n /**\n * Emits the formControl variable every time the field value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Emits the selected keywords every time they changed\n * @ignore\n */\n public onKeywordsChanged(): void {\n this.selectedKeywords.emit(this.keywords.map(keyword => keyword.Value));\n }\n\n /**\n * Handles the autocomplete selection\n * @ignore\n */\n public selected(event: MatAutocompleteSelectedEvent): void {\n const value = event.option.value;\n const selectedKeyword = this.allKeywords.find(\n option => option.Value === value\n );\n\n if (\n selectedKeyword &&\n !this.keywords.some(keyword => keyword.Value === selectedKeyword.Value)\n ) {\n this.keywords.push(selectedKeyword);\n this.onKeywordsChanged();\n }\n\n this.keywordInput.nativeElement.value = '';\n this.formControl.setValue(null);\n }\n\n /**\n * Filters the keywords based on the input\n * @ignore\n */\n private _filter(value: string): Option[] {\n this.onInputChanged();\n const filterValue = value.toLowerCase();\n\n return this.allKeywords.filter(keyword =>\n keyword.ViewValue.toLowerCase().includes(filterValue)\n );\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Keyword selection\">\n @for (keyword of keywords; track keyword.Value) {\n <mat-chip-row (removed)=\"remove(keyword)\">\n {{ keyword.ViewValue }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + keyword.ViewValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #keywordInput\n [matAutocomplete]=\"auto\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selected($event)\">\n @for (keyword of filteredKeywords | async; track keyword.Value) {\n <mat-option [value]=\"keyword.Value\">{{ keyword.ViewValue }}</mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i4","i5"],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import * as i0 from '@angular/core';
2
+ import { model, inject, computed, HostBinding, Component } from '@angular/core';
3
+ import { GridItemDirective } from '@tekus/design-system/directives/gird-item';
4
+ import { BreakpointObserver } from '@angular/cdk/layout';
5
+ import { toSignal } from '@angular/core/rxjs-interop';
6
+ import { Gutter, Breakpoints, GapGutter, PaddingGridContainer } from '@tekus/design-system/core/types';
7
+
8
+ /**
9
+ * A responsive CSS Grid container that exposes typed, two-way models to control
10
+ * column count, track size, inter-item gutter, and container padding.
11
+ *
12
+ * Behavior:
13
+ * - columns: GridColumns (default 12). Numeric values are capped per Breakpoints
14
+ * (2/3/4/8 for mobileSmall/mobileLarge/tabletVertical/tabletHorizontal). No cap when size is minmax().
15
+ * - size: ComposeSize (default '1fr'). Required to be minmax() when columns is 'auto-fill', otherwise an error is thrown.
16
+ * - gutter: Gutter (default 'normal'), mapped to GapGutter for host gap.
17
+ * - containerType: ContainerType (default 'medium'), mapped to PaddingGridContainer for host padding.
18
+ *
19
+ * Host bindings:
20
+ * - style.grid-template-columns via repeat(...) from computed columns/size.
21
+ * - style.gap via GapGutter.
22
+ * - style.padding via PaddingGridContainer.
23
+ *
24
+ * Intended to wrap GridItemDirective children. Public type is compatible with FixedGridProps | AutoFillGridProps.
25
+ * @selector tk-grid-container
26
+ */
27
+ class GridContainerComponent {
28
+ constructor() {
29
+ /**
30
+ * Two-way bound model defining the number of columns in the grid.
31
+ *
32
+ * The value is capped based on the current screen breakpoint. If the `size` model
33
+ * is a `minmax()` function, the column cap is disabled.
34
+ *
35
+ * @default 12
36
+ * @see GridColumns
37
+ */
38
+ this.columns = model(12);
39
+ /**
40
+ * Two-way bound model defining the spacing between grid items.
41
+ *
42
+ * The value is mapped to a CSS `gap` property based on the `Gutter` type.
43
+ *
44
+ * @default Gutter.normal
45
+ * @see Gutter
46
+ * @see GutterType
47
+ */
48
+ this.gutter = model(Gutter.normal);
49
+ /**
50
+ * Two-way bound model defining the grid track size.
51
+ *
52
+ * Accepts any ComposeSize value (e.g., '1fr', fixed lengths, or minmax()) and
53
+ * drives the computed grid template for the container.
54
+ *
55
+ * @default '1fr'
56
+ * @see ComposeSize
57
+ */
58
+ this.size = model('1fr');
59
+ /**
60
+ * Two-way bound model defining the internal spacing of the grid container.
61
+ *
62
+ * The value is mapped to a CSS `padding` property based on the `PaddingGridContainer` type.
63
+ *
64
+ * @default 'medium'
65
+ * @see ContainerType
66
+ */
67
+ this.containerType = model('medium');
68
+ /**
69
+ * A private static RegExp to validate strings that match the `minmax()` function.
70
+ */
71
+ this.MINMAX_RE = /^minmax\(\s*(\d+(px|rem|em|%|fr))\s*,\s*(\d+(px|rem|em|%|fr))\s*\)$/i;
72
+ /**
73
+ * A private service injection to observe screen breakpoint changes.
74
+ */
75
+ this.breakpointObserver = inject(BreakpointObserver);
76
+ /**
77
+ * A signal derived from `breakpointObserver` to reactively track changes
78
+ * across all defined breakpoints.
79
+ */
80
+ this.screenChanges = toSignal(this.breakpointObserver.observe([
81
+ Breakpoints.mobileSmall,
82
+ Breakpoints.mobile,
83
+ Breakpoints.mobileLarge,
84
+ Breakpoints.tabletVertical,
85
+ Breakpoints.tabletHorizontal,
86
+ Breakpoints.desktopSmall,
87
+ Breakpoints.desktop,
88
+ Breakpoints.desktopLarge,
89
+ ]));
90
+ /**
91
+ * A computed signal that determines the final number of columns for the grid.
92
+ *
93
+ * It caps the `columns` model value based on the current screen breakpoint,
94
+ * unless the `size` model is a `minmax()` function.
95
+ */
96
+ this.finalColumns = computed(() => {
97
+ const breakpoints = this.screenChanges()?.breakpoints;
98
+ const columnsNumber = parseInt(this.columns());
99
+ if (isNaN(columnsNumber) ||
100
+ !breakpoints ||
101
+ this.isMinMax(this.size())) {
102
+ return this.columns();
103
+ }
104
+ let maxColumns = 12;
105
+ if (breakpoints[Breakpoints.mobileSmall] ||
106
+ breakpoints[Breakpoints.mobile]) {
107
+ maxColumns = 2;
108
+ }
109
+ else if (breakpoints[Breakpoints.mobileLarge]) {
110
+ maxColumns = 3;
111
+ }
112
+ else if (breakpoints[Breakpoints.tabletVertical]) {
113
+ maxColumns = 4;
114
+ }
115
+ else if (breakpoints[Breakpoints.tabletHorizontal]) {
116
+ maxColumns = 8;
117
+ }
118
+ return columnsNumber <= maxColumns ? columnsNumber : maxColumns;
119
+ });
120
+ }
121
+ /**
122
+ * Host binding that maps the `gutter` model to the host element's `style.gap` property.
123
+ * @returns The CSS gap value from the `GapGutter` type.
124
+ */
125
+ get hostGap() {
126
+ const key = this.gutter() ?? Gutter.normal;
127
+ return GapGutter[key];
128
+ }
129
+ /**
130
+ * Host binding that sets the `style.grid-template-columns` property based on
131
+ * the computed column count and track size.
132
+ * @returns The computed CSS value for `grid-template-columns`.
133
+ */
134
+ get gridColumns() {
135
+ return this.computeGridTemplateColumns();
136
+ }
137
+ /**
138
+ * Host binding that sets the `style.padding` property based on the `containerType` model.
139
+ * @returns The CSS padding value from the `PaddingGridContainer` type.
140
+ */
141
+ get containerPadding() {
142
+ return PaddingGridContainer[this.containerType()] ?? PaddingGridContainer.medium;
143
+ }
144
+ /**
145
+ * Computes the final `grid-template-columns` string for the host element.
146
+ *
147
+ * It handles both fixed and `auto-fill` column types and validates that the `size`
148
+ * model is a `minmax()` function when `columns` is set to `'auto-fill'`.
149
+ * @returns The CSS value for the `grid-template-columns` property.
150
+ */
151
+ computeGridTemplateColumns() {
152
+ const columnsVal = this.finalColumns();
153
+ const sizeVal = this.size() ?? '1fr';
154
+ if (columnsVal === 'auto-fill') {
155
+ if (this.isMinMax(sizeVal)) {
156
+ return `repeat(auto-fill, ${sizeVal})`;
157
+ }
158
+ throw new Error('When using columns="auto-fill", the "size" model must be a minmax() function, e.g., minmax(200px,1fr).');
159
+ }
160
+ return `repeat(${columnsVal}, ${sizeVal})`;
161
+ }
162
+ /**
163
+ * A private helper method to check if a given value is a valid `minmax()` function string.
164
+ * @param value The value to check.
165
+ * @returns `true` if the value is a valid `minmax()` string, `false` otherwise.
166
+ */
167
+ isMinMax(value) {
168
+ return (typeof value === 'string' &&
169
+ this.MINMAX_RE.test(value.trim()));
170
+ }
171
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GridContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
172
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.15", type: GridContainerComponent, isStandalone: true, selector: "tk-grid-container", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, gutter: { classPropertyName: "gutter", publicName: "gutter", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, containerType: { classPropertyName: "containerType", publicName: "containerType", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columns: "columnsChange", gutter: "gutterChange", size: "sizeChange", containerType: "containerTypeChange" }, host: { properties: { "style.gap": "this.hostGap", "style.grid-template-columns": "this.gridColumns", "style.padding": "this.containerPadding" } }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:grid}\n"] }); }
173
+ }
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GridContainerComponent, decorators: [{
175
+ type: Component,
176
+ args: [{ selector: 'tk-grid-container', standalone: true, imports: [GridItemDirective], template: `<ng-content />`, styles: [":host{display:grid}\n"] }]
177
+ }], propDecorators: { hostGap: [{
178
+ type: HostBinding,
179
+ args: ['style.gap']
180
+ }], gridColumns: [{
181
+ type: HostBinding,
182
+ args: ['style.grid-template-columns']
183
+ }], containerPadding: [{
184
+ type: HostBinding,
185
+ args: ['style.padding']
186
+ }] } });
187
+
188
+ /**
189
+ * Generated bundle index. Do not edit.
190
+ */
191
+
192
+ export { GridContainerComponent };
193
+ //# sourceMappingURL=tekus-design-system-components-grid-container.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tekus-design-system-components-grid-container.mjs","sources":["../../../projects/design-system/components/grid-container/src/grid-container.component.ts","../../../projects/design-system/components/grid-container/tekus-design-system-components-grid-container.ts"],"sourcesContent":["import { Component, computed, HostBinding, inject, model } from '@angular/core';\nimport { GridItemDirective } from '@tekus/design-system/directives/gird-item';\nimport { BreakpointObserver } from '@angular/cdk/layout';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n AutoFillGridProps,\n ComposeMinMax,\n ComposeSize,\n ContainerType,\n FixedGridProps,\n GapGutter,\n GridColumns,\n PaddingGridContainer,\n Breakpoints,\n Gutter,\n GutterType\n} from '@tekus/design-system/core/types';\n\n/**\n * A responsive CSS Grid container that exposes typed, two-way models to control\n * column count, track size, inter-item gutter, and container padding.\n *\n * Behavior:\n * - columns: GridColumns (default 12). Numeric values are capped per Breakpoints\n * (2/3/4/8 for mobileSmall/mobileLarge/tabletVertical/tabletHorizontal). No cap when size is minmax().\n * - size: ComposeSize (default '1fr'). Required to be minmax() when columns is 'auto-fill', otherwise an error is thrown.\n * - gutter: Gutter (default 'normal'), mapped to GapGutter for host gap.\n * - containerType: ContainerType (default 'medium'), mapped to PaddingGridContainer for host padding.\n *\n * Host bindings:\n * - style.grid-template-columns via repeat(...) from computed columns/size.\n * - style.gap via GapGutter.\n * - style.padding via PaddingGridContainer.\n *\n * Intended to wrap GridItemDirective children. Public type is compatible with FixedGridProps | AutoFillGridProps.\n * @selector tk-grid-container\n */\n@Component({\n selector: 'tk-grid-container',\n standalone: true,\n imports: [GridItemDirective],\n styleUrls: ['./grid-container.component.scss'],\n template: `<ng-content />`,\n})\nexport class GridContainerComponent {\n\n /**\n * Two-way bound model defining the number of columns in the grid.\n *\n * The value is capped based on the current screen breakpoint. If the `size` model\n * is a `minmax()` function, the column cap is disabled.\n *\n * @default 12\n * @see GridColumns\n */\n columns = model<GridColumns>(12);\n\n /**\n * Two-way bound model defining the spacing between grid items.\n *\n * The value is mapped to a CSS `gap` property based on the `Gutter` type.\n *\n * @default Gutter.normal\n * @see Gutter\n * @see GutterType\n */\n gutter = model<GutterType>(Gutter.normal);\n\n /**\n * Two-way bound model defining the grid track size.\n *\n * Accepts any ComposeSize value (e.g., '1fr', fixed lengths, or minmax()) and\n * drives the computed grid template for the container.\n *\n * @default '1fr'\n * @see ComposeSize\n */\n size = model<ComposeSize>('1fr');\n\n /**\n * Two-way bound model defining the internal spacing of the grid container.\n *\n * The value is mapped to a CSS `padding` property based on the `PaddingGridContainer` type.\n *\n * @default 'medium'\n * @see ContainerType\n */\n containerType = model<ContainerType>('medium');\n\n /**\n * A private static RegExp to validate strings that match the `minmax()` function.\n */\n readonly MINMAX_RE = /^minmax\\(\\s*(\\d+(px|rem|em|%|fr))\\s*,\\s*(\\d+(px|rem|em|%|fr))\\s*\\)$/i;\n\n /**\n * A private service injection to observe screen breakpoint changes.\n */\n private readonly breakpointObserver = inject(BreakpointObserver);\n\n /**\n * A signal derived from `breakpointObserver` to reactively track changes\n * across all defined breakpoints.\n */\n screenChanges = toSignal(\n this.breakpointObserver.observe([\n Breakpoints.mobileSmall,\n Breakpoints.mobile,\n Breakpoints.mobileLarge,\n Breakpoints.tabletVertical,\n Breakpoints.tabletHorizontal,\n Breakpoints.desktopSmall,\n Breakpoints.desktop,\n Breakpoints.desktopLarge,\n ])\n );\n\n /**\n * A computed signal that determines the final number of columns for the grid.\n *\n * It caps the `columns` model value based on the current screen breakpoint,\n * unless the `size` model is a `minmax()` function.\n */\n readonly finalColumns = computed(() => {\n const breakpoints = this.screenChanges()?.breakpoints;\n const columnsNumber = parseInt(this.columns() as string);\n if (\n isNaN(columnsNumber) ||\n !breakpoints ||\n this.isMinMax(this.size())\n ) {\n return this.columns();\n }\n\n let maxColumns = 12;\n\n if (\n breakpoints[Breakpoints.mobileSmall] ||\n breakpoints[Breakpoints.mobile]\n ) {\n maxColumns = 2;\n } else if (breakpoints[Breakpoints.mobileLarge]) {\n maxColumns = 3;\n } else if (breakpoints[Breakpoints.tabletVertical]) {\n maxColumns = 4;\n } else if (breakpoints[Breakpoints.tabletHorizontal]) {\n maxColumns = 8;\n }\n\n return columnsNumber <= maxColumns ? columnsNumber : maxColumns;\n });\n\n /**\n * Host binding that maps the `gutter` model to the host element's `style.gap` property.\n * @returns The CSS gap value from the `GapGutter` type.\n */\n @HostBinding('style.gap')\n get hostGap(): GapGutter {\n const key: GutterType = this.gutter() ?? Gutter.normal;\n return GapGutter[key as Gutter];\n }\n\n /**\n * Host binding that sets the `style.grid-template-columns` property based on\n * the computed column count and track size.\n * @returns The computed CSS value for `grid-template-columns`.\n */\n @HostBinding('style.grid-template-columns')\n get gridColumns(): string {\n return this.computeGridTemplateColumns();\n }\n\n /**\n * Host binding that sets the `style.padding` property based on the `containerType` model.\n * @returns The CSS padding value from the `PaddingGridContainer` type.\n */\n @HostBinding('style.padding')\n get containerPadding(): string {\n return PaddingGridContainer[this.containerType() as keyof typeof PaddingGridContainer] ?? PaddingGridContainer.medium;\n }\n\n /**\n * Computes the final `grid-template-columns` string for the host element.\n *\n * It handles both fixed and `auto-fill` column types and validates that the `size`\n * model is a `minmax()` function when `columns` is set to `'auto-fill'`.\n * @returns The CSS value for the `grid-template-columns` property.\n */\n computeGridTemplateColumns(): string {\n const columnsVal = this.finalColumns();\n const sizeVal = this.size() ?? '1fr';\n\n if (columnsVal === 'auto-fill') {\n if (this.isMinMax(sizeVal)) {\n return `repeat(auto-fill, ${sizeVal})`;\n }\n throw new Error(\n 'When using columns=\"auto-fill\", the \"size\" model must be a minmax() function, e.g., minmax(200px,1fr).'\n );\n }\n\n return `repeat(${columnsVal}, ${sizeVal})`;\n }\n\n /**\n * A private helper method to check if a given value is a valid `minmax()` function string.\n * @param value The value to check.\n * @returns `true` if the value is a valid `minmax()` string, `false` otherwise.\n */\n private isMinMax(value: unknown): value is ComposeMinMax {\n return (\n typeof value === 'string' &&\n this.MINMAX_RE.test(value.trim())\n );\n }\n}\n\n/**\n * A public type to represent an instance of the `GridContainerComponent` class,\n * combined with its public input properties.\n *\n * This allows for better type-checking when the component is used in a template.\n */\nexport type GridComponent = new () => GridContainerComponent &\n (FixedGridProps | AutoFillGridProps);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAkBA;;;;;;;;;;;;;;;;;;AAkBG;MAQU,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;AASE;;;;;;;;AAQG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAc,EAAE,CAAC;AAEhC;;;;;;;;AAQG;AACH,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAa,MAAM,CAAC,MAAM,CAAC;AAEzC;;;;;;;;AAQG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAc,KAAK,CAAC;AAEhC;;;;;;;AAOG;AACH,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAgB,QAAQ,CAAC;AAE9C;;AAEG;QACM,IAAS,CAAA,SAAA,GAAG,sEAAsE;AAE3F;;AAEG;AACc,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEhE;;;AAGG;QACH,IAAa,CAAA,aAAA,GAAG,QAAQ,CACtB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;AAC9B,YAAA,WAAW,CAAC,WAAW;AACvB,YAAA,WAAW,CAAC,MAAM;AAClB,YAAA,WAAW,CAAC,WAAW;AACvB,YAAA,WAAW,CAAC,cAAc;AAC1B,YAAA,WAAW,CAAC,gBAAgB;AAC5B,YAAA,WAAW,CAAC,YAAY;AACxB,YAAA,WAAW,CAAC,OAAO;AACnB,YAAA,WAAW,CAAC,YAAY;AACzB,SAAA,CAAC,CACH;AAED;;;;;AAKG;AACM,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW;YACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAY,CAAC;YACxD,IACE,KAAK,CAAC,aAAa,CAAC;AACpB,gBAAA,CAAC,WAAW;gBACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAC1B;AACA,gBAAA,OAAO,IAAI,CAAC,OAAO,EAAE;;YAGvB,IAAI,UAAU,GAAG,EAAE;AAEnB,YAAA,IACE,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;AACpC,gBAAA,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,EAC/B;gBACA,UAAU,GAAG,CAAC;;AACT,iBAAA,IAAI,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE;gBAC/C,UAAU,GAAG,CAAC;;AACT,iBAAA,IAAI,WAAW,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE;gBAClD,UAAU,GAAG,CAAC;;AACT,iBAAA,IAAI,WAAW,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE;gBACpD,UAAU,GAAG,CAAC;;YAGhB,OAAO,aAAa,IAAI,UAAU,GAAG,aAAa,GAAG,UAAU;AACjE,SAAC,CAAC;AAiEH;AA/DC;;;AAGK;AACL,IAAA,IACI,OAAO,GAAA;QACT,MAAM,GAAG,GAAe,IAAI,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM;AACtD,QAAA,OAAO,SAAS,CAAC,GAAa,CAAC;;AAGjC;;;;AAIG;AACH,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,0BAA0B,EAAE;;AAG1C;;;AAGG;AACH,IAAA,IACI,gBAAgB,GAAA;QAClB,OAAO,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAuC,CAAC,IAAI,oBAAoB,CAAC,MAAM;;AAGvH;;;;;;AAMG;IACH,0BAA0B,GAAA;AACxB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK;AAEpC,QAAA,IAAI,UAAU,KAAK,WAAW,EAAE;AAC9B,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC1B,OAAO,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAA,CAAG;;AAExC,YAAA,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG;;AAGH,QAAA,OAAO,CAAU,OAAA,EAAA,UAAU,CAAK,EAAA,EAAA,OAAO,GAAG;;AAG5C;;;;AAIG;AACK,IAAA,QAAQ,CAAC,KAAc,EAAA;AAC7B,QAAA,QACE,OAAO,KAAK,KAAK,QAAQ;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;;+GAvK1B,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,o2BAFvB,CAAgB,cAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,CAAA;;4FAEf,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,iBAAiB,CAAC,YAElB,CAAgB,cAAA,CAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA;8BAkHtB,OAAO,EAAA,CAAA;sBADV,WAAW;uBAAC,WAAW;gBAYpB,WAAW,EAAA,CAAA;sBADd,WAAW;uBAAC,6BAA6B;gBAUtC,gBAAgB,EAAA,CAAA;sBADnB,WAAW;uBAAC,eAAe;;;AC/K9B;;AAEG;;;;"}