@edm-sdui/sdui 1.0.69 → 1.0.70

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 (301) hide show
  1. package/edm-sdui-sdui-1.0.70.tgz +0 -0
  2. package/fesm2022/edm-sdui-sdui.mjs +1360 -516
  3. package/fesm2022/edm-sdui-sdui.mjs.map +1 -1
  4. package/package.json +6 -7
  5. package/types/edm-sdui-sdui.d.ts +1560 -0
  6. package/types/edm-sdui-sdui.d.ts.map +1 -0
  7. package/edm-sdui-sdui-1.0.69.tgz +0 -0
  8. package/edm-sdui-sdui.d.ts.map +0 -1
  9. package/esm2022/edm-sdui-sdui.mjs +0 -5
  10. package/esm2022/lib/components/navigation-controls/navigation-controls.component.mjs +0 -27
  11. package/esm2022/lib/components/uicomponent/button/button.component.mjs +0 -56
  12. package/esm2022/lib/components/uicomponent/column/column.component.mjs +0 -27
  13. package/esm2022/lib/components/uicomponent/image/image.component.mjs +0 -61
  14. package/esm2022/lib/components/uicomponent/image/ranking-svg.mjs +0 -186
  15. package/esm2022/lib/components/uicomponent/label/label.component.mjs +0 -97
  16. package/esm2022/lib/components/uicomponent/media-type/media-type.component.mjs +0 -71
  17. package/esm2022/lib/components/uicomponent/modal/modal.component.mjs +0 -30
  18. package/esm2022/lib/components/uicomponent/picker/picker.component.mjs +0 -56
  19. package/esm2022/lib/components/uicomponent/picker-item/picker-item.component.mjs +0 -34
  20. package/esm2022/lib/components/uicomponent/profile-button/profile-button.component.mjs +0 -115
  21. package/esm2022/lib/components/uicomponent/progress-bar/progress-bar.component.mjs +0 -42
  22. package/esm2022/lib/components/uicomponent/row/row.component.mjs +0 -22
  23. package/esm2022/lib/components/uicomponent/row-divisor/row-divisor.component.mjs +0 -22
  24. package/esm2022/lib/components/uicomponent/scrollable-column/scrollable-column.component.mjs +0 -33
  25. package/esm2022/lib/components/uicomponent/scrollable-row/scrollable-row.component.mjs +0 -131
  26. package/esm2022/lib/components/uicomponent/search-bar/search-bar.component.mjs +0 -102
  27. package/esm2022/lib/components/uicomponent/search-bar dismiss/search-bar-dismiss.component.mjs +0 -139
  28. package/esm2022/lib/components/uicomponent/space/space.component.mjs +0 -20
  29. package/esm2022/lib/components/uicomponent/tag/tag.component.mjs +0 -59
  30. package/esm2022/lib/components/uicomponent/tags-row/tag/tag.component.mjs +0 -282
  31. package/esm2022/lib/components/uicomponent/tags-row/tags-row.component.mjs +0 -178
  32. package/esm2022/lib/components/uicomponent/uicomponent.component.mjs +0 -52
  33. package/esm2022/lib/components/uicomponent/zstack/zstack.component.mjs +0 -23
  34. package/esm2022/lib/components/uilayout/centered-content-layout/centered-content-layout.component.mjs +0 -24
  35. package/esm2022/lib/components/uilayout/fab/fab.component.mjs +0 -42
  36. package/esm2022/lib/components/uilayout/single-column-layout/single-column-layout.component.mjs +0 -22
  37. package/esm2022/lib/components/uilayout/uinavigation/uinavigation.component.mjs +0 -15
  38. package/esm2022/lib/components/uiscreen/uiscreen.component.mjs +0 -31
  39. package/esm2022/lib/core/services/font-size-mapping.service.mjs +0 -30
  40. package/esm2022/lib/core/services/modal.service.mjs +0 -30
  41. package/esm2022/lib/core/services/scroll-spy.service.mjs +0 -102
  42. package/esm2022/lib/core/services/translation.service.mjs +0 -53
  43. package/esm2022/lib/core/services/ui-action-handlers.service.mjs +0 -17
  44. package/esm2022/lib/core/services/ui-action.service.mjs +0 -112
  45. package/esm2022/lib/core/services/uiscreen.service.mjs +0 -205
  46. package/esm2022/lib/core/tokens/sdui-config.token.mjs +0 -4
  47. package/esm2022/lib/core/uicomposition/enums/uicomponent-type.mjs +0 -36
  48. package/esm2022/lib/core/uicomposition/enums/uiplatform-type.mjs +0 -7
  49. package/esm2022/lib/core/uicomposition/enums/uiscene.mjs +0 -5
  50. package/esm2022/lib/core/uicomposition/enums/uiscreen-container-type.mjs +0 -6
  51. package/esm2022/lib/core/uicomposition/enums/uiscreen-identifier.mjs +0 -6
  52. package/esm2022/lib/core/uicomposition/mapping/component-mapping.mjs +0 -36
  53. package/esm2022/lib/core/uicomposition/models/uicentered-content-layout.mjs +0 -2
  54. package/esm2022/lib/core/uicomposition/models/uicomponent.mjs +0 -2
  55. package/esm2022/lib/core/uicomposition/models/uielement.mjs +0 -2
  56. package/esm2022/lib/core/uicomposition/models/uilayout.mjs +0 -2
  57. package/esm2022/lib/core/uicomposition/models/uinavigation.mjs +0 -2
  58. package/esm2022/lib/core/uicomposition/models/uiscreen-config.mjs +0 -2
  59. package/esm2022/lib/core/uicomposition/models/uiscreen.mjs +0 -2
  60. package/esm2022/lib/core/uicomposition/models/uisingle-column-layout.mjs +0 -2
  61. package/esm2022/lib/core/uicomposition/models/uitag.mjs +0 -2
  62. package/esm2022/lib/core/uicomposition/models/uiview.mjs +0 -2
  63. package/esm2022/lib/core/uitheme/enums/uiaction-type.mjs +0 -17
  64. package/esm2022/lib/core/uitheme/enums/uialignment-type.mjs +0 -7
  65. package/esm2022/lib/core/uitheme/enums/uiaspect-type.mjs +0 -6
  66. package/esm2022/lib/core/uitheme/enums/uiasset.mjs +0 -437
  67. package/esm2022/lib/core/uitheme/enums/uicolor.mjs +0 -157
  68. package/esm2022/lib/core/uitheme/enums/uicontent-type.mjs +0 -11
  69. package/esm2022/lib/core/uitheme/enums/uidimension.mjs +0 -49
  70. package/esm2022/lib/core/uitheme/enums/uijustify.mjs +0 -9
  71. package/esm2022/lib/core/uitheme/enums/uipadding-level.mjs +0 -12
  72. package/esm2022/lib/core/uitheme/enums/uipresentation-style.mjs +0 -7
  73. package/esm2022/lib/core/uitheme/enums/uiradius-level.mjs +0 -10
  74. package/esm2022/lib/core/uitheme/enums/uishadow-blur-radius.mjs +0 -5
  75. package/esm2022/lib/core/uitheme/enums/uishadow-offset.mjs +0 -5
  76. package/esm2022/lib/core/uitheme/enums/uisize.mjs +0 -22
  77. package/esm2022/lib/core/uitheme/enums/uispacing-level.mjs +0 -10
  78. package/esm2022/lib/core/uitheme/enums/uitext-style.mjs +0 -15
  79. package/esm2022/lib/core/uitheme/mapping/alignment-mapping.mjs +0 -7
  80. package/esm2022/lib/core/uitheme/mapping/aspect-mapping.mjs +0 -6
  81. package/esm2022/lib/core/uitheme/mapping/asset-mapping.mjs +0 -437
  82. package/esm2022/lib/core/uitheme/mapping/color-mapping.mjs +0 -157
  83. package/esm2022/lib/core/uitheme/mapping/dimension-mapping.mjs +0 -51
  84. package/esm2022/lib/core/uitheme/mapping/justify-mapping.mjs +0 -9
  85. package/esm2022/lib/core/uitheme/mapping/pad-mapping.mjs +0 -12
  86. package/esm2022/lib/core/uitheme/mapping/radius-mapping.mjs +0 -10
  87. package/esm2022/lib/core/uitheme/mapping/shadow-mapping.mjs +0 -9
  88. package/esm2022/lib/core/uitheme/mapping/size-mapping.mjs +0 -26
  89. package/esm2022/lib/core/uitheme/mapping/space-mapping.mjs +0 -10
  90. package/esm2022/lib/core/uitheme/mapping/text-style-mapping.mjs +0 -33
  91. package/esm2022/lib/core/uitheme/models/uiaction.mjs +0 -2
  92. package/esm2022/lib/core/uitheme/models/uialignment.mjs +0 -2
  93. package/esm2022/lib/core/uitheme/models/uibackground.mjs +0 -2
  94. package/esm2022/lib/core/uitheme/models/uicontent-inset.mjs +0 -2
  95. package/esm2022/lib/core/uitheme/models/uihover.mjs +0 -2
  96. package/esm2022/lib/core/uitheme/models/uipadding.mjs +0 -2
  97. package/esm2022/lib/core/uitheme/models/uiradius.mjs +0 -2
  98. package/esm2022/lib/core/uitheme/models/uishadow.mjs +0 -2
  99. package/esm2022/lib/core/uitheme/models/uispacing.mjs +0 -2
  100. package/esm2022/lib/core/utils/url-parser.util.mjs +0 -26
  101. package/esm2022/lib/core/view-models/uiscreen.viewmodel.mjs +0 -106
  102. package/esm2022/lib/directives/uiview.directive.mjs +0 -401
  103. package/esm2022/lib/sdui-routing.module.mjs +0 -28
  104. package/esm2022/lib/sdui.component.mjs +0 -51
  105. package/esm2022/lib/sdui.module.mjs +0 -139
  106. package/esm2022/public-api.mjs +0 -13
  107. package/index.d.ts +0 -6
  108. package/lib/components/navigation-controls/navigation-controls.component.d.ts +0 -12
  109. package/lib/components/navigation-controls/navigation-controls.component.d.ts.map +0 -1
  110. package/lib/components/uicomponent/button/button.component.d.ts +0 -19
  111. package/lib/components/uicomponent/button/button.component.d.ts.map +0 -1
  112. package/lib/components/uicomponent/column/column.component.d.ts +0 -12
  113. package/lib/components/uicomponent/column/column.component.d.ts.map +0 -1
  114. package/lib/components/uicomponent/image/image.component.d.ts +0 -18
  115. package/lib/components/uicomponent/image/image.component.d.ts.map +0 -1
  116. package/lib/components/uicomponent/image/ranking-svg.d.ts +0 -2
  117. package/lib/components/uicomponent/image/ranking-svg.d.ts.map +0 -1
  118. package/lib/components/uicomponent/label/label.component.d.ts +0 -18
  119. package/lib/components/uicomponent/label/label.component.d.ts.map +0 -1
  120. package/lib/components/uicomponent/media-type/media-type.component.d.ts +0 -24
  121. package/lib/components/uicomponent/media-type/media-type.component.d.ts.map +0 -1
  122. package/lib/components/uicomponent/modal/modal.component.d.ts +0 -15
  123. package/lib/components/uicomponent/modal/modal.component.d.ts.map +0 -1
  124. package/lib/components/uicomponent/picker/picker.component.d.ts +0 -22
  125. package/lib/components/uicomponent/picker/picker.component.d.ts.map +0 -1
  126. package/lib/components/uicomponent/picker-item/picker-item.component.d.ts +0 -16
  127. package/lib/components/uicomponent/picker-item/picker-item.component.d.ts.map +0 -1
  128. package/lib/components/uicomponent/profile-button/profile-button.component.d.ts +0 -22
  129. package/lib/components/uicomponent/profile-button/profile-button.component.d.ts.map +0 -1
  130. package/lib/components/uicomponent/progress-bar/progress-bar.component.d.ts +0 -15
  131. package/lib/components/uicomponent/progress-bar/progress-bar.component.d.ts.map +0 -1
  132. package/lib/components/uicomponent/row/row.component.d.ts +0 -11
  133. package/lib/components/uicomponent/row/row.component.d.ts.map +0 -1
  134. package/lib/components/uicomponent/row-divisor/row-divisor.component.d.ts +0 -11
  135. package/lib/components/uicomponent/row-divisor/row-divisor.component.d.ts.map +0 -1
  136. package/lib/components/uicomponent/scrollable-column/scrollable-column.component.d.ts +0 -15
  137. package/lib/components/uicomponent/scrollable-column/scrollable-column.component.d.ts.map +0 -1
  138. package/lib/components/uicomponent/scrollable-row/scrollable-row.component.d.ts +0 -29
  139. package/lib/components/uicomponent/scrollable-row/scrollable-row.component.d.ts.map +0 -1
  140. package/lib/components/uicomponent/search-bar/search-bar.component.d.ts +0 -19
  141. package/lib/components/uicomponent/search-bar/search-bar.component.d.ts.map +0 -1
  142. package/lib/components/uicomponent/search-bar dismiss/search-bar-dismiss.component.d.ts +0 -22
  143. package/lib/components/uicomponent/search-bar dismiss/search-bar-dismiss.component.d.ts.map +0 -1
  144. package/lib/components/uicomponent/space/space.component.d.ts +0 -11
  145. package/lib/components/uicomponent/space/space.component.d.ts.map +0 -1
  146. package/lib/components/uicomponent/tag/tag.component.d.ts +0 -19
  147. package/lib/components/uicomponent/tag/tag.component.d.ts.map +0 -1
  148. package/lib/components/uicomponent/tags-row/tag/tag.component.d.ts +0 -39
  149. package/lib/components/uicomponent/tags-row/tag/tag.component.d.ts.map +0 -1
  150. package/lib/components/uicomponent/tags-row/tags-row.component.d.ts +0 -37
  151. package/lib/components/uicomponent/tags-row/tags-row.component.d.ts.map +0 -1
  152. package/lib/components/uicomponent/uicomponent.component.d.ts +0 -18
  153. package/lib/components/uicomponent/uicomponent.component.d.ts.map +0 -1
  154. package/lib/components/uicomponent/zstack/zstack.component.d.ts +0 -11
  155. package/lib/components/uicomponent/zstack/zstack.component.d.ts.map +0 -1
  156. package/lib/components/uilayout/centered-content-layout/centered-content-layout.component.d.ts +0 -11
  157. package/lib/components/uilayout/centered-content-layout/centered-content-layout.component.d.ts.map +0 -1
  158. package/lib/components/uilayout/fab/fab.component.d.ts +0 -17
  159. package/lib/components/uilayout/fab/fab.component.d.ts.map +0 -1
  160. package/lib/components/uilayout/single-column-layout/single-column-layout.component.d.ts +0 -10
  161. package/lib/components/uilayout/single-column-layout/single-column-layout.component.d.ts.map +0 -1
  162. package/lib/components/uilayout/uinavigation/uinavigation.component.d.ts +0 -8
  163. package/lib/components/uilayout/uinavigation/uinavigation.component.d.ts.map +0 -1
  164. package/lib/components/uiscreen/uiscreen.component.d.ts +0 -13
  165. package/lib/components/uiscreen/uiscreen.component.d.ts.map +0 -1
  166. package/lib/core/services/font-size-mapping.service.d.ts +0 -10
  167. package/lib/core/services/font-size-mapping.service.d.ts.map +0 -1
  168. package/lib/core/services/modal.service.d.ts +0 -11
  169. package/lib/core/services/modal.service.d.ts.map +0 -1
  170. package/lib/core/services/scroll-spy.service.d.ts +0 -31
  171. package/lib/core/services/scroll-spy.service.d.ts.map +0 -1
  172. package/lib/core/services/translation.service.d.ts +0 -13
  173. package/lib/core/services/translation.service.d.ts.map +0 -1
  174. package/lib/core/services/ui-action-handlers.service.d.ts +0 -9
  175. package/lib/core/services/ui-action-handlers.service.d.ts.map +0 -1
  176. package/lib/core/services/ui-action.service.d.ts +0 -17
  177. package/lib/core/services/ui-action.service.d.ts.map +0 -1
  178. package/lib/core/services/uiscreen.service.d.ts +0 -26
  179. package/lib/core/services/uiscreen.service.d.ts.map +0 -1
  180. package/lib/core/tokens/sdui-config.token.d.ts +0 -4
  181. package/lib/core/tokens/sdui-config.token.d.ts.map +0 -1
  182. package/lib/core/uicomposition/enums/uicomponent-type.d.ts +0 -26
  183. package/lib/core/uicomposition/enums/uicomponent-type.d.ts.map +0 -1
  184. package/lib/core/uicomposition/enums/uiplatform-type.d.ts +0 -6
  185. package/lib/core/uicomposition/enums/uiplatform-type.d.ts.map +0 -1
  186. package/lib/core/uicomposition/enums/uiscene.d.ts +0 -4
  187. package/lib/core/uicomposition/enums/uiscene.d.ts.map +0 -1
  188. package/lib/core/uicomposition/enums/uiscreen-container-type.d.ts +0 -5
  189. package/lib/core/uicomposition/enums/uiscreen-container-type.d.ts.map +0 -1
  190. package/lib/core/uicomposition/enums/uiscreen-identifier.d.ts +0 -5
  191. package/lib/core/uicomposition/enums/uiscreen-identifier.d.ts.map +0 -1
  192. package/lib/core/uicomposition/mapping/component-mapping.d.ts +0 -4
  193. package/lib/core/uicomposition/mapping/component-mapping.d.ts.map +0 -1
  194. package/lib/core/uicomposition/models/uicentered-content-layout.d.ts +0 -11
  195. package/lib/core/uicomposition/models/uicentered-content-layout.d.ts.map +0 -1
  196. package/lib/core/uicomposition/models/uicomponent.d.ts +0 -12
  197. package/lib/core/uicomposition/models/uicomponent.d.ts.map +0 -1
  198. package/lib/core/uicomposition/models/uielement.d.ts +0 -28
  199. package/lib/core/uicomposition/models/uielement.d.ts.map +0 -1
  200. package/lib/core/uicomposition/models/uilayout.d.ts +0 -4
  201. package/lib/core/uicomposition/models/uilayout.d.ts.map +0 -1
  202. package/lib/core/uicomposition/models/uinavigation.d.ts +0 -6
  203. package/lib/core/uicomposition/models/uinavigation.d.ts.map +0 -1
  204. package/lib/core/uicomposition/models/uiscreen-config.d.ts +0 -6
  205. package/lib/core/uicomposition/models/uiscreen-config.d.ts.map +0 -1
  206. package/lib/core/uicomposition/models/uiscreen.d.ts +0 -20
  207. package/lib/core/uicomposition/models/uiscreen.d.ts.map +0 -1
  208. package/lib/core/uicomposition/models/uisingle-column-layout.d.ts +0 -12
  209. package/lib/core/uicomposition/models/uisingle-column-layout.d.ts.map +0 -1
  210. package/lib/core/uicomposition/models/uitag.d.ts +0 -6
  211. package/lib/core/uicomposition/models/uitag.d.ts.map +0 -1
  212. package/lib/core/uicomposition/models/uiview.d.ts +0 -33
  213. package/lib/core/uicomposition/models/uiview.d.ts.map +0 -1
  214. package/lib/core/uitheme/enums/uiaction-type.d.ts +0 -13
  215. package/lib/core/uitheme/enums/uiaction-type.d.ts.map +0 -1
  216. package/lib/core/uitheme/enums/uialignment-type.d.ts +0 -6
  217. package/lib/core/uitheme/enums/uialignment-type.d.ts.map +0 -1
  218. package/lib/core/uitheme/enums/uiaspect-type.d.ts +0 -5
  219. package/lib/core/uitheme/enums/uiaspect-type.d.ts.map +0 -1
  220. package/lib/core/uitheme/enums/uiasset.d.ts +0 -436
  221. package/lib/core/uitheme/enums/uiasset.d.ts.map +0 -1
  222. package/lib/core/uitheme/enums/uicolor.d.ts +0 -156
  223. package/lib/core/uitheme/enums/uicolor.d.ts.map +0 -1
  224. package/lib/core/uitheme/enums/uicontent-type.d.ts +0 -10
  225. package/lib/core/uitheme/enums/uicontent-type.d.ts.map +0 -1
  226. package/lib/core/uitheme/enums/uidimension.d.ts +0 -48
  227. package/lib/core/uitheme/enums/uidimension.d.ts.map +0 -1
  228. package/lib/core/uitheme/enums/uijustify.d.ts +0 -8
  229. package/lib/core/uitheme/enums/uijustify.d.ts.map +0 -1
  230. package/lib/core/uitheme/enums/uipadding-level.d.ts +0 -11
  231. package/lib/core/uitheme/enums/uipadding-level.d.ts.map +0 -1
  232. package/lib/core/uitheme/enums/uipresentation-style.d.ts +0 -6
  233. package/lib/core/uitheme/enums/uipresentation-style.d.ts.map +0 -1
  234. package/lib/core/uitheme/enums/uiradius-level.d.ts +0 -9
  235. package/lib/core/uitheme/enums/uiradius-level.d.ts.map +0 -1
  236. package/lib/core/uitheme/enums/uishadow-blur-radius.d.ts +0 -4
  237. package/lib/core/uitheme/enums/uishadow-blur-radius.d.ts.map +0 -1
  238. package/lib/core/uitheme/enums/uishadow-offset.d.ts +0 -4
  239. package/lib/core/uitheme/enums/uishadow-offset.d.ts.map +0 -1
  240. package/lib/core/uitheme/enums/uisize.d.ts +0 -21
  241. package/lib/core/uitheme/enums/uisize.d.ts.map +0 -1
  242. package/lib/core/uitheme/enums/uispacing-level.d.ts +0 -9
  243. package/lib/core/uitheme/enums/uispacing-level.d.ts.map +0 -1
  244. package/lib/core/uitheme/enums/uitext-style.d.ts +0 -14
  245. package/lib/core/uitheme/enums/uitext-style.d.ts.map +0 -1
  246. package/lib/core/uitheme/mapping/alignment-mapping.d.ts +0 -3
  247. package/lib/core/uitheme/mapping/alignment-mapping.d.ts.map +0 -1
  248. package/lib/core/uitheme/mapping/aspect-mapping.d.ts +0 -3
  249. package/lib/core/uitheme/mapping/aspect-mapping.d.ts.map +0 -1
  250. package/lib/core/uitheme/mapping/asset-mapping.d.ts +0 -3
  251. package/lib/core/uitheme/mapping/asset-mapping.d.ts.map +0 -1
  252. package/lib/core/uitheme/mapping/color-mapping.d.ts +0 -3
  253. package/lib/core/uitheme/mapping/color-mapping.d.ts.map +0 -1
  254. package/lib/core/uitheme/mapping/dimension-mapping.d.ts +0 -3
  255. package/lib/core/uitheme/mapping/dimension-mapping.d.ts.map +0 -1
  256. package/lib/core/uitheme/mapping/justify-mapping.d.ts +0 -3
  257. package/lib/core/uitheme/mapping/justify-mapping.d.ts.map +0 -1
  258. package/lib/core/uitheme/mapping/pad-mapping.d.ts +0 -3
  259. package/lib/core/uitheme/mapping/pad-mapping.d.ts.map +0 -1
  260. package/lib/core/uitheme/mapping/radius-mapping.d.ts +0 -3
  261. package/lib/core/uitheme/mapping/radius-mapping.d.ts.map +0 -1
  262. package/lib/core/uitheme/mapping/shadow-mapping.d.ts +0 -5
  263. package/lib/core/uitheme/mapping/shadow-mapping.d.ts.map +0 -1
  264. package/lib/core/uitheme/mapping/size-mapping.d.ts +0 -12
  265. package/lib/core/uitheme/mapping/size-mapping.d.ts.map +0 -1
  266. package/lib/core/uitheme/mapping/space-mapping.d.ts +0 -3
  267. package/lib/core/uitheme/mapping/space-mapping.d.ts.map +0 -1
  268. package/lib/core/uitheme/mapping/text-style-mapping.d.ts +0 -5
  269. package/lib/core/uitheme/mapping/text-style-mapping.d.ts.map +0 -1
  270. package/lib/core/uitheme/models/uiaction.d.ts +0 -10
  271. package/lib/core/uitheme/models/uiaction.d.ts.map +0 -1
  272. package/lib/core/uitheme/models/uialignment.d.ts +0 -5
  273. package/lib/core/uitheme/models/uialignment.d.ts.map +0 -1
  274. package/lib/core/uitheme/models/uibackground.d.ts +0 -7
  275. package/lib/core/uitheme/models/uibackground.d.ts.map +0 -1
  276. package/lib/core/uitheme/models/uicontent-inset.d.ts +0 -8
  277. package/lib/core/uitheme/models/uicontent-inset.d.ts.map +0 -1
  278. package/lib/core/uitheme/models/uihover.d.ts +0 -4
  279. package/lib/core/uitheme/models/uihover.d.ts.map +0 -1
  280. package/lib/core/uitheme/models/uipadding.d.ts +0 -8
  281. package/lib/core/uitheme/models/uipadding.d.ts.map +0 -1
  282. package/lib/core/uitheme/models/uiradius.d.ts +0 -8
  283. package/lib/core/uitheme/models/uiradius.d.ts.map +0 -1
  284. package/lib/core/uitheme/models/uishadow.d.ts +0 -11
  285. package/lib/core/uitheme/models/uishadow.d.ts.map +0 -1
  286. package/lib/core/uitheme/models/uispacing.d.ts +0 -5
  287. package/lib/core/uitheme/models/uispacing.d.ts.map +0 -1
  288. package/lib/core/utils/url-parser.util.d.ts +0 -3
  289. package/lib/core/utils/url-parser.util.d.ts.map +0 -1
  290. package/lib/core/view-models/uiscreen.viewmodel.d.ts +0 -39
  291. package/lib/core/view-models/uiscreen.viewmodel.d.ts.map +0 -1
  292. package/lib/directives/uiview.directive.d.ts +0 -54
  293. package/lib/directives/uiview.directive.d.ts.map +0 -1
  294. package/lib/sdui-routing.module.d.ts +0 -10
  295. package/lib/sdui-routing.module.d.ts.map +0 -1
  296. package/lib/sdui.component.d.ts +0 -17
  297. package/lib/sdui.component.d.ts.map +0 -1
  298. package/lib/sdui.module.d.ts +0 -47
  299. package/lib/sdui.module.d.ts.map +0 -1
  300. package/public-api.d.ts +0 -7
  301. package/public-api.d.ts.map +0 -1
@@ -1,59 +0,0 @@
1
- import { Component, ElementRef, Inject, Renderer2, ViewChild } from "@angular/core";
2
- import { colorMapping } from "../../../core/uitheme/mapping/color-mapping";
3
- import { textStyleMappingLineHeight } from "../../../core/uitheme/mapping/text-style-mapping";
4
- import { FontSizeMappingService } from "../../../core/services/font-size-mapping.service";
5
- import { UISize } from "../../../core/uitheme/enums/uisize";
6
- import { sizeMappingHeight } from "../../../core/uitheme/mapping/size-mapping";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../../core/services/font-size-mapping.service";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "../../../directives/uiview.directive";
11
- export class TagComponent {
12
- constructor(uiComponent, renderer, fontSizeMappingService) {
13
- this.uiComponent = uiComponent;
14
- this.renderer = renderer;
15
- this.fontSizeMappingService = fontSizeMappingService;
16
- }
17
- ngOnInit() {
18
- }
19
- ngAfterViewInit() {
20
- if (this.uiComponent.element) {
21
- this.applyElement(this.uiComponent.element);
22
- }
23
- if (this.uiComponent.element) {
24
- this.applyLabelElement(this.uiComponent.element);
25
- }
26
- }
27
- applyElement(element) {
28
- }
29
- applyLabelElement(element) {
30
- if (element.textColor) {
31
- const color = colorMapping[element.textColor];
32
- this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'color', color);
33
- }
34
- const textStyleMappingFontSize = this.fontSizeMappingService.getMapping();
35
- if (element.textStyle) {
36
- const fontSize = textStyleMappingFontSize[element.textStyle];
37
- const lineHeight = textStyleMappingLineHeight[element.textStyle];
38
- this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'font-size', fontSize);
39
- this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'line-height', lineHeight);
40
- }
41
- this.renderer.setStyle(this.tagElementRef.nativeElement, 'height', sizeMappingHeight[UISize.ASSET_8]);
42
- }
43
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagComponent, deps: [{ token: 'uiComponent' }, { token: i0.Renderer2 }, { token: i1.FontSizeMappingService }], target: i0.ɵɵFactoryTarget.Component }); }
44
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TagComponent, isStandalone: false, selector: "edm-sdui-tag", viewQueries: [{ propertyName: "tagElementRef", first: true, predicate: ["tagElement"], descendants: true }, { propertyName: "tagNameElementRef", first: true, predicate: ["tagNameElement"], descendants: true }], ngImport: i0, template: "<div class=\"tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>", styles: [":host{display:contents}.tag{padding:4px 8px;display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.UIViewDirective, selector: "[edmSduiView]", inputs: ["edmSduiView", "disableClick"] }] }); }
45
- }
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagComponent, decorators: [{
47
- type: Component,
48
- args: [{ standalone: false, selector: 'edm-sdui-tag', template: "<div class=\"tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>", styles: [":host{display:contents}.tag{padding:4px 8px;display:flex;align-items:center}\n"] }]
49
- }], ctorParameters: () => [{ type: undefined, decorators: [{
50
- type: Inject,
51
- args: ['uiComponent']
52
- }] }, { type: i0.Renderer2 }, { type: i1.FontSizeMappingService }], propDecorators: { tagElementRef: [{
53
- type: ViewChild,
54
- args: ['tagElement']
55
- }], tagNameElementRef: [{
56
- type: ViewChild,
57
- args: ['tagNameElement']
58
- }] } });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2R1aS9zcmMvbGliL2NvbXBvbmVudHMvdWljb21wb25lbnQvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NkdWkvc3JjL2xpYi9jb21wb25lbnRzL3VpY29tcG9uZW50L3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMzRSxPQUFPLEVBQStCLDBCQUEwQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDM0gsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7OztBQVEvRSxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUNnQyxXQUF3QixFQUM5QyxRQUFtQixFQUNuQixzQkFBOEM7UUFGeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDOUMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO0lBQ3BELENBQUM7SUFFTCxRQUFRO0lBRVIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsT0FBa0I7SUFFdkMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQWtCO1FBQzFDLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTFFLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3BCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQ3BDLFdBQVcsRUFDWCxRQUFRLENBQ1QsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEcsQ0FBQzsrR0FoRFUsWUFBWSxrQkFLYixhQUFhO21HQUxaLFlBQVksNFJDZnpCLGlNQUVNOzs0RkRhTyxZQUFZO2tCQU54QixTQUFTO2lDQUdJLEtBQUssWUFDUCxjQUFjOzswQkFPckIsTUFBTTsyQkFBQyxhQUFhO3NHQUpFLGFBQWE7c0JBQXJDLFNBQVM7dUJBQUMsWUFBWTtnQkFDTSxpQkFBaUI7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aWNvbXBvc2l0aW9uL21vZGVscy91aWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVUlFbGVtZW50IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdWljb21wb3NpdGlvbi9tb2RlbHMvdWllbGVtZW50XCI7XG5pbXBvcnQgeyBjb2xvck1hcHBpbmcgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvY29sb3ItbWFwcGluZ1wiO1xuaW1wb3J0IHsgZ2V0VGV4dFN0eWxlTWFwcGluZ0ZvbnRTaXplLCB0ZXh0U3R5bGVNYXBwaW5nTGluZUhlaWdodCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3VpdGhlbWUvbWFwcGluZy90ZXh0LXN0eWxlLW1hcHBpbmdcIjtcbmltcG9ydCB7IEZvbnRTaXplTWFwcGluZ1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9mb250LXNpemUtbWFwcGluZy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBVSVNpemUgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aXRoZW1lL2VudW1zL3Vpc2l6ZVwiO1xuaW1wb3J0IHsgc2l6ZU1hcHBpbmdIZWlnaHQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvc2l6ZS1tYXBwaW5nXCI7XG5cbkBDb21wb25lbnQoe1xuICBzdHlsZVVybDogJy4vdGFnLmNvbXBvbmVudC5zY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ2VkbS1zZHVpLXRhZycsXG59KVxuZXhwb3J0IGNsYXNzIFRhZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3RhZ0VsZW1lbnQnKSB0YWdFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MSW1hZ2VFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndGFnTmFtZUVsZW1lbnQnKSB0YWdOYW1lRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTEltYWdlRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgndWlDb21wb25lbnQnKSBwdWJsaWMgdWlDb21wb25lbnQ6IFVJQ29tcG9uZW50LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGZvbnRTaXplTWFwcGluZ1NlcnZpY2U6IEZvbnRTaXplTWFwcGluZ1NlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuYXBwbHlFbGVtZW50KHRoaXMudWlDb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudWlDb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgdGhpcy5hcHBseUxhYmVsRWxlbWVudCh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFbGVtZW50KGVsZW1lbnQ6IFVJRWxlbWVudCkge1xuXG4gIH1cblxuICBwcml2YXRlIGFwcGx5TGFiZWxFbGVtZW50KGVsZW1lbnQ6IFVJRWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LnRleHRDb2xvcikge1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvck1hcHBpbmdbZWxlbWVudC50ZXh0Q29sb3JdO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ05hbWVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjb2xvcicsIGNvbG9yKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0U3R5bGVNYXBwaW5nRm9udFNpemUgPSB0aGlzLmZvbnRTaXplTWFwcGluZ1NlcnZpY2UuZ2V0TWFwcGluZygpO1xuXG4gICAgaWYgKGVsZW1lbnQudGV4dFN0eWxlKSB7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHRleHRTdHlsZU1hcHBpbmdGb250U2l6ZVtlbGVtZW50LnRleHRTdHlsZV07XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdGV4dFN0eWxlTWFwcGluZ0xpbmVIZWlnaHRbZWxlbWVudC50ZXh0U3R5bGVdO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWdOYW1lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnZm9udC1zaXplJyxcbiAgICAgICAgZm9udFNpemVcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFnTmFtZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xpbmUtaGVpZ2h0JywgbGluZUhlaWdodCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIHNpemVNYXBwaW5nSGVpZ2h0W1VJU2l6ZS5BU1NFVF84XSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWdcIiAjdGFnRWxlbWVudCAqbmdJZj1cInVpQ29tcG9uZW50XCIgW2VkbVNkdWlWaWV3XT1cInVpQ29tcG9uZW50LmVsZW1lbnRcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRhZy1uYW1lXCIgI3RhZ05hbWVFbGVtZW50Pnt7IHVpQ29tcG9uZW50LmVsZW1lbnQ/LmxhYmVsID8/ICcnIH19PC9zcGFuPlxuPC9kaXY+Il19
@@ -1,282 +0,0 @@
1
- import { Component, ElementRef, Inject, Renderer2, ViewChild } from "@angular/core";
2
- import { colorMapping } from "../../../../core/uitheme/mapping/color-mapping";
3
- import { textStyleMappingLineHeight } from "../../../../core/uitheme/mapping/text-style-mapping";
4
- import { FontSizeMappingService } from "../../../../core/services/font-size-mapping.service";
5
- import { ScrollSpyService } from "../../../../core/services/scroll-spy.service";
6
- import { Subject } from "rxjs";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../../../core/services/font-size-mapping.service";
9
- import * as i2 from "../../../../core/services/scroll-spy.service";
10
- import * as i3 from "@angular/common";
11
- import * as i4 from "../../../../directives/uiview.directive";
12
- export class TagsRowTagComponent {
13
- static { this.scrollSpyInitialized = false; }
14
- static { this.scrollSpy$ = null; }
15
- static { this.scrollSpySub = null; }
16
- static { this.scrollSpyInitTries = 0; }
17
- static { this.scrollSpyContainer = null; }
18
- static { this.activeId = null; }
19
- static { this.isScrollingToSection = false; }
20
- static { this.instanceCount = 0; }
21
- constructor(uiComponent, renderer, fontSizeMappingService, scrollSpy) {
22
- this.uiComponent = uiComponent;
23
- this.renderer = renderer;
24
- this.fontSizeMappingService = fontSizeMappingService;
25
- this.scrollSpy = scrollSpy;
26
- this.destroy$ = new Subject();
27
- TagsRowTagComponent.instanceCount++;
28
- }
29
- ngOnInit() {
30
- }
31
- ngAfterViewInit() {
32
- if (this.uiComponent.element) {
33
- this.applyElement(this.uiComponent.element);
34
- this.applyLabelElement(this.uiComponent.element);
35
- // Map: tag.action.param -> section div id
36
- const actionParam = this.uiComponent?.element?.action?.param;
37
- if (actionParam != null && this.tagElementRef?.nativeElement) {
38
- this.renderer.setAttribute(this.tagElementRef.nativeElement, 'data-tag', String(actionParam));
39
- }
40
- else {
41
- console.warn('[TagComponent] tag without action.param', this.uiComponent?.element);
42
- }
43
- // Reaplica seleção se este tag corresponde ao ativo atual.
44
- this.syncSelectionState();
45
- // IMPORTANT: TagsRowTagComponent renders once per tag.
46
- // We initialize the scroll observer only once, but we MUST NOT tie it to the first instance lifecycle,
47
- // because the first instance may be destroyed (e.g. rerender) and the subscription would die.
48
- this.initScrollSpyOnce();
49
- }
50
- }
51
- applyElement(element) {
52
- }
53
- markSelectedTag(id) {
54
- const tags = Array.from(document.querySelectorAll('.row-tag'));
55
- const dataTags = tags.map(t => t.getAttribute('data-tag'));
56
- TagsRowTagComponent.activeId = id;
57
- for (const t of tags)
58
- t.classList.remove('row-tag--selected');
59
- const active = document.querySelector(`.row-tag[data-tag="${CSS.escape(id)}"]`);
60
- if (!active) {
61
- console.warn('[TagComponent] active tag not found for id', id);
62
- return;
63
- }
64
- active.classList.add('row-tag--selected');
65
- this.ensureTagVisible(active);
66
- }
67
- onTagClick() {
68
- const actionParam = this.tagElementRef?.nativeElement?.getAttribute('data-tag');
69
- if (!actionParam)
70
- return;
71
- try {
72
- sessionStorage.setItem('exploreLastTag', actionParam);
73
- sessionStorage.setItem('exploreLastAnchor', actionParam);
74
- }
75
- catch { }
76
- this.markSelectedTag(actionParam);
77
- this.scrollToSection(actionParam);
78
- }
79
- scrollToSection(id, attemptsLeft = 15, delayMs = 200) {
80
- const sectionEl = document.getElementById(id);
81
- if (!sectionEl) {
82
- if (attemptsLeft <= 0)
83
- return;
84
- setTimeout(() => this.scrollToSection(id, attemptsLeft - 1, delayMs), delayMs);
85
- return;
86
- }
87
- const container = this.resolveScrollContainer();
88
- const offset = document.querySelector('.tags-row--can-fix') ? 140 : 180;
89
- const isPage = container === document.documentElement ||
90
- container === document.body ||
91
- container === document.scrollingElement;
92
- TagsRowTagComponent.isScrollingToSection = true;
93
- if (isPage) {
94
- const top = sectionEl.getBoundingClientRect().top + window.scrollY - offset;
95
- window.scrollTo({ top, behavior: 'smooth' });
96
- }
97
- else if (container) {
98
- const top = sectionEl.getBoundingClientRect().top - container.getBoundingClientRect().top + container.scrollTop - offset;
99
- container.scrollTo({ top, behavior: 'smooth' });
100
- }
101
- setTimeout(() => {
102
- TagsRowTagComponent.isScrollingToSection = false;
103
- this.markSelectedTag(id);
104
- }, 700);
105
- }
106
- selectFirstTagAsDefault() {
107
- requestAnimationFrame(() => {
108
- if (TagsRowTagComponent.activeId)
109
- return;
110
- try {
111
- const savedTag = sessionStorage.getItem('exploreLastTag');
112
- if (savedTag) {
113
- this.markSelectedTag(savedTag);
114
- return;
115
- }
116
- // Se há um anchor pendente, aguarda o spy detectar a seção correta após o scroll
117
- // para evitar selecionar a primeira tag e depois a certa (flash visual)
118
- const hasPendingAnchor = !!sessionStorage.getItem('exploreLastAnchor');
119
- if (hasPendingAnchor)
120
- return;
121
- }
122
- catch { }
123
- const firstTag = document.querySelector('.row-tag[data-tag]');
124
- const firstTagId = firstTag?.getAttribute('data-tag');
125
- if (firstTagId) {
126
- this.markSelectedTag(firstTagId);
127
- }
128
- });
129
- }
130
- syncSelectionState() {
131
- const dataTag = this.tagElementRef?.nativeElement?.getAttribute('data-tag');
132
- if (!dataTag)
133
- return;
134
- if (TagsRowTagComponent.activeId && TagsRowTagComponent.activeId === dataTag) {
135
- this.tagElementRef.nativeElement.classList.add('row-tag--selected');
136
- }
137
- else {
138
- this.tagElementRef.nativeElement.classList.remove('row-tag--selected');
139
- }
140
- }
141
- applyLabelElement(element) {
142
- if (element.textColor) {
143
- const color = colorMapping[element.textColor];
144
- this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'color', color);
145
- }
146
- const textStyleMappingFontSize = this.fontSizeMappingService.getMapping();
147
- if (element.textStyle) {
148
- const fontSize = textStyleMappingFontSize[element.textStyle];
149
- const lineHeight = textStyleMappingLineHeight[element.textStyle];
150
- this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'font-size', fontSize);
151
- this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'line-height', lineHeight);
152
- }
153
- }
154
- initScrollSpyOnce() {
155
- // Already subscribed
156
- if (TagsRowTagComponent.scrollSpySub) {
157
- const currentContainer = this.resolveScrollContainer();
158
- const stale = !TagsRowTagComponent.scrollSpyContainer?.isConnected || (currentContainer && TagsRowTagComponent.scrollSpyContainer !== currentContainer);
159
- if (!stale)
160
- return;
161
- try {
162
- TagsRowTagComponent.scrollSpySub.unsubscribe();
163
- }
164
- catch { }
165
- TagsRowTagComponent.scrollSpySub = null;
166
- TagsRowTagComponent.scrollSpy$ = null;
167
- TagsRowTagComponent.scrollSpyContainer = null;
168
- TagsRowTagComponent.scrollSpyInitialized = false;
169
- }
170
- // Ensure container exists; TagComponent can render before the scroll container is in the DOM.
171
- const containerExists = !!this.resolveScrollContainer();
172
- if (!containerExists) {
173
- TagsRowTagComponent.scrollSpyInitTries++;
174
- if (TagsRowTagComponent.scrollSpyInitTries <= 30) {
175
- requestAnimationFrame(() => this.initScrollSpyOnce());
176
- }
177
- else {
178
- console.warn('[TagComponent] ScrollSpy: .scrollable-container not found after retries');
179
- }
180
- return;
181
- }
182
- try {
183
- TagsRowTagComponent.scrollSpyInitialized = true;
184
- const currentContainer = this.resolveScrollContainer();
185
- TagsRowTagComponent.scrollSpy$ = this.scrollSpy.observeActiveId({
186
- container: currentContainer,
187
- anchorSelector: '[data-anchor-target], .column[id]',
188
- getOffsetTop: () => (document.querySelector('.tags-row--can-fix') ? 140 : 180),
189
- resolveId: (anchor) => {
190
- const section = anchor.closest('[data-anchor-target]');
191
- if (section?.id)
192
- return section.id;
193
- if (anchor.id)
194
- return anchor.id;
195
- return anchor.closest('[id]')?.id || null;
196
- },
197
- debug: false,
198
- });
199
- TagsRowTagComponent.scrollSpyContainer = currentContainer;
200
- TagsRowTagComponent.scrollSpySub = TagsRowTagComponent.scrollSpy$.subscribe({
201
- next: (activeId) => {
202
- if (TagsRowTagComponent.isScrollingToSection)
203
- return;
204
- if (!activeId) {
205
- if (!TagsRowTagComponent.activeId) {
206
- this.selectFirstTagAsDefault();
207
- }
208
- return;
209
- }
210
- // Salva anchor e tag no sessionStorage para restaurar posição ao voltar
211
- try {
212
- sessionStorage.setItem('exploreLastAnchor', activeId);
213
- sessionStorage.setItem('exploreLastTag', activeId);
214
- }
215
- catch { }
216
- this.markSelectedTag(activeId);
217
- },
218
- error: (err) => {
219
- console.error('[TagComponent] ScrollSpy subscription error', err);
220
- },
221
- });
222
- }
223
- catch (e) {
224
- console.error('[TagComponent] ScrollSpy init failed', e);
225
- }
226
- }
227
- resolveScrollContainer() {
228
- const explicit = document.querySelector('.scrollable-container');
229
- if (explicit && explicit.scrollHeight > explicit.clientHeight) {
230
- return explicit;
231
- }
232
- const anchorSample = document.querySelector('.column[id]') ||
233
- document.querySelector('[data-anchor-target]');
234
- if (anchorSample) {
235
- return this.scrollSpy.getScrollParent(anchorSample);
236
- }
237
- return document.scrollingElement || document.documentElement;
238
- }
239
- ensureTagVisible(tagEl) {
240
- // Double RAF: garante que o layout esteja estabilizado antes de calcular os rects
241
- requestAnimationFrame(() => {
242
- requestAnimationFrame(() => {
243
- tagEl.scrollIntoView({ behavior: 'auto', block: 'nearest', inline: 'nearest' });
244
- });
245
- });
246
- }
247
- ngOnDestroy() {
248
- this.destroy$.next();
249
- this.destroy$.complete();
250
- TagsRowTagComponent.instanceCount--;
251
- if (TagsRowTagComponent.instanceCount <= 0) {
252
- // Reset completo: garante inicialização limpa na próxima visita ao Explorar
253
- TagsRowTagComponent.instanceCount = 0;
254
- TagsRowTagComponent.activeId = null;
255
- TagsRowTagComponent.scrollSpyInitTries = 0;
256
- TagsRowTagComponent.scrollSpyInitialized = false;
257
- try {
258
- TagsRowTagComponent.scrollSpySub?.unsubscribe();
259
- }
260
- catch { }
261
- TagsRowTagComponent.scrollSpySub = null;
262
- TagsRowTagComponent.scrollSpy$ = null;
263
- TagsRowTagComponent.scrollSpyContainer = null;
264
- }
265
- }
266
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagsRowTagComponent, deps: [{ token: 'uiComponent' }, { token: i0.Renderer2 }, { token: i1.FontSizeMappingService }, { token: i2.ScrollSpyService }], target: i0.ɵɵFactoryTarget.Component }); }
267
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TagsRowTagComponent, isStandalone: false, selector: "edm-sdui-tags-row-tag", viewQueries: [{ propertyName: "tagElementRef", first: true, predicate: ["tagElement"], descendants: true }, { propertyName: "tagNameElementRef", first: true, predicate: ["tagNameElement"], descendants: true }], ngImport: i0, template: "<div class=\"row-tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\" (click)=\"onTagClick()\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>\n", styles: [":host{display:contents}.row-tag{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1.5px solid var(--tag-explorer-aux);cursor:pointer;font-size:16px;flex-shrink:0}.row-tag:hover{background-color:var(--bt-tag-explorer-on)}.row-tag--selected{border-color:var(--tag-explorer-highlight);background-color:var(--bt-tag-explorer-on);background-origin:border-box}.tag-name{font-weight:600;color:var(--font-bt-tag-explorer-on);font-size:15px;line-height:17.25px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.UIViewDirective, selector: "[edmSduiView]", inputs: ["edmSduiView", "disableClick"] }] }); }
268
- }
269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagsRowTagComponent, decorators: [{
270
- type: Component,
271
- args: [{ standalone: false, selector: 'edm-sdui-tags-row-tag', template: "<div class=\"row-tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\" (click)=\"onTagClick()\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>\n", styles: [":host{display:contents}.row-tag{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1.5px solid var(--tag-explorer-aux);cursor:pointer;font-size:16px;flex-shrink:0}.row-tag:hover{background-color:var(--bt-tag-explorer-on)}.row-tag--selected{border-color:var(--tag-explorer-highlight);background-color:var(--bt-tag-explorer-on);background-origin:border-box}.tag-name{font-weight:600;color:var(--font-bt-tag-explorer-on);font-size:15px;line-height:17.25px}\n"] }]
272
- }], ctorParameters: () => [{ type: undefined, decorators: [{
273
- type: Inject,
274
- args: ['uiComponent']
275
- }] }, { type: i0.Renderer2 }, { type: i1.FontSizeMappingService }, { type: i2.ScrollSpyService }], propDecorators: { tagElementRef: [{
276
- type: ViewChild,
277
- args: ['tagElement']
278
- }], tagNameElementRef: [{
279
- type: ViewChild,
280
- args: ['tagNameElement']
281
- }] } });
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2R1aS9zcmMvbGliL2NvbXBvbmVudHMvdWljb21wb25lbnQvdGFncy1yb3cvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NkdWkvc3JjL2xpYi9jb21wb25lbnRzL3VpY29tcG9uZW50L3RhZ3Mtcm93L3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBcUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDOUUsT0FBTyxFQUErQiwwQkFBMEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzlILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRzdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2hGLE9BQU8sRUFBYyxPQUFPLEVBQTJCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFRcEUsTUFBTSxPQUFPLG1CQUFtQjthQUlmLHlCQUFvQixHQUFHLEtBQUssQUFBUixDQUFTO2FBQzdCLGVBQVUsR0FBcUMsSUFBSSxBQUF6QyxDQUEwQzthQUNwRCxpQkFBWSxHQUF3QixJQUFJLEFBQTVCLENBQTZCO2FBQ3pDLHVCQUFrQixHQUFHLENBQUMsQUFBSixDQUFLO2FBQ3ZCLHVCQUFrQixHQUF1QixJQUFJLEFBQTNCLENBQTRCO2FBQzlDLGFBQVEsR0FBa0IsSUFBSSxBQUF0QixDQUF1QjthQUMvQix5QkFBb0IsR0FBRyxLQUFLLEFBQVIsQ0FBUzthQUM3QixrQkFBYSxHQUFHLENBQUMsQUFBSixDQUFLO0lBRWpDLFlB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QUNqRCxJQUFJLENBQUM7Z0JBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7WUFDakUsbUJBQW1CLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN4QyxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3RDLG1CQUFtQixDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQzsrR0F2UlUsbUJBQW1CLGtCQWNwQixhQUFhO21HQWRaLG1CQUFtQixxU0NqQmhDLGdPQUdBOzs0RkRjYSxtQkFBbUI7a0JBTi9CLFNBQVM7aUNBR0ksS0FBSyxZQUNQLHVCQUF1Qjs7MEJBZ0I5QixNQUFNOzJCQUFDLGFBQWE7cUlBYkUsYUFBYTtzQkFBckMsU0FBUzt1QkFBQyxZQUFZO2dCQUNNLGlCQUFpQjtzQkFBN0MsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvdWljb21wb3NpdGlvbi9tb2RlbHMvdWljb21wb25lbnRcIjtcbmltcG9ydCB7IFVJRWxlbWVudCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlL3VpY29tcG9zaXRpb24vbW9kZWxzL3VpZWxlbWVudFwiO1xuaW1wb3J0IHsgY29sb3JNYXBwaW5nIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvdWl0aGVtZS9tYXBwaW5nL2NvbG9yLW1hcHBpbmdcIjtcbmltcG9ydCB7IGdldFRleHRTdHlsZU1hcHBpbmdGb250U2l6ZSwgdGV4dFN0eWxlTWFwcGluZ0xpbmVIZWlnaHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvdGV4dC1zdHlsZS1tYXBwaW5nXCI7XG5pbXBvcnQgeyBGb250U2l6ZU1hcHBpbmdTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMvZm9udC1zaXplLW1hcHBpbmcuc2VydmljZVwiO1xuaW1wb3J0IHsgVUlTaXplIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvdWl0aGVtZS9lbnVtcy91aXNpemVcIjtcbmltcG9ydCB7IHNpemVNYXBwaW5nSGVpZ2h0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvdWl0aGVtZS9tYXBwaW5nL3NpemUtbWFwcGluZ1wiO1xuaW1wb3J0IHsgU2Nyb2xsU3B5U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3Njcm9sbC1zcHkuc2VydmljZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc3R5bGVVcmw6ICcuL3RhZy5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdlZG0tc2R1aS10YWdzLXJvdy10YWcnLFxufSlcbmV4cG9ydCBjbGFzcyBUYWdzUm93VGFnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCd0YWdFbGVtZW50JykgdGFnRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0YWdOYW1lRWxlbWVudCcpIHRhZ05hbWVFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHN0YXRpYyBzY3JvbGxTcHlJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBzY3JvbGxTcHkkOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweUluaXRUcmllcyA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aXZlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBpc1Njcm9sbGluZ1RvU2VjdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZUNvdW50ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCd1aUNvbXBvbmVudCcpIHB1YmxpYyB1aUNvbXBvbmVudDogVUlDb21wb25lbnQsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZm9udFNpemVNYXBwaW5nU2VydmljZTogRm9udFNpemVNYXBwaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHNjcm9sbFNweTogU2Nyb2xsU3B5U2VydmljZVxuICApIHtcbiAgICBUYWdzUm93VGFnQ29tcG9uZW50Lmluc3RhbmNlQ291bnQrKztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudWlDb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgdGhpcy5hcHBseUVsZW1lbnQodGhpcy51aUNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgIHRoaXMuYXBwbHlMYWJlbEVsZW1lbnQodGhpcy51aUNvbXBvbmVudC5lbGVtZW50KTtcblxuICAgICAgLy8gTWFwOiB0YWcuYWN0aW9uLnBhcmFtIC0+IHNlY3Rpb24gZGl2IGlkXG4gICAgICBjb25zdCBhY3Rpb25QYXJhbSA9ICh0aGlzLnVpQ29tcG9uZW50Py5lbGVtZW50IGFzIGFueSk/LmFjdGlvbj8ucGFyYW07XG4gICAgICBpZiAoYWN0aW9uUGFyYW0gIT0gbnVsbCAmJiB0aGlzLnRhZ0VsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy50YWdFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkYXRhLXRhZycsIFN0cmluZyhhY3Rpb25QYXJhbSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbVGFnQ29tcG9uZW50XSB0YWcgd2l0aG91dCBhY3Rpb24ucGFyYW0nLCB0aGlzLnVpQ29tcG9uZW50Py5lbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhcGxpY2Egc2VsZcOnw6NvIHNlIGVzdGUgdGFnIGNvcnJlc3BvbmRlIGFvIGF0aXZvIGF0dWFsLlxuICAgICAgdGhpcy5zeW5jU2VsZWN0aW9uU3RhdGUoKTtcblxuICAgICAgLy8gSU1QT1JUQU5UOiBUYWdzUm93VGFnQ29tcG9uZW50IHJlbmRlcnMgb25jZSBwZXIgdGFnLlxuICAgICAgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgc2Nyb2xsIG9ic2VydmVyIG9ubHkgb25jZSwgYnV0IHdlIE1VU1QgTk9UIHRpZSBpdCB0byB0aGUgZmlyc3QgaW5zdGFuY2UgbGlmZWN5Y2xlLFxuICAgICAgLy8gYmVjYXVzZSB0aGUgZmlyc3QgaW5zdGFuY2UgbWF5IGJlIGRlc3Ryb3llZCAoZS5nLiByZXJlbmRlcikgYW5kIHRoZSBzdWJzY3JpcHRpb24gd291bGQgZGllLlxuICAgICAgdGhpcy5pbml0U2Nyb2xsU3B5T25jZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFbGVtZW50KGVsZW1lbnQ6IFVJRWxlbWVudCkge1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2VsZWN0ZWRUYWcoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucm93LXRhZycpKTtcbiAgICBjb25zdCBkYXRhVGFncyA9IHRhZ3MubWFwKHQgPT4gdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnJykpO1xuICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuYWN0aXZlSWQgPSBpZDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGFncykgdC5jbGFzc0xpc3QucmVtb3ZlKCdyb3ctdGFnLS1zZWxlY3RlZCcpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAucm93LXRhZ1tkYXRhLXRhZz1cIiR7Q1NTLmVzY2FwZShpZCl9XCJdYCk7XG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1RhZ0NvbXBvbmVudF0gYWN0aXZlIHRhZyBub3QgZm91bmQgZm9yIGlkJywgaWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhY3RpdmUuY2xhc3NMaXN0LmFkZCgncm93LXRhZy0tc2VsZWN0ZWQnKTtcbiAgICB0aGlzLmVuc3VyZVRhZ1Zpc2libGUoYWN0aXZlKTtcbiAgfVxuXG4gIG9uVGFnQ2xpY2soKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aW9uUGFyYW0gPSB0aGlzLnRhZ0VsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnZGF0YS10YWcnKTtcbiAgICBpZiAoIWFjdGlvblBhcmFtKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXhwbG9yZUxhc3RUYWcnLCBhY3Rpb25QYXJhbSk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdleHBsb3JlTGFzdEFuY2hvcicsIGFjdGlvblBhcmFtKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0aGlzLm1hcmtTZWxlY3RlZFRhZyhhY3Rpb25QYXJhbSk7XG4gICAgdGhpcy5zY3JvbGxUb1NlY3Rpb24oYWN0aW9uUGFyYW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb1NlY3Rpb24oaWQ6IHN0cmluZywgYXR0ZW1wdHNMZWZ0ID0gMTUsIGRlbGF5TXMgPSAyMDApOiB2b2lkIHtcbiAgICBjb25zdCBzZWN0aW9uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICBpZiAoIXNlY3Rpb25FbCkge1xuICAgICAgaWYgKGF0dGVtcHRzTGVmdCA8PSAwKSByZXR1cm47XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWN0aW9uKGlkLCBhdHRlbXB0c0xlZnQgLSAxLCBkZWxheU1zKSwgZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5yZXNvbHZlU2Nyb2xsQ29udGFpbmVyKCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhZ3Mtcm93LS1jYW4tZml4JykgPyAxNDAgOiAxODA7XG4gICAgY29uc3QgaXNQYWdlID1cbiAgICAgIGNvbnRhaW5lciA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICBjb250YWluZXIgPT09IGRvY3VtZW50LmJvZHkgfHxcbiAgICAgIGNvbnRhaW5lciA9PT0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudDtcblxuICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuaXNTY3JvbGxpbmdUb1NlY3Rpb24gPSB0cnVlO1xuXG4gICAgaWYgKGlzUGFnZSkge1xuICAgICAgY29uc3QgdG9wID0gc2VjdGlvbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gb2Zmc2V0O1xuICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfSBlbHNlIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IHRvcCA9IHNlY3Rpb25FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgY29udGFpbmVyLnNjcm9sbFRvcCAtIG9mZnNldDtcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxUbyh7IHRvcCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5pc1Njcm9sbGluZ1RvU2VjdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrU2VsZWN0ZWRUYWcoaWQpO1xuICAgIH0sIDcwMCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEZpcnN0VGFnQXNEZWZhdWx0KCk6IHZvaWQge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAoVGFnc1Jvd1RhZ0NvbXBvbmVudC5hY3RpdmVJZCkgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzYXZlZFRhZyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2V4cGxvcmVMYXN0VGFnJyk7XG4gICAgICAgIGlmIChzYXZlZFRhZykge1xuICAgICAgICAgIHRoaXMubWFya1NlbGVjdGVkVGFnKHNhdmVkVGFnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2UgaMOhIHVtIGFuY2hvciBwZW5kZW50ZSwgYWd1YXJkYSBvIHNweSBkZXRlY3RhciBhIHNlw6fDo28gY29ycmV0YSBhcMOzcyBvIHNjcm9sbFxuICAgICAgICAvLyBwYXJhIGV2aXRhciBzZWxlY2lvbmFyIGEgcHJpbWVpcmEgdGFnIGUgZGVwb2lzIGEgY2VydGEgKGZsYXNoIHZpc3VhbClcbiAgICAgICAgY29uc3QgaGFzUGVuZGluZ0FuY2hvciA9ICEhc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZXhwbG9yZUxhc3RBbmNob3InKTtcbiAgICAgICAgaWYgKGhhc1BlbmRpbmdBbmNob3IpIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge31cblxuICAgICAgY29uc3QgZmlyc3RUYWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnJvdy10YWdbZGF0YS10YWddJyk7XG4gICAgICBjb25zdCBmaXJzdFRhZ0lkID0gZmlyc3RUYWc/LmdldEF0dHJpYnV0ZSgnZGF0YS10YWcnKTtcbiAgICAgIGlmIChmaXJzdFRhZ0lkKSB7XG4gICAgICAgIHRoaXMubWFya1NlbGVjdGVkVGFnKGZpcnN0VGFnSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVRhZyA9IHRoaXMudGFnRWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCdkYXRhLXRhZycpO1xuICAgIGlmICghZGF0YVRhZykgcmV0dXJuO1xuICAgIGlmIChUYWdzUm93VGFnQ29tcG9uZW50LmFjdGl2ZUlkICYmIFRhZ3NSb3dUYWdDb21wb25lbnQuYWN0aXZlSWQgPT09IGRhdGFUYWcpIHtcbiAgICAgIHRoaXMudGFnRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jvdy10YWctLXNlbGVjdGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFnRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Jvdy10YWctLXNlbGVjdGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUxhYmVsRWxlbWVudChlbGVtZW50OiBVSUVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC50ZXh0Q29sb3IpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JNYXBwaW5nW2VsZW1lbnQudGV4dENvbG9yXTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWdOYW1lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY29sb3InLCBjb2xvcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dFN0eWxlTWFwcGluZ0ZvbnRTaXplID0gdGhpcy5mb250U2l6ZU1hcHBpbmdTZXJ2aWNlLmdldE1hcHBpbmcoKTtcblxuICAgIGlmIChlbGVtZW50LnRleHRTdHlsZSkge1xuICAgICAgY29uc3QgZm9udFNpemUgPSB0ZXh0U3R5bGVNYXBwaW5nRm9udFNpemVbZWxlbWVudC50ZXh0U3R5bGVdO1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IHRleHRTdHlsZU1hcHBpbmdMaW5lSGVpZ2h0W2VsZW1lbnQudGV4dFN0eWxlXTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMudGFnTmFtZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ2ZvbnQtc2l6ZScsXG4gICAgICAgIGZvbnRTaXplXG4gICAgICApO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ05hbWVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsaW5lLWhlaWdodCcsIGxpbmVIZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNjcm9sbFNweU9uY2UoKTogdm9pZCB7XG4gICAgLy8gQWxyZWFkeSBzdWJzY3JpYmVkXG4gICAgaWYgKFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5U3ViKSB7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gdGhpcy5yZXNvbHZlU2Nyb2xsQ29udGFpbmVyKCk7XG4gICAgICBjb25zdCBzdGFsZSA9ICFUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweUNvbnRhaW5lcj8uaXNDb25uZWN0ZWQgfHwgKGN1cnJlbnRDb250YWluZXIgJiYgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXIgIT09IGN1cnJlbnRDb250YWluZXIpO1xuICAgICAgaWYgKCFzdGFsZSkgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlTdWIgPSBudWxsO1xuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHkkID0gbnVsbDtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5Q29udGFpbmVyID0gbnVsbDtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgY29udGFpbmVyIGV4aXN0czsgVGFnQ29tcG9uZW50IGNhbiByZW5kZXIgYmVmb3JlIHRoZSBzY3JvbGwgY29udGFpbmVyIGlzIGluIHRoZSBET00uXG4gICAgY29uc3QgY29udGFpbmVyRXhpc3RzID0gISF0aGlzLnJlc29sdmVTY3JvbGxDb250YWluZXIoKTtcbiAgICBpZiAoIWNvbnRhaW5lckV4aXN0cykge1xuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlJbml0VHJpZXMrKztcbiAgICAgIGlmIChUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweUluaXRUcmllcyA8PSAzMCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5pbml0U2Nyb2xsU3B5T25jZSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1RhZ0NvbXBvbmVudF0gU2Nyb2xsU3B5OiAuc2Nyb2xsYWJsZS1jb250YWluZXIgbm90IGZvdW5kIGFmdGVyIHJldHJpZXMnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXIgPSB0aGlzLnJlc29sdmVTY3JvbGxDb250YWluZXIoKSE7XG5cbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5JCA9IHRoaXMuc2Nyb2xsU3B5Lm9ic2VydmVBY3RpdmVJZCh7XG4gICAgICAgIGNvbnRhaW5lcjogY3VycmVudENvbnRhaW5lciEsXG4gICAgICAgIGFuY2hvclNlbGVjdG9yOiAnW2RhdGEtYW5jaG9yLXRhcmdldF0sIC5jb2x1bW5baWRdJyxcbiAgICAgICAgZ2V0T2Zmc2V0VG9wOiAoKSA9PiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhZ3Mtcm93LS1jYW4tZml4JykgPyAxNDAgOiAxODApLFxuICAgICAgICByZXNvbHZlSWQ6IChhbmNob3IpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYW5jaG9yLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdbZGF0YS1hbmNob3ItdGFyZ2V0XScpO1xuICAgICAgICAgIGlmIChzZWN0aW9uPy5pZCkgcmV0dXJuIHNlY3Rpb24uaWQ7XG4gICAgICAgICAgaWYgKGFuY2hvci5pZCkgcmV0dXJuIGFuY2hvci5pZDtcbiAgICAgICAgICByZXR1cm4gYW5jaG9yLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdbaWRdJyk/LmlkIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweUNvbnRhaW5lciA9IGN1cnJlbnRDb250YWluZXIhO1xuXG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweVN1YiA9IFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5JC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoYWN0aXZlSWQpID0+IHtcbiAgICAgICAgICBpZiAoVGFnc1Jvd1RhZ0NvbXBvbmVudC5pc1Njcm9sbGluZ1RvU2VjdGlvbikgcmV0dXJuO1xuICAgICAgICAgIGlmICghYWN0aXZlSWQpIHtcbiAgICAgICAgICAgIGlmICghVGFnc1Jvd1RhZ0NvbXBvbmVudC5hY3RpdmVJZCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdEZpcnN0VGFnQXNEZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNhbHZhIGFuY2hvciBlIHRhZyBubyBzZXNzaW9uU3RvcmFnZSBwYXJhIHJlc3RhdXJhciBwb3Npw6fDo28gYW8gdm9sdGFyXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V4cGxvcmVMYXN0QW5jaG9yJywgYWN0aXZlSWQpO1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXhwbG9yZUxhc3RUYWcnLCBhY3RpdmVJZCk7XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgIHRoaXMubWFya1NlbGVjdGVkVGFnKGFjdGl2ZUlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGFnQ29tcG9uZW50XSBTY3JvbGxTcHkgc3Vic2NyaXB0aW9uIGVycm9yJywgZXJyKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWdDb21wb25lbnRdIFNjcm9sbFNweSBpbml0IGZhaWxlZCcsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVNjcm9sbENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGV4cGxpY2l0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNjcm9sbGFibGUtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChleHBsaWNpdCAmJiBleHBsaWNpdC5zY3JvbGxIZWlnaHQgPiBleHBsaWNpdC5jbGllbnRIZWlnaHQpIHtcbiAgICAgIHJldHVybiBleHBsaWNpdDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNob3JTYW1wbGUgPVxuICAgICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2x1bW5baWRdJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSB8fFxuICAgICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFuY2hvci10YXJnZXRdJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKTtcblxuICAgIGlmIChhbmNob3JTYW1wbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcm9sbFNweS5nZXRTY3JvbGxQYXJlbnQoYW5jaG9yU2FtcGxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQpIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVGFnVmlzaWJsZSh0YWdFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBEb3VibGUgUkFGOiBnYXJhbnRlIHF1ZSBvIGxheW91dCBlc3RlamEgZXN0YWJpbGl6YWRvIGFudGVzIGRlIGNhbGN1bGFyIG9zIHJlY3RzXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRhZ0VsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdhdXRvJywgYmxvY2s6ICduZWFyZXN0JywgaW5saW5lOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICBUYWdzUm93VGFnQ29tcG9uZW50Lmluc3RhbmNlQ291bnQtLTtcbiAgICBpZiAoVGFnc1Jvd1RhZ0NvbXBvbmVudC5pbnN0YW5jZUNvdW50IDw9IDApIHtcbiAgICAgIC8vIFJlc2V0IGNvbXBsZXRvOiBnYXJhbnRlIGluaWNpYWxpemHDp8OjbyBsaW1wYSBuYSBwcsOzeGltYSB2aXNpdGEgYW8gRXhwbG9yYXJcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuaW5zdGFuY2VDb3VudCA9IDA7XG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LmFjdGl2ZUlkID0gbnVsbDtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdFRyaWVzID0gMDtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIHRyeSB7IFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5U3ViPy51bnN1YnNjcmliZSgpOyB9IGNhdGNoIHt9XG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweVN1YiA9IG51bGw7XG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweSQgPSBudWxsO1xuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvdy10YWdcIiAjdGFnRWxlbWVudCAqbmdJZj1cInVpQ29tcG9uZW50XCIgW2VkbVNkdWlWaWV3XT1cInVpQ29tcG9uZW50LmVsZW1lbnRcIiAoY2xpY2spPVwib25UYWdDbGljaygpXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJ0YWctbmFtZVwiICN0YWdOYW1lRWxlbWVudD57eyB1aUNvbXBvbmVudC5lbGVtZW50Py5sYWJlbCA/PyAnJyB9fTwvc3Bhbj5cbjwvZGl2PlxuIl19
@@ -1,178 +0,0 @@
1
- import { ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Inject, Injector, Renderer2, ViewChild, } from '@angular/core';
2
- import { UIComponentType } from '../../../core/uicomposition/enums/uicomponent-type';
3
- import { TagsRowTagComponent } from './tag/tag.component';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "../../../directives/uiview.directive";
7
- export class TagsRowComponent {
8
- constructor(uiComponent, injector, hostRef, cdr, renderer) {
9
- this.uiComponent = uiComponent;
10
- this.injector = injector;
11
- this.hostRef = hostRef;
12
- this.cdr = cdr;
13
- this.renderer = renderer;
14
- this.isFixed = false;
15
- this.canFix = false;
16
- this.tagComponent = TagsRowTagComponent;
17
- this.injectorCache = new Map();
18
- }
19
- get tags() {
20
- return this.uiComponent.tags ?? [];
21
- }
22
- trackByLabel(index, tag) {
23
- return tag.label ?? index;
24
- }
25
- createInjector(tag, index) {
26
- const key = this.getTagKey(tag, index);
27
- const cached = this.injectorCache.get(key);
28
- if (cached)
29
- return cached;
30
- const component = {
31
- type: UIComponentType.TAG,
32
- element: tag,
33
- };
34
- const injector = Injector.create({
35
- providers: [{ provide: 'uiComponent', useValue: component }],
36
- parent: this.injector,
37
- });
38
- this.injectorCache.set(key, injector);
39
- return injector;
40
- }
41
- getTagKey(tag, index) {
42
- return tag.label ?? tag?.action?.param ?? index;
43
- }
44
- ngAfterViewInit() {
45
- requestAnimationFrame(() => {
46
- this.measureLayout();
47
- this.updateFixedState();
48
- this.cdr.detectChanges();
49
- // In production, fonts/images/header can change heights after initial paint,
50
- // which shifts the trigger point and causes a visible "jump".
51
- // Observe size changes and re-measure.
52
- const el = this.tagsRowRef?.nativeElement;
53
- if (el && typeof ResizeObserver !== 'undefined') {
54
- this.resizeObserver = new ResizeObserver(() => {
55
- this.measureLayout(true);
56
- this.updateFixedState();
57
- this.cdr.detectChanges();
58
- });
59
- this.resizeObserver.observe(el);
60
- }
61
- });
62
- }
63
- ngOnDestroy() {
64
- this.resizeObserver?.disconnect();
65
- this.resizeObserver = undefined;
66
- document.body.classList.remove('sdui-tags-fixed');
67
- }
68
- onWindowScroll() {
69
- this.updateFixedState();
70
- }
71
- measureLayout(force = false) {
72
- const hostEl = this.hostRef.nativeElement;
73
- const tagsEl = this.tagsRowRef?.nativeElement;
74
- // Height spacer: keep the host reserving space so the content below doesn’t jump
75
- if (tagsEl) {
76
- const h = tagsEl.getBoundingClientRect().height;
77
- if (force ||
78
- !this.lastMeasuredHeight ||
79
- Math.abs(h - this.lastMeasuredHeight) > 0.5) {
80
- this.lastMeasuredHeight = h;
81
- this.hostMinHeight = h;
82
- }
83
- }
84
- // Trigger position: only capture/refresh when not fixed, because fixed changes the rect
85
- if (!this.isFixed) {
86
- const rect = hostEl.getBoundingClientRect();
87
- const docTop = rect.top + window.scrollY;
88
- if (force ||
89
- !this.lastMeasuredDocTop ||
90
- Math.abs(docTop - this.lastMeasuredDocTop) > 0.5) {
91
- this.lastMeasuredDocTop = docTop;
92
- this.initialTop = docTop;
93
- }
94
- }
95
- }
96
- updateFixedState() {
97
- this.measureLayout();
98
- const offset = this.getStickyOffset();
99
- const targetTop = offset;
100
- const triggerPoint = (this.initialTop ?? 0) - offset;
101
- const shouldFix = window.scrollY >= triggerPoint;
102
- this.canFix = shouldFix;
103
- document.body.classList.toggle('sdui-tags-fixed', shouldFix);
104
- if (shouldFix) {
105
- if (!this.isFixed) {
106
- this.isFixed = true;
107
- this.setTagsRowTop(targetTop);
108
- this.cdr.detectChanges();
109
- requestAnimationFrame(() => {
110
- if (this.isFixed) {
111
- this.setTagsRowTop(targetTop);
112
- this.cdr.detectChanges();
113
- }
114
- });
115
- }
116
- else {
117
- this.setTagsRowTop(targetTop);
118
- }
119
- }
120
- else {
121
- this.isFixed = false;
122
- this.setTagsRowTop(undefined);
123
- this.measureLayout(true);
124
- }
125
- }
126
- getStickyOffset() {
127
- // 1) Honour the explicit CSS custom-property if set
128
- const variable = getComputedStyle(document.documentElement).getPropertyValue('--sdui-sticky-offset');
129
- const parsed = parseInt(variable || '', 10);
130
- if (!isNaN(parsed))
131
- return parsed;
132
- // 2) Dynamically measure the fixed app header (nb-layout-header)
133
- // so the tags-row sits right below it regardless of screen size.
134
- const appHeader = document.querySelector('nb-layout-header');
135
- if (appHeader) {
136
- return appHeader.offsetHeight;
137
- }
138
- return 74; // ultimate fallback
139
- }
140
- setTagsRowTop(value) {
141
- const el = this.tagsRowRef?.nativeElement;
142
- if (!el)
143
- return;
144
- if (value === undefined || value === null) {
145
- this.renderer.removeStyle(el, 'top');
146
- this.hostRef.nativeElement.style.removeProperty('--tags-row-bottom');
147
- return;
148
- }
149
- this.renderer.setStyle(el, 'top', `${value}px`);
150
- const height = el.getBoundingClientRect().height;
151
- this.hostRef.nativeElement.style.setProperty('--tags-row-bottom', `${value + height}px`);
152
- }
153
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagsRowComponent, deps: [{ token: 'uiComponent' }, { token: i0.Injector }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
154
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TagsRowComponent, isStandalone: false, selector: "edm-sdui-tags-row", host: { listeners: { "window:scroll": "onWindowScroll()" }, properties: { "class.tags-row--fixed": "this.isFixed", "class.tags-row--can-fix": "this.canFix", "style.min-height.px": "this.hostMinHeight" } }, viewQueries: [{ propertyName: "tagsRowRef", first: true, predicate: ["tagsRowElement"], descendants: true }], ngImport: i0, template: "<div class=\"tags-row\" #tagsRowElement [class.tags-row-fixed]=\"isFixed\" *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <ng-container *ngFor=\"let tag of tags; let i = index; trackBy: trackByLabel\">\n <ng-container\n *ngComponentOutlet=\"tagComponent; injector: createInjector(tag, i)\"\n ></ng-container>\n </ng-container>\n <span class=\"tags-row-spacer\" aria-hidden=\"true\"></span>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;margin-top:var(--sdui-header-margin-top, 12px)}.tags-row{display:flex;flex-wrap:nowrap;align-items:center;gap:8px;padding:6px 0;padding-left:var(--sdui-tags-row-padding-x, 16px);background-color:inherit;justify-content:flex-start;box-sizing:border-box;width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scroll-padding-left:var(--sdui-tags-row-padding-x, 16px);scroll-padding-right:var(--sdui-tags-row-padding-x, 16px);scrollbar-width:none;padding-bottom:8px!important}:host .tags-row>*{flex:0 0 auto}.tags-row-spacer{flex:0 0 var(--sdui-tags-row-padding-x, 16px);min-width:var(--sdui-tags-row-padding-x, 16px);height:1px;pointer-events:none}:host.tags-row--fixed{box-sizing:border-box}:host.tags-row--fixed .tags-row{position:fixed;top:var(--sdui-tags-row-top, 78px);left:var(--sdui-tags-row-left, 32px);right:0;z-index:120;transition:top .16s ease;will-change:top;padding:6px 0;padding-left:var(--sdui-tags-row-padding-x, 16px);padding-right:var(--sdui-tags-row-padding-x, 32px)}@media (max-width: 565px){:host.tags-row--fixed .tags-row{left:var(--sdui-tags-row-left-mobile, 0);top:var(--sdui-tags-row-top-mobile, var(--sdui-tags-row-top, 78px));padding-left:var(--sdui-tags-row-padding-x, 16px);padding-right:var(--sdui-tags-row-padding-x, 32px)}}:host.tags-row--can-fix:before{content:\"\";position:fixed;top:0;left:0;right:0;height:var(--tags-row-bottom, 120px);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);background-color:color-mix(in srgb,var(--bg) 60%,transparent);pointer-events:none;z-index:119}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.UIViewDirective, selector: "[edmSduiView]", inputs: ["edmSduiView", "disableClick"] }] }); }
155
- }
156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagsRowComponent, decorators: [{
157
- type: Component,
158
- args: [{ selector: 'edm-sdui-tags-row', standalone: false, template: "<div class=\"tags-row\" #tagsRowElement [class.tags-row-fixed]=\"isFixed\" *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <ng-container *ngFor=\"let tag of tags; let i = index; trackBy: trackByLabel\">\n <ng-container\n *ngComponentOutlet=\"tagComponent; injector: createInjector(tag, i)\"\n ></ng-container>\n </ng-container>\n <span class=\"tags-row-spacer\" aria-hidden=\"true\"></span>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;margin-top:var(--sdui-header-margin-top, 12px)}.tags-row{display:flex;flex-wrap:nowrap;align-items:center;gap:8px;padding:6px 0;padding-left:var(--sdui-tags-row-padding-x, 16px);background-color:inherit;justify-content:flex-start;box-sizing:border-box;width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scroll-padding-left:var(--sdui-tags-row-padding-x, 16px);scroll-padding-right:var(--sdui-tags-row-padding-x, 16px);scrollbar-width:none;padding-bottom:8px!important}:host .tags-row>*{flex:0 0 auto}.tags-row-spacer{flex:0 0 var(--sdui-tags-row-padding-x, 16px);min-width:var(--sdui-tags-row-padding-x, 16px);height:1px;pointer-events:none}:host.tags-row--fixed{box-sizing:border-box}:host.tags-row--fixed .tags-row{position:fixed;top:var(--sdui-tags-row-top, 78px);left:var(--sdui-tags-row-left, 32px);right:0;z-index:120;transition:top .16s ease;will-change:top;padding:6px 0;padding-left:var(--sdui-tags-row-padding-x, 16px);padding-right:var(--sdui-tags-row-padding-x, 32px)}@media (max-width: 565px){:host.tags-row--fixed .tags-row{left:var(--sdui-tags-row-left-mobile, 0);top:var(--sdui-tags-row-top-mobile, var(--sdui-tags-row-top, 78px));padding-left:var(--sdui-tags-row-padding-x, 16px);padding-right:var(--sdui-tags-row-padding-x, 32px)}}:host.tags-row--can-fix:before{content:\"\";position:fixed;top:0;left:0;right:0;height:var(--tags-row-bottom, 120px);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);background-color:color-mix(in srgb,var(--bg) 60%,transparent);pointer-events:none;z-index:119}\n"] }]
159
- }], ctorParameters: () => [{ type: undefined, decorators: [{
160
- type: Inject,
161
- args: ['uiComponent']
162
- }] }, { type: i0.Injector }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }], propDecorators: { isFixed: [{
163
- type: HostBinding,
164
- args: ['class.tags-row--fixed']
165
- }], canFix: [{
166
- type: HostBinding,
167
- args: ['class.tags-row--can-fix']
168
- }], hostMinHeight: [{
169
- type: HostBinding,
170
- args: ['style.min-height.px']
171
- }], tagsRowRef: [{
172
- type: ViewChild,
173
- args: ['tagsRowElement']
174
- }], onWindowScroll: [{
175
- type: HostListener,
176
- args: ['window:scroll']
177
- }] } });
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZHVpL3NyYy9saWIvY29tcG9uZW50cy91aWNvbXBvbmVudC90YWdzLXJvdy90YWdzLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NkdWkvc3JjL2xpYi9jb21wb25lbnRzL3VpY29tcG9uZW50L3RhZ3Mtcm93L3RhZ3Mtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBRVIsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFckYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFRMUQsTUFBTSxPQUFPLGdCQUFnQjtJQVkzQixZQUNnQyxXQUF3QixFQUM5QyxRQUFrQixFQUNsQixPQUFnQyxFQUNoQyxHQUFzQixFQUN0QixRQUFtQjtRQUpHLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzlDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDaEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWhCUyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2QsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUd2RCxpQkFBWSxHQUFHLG1CQUFtQixDQUFDO1FBQzNCLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFZMUQsQ0FBQztJQUVKLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FB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c0JBQTdDLFdBQVc7dUJBQUMseUJBQXlCO2dCQUNGLGFBQWE7c0JBQWhELFdBQVc7dUJBQUMscUJBQXFCO2dCQUNMLFVBQVU7c0JBQXRDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQTBFM0IsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVJQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS91aWNvbXBvc2l0aW9uL21vZGVscy91aWNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFVJQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdWljb21wb3NpdGlvbi9lbnVtcy91aWNvbXBvbmVudC10eXBlJztcbmltcG9ydCB7IFVJVGFnIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91aWNvbXBvc2l0aW9uL21vZGVscy91aXRhZyc7XG5pbXBvcnQgeyBUYWdzUm93VGFnQ29tcG9uZW50IH0gZnJvbSAnLi90YWcvdGFnLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2VkbS1zZHVpLXRhZ3Mtcm93JyxcbiAgc3R5bGVVcmw6ICcuL3RhZ3Mtcm93LmNvbXBvbmVudC5zY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZ3Mtcm93LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIFRhZ3NSb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRhZ3Mtcm93LS1maXhlZCcpIGlzRml4ZWQgPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy50YWdzLXJvdy0tY2FuLWZpeCcpIGNhbkZpeCA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLm1pbi1oZWlnaHQucHgnKSBob3N0TWluSGVpZ2h0PzogbnVtYmVyO1xuICBAVmlld0NoaWxkKCd0YWdzUm93RWxlbWVudCcpIHRhZ3NSb3dSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgdGFnQ29tcG9uZW50ID0gVGFnc1Jvd1RhZ0NvbXBvbmVudDtcbiAgcHJpdmF0ZSBpbmplY3RvckNhY2hlID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIEluamVjdG9yPigpO1xuICBwcml2YXRlIGluaXRpYWxUb3A/OiBudW1iZXI7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBsYXN0TWVhc3VyZWRIZWlnaHQ/OiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdE1lYXN1cmVkRG9jVG9wPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ3VpQ29tcG9uZW50JykgcHVibGljIHVpQ29tcG9uZW50OiBVSUNvbXBvbmVudCxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge31cblxuICBnZXQgdGFncygpOiBVSVRhZ1tdIHtcbiAgICByZXR1cm4gdGhpcy51aUNvbXBvbmVudC50YWdzID8/IFtdO1xuICB9XG5cbiAgdHJhY2tCeUxhYmVsKGluZGV4OiBudW1iZXIsIHRhZzogVUlUYWcpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiB0YWcubGFiZWwgPz8gaW5kZXg7XG4gIH1cblxuICBjcmVhdGVJbmplY3Rvcih0YWc6IFVJVGFnLCBpbmRleDogbnVtYmVyKTogSW5qZWN0b3Ige1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0VGFnS2V5KHRhZywgaW5kZXgpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuaW5qZWN0b3JDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgY29uc3QgY29tcG9uZW50OiBVSUNvbXBvbmVudCA9IHtcbiAgICAgIHR5cGU6IFVJQ29tcG9uZW50VHlwZS5UQUcsXG4gICAgICBlbGVtZW50OiB0YWcsXG4gICAgfTtcblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogJ3VpQ29tcG9uZW50JywgdXNlVmFsdWU6IGNvbXBvbmVudCB9XSxcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICB9KTtcbiAgICB0aGlzLmluamVjdG9yQ2FjaGUuc2V0KGtleSwgaW5qZWN0b3IpO1xuICAgIHJldHVybiBpbmplY3RvcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFnS2V5KHRhZzogVUlUYWcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiB0YWcubGFiZWwgPz8gKHRhZyBhcyBhbnkpPy5hY3Rpb24/LnBhcmFtID8/IGluZGV4O1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLm1lYXN1cmVMYXlvdXQoKTtcbiAgICAgIHRoaXMudXBkYXRlRml4ZWRTdGF0ZSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAvLyBJbiBwcm9kdWN0aW9uLCBmb250cy9pbWFnZXMvaGVhZGVyIGNhbiBjaGFuZ2UgaGVpZ2h0cyBhZnRlciBpbml0aWFsIHBhaW50LFxuICAgICAgLy8gd2hpY2ggc2hpZnRzIHRoZSB0cmlnZ2VyIHBvaW50IGFuZCBjYXVzZXMgYSB2aXNpYmxlIFwianVtcFwiLlxuICAgICAgLy8gT2JzZXJ2ZSBzaXplIGNoYW5nZXMgYW5kIHJlLW1lYXN1cmUuXG4gICAgICBjb25zdCBlbCA9IHRoaXMudGFnc1Jvd1JlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChlbCAmJiB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWVhc3VyZUxheW91dCh0cnVlKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpeGVkU3RhdGUoKTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzZHVpLXRhZ3MtZml4ZWQnKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUZpeGVkU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZUxheW91dChmb3JjZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdEVsID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGFnc0VsID0gdGhpcy50YWdzUm93UmVmPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gSGVpZ2h0IHNwYWNlcjoga2VlcCB0aGUgaG9zdCByZXNlcnZpbmcgc3BhY2Ugc28gdGhlIGNvbnRlbnQgYmVsb3cgZG9lc27igJl0IGp1bXBcbiAgICBpZiAodGFnc0VsKSB7XG4gICAgICBjb25zdCBoID0gdGFnc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgIGlmIChcbiAgICAgICAgZm9yY2UgfHxcbiAgICAgICAgIXRoaXMubGFzdE1lYXN1cmVkSGVpZ2h0IHx8XG4gICAgICAgIE1hdGguYWJzKGggLSB0aGlzLmxhc3RNZWFzdXJlZEhlaWdodCkgPiAwLjVcbiAgICAgICkge1xuICAgICAgICB0aGlzLmxhc3RNZWFzdXJlZEhlaWdodCA9IGg7XG4gICAgICAgIHRoaXMuaG9zdE1pbkhlaWdodCA9IGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBwb3NpdGlvbjogb25seSBjYXB0dXJlL3JlZnJlc2ggd2hlbiBub3QgZml4ZWQsIGJlY2F1c2UgZml4ZWQgY2hhbmdlcyB0aGUgcmVjdFxuICAgIGlmICghdGhpcy5pc0ZpeGVkKSB7XG4gICAgICBjb25zdCByZWN0ID0gaG9zdEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgZG9jVG9wID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgIGlmIChcbiAgICAgICAgZm9yY2UgfHxcbiAgICAgICAgIXRoaXMubGFzdE1lYXN1cmVkRG9jVG9wIHx8XG4gICAgICAgIE1hdGguYWJzKGRvY1RvcCAtIHRoaXMubGFzdE1lYXN1cmVkRG9jVG9wKSA+IDAuNVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubGFzdE1lYXN1cmVkRG9jVG9wID0gZG9jVG9wO1xuICAgICAgICB0aGlzLmluaXRpYWxUb3AgPSBkb2NUb3A7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaXhlZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMubWVhc3VyZUxheW91dCgpO1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5nZXRTdGlja3lPZmZzZXQoKTtcbiAgICBjb25zdCB0YXJnZXRUb3AgPSBvZmZzZXQ7XG4gICAgY29uc3QgdHJpZ2dlclBvaW50ID0gKHRoaXMuaW5pdGlhbFRvcCA/PyAwKSAtIG9mZnNldDtcbiAgICBjb25zdCBzaG91bGRGaXggPSB3aW5kb3cuc2Nyb2xsWSA+PSB0cmlnZ2VyUG9pbnQ7XG4gICAgdGhpcy5jYW5GaXggPSBzaG91bGRGaXg7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdzZHVpLXRhZ3MtZml4ZWQnLCBzaG91bGRGaXgpO1xuICAgIGlmIChzaG91bGRGaXgpIHtcbiAgICAgIGlmICghdGhpcy5pc0ZpeGVkKSB7XG4gICAgICAgIHRoaXMuaXNGaXhlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0VGFnc1Jvd1RvcCh0YXJnZXRUb3ApO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNGaXhlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRUYWdzUm93VG9wKHRhcmdldFRvcCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0VGFnc1Jvd1RvcCh0YXJnZXRUb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRml4ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0VGFnc1Jvd1RvcCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5tZWFzdXJlTGF5b3V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RpY2t5T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgLy8gMSkgSG9ub3VyIHRoZSBleHBsaWNpdCBDU1MgY3VzdG9tLXByb3BlcnR5IGlmIHNldFxuICAgIGNvbnN0IHZhcmlhYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICApLmdldFByb3BlcnR5VmFsdWUoJy0tc2R1aS1zdGlja3ktb2Zmc2V0Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFyaWFibGUgfHwgJycsIDEwKTtcbiAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHJldHVybiBwYXJzZWQ7XG5cbiAgICAvLyAyKSBEeW5hbWljYWxseSBtZWFzdXJlIHRoZSBmaXhlZCBhcHAgaGVhZGVyIChuYi1sYXlvdXQtaGVhZGVyKVxuICAgIC8vICAgIHNvIHRoZSB0YWdzLXJvdyBzaXRzIHJpZ2h0IGJlbG93IGl0IHJlZ2FyZGxlc3Mgb2Ygc2NyZWVuIHNpemUuXG4gICAgY29uc3QgYXBwSGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ25iLWxheW91dC1oZWFkZXInKTtcbiAgICBpZiAoYXBwSGVhZGVyKSB7XG4gICAgICByZXR1cm4gYXBwSGVhZGVyLm9mZnNldEhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gNzQ7IC8vIHVsdGltYXRlIGZhbGxiYWNrXG4gIH1cblxuICBwcml2YXRlIHNldFRhZ3NSb3dUb3AodmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMudGFnc1Jvd1JlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsICd0b3AnKTtcbiAgICAgIHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLXRhZ3Mtcm93LWJvdHRvbScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsLCAndG9wJywgYCR7dmFsdWV9cHhgKTtcbiAgICBjb25zdCBoZWlnaHQgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAnLS10YWdzLXJvdy1ib3R0b20nLFxuICAgICAgYCR7dmFsdWUgKyBoZWlnaHR9cHhgLFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWdzLXJvd1wiICN0YWdzUm93RWxlbWVudCBbY2xhc3MudGFncy1yb3ctZml4ZWRdPVwiaXNGaXhlZFwiICpuZ0lmPVwidWlDb21wb25lbnRcIiBbZWRtU2R1aVZpZXddPVwidWlDb21wb25lbnQuZWxlbWVudFwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwidGFnQ29tcG9uZW50OyBpbmplY3RvcjogY3JlYXRlSW5qZWN0b3IodGFnLCBpKVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPHNwYW4gY2xhc3M9XCJ0YWdzLXJvdy1zcGFjZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG48L2Rpdj5cbiJdfQ==