@yuuvis/client-framework 0.6.5

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 (392) hide show
  1. package/README.md +62 -0
  2. package/actions/README.md +3 -0
  3. package/actions/index.d.ts +6 -0
  4. package/actions/lib/actions/copy-action/copy-action.d.ts +17 -0
  5. package/actions/lib/actions/cut-action/cut-action.d.ts +17 -0
  6. package/actions/lib/actions/delete-action/delete/delete.component.d.ts +22 -0
  7. package/actions/lib/actions/delete-action/delete-action.d.ts +17 -0
  8. package/actions/lib/actions/download-action/download-action.d.ts +17 -0
  9. package/actions/lib/actions.icon.d.ts +7 -0
  10. package/actions/lib/actions.interface.d.ts +86 -0
  11. package/actions/lib/actions.module.d.ts +8 -0
  12. package/actions/lib/actions.service.d.ts +38 -0
  13. package/actions/lib/components/contextmenu/contextmenu.component.d.ts +11 -0
  14. package/app-bar/README.md +3 -0
  15. package/app-bar/index.d.ts +1 -0
  16. package/app-bar/lib/app-bar.component.d.ts +47 -0
  17. package/clipboard/README.md +3 -0
  18. package/clipboard/index.d.ts +1 -0
  19. package/clipboard/lib/clipboard.component.d.ts +16 -0
  20. package/common/README.md +3 -0
  21. package/common/index.d.ts +5 -0
  22. package/common/lib/components/focus-indicator/focus-indicator.component.d.ts +7 -0
  23. package/common/lib/components/token-input/token-input.component.d.ts +55 -0
  24. package/common/lib/components/token-input/token-input.interface.d.ts +8 -0
  25. package/common/lib/directives/busy-overlay.directive.d.ts +25 -0
  26. package/common/lib/directives/click-double.directive.d.ts +17 -0
  27. package/common/lib/directives/container-size.directive.d.ts +30 -0
  28. package/common/lib/directives/drag-select.directive.d.ts +21 -0
  29. package/common/lib/directives/file-drop-zone/file-drop-zone.directive.d.ts +18 -0
  30. package/common/lib/directives/file-drop-zone/file-drop-zone.interface.d.ts +5 -0
  31. package/common/lib/directives/focus-within.directive.d.ts +36 -0
  32. package/common/lib/directives/index.d.ts +8 -0
  33. package/common/lib/directives/light-dismiss.directive.d.ts +19 -0
  34. package/common/lib/directives/longpress.directive.d.ts +13 -0
  35. package/common/lib/directives/noop-value-accessor.directive.d.ts +10 -0
  36. package/esm2022/actions/index.mjs +7 -0
  37. package/esm2022/actions/lib/actions/copy-action/copy-action.mjs +31 -0
  38. package/esm2022/actions/lib/actions/cut-action/cut-action.mjs +30 -0
  39. package/esm2022/actions/lib/actions/delete-action/delete/delete.component.mjs +67 -0
  40. package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +44 -0
  41. package/esm2022/actions/lib/actions/download-action/download-action.mjs +33 -0
  42. package/esm2022/actions/lib/actions.icon.mjs +8 -0
  43. package/esm2022/actions/lib/actions.interface.mjs +19 -0
  44. package/esm2022/actions/lib/actions.module.mjs +16 -0
  45. package/esm2022/actions/lib/actions.service.mjs +89 -0
  46. package/esm2022/actions/lib/components/contextmenu/contextmenu.component.mjs +27 -0
  47. package/esm2022/actions/yuuvis-client-framework-actions.mjs +5 -0
  48. package/esm2022/app-bar/index.mjs +2 -0
  49. package/esm2022/app-bar/lib/app-bar.component.mjs +89 -0
  50. package/esm2022/app-bar/yuuvis-client-framework-app-bar.mjs +5 -0
  51. package/esm2022/clipboard/index.mjs +2 -0
  52. package/esm2022/clipboard/lib/clipboard.component.mjs +48 -0
  53. package/esm2022/clipboard/yuuvis-client-framework-clipboard.mjs +5 -0
  54. package/esm2022/common/index.mjs +6 -0
  55. package/esm2022/common/lib/components/focus-indicator/focus-indicator.component.mjs +41 -0
  56. package/esm2022/common/lib/components/token-input/token-input.component.mjs +324 -0
  57. package/esm2022/common/lib/components/token-input/token-input.interface.mjs +2 -0
  58. package/esm2022/common/lib/directives/busy-overlay.directive.mjs +88 -0
  59. package/esm2022/common/lib/directives/click-double.directive.mjs +61 -0
  60. package/esm2022/common/lib/directives/container-size.directive.mjs +56 -0
  61. package/esm2022/common/lib/directives/drag-select.directive.mjs +114 -0
  62. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.directive.mjs +153 -0
  63. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.interface.mjs +2 -0
  64. package/esm2022/common/lib/directives/focus-within.directive.mjs +81 -0
  65. package/esm2022/common/lib/directives/index.mjs +9 -0
  66. package/esm2022/common/lib/directives/light-dismiss.directive.mjs +44 -0
  67. package/esm2022/common/lib/directives/longpress.directive.mjs +36 -0
  68. package/esm2022/common/lib/directives/noop-value-accessor.directive.mjs +42 -0
  69. package/esm2022/common/yuuvis-client-framework-common.mjs +5 -0
  70. package/esm2022/forms/index.mjs +19 -0
  71. package/esm2022/forms/lib/elements/catalog/catalog.component.mjs +118 -0
  72. package/esm2022/forms/lib/elements/datetime/datetime.component.mjs +82 -0
  73. package/esm2022/forms/lib/elements/datetime-range/datetime-range.component.mjs +166 -0
  74. package/esm2022/forms/lib/elements/number/number.component.mjs +195 -0
  75. package/esm2022/forms/lib/elements/number-range/number-range.component.mjs +176 -0
  76. package/esm2022/forms/lib/elements/organization/organization.component.mjs +268 -0
  77. package/esm2022/forms/lib/elements/string/string.component.mjs +254 -0
  78. package/esm2022/forms/lib/form-input/form-input.component.mjs +88 -0
  79. package/esm2022/forms/lib/forms.module.mjs +58 -0
  80. package/esm2022/forms/yuuvis-client-framework-forms.mjs +5 -0
  81. package/esm2022/icons/index.mjs +4 -0
  82. package/esm2022/icons/lib/icon.service.mjs +59 -0
  83. package/esm2022/icons/lib/icons.mjs +31 -0
  84. package/esm2022/icons/lib/object-type-icon/object-type-icon.component.mjs +29 -0
  85. package/esm2022/icons/yuuvis-client-framework-icons.mjs +5 -0
  86. package/esm2022/index.mjs +2 -0
  87. package/esm2022/lib/yuuvis-client-framework.module.mjs +15 -0
  88. package/esm2022/list/index.mjs +3 -0
  89. package/esm2022/list/lib/list-item.directive.mjs +72 -0
  90. package/esm2022/list/lib/list.component.mjs +133 -0
  91. package/esm2022/list/yuuvis-client-framework-list.mjs +5 -0
  92. package/esm2022/metadata-form/index.mjs +4 -0
  93. package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +31 -0
  94. package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +99 -0
  95. package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +126 -0
  96. package/esm2022/metadata-form/lib/object-metadata-element-template.directive.mjs +52 -0
  97. package/esm2022/metadata-form/yuuvis-client-framework-metadata-form.mjs +5 -0
  98. package/esm2022/object-details/index.mjs +7 -0
  99. package/esm2022/object-details/lib/object-audit/object-audit.component.mjs +195 -0
  100. package/esm2022/object-details/lib/object-details-shell/object-details-shell.component.mjs +127 -0
  101. package/esm2022/object-details/lib/object-details.component.mjs +61 -0
  102. package/esm2022/object-details/lib/object-metadata/form-section-group.pipe.mjs +17 -0
  103. package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +201 -0
  104. package/esm2022/object-details/lib/object-metadata/object-metadata.interface.mjs +2 -0
  105. package/esm2022/object-details/yuuvis-client-framework-object-details.mjs +5 -0
  106. package/esm2022/object-flavor/index.mjs +6 -0
  107. package/esm2022/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.mjs +25 -0
  108. package/esm2022/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.mjs +21 -0
  109. package/esm2022/object-flavor/lib/flavor-chip/flavor-chip.component.mjs +35 -0
  110. package/esm2022/object-flavor/lib/object-flavor/object-flavor.component.mjs +93 -0
  111. package/esm2022/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.mjs +43 -0
  112. package/esm2022/object-flavor/yuuvis-client-framework-object-flavor.mjs +5 -0
  113. package/esm2022/object-form/index.mjs +5 -0
  114. package/esm2022/object-form/lib/form-scripting.api.interface.mjs +2 -0
  115. package/esm2022/object-form/lib/form-scripting.service.mjs +160 -0
  116. package/esm2022/object-form/lib/object-form-element/object-form-element.component.mjs +87 -0
  117. package/esm2022/object-form/lib/object-form-extension.interface.mjs +36 -0
  118. package/esm2022/object-form/lib/object-form-group/object-form-group.component.mjs +85 -0
  119. package/esm2022/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.mjs +23 -0
  120. package/esm2022/object-form/lib/object-form-script/object-form-script.service.mjs +115 -0
  121. package/esm2022/object-form/lib/object-form-script/object-form-scripting-scope.mjs +251 -0
  122. package/esm2022/object-form/lib/object-form-translate.service.mjs +73 -0
  123. package/esm2022/object-form/lib/object-form.component.mjs +627 -0
  124. package/esm2022/object-form/lib/object-form.interface.mjs +9 -0
  125. package/esm2022/object-form/lib/object-form.model.mjs +20 -0
  126. package/esm2022/object-form/lib/object-form.service.mjs +127 -0
  127. package/esm2022/object-form/lib/object-form.utils.mjs +55 -0
  128. package/esm2022/object-form/lib/object-form.validation.mjs +48 -0
  129. package/esm2022/object-form/yuuvis-client-framework-object-form.mjs +5 -0
  130. package/esm2022/object-preview/index.mjs +3 -0
  131. package/esm2022/object-preview/lib/components/index.mjs +3 -0
  132. package/esm2022/object-preview/lib/components/object-email-preview/object-email-preview.component.mjs +45 -0
  133. package/esm2022/object-preview/lib/components/object-preview/object-preview.component.mjs +78 -0
  134. package/esm2022/object-preview/lib/services/object-preview.service.mjs +92 -0
  135. package/esm2022/object-preview/yuuvis-client-framework-object-preview.mjs +5 -0
  136. package/esm2022/object-summary/index.mjs +5 -0
  137. package/esm2022/object-summary/lib/multi-object-summary/multi-object-summary.component.mjs +33 -0
  138. package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +273 -0
  139. package/esm2022/object-summary/lib/object-summary-data/object-summary-data.component.mjs +80 -0
  140. package/esm2022/object-summary/lib/object-summary.module.mjs +15 -0
  141. package/esm2022/object-summary/yuuvis-client-framework-object-summary.mjs +5 -0
  142. package/esm2022/pagination/index.mjs +3 -0
  143. package/esm2022/pagination/lib/pagination.component.mjs +48 -0
  144. package/esm2022/pagination/lib/pagination.interface.mjs +2 -0
  145. package/esm2022/pagination/yuuvis-client-framework-pagination.mjs +5 -0
  146. package/esm2022/panel/index.mjs +2 -0
  147. package/esm2022/panel/lib/panel.component.mjs +20 -0
  148. package/esm2022/panel/yuuvis-client-framework-panel.mjs +5 -0
  149. package/esm2022/renderer/index.mjs +11 -0
  150. package/esm2022/renderer/lib/property-renderer/abstract.renderer.mjs +29 -0
  151. package/esm2022/renderer/lib/property-renderer/datetime.renderer.mjs +13 -0
  152. package/esm2022/renderer/lib/property-renderer/decimal.renderer.component.mjs +12 -0
  153. package/esm2022/renderer/lib/property-renderer/filesize.renderer.component.mjs +28 -0
  154. package/esm2022/renderer/lib/property-renderer/icon.renderer.component.mjs +23 -0
  155. package/esm2022/renderer/lib/property-renderer/integer.renderer.component.mjs +12 -0
  156. package/esm2022/renderer/lib/property-renderer/organization.renderer.mjs +19 -0
  157. package/esm2022/renderer/lib/property-renderer/string.renderer.component.mjs +12 -0
  158. package/esm2022/renderer/lib/property-renderer/unknown.renderer.mjs +12 -0
  159. package/esm2022/renderer/lib/renderer.directive.mjs +51 -0
  160. package/esm2022/renderer/lib/services/renderer/renderer.interface.mjs +2 -0
  161. package/esm2022/renderer/lib/services/renderer/renderer.service.mjs +84 -0
  162. package/esm2022/renderer/yuuvis-client-framework-renderer.mjs +5 -0
  163. package/esm2022/sequence-list/index.mjs +6 -0
  164. package/esm2022/sequence-list/lib/due-date-picker/due-date-picker.component.mjs +99 -0
  165. package/esm2022/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.mjs +183 -0
  166. package/esm2022/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.mjs +114 -0
  167. package/esm2022/sequence-list/lib/sequence-list.component.mjs +146 -0
  168. package/esm2022/sequence-list/lib/sequence-list.interface.mjs +2 -0
  169. package/esm2022/sequence-list/yuuvis-client-framework-sequence-list.mjs +5 -0
  170. package/esm2022/simple-search/index.mjs +3 -0
  171. package/esm2022/simple-search/lib/simple-search/simple-search.component.mjs +111 -0
  172. package/esm2022/simple-search/lib/simple-search/simple-search.interface.mjs +2 -0
  173. package/esm2022/simple-search/yuuvis-client-framework-simple-search.mjs +5 -0
  174. package/esm2022/tile-list/index.mjs +11 -0
  175. package/esm2022/tile-list/lib/tile/tile.component.mjs +53 -0
  176. package/esm2022/tile-list/lib/tile-config/action-select/action-select.component.mjs +22 -0
  177. package/esm2022/tile-list/lib/tile-config/icon-select/icon-select.component.mjs +33 -0
  178. package/esm2022/tile-list/lib/tile-config/property-select/property-select.component.mjs +91 -0
  179. package/esm2022/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.mjs +66 -0
  180. package/esm2022/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.mjs +46 -0
  181. package/esm2022/tile-list/lib/tile-config/tile-config.component.mjs +156 -0
  182. package/esm2022/tile-list/lib/tile-extension/directive/tile-extension.directive.mjs +37 -0
  183. package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +42 -0
  184. package/esm2022/tile-list/lib/tile-extension/tile-extension.service.mjs +35 -0
  185. package/esm2022/tile-list/lib/tile-list/tile-list.component.mjs +510 -0
  186. package/esm2022/tile-list/lib/tile-list/tile-list.interface.mjs +2 -0
  187. package/esm2022/tile-list/yuuvis-client-framework-tile-list.mjs +5 -0
  188. package/esm2022/token-search/index.mjs +3 -0
  189. package/esm2022/token-search/token-search.component.mjs +78 -0
  190. package/esm2022/token-search/token-search.interface.mjs +2 -0
  191. package/esm2022/token-search/yuuvis-client-framework-token-search.mjs +5 -0
  192. package/esm2022/tree/index.mjs +3 -0
  193. package/esm2022/tree/lib/tree-node/tree-node.component.mjs +65 -0
  194. package/esm2022/tree/lib/tree.component.mjs +148 -0
  195. package/esm2022/tree/lib/tree.interface.mjs +2 -0
  196. package/esm2022/tree/lib/tree.service.mjs +95 -0
  197. package/esm2022/tree/yuuvis-client-framework-tree.mjs +5 -0
  198. package/esm2022/upload-progress/index.mjs +2 -0
  199. package/esm2022/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.mjs +49 -0
  200. package/esm2022/upload-progress/lib/upload-progress/upload-progress.component.mjs +37 -0
  201. package/esm2022/upload-progress/yuuvis-client-framework-upload-progress.mjs +5 -0
  202. package/esm2022/user-avatar/index.mjs +3 -0
  203. package/esm2022/user-avatar/lib/user-avatar.component.mjs +69 -0
  204. package/esm2022/user-avatar/lib/user-avatar.module.mjs +24 -0
  205. package/esm2022/user-avatar/yuuvis-client-framework-user-avatar.mjs +5 -0
  206. package/esm2022/yuuvis-client-framework.mjs +5 -0
  207. package/fesm2022/yuuvis-client-framework-actions.mjs +333 -0
  208. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -0
  209. package/fesm2022/yuuvis-client-framework-app-bar.mjs +96 -0
  210. package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -0
  211. package/fesm2022/yuuvis-client-framework-clipboard.mjs +55 -0
  212. package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -0
  213. package/fesm2022/yuuvis-client-framework-common.mjs +1020 -0
  214. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -0
  215. package/fesm2022/yuuvis-client-framework-forms.mjs +1355 -0
  216. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -0
  217. package/fesm2022/yuuvis-client-framework-icons.mjs +123 -0
  218. package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -0
  219. package/fesm2022/yuuvis-client-framework-list.mjs +209 -0
  220. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -0
  221. package/fesm2022/yuuvis-client-framework-metadata-form.mjs +302 -0
  222. package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -0
  223. package/fesm2022/yuuvis-client-framework-object-details.mjs +583 -0
  224. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -0
  225. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +200 -0
  226. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -0
  227. package/fesm2022/yuuvis-client-framework-object-form.mjs +1664 -0
  228. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -0
  229. package/fesm2022/yuuvis-client-framework-object-preview.mjs +213 -0
  230. package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -0
  231. package/fesm2022/yuuvis-client-framework-object-summary.mjs +397 -0
  232. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -0
  233. package/fesm2022/yuuvis-client-framework-pagination.mjs +55 -0
  234. package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -0
  235. package/fesm2022/yuuvis-client-framework-panel.mjs +27 -0
  236. package/fesm2022/yuuvis-client-framework-panel.mjs.map +1 -0
  237. package/fesm2022/yuuvis-client-framework-renderer.mjs +262 -0
  238. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -0
  239. package/fesm2022/yuuvis-client-framework-sequence-list.mjs +519 -0
  240. package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -0
  241. package/fesm2022/yuuvis-client-framework-simple-search.mjs +118 -0
  242. package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -0
  243. package/fesm2022/yuuvis-client-framework-tile-list.mjs +1036 -0
  244. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -0
  245. package/fesm2022/yuuvis-client-framework-token-search.mjs +85 -0
  246. package/fesm2022/yuuvis-client-framework-token-search.mjs.map +1 -0
  247. package/fesm2022/yuuvis-client-framework-tree.mjs +307 -0
  248. package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -0
  249. package/fesm2022/yuuvis-client-framework-upload-progress.mjs +84 -0
  250. package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -0
  251. package/fesm2022/yuuvis-client-framework-user-avatar.mjs +96 -0
  252. package/fesm2022/yuuvis-client-framework-user-avatar.mjs.map +1 -0
  253. package/fesm2022/yuuvis-client-framework.mjs +22 -0
  254. package/fesm2022/yuuvis-client-framework.mjs.map +1 -0
  255. package/forms/README.md +3 -0
  256. package/forms/index.d.ts +9 -0
  257. package/forms/lib/elements/catalog/catalog.component.d.ts +68 -0
  258. package/forms/lib/elements/datetime/datetime.component.d.ts +32 -0
  259. package/forms/lib/elements/datetime-range/datetime-range.component.d.ts +51 -0
  260. package/forms/lib/elements/number/number.component.d.ts +77 -0
  261. package/forms/lib/elements/number-range/number-range.component.d.ts +66 -0
  262. package/forms/lib/elements/organization/organization.component.d.ts +93 -0
  263. package/forms/lib/elements/string/string.component.d.ts +104 -0
  264. package/forms/lib/form-input/form-input.component.d.ts +48 -0
  265. package/forms/lib/forms.module.d.ts +16 -0
  266. package/icons/README.md +5 -0
  267. package/icons/index.d.ts +3 -0
  268. package/icons/lib/icon.service.d.ts +38 -0
  269. package/icons/lib/icons.d.ts +1 -0
  270. package/icons/lib/object-type-icon/object-type-icon.component.d.ts +11 -0
  271. package/index.d.ts +1 -0
  272. package/lib/yuuvis-client-framework.module.d.ts +7 -0
  273. package/list/README.md +3 -0
  274. package/list/index.d.ts +2 -0
  275. package/list/lib/list-item.directive.d.ts +15 -0
  276. package/list/lib/list.component.d.ts +36 -0
  277. package/metadata-form/README.md +21 -0
  278. package/metadata-form/index.d.ts +3 -0
  279. package/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.d.ts +5 -0
  280. package/metadata-form/lib/metadata-form-element-registry.service.d.ts +47 -0
  281. package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +31 -0
  282. package/metadata-form/lib/object-metadata-element-template.directive.d.ts +27 -0
  283. package/object-details/README.md +28 -0
  284. package/object-details/index.d.ts +6 -0
  285. package/object-details/lib/object-audit/object-audit.component.d.ts +59 -0
  286. package/object-details/lib/object-details-shell/object-details-shell.component.d.ts +51 -0
  287. package/object-details/lib/object-details.component.d.ts +36 -0
  288. package/object-details/lib/object-metadata/form-section-group.pipe.d.ts +8 -0
  289. package/object-details/lib/object-metadata/object-metadata.component.d.ts +48 -0
  290. package/object-details/lib/object-metadata/object-metadata.interface.d.ts +26 -0
  291. package/object-flavor/README.md +3 -0
  292. package/object-flavor/index.d.ts +5 -0
  293. package/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.d.ts +12 -0
  294. package/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.d.ts +12 -0
  295. package/object-flavor/lib/flavor-chip/flavor-chip.component.d.ts +17 -0
  296. package/object-flavor/lib/object-flavor/object-flavor.component.d.ts +26 -0
  297. package/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.d.ts +10 -0
  298. package/object-form/README.md +3 -0
  299. package/object-form/index.d.ts +4 -0
  300. package/object-form/lib/form-scripting.api.interface.d.ts +131 -0
  301. package/object-form/lib/form-scripting.service.d.ts +30 -0
  302. package/object-form/lib/object-form-element/object-form-element.component.d.ts +22 -0
  303. package/object-form/lib/object-form-extension.interface.d.ts +22 -0
  304. package/object-form/lib/object-form-group/object-form-group.component.d.ts +22 -0
  305. package/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.d.ts +10 -0
  306. package/object-form/lib/object-form-script/object-form-script.service.d.ts +45 -0
  307. package/object-form/lib/object-form-script/object-form-scripting-scope.d.ts +50 -0
  308. package/object-form/lib/object-form-translate.service.d.ts +15 -0
  309. package/object-form/lib/object-form.component.d.ts +60 -0
  310. package/object-form/lib/object-form.interface.d.ts +113 -0
  311. package/object-form/lib/object-form.model.d.ts +18 -0
  312. package/object-form/lib/object-form.service.d.ts +39 -0
  313. package/object-form/lib/object-form.utils.d.ts +20 -0
  314. package/object-form/lib/object-form.validation.d.ts +21 -0
  315. package/object-preview/README.md +3 -0
  316. package/object-preview/index.d.ts +2 -0
  317. package/object-preview/lib/components/index.d.ts +2 -0
  318. package/object-preview/lib/components/object-email-preview/object-email-preview.component.d.ts +16 -0
  319. package/object-preview/lib/components/object-preview/object-preview.component.d.ts +13 -0
  320. package/object-preview/lib/services/object-preview.service.d.ts +37 -0
  321. package/object-summary/README.md +3 -0
  322. package/object-summary/index.d.ts +4 -0
  323. package/object-summary/lib/multi-object-summary/multi-object-summary.component.d.ts +7 -0
  324. package/object-summary/lib/object-summary/object-summary.component.d.ts +73 -0
  325. package/object-summary/lib/object-summary-data/object-summary-data.component.d.ts +11 -0
  326. package/object-summary/lib/object-summary.module.d.ts +7 -0
  327. package/package.json +173 -0
  328. package/pagination/README.md +3 -0
  329. package/pagination/index.d.ts +2 -0
  330. package/pagination/lib/pagination.component.d.ts +18 -0
  331. package/pagination/lib/pagination.interface.d.ts +5 -0
  332. package/panel/README.md +3 -0
  333. package/panel/index.d.ts +1 -0
  334. package/panel/lib/panel.component.d.ts +12 -0
  335. package/renderer/README.md +5 -0
  336. package/renderer/index.d.ts +10 -0
  337. package/renderer/lib/property-renderer/abstract.renderer.d.ts +14 -0
  338. package/renderer/lib/property-renderer/datetime.renderer.d.ts +6 -0
  339. package/renderer/lib/property-renderer/decimal.renderer.component.d.ts +6 -0
  340. package/renderer/lib/property-renderer/filesize.renderer.component.d.ts +7 -0
  341. package/renderer/lib/property-renderer/icon.renderer.component.d.ts +6 -0
  342. package/renderer/lib/property-renderer/integer.renderer.component.d.ts +6 -0
  343. package/renderer/lib/property-renderer/organization.renderer.d.ts +7 -0
  344. package/renderer/lib/property-renderer/string.renderer.component.d.ts +6 -0
  345. package/renderer/lib/property-renderer/unknown.renderer.d.ts +6 -0
  346. package/renderer/lib/renderer.directive.d.ts +17 -0
  347. package/renderer/lib/services/renderer/renderer.interface.d.ts +8 -0
  348. package/renderer/lib/services/renderer/renderer.service.d.ts +35 -0
  349. package/sequence-list/README.md +3 -0
  350. package/sequence-list/index.d.ts +5 -0
  351. package/sequence-list/lib/due-date-picker/due-date-picker.component.d.ts +28 -0
  352. package/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.d.ts +52 -0
  353. package/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.d.ts +36 -0
  354. package/sequence-list/lib/sequence-list.component.d.ts +43 -0
  355. package/sequence-list/lib/sequence-list.interface.d.ts +16 -0
  356. package/simple-search/README.md +3 -0
  357. package/simple-search/index.d.ts +2 -0
  358. package/simple-search/lib/simple-search/simple-search.component.d.ts +55 -0
  359. package/simple-search/lib/simple-search/simple-search.interface.d.ts +4 -0
  360. package/styles/client-framework.scss +27 -0
  361. package/tile-list/README.md +3 -0
  362. package/tile-list/index.d.ts +10 -0
  363. package/tile-list/lib/tile/tile.component.d.ts +22 -0
  364. package/tile-list/lib/tile-config/action-select/action-select.component.d.ts +13 -0
  365. package/tile-list/lib/tile-config/icon-select/icon-select.component.d.ts +11 -0
  366. package/tile-list/lib/tile-config/property-select/property-select.component.d.ts +25 -0
  367. package/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.d.ts +20 -0
  368. package/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.d.ts +17 -0
  369. package/tile-list/lib/tile-config/tile-config.component.d.ts +47 -0
  370. package/tile-list/lib/tile-extension/directive/tile-extension.directive.d.ts +11 -0
  371. package/tile-list/lib/tile-extension/extensions/email.extension.d.ts +10 -0
  372. package/tile-list/lib/tile-extension/tile-extension.service.d.ts +16 -0
  373. package/tile-list/lib/tile-list/tile-list.component.d.ts +116 -0
  374. package/tile-list/lib/tile-list/tile-list.interface.d.ts +18 -0
  375. package/token-search/README.md +3 -0
  376. package/token-search/index.d.ts +2 -0
  377. package/token-search/token-search.component.d.ts +22 -0
  378. package/token-search/token-search.interface.d.ts +4 -0
  379. package/tree/README.md +3 -0
  380. package/tree/index.d.ts +2 -0
  381. package/tree/lib/tree-node/tree-node.component.d.ts +21 -0
  382. package/tree/lib/tree.component.d.ts +53 -0
  383. package/tree/lib/tree.interface.d.ts +11 -0
  384. package/tree/lib/tree.service.d.ts +35 -0
  385. package/upload-progress/README.md +3 -0
  386. package/upload-progress/index.d.ts +1 -0
  387. package/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.d.ts +17 -0
  388. package/upload-progress/lib/upload-progress/upload-progress.component.d.ts +16 -0
  389. package/user-avatar/README.md +3 -0
  390. package/user-avatar/index.d.ts +2 -0
  391. package/user-avatar/lib/user-avatar.component.d.ts +44 -0
  392. package/user-avatar/lib/user-avatar.module.d.ts +8 -0
@@ -0,0 +1,324 @@
1
+ import { Component, ElementRef, HostListener, NgZone, contentChild, inject, input, output, viewChild } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { YvcOverlayService } from '@yuuvis/components/overlay';
4
+ import { YvcAutocompleteModule } from '@yuuvis/components/autocomplete';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@yuuvis/components/autocomplete";
8
+ // TODO: Move to @yuuvis/components
9
+ export class TokenInputComponent {
10
+ constructor() {
11
+ this.elRef = inject(ElementRef);
12
+ this.overlay = inject(YvcOverlayService);
13
+ this.ngZone = inject(NgZone);
14
+ this.optionsTemplate = viewChild.required('options');
15
+ /**
16
+ * Template to be used for rendering selected tokens
17
+ */
18
+ this.tokenTemplate = contentChild('tokenTemplate');
19
+ /**
20
+ * Template to be used for rendering autocomplete suggestion entries
21
+ */
22
+ this.optionTemplate = contentChild('optionTemplate');
23
+ this.TEXT_TOKEN_TYPE = 'txt';
24
+ this.tokens = input([]);
25
+ this.caseSensitive = input(false);
26
+ this.change = output();
27
+ this._cleanFormTokens = [this._newTextToken()];
28
+ this.formTokens = structuredClone(this._cleanFormTokens);
29
+ this.autocompleteValues = [];
30
+ this.autocompleteSelectedIndex = -1;
31
+ this.focusedTokenIndex = -1;
32
+ }
33
+ onArrowUpKey(event) {
34
+ event.preventDefault();
35
+ event.stopPropagation();
36
+ if (this.autocompleteSelectedIndex > 0)
37
+ this.autocompleteSelectedIndex--;
38
+ }
39
+ onArrowDownKey(event) {
40
+ event.preventDefault();
41
+ event.stopPropagation();
42
+ if (this.autocompleteValues && this.autocompleteSelectedIndex < this.autocompleteValues.length - 1)
43
+ this.autocompleteSelectedIndex++;
44
+ }
45
+ onEnterKey(event) {
46
+ if (this.autocompleteValues.length && this.autocompleteSelectedIndex >= 0) {
47
+ event.preventDefault();
48
+ event.stopPropagation();
49
+ this.onOptionSelect(this.autocompleteValues[this.autocompleteSelectedIndex]);
50
+ }
51
+ }
52
+ clear() {
53
+ this.formTokens = structuredClone(this._cleanFormTokens);
54
+ this._inputElement.innerText = '';
55
+ this._emitChange(true);
56
+ }
57
+ onInputFocus(e) {
58
+ this._inputElement = e.target;
59
+ this.focusedTokenIndex = this._inputElement ? this.formTokens.findIndex((t) => t.id === this._inputElement.getAttribute('data-id')) : -1;
60
+ // console.log('FIndex: ' + this.focusedTokenIndex);
61
+ }
62
+ onInput(e) {
63
+ this._processValue();
64
+ this._emitChange();
65
+ }
66
+ onArrowLeft(e) {
67
+ const cp = this._getCaretPos(e.target);
68
+ if (cp === 0) {
69
+ e.stopPropagation();
70
+ e.preventDefault();
71
+ this._focusInput(-1);
72
+ }
73
+ }
74
+ onArrowRight(e) {
75
+ const cp = this._getCaretPos(e.target);
76
+ if (cp === e.target.innerText.length) {
77
+ e.stopPropagation();
78
+ e.preventDefault();
79
+ this._focusInput(1);
80
+ }
81
+ }
82
+ onDelete(e, index) {
83
+ const cp = this._getCaretPos(e.target);
84
+ if (cp === e.target.innerText.length) {
85
+ e.stopPropagation();
86
+ e.preventDefault();
87
+ // remove next token
88
+ if (index < this.formTokens.length - 2) {
89
+ this.formTokens.splice(index + 1, 1);
90
+ // if prev token is also a text token => merge
91
+ const nextIdx = index + 1;
92
+ if (nextIdx < this.formTokens.length && this.formTokens[nextIdx].type === this.TEXT_TOKEN_TYPE) {
93
+ const content = this.formTokens[index].label;
94
+ const nextContent = this.formTokens[nextIdx].label;
95
+ const mergedToken = {
96
+ id: this.formTokens[index + 1].id,
97
+ label: `${content} ${nextContent}`,
98
+ type: this.TEXT_TOKEN_TYPE
99
+ };
100
+ this.formTokens.splice(index + 1, 2, mergedToken);
101
+ const el = this.elRef.nativeElement.querySelector(`[data-id="${this.formTokens[index + 1].id}"]`);
102
+ if (el) {
103
+ el.innerText = mergedToken.label;
104
+ this._setCaretPos(el, content.length);
105
+ }
106
+ }
107
+ this._emitChange();
108
+ }
109
+ }
110
+ }
111
+ onBackspace(e, index) {
112
+ const cp = this._getCaretPos(e.target);
113
+ if (cp === 0) {
114
+ e.stopPropagation();
115
+ e.preventDefault();
116
+ // remove prev token
117
+ if (index > 0) {
118
+ this.formTokens.splice(index - 1, 1);
119
+ // if prev token is also a text token => merge
120
+ const prevIdx = index - 2;
121
+ if (prevIdx >= 0 && this.formTokens[prevIdx].type === this.TEXT_TOKEN_TYPE) {
122
+ const content = this.formTokens[index - 1].label;
123
+ const prevContent = this.formTokens[prevIdx].label;
124
+ const mergedToken = {
125
+ id: this.formTokens[prevIdx].id,
126
+ label: `${prevContent} ${content}`,
127
+ type: this.TEXT_TOKEN_TYPE
128
+ };
129
+ this.formTokens.splice(prevIdx, 2, mergedToken);
130
+ const el = this.elRef.nativeElement.querySelector(`[data-id="${this.formTokens[prevIdx].id}"]`);
131
+ if (el) {
132
+ el.innerText = mergedToken.label;
133
+ this._setCaretPos(el, prevContent.length);
134
+ }
135
+ }
136
+ else {
137
+ this._focusFirst();
138
+ }
139
+ this._emitChange();
140
+ }
141
+ }
142
+ }
143
+ _focusFirst() {
144
+ const el = this.elRef.nativeElement.querySelector(`[contenteditable]`);
145
+ if (el)
146
+ setTimeout(() => {
147
+ el?.focus();
148
+ });
149
+ }
150
+ _focusInput(offset) {
151
+ const inputs = Array.from(this.elRef.nativeElement.querySelectorAll('[contenteditable]'));
152
+ let i = inputs.findIndex((i) => i === document.activeElement);
153
+ i = i + offset;
154
+ if (i > inputs.length - 1)
155
+ i = 0;
156
+ if (i < 0)
157
+ i = inputs.length - 1;
158
+ this.ngZone.run(() => inputs[i].focus());
159
+ this._setCaretPos(inputs[i], offset > 0 || inputs[i].innerText.length === 0 ? 0 : inputs[i].innerText.length);
160
+ }
161
+ _setCaretPos(element, pos) {
162
+ const targetNode = element.childNodes.length ? element.childNodes[0] : element;
163
+ const range = document.createRange();
164
+ range.selectNode(element);
165
+ range.setStart(targetNode, pos);
166
+ range.setEnd(targetNode, pos);
167
+ const selection = window.getSelection();
168
+ selection.removeAllRanges();
169
+ selection.addRange(range);
170
+ }
171
+ _getCaretPos(node) {
172
+ const selection = window.getSelection();
173
+ const range = selection.getRangeAt(0);
174
+ const clonedRange = range.cloneRange();
175
+ clonedRange.selectNodeContents(node);
176
+ clonedRange.setEnd(range.endContainer, range.endOffset);
177
+ return clonedRange.toString().length;
178
+ }
179
+ onOptionSelect(o) {
180
+ let tokensAdded = 0;
181
+ let tokensRemoved = 0;
182
+ const inputValue = this._getInputValue();
183
+ const wordTokens = this._tokenize(inputValue);
184
+ const lastWord = wordTokens[wordTokens.length - 1];
185
+ if (lastWord.length === inputValue.length) {
186
+ this.formTokens.pop();
187
+ tokensRemoved++;
188
+ }
189
+ this.formTokens.splice(this.focusedTokenIndex + 1, 0, structuredClone(o));
190
+ tokensAdded++;
191
+ const shadowTokens = [];
192
+ // check for inbetween tokens
193
+ let txtTokenCount = -1;
194
+ this.formTokens.forEach((t, i) => {
195
+ if (t.type === this.TEXT_TOKEN_TYPE) {
196
+ txtTokenCount++;
197
+ t.id = this._textTokenId(txtTokenCount);
198
+ }
199
+ shadowTokens.push(t);
200
+ const nextToken = this.formTokens[i + 1];
201
+ if (t.type !== this.TEXT_TOKEN_TYPE && nextToken && nextToken.type !== this.TEXT_TOKEN_TYPE) {
202
+ // add inbetween token
203
+ txtTokenCount++;
204
+ shadowTokens.push(this._newTextToken(txtTokenCount));
205
+ tokensAdded++;
206
+ }
207
+ });
208
+ if (this.formTokens[this.formTokens.length - 1].type !== this.TEXT_TOKEN_TYPE) {
209
+ // add empty text token at the end
210
+ txtTokenCount++;
211
+ shadowTokens.push(this._newTextToken(txtTokenCount));
212
+ tokensAdded++;
213
+ }
214
+ this.formTokens = shadowTokens;
215
+ this._inputElement.innerText = inputValue.substring(0, inputValue.length - lastWord.length).trim();
216
+ this._emitChange();
217
+ setTimeout(() => {
218
+ // console.log(`fi: ${this.focusedTokenIndex}, ta: ${tokensAdded}, tr: ${tokensRemoved}, ne: ${this.focusedTokenIndex + (tokensAdded - tokensRemoved)}`);
219
+ this._focusTokenInput(this.focusedTokenIndex + (tokensAdded - tokensRemoved));
220
+ });
221
+ this.closeOptions();
222
+ }
223
+ _focusTokenInput(index) {
224
+ const selector = index === undefined ? 'div:last-child' : `div:nth-child(${index + 1})`;
225
+ console.log(selector);
226
+ const lastInput = this.elRef.nativeElement.querySelector(selector);
227
+ lastInput.focus();
228
+ return lastInput;
229
+ }
230
+ // private _focusInput(): HTMLElement {
231
+ // const lastInput: HTMLElement = (
232
+ // this.elRef.nativeElement as HTMLElement
233
+ // ).querySelector('[contenteditable]:last-child') as HTMLElement;
234
+ // lastInput.focus();
235
+ // return lastInput;
236
+ // }
237
+ openOptions() {
238
+ if (this._overlayRef || !this.autocompleteValues.length)
239
+ return;
240
+ this._overlayRef = this.overlay.open(this.optionsTemplate(), null, {
241
+ lightDismiss: true,
242
+ maxHeight: '97vh'
243
+ }, this.elRef);
244
+ }
245
+ closeOptions() {
246
+ if (this._overlayRef) {
247
+ this._overlayRef.close();
248
+ this._overlayRef = undefined;
249
+ }
250
+ this.autocompleteSelectedIndex = -1;
251
+ this.autocompleteValues = [];
252
+ }
253
+ onTokenEnter(e) {
254
+ e.preventDefault();
255
+ }
256
+ _emitChange(focusFirst = false) {
257
+ // need to set timeout so DOM changes are applied before accessing elements
258
+ setTimeout(() => {
259
+ this.formTokens.forEach((t) => {
260
+ if (t.type === this.TEXT_TOKEN_TYPE) {
261
+ const el = this.elRef.nativeElement.querySelector(`[data-id="${t.id}"]`);
262
+ if (el)
263
+ t.label = el.innerText;
264
+ }
265
+ });
266
+ this.change.emit(this.formTokens
267
+ .filter((t) => t.type !== this.TEXT_TOKEN_TYPE || t.label.length > 0)
268
+ .map((t) => ({
269
+ id: t.id,
270
+ label: t.label,
271
+ type: t.type
272
+ })));
273
+ if (focusFirst)
274
+ this._focusFirst();
275
+ });
276
+ }
277
+ _newTextToken(idx) {
278
+ const index = idx !== undefined ? idx : this.formTokens?.length ? this.formTokens.filter((t) => t.type === this.TEXT_TOKEN_TYPE).length : 0;
279
+ return {
280
+ id: this._textTokenId(index),
281
+ label: '',
282
+ type: this.TEXT_TOKEN_TYPE
283
+ };
284
+ }
285
+ _textTokenId(i) {
286
+ return `txt_${i}`;
287
+ }
288
+ _tokenize(value) {
289
+ const wordTokens = value.split(/\W+/).filter((t) => t?.length);
290
+ return wordTokens;
291
+ }
292
+ _getInputValue() {
293
+ return this._inputElement.innerText.replaceAll('&nbsp;', '');
294
+ }
295
+ _processValue() {
296
+ const wordTokens = this._tokenize(this._getInputValue());
297
+ const lastWord = wordTokens[wordTokens.length - 1];
298
+ this.autocompleteValues =
299
+ !lastWord || lastWord.length < 2
300
+ ? []
301
+ : this.tokens().filter((t) => lastWord && new RegExp(lastWord, this.caseSensitive() ? '' : 'i').test(t.label));
302
+ this.autocompleteSelectedIndex = this.autocompleteValues.length ? 0 : -1;
303
+ if (this.autocompleteValues.length)
304
+ this.openOptions();
305
+ else
306
+ this.closeOptions();
307
+ }
308
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TokenInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
309
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TokenInputComponent, isStandalone: true, selector: "yuv-token-input", inputs: { tokens: { classPropertyName: "tokens", publicName: "tokens", isSignal: true, isRequired: false, transformFunction: null }, caseSensitive: { classPropertyName: "caseSensitive", publicName: "caseSensitive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { listeners: { "keydown.arrowUp": "onArrowUpKey($event)", "keydown.arrowDown": "onArrowDownKey($event)", "keydown.enter": "onEnterKey($event)" } }, queries: [{ propertyName: "tokenTemplate", first: true, predicate: ["tokenTemplate"], descendants: true, isSignal: true }, { propertyName: "optionTemplate", first: true, predicate: ["optionTemplate"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "optionsTemplate", first: true, predicate: ["options"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- fi {{focusedTokenIndex}} -->\n\n@for (ft of formTokens; let i = $index; track $index) {\n @if (ft.type === TEXT_TOKEN_TYPE) {\n <div\n contenteditable\n [attr.data-id]=\"ft.id\"\n (input)=\"onInput($event)\"\n (focus)=\"onInputFocus($event)\"\n (keydown.enter)=\"onTokenEnter($event)\"\n (keydown.arrowLeft)=\"onArrowLeft($event)\"\n (keydown.arrowRight)=\"onArrowRight($event)\"\n (keydown.delete)=\"onDelete($event, i)\"\n (keydown.backspace)=\"onBackspace($event, i)\"\n ></div>\n } @else {\n @if (tokenTemplate()) {\n <ng-container *ngTemplateOutlet=\"tokenTemplate()!; context: { $implicit: ft }\"></ng-container>\n } @else {\n <div class=\"chip\">{{ ft.label }}</div>\n }\n }\n}\n\n<ng-template #options>\n <yvc-autocomplete-options\n class=\"popover animateIn\"\n [values]=\"autocompleteValues\"\n [(focusedIndex)]=\"autocompleteSelectedIndex\"\n [autocompleteOptionTemplate]=\"optionTemplate() || null\"\n (optionSelect)=\"onOptionSelect($event)\"\n [field]=\"'label'\"\n ></yvc-autocomplete-options>\n</ng-template>\n", styles: [":host{--token-input-chip-border-color: var(--item-focus-border-color);--token-input-chip-background-color: var(--item-focus-background-color);--token-padding-y: .15em;display:flex;align-items:center;flex-flow:row wrap;padding:2px}:host [contenteditable],:host .chip{border:1px solid transparent;border-radius:2px}:host [contenteditable]{display:inline-block;padding:var(--token-padding-y) 2px;min-width:1px}:host [contenteditable]:focus-visible{outline:0}:host [contenteditable]:last-child{flex:1}:host .chip{padding:var(--token-padding-y) .25em;border-color:var(--token-input-chip-border-color);background-color:var(--token-input-chip-background-color)}:host .chip>span{font-size:var(--font-hint);color:var(--text-color-hint)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: YvcAutocompleteModule }, { kind: "component", type: i2.AutocompleteOptionsComponent, selector: "yvc-autocomplete-options", inputs: ["autocompleteOptionTemplate", "values", "field", "focusedIndex"], outputs: ["focusedIndexChange", "optionSelect"] }] }); }
310
+ }
311
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TokenInputComponent, decorators: [{
312
+ type: Component,
313
+ args: [{ selector: 'yuv-token-input', standalone: true, imports: [CommonModule, YvcAutocompleteModule], template: "<!-- fi {{focusedTokenIndex}} -->\n\n@for (ft of formTokens; let i = $index; track $index) {\n @if (ft.type === TEXT_TOKEN_TYPE) {\n <div\n contenteditable\n [attr.data-id]=\"ft.id\"\n (input)=\"onInput($event)\"\n (focus)=\"onInputFocus($event)\"\n (keydown.enter)=\"onTokenEnter($event)\"\n (keydown.arrowLeft)=\"onArrowLeft($event)\"\n (keydown.arrowRight)=\"onArrowRight($event)\"\n (keydown.delete)=\"onDelete($event, i)\"\n (keydown.backspace)=\"onBackspace($event, i)\"\n ></div>\n } @else {\n @if (tokenTemplate()) {\n <ng-container *ngTemplateOutlet=\"tokenTemplate()!; context: { $implicit: ft }\"></ng-container>\n } @else {\n <div class=\"chip\">{{ ft.label }}</div>\n }\n }\n}\n\n<ng-template #options>\n <yvc-autocomplete-options\n class=\"popover animateIn\"\n [values]=\"autocompleteValues\"\n [(focusedIndex)]=\"autocompleteSelectedIndex\"\n [autocompleteOptionTemplate]=\"optionTemplate() || null\"\n (optionSelect)=\"onOptionSelect($event)\"\n [field]=\"'label'\"\n ></yvc-autocomplete-options>\n</ng-template>\n", styles: [":host{--token-input-chip-border-color: var(--item-focus-border-color);--token-input-chip-background-color: var(--item-focus-background-color);--token-padding-y: .15em;display:flex;align-items:center;flex-flow:row wrap;padding:2px}:host [contenteditable],:host .chip{border:1px solid transparent;border-radius:2px}:host [contenteditable]{display:inline-block;padding:var(--token-padding-y) 2px;min-width:1px}:host [contenteditable]:focus-visible{outline:0}:host [contenteditable]:last-child{flex:1}:host .chip{padding:var(--token-padding-y) .25em;border-color:var(--token-input-chip-border-color);background-color:var(--token-input-chip-background-color)}:host .chip>span{font-size:var(--font-hint);color:var(--text-color-hint)}\n"] }]
314
+ }], propDecorators: { onArrowUpKey: [{
315
+ type: HostListener,
316
+ args: ['keydown.arrowUp', ['$event']]
317
+ }], onArrowDownKey: [{
318
+ type: HostListener,
319
+ args: ['keydown.arrowDown', ['$event']]
320
+ }], onEnterKey: [{
321
+ type: HostListener,
322
+ args: ['keydown.enter', ['$event']]
323
+ }] } });
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4taW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9jb21tb24vc3JjL2xpYi9jb21wb25lbnRzL3Rva2VuLWlucHV0L3Rva2VuLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy90b2tlbi1pbnB1dC90b2tlbi1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFlLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7OztBQUV4RSxtQ0FBbUM7QUFRbkMsTUFBTSxPQUFPLG1CQUFtQjtJQVBoQztRQVFVLFVBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0IsWUFBTyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEMsb0JBQWUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFtQixTQUFTLENBQUMsQ0FBQztRQUNsRTs7V0FFRztRQUNILGtCQUFhLEdBQUcsWUFBWSxDQUFtQixlQUFlLENBQUMsQ0FBQztRQUNoRTs7V0FFRztRQUNILG1CQUFjLEdBQUcs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LFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxFQUFFO2dCQUNKLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0gsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7WUFDbEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNCLENBQUM7K0dBL1VVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHM0QkNkaEMsc21DQWtDQSxreEJEeEJZLFlBQVkscU1BQUUscUJBQXFCOzs0RkFJbEMsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQzs4QkFrQ0QsWUFBWTtzQkFBeEQsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFLSSxjQUFjO3NCQUE1RCxZQUFZO3VCQUFDLG1CQUFtQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUtGLFVBQVU7c0JBQXBELFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE5nWm9uZSwgVGVtcGxhdGVSZWYsIGNvbnRlbnRDaGlsZCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbm5lcklucHV0VG9rZW4sIElucHV0VG9rZW4gfSBmcm9tICcuL3Rva2VuLWlucHV0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBZdmNPdmVybGF5UmVmLCBZdmNPdmVybGF5U2VydmljZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9vdmVybGF5JztcbmltcG9ydCB7IFl2Y0F1dG9jb21wbGV0ZU1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9hdXRvY29tcGxldGUnO1xuXG4vLyBUT0RPOiBNb3ZlIHRvIEB5dXV2aXMvY29tcG9uZW50c1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LXRva2VuLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgWXZjQXV0b2NvbXBsZXRlTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rva2VuLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Rva2VuLWlucHV0LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBUb2tlbklucHV0Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBlbFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBvdmVybGF5ID0gaW5qZWN0KFl2Y092ZXJsYXlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICBvcHRpb25zVGVtcGxhdGUgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8YW55Pj4oJ29wdGlvbnMnKTtcbiAgLyoqXG4gICAqIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIHJlbmRlcmluZyBzZWxlY3RlZCB0b2tlbnNcbiAgICovXG4gIHRva2VuVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQ8VGVtcGxhdGVSZWY8YW55Pj4oJ3Rva2VuVGVtcGxhdGUnKTtcbiAgLyoqXG4gICAqIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIHJlbmRlcmluZyBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbiBlbnRyaWVzXG4gICAqL1xuICBvcHRpb25UZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZDxUZW1wbGF0ZVJlZjxhbnk+Pignb3B0aW9uVGVtcGxhdGUnKTtcblxuICBURVhUX1RPS0VOX1RZUEUgPSAndHh0JztcbiAgcHJpdmF0ZSBfaW5wdXRFbGVtZW50PzogSFRNTElucHV0RWxlbWVudDtcbiAgcHJpdmF0ZSBfb3ZlcmxheVJlZj86IFl2Y092ZXJsYXlSZWY7XG5cbiAgdG9rZW5zID0gaW5wdXQ8SW5wdXRUb2tlbltdPihbXSk7XG4gIGNhc2VTZW5zaXRpdmUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgY2hhbmdlID0gb3V0cHV0PElucHV0VG9rZW5bXT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jbGVhbkZvcm1Ub2tlbnM6IElucHV0VG9rZW5bXSA9IFt0aGlzLl9uZXdUZXh0VG9rZW4oKV07XG4gIGZvcm1Ub2tlbnM6IElucHV0VG9rZW5bXSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9jbGVhbkZvcm1Ub2tlbnMpO1xuICBhdXRvY29tcGxldGVWYWx1ZXM6IElucHV0VG9rZW5bXSA9IFtdO1xuICBhdXRvY29tcGxldGVTZWxlY3RlZEluZGV4ID0gLTE7XG4gIGZvY3VzZWRUb2tlbkluZGV4ID0gLTE7XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd1VwJywgWyckZXZlbnQnXSkgb25BcnJvd1VwS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGVTZWxlY3RlZEluZGV4ID4gMCkgdGhpcy5hdXRvY29tcGxldGVTZWxlY3RlZEluZGV4LS07XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd0Rvd24nLCBbJyRldmVudCddKSBvbkFycm93RG93bktleShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlVmFsdWVzICYmIHRoaXMuYXV0b2NvbXBsZXRlU2VsZWN0ZWRJbmRleCA8IHRoaXMuYXV0b2NvbXBsZXRlVmFsdWVzLmxlbmd0aCAtIDEpIHRoaXMuYXV0b2NvbXBsZXRlU2VsZWN0ZWRJbmRleCsrO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKSBvbkVudGVyS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlVmFsdWVzLmxlbmd0aCAmJiB0aGlzLmF1dG9jb21wbGV0ZVNlbGVjdGVkSW5kZXggPj0gMCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5vbk9wdGlvblNlbGVjdCh0aGlzLmF1dG9jb21wbGV0ZVZhbHVlc1t0aGlzLmF1dG9jb21wbGV0ZVNlbGVjdGVkSW5kZXhdKTtcbiAgICB9XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLmZvcm1Ub2tlbnMgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fY2xlYW5Gb3JtVG9rZW5zKTtcbiAgICB0aGlzLl9pbnB1dEVsZW1lbnQhLmlubmVyVGV4dCA9ICcnO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UodHJ1ZSk7XG4gIH1cblxuICBvbklucHV0Rm9jdXMoZTogYW55KSB7XG4gICAgdGhpcy5faW5wdXRFbGVtZW50ID0gZS50YXJnZXQ7XG4gICAgdGhpcy5mb2N1c2VkVG9rZW5JbmRleCA9IHRoaXMuX2lucHV0RWxlbWVudCA/IHRoaXMuZm9ybVRva2Vucy5maW5kSW5kZXgoKHQpID0+IHQuaWQgPT09IHRoaXMuX2lucHV0RWxlbWVudCEuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJykpIDogLTE7XG4gICAgLy8gY29uc29sZS5sb2coJ0ZJbmRleDogJyArIHRoaXMuZm9jdXNlZFRva2VuSW5kZXgpO1xuICB9XG5cbiAgb25JbnB1dChlOiBhbnkpIHtcbiAgICB0aGlzLl9wcm9jZXNzVmFsdWUoKTtcbiAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBvbkFycm93TGVmdChlOiBFdmVudCkge1xuICAgIGNvbnN0IGNwID0gdGhpcy5fZ2V0Q2FyZXRQb3MoZS50YXJnZXQgYXMgTm9kZSk7XG4gICAgaWYgKGNwID09PSAwKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5fZm9jdXNJbnB1dCgtMSk7XG4gICAgfVxuICB9XG4gIG9uQXJyb3dSaWdodChlOiBFdmVudCkge1xuICAgIGNvbnN0IGNwID0gdGhpcy5fZ2V0Q2FyZXRQb3MoZS50YXJnZXQgYXMgTm9kZSk7XG4gICAgaWYgKGNwID09PSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dC5sZW5ndGgpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLl9mb2N1c0lucHV0KDEpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGVsZXRlKGU6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY3AgPSB0aGlzLl9nZXRDYXJldFBvcyhlLnRhcmdldCBhcyBOb2RlKTtcbiAgICBpZiAoY3AgPT09IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0Lmxlbmd0aCkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgLy8gcmVtb3ZlIG5leHQgdG9rZW5cbiAgICAgIGlmIChpbmRleCA8IHRoaXMuZm9ybVRva2Vucy5sZW5ndGggLSAyKSB7XG4gICAgICAgIHRoaXMuZm9ybVRva2Vucy5zcGxpY2UoaW5kZXggKyAxLCAxKTtcblxuICAgICAgICAvLyBpZiBwcmV2IHRva2VuIGlzIGFsc28gYSB0ZXh0IHRva2VuID0+IG1lcmdlXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBpbmRleCArIDE7XG4gICAgICAgIGlmIChuZXh0SWR4IDwgdGhpcy5mb3JtVG9rZW5zLmxlbmd0aCAmJiB0aGlzLmZvcm1Ub2tlbnNbbmV4dElkeF0udHlwZSA9PT0gdGhpcy5URVhUX1RPS0VOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5mb3JtVG9rZW5zW2luZGV4XS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMuZm9ybVRva2Vuc1tuZXh0SWR4XS5sYWJlbDtcbiAgICAgICAgICBjb25zdCBtZXJnZWRUb2tlbjogSW5wdXRUb2tlbiA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmZvcm1Ub2tlbnNbaW5kZXggKyAxXS5pZCxcbiAgICAgICAgICAgIGxhYmVsOiBgJHtjb250ZW50fSAke25leHRDb250ZW50fWAsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLlRFWFRfVE9LRU5fVFlQRVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5mb3JtVG9rZW5zLnNwbGljZShpbmRleCArIDEsIDIsIG1lcmdlZFRva2VuKTtcblxuICAgICAgICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSAodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7dGhpcy5mb3JtVG9rZW5zW2luZGV4ICsgMV0uaWR9XCJdYCk7XG4gICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICBlbC5pbm5lclRleHQgPSBtZXJnZWRUb2tlbi5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldENhcmV0UG9zKGVsLCBjb250ZW50Lmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkJhY2tzcGFjZShlOiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGNwID0gdGhpcy5fZ2V0Q2FyZXRQb3MoZS50YXJnZXQgYXMgTm9kZSk7XG4gICAgaWYgKGNwID09PSAwKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyByZW1vdmUgcHJldiB0b2tlblxuICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICB0aGlzLmZvcm1Ub2tlbnMuc3BsaWNlKGluZGV4IC0gMSwgMSk7XG4gICAgICAgIC8vIGlmIHByZXYgdG9rZW4gaXMgYWxzbyBhIHRleHQgdG9rZW4gPT4gbWVyZ2VcbiAgICAgICAgY29uc3QgcHJldklkeCA9IGluZGV4IC0gMjtcbiAgICAgICAgaWYgKHByZXZJZHggPj0gMCAmJiB0aGlzLmZvcm1Ub2tlbnNbcHJldklkeF0udHlwZSA9PT0gdGhpcy5URVhUX1RPS0VOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5mb3JtVG9rZW5zW2luZGV4IC0gMV0ubGFiZWw7XG4gICAgICAgICAgY29uc3QgcHJldkNvbnRlbnQgPSB0aGlzLmZvcm1Ub2tlbnNbcHJldklkeF0ubGFiZWw7XG4gICAgICAgICAgY29uc3QgbWVyZ2VkVG9rZW46IElucHV0VG9rZW4gPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5mb3JtVG9rZW5zW3ByZXZJZHhdLmlkLFxuICAgICAgICAgICAgbGFiZWw6IGAke3ByZXZDb250ZW50fSAke2NvbnRlbnR9YCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuVEVYVF9UT0tFTl9UWVBFXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmZvcm1Ub2tlbnMuc3BsaWNlKHByZXZJZHgsIDIsIG1lcmdlZFRva2VuKTtcbiAgICAgICAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgfCBudWxsID0gKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihgW2RhdGEtaWQ9XCIke3RoaXMuZm9ybVRva2Vuc1twcmV2SWR4XS5pZH1cIl1gKTtcbiAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgIGVsLmlubmVyVGV4dCA9IG1lcmdlZFRva2VuLmxhYmVsO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FyZXRQb3MoZWwsIHByZXZDb250ZW50Lmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2ZvY3VzRmlyc3QoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9jdXNGaXJzdCgpIHtcbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgfCBudWxsID0gKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihgW2NvbnRlbnRlZGl0YWJsZV1gKTtcbiAgICBpZiAoZWwpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWw/LmZvY3VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZvY3VzSW5wdXQob2Zmc2V0OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dHM6IEhUTUxJbnB1dEVsZW1lbnRbXSA9IEFycmF5LmZyb20odGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGVdJykpO1xuICAgIGxldCBpID0gaW5wdXRzLmZpbmRJbmRleCgoaSkgPT4gaSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgaSA9IGkgKyBvZmZzZXQ7XG4gICAgaWYgKGkgPiBpbnB1dHMubGVuZ3RoIC0gMSkgaSA9IDA7XG4gICAgaWYgKGkgPCAwKSBpID0gaW5wdXRzLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IGlucHV0c1tpXS5mb2N1cygpKTtcblxuICAgIHRoaXMuX3NldENhcmV0UG9zKGlucHV0c1tpXSwgb2Zmc2V0ID4gMCB8fCBpbnB1dHNbaV0uaW5uZXJUZXh0Lmxlbmd0aCA9PT0gMCA/IDAgOiBpbnB1dHNbaV0uaW5uZXJUZXh0Lmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDYXJldFBvcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zOiBudW1iZXIpIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA/IGVsZW1lbnQuY2hpbGROb2Rlc1swXSA6IGVsZW1lbnQ7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGUoZWxlbWVudCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQodGFyZ2V0Tm9kZSwgcG9zKTtcbiAgICByYW5nZS5zZXRFbmQodGFyZ2V0Tm9kZSwgcG9zKTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsZWN0aW9uIS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24hLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENhcmV0UG9zKG5vZGU6IE5vZGUpOiBudW1iZXIge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbiEuZ2V0UmFuZ2VBdCgwKTtcbiAgICBjb25zdCBjbG9uZWRSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgICBjbG9uZWRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gICAgY2xvbmVkUmFuZ2Uuc2V0RW5kKHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcbiAgICByZXR1cm4gY2xvbmVkUmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7XG4gIH1cblxuICBvbk9wdGlvblNlbGVjdChvOiBJbnB1dFRva2VuKSB7XG4gICAgbGV0IHRva2Vuc0FkZGVkID0gMDtcbiAgICBsZXQgdG9rZW5zUmVtb3ZlZCA9IDA7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IHRoaXMuX2dldElucHV0VmFsdWUoKTtcbiAgICBjb25zdCB3b3JkVG9rZW5zOiBzdHJpbmdbXSA9IHRoaXMuX3Rva2VuaXplKGlucHV0VmFsdWUpO1xuICAgIGNvbnN0IGxhc3RXb3JkID0gd29yZFRva2Vuc1t3b3JkVG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0V29yZC5sZW5ndGggPT09IGlucHV0VmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZvcm1Ub2tlbnMucG9wKCk7XG4gICAgICB0b2tlbnNSZW1vdmVkKys7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtVG9rZW5zLnNwbGljZSh0aGlzLmZvY3VzZWRUb2tlbkluZGV4ICsgMSwgMCwgc3RydWN0dXJlZENsb25lKG8pKTtcbiAgICB0b2tlbnNBZGRlZCsrO1xuXG4gICAgY29uc3Qgc2hhZG93VG9rZW5zOiBJbnB1dFRva2VuW10gPSBbXTtcbiAgICAvLyBjaGVjayBmb3IgaW5iZXR3ZWVuIHRva2Vuc1xuICAgIGxldCB0eHRUb2tlbkNvdW50ID0gLTE7XG4gICAgdGhpcy5mb3JtVG9rZW5zLmZvckVhY2goKHQ6IElucHV0VG9rZW4sIGk6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHQudHlwZSA9PT0gdGhpcy5URVhUX1RPS0VOX1RZUEUpIHtcbiAgICAgICAgdHh0VG9rZW5Db3VudCsrO1xuICAgICAgICB0LmlkID0gdGhpcy5fdGV4dFRva2VuSWQodHh0VG9rZW5Db3VudCk7XG4gICAgICB9XG4gICAgICBzaGFkb3dUb2tlbnMucHVzaCh0KTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRoaXMuZm9ybVRva2Vuc1tpICsgMV07XG4gICAgICBpZiAodC50eXBlICE9PSB0aGlzLlRFWFRfVE9LRU5fVFlQRSAmJiBuZXh0VG9rZW4gJiYgbmV4dFRva2VuLnR5cGUgIT09IHRoaXMuVEVYVF9UT0tFTl9UWVBFKSB7XG4gICAgICAgIC8vIGFkZCBpbmJldHdlZW4gdG9rZW5cbiAgICAgICAgdHh0VG9rZW5Db3VudCsrO1xuICAgICAgICBzaGFkb3dUb2tlbnMucHVzaCh0aGlzLl9uZXdUZXh0VG9rZW4odHh0VG9rZW5Db3VudCkpO1xuICAgICAgICB0b2tlbnNBZGRlZCsrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZm9ybVRva2Vuc1t0aGlzLmZvcm1Ub2tlbnMubGVuZ3RoIC0gMV0udHlwZSAhPT0gdGhpcy5URVhUX1RPS0VOX1RZUEUpIHtcbiAgICAgIC8vIGFkZCBlbXB0eSB0ZXh0IHRva2VuIGF0IHRoZSBlbmRcbiAgICAgIHR4dFRva2VuQ291bnQrKztcbiAgICAgIHNoYWRvd1Rva2Vucy5wdXNoKHRoaXMuX25ld1RleHRUb2tlbih0eHRUb2tlbkNvdW50KSk7XG4gICAgICB0b2tlbnNBZGRlZCsrO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Ub2tlbnMgPSBzaGFkb3dUb2tlbnM7XG4gICAgdGhpcy5faW5wdXRFbGVtZW50IS5pbm5lclRleHQgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmxlbmd0aCAtIGxhc3RXb3JkLmxlbmd0aCkudHJpbSgpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBmaTogJHt0aGlzLmZvY3VzZWRUb2tlbkluZGV4fSwgdGE6ICR7dG9rZW5zQWRkZWR9LCB0cjogJHt0b2tlbnNSZW1vdmVkfSwgbmU6ICR7dGhpcy5mb2N1c2VkVG9rZW5JbmRleCArICh0b2tlbnNBZGRlZCAtIHRva2Vuc1JlbW92ZWQpfWApO1xuXG4gICAgICB0aGlzLl9mb2N1c1Rva2VuSW5wdXQodGhpcy5mb2N1c2VkVG9rZW5JbmRleCArICh0b2tlbnNBZGRlZCAtIHRva2Vuc1JlbW92ZWQpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2xvc2VPcHRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIF9mb2N1c1Rva2VuSW5wdXQoaW5kZXg/OiBudW1iZXIpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gJ2RpdjpsYXN0LWNoaWxkJyA6IGBkaXY6bnRoLWNoaWxkKCR7aW5kZXggKyAxfSlgO1xuICAgIGNvbnNvbGUubG9nKHNlbGVjdG9yKTtcblxuICAgIGNvbnN0IGxhc3RJbnB1dDogSFRNTEVsZW1lbnQgPSAodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudDtcbiAgICBsYXN0SW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm4gbGFzdElucHV0O1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBfZm9jdXNJbnB1dCgpOiBIVE1MRWxlbWVudCB7XG4gIC8vICAgY29uc3QgbGFzdElucHV0OiBIVE1MRWxlbWVudCA9IChcbiAgLy8gICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuICAvLyAgICkucXVlcnlTZWxlY3RvcignW2NvbnRlbnRlZGl0YWJsZV06bGFzdC1jaGlsZCcpIGFzIEhUTUxFbGVtZW50O1xuICAvLyAgIGxhc3RJbnB1dC5mb2N1cygpO1xuICAvLyAgIHJldHVybiBsYXN0SW5wdXQ7XG4gIC8vIH1cblxuICBvcGVuT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZiB8fCAhdGhpcy5hdXRvY29tcGxldGVWYWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5vcGVuKFxuICAgICAgdGhpcy5vcHRpb25zVGVtcGxhdGUoKSxcbiAgICAgIG51bGwsXG4gICAgICB7XG4gICAgICAgIGxpZ2h0RGlzbWlzczogdHJ1ZSxcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTd2aCdcbiAgICAgIH0sXG4gICAgICB0aGlzLmVsUmVmXG4gICAgKTtcbiAgfVxuXG4gIGNsb3NlT3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5jbG9zZSgpO1xuICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5hdXRvY29tcGxldGVTZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgdGhpcy5hdXRvY29tcGxldGVWYWx1ZXMgPSBbXTtcbiAgfVxuXG4gIG9uVG9rZW5FbnRlcihlOiBFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRDaGFuZ2UoZm9jdXNGaXJzdCA9IGZhbHNlKSB7XG4gICAgLy8gbmVlZCB0byBzZXQgdGltZW91dCBzbyBET00gY2hhbmdlcyBhcmUgYXBwbGllZCBiZWZvcmUgYWNjZXNzaW5nIGVsZW1lbnRzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZvcm1Ub2tlbnMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICBpZiAodC50eXBlID09PSB0aGlzLlRFWFRfVE9LRU5fVFlQRSkge1xuICAgICAgICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSAodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7dC5pZH1cIl1gKTtcbiAgICAgICAgICBpZiAoZWwpIHQubGFiZWwgPSBlbC5pbm5lclRleHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5jaGFuZ2UuZW1pdChcbiAgICAgICAgdGhpcy5mb3JtVG9rZW5zXG4gICAgICAgICAgLmZpbHRlcigodDogSW5uZXJJbnB1dFRva2VuKSA9PiB0LnR5cGUgIT09IHRoaXMuVEVYVF9UT0tFTl9UWVBFIHx8IHQubGFiZWwubGVuZ3RoID4gMClcbiAgICAgICAgICAubWFwKCh0OiBJbm5lcklucHV0VG9rZW4pID0+ICh7XG4gICAgICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgICAgIGxhYmVsOiB0LmxhYmVsLFxuICAgICAgICAgICAgdHlwZTogdC50eXBlXG4gICAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgaWYgKGZvY3VzRmlyc3QpIHRoaXMuX2ZvY3VzRmlyc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX25ld1RleHRUb2tlbihpZHg/OiBudW1iZXIpOiBJbm5lcklucHV0VG9rZW4ge1xuICAgIGNvbnN0IGluZGV4ID0gaWR4ICE9PSB1bmRlZmluZWQgPyBpZHggOiB0aGlzLmZvcm1Ub2tlbnM/Lmxlbmd0aCA/IHRoaXMuZm9ybVRva2Vucy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gdGhpcy5URVhUX1RPS0VOX1RZUEUpLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLl90ZXh0VG9rZW5JZChpbmRleCksXG4gICAgICBsYWJlbDogJycsXG4gICAgICB0eXBlOiB0aGlzLlRFWFRfVE9LRU5fVFlQRVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF90ZXh0VG9rZW5JZChpOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHh0XyR7aX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfdG9rZW5pemUodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB3b3JkVG9rZW5zOiBzdHJpbmdbXSA9IHZhbHVlLnNwbGl0KC9cXFcrLykuZmlsdGVyKCh0OiBzdHJpbmcpID0+IHQ/Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHdvcmRUb2tlbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRJbnB1dFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudCEuaW5uZXJUZXh0LnJlcGxhY2VBbGwoJyZuYnNwOycsICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NWYWx1ZSgpIHtcbiAgICBjb25zdCB3b3JkVG9rZW5zOiBzdHJpbmdbXSA9IHRoaXMuX3Rva2VuaXplKHRoaXMuX2dldElucHV0VmFsdWUoKSk7XG4gICAgY29uc3QgbGFzdFdvcmQgPSB3b3JkVG9rZW5zW3dvcmRUb2tlbnMubGVuZ3RoIC0gMV07XG5cbiAgICB0aGlzLmF1dG9jb21wbGV0ZVZhbHVlcyA9XG4gICAgICAhbGFzdFdvcmQgfHwgbGFzdFdvcmQubGVuZ3RoIDwgMlxuICAgICAgICA/IFtdXG4gICAgICAgIDogdGhpcy50b2tlbnMoKS5maWx0ZXIoKHQ6IElucHV0VG9rZW4pID0+IGxhc3RXb3JkICYmIG5ldyBSZWdFeHAobGFzdFdvcmQsIHRoaXMuY2FzZVNlbnNpdGl2ZSgpID8gJycgOiAnaScpLnRlc3QodC5sYWJlbCkpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlU2VsZWN0ZWRJbmRleCA9IHRoaXMuYXV0b2NvbXBsZXRlVmFsdWVzLmxlbmd0aCA/IDAgOiAtMTtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGVWYWx1ZXMubGVuZ3RoKSB0aGlzLm9wZW5PcHRpb25zKCk7XG4gICAgZWxzZSB0aGlzLmNsb3NlT3B0aW9ucygpO1xuICB9XG59XG4iLCI8IS0tIGZpIHt7Zm9jdXNlZFRva2VuSW5kZXh9fSAtLT5cblxuQGZvciAoZnQgb2YgZm9ybVRva2VuczsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrICRpbmRleCkge1xuICBAaWYgKGZ0LnR5cGUgPT09IFRFWFRfVE9LRU5fVFlQRSkge1xuICAgIDxkaXZcbiAgICAgIGNvbnRlbnRlZGl0YWJsZVxuICAgICAgW2F0dHIuZGF0YS1pZF09XCJmdC5pZFwiXG4gICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblRva2VuRW50ZXIoJGV2ZW50KVwiXG4gICAgICAoa2V5ZG93bi5hcnJvd0xlZnQpPVwib25BcnJvd0xlZnQoJGV2ZW50KVwiXG4gICAgICAoa2V5ZG93bi5hcnJvd1JpZ2h0KT1cIm9uQXJyb3dSaWdodCgkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmRlbGV0ZSk9XCJvbkRlbGV0ZSgkZXZlbnQsIGkpXCJcbiAgICAgIChrZXlkb3duLmJhY2tzcGFjZSk9XCJvbkJhY2tzcGFjZSgkZXZlbnQsIGkpXCJcbiAgICA+PC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIEBpZiAodG9rZW5UZW1wbGF0ZSgpKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9rZW5UZW1wbGF0ZSgpITsgY29udGV4dDogeyAkaW1wbGljaXQ6IGZ0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjaGlwXCI+e3sgZnQubGFiZWwgfX08L2Rpdj5cbiAgICB9XG4gIH1cbn1cblxuPG5nLXRlbXBsYXRlICNvcHRpb25zPlxuICA8eXZjLWF1dG9jb21wbGV0ZS1vcHRpb25zXG4gICAgY2xhc3M9XCJwb3BvdmVyIGFuaW1hdGVJblwiXG4gICAgW3ZhbHVlc109XCJhdXRvY29tcGxldGVWYWx1ZXNcIlxuICAgIFsoZm9jdXNlZEluZGV4KV09XCJhdXRvY29tcGxldGVTZWxlY3RlZEluZGV4XCJcbiAgICBbYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGVdPVwib3B0aW9uVGVtcGxhdGUoKSB8fCBudWxsXCJcbiAgICAob3B0aW9uU2VsZWN0KT1cIm9uT3B0aW9uU2VsZWN0KCRldmVudClcIlxuICAgIFtmaWVsZF09XCInbGFiZWwnXCJcbiAgPjwveXZjLWF1dG9jb21wbGV0ZS1vcHRpb25zPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4taW5wdXQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9jb21tb24vc3JjL2xpYi9jb21wb25lbnRzL3Rva2VuLWlucHV0L3Rva2VuLWlucHV0LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJbnB1dFRva2VuIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBJbm5lcklucHV0VG9rZW4gZXh0ZW5kcyBJbnB1dFRva2VuIHtcbiAgaXNJbmJldHdlZW5Ub2tlbj86IGJvb2xlYW47XG59XG4iXX0=
@@ -0,0 +1,88 @@
1
+ import { Directive, ElementRef, HostBinding, Input, inject } from '@angular/core';
2
+ import { Utils } from '@yuuvis/client-core';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * A directive that will overlay its host component with a translucent background
6
+ * and a loading spinner once the condition resolves with true. This is useful for example to
7
+ * prevent user intercation while component data is loading or some processing is done.
8
+ *
9
+ * It'll also set the `inert` attribute on the host element. This will disable the host and
10
+ * all elements inside (like buttons, inputs etc.)
11
+ *
12
+ * @example
13
+ * <div class="result-list" [yuvBusyOverlay]="waitingForServerResponse">...</div>
14
+ *
15
+ */
16
+ export class BusyOverlayDirective {
17
+ constructor() {
18
+ this.stylePosition = 'initial';
19
+ this.#elRef = inject(ElementRef);
20
+ this.#overlayId = null;
21
+ }
22
+ #elRef;
23
+ #overlayId;
24
+ /**
25
+ * The Boolean expression to evaluate as the condition for showing the busy overlay
26
+ */
27
+ set yuvBusyOverlay(b) {
28
+ if (b === true) {
29
+ this.#addBusyOverlay();
30
+ }
31
+ else if (this.#overlayId) {
32
+ this.#removeBusyOverlay();
33
+ }
34
+ }
35
+ #addBusyOverlay() {
36
+ this.stylePosition = 'relative';
37
+ const overlay = document.createElement('div');
38
+ overlay.style.position = 'absolute';
39
+ overlay.style.transition = 'opacity 200ms';
40
+ overlay.style.opacity = '0';
41
+ overlay.style.inset = '0';
42
+ overlay.style.display = 'grid';
43
+ overlay.style.alignItems = 'center';
44
+ overlay.style.justifyContent = 'center';
45
+ overlay.style.zIndex = '5';
46
+ overlay.style.backgroundColor = 'var(--busy-overlay-background)';
47
+ this.#overlayId = `p${Utils.uuid()}`;
48
+ overlay.setAttribute('id', this.#overlayId);
49
+ const spinner = document.createElement('div');
50
+ spinner.setAttribute('class', 'yuv-loader');
51
+ overlay.append(spinner);
52
+ const el = this.#elRef.nativeElement;
53
+ el.setAttribute('inert', '');
54
+ el.append(overlay);
55
+ setTimeout(() => {
56
+ overlay.style.opacity = '1';
57
+ });
58
+ }
59
+ #removeBusyOverlay() {
60
+ const el = this.#elRef.nativeElement.querySelector(`#${this.#overlayId}`);
61
+ if (el) {
62
+ el.style.opacity = '0';
63
+ setTimeout(() => {
64
+ el.remove();
65
+ }, 200);
66
+ }
67
+ this.#elRef.nativeElement.removeAttribute('inert');
68
+ this.#overlayId = null;
69
+ }
70
+ ngOnInit() {
71
+ this.stylePosition = getComputedStyle(this.#elRef.nativeElement).position;
72
+ }
73
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BusyOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
74
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: BusyOverlayDirective, isStandalone: true, selector: "[yuvBusyOverlay]", inputs: { yuvBusyOverlay: "yuvBusyOverlay" }, host: { properties: { "style.position": "this.stylePosition" } }, ngImport: i0 }); }
75
+ }
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BusyOverlayDirective, decorators: [{
77
+ type: Directive,
78
+ args: [{
79
+ selector: '[yuvBusyOverlay]',
80
+ standalone: true
81
+ }]
82
+ }], propDecorators: { stylePosition: [{
83
+ type: HostBinding,
84
+ args: ['style.position']
85
+ }], yuvBusyOverlay: [{
86
+ type: Input
87
+ }] } });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVzeS1vdmVybGF5LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvY29tbW9uL3NyYy9saWIvZGlyZWN0aXZlcy9idXN5LW92ZXJsYXkuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFFNUM7Ozs7Ozs7Ozs7O0dBV0c7QUFLSCxNQUFNLE9BQU8sb0JBQW9CO0lBSmpDO1FBS2lDLGtCQUFhLEdBQUcsU0FBUyxDQUFDO1FBRXpELFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUIsZUFBVSxHQUFrQixJQUFJLENBQUM7S0FxRGxDO0lBdkRDLE1BQU0sQ0FBc0I7SUFFNUIsVUFBVSxDQUF1QjtJQUNqQzs7T0FFRztJQUNILElBQWEsY0FBYyxDQUFDLENBQVU7UUFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQztRQUMzQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxnQ0FBZ0MsQ0FBQztRQUVqRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQTRCLENBQUM7UUFDcEQsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDNUUsQ0FBQzsrR0F6RFUsb0JBQW9CO21HQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBSmhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUVnQyxhQUFhO3NCQUEzQyxXQUFXO3VCQUFDLGdCQUFnQjtnQkFRaEIsY0FBYztzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB0aGF0IHdpbGwgb3ZlcmxheSBpdHMgaG9zdCBjb21wb25lbnQgd2l0aCBhIHRyYW5zbHVjZW50IGJhY2tncm91bmRcbiAqIGFuZCBhIGxvYWRpbmcgc3Bpbm5lciBvbmNlIHRoZSBjb25kaXRpb24gcmVzb2x2ZXMgd2l0aCB0cnVlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZXhhbXBsZSB0b1xuICogcHJldmVudCB1c2VyIGludGVyY2F0aW9uIHdoaWxlIGNvbXBvbmVudCBkYXRhIGlzIGxvYWRpbmcgb3Igc29tZSBwcm9jZXNzaW5nIGlzIGRvbmUuXG4gKlxuICogSXQnbGwgYWxzbyBzZXQgdGhlIGBpbmVydGAgYXR0cmlidXRlIG9uIHRoZSBob3N0IGVsZW1lbnQuIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBob3N0IGFuZFxuICogYWxsIGVsZW1lbnRzIGluc2lkZSAobGlrZSBidXR0b25zLCBpbnB1dHMgZXRjLilcbiAqXG4gKiBAZXhhbXBsZVxuICogPGRpdiBjbGFzcz1cInJlc3VsdC1saXN0XCIgW3l1dkJ1c3lPdmVybGF5XT1cIndhaXRpbmdGb3JTZXJ2ZXJSZXNwb25zZVwiPi4uLjwvZGl2PlxuICpcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3l1dkJ1c3lPdmVybGF5XScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQnVzeU92ZXJsYXlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgc3R5bGVQb3NpdGlvbiA9ICdpbml0aWFsJztcblxuICAjZWxSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgI292ZXJsYXlJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgQm9vbGVhbiBleHByZXNzaW9uIHRvIGV2YWx1YXRlIGFzIHRoZSBjb25kaXRpb24gZm9yIHNob3dpbmcgdGhlIGJ1c3kgb3ZlcmxheVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHl1dkJ1c3lPdmVybGF5KGI6IGJvb2xlYW4pIHtcbiAgICBpZiAoYiA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy4jYWRkQnVzeU92ZXJsYXkoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI292ZXJsYXlJZCkge1xuICAgICAgdGhpcy4jcmVtb3ZlQnVzeU92ZXJsYXkoKTtcbiAgICB9XG4gIH1cblxuICAjYWRkQnVzeU92ZXJsYXkoKSB7XG4gICAgdGhpcy5zdHlsZVBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgb3ZlcmxheS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgb3ZlcmxheS5zdHlsZS50cmFuc2l0aW9uID0gJ29wYWNpdHkgMjAwbXMnO1xuICAgIG92ZXJsYXkuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICBvdmVybGF5LnN0eWxlLmluc2V0ID0gJzAnO1xuICAgIG92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdncmlkJztcbiAgICBvdmVybGF5LnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVyJztcbiAgICBvdmVybGF5LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ2NlbnRlcic7XG4gICAgb3ZlcmxheS5zdHlsZS56SW5kZXggPSAnNSc7XG4gICAgb3ZlcmxheS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndmFyKC0tYnVzeS1vdmVybGF5LWJhY2tncm91bmQpJztcblxuICAgIHRoaXMuI292ZXJsYXlJZCA9IGBwJHtVdGlscy51dWlkKCl9YDtcbiAgICBvdmVybGF5LnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLiNvdmVybGF5SWQpO1xuICAgIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzcGlubmVyLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAneXV2LWxvYWRlcicpO1xuICAgIG92ZXJsYXkuYXBwZW5kKHNwaW5uZXIpO1xuICAgIGNvbnN0IGVsID0gdGhpcy4jZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2luZXJ0JywgJycpO1xuICAgIGVsLmFwcGVuZChvdmVybGF5KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIG92ZXJsYXkuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICB9KTtcbiAgfVxuXG4gICNyZW1vdmVCdXN5T3ZlcmxheSgpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuI2VsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy4jb3ZlcmxheUlkfWApO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICAgIHRoaXMuI2VsUmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpbmVydCcpO1xuICAgIHRoaXMuI292ZXJsYXlJZCA9IG51bGw7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0eWxlUG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2VsUmVmLm5hdGl2ZUVsZW1lbnQpLnBvc2l0aW9uO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,61 @@
1
+ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { Subject } from 'rxjs';
4
+ import { debounceTime } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Fixes the issue of 'click' event beeing triggered on 'doubleclick' by defining new outputs that
8
+ * distinguish between single and double click.
9
+ */
10
+ export class ClickDoubleDirective {
11
+ constructor() {
12
+ this.debounceTime = 200;
13
+ this.doubleClick = new EventEmitter();
14
+ this.singleClick = new EventEmitter();
15
+ this.clicksSubject = new Subject();
16
+ this.clicksSubject.pipe(takeUntilDestroyed(), debounceTime(this.debounceTime)).subscribe({
17
+ next: (event) => {
18
+ if (event.type === 'click') {
19
+ this.singleClick.emit(event);
20
+ }
21
+ else {
22
+ this.doubleClick.emit(event);
23
+ }
24
+ }
25
+ });
26
+ }
27
+ clickEvent(event) {
28
+ event.preventDefault();
29
+ event.stopPropagation();
30
+ this.clicksSubject.next(event);
31
+ }
32
+ doubleClickEvent(event) {
33
+ event.preventDefault();
34
+ event.stopPropagation();
35
+ this.clicksSubject.next(event);
36
+ }
37
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ClickDoubleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
38
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ClickDoubleDirective, isStandalone: true, selector: "[click.single],[click.double]", inputs: { debounceTime: "debounceTime" }, outputs: { doubleClick: "click.double", singleClick: "click.single" }, host: { listeners: { "click": "clickEvent($event)", "dblclick": "doubleClickEvent($event)" } }, ngImport: i0 }); }
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ClickDoubleDirective, decorators: [{
41
+ type: Directive,
42
+ args: [{
43
+ selector: '[click.single],[click.double]',
44
+ standalone: true
45
+ }]
46
+ }], ctorParameters: () => [], propDecorators: { debounceTime: [{
47
+ type: Input
48
+ }], doubleClick: [{
49
+ type: Output,
50
+ args: ['click.double']
51
+ }], singleClick: [{
52
+ type: Output,
53
+ args: ['click.single']
54
+ }], clickEvent: [{
55
+ type: HostListener,
56
+ args: ['click', ['$event']]
57
+ }], doubleClickEvent: [{
58
+ type: HostListener,
59
+ args: ['dblclick', ['$event']]
60
+ }] } });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpY2stZG91YmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvY29tbW9uL3NyYy9saWIvZGlyZWN0aXZlcy9jbGljay1kb3VibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUU5Qzs7O0dBR0c7QUFLSCxNQUFNLE9BQU8sb0JBQW9CO0lBTy9CO1FBTlMsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDSixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpELGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUdoRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdkYsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxVQUFVLENBQUMsS0FBaUI7UUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBaUI7UUFDaEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDOytHQTlCVSxvQkFBb0I7bUdBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsK0JBQStCO29CQUN6QyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBRVUsWUFBWTtzQkFBcEIsS0FBSztnQkFDa0IsV0FBVztzQkFBbEMsTUFBTTt1QkFBQyxjQUFjO2dCQUNFLFdBQVc7c0JBQWxDLE1BQU07dUJBQUMsY0FBYztnQkFpQnRCLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBT2pDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBGaXhlcyB0aGUgaXNzdWUgb2YgJ2NsaWNrJyBldmVudCBiZWVpbmcgdHJpZ2dlcmVkIG9uICdkb3VibGVjbGljaycgYnkgZGVmaW5pbmcgbmV3IG91dHB1dHMgdGhhdFxuICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaW5nbGUgYW5kIGRvdWJsZSBjbGljay5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NsaWNrLnNpbmdsZV0sW2NsaWNrLmRvdWJsZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIENsaWNrRG91YmxlRGlyZWN0aXZlIHtcbiAgQElucHV0KCkgZGVib3VuY2VUaW1lID0gMjAwO1xuICBAT3V0cHV0KCdjbGljay5kb3VibGUnKSBkb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnY2xpY2suc2luZ2xlJykgc2luZ2xlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBjbGlja3NTdWJqZWN0ID0gbmV3IFN1YmplY3Q8TW91c2VFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsaWNrc1N1YmplY3QucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSwgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgIHRoaXMuc2luZ2xlQ2xpY2suZW1pdChldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kb3VibGVDbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBjbGlja0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNsaWNrc1N1YmplY3QubmV4dChldmVudCk7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignZGJsY2xpY2snLCBbJyRldmVudCddKVxuICBkb3VibGVDbGlja0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNsaWNrc1N1YmplY3QubmV4dChldmVudCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,56 @@
1
+ import { Directive, ElementRef, NgZone, inject, output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Directive to watch the size of an element inside the DOM. Usefull for example to provide
5
+ * a different layout (different components) depending on the available screen estate. You
6
+ * should first try to use CSS container queries but somtimes you need a different set of
7
+ * components to be loaded for a certain component size.
8
+ *
9
+ * Let's say you have components designed for bigger screens. You do not want to load them
10
+ * if there is not enough space for them. So you rather load components that are designed to
11
+ * take less space by providing the best user experience on smaller devices.
12
+ *
13
+ * ```html
14
+ * <div yuvContainerSize (containerHeight)="onContainerResize($event)" (containerWidth)="onContainerResize($event)"></div>
15
+ * ```
16
+ *
17
+ */
18
+ export class ContainerSizeDirective {
19
+ constructor() {
20
+ this.elRef = inject(ElementRef);
21
+ this.ngZone = inject(NgZone);
22
+ this.containerHeight = output();
23
+ this.containerWidth = output();
24
+ this._resizeObserver = new ResizeObserver((entries) => {
25
+ const size = entries[0].borderBoxSize[0];
26
+ if (!this._size || size.blockSize !== this._size.blockSize) {
27
+ this._emit(size.blockSize, true);
28
+ }
29
+ if (!this._size || size.inlineSize !== this._size.inlineSize) {
30
+ this._emit(size.inlineSize);
31
+ }
32
+ this._size = size;
33
+ });
34
+ this._resizeObserver.observe(this.elRef.nativeElement);
35
+ }
36
+ _emit(value, isHeight = false) {
37
+ // ResizeObserver callback is not covered by change detection
38
+ // so it has to be executed withing ngZone
39
+ this.ngZone.run(() => {
40
+ (isHeight ? this.containerHeight : this.containerWidth).emit(value);
41
+ });
42
+ }
43
+ ngOnDestroy() {
44
+ this._resizeObserver.unobserve(this.elRef.nativeElement);
45
+ }
46
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContainerSizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
47
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ContainerSizeDirective, isStandalone: true, selector: "[yuvContainerSize]", outputs: { containerHeight: "containerHeight", containerWidth: "containerWidth" }, ngImport: i0 }); }
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContainerSizeDirective, decorators: [{
50
+ type: Directive,
51
+ args: [{
52
+ selector: '[yuvContainerSize]',
53
+ standalone: true
54
+ }]
55
+ }], ctorParameters: () => [] });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLXNpemUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9jb21tb24vc3JjL2xpYi9kaXJlY3RpdmVzL2NvbnRhaW5lci1zaXplLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFekY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFLSCxNQUFNLE9BQU8sc0JBQXNCO0lBbUJqQztRQWxCUSxVQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEMsb0JBQWUsR0FBRyxNQUFNLEVBQVUsQ0FBQztRQUNuQyxtQkFBYyxHQUFHLE1BQU0sRUFBVSxDQUFDO1FBRzFCLG9CQUFlLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUdELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFhLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDM0MsNkRBQTZEO1FBQzdELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0QsQ0FBQzsrR0FqQ1Usc0JBQXNCO21HQUF0QixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBOZ1pvbmUsIE9uRGVzdHJveSwgaW5qZWN0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gd2F0Y2ggdGhlIHNpemUgb2YgYW4gZWxlbWVudCBpbnNpZGUgdGhlIERPTS4gVXNlZnVsbCBmb3IgZXhhbXBsZSB0byBwcm92aWRlXG4gKiBhIGRpZmZlcmVudCBsYXlvdXQgKGRpZmZlcmVudCBjb21wb25lbnRzKSBkZXBlbmRpbmcgb24gdGhlIGF2YWlsYWJsZSBzY3JlZW4gZXN0YXRlLiBZb3VcbiAqIHNob3VsZCBmaXJzdCB0cnkgdG8gdXNlIENTUyBjb250YWluZXIgcXVlcmllcyBidXQgc29tdGltZXMgeW91IG5lZWQgYSBkaWZmZXJlbnQgc2V0IG9mXG4gKiBjb21wb25lbnRzIHRvIGJlIGxvYWRlZCBmb3IgYSBjZXJ0YWluIGNvbXBvbmVudCBzaXplLlxuICpcbiAqIExldCdzIHNheSB5b3UgaGF2ZSBjb21wb25lbnRzIGRlc2lnbmVkIGZvciBiaWdnZXIgc2NyZWVucy4gWW91IGRvIG5vdCB3YW50IHRvIGxvYWQgdGhlbVxuICogaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBmb3IgdGhlbS4gU28geW91IHJhdGhlciBsb2FkIGNvbXBvbmVudHMgdGhhdCBhcmUgZGVzaWduZWQgdG9cbiAqIHRha2UgbGVzcyBzcGFjZSBieSBwcm92aWRpbmcgdGhlIGJlc3QgdXNlciBleHBlcmllbmNlIG9uIHNtYWxsZXIgZGV2aWNlcy5cbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IHl1dkNvbnRhaW5lclNpemUgKGNvbnRhaW5lckhlaWdodCk9XCJvbkNvbnRhaW5lclJlc2l6ZSgkZXZlbnQpXCIgKGNvbnRhaW5lcldpZHRoKT1cIm9uQ29udGFpbmVyUmVzaXplKCRldmVudClcIj48L2Rpdj5cbiAqIGBgYFxuICpcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3l1dkNvbnRhaW5lclNpemVdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBDb250YWluZXJTaXplRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBlbFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICBjb250YWluZXJIZWlnaHQgPSBvdXRwdXQ8bnVtYmVyPigpO1xuICBjb250YWluZXJXaWR0aCA9IG91dHB1dDxudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBfc2l6ZT86IFJlc2l6ZU9ic2VydmVyU2l6ZTtcbiAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICBjb25zdCBzaXplID0gZW50cmllc1swXS5ib3JkZXJCb3hTaXplWzBdO1xuICAgIGlmICghdGhpcy5fc2l6ZSB8fCBzaXplLmJsb2NrU2l6ZSAhPT0gdGhpcy5fc2l6ZS5ibG9ja1NpemUpIHtcbiAgICAgIHRoaXMuX2VtaXQoc2l6ZS5ibG9ja1NpemUsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3NpemUgfHwgc2l6ZS5pbmxpbmVTaXplICE9PSB0aGlzLl9zaXplLmlubGluZVNpemUpIHtcbiAgICAgIHRoaXMuX2VtaXQoc2l6ZS5pbmxpbmVTaXplKTtcbiAgICB9XG4gICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQodmFsdWU6IG51bWJlciwgaXNIZWlnaHQgPSBmYWxzZSkge1xuICAgIC8vIFJlc2l6ZU9ic2VydmVyIGNhbGxiYWNrIGlzIG5vdCBjb3ZlcmVkIGJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICAvLyBzbyBpdCBoYXMgdG8gYmUgZXhlY3V0ZWQgd2l0aGluZyBuZ1pvbmVcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgKGlzSGVpZ2h0ID8gdGhpcy5jb250YWluZXJIZWlnaHQgOiB0aGlzLmNvbnRhaW5lcldpZHRoKS5lbWl0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG59XG4iXX0=