structra-ui 0.1.3 → 0.1.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 (296) hide show
  1. package/README.md +59 -6
  2. package/app/_utils/date-pt-br.utils.d.ts +24 -0
  3. package/app/_utils/decimal-br.utils.d.ts +52 -0
  4. package/app/_utils/estados-br.data.d.ts +10 -0
  5. package/app/_utils/integer-br.utils.d.ts +17 -0
  6. package/app/_utils/integer-value.utils.d.ts +5 -0
  7. package/app/_utils/scroll/body-scroll-lock.util.d.ts +22 -0
  8. package/app/app-shell/_models/breadcrumb-item.model.d.ts +13 -0
  9. package/app/app-shell/app-shell-sidebar-template.directive.d.ts +19 -0
  10. package/app/app-shell/app-shell.component.d.ts +41 -0
  11. package/app/app-shell/breadcrumb/breadcrumb.component.d.ts +10 -0
  12. package/app/app-shell/index.d.ts +19 -0
  13. package/app/app-shell/sidebar/app-sidebar-toolbar.directive.d.ts +14 -0
  14. package/app/app-shell/sidebar/shell-sidebar-toggle.component.d.ts +19 -0
  15. package/app/app-shell/sidebar/sidebar.component.d.ts +36 -0
  16. package/app/app-shell/sidebar-reveal.constants.d.ts +8 -0
  17. package/app/app-shell/topbar/topbar.component.d.ts +8 -0
  18. package/app/app-shell/user-menu/user-menu.component.d.ts +25 -0
  19. package/app/buttons/base-button/base-button.component.d.ts +43 -0
  20. package/app/buttons/index.d.ts +1 -0
  21. package/app/data-display/_models/card-item-view.model.d.ts +8 -0
  22. package/app/data-display/_models/data-display.models.d.ts +11 -0
  23. package/app/data-display/_models/data-grid-column.model.d.ts +13 -0
  24. package/app/data-display/_models/index.d.ts +2 -0
  25. package/app/data-display/adaptive-data-view/adaptive-data-view.component.d.ts +53 -0
  26. package/app/data-display/card-list/card-list.component.d.ts +70 -0
  27. package/app/data-display/dashboard-section/dashboard-section.component.d.ts +12 -0
  28. package/app/data-display/data-card/data-card.component.d.ts +16 -0
  29. package/app/data-display/data-grid/data-grid-actions-cell-renderer.component.d.ts +21 -0
  30. package/app/data-display/data-grid/data-grid.component.d.ts +76 -0
  31. package/app/data-display/data-list/data-list.component.d.ts +18 -0
  32. package/app/data-display/data-toolbar/data-toolbar.component.d.ts +6 -0
  33. package/app/data-display/details-field/details-field.component.d.ts +10 -0
  34. package/app/data-display/details-view/details-view.component.d.ts +26 -0
  35. package/app/data-display/empty-state/empty-state-overlay.util.d.ts +5 -0
  36. package/app/data-display/empty-state/empty-state.component.d.ts +13 -0
  37. package/app/data-display/index.d.ts +20 -0
  38. package/app/data-display/list-item/list-item.component.d.ts +22 -0
  39. package/app/data-display/stat-card/stat-card.component.d.ts +23 -0
  40. package/app/data-display/status-badge/status-badge.component.d.ts +17 -0
  41. package/app/data-display/table-empty-state/table-empty-state.component.d.ts +14 -0
  42. package/app/data-display/table-toolbar/table-toolbar.component.d.ts +11 -0
  43. package/app/dialogs/_models/lib-dialog-size.model.d.ts +6 -0
  44. package/app/dialogs/_utils/lib-dialog-panel-classes.d.ts +3 -0
  45. package/app/dialogs/app-dialog/app-dialog.component.d.ts +52 -0
  46. package/app/dialogs/app-dialog/dialog-footer.directive.d.ts +6 -0
  47. package/app/dialogs/confirm-dialog/confirm-dialog-data.model.d.ts +13 -0
  48. package/app/dialogs/confirm-dialog/confirm-dialog.component.d.ts +20 -0
  49. package/app/dialogs/confirm-dialog/confirm-dialog.service.d.ts +17 -0
  50. package/app/dialogs/index.d.ts +13 -0
  51. package/app/dialogs/loading-dialog/loading-dialog-data.model.d.ts +7 -0
  52. package/app/dialogs/loading-dialog/loading-dialog.component.d.ts +9 -0
  53. package/app/dialogs/loading-dialog/loading-dialog.service.d.ts +15 -0
  54. package/app/dialogs/toast/toast-host.component.d.ts +13 -0
  55. package/app/dialogs/toast/toast.models.d.ts +26 -0
  56. package/app/dialogs/toast/toast.service.d.ts +17 -0
  57. package/app/fields/checkbox-fields/_base/boolean-field.directive.d.ts +42 -0
  58. package/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.d.ts +8 -0
  59. package/app/fields/checkbox-fields/index.d.ts +3 -0
  60. package/app/fields/checkbox-fields/switch-field/switch-field.component.d.ts +8 -0
  61. package/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.d.ts +62 -0
  62. package/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.d.ts +40 -0
  63. package/app/fields/dropdown-fields/_base/dropdown-option-field.base.d.ts +47 -0
  64. package/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.d.ts +18 -0
  65. package/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.d.ts +13 -0
  66. package/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.d.ts +7 -0
  67. package/app/fields/dropdown-fields/_models/index.d.ts +4 -0
  68. package/app/fields/dropdown-fields/_models/select-option.model.d.ts +5 -0
  69. package/app/fields/dropdown-fields/_models/select-pagination.model.d.ts +6 -0
  70. package/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.d.ts +84 -0
  71. package/app/fields/dropdown-fields/index.d.ts +7 -0
  72. package/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.d.ts +49 -0
  73. package/app/fields/dropdown-fields/select-field/select-field.component.d.ts +54 -0
  74. package/app/fields/input-fields/_base/base-field.component.d.ts +60 -0
  75. package/app/fields/input-fields/_base/base-field.directive.d.ts +102 -0
  76. package/app/fields/input-fields/_base/masked-text-field.base.d.ts +34 -0
  77. package/app/fields/input-fields/_base/ng-control-field.directive.d.ts +43 -0
  78. package/app/fields/input-fields/_models/field-common-inputs.model.d.ts +49 -0
  79. package/app/fields/input-fields/_models/index.d.ts +1 -0
  80. package/app/fields/input-fields/_utils/mask-complete.validators.d.ts +18 -0
  81. package/app/fields/input-fields/_utils/mask-format.utils.d.ts +13 -0
  82. package/app/fields/input-fields/cep-field/cep-field.component.d.ts +12 -0
  83. package/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.d.ts +20 -0
  84. package/app/fields/input-fields/date-field/date-field.component.d.ts +30 -0
  85. package/app/fields/input-fields/decimal-field/decimal-field.component.d.ts +17 -0
  86. package/app/fields/input-fields/index.d.ts +22 -0
  87. package/app/fields/input-fields/input-mask-field/input-mask-field.component.d.ts +16 -0
  88. package/app/fields/input-fields/integer-field/integer-field.component.d.ts +17 -0
  89. package/app/fields/input-fields/password-field/password-field.component.d.ts +30 -0
  90. package/app/fields/input-fields/phone-field/phone-field.component.d.ts +22 -0
  91. package/app/fields/input-fields/text-field/text-field.component.d.ts +16 -0
  92. package/app/fields/input-fields/textarea-field/textarea-field.component.d.ts +31 -0
  93. package/app/form-layout/_models/form-layout.model.d.ts +41 -0
  94. package/app/form-layout/_models/form-tabs.model.d.ts +1 -0
  95. package/app/form-layout/_models/index.d.ts +3 -0
  96. package/app/form-layout/_models/validation-summary.model.d.ts +8 -0
  97. package/app/form-layout/form-actions/form-actions.component.d.ts +21 -0
  98. package/app/form-layout/form-col/form-col.component.d.ts +25 -0
  99. package/app/form-layout/form-group/form-group.component.d.ts +125 -0
  100. package/app/form-layout/form-group/form-path.utils.d.ts +16 -0
  101. package/app/form-layout/form-group/form-root-invalid-ui-refresh.util.d.ts +8 -0
  102. package/app/form-layout/form-row/form-row.component.d.ts +14 -0
  103. package/app/form-layout/form-section/form-section.component.d.ts +13 -0
  104. package/app/form-layout/form-tab/form-tab.component.d.ts +32 -0
  105. package/app/form-layout/form-tabs/form-tabs.component.d.ts +44 -0
  106. package/app/form-layout/index.d.ts +14 -0
  107. package/app/form-layout/layout-stack/layout-stack.component.d.ts +25 -0
  108. package/app/form-layout/validation-summary/validation-summary.component.d.ts +111 -0
  109. package/app/loading/skeleton-loading/index.d.ts +6 -0
  110. package/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.d.ts +15 -0
  111. package/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.d.ts +10 -0
  112. package/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.d.ts +21 -0
  113. package/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.d.ts +17 -0
  114. package/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.d.ts +16 -0
  115. package/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.d.ts +17 -0
  116. package/app/menus/_models/drawer-side.model.d.ts +6 -0
  117. package/app/menus/_models/drawer-size.model.d.ts +6 -0
  118. package/app/menus/_models/menu-dropdown-placement.model.d.ts +10 -0
  119. package/app/menus/_models/menu-item.model.d.ts +47 -0
  120. package/app/menus/_utils/menu-connected-positions.util.d.ts +4 -0
  121. package/app/menus/_utils/menu-rows.util.d.ts +22 -0
  122. package/app/menus/_utils/submenu-connected-positions.util.d.ts +5 -0
  123. package/app/menus/action-menu/action-menu.component.d.ts +24 -0
  124. package/app/menus/context-menu/context-menu.component.d.ts +32 -0
  125. package/app/menus/drawer/drawer.component.d.ts +37 -0
  126. package/app/menus/dropdown-menu/dropdown-menu.component.d.ts +33 -0
  127. package/app/menus/index.d.ts +11 -0
  128. package/app/menus/menu-divider/menu-divider.component.d.ts +8 -0
  129. package/app/menus/menu-group/menu-group.component.d.ts +13 -0
  130. package/app/menus/menu-list/menu-list.component.d.ts +77 -0
  131. package/app/overlay/_models/overlay-placement.model.d.ts +9 -0
  132. package/app/overlay/_utils/anchored-overlay-positions.util.d.ts +9 -0
  133. package/app/overlay/anchored-overlay/anchored-overlay.component.d.ts +51 -0
  134. package/app/overlay/index.d.ts +20 -0
  135. package/app/overlay/popover/popover-body-template.directive.d.ts +7 -0
  136. package/app/overlay/popover/popover-footer-template.directive.d.ts +7 -0
  137. package/app/overlay/popover/popover-trigger.directive.d.ts +6 -0
  138. package/app/overlay/popover/popover.component.d.ts +38 -0
  139. package/app/overlay/tooltip/tooltip-panel-template.directive.d.ts +10 -0
  140. package/app/overlay/tooltip/tooltip.component.d.ts +40 -0
  141. package/app/theme/app-theme.service.d.ts +25 -0
  142. package/app/theme/index.d.ts +1 -0
  143. package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
  144. package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
  145. package/esm2022/app/_utils/estados-br.data.mjs +37 -0
  146. package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
  147. package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
  148. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +43 -0
  149. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
  150. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
  151. package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
  152. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
  153. package/esm2022/app/app-shell/index.mjs +19 -0
  154. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
  155. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
  156. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
  157. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
  158. package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
  159. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
  160. package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
  161. package/esm2022/app/buttons/index.mjs +2 -0
  162. package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
  163. package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
  164. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
  165. package/esm2022/app/data-display/_models/index.mjs +2 -0
  166. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
  167. package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
  168. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
  169. package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
  170. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
  171. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
  172. package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
  173. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
  174. package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
  175. package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
  176. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
  177. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
  178. package/esm2022/app/data-display/index.mjs +19 -0
  179. package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
  180. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
  181. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
  182. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
  183. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
  184. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
  185. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
  186. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +164 -0
  187. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
  188. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
  189. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
  190. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +45 -0
  191. package/esm2022/app/dialogs/index.mjs +11 -0
  192. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
  193. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
  194. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +36 -0
  195. package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
  196. package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
  197. package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
  198. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
  199. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
  200. package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
  201. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
  202. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
  203. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
  204. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
  205. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
  206. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
  207. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
  208. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
  209. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
  210. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
  211. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
  212. package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
  213. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
  214. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
  215. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
  216. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
  217. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
  218. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
  219. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
  220. package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
  221. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
  222. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
  223. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
  224. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
  225. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
  226. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
  227. package/esm2022/app/fields/input-fields/index.mjs +22 -0
  228. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
  229. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
  230. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
  231. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
  232. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
  233. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
  234. package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
  235. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
  236. package/esm2022/app/form-layout/_models/index.mjs +2 -0
  237. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
  238. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
  239. package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
  240. package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
  241. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
  242. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
  243. package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
  244. package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
  245. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
  246. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
  247. package/esm2022/app/form-layout/index.mjs +14 -0
  248. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
  249. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +392 -0
  250. package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
  251. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
  252. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
  253. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
  254. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
  255. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
  256. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
  257. package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
  258. package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
  259. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
  260. package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
  261. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
  262. package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
  263. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
  264. package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
  265. package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
  266. package/esm2022/app/menus/drawer/drawer.component.mjs +140 -0
  267. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
  268. package/esm2022/app/menus/index.mjs +11 -0
  269. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
  270. package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
  271. package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
  272. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
  273. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
  274. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
  275. package/esm2022/app/overlay/index.mjs +21 -0
  276. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
  277. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
  278. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
  279. package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
  280. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
  281. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
  282. package/esm2022/app/theme/app-theme.service.mjs +49 -0
  283. package/esm2022/app/theme/index.mjs +2 -0
  284. package/esm2022/structra-public-api.mjs +18 -0
  285. package/esm2022/structra-ui.mjs +2 -2
  286. package/esm2022/structra-version.mjs +3 -0
  287. package/fesm2022/structra-ui.mjs +8896 -4
  288. package/fesm2022/structra-ui.mjs.map +1 -1
  289. package/index.d.ts +1 -1
  290. package/package.json +7 -2
  291. package/structra-public-api.d.ts +17 -0
  292. package/structra-version.d.ts +2 -0
  293. package/esm2022/lib/version.mjs +0 -3
  294. package/esm2022/public-api.mjs +0 -5
  295. package/lib/version.d.ts +0 -2
  296. package/public-api.d.ts +0 -1
@@ -0,0 +1,392 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, Injector, Output, afterNextRender, booleanAttribute, inject, } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ /** Evento no host `app-form-group`: expandir grupo sem scroll próprio (navegação a partir do resumo). */
5
+ const UI_REQUEST_EXPAND_FORM_GROUP = 'ui-request-expand';
6
+ export class ValidationSummaryComponent {
7
+ constructor() {
8
+ /** Troca de aba (`beforeItemActivate`) + `queueMicrotask` no `app-form-tabs` — o alvo pode ficar em `[hidden]` até o próximo CD. */
9
+ this.navigateToFieldMaxAttempts = 28;
10
+ this.appRef = inject(ApplicationRef);
11
+ this.cdr = inject(ChangeDetectorRef);
12
+ this.injector = inject(Injector);
13
+ this.hostRef = inject((ElementRef));
14
+ this.document = inject(DOCUMENT);
15
+ /**
16
+ * Com `pinned`, o host passa para `document.body` para o `z-index` competir com a shell (ex.: drawer
17
+ * da doc no iPhone). Antes de mover, guardamos o `form` mais próximo — `closest('form')` no body falharia.
18
+ */
19
+ this.nearestForm = null;
20
+ this.pinnedPortalOriginalParent = null;
21
+ this.pinnedPortalOriginalNext = null;
22
+ /** `id` único para `aria-labelledby` quando há vários resumos na página. */
23
+ this.titleElementId = `validation-summary-title-${++ValidationSummaryComponent.nextTitleUid}`;
24
+ /** `id` da região da lista (acessibilidade do botão recolher / expandir). */
25
+ this.listRegionId = `validation-summary-list-${++ValidationSummaryComponent.nextListRegionUid}`;
26
+ /** Lista simples (retrocompatível). Ignorada se {@link items} tiver entradas. */
27
+ this.messages = null;
28
+ /** Lista rica com `fieldId` opcional para navegação até o controle. */
29
+ this.items = null;
30
+ this.title = '';
31
+ this.visible = true;
32
+ /**
33
+ * `false` (padrão): fluxo em documento (ex.: no topo do formulário) — o consumidor pode fazer scroll até o painel.
34
+ * `true`: painel `position: fixed` no topo do viewport, com fade-in **sem** reservar espaço no formulário
35
+ * nem alterar o scroll da página (útil em formulários muito longos).
36
+ */
37
+ this.pinned = false;
38
+ this.variant = 'error';
39
+ this.compact = false;
40
+ /**
41
+ * Altura máxima do painel da lista (ex.: `12rem`, `min(40vh, 14rem)`).
42
+ * Quando definido, a lista obtém scroll vertical interno.
43
+ */
44
+ this.panelMaxHeight = null;
45
+ /** Comportamento de scroll ao centrar o alvo na tela. */
46
+ this.scrollBehavior = 'smooth';
47
+ /** Mostra botão que apenas fecha o painel (não altera validação nem o formulário). */
48
+ this.showCloseButton = false;
49
+ /**
50
+ * Mostra o botão com setas (recolher / expandir) ao lado do título para esconder só a lista
51
+ * e poupar espaço vertical sem fechar o painel.
52
+ */
53
+ this.showListCollapseToggle = true;
54
+ this.closeButtonLabel = 'Fechar';
55
+ /** Texto da dica nativa (`title`) nas linhas com destino ao campo. */
56
+ this.fieldNavigateHint = 'Clique para ir ao campo.';
57
+ this.panelClose = new EventEmitter();
58
+ /** Com `pinned`: breve fade-in após o painel passar a visível (sem deslocar o layout). */
59
+ this.pinnedOpen = false;
60
+ /** `true`: lista de erros visível; `false`: só cabeçalho + botões (menos altura). */
61
+ this.panelBodyExpanded = true;
62
+ this.wasShown = false;
63
+ }
64
+ static { this.nextTitleUid = 0; }
65
+ static { this.nextListRegionUid = 0; }
66
+ get hostClass() {
67
+ const parts = [
68
+ 'validation-summary',
69
+ `validation-summary--${this.variant}`,
70
+ ];
71
+ if (this.compact) {
72
+ parts.push('validation-summary--compact');
73
+ }
74
+ if (this.pinned && this.isShown) {
75
+ parts.push('validation-summary--pinned-host');
76
+ }
77
+ return parts.join(' ');
78
+ }
79
+ ngOnChanges(_changes) {
80
+ this.syncPinnedHostToBody();
81
+ const shown = this.isShown;
82
+ if (this.pinned && shown && !this.wasShown) {
83
+ this.pinnedOpen = false;
84
+ this.cdr.markForCheck();
85
+ requestAnimationFrame(() => {
86
+ requestAnimationFrame(() => {
87
+ this.pinnedOpen = true;
88
+ this.cdr.markForCheck();
89
+ });
90
+ });
91
+ }
92
+ else if (!shown) {
93
+ this.pinnedOpen = false;
94
+ this.panelBodyExpanded = true;
95
+ }
96
+ this.wasShown = shown;
97
+ }
98
+ ngOnDestroy() {
99
+ this.detachPinnedHostFromBody();
100
+ }
101
+ get hostHidden() {
102
+ return this.isShown ? null : true;
103
+ }
104
+ get resolvedItems() {
105
+ const fromItems = (this.items ?? []).filter((i) => i && typeof i.message === 'string' && i.message.trim().length > 0);
106
+ if (fromItems.length > 0) {
107
+ return fromItems.map((i) => ({
108
+ message: i.message.trim(),
109
+ fieldId: i.fieldId?.trim() || undefined,
110
+ }));
111
+ }
112
+ return (this.messages ?? [])
113
+ .filter((m) => typeof m === 'string' && m.trim().length > 0)
114
+ .map((message) => ({ message: message.trim() }));
115
+ }
116
+ get isShown() {
117
+ return this.visible && this.resolvedItems.length > 0;
118
+ }
119
+ onCloseClick() {
120
+ this.panelClose.emit();
121
+ this.cdr.markForCheck();
122
+ }
123
+ toggleListBody() {
124
+ this.panelBodyExpanded = !this.panelBodyExpanded;
125
+ this.cdr.markForCheck();
126
+ }
127
+ /**
128
+ * Chave estável para `@for` — `track $index` reutiliza mal nós quando a lista muda ao vivo
129
+ * e o getter `resolvedItems` devolve novas referências a cada CD.
130
+ */
131
+ itemTrackKey(row, index) {
132
+ const fid = row.fieldId?.trim();
133
+ if (fid) {
134
+ return fid;
135
+ }
136
+ return `msg-${index}-${row.message}`;
137
+ }
138
+ /**
139
+ * Clique na linha com destino: primeiro alinha a linha no `list-wrap` com scroll
140
+ * (itens parcialmente visíveis passam a ficar totalmente visíveis), depois navega.
141
+ */
142
+ onSummaryLinkActivate(ev, item) {
143
+ const el = ev.currentTarget;
144
+ if (el) {
145
+ el.scrollIntoView({
146
+ block: 'nearest',
147
+ inline: 'nearest',
148
+ behavior: 'auto',
149
+ });
150
+ }
151
+ this.onItemActivate(item);
152
+ }
153
+ /** Navegação até o controle com `fieldId` (chamado após {@link onSummaryLinkActivate}). */
154
+ onItemActivate(item) {
155
+ const id = item.fieldId?.trim();
156
+ if (!id) {
157
+ return;
158
+ }
159
+ this.beforeItemActivate?.(item);
160
+ // 1) `afterNextRender`: após o DOM refletir (ex.: mudança de aba em `beforeItemActivate`).
161
+ // 2) `setTimeout(0)`: fora do ciclo de verificação — evita NG0100 ao expandir `app-form-group`.
162
+ afterNextRender(() => {
163
+ setTimeout(() => this.navigateToFieldId(id), 0);
164
+ }, { injector: this.injector });
165
+ }
166
+ navigateToFieldId(id, attempt = 0) {
167
+ const resolved = document.getElementById(id);
168
+ if (!resolved || !(resolved instanceof HTMLElement)) {
169
+ if (attempt < this.navigateToFieldMaxAttempts) {
170
+ /*
171
+ * Com `destroyOnCollapse`, o controle não existe no DOM enquanto o `app-form-group` está fechado;
172
+ * `expandCollapsedFormGroupAncestors` nunca corre porque depende do elemento já existir.
173
+ * Expandimos todos os grupos colapsados no `<form>` mais próximo e repetimos após um CD.
174
+ */
175
+ this.expandCollapsedFormGroupsInNearestForm();
176
+ this.appRef.tick();
177
+ queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));
178
+ }
179
+ return;
180
+ }
181
+ // Separadores inativos (`app-form-tab`) usam `[hidden]` — `getElementById` existe mas foco falha
182
+ // até o painel estar visível; re-tenta após CD (ex.: demo Abas ao saltar de aba).
183
+ if (resolved.closest('[hidden]')) {
184
+ if (attempt < this.navigateToFieldMaxAttempts) {
185
+ this.appRef.tick();
186
+ queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));
187
+ }
188
+ return;
189
+ }
190
+ /**
191
+ * Com `app-form-group` colapsado (corpo `display: none`), `getElementById` ainda encontra o alvo
192
+ * mas o foco falha até o próximo CD — sem reintento parece que é preciso um segundo clique no resumo.
193
+ */
194
+ if (this.isInsideCollapsedFormGroupBody(resolved)) {
195
+ this.expandCollapsedFormGroupAncestors(resolved);
196
+ this.appRef.tick();
197
+ if (attempt < this.navigateToFieldMaxAttempts) {
198
+ queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));
199
+ }
200
+ return;
201
+ }
202
+ this.expandCollapsedFormGroupAncestors(resolved);
203
+ this.appRef.tick();
204
+ this.scheduleScrollAndFocusAfterDomFlush(id);
205
+ }
206
+ /** Após `tick()`, garante um frame de pintura antes de scroll/foco (evita foco em ramo ainda oculto). */
207
+ scheduleScrollAndFocusAfterDomFlush(id) {
208
+ queueMicrotask(() => {
209
+ requestAnimationFrame(() => {
210
+ requestAnimationFrame(() => this.scrollAndFocusFieldById(id));
211
+ });
212
+ });
213
+ }
214
+ isInsideCollapsedFormGroupBody(el) {
215
+ let node = el;
216
+ while (node) {
217
+ if (node.classList?.contains('form-group__body--collapsed-hidden')) {
218
+ return true;
219
+ }
220
+ node = node.parentElement;
221
+ }
222
+ return false;
223
+ }
224
+ scrollAndFocusFieldById(id) {
225
+ const el = document.getElementById(id);
226
+ if (!el || !(el instanceof HTMLElement)) {
227
+ return;
228
+ }
229
+ const focusable = this.resolveFocusable(el);
230
+ focusable.scrollIntoView({
231
+ behavior: this.scrollBehavior,
232
+ block: 'center',
233
+ inline: 'nearest',
234
+ });
235
+ queueMicrotask(() => {
236
+ try {
237
+ focusable.focus({ preventScroll: true });
238
+ }
239
+ catch {
240
+ focusable.focus({ preventScroll: true });
241
+ }
242
+ });
243
+ this.cdr.markForCheck();
244
+ }
245
+ /**
246
+ * Dispara `ui-request-expand` em cada `app-form-group` colapsado do formulário que contém este resumo,
247
+ * para montar campos com `destroyOnCollapse` antes de `getElementById(fieldId)`.
248
+ * Ordem do DOM (pais antes dos filhos) alinha a expansão de grupos aninhados.
249
+ */
250
+ expandCollapsedFormGroupsInNearestForm() {
251
+ const form = this.nearestForm ?? this.hostRef.nativeElement.closest('form');
252
+ if (!(form instanceof HTMLFormElement)) {
253
+ return;
254
+ }
255
+ const hosts = Array.from(form.querySelectorAll('app-form-group.form-group--collapsed'));
256
+ for (const host of hosts) {
257
+ host.dispatchEvent(new CustomEvent(UI_REQUEST_EXPAND_FORM_GROUP, {
258
+ bubbles: false,
259
+ cancelable: true,
260
+ }));
261
+ }
262
+ }
263
+ /** Expande do mais externo para o mais interno para o conteúdo ficar visível. */
264
+ expandCollapsedFormGroupAncestors(start) {
265
+ const hosts = [];
266
+ let node = start.parentElement;
267
+ while (node) {
268
+ if (node.tagName.toLowerCase() === 'app-form-group' &&
269
+ node.classList.contains('form-group--collapsed')) {
270
+ hosts.push(node);
271
+ }
272
+ node = node.parentElement;
273
+ }
274
+ for (let i = hosts.length - 1; i >= 0; i--) {
275
+ hosts[i].dispatchEvent(new CustomEvent(UI_REQUEST_EXPAND_FORM_GROUP, {
276
+ bubbles: false,
277
+ cancelable: true,
278
+ }));
279
+ }
280
+ }
281
+ resolveFocusable(el) {
282
+ if (this.isFocusableElement(el)) {
283
+ return el;
284
+ }
285
+ const inner = el.querySelector('input, select, textarea, button, [href], [tabindex]:not([tabindex="-1"])');
286
+ return inner ?? el;
287
+ }
288
+ isFocusableElement(el) {
289
+ if (el.hasAttribute('disabled')) {
290
+ return false;
291
+ }
292
+ const tag = el.tagName;
293
+ if (tag === 'INPUT' ||
294
+ tag === 'SELECT' ||
295
+ tag === 'TEXTAREA' ||
296
+ tag === 'BUTTON') {
297
+ return true;
298
+ }
299
+ const tab = el.getAttribute('tabindex');
300
+ return tab != null && tab !== '-1';
301
+ }
302
+ syncPinnedHostToBody() {
303
+ const host = this.hostRef.nativeElement;
304
+ const shouldPortal = this.pinned && this.isShown;
305
+ if (shouldPortal) {
306
+ if (host.parentElement === this.document.body) {
307
+ return;
308
+ }
309
+ this.nearestForm = host.closest('form');
310
+ this.pinnedPortalOriginalParent = host.parentElement;
311
+ this.pinnedPortalOriginalNext = host.nextSibling;
312
+ if (this.pinnedPortalOriginalParent) {
313
+ this.document.body.appendChild(host);
314
+ }
315
+ return;
316
+ }
317
+ this.detachPinnedHostFromBody();
318
+ }
319
+ detachPinnedHostFromBody() {
320
+ const host = this.hostRef.nativeElement;
321
+ if (host.parentElement !== this.document.body || !this.pinnedPortalOriginalParent) {
322
+ this.nearestForm = null;
323
+ this.pinnedPortalOriginalParent = null;
324
+ this.pinnedPortalOriginalNext = null;
325
+ return;
326
+ }
327
+ const parent = this.pinnedPortalOriginalParent;
328
+ const next = this.pinnedPortalOriginalNext;
329
+ try {
330
+ if (next?.parentNode === parent) {
331
+ parent.insertBefore(host, next);
332
+ }
333
+ else {
334
+ parent.appendChild(host);
335
+ }
336
+ }
337
+ catch {
338
+ parent.appendChild(host);
339
+ }
340
+ this.nearestForm = null;
341
+ this.pinnedPortalOriginalParent = null;
342
+ this.pinnedPortalOriginalNext = null;
343
+ }
344
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ValidationSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
345
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ValidationSummaryComponent, isStandalone: true, selector: "app-validation-summary", inputs: { messages: "messages", items: "items", title: "title", visible: ["visible", "visible", booleanAttribute], pinned: ["pinned", "pinned", booleanAttribute], variant: "variant", compact: ["compact", "compact", booleanAttribute], panelMaxHeight: "panelMaxHeight", scrollBehavior: "scrollBehavior", beforeItemActivate: "beforeItemActivate", showCloseButton: ["showCloseButton", "showCloseButton", booleanAttribute], showListCollapseToggle: ["showListCollapseToggle", "showListCollapseToggle", booleanAttribute], closeButtonLabel: "closeButtonLabel", fieldNavigateHint: "fieldNavigateHint" }, outputs: { panelClose: "panelClose" }, host: { properties: { "class": "this.hostClass", "attr.hidden": "this.hostHidden" } }, usesOnChanges: true, ngImport: i0, template: "@if (isShown) {\r\n<div class=\"validation-summary__panel\" role=\"region\" [attr.aria-labelledby]=\"title.trim() ? titleElementId : null\"\r\n [attr.aria-label]=\"title.trim() ? null : 'Resumo de valida\u00E7\u00E3o'\"\r\n [class.validation-summary__panel--pinned]=\"pinned\"\r\n [class.validation-summary__panel--pinned-open]=\"pinned && pinnedOpen\"\r\n [class.validation-summary__panel--list-collapsed]=\"!panelBodyExpanded\">\r\n <div class=\"validation-summary__head\">\r\n @if (showListCollapseToggle) {\r\n <button type=\"button\" class=\"validation-summary__collapse-toggle\" (click)=\"toggleListBody()\"\r\n [attr.aria-expanded]=\"panelBodyExpanded\" [attr.aria-controls]=\"listRegionId\"\r\n [attr.aria-label]=\"panelBodyExpanded ? 'Recolher lista de erros' : 'Expandir lista de erros'\">\r\n <i class=\"fa-solid\" aria-hidden=\"true\" [class.fa-chevron-up]=\"panelBodyExpanded\"\r\n [class.fa-chevron-down]=\"!panelBodyExpanded\"></i>\r\n </button>\r\n }\r\n @if (title.trim()) {\r\n <h3 class=\"validation-summary__title\" [id]=\"titleElementId\">\r\n {{ title }}\r\n </h3>\r\n }\r\n @if (showCloseButton) {\r\n <button type=\"button\" class=\"validation-summary__close\" (click)=\"onCloseClick()\">\r\n {{ closeButtonLabel }}\r\n </button>\r\n }\r\n </div>\r\n <div class=\"validation-summary__list-wrap\" [id]=\"listRegionId\"\r\n [class.validation-summary__list-wrap--scrollable]=\"!!panelMaxHeight && panelBodyExpanded\"\r\n [class.validation-summary__list-wrap--collapsed]=\"!panelBodyExpanded\"\r\n [style.max-height]=\"panelBodyExpanded ? (panelMaxHeight || null) : null\" [attr.title]=\"fieldNavigateHint\">\r\n <ul class=\"validation-summary__list\" role=\"list\">\r\n @for (row of resolvedItems; track itemTrackKey(row, $index)) {\r\n <li class=\"validation-summary__item\" role=\"listitem\" (click)=\"onSummaryLinkActivate($event, row)\">\r\n @if (row.fieldId) {\r\n <button type=\"button\" class=\"validation-summary__link\" [attr.title]=\"fieldNavigateHint\">\r\n {{ row.message }}\r\n </button>\r\n } @else {\r\n <span class=\"validation-summary__text\">{{ row.message }}</span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n</div>\r\n}", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;flex:0 0 auto;align-self:stretch}:host.validation-summary--pinned-host{position:static;display:block;box-sizing:border-box;flex:0 0 auto!important;width:100%;max-width:100%;height:0!important;min-height:0!important;margin:0!important;padding:0!important;overflow:visible;pointer-events:none}.validation-summary__panel.validation-summary__panel--pinned{position:fixed;z-index:var(--app-z-validation-summary-pinned, 1400);top:max(.65rem,env(safe-area-inset-top,0px));left:1rem;right:1rem;width:auto;max-width:min(100%,52rem);margin-left:auto;margin-right:auto;box-sizing:border-box;pointer-events:auto;box-shadow:0 4px 6px -1px #00000014,0 10px 24px -6px #0000001f;transform:none;opacity:0;transition:opacity .2s ease-out}.validation-summary__panel.validation-summary__panel--pinned.validation-summary__panel--pinned-open{opacity:1}.validation-summary__panel{width:100%;border-radius:10px;padding:.85rem 1rem;box-sizing:border-box;border:1px solid transparent}.validation-summary__head{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.45rem .75rem;margin-bottom:.55rem}.validation-summary__panel--list-collapsed .validation-summary__head{margin-bottom:0}.validation-summary__collapse-toggle{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:1px solid rgba(183,28,28,.35);border-radius:8px;background:#ffffffbf;color:var(--ui-validation-summary-title-error, #b71c1c);font-size:.8rem;line-height:1;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,border-color .15s ease}.validation-summary__collapse-toggle:hover{background:#fff;border-color:#b71c1c8c}.validation-summary__collapse-toggle:focus-visible{outline:2px solid var(--app-color-validation-focus-ring, rgba(185, 28, 28, .45));outline-offset:2px}.validation-summary__title{margin:0;flex:1 1 auto;min-width:0;font-size:1rem;font-weight:600;line-height:1.35;user-select:none;-webkit-user-select:none}.validation-summary__close{flex-shrink:0;margin:0 0 0 auto;padding:.3rem .7rem;border:1px solid rgba(183,28,28,.35);border-radius:8px;background:#ffffffbf;color:var(--ui-validation-summary-title-error, #b71c1c);font-size:.85rem;font-weight:500;font-family:inherit;line-height:1.3;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,border-color .15s ease}.validation-summary__close:hover{background:#fff;border-color:#b71c1c8c}.validation-summary__close:focus-visible{outline:2px solid var(--app-color-validation-focus-ring, rgba(185, 28, 28, .45));outline-offset:2px}.validation-summary__list-wrap{min-width:0;user-select:none;-webkit-user-select:none;overflow:hidden;transition:max-height .28s ease,opacity .22s ease,margin .2s ease}.validation-summary__list-wrap--collapsed{max-height:0!important;opacity:0;margin:0;padding:0;pointer-events:none}.validation-summary__list-wrap--scrollable{overflow-y:auto;overflow-x:hidden;padding-right:.15rem;scrollbar-gutter:stable}.validation-summary__list{margin:0;padding:0;list-style:none}.validation-summary__item{display:flex;align-items:flex-start;gap:.4rem;margin:.2rem 0;padding:0;line-height:1.45;color:var(--ui-validation-summary-text, #1a1a1a);user-select:none;-webkit-user-select:none}.validation-summary__item:before{content:\"\\2022\";flex-shrink:0;line-height:inherit;color:var(--ui-validation-summary-text, #1a1a1a)}.validation-summary__text{display:inline;font:inherit;user-select:none;-webkit-user-select:none}.validation-summary__link{flex:1;min-width:0;display:block;margin:0;padding:0;border:none;background:none;font:inherit;color:inherit;text-align:left;text-decoration:underline;text-underline-offset:.12em;cursor:pointer;user-select:none;-webkit-user-select:none}.validation-summary__link:hover{color:var(--ui-validation-summary-link-hover, #0d47a1)}.validation-summary__link:focus-visible{outline:2px solid var(--app-color-validation-focus-ring, rgba(185, 28, 28, .45));outline-offset:2px;border-radius:4px}:host.validation-summary--error .validation-summary__link:hover{color:var(--app-color-error, #b91c1c)}:host.validation-summary--error .validation-summary__panel{background:var(--ui-validation-summary-bg-error, #ffebee);border-color:var(--ui-validation-summary-border-error, #ffcdd2)}:host.validation-summary--error .validation-summary__title{color:var(--ui-validation-summary-title-error, #b71c1c)}:host.validation-summary--warning .validation-summary__panel{background:var(--ui-validation-summary-bg-warning, #fff8e1);border-color:var(--ui-validation-summary-border-warning, #ffe082)}:host.validation-summary--warning .validation-summary__title{color:var(--ui-validation-summary-title-warning, #e65100)}:host.validation-summary--warning .validation-summary__close{color:var(--ui-validation-summary-title-warning, #e65100);border-color:#e6510059}:host.validation-summary--warning .validation-summary__collapse-toggle{color:var(--ui-validation-summary-title-warning, #e65100);border-color:#e6510059}:host.validation-summary--warning .validation-summary__collapse-toggle:hover{border-color:#e651008c}:host.validation-summary--info .validation-summary__panel{background:var(--ui-validation-summary-bg-info, #e3f2fd);border-color:var(--ui-validation-summary-border-info, #90caf9)}:host.validation-summary--info .validation-summary__title{color:var(--ui-validation-summary-title-info, #0d47a1)}:host.validation-summary--info .validation-summary__close{color:var(--ui-validation-summary-title-info, #0d47a1);border-color:#0d47a159}:host.validation-summary--info .validation-summary__collapse-toggle{color:var(--ui-validation-summary-title-info, #0d47a1);border-color:#0d47a159}:host.validation-summary--info .validation-summary__collapse-toggle:hover{border-color:#0d47a18c}:host.validation-summary--compact .validation-summary__panel{padding:.55rem .7rem}:host.validation-summary--compact .validation-summary__head{margin-bottom:.35rem}:host.validation-summary--compact .validation-summary__title{font-size:.92rem}:host.validation-summary--compact .validation-summary__list{padding-left:0}:host.validation-summary--compact .validation-summary__item{font-size:.88rem;margin:.12rem 0}:host.validation-summary--compact .validation-summary__collapse-toggle{width:1.75rem;height:1.75rem;font-size:.72rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
346
+ }
347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ValidationSummaryComponent, decorators: [{
348
+ type: Component,
349
+ args: [{ selector: 'app-validation-summary', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (isShown) {\r\n<div class=\"validation-summary__panel\" role=\"region\" [attr.aria-labelledby]=\"title.trim() ? titleElementId : null\"\r\n [attr.aria-label]=\"title.trim() ? null : 'Resumo de valida\u00E7\u00E3o'\"\r\n [class.validation-summary__panel--pinned]=\"pinned\"\r\n [class.validation-summary__panel--pinned-open]=\"pinned && pinnedOpen\"\r\n [class.validation-summary__panel--list-collapsed]=\"!panelBodyExpanded\">\r\n <div class=\"validation-summary__head\">\r\n @if (showListCollapseToggle) {\r\n <button type=\"button\" class=\"validation-summary__collapse-toggle\" (click)=\"toggleListBody()\"\r\n [attr.aria-expanded]=\"panelBodyExpanded\" [attr.aria-controls]=\"listRegionId\"\r\n [attr.aria-label]=\"panelBodyExpanded ? 'Recolher lista de erros' : 'Expandir lista de erros'\">\r\n <i class=\"fa-solid\" aria-hidden=\"true\" [class.fa-chevron-up]=\"panelBodyExpanded\"\r\n [class.fa-chevron-down]=\"!panelBodyExpanded\"></i>\r\n </button>\r\n }\r\n @if (title.trim()) {\r\n <h3 class=\"validation-summary__title\" [id]=\"titleElementId\">\r\n {{ title }}\r\n </h3>\r\n }\r\n @if (showCloseButton) {\r\n <button type=\"button\" class=\"validation-summary__close\" (click)=\"onCloseClick()\">\r\n {{ closeButtonLabel }}\r\n </button>\r\n }\r\n </div>\r\n <div class=\"validation-summary__list-wrap\" [id]=\"listRegionId\"\r\n [class.validation-summary__list-wrap--scrollable]=\"!!panelMaxHeight && panelBodyExpanded\"\r\n [class.validation-summary__list-wrap--collapsed]=\"!panelBodyExpanded\"\r\n [style.max-height]=\"panelBodyExpanded ? (panelMaxHeight || null) : null\" [attr.title]=\"fieldNavigateHint\">\r\n <ul class=\"validation-summary__list\" role=\"list\">\r\n @for (row of resolvedItems; track itemTrackKey(row, $index)) {\r\n <li class=\"validation-summary__item\" role=\"listitem\" (click)=\"onSummaryLinkActivate($event, row)\">\r\n @if (row.fieldId) {\r\n <button type=\"button\" class=\"validation-summary__link\" [attr.title]=\"fieldNavigateHint\">\r\n {{ row.message }}\r\n </button>\r\n } @else {\r\n <span class=\"validation-summary__text\">{{ row.message }}</span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n</div>\r\n}", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;flex:0 0 auto;align-self:stretch}:host.validation-summary--pinned-host{position:static;display:block;box-sizing:border-box;flex:0 0 auto!important;width:100%;max-width:100%;height:0!important;min-height:0!important;margin:0!important;padding:0!important;overflow:visible;pointer-events:none}.validation-summary__panel.validation-summary__panel--pinned{position:fixed;z-index:var(--app-z-validation-summary-pinned, 1400);top:max(.65rem,env(safe-area-inset-top,0px));left:1rem;right:1rem;width:auto;max-width:min(100%,52rem);margin-left:auto;margin-right:auto;box-sizing:border-box;pointer-events:auto;box-shadow:0 4px 6px -1px #00000014,0 10px 24px -6px #0000001f;transform:none;opacity:0;transition:opacity .2s ease-out}.validation-summary__panel.validation-summary__panel--pinned.validation-summary__panel--pinned-open{opacity:1}.validation-summary__panel{width:100%;border-radius:10px;padding:.85rem 1rem;box-sizing:border-box;border:1px solid transparent}.validation-summary__head{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.45rem .75rem;margin-bottom:.55rem}.validation-summary__panel--list-collapsed .validation-summary__head{margin-bottom:0}.validation-summary__collapse-toggle{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:1px solid rgba(183,28,28,.35);border-radius:8px;background:#ffffffbf;color:var(--ui-validation-summary-title-error, #b71c1c);font-size:.8rem;line-height:1;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,border-color .15s ease}.validation-summary__collapse-toggle:hover{background:#fff;border-color:#b71c1c8c}.validation-summary__collapse-toggle:focus-visible{outline:2px solid var(--app-color-validation-focus-ring, rgba(185, 28, 28, .45));outline-offset:2px}.validation-summary__title{margin:0;flex:1 1 auto;min-width:0;font-size:1rem;font-weight:600;line-height:1.35;user-select:none;-webkit-user-select:none}.validation-summary__close{flex-shrink:0;margin:0 0 0 auto;padding:.3rem .7rem;border:1px solid rgba(183,28,28,.35);border-radius:8px;background:#ffffffbf;color:var(--ui-validation-summary-title-error, #b71c1c);font-size:.85rem;font-weight:500;font-family:inherit;line-height:1.3;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,border-color .15s ease}.validation-summary__close:hover{background:#fff;border-color:#b71c1c8c}.validation-summary__close:focus-visible{outline:2px solid var(--app-color-validation-focus-ring, rgba(185, 28, 28, .45));outline-offset:2px}.validation-summary__list-wrap{min-width:0;user-select:none;-webkit-user-select:none;overflow:hidden;transition:max-height .28s ease,opacity .22s ease,margin .2s ease}.validation-summary__list-wrap--collapsed{max-height:0!important;opacity:0;margin:0;padding:0;pointer-events:none}.validation-summary__list-wrap--scrollable{overflow-y:auto;overflow-x:hidden;padding-right:.15rem;scrollbar-gutter:stable}.validation-summary__list{margin:0;padding:0;list-style:none}.validation-summary__item{display:flex;align-items:flex-start;gap:.4rem;margin:.2rem 0;padding:0;line-height:1.45;color:var(--ui-validation-summary-text, #1a1a1a);user-select:none;-webkit-user-select:none}.validation-summary__item:before{content:\"\\2022\";flex-shrink:0;line-height:inherit;color:var(--ui-validation-summary-text, #1a1a1a)}.validation-summary__text{display:inline;font:inherit;user-select:none;-webkit-user-select:none}.validation-summary__link{flex:1;min-width:0;display:block;margin:0;padding:0;border:none;background:none;font:inherit;color:inherit;text-align:left;text-decoration:underline;text-underline-offset:.12em;cursor:pointer;user-select:none;-webkit-user-select:none}.validation-summary__link:hover{color:var(--ui-validation-summary-link-hover, #0d47a1)}.validation-summary__link:focus-visible{outline:2px solid var(--app-color-validation-focus-ring, rgba(185, 28, 28, .45));outline-offset:2px;border-radius:4px}:host.validation-summary--error .validation-summary__link:hover{color:var(--app-color-error, #b91c1c)}:host.validation-summary--error .validation-summary__panel{background:var(--ui-validation-summary-bg-error, #ffebee);border-color:var(--ui-validation-summary-border-error, #ffcdd2)}:host.validation-summary--error .validation-summary__title{color:var(--ui-validation-summary-title-error, #b71c1c)}:host.validation-summary--warning .validation-summary__panel{background:var(--ui-validation-summary-bg-warning, #fff8e1);border-color:var(--ui-validation-summary-border-warning, #ffe082)}:host.validation-summary--warning .validation-summary__title{color:var(--ui-validation-summary-title-warning, #e65100)}:host.validation-summary--warning .validation-summary__close{color:var(--ui-validation-summary-title-warning, #e65100);border-color:#e6510059}:host.validation-summary--warning .validation-summary__collapse-toggle{color:var(--ui-validation-summary-title-warning, #e65100);border-color:#e6510059}:host.validation-summary--warning .validation-summary__collapse-toggle:hover{border-color:#e651008c}:host.validation-summary--info .validation-summary__panel{background:var(--ui-validation-summary-bg-info, #e3f2fd);border-color:var(--ui-validation-summary-border-info, #90caf9)}:host.validation-summary--info .validation-summary__title{color:var(--ui-validation-summary-title-info, #0d47a1)}:host.validation-summary--info .validation-summary__close{color:var(--ui-validation-summary-title-info, #0d47a1);border-color:#0d47a159}:host.validation-summary--info .validation-summary__collapse-toggle{color:var(--ui-validation-summary-title-info, #0d47a1);border-color:#0d47a159}:host.validation-summary--info .validation-summary__collapse-toggle:hover{border-color:#0d47a18c}:host.validation-summary--compact .validation-summary__panel{padding:.55rem .7rem}:host.validation-summary--compact .validation-summary__head{margin-bottom:.35rem}:host.validation-summary--compact .validation-summary__title{font-size:.92rem}:host.validation-summary--compact .validation-summary__list{padding-left:0}:host.validation-summary--compact .validation-summary__item{font-size:.88rem;margin:.12rem 0}:host.validation-summary--compact .validation-summary__collapse-toggle{width:1.75rem;height:1.75rem;font-size:.72rem}\n"] }]
350
+ }], propDecorators: { messages: [{
351
+ type: Input
352
+ }], items: [{
353
+ type: Input
354
+ }], title: [{
355
+ type: Input
356
+ }], visible: [{
357
+ type: Input,
358
+ args: [{ transform: booleanAttribute }]
359
+ }], pinned: [{
360
+ type: Input,
361
+ args: [{ transform: booleanAttribute }]
362
+ }], variant: [{
363
+ type: Input
364
+ }], compact: [{
365
+ type: Input,
366
+ args: [{ transform: booleanAttribute }]
367
+ }], panelMaxHeight: [{
368
+ type: Input
369
+ }], scrollBehavior: [{
370
+ type: Input
371
+ }], beforeItemActivate: [{
372
+ type: Input
373
+ }], showCloseButton: [{
374
+ type: Input,
375
+ args: [{ transform: booleanAttribute }]
376
+ }], showListCollapseToggle: [{
377
+ type: Input,
378
+ args: [{ transform: booleanAttribute }]
379
+ }], closeButtonLabel: [{
380
+ type: Input
381
+ }], fieldNavigateHint: [{
382
+ type: Input
383
+ }], panelClose: [{
384
+ type: Output
385
+ }], hostClass: [{
386
+ type: HostBinding,
387
+ args: ['class']
388
+ }], hostHidden: [{
389
+ type: HostBinding,
390
+ args: ['attr.hidden']
391
+ }] } });
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdW1tYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZm9ybS1sYXlvdXQvdmFsaWRhdGlvbi1zdW1tYXJ5L3ZhbGlkYXRpb24tc3VtbWFyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2Zvcm0tbGF5b3V0L3ZhbGlkYXRpb24tc3VtbWFyeS92YWxpZGF0aW9uLXN1bW1hcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFHUixNQUFNLEVBRU4sZUFBZSxFQUNmLGdCQUFnQixFQUNoQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7O0FBTXZCLHlHQUF5RztBQUN6RyxNQUFNLDRCQUE0QixHQUFHLG1CQUFtQixDQUFDO0FBU3pELE1BQU0sT0FBTywwQkFBMEI7SUFQdkM7UUFXRSxvSUFBb0k7UUFDbkgsK0JBQTBCLEdBQUcsRUFBRSxDQUFDO1FBRWhDLFdBQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEMsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxDQUFBLFVBQXVCLENBQUEsQ0FBQyxDQUFDO1FBQzFDLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFN0M7OztXQUdHO1FBQ0ssZ0JBQVcsR0FBMkIsSUFBSSxDQUFDO1FBQzNDLCtCQUEwQixHQUF1QixJQUFJ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RE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgSW5qZWN0b3IsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgVmFsaWRhdGlvblN1bW1hcnlJdGVtLFxuICBWYWxpZGF0aW9uU3VtbWFyeVZhcmlhbnQsXG59IGZyb20gJy4uL19tb2RlbHMvdmFsaWRhdGlvbi1zdW1tYXJ5Lm1vZGVsJztcblxuLyoqIEV2ZW50byBubyBob3N0IGBhcHAtZm9ybS1ncm91cGA6IGV4cGFuZGlyIGdydXBvIHNlbSBzY3JvbGwgcHLDs3ByaW8gKG5hdmVnYcOnw6NvIGEgcGFydGlyIGRvIHJlc3VtbykuICovXG5jb25zdCBVSV9SRVFVRVNUX0VYUEFORF9GT1JNX0dST1VQID0gJ3VpLXJlcXVlc3QtZXhwYW5kJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXZhbGlkYXRpb24tc3VtbWFyeScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiAnLi92YWxpZGF0aW9uLXN1bW1hcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdmFsaWRhdGlvbi1zdW1tYXJ5LmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TdW1tYXJ5Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN0YXRpYyBuZXh0VGl0bGVVaWQgPSAwO1xuICBwcml2YXRlIHN0YXRpYyBuZXh0TGlzdFJlZ2lvblVpZCA9IDA7XG5cbiAgLyoqIFRyb2NhIGRlIGFiYSAoYGJlZm9yZUl0ZW1BY3RpdmF0ZWApICsgYHF1ZXVlTWljcm90YXNrYCBubyBgYXBwLWZvcm0tdGFic2Ag4oCUIG8gYWx2byBwb2RlIGZpY2FyIGVtIGBbaGlkZGVuXWAgYXTDqSBvIHByw7N4aW1vIENELiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdmlnYXRlVG9GaWVsZE1heEF0dGVtcHRzID0gMjg7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWYgPSBpbmplY3QoQXBwbGljYXRpb25SZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAvKipcbiAgICogQ29tIGBwaW5uZWRgLCBvIGhvc3QgcGFzc2EgcGFyYSBgZG9jdW1lbnQuYm9keWAgcGFyYSBvIGB6LWluZGV4YCBjb21wZXRpciBjb20gYSBzaGVsbCAoZXguOiBkcmF3ZXJcbiAgICogZGEgZG9jIG5vIGlQaG9uZSkuIEFudGVzIGRlIG1vdmVyLCBndWFyZGFtb3MgbyBgZm9ybWAgbWFpcyBwcsOzeGltbyDigJQgYGNsb3Nlc3QoJ2Zvcm0nKWAgbm8gYm9keSBmYWxoYXJpYS5cbiAgICovXG4gIHByaXZhdGUgbmVhcmVzdEZvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbm5lZFBvcnRhbE9yaWdpbmFsUGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbm5lZFBvcnRhbE9yaWdpbmFsTmV4dDogQ2hpbGROb2RlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGBpZGAgw7puaWNvIHBhcmEgYGFyaWEtbGFiZWxsZWRieWAgcXVhbmRvIGjDoSB2w6FyaW9zIHJlc3Vtb3MgbmEgcMOhZ2luYS4gKi9cbiAgcmVhZG9ubHkgdGl0bGVFbGVtZW50SWQgPSBgdmFsaWRhdGlvbi1zdW1tYXJ5LXRpdGxlLSR7KytWYWxpZGF0aW9uU3VtbWFyeUNvbXBvbmVudC5uZXh0VGl0bGVVaWR9YDtcblxuICAvKiogYGlkYCBkYSByZWdpw6NvIGRhIGxpc3RhIChhY2Vzc2liaWxpZGFkZSBkbyBib3TDo28gcmVjb2xoZXIgLyBleHBhbmRpcikuICovXG4gIHJlYWRvbmx5IGxpc3RSZWdpb25JZCA9IGB2YWxpZGF0aW9uLXN1bW1hcnktbGlzdC0keysrVmFsaWRhdGlvblN1bW1hcnlDb21wb25lbnQubmV4dExpc3RSZWdpb25VaWR9YDtcblxuICAvKiogTGlzdGEgc2ltcGxlcyAocmV0cm9jb21wYXTDrXZlbCkuIElnbm9yYWRhIHNlIHtAbGluayBpdGVtc30gdGl2ZXIgZW50cmFkYXMuICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBMaXN0YSByaWNhIGNvbSBgZmllbGRJZGAgb3BjaW9uYWwgcGFyYSBuYXZlZ2HDp8OjbyBhdMOpIG8gY29udHJvbGUuICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBWYWxpZGF0aW9uU3VtbWFyeUl0ZW1bXSB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHRpdGxlID0gJyc7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHZpc2libGUgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBgZmFsc2VgIChwYWRyw6NvKTogZmx1eG8gZW0gZG9jdW1lbnRvIChleC46IG5vIHRvcG8gZG8gZm9ybXVsw6FyaW8pIOKAlCBvIGNvbnN1bWlkb3IgcG9kZSBmYXplciBzY3JvbGwgYXTDqSBvIHBhaW5lbC5cbiAgICogYHRydWVgOiBwYWluZWwgYHBvc2l0aW9uOiBmaXhlZGAgbm8gdG9wbyBkbyB2aWV3cG9ydCwgY29tIGZhZGUtaW4gKipzZW0qKiByZXNlcnZhciBlc3Bhw6dvIG5vIGZvcm11bMOhcmlvXG4gICAqIG5lbSBhbHRlcmFyIG8gc2Nyb2xsIGRhIHDDoWdpbmEgKMO6dGlsIGVtIGZvcm11bMOhcmlvcyBtdWl0byBsb25nb3MpLlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHBpbm5lZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IFZhbGlkYXRpb25TdW1tYXJ5VmFyaWFudCA9ICdlcnJvcic7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbXBhY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWx0dXJhIG3DoXhpbWEgZG8gcGFpbmVsIGRhIGxpc3RhIChleC46IGAxMnJlbWAsIGBtaW4oNDB2aCwgMTRyZW0pYCkuXG4gICAqIFF1YW5kbyBkZWZpbmlkbywgYSBsaXN0YSBvYnTDqW0gc2Nyb2xsIHZlcnRpY2FsIGludGVybm8uXG4gICAqL1xuICBASW5wdXQoKSBwYW5lbE1heEhlaWdodDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIENvbXBvcnRhbWVudG8gZGUgc2Nyb2xsIGFvIGNlbnRyYXIgbyBhbHZvIG5hIHRlbGEuICovXG4gIEBJbnB1dCgpIHNjcm9sbEJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnO1xuXG4gIC8qKlxuICAgKiBDaGFtYWRvIGFudGVzIGRlIGxvY2FsaXphciBvIGVsZW1lbnRvIHBvciBgZmllbGRJZGAgKGV4LjogYXRpdmFyIGEgYWJhIG9uZGUgZXN0w6EgbyBjYW1wbykuXG4gICAqIE1hbnTDqW0gbyBjb250cmF0byBkbyByZXN1bW8gY29tbyBmb250ZSDDum5pY2EgZGUgc2Nyb2xsL2ZvY28gZW0gYG5hdmlnYXRlVG9GaWVsZElkYC5cbiAgICovXG4gIEBJbnB1dCgpIGJlZm9yZUl0ZW1BY3RpdmF0ZT86IChpdGVtOiBWYWxpZGF0aW9uU3VtbWFyeUl0ZW0pID0+IHZvaWQ7XG5cbiAgLyoqIE1vc3RyYSBib3TDo28gcXVlIGFwZW5hcyBmZWNoYSBvIHBhaW5lbCAobsOjbyBhbHRlcmEgdmFsaWRhw6fDo28gbmVtIG8gZm9ybXVsw6FyaW8pLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0Nsb3NlQnV0dG9uID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1vc3RyYSBvIGJvdMOjbyBjb20gc2V0YXMgKHJlY29saGVyIC8gZXhwYW5kaXIpIGFvIGxhZG8gZG8gdMOtdHVsbyBwYXJhIGVzY29uZGVyIHPDsyBhIGxpc3RhXG4gICAqIGUgcG91cGFyIGVzcGHDp28gdmVydGljYWwgc2VtIGZlY2hhciBvIHBhaW5lbC5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TGlzdENvbGxhcHNlVG9nZ2xlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBjbG9zZUJ1dHRvbkxhYmVsID0gJ0ZlY2hhcic7XG5cbiAgLyoqIFRleHRvIGRhIGRpY2EgbmF0aXZhIChgdGl0bGVgKSBuYXMgbGluaGFzIGNvbSBkZXN0aW5vIGFvIGNhbXBvLiAqL1xuICBASW5wdXQoKSBmaWVsZE5hdmlnYXRlSGludCA9ICdDbGlxdWUgcGFyYSBpciBhbyBjYW1wby4nO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBwYW5lbENsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBDb20gYHBpbm5lZGA6IGJyZXZlIGZhZGUtaW4gYXDDs3MgbyBwYWluZWwgcGFzc2FyIGEgdmlzw612ZWwgKHNlbSBkZXNsb2NhciBvIGxheW91dCkuICovXG4gIHBpbm5lZE9wZW4gPSBmYWxzZTtcblxuICAvKiogYHRydWVgOiBsaXN0YSBkZSBlcnJvcyB2aXPDrXZlbDsgYGZhbHNlYDogc8OzIGNhYmXDp2FsaG8gKyBib3TDtWVzIChtZW5vcyBhbHR1cmEpLiAqL1xuICBwYW5lbEJvZHlFeHBhbmRlZCA9IHRydWU7XG5cbiAgcHJpdmF0ZSB3YXNTaG93biA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAndmFsaWRhdGlvbi1zdW1tYXJ5JyxcbiAgICAgIGB2YWxpZGF0aW9uLXN1bW1hcnktLSR7dGhpcy52YXJpYW50fWAsXG4gICAgXTtcbiAgICBpZiAodGhpcy5jb21wYWN0KSB7XG4gICAgICBwYXJ0cy5wdXNoKCd2YWxpZGF0aW9uLXN1bW1hcnktLWNvbXBhY3QnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGlubmVkICYmIHRoaXMuaXNTaG93bikge1xuICAgICAgcGFydHMucHVzaCgndmFsaWRhdGlvbi1zdW1tYXJ5LS1waW5uZWQtaG9zdCcpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNQaW5uZWRIb3N0VG9Cb2R5KCk7XG4gICAgY29uc3Qgc2hvd24gPSB0aGlzLmlzU2hvd247XG4gICAgaWYgKHRoaXMucGlubmVkICYmIHNob3duICYmICF0aGlzLndhc1Nob3duKSB7XG4gICAgICB0aGlzLnBpbm5lZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnBpbm5lZE9wZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXNob3duKSB7XG4gICAgICB0aGlzLnBpbm5lZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMucGFuZWxCb2R5RXhwYW5kZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLndhc1Nob3duID0gc2hvd247XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFBpbm5lZEhvc3RGcm9tQm9keSgpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhpZGRlbicpXG4gIGdldCBob3N0SGlkZGVuKCk6IHRydWUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pc1Nob3duID8gbnVsbCA6IHRydWU7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRJdGVtcygpOiBWYWxpZGF0aW9uU3VtbWFyeUl0ZW1bXSB7XG4gICAgY29uc3QgZnJvbUl0ZW1zID0gKHRoaXMuaXRlbXMgPz8gW10pLmZpbHRlcihcbiAgICAgIChpKSA9PiBpICYmIHR5cGVvZiBpLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGkubWVzc2FnZS50cmltKCkubGVuZ3RoID4gMCxcbiAgICApO1xuICAgIGlmIChmcm9tSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZyb21JdGVtcy5tYXAoKGkpID0+ICh7XG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZS50cmltKCksXG4gICAgICAgIGZpZWxkSWQ6IGkuZmllbGRJZD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLm1lc3NhZ2VzID8/IFtdKVxuICAgICAgLmZpbHRlcigobSkgPT4gdHlwZW9mIG0gPT09ICdzdHJpbmcnICYmIG0udHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAubWFwKChtZXNzYWdlKSA9PiAoeyBtZXNzYWdlOiBtZXNzYWdlLnRyaW0oKSB9KSk7XG4gIH1cblxuICBnZXQgaXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlICYmIHRoaXMucmVzb2x2ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25DbG9zZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMucGFuZWxDbG9zZS5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0b2dnbGVMaXN0Qm9keSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhbmVsQm9keUV4cGFuZGVkID0gIXRoaXMucGFuZWxCb2R5RXhwYW5kZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhdmUgZXN0w6F2ZWwgcGFyYSBgQGZvcmAg4oCUIGB0cmFjayAkaW5kZXhgIHJldXRpbGl6YSBtYWwgbsOzcyBxdWFuZG8gYSBsaXN0YSBtdWRhIGFvIHZpdm9cbiAgICogZSBvIGdldHRlciBgcmVzb2x2ZWRJdGVtc2AgZGV2b2x2ZSBub3ZhcyByZWZlcsOqbmNpYXMgYSBjYWRhIENELlxuICAgKi9cbiAgaXRlbVRyYWNrS2V5KHJvdzogVmFsaWRhdGlvblN1bW1hcnlJdGVtLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWQgPSByb3cuZmllbGRJZD8udHJpbSgpO1xuICAgIGlmIChmaWQpIHtcbiAgICAgIHJldHVybiBmaWQ7XG4gICAgfVxuICAgIHJldHVybiBgbXNnLSR7aW5kZXh9LSR7cm93Lm1lc3NhZ2V9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlxdWUgbmEgbGluaGEgY29tIGRlc3Rpbm86IHByaW1laXJvIGFsaW5oYSBhIGxpbmhhIG5vIGBsaXN0LXdyYXBgIGNvbSBzY3JvbGxcbiAgICogKGl0ZW5zIHBhcmNpYWxtZW50ZSB2aXPDrXZlaXMgcGFzc2FtIGEgZmljYXIgdG90YWxtZW50ZSB2aXPDrXZlaXMpLCBkZXBvaXMgbmF2ZWdhLlxuICAgKi9cbiAgb25TdW1tYXJ5TGlua0FjdGl2YXRlKGV2OiBFdmVudCwgaXRlbTogVmFsaWRhdGlvblN1bW1hcnlJdGVtKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgYmxvY2s6ICduZWFyZXN0JyxcbiAgICAgICAgaW5saW5lOiAnbmVhcmVzdCcsXG4gICAgICAgIGJlaGF2aW9yOiAnYXV0bycsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5vbkl0ZW1BY3RpdmF0ZShpdGVtKTtcbiAgfVxuXG4gIC8qKiBOYXZlZ2HDp8OjbyBhdMOpIG8gY29udHJvbGUgY29tIGBmaWVsZElkYCAoY2hhbWFkbyBhcMOzcyB7QGxpbmsgb25TdW1tYXJ5TGlua0FjdGl2YXRlfSkuICovXG4gIG9uSXRlbUFjdGl2YXRlKGl0ZW06IFZhbGlkYXRpb25TdW1tYXJ5SXRlbSk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gaXRlbS5maWVsZElkPy50cmltKCk7XG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlSXRlbUFjdGl2YXRlPy4oaXRlbSk7XG5cbiAgICAvLyAxKSBgYWZ0ZXJOZXh0UmVuZGVyYDogYXDDs3MgbyBET00gcmVmbGV0aXIgKGV4LjogbXVkYW7Dp2EgZGUgYWJhIGVtIGBiZWZvcmVJdGVtQWN0aXZhdGVgKS5cbiAgICAvLyAyKSBgc2V0VGltZW91dCgwKWA6IGZvcmEgZG8gY2ljbG8gZGUgdmVyaWZpY2HDp8OjbyDigJQgZXZpdGEgTkcwMTAwIGFvIGV4cGFuZGlyIGBhcHAtZm9ybS1ncm91cGAuXG4gICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubmF2aWdhdGVUb0ZpZWxkSWQoaWQpLCAwKTtcbiAgICAgIH0sXG4gICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbmF2aWdhdGVUb0ZpZWxkSWQoaWQ6IHN0cmluZywgYXR0ZW1wdCA9IDApOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIXJlc29sdmVkIHx8ICEocmVzb2x2ZWQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIGlmIChhdHRlbXB0IDwgdGhpcy5uYXZpZ2F0ZVRvRmllbGRNYXhBdHRlbXB0cykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBDb20gYGRlc3Ryb3lPbkNvbGxhcHNlYCwgbyBjb250cm9sZSBuw6NvIGV4aXN0ZSBubyBET00gZW5xdWFudG8gbyBgYXBwLWZvcm0tZ3JvdXBgIGVzdMOhIGZlY2hhZG87XG4gICAgICAgICAqIGBleHBhbmRDb2xsYXBzZWRGb3JtR3JvdXBBbmNlc3RvcnNgIG51bmNhIGNvcnJlIHBvcnF1ZSBkZXBlbmRlIGRvIGVsZW1lbnRvIGrDoSBleGlzdGlyLlxuICAgICAgICAgKiBFeHBhbmRpbW9zIHRvZG9zIG9zIGdydXBvcyBjb2xhcHNhZG9zIG5vIGA8Zm9ybT5gIG1haXMgcHLDs3hpbW8gZSByZXBldGltb3MgYXDDs3MgdW0gQ0QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4cGFuZENvbGxhcHNlZEZvcm1Hcm91cHNJbk5lYXJlc3RGb3JtKCk7XG4gICAgICAgIHRoaXMuYXBwUmVmLnRpY2soKTtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5uYXZpZ2F0ZVRvRmllbGRJZChpZCwgYXR0ZW1wdCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2VwYXJhZG9yZXMgaW5hdGl2b3MgKGBhcHAtZm9ybS10YWJgKSB1c2FtIGBbaGlkZGVuXWAg4oCUIGBnZXRFbGVtZW50QnlJZGAgZXhpc3RlIG1hcyBmb2NvIGZhbGhhXG4gICAgLy8gYXTDqSBvIHBhaW5lbCBlc3RhciB2aXPDrXZlbDsgcmUtdGVudGEgYXDDs3MgQ0QgKGV4LjogZGVtbyBBYmFzIGFvIHNhbHRhciBkZSBhYmEpLlxuICAgIGlmIChyZXNvbHZlZC5jbG9zZXN0KCdbaGlkZGVuXScpKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA8IHRoaXMubmF2aWdhdGVUb0ZpZWxkTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgdGhpcy5hcHBSZWYudGljaygpO1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm5hdmlnYXRlVG9GaWVsZElkKGlkLCBhdHRlbXB0ICsgMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbSBgYXBwLWZvcm0tZ3JvdXBgIGNvbGFwc2FkbyAoY29ycG8gYGRpc3BsYXk6IG5vbmVgKSwgYGdldEVsZW1lbnRCeUlkYCBhaW5kYSBlbmNvbnRyYSBvIGFsdm9cbiAgICAgKiBtYXMgbyBmb2NvIGZhbGhhIGF0w6kgbyBwcsOzeGltbyBDRCDigJQgc2VtIHJlaW50ZW50byBwYXJlY2UgcXVlIMOpIHByZWNpc28gdW0gc2VndW5kbyBjbGlxdWUgbm8gcmVzdW1vLlxuICAgICAqL1xuICAgIGlmICh0aGlzLmlzSW5zaWRlQ29sbGFwc2VkRm9ybUdyb3VwQm9keShyZXNvbHZlZCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kQ29sbGFwc2VkRm9ybUdyb3VwQW5jZXN0b3JzKHJlc29sdmVkKTtcbiAgICAgIHRoaXMuYXBwUmVmLnRpY2soKTtcbiAgICAgIGlmIChhdHRlbXB0IDwgdGhpcy5uYXZpZ2F0ZVRvRmllbGRNYXhBdHRlbXB0cykge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm5hdmlnYXRlVG9GaWVsZElkKGlkLCBhdHRlbXB0ICsgMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kQ29sbGFwc2VkRm9ybUdyb3VwQW5jZXN0b3JzKHJlc29sdmVkKTtcbiAgICB0aGlzLmFwcFJlZi50aWNrKCk7XG4gICAgdGhpcy5zY2hlZHVsZVNjcm9sbEFuZEZvY3VzQWZ0ZXJEb21GbHVzaChpZCk7XG4gIH1cblxuICAvKiogQXDDs3MgYHRpY2soKWAsIGdhcmFudGUgdW0gZnJhbWUgZGUgcGludHVyYSBhbnRlcyBkZSBzY3JvbGwvZm9jbyAoZXZpdGEgZm9jbyBlbSByYW1vIGFpbmRhIG9jdWx0bykuICovXG4gIHByaXZhdGUgc2NoZWR1bGVTY3JvbGxBbmRGb2N1c0FmdGVyRG9tRmx1c2goaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnNjcm9sbEFuZEZvY3VzRmllbGRCeUlkKGlkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVDb2xsYXBzZWRGb3JtR3JvdXBCb2R5KGVsOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBub2RlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKG5vZGUuY2xhc3NMaXN0Py5jb250YWlucygnZm9ybS1ncm91cF9fYm9keS0tY29sbGFwc2VkLWhpZGRlbicpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxBbmRGb2N1c0ZpZWxkQnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCB8fCAhKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMucmVzb2x2ZUZvY3VzYWJsZShlbCk7XG4gICAgZm9jdXNhYmxlLnNjcm9sbEludG9WaWV3KHtcbiAgICAgIGJlaGF2aW9yOiB0aGlzLnNjcm9sbEJlaGF2aW9yLFxuICAgICAgYmxvY2s6ICdjZW50ZXInLFxuICAgICAgaW5saW5lOiAnbmVhcmVzdCcsXG4gICAgfSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9jdXNhYmxlLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhcmEgYHVpLXJlcXVlc3QtZXhwYW5kYCBlbSBjYWRhIGBhcHAtZm9ybS1ncm91cGAgY29sYXBzYWRvIGRvIGZvcm11bMOhcmlvIHF1ZSBjb250w6ltIGVzdGUgcmVzdW1vLFxuICAgKiBwYXJhIG1vbnRhciBjYW1wb3MgY29tIGBkZXN0cm95T25Db2xsYXBzZWAgYW50ZXMgZGUgYGdldEVsZW1lbnRCeUlkKGZpZWxkSWQpYC5cbiAgICogT3JkZW0gZG8gRE9NIChwYWlzIGFudGVzIGRvcyBmaWxob3MpIGFsaW5oYSBhIGV4cGFuc8OjbyBkZSBncnVwb3MgYW5pbmhhZG9zLlxuICAgKi9cbiAgcHJpdmF0ZSBleHBhbmRDb2xsYXBzZWRGb3JtR3JvdXBzSW5OZWFyZXN0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtID1cbiAgICAgIHRoaXMubmVhcmVzdEZvcm0gPz8gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnZm9ybScpO1xuICAgIGlmICghKGZvcm0gaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvc3RzID0gQXJyYXkuZnJvbShcbiAgICAgIGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnYXBwLWZvcm0tZ3JvdXAuZm9ybS1ncm91cC0tY29sbGFwc2VkJyksXG4gICAgKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGZvciAoY29uc3QgaG9zdCBvZiBob3N0cykge1xuICAgICAgaG9zdC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoVUlfUkVRVUVTVF9FWFBBTkRfRk9STV9HUk9VUCwge1xuICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogRXhwYW5kZSBkbyBtYWlzIGV4dGVybm8gcGFyYSBvIG1haXMgaW50ZXJubyBwYXJhIG8gY29udGXDumRvIGZpY2FyIHZpc8OtdmVsLiAqL1xuICBwcml2YXRlIGV4cGFuZENvbGxhcHNlZEZvcm1Hcm91cEFuY2VzdG9ycyhzdGFydDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGxldCBub2RlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBzdGFydC5wYXJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwLWZvcm0tZ3JvdXAnICYmXG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb3JtLWdyb3VwLS1jb2xsYXBzZWQnKVxuICAgICAgKSB7XG4gICAgICAgIGhvc3RzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gaG9zdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGhvc3RzW2ldLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChVSV9SRVFVRVNUX0VYUEFORF9GT1JNX0dST1VQLCB7XG4gICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUZvY3VzYWJsZShlbDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaXNGb2N1c2FibGVFbGVtZW50KGVsKSkge1xuICAgICAgcmV0dXJuIGVsO1xuICAgIH1cbiAgICBjb25zdCBpbm5lciA9IGVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBidXR0b24sIFtocmVmXSwgW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyxcbiAgICApO1xuICAgIHJldHVybiBpbm5lciA/PyBlbDtcbiAgfVxuXG4gIHByaXZhdGUgaXNGb2N1c2FibGVFbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZTtcbiAgICBpZiAoXG4gICAgICB0YWcgPT09ICdJTlBVVCcgfHxcbiAgICAgIHRhZyA9PT0gJ1NFTEVDVCcgfHxcbiAgICAgIHRhZyA9PT0gJ1RFWFRBUkVBJyB8fFxuICAgICAgdGFnID09PSAnQlVUVE9OJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHRhYiA9IGVsLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICByZXR1cm4gdGFiICE9IG51bGwgJiYgdGFiICE9PSAnLTEnO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUGlubmVkSG9zdFRvQm9keSgpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc2hvdWxkUG9ydGFsID0gdGhpcy5waW5uZWQgJiYgdGhpcy5pc1Nob3duO1xuICAgIGlmIChzaG91bGRQb3J0YWwpIHtcbiAgICAgIGlmIChob3N0LnBhcmVudEVsZW1lbnQgPT09IHRoaXMuZG9jdW1lbnQuYm9keSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm5lYXJlc3RGb3JtID0gaG9zdC5jbG9zZXN0KCdmb3JtJyk7XG4gICAgICB0aGlzLnBpbm5lZFBvcnRhbE9yaWdpbmFsUGFyZW50ID0gaG9zdC5wYXJlbnRFbGVtZW50O1xuICAgICAgdGhpcy5waW5uZWRQb3J0YWxPcmlnaW5hbE5leHQgPSBob3N0Lm5leHRTaWJsaW5nO1xuICAgICAgaWYgKHRoaXMucGlubmVkUG9ydGFsT3JpZ2luYWxQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRldGFjaFBpbm5lZEhvc3RGcm9tQm9keSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hQaW5uZWRIb3N0RnJvbUJvZHkoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChob3N0LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuZG9jdW1lbnQuYm9keSB8fCAhdGhpcy5waW5uZWRQb3J0YWxPcmlnaW5hbFBhcmVudCkge1xuICAgICAgdGhpcy5uZWFyZXN0Rm9ybSA9IG51bGw7XG4gICAgICB0aGlzLnBpbm5lZFBvcnRhbE9yaWdpbmFsUGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMucGlubmVkUG9ydGFsT3JpZ2luYWxOZXh0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5waW5uZWRQb3J0YWxPcmlnaW5hbFBhcmVudDtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5waW5uZWRQb3J0YWxPcmlnaW5hbE5leHQ7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuZXh0Py5wYXJlbnROb2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShob3N0LCBuZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChob3N0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChob3N0KTtcbiAgICB9XG4gICAgdGhpcy5uZWFyZXN0Rm9ybSA9IG51bGw7XG4gICAgdGhpcy5waW5uZWRQb3J0YWxPcmlnaW5hbFBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5waW5uZWRQb3J0YWxPcmlnaW5hbE5leHQgPSBudWxsO1xuICB9XG59XG4iLCJAaWYgKGlzU2hvd24pIHtcclxuPGRpdiBjbGFzcz1cInZhbGlkYXRpb24tc3VtbWFyeV9fcGFuZWxcIiByb2xlPVwicmVnaW9uXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlLnRyaW0oKSA/IHRpdGxlRWxlbWVudElkIDogbnVsbFwiXHJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aXRsZS50cmltKCkgPyBudWxsIDogJ1Jlc3VtbyBkZSB2YWxpZGHDp8OjbydcIlxyXG4gIFtjbGFzcy52YWxpZGF0aW9uLXN1bW1hcnlfX3BhbmVsLS1waW5uZWRdPVwicGlubmVkXCJcclxuICBbY2xhc3MudmFsaWRhdGlvbi1zdW1tYXJ5X19wYW5lbC0tcGlubmVkLW9wZW5dPVwicGlubmVkICYmIHBpbm5lZE9wZW5cIlxyXG4gIFtjbGFzcy52YWxpZGF0aW9uLXN1bW1hcnlfX3BhbmVsLS1saXN0LWNvbGxhcHNlZF09XCIhcGFuZWxCb2R5RXhwYW5kZWRcIj5cclxuICA8ZGl2IGNsYXNzPVwidmFsaWRhdGlvbi1zdW1tYXJ5X19oZWFkXCI+XHJcbiAgICBAaWYgKHNob3dMaXN0Q29sbGFwc2VUb2dnbGUpIHtcclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmFsaWRhdGlvbi1zdW1tYXJ5X19jb2xsYXBzZS10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlTGlzdEJvZHkoKVwiXHJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWxCb2R5RXhwYW5kZWRcIiBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImxpc3RSZWdpb25JZFwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicGFuZWxCb2R5RXhwYW5kZWQgPyAnUmVjb2xoZXIgbGlzdGEgZGUgZXJyb3MnIDogJ0V4cGFuZGlyIGxpc3RhIGRlIGVycm9zJ1wiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhLXNvbGlkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW2NsYXNzLmZhLWNoZXZyb24tdXBdPVwicGFuZWxCb2R5RXhwYW5kZWRcIlxyXG4gICAgICAgIFtjbGFzcy5mYS1jaGV2cm9uLWRvd25dPVwiIXBhbmVsQm9keUV4cGFuZGVkXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKHRpdGxlLnRyaW0oKSkge1xyXG4gICAgPGgzIGNsYXNzPVwidmFsaWRhdGlvbi1zdW1tYXJ5X190aXRsZVwiIFtpZF09XCJ0aXRsZUVsZW1lbnRJZFwiPlxyXG4gICAgICB7eyB0aXRsZSB9fVxyXG4gICAgPC9oMz5cclxuICAgIH1cclxuICAgIEBpZiAoc2hvd0Nsb3NlQnV0dG9uKSB7XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZhbGlkYXRpb24tc3VtbWFyeV9fY2xvc2VcIiAoY2xpY2spPVwib25DbG9zZUNsaWNrKClcIj5cclxuICAgICAge3sgY2xvc2VCdXR0b25MYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInZhbGlkYXRpb24tc3VtbWFyeV9fbGlzdC13cmFwXCIgW2lkXT1cImxpc3RSZWdpb25JZFwiXHJcbiAgICBbY2xhc3MudmFsaWRhdGlvbi1zdW1tYXJ5X19saXN0LXdyYXAtLXNjcm9sbGFibGVdPVwiISFwYW5lbE1heEhlaWdodCAmJiBwYW5lbEJvZHlFeHBhbmRlZFwiXHJcbiAgICBbY2xhc3MudmFsaWRhdGlvbi1zdW1tYXJ5X19saXN0LXdyYXAtLWNvbGxhcHNlZF09XCIhcGFuZWxCb2R5RXhwYW5kZWRcIlxyXG4gICAgW3N0eWxlLm1heC1oZWlnaHRdPVwicGFuZWxCb2R5RXhwYW5kZWQgPyAocGFuZWxNYXhIZWlnaHQgfHwgbnVsbCkgOiBudWxsXCIgW2F0dHIudGl0bGVdPVwiZmllbGROYXZpZ2F0ZUhpbnRcIj5cclxuICAgIDx1bCBjbGFzcz1cInZhbGlkYXRpb24tc3VtbWFyeV9fbGlzdFwiIHJvbGU9XCJsaXN0XCI+XHJcbiAgICAgIEBmb3IgKHJvdyBvZiByZXNvbHZlZEl0ZW1zOyB0cmFjayBpdGVtVHJhY2tLZXkocm93LCAkaW5kZXgpKSB7XHJcbiAgICAgIDxsaSBjbGFzcz1cInZhbGlkYXRpb24tc3VtbWFyeV9faXRlbVwiIHJvbGU9XCJsaXN0aXRlbVwiIChjbGljayk9XCJvblN1bW1hcnlMaW5rQWN0aXZhdGUoJGV2ZW50LCByb3cpXCI+XHJcbiAgICAgICAgQGlmIChyb3cuZmllbGRJZCkge1xyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmFsaWRhdGlvbi1zdW1tYXJ5X19saW5rXCIgW2F0dHIudGl0bGVdPVwiZmllbGROYXZpZ2F0ZUhpbnRcIj5cclxuICAgICAgICAgIHt7IHJvdy5tZXNzYWdlIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWxpZGF0aW9uLXN1bW1hcnlfX3RleHRcIj57eyByb3cubWVzc2FnZSB9fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbGk+XHJcbiAgICAgIH1cclxuICAgIDwvdWw+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59Il19
@@ -0,0 +1,7 @@
1
+ export { SkeletonBlockComponent } from './skeleton-block/skeleton-block.component';
2
+ export { SkeletonTextComponent } from './skeleton-text/skeleton-text.component';
3
+ export { SkeletonListComponent } from './skeleton-list/skeleton-list.component';
4
+ export { SkeletonCardComponent } from './skeleton-card/skeleton-card.component';
5
+ export { SkeletonTableComponent } from './skeleton-table/skeleton-table.component';
6
+ export { SkeletonFieldShellComponent, } from './skeleton-field-shell/skeleton-field-shell.component';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2xvYWRpbmcvc2tlbGV0b24tbG9hZGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQ0wsMkJBQTJCLEdBRTVCLE1BQU0sdURBQXVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTa2VsZXRvbkJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9za2VsZXRvbi1ibG9jay9za2VsZXRvbi1ibG9jay5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBTa2VsZXRvblRleHRDb21wb25lbnQgfSBmcm9tICcuL3NrZWxldG9uLXRleHQvc2tlbGV0b24tdGV4dC5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBTa2VsZXRvbkxpc3RDb21wb25lbnQgfSBmcm9tICcuL3NrZWxldG9uLWxpc3Qvc2tlbGV0b24tbGlzdC5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBTa2VsZXRvbkNhcmRDb21wb25lbnQgfSBmcm9tICcuL3NrZWxldG9uLWNhcmQvc2tlbGV0b24tY2FyZC5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBTa2VsZXRvblRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9za2VsZXRvbi10YWJsZS9za2VsZXRvbi10YWJsZS5jb21wb25lbnQnO1xyXG5leHBvcnQge1xyXG4gIFNrZWxldG9uRmllbGRTaGVsbENvbXBvbmVudCxcclxuICB0eXBlIFNrZWxldG9uRmllbGRTaGVsbFZhcmlhbnQsXHJcbn0gZnJvbSAnLi9za2VsZXRvbi1maWVsZC1zaGVsbC9za2VsZXRvbi1maWVsZC1zaGVsbC5jb21wb25lbnQnO1xyXG4iXX0=
@@ -0,0 +1,43 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, booleanAttribute, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** Bloco genérico de skeleton (linhas, caixas, células). */
4
+ export class SkeletonBlockComponent {
5
+ constructor() {
6
+ /** Largura CSS (ex.: `100%`, `6rem`, `40%`). */
7
+ this.width = '100%';
8
+ /** Altura CSS. */
9
+ this.height = '0.75rem';
10
+ /** Raio de canto. */
11
+ this.radius = '8px';
12
+ this.animate = true;
13
+ }
14
+ get hostClass() {
15
+ const parts = ['skeleton-block'];
16
+ if (this.animate) {
17
+ parts.push('skeleton-block--animate');
18
+ }
19
+ else {
20
+ parts.push('skeleton-block--static');
21
+ }
22
+ return parts.join(' ');
23
+ }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SkeletonBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.12", type: SkeletonBlockComponent, isStandalone: true, selector: "app-skeleton-block", inputs: { width: "width", height: "height", radius: "radius", animate: ["animate", "animate", booleanAttribute] }, host: { properties: { "class": "this.hostClass" } }, ngImport: i0, template: "<span class=\"skeleton-block__inner\" aria-hidden=\"true\" [style.width]=\"width\" [style.height]=\"height\"\r\n [style.border-radius]=\"radius\"></span>\r\n", styles: ["@keyframes ui-skeleton-shimmer{to{transform:translate(100%)}}:host{display:block;min-width:0;box-sizing:border-box}.skeleton-block__inner{display:block;min-width:0;box-sizing:border-box}:host(.skeleton-block--animate) .skeleton-block__inner{position:relative;overflow:hidden;background:var(--app-color-skeleton-track, rgba(26, 47, 69, .09))}:host(.skeleton-block--animate) .skeleton-block__inner:after{content:\"\";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,var(--app-color-skeleton-shine, rgba(255, 255, 255, .22)),transparent);animation:ui-skeleton-shimmer 1.35s ease-in-out infinite}:host(.skeleton-block--static) .skeleton-block__inner{background:var(--app-color-skeleton-track-strong, rgba(26, 47, 69, .12))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SkeletonBlockComponent, decorators: [{
28
+ type: Component,
29
+ args: [{ selector: 'app-skeleton-block', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"skeleton-block__inner\" aria-hidden=\"true\" [style.width]=\"width\" [style.height]=\"height\"\r\n [style.border-radius]=\"radius\"></span>\r\n", styles: ["@keyframes ui-skeleton-shimmer{to{transform:translate(100%)}}:host{display:block;min-width:0;box-sizing:border-box}.skeleton-block__inner{display:block;min-width:0;box-sizing:border-box}:host(.skeleton-block--animate) .skeleton-block__inner{position:relative;overflow:hidden;background:var(--app-color-skeleton-track, rgba(26, 47, 69, .09))}:host(.skeleton-block--animate) .skeleton-block__inner:after{content:\"\";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,var(--app-color-skeleton-shine, rgba(255, 255, 255, .22)),transparent);animation:ui-skeleton-shimmer 1.35s ease-in-out infinite}:host(.skeleton-block--static) .skeleton-block__inner{background:var(--app-color-skeleton-track-strong, rgba(26, 47, 69, .12))}\n"] }]
30
+ }], propDecorators: { width: [{
31
+ type: Input
32
+ }], height: [{
33
+ type: Input
34
+ }], radius: [{
35
+ type: Input
36
+ }], animate: [{
37
+ type: Input,
38
+ args: [{ transform: booleanAttribute }]
39
+ }], hostClass: [{
40
+ type: HostBinding,
41
+ args: ['class']
42
+ }] } });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tlbGV0b24tYmxvY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9sb2FkaW5nL3NrZWxldG9uLWxvYWRpbmcvc2tlbGV0b24tYmxvY2svc2tlbGV0b24tYmxvY2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9sb2FkaW5nL3NrZWxldG9uLWxvYWRpbmcvc2tlbGV0b24tYmxvY2svc2tlbGV0b24tYmxvY2suY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFDTCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7O0FBRXZCLDREQUE0RDtBQVE1RCxNQUFNLE9BQU8sc0JBQXNCO0lBUG5DO1FBUUUsZ0RBQWdEO1FBQ3ZDLFVBQUssR0FBRyxNQUFNLENBQUM7UUFDeEIsa0JBQWtCO1FBQ1QsV0FBTSxHQUFHLFNBQVMsQ0FBQztRQUM1QixxQkFBcUI7UUFDWixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWdCLFlBQU8sR0FBRyxJQUFJLENBQUM7S0FZeEQ7SUFWQyxJQUNJLFNBQVM7UUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQzsrR0FuQlUsc0JBQXNCO21HQUF0QixzQkFBc0Isb0pBUWIsZ0JBQWdCLGtGQ3hCdEMsZ0tBRUE7OzRGRGNhLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxtQkFHQyx1QkFBdUIsQ0FBQyxNQUFNOzhCQUl0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFa0MsT0FBTztzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFHbEMsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBIb3N0QmluZGluZyxcclxuICBJbnB1dCxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqIEJsb2NvIGdlbsOpcmljbyBkZSBza2VsZXRvbiAobGluaGFzLCBjYWl4YXMsIGPDqWx1bGFzKS4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc2tlbGV0b24tYmxvY2snLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NrZWxldG9uLWJsb2NrLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc2tlbGV0b24tYmxvY2suY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2tlbGV0b25CbG9ja0NvbXBvbmVudCB7XHJcbiAgLyoqIExhcmd1cmEgQ1NTIChleC46IGAxMDAlYCwgYDZyZW1gLCBgNDAlYCkuICovXHJcbiAgQElucHV0KCkgd2lkdGggPSAnMTAwJSc7XHJcbiAgLyoqIEFsdHVyYSBDU1MuICovXHJcbiAgQElucHV0KCkgaGVpZ2h0ID0gJzAuNzVyZW0nO1xyXG4gIC8qKiBSYWlvIGRlIGNhbnRvLiAqL1xyXG4gIEBJbnB1dCgpIHJhZGl1cyA9ICc4cHgnO1xyXG5cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYW5pbWF0ZSA9IHRydWU7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcnRzID0gWydza2VsZXRvbi1ibG9jayddO1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0ZSkge1xyXG4gICAgICBwYXJ0cy5wdXNoKCdza2VsZXRvbi1ibG9jay0tYW5pbWF0ZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFydHMucHVzaCgnc2tlbGV0b24tYmxvY2stLXN0YXRpYycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcclxuICB9XHJcbn1cclxuIiwiPHNwYW4gY2xhc3M9XCJza2VsZXRvbi1ibG9ja19faW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc3R5bGUud2lkdGhdPVwid2lkdGhcIiBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiXHJcbiAgW3N0eWxlLmJvcmRlci1yYWRpdXNdPVwicmFkaXVzXCI+PC9zcGFuPlxyXG4iXX0=
@@ -0,0 +1,23 @@
1
+ import { ChangeDetectionStrategy, Component, Input, booleanAttribute, } from '@angular/core';
2
+ import { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';
3
+ import * as i0 from "@angular/core";
4
+ /** Placeholder de cartão (avatar + texto + ações). */
5
+ export class SkeletonCardComponent {
6
+ constructor() {
7
+ this.showActions = true;
8
+ this.animate = true;
9
+ }
10
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SkeletonCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SkeletonCardComponent, isStandalone: true, selector: "app-skeleton-card", inputs: { showActions: ["showActions", "showActions", booleanAttribute], animate: ["animate", "animate", booleanAttribute] }, ngImport: i0, template: "<div class=\"skeleton-card\" aria-hidden=\"true\">\r\n <div class=\"skeleton-card__row\">\r\n <div class=\"skeleton-card__main\">\r\n <app-skeleton-block class=\"skeleton-card__avatar\" width=\"2.35rem\" height=\"2.35rem\" radius=\"999px\"\r\n [animate]=\"animate\" />\r\n <div class=\"skeleton-card__text\">\r\n <app-skeleton-block width=\"72%\" height=\"0.72rem\" radius=\"6px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"48%\" height=\"0.62rem\" radius=\"6px\" [animate]=\"animate\" />\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"skeleton-card__actions\">\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;min-width:0}.skeleton-card{box-sizing:border-box;border-radius:10px;border:1px solid rgba(26,47,69,.08);background:#fff;padding:.85rem 1rem}.skeleton-card__row{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.skeleton-card__main{display:flex;align-items:flex-start;gap:.65rem;min-width:0;flex:1}.skeleton-card__avatar{flex-shrink:0}.skeleton-card__text{display:flex;flex-direction:column;gap:.45rem;flex:1 1 auto;min-width:0;padding-top:.15rem}.skeleton-card__actions{display:flex;gap:.35rem;flex-shrink:0}\n"], dependencies: [{ kind: "component", type: SkeletonBlockComponent, selector: "app-skeleton-block", inputs: ["width", "height", "radius", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SkeletonCardComponent, decorators: [{
14
+ type: Component,
15
+ args: [{ selector: 'app-skeleton-card', standalone: true, imports: [SkeletonBlockComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"skeleton-card\" aria-hidden=\"true\">\r\n <div class=\"skeleton-card__row\">\r\n <div class=\"skeleton-card__main\">\r\n <app-skeleton-block class=\"skeleton-card__avatar\" width=\"2.35rem\" height=\"2.35rem\" radius=\"999px\"\r\n [animate]=\"animate\" />\r\n <div class=\"skeleton-card__text\">\r\n <app-skeleton-block width=\"72%\" height=\"0.72rem\" radius=\"6px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"48%\" height=\"0.62rem\" radius=\"6px\" [animate]=\"animate\" />\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"skeleton-card__actions\">\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;min-width:0}.skeleton-card{box-sizing:border-box;border-radius:10px;border:1px solid rgba(26,47,69,.08);background:#fff;padding:.85rem 1rem}.skeleton-card__row{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.skeleton-card__main{display:flex;align-items:flex-start;gap:.65rem;min-width:0;flex:1}.skeleton-card__avatar{flex-shrink:0}.skeleton-card__text{display:flex;flex-direction:column;gap:.45rem;flex:1 1 auto;min-width:0;padding-top:.15rem}.skeleton-card__actions{display:flex;gap:.35rem;flex-shrink:0}\n"] }]
16
+ }], propDecorators: { showActions: [{
17
+ type: Input,
18
+ args: [{ transform: booleanAttribute }]
19
+ }], animate: [{
20
+ type: Input,
21
+ args: [{ transform: booleanAttribute }]
22
+ }] } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tlbGV0b24tY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2xvYWRpbmcvc2tlbGV0b24tbG9hZGluZy9za2VsZXRvbi1jYXJkL3NrZWxldG9uLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9sb2FkaW5nL3NrZWxldG9uLWxvYWRpbmcvc2tlbGV0b24tY2FyZC9za2VsZXRvbi1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFDTCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBRXBGLHNEQUFzRDtBQVN0RCxNQUFNLE9BQU8scUJBQXFCO0lBUmxDO1FBUzBDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLFlBQU8sR0FBRyxJQUFJLENBQUM7S0FDeEQ7K0dBSFkscUJBQXFCO21HQUFyQixxQkFBcUIsMkdBQ1osZ0JBQWdCLG1DQUNoQixnQkFBZ0IsNkJDbkJ0QywyM0JBa0JBLGtuQkROWSxzQkFBc0I7OzRGQUtyQixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUCxDQUFDLHNCQUFzQixDQUFDLG1CQUdoQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUdQLFdBQVc7c0JBQWxELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsT0FBTztzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNrZWxldG9uQmxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9za2VsZXRvbi1ibG9jay9za2VsZXRvbi1ibG9jay5jb21wb25lbnQnO1xyXG5cclxuLyoqIFBsYWNlaG9sZGVyIGRlIGNhcnTDo28gKGF2YXRhciArIHRleHRvICsgYcOnw7VlcykuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNrZWxldG9uLWNhcmQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1NrZWxldG9uQmxvY2tDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9za2VsZXRvbi1jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc2tlbGV0b24tY2FyZC5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkNhcmRDb21wb25lbnQge1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QWN0aW9ucyA9IHRydWU7XHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFuaW1hdGUgPSB0cnVlO1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJza2VsZXRvbi1jYXJkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWNhcmRfX3Jvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWNhcmRfX21haW5cIj5cclxuICAgICAgPGFwcC1za2VsZXRvbi1ibG9jayBjbGFzcz1cInNrZWxldG9uLWNhcmRfX2F2YXRhclwiIHdpZHRoPVwiMi4zNXJlbVwiIGhlaWdodD1cIjIuMzVyZW1cIiByYWRpdXM9XCI5OTlweFwiXHJcbiAgICAgICAgW2FuaW1hdGVdPVwiYW5pbWF0ZVwiIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi1jYXJkX190ZXh0XCI+XHJcbiAgICAgICAgPGFwcC1za2VsZXRvbi1ibG9jayB3aWR0aD1cIjcyJVwiIGhlaWdodD1cIjAuNzJyZW1cIiByYWRpdXM9XCI2cHhcIiBbYW5pbWF0ZV09XCJhbmltYXRlXCIgLz5cclxuICAgICAgICA8YXBwLXNrZWxldG9uLWJsb2NrIHdpZHRoPVwiNDglXCIgaGVpZ2h0PVwiMC42MnJlbVwiIHJhZGl1cz1cIjZweFwiIFthbmltYXRlXT1cImFuaW1hdGVcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgQGlmIChzaG93QWN0aW9ucykge1xyXG4gICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWNhcmRfX2FjdGlvbnNcIj5cclxuICAgICAgPGFwcC1za2VsZXRvbi1ibG9jayB3aWR0aD1cIjJyZW1cIiBoZWlnaHQ9XCIycmVtXCIgcmFkaXVzPVwiOHB4XCIgW2FuaW1hdGVdPVwiYW5pbWF0ZVwiIC8+XHJcbiAgICAgIDxhcHAtc2tlbGV0b24tYmxvY2sgd2lkdGg9XCIycmVtXCIgaGVpZ2h0PVwiMnJlbVwiIHJhZGl1cz1cIjhweFwiIFthbmltYXRlXT1cImFuaW1hdGVcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=