structra-ui 0.1.4 → 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,36 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, booleanAttribute, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Botão só ícone (setas «abrir/fechar») para recolher/expandir a largura da lateral.
5
+ * Na demo, usar com `appSidebarToolbar` projectado em `app-sidebar`.
6
+ */
7
+ export class AppShellSidebarToggleComponent {
8
+ constructor() {
9
+ /** `true` quando a lateral está estreita / recolhida. */
10
+ this.collapsed = false;
11
+ /** Rótulos acessíveis quando `collapsed` é `true` (accção: expandir). */
12
+ this.expandLabel = 'Expandir navegação';
13
+ /** Rótulos quando `collapsed` é `false` (accção: recolher). */
14
+ this.collapseLabel = 'Recolher navegação';
15
+ this.toggle = new EventEmitter();
16
+ }
17
+ onClick() {
18
+ this.toggle.emit();
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppShellSidebarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.12", type: AppShellSidebarToggleComponent, isStandalone: true, selector: "app-shell-sidebar-toggle", inputs: { collapsed: ["collapsed", "collapsed", booleanAttribute], expandLabel: "expandLabel", collapseLabel: "collapseLabel" }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<button\r\n type=\"button\"\r\n class=\"app-shell-sidebar-toggle__btn\"\r\n [attr.aria-pressed]=\"collapsed\"\r\n [attr.aria-expanded]=\"!collapsed\"\r\n [attr.aria-label]=\"collapsed ? expandLabel : collapseLabel\"\r\n [attr.title]=\"collapsed ? expandLabel : collapseLabel\"\r\n (click)=\"onClick()\"\r\n>\r\n <i\r\n class=\"fa-solid\"\r\n [class.fa-angles-left]=\"!collapsed\"\r\n [class.fa-angles-right]=\"collapsed\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n</button>\r\n", styles: ["@charset \"UTF-8\";.app-shell-sidebar-toggle__btn{display:inline-flex;align-items:center;justify-content:center;width:2.35rem;height:2.35rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--app-color-text-secondary, #4a6682);cursor:pointer;line-height:1;font-size:.92rem;transition:background .16s ease,color .16s ease}.app-shell-sidebar-toggle__btn:hover{background:color-mix(in srgb,var(--app-color-primary) 6%,transparent);color:var(--app-color-primary)}.app-shell-sidebar-toggle__btn:focus-visible{outline:2px solid var(--app-color-nav-focus-ring);outline-offset:2px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppShellSidebarToggleComponent, decorators: [{
24
+ type: Component,
25
+ args: [{ selector: 'app-shell-sidebar-toggle', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\r\n type=\"button\"\r\n class=\"app-shell-sidebar-toggle__btn\"\r\n [attr.aria-pressed]=\"collapsed\"\r\n [attr.aria-expanded]=\"!collapsed\"\r\n [attr.aria-label]=\"collapsed ? expandLabel : collapseLabel\"\r\n [attr.title]=\"collapsed ? expandLabel : collapseLabel\"\r\n (click)=\"onClick()\"\r\n>\r\n <i\r\n class=\"fa-solid\"\r\n [class.fa-angles-left]=\"!collapsed\"\r\n [class.fa-angles-right]=\"collapsed\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n</button>\r\n", styles: ["@charset \"UTF-8\";.app-shell-sidebar-toggle__btn{display:inline-flex;align-items:center;justify-content:center;width:2.35rem;height:2.35rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--app-color-text-secondary, #4a6682);cursor:pointer;line-height:1;font-size:.92rem;transition:background .16s ease,color .16s ease}.app-shell-sidebar-toggle__btn:hover{background:color-mix(in srgb,var(--app-color-primary) 6%,transparent);color:var(--app-color-primary)}.app-shell-sidebar-toggle__btn:focus-visible{outline:2px solid var(--app-color-nav-focus-ring);outline-offset:2px}\n"] }]
26
+ }], propDecorators: { collapsed: [{
27
+ type: Input,
28
+ args: [{ transform: booleanAttribute }]
29
+ }], expandLabel: [{
30
+ type: Input
31
+ }], collapseLabel: [{
32
+ type: Input
33
+ }], toggle: [{
34
+ type: Output
35
+ }] } });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtc2lkZWJhci10b2dnbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvc2lkZWJhci9zaGVsbC1zaWRlYmFyLXRvZ2dsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2FwcC1zaGVsbC9zaWRlYmFyL3NoZWxsLXNpZGViYXItdG9nZ2xlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQzs7QUFFdkI7OztHQUdHO0FBUUgsTUFBTSxPQUFPLDhCQUE4QjtJQVAzQztRQVFFLHlEQUF5RDtRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTFELHlFQUF5RTtRQUNoRSxnQkFBVyxHQUFHLG9CQUFvQixDQUFDO1FBRTVDLCtEQUErRDtRQUN0RCxrQkFBYSxHQUFHLG9CQUFvQixDQUFDO1FBRTNCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBS3REO0lBSEMsT0FBTztRQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQzsrR0FkVSw4QkFBOEI7bUdBQTlCLDhCQUE4Qiw0R0FFckIsZ0JBQWdCLHdIQ3RCdEMsZ2ZBZ0JBOzs0RkRJYSw4QkFBOEI7a0JBUDFDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTTs4QkFJUCxTQUFTO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUc3QixXQUFXO3NCQUFuQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRWEsTUFBTTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBCb3TDo28gc8OzIMOtY29uZSAoc2V0YXMgwqthYnJpci9mZWNoYXLCuykgcGFyYSByZWNvbGhlci9leHBhbmRpciBhIGxhcmd1cmEgZGEgbGF0ZXJhbC5cclxuICogTmEgZGVtbywgdXNhciBjb20gYGFwcFNpZGViYXJUb29sYmFyYCBwcm9qZWN0YWRvIGVtIGBhcHAtc2lkZWJhcmAuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zaGVsbC1zaWRlYmFyLXRvZ2dsZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2hlbGwtc2lkZWJhci10b2dnbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zaGVsbC1zaWRlYmFyLXRvZ2dsZS5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcHBTaGVsbFNpZGViYXJUb2dnbGVDb21wb25lbnQge1xyXG4gIC8qKiBgdHJ1ZWAgcXVhbmRvIGEgbGF0ZXJhbCBlc3TDoSBlc3RyZWl0YSAvIHJlY29saGlkYS4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gIC8qKiBSw7N0dWxvcyBhY2Vzc8OtdmVpcyBxdWFuZG8gYGNvbGxhcHNlZGAgw6kgYHRydWVgIChhY2PDp8OjbzogZXhwYW5kaXIpLiAqL1xyXG4gIEBJbnB1dCgpIGV4cGFuZExhYmVsID0gJ0V4cGFuZGlyIG5hdmVnYcOnw6NvJztcclxuXHJcbiAgLyoqIFLDs3R1bG9zIHF1YW5kbyBgY29sbGFwc2VkYCDDqSBgZmFsc2VgIChhY2PDp8OjbzogcmVjb2xoZXIpLiAqL1xyXG4gIEBJbnB1dCgpIGNvbGxhcHNlTGFiZWwgPSAnUmVjb2xoZXIgbmF2ZWdhw6fDo28nO1xyXG5cclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBvbkNsaWNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy50b2dnbGUuZW1pdCgpO1xyXG4gIH1cclxufVxyXG4iLCI8YnV0dG9uXHJcbiAgdHlwZT1cImJ1dHRvblwiXHJcbiAgY2xhc3M9XCJhcHAtc2hlbGwtc2lkZWJhci10b2dnbGVfX2J0blwiXHJcbiAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImNvbGxhcHNlZFwiXHJcbiAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhY29sbGFwc2VkXCJcclxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbGxhcHNlZCA/IGV4cGFuZExhYmVsIDogY29sbGFwc2VMYWJlbFwiXHJcbiAgW2F0dHIudGl0bGVdPVwiY29sbGFwc2VkID8gZXhwYW5kTGFiZWwgOiBjb2xsYXBzZUxhYmVsXCJcclxuICAoY2xpY2spPVwib25DbGljaygpXCJcclxuPlxyXG4gIDxpXHJcbiAgICBjbGFzcz1cImZhLXNvbGlkXCJcclxuICAgIFtjbGFzcy5mYS1hbmdsZXMtbGVmdF09XCIhY29sbGFwc2VkXCJcclxuICAgIFtjbGFzcy5mYS1hbmdsZXMtcmlnaHRdPVwiY29sbGFwc2VkXCJcclxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgPjwvaT5cclxuPC9idXR0b24+XHJcbiJdfQ==
@@ -0,0 +1,84 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, EventEmitter, HostBinding, Input, Output, booleanAttribute, inject, signal, } from '@angular/core';
2
+ import { MenuListComponent } from '../../menus/menu-list/menu-list.component';
3
+ import { AppThemeService } from '../../theme';
4
+ import { APP_SIDEBAR_NAV_REVEAL_TOTAL_MS } from '../sidebar-reveal.constants';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Navegação lateral com o mesmo modelo `MenuNodeItem` dos menus da lib (grupos, submenus, teclado).
8
+ * Com `collapsed`, `app-menu-list` usa `compressText`: rótulos de grupo (ex. «Principal») ficam ocultos;
9
+ * itens mostram só ícones com `title` / `aria-label` para acessibilidade.
10
+ */
11
+ export class AppSidebarComponent {
12
+ /**
13
+ * Garante `.app-library-theme` + `theme-*` no host para tokens `--app-color-nav-*` e lista
14
+ * herdarem a paleta activa (útil fora da demo ou sem antepassado tematizado).
15
+ */
16
+ get hostThemeClasses() {
17
+ return `app-library-theme ${this.theme.themeClass()}`;
18
+ }
19
+ constructor() {
20
+ this.theme = inject(AppThemeService);
21
+ this.destroyRef = inject(DestroyRef);
22
+ this.menuId = 'app-shell-sidebar';
23
+ /** Sincronizar com o item de navegação activo (realce persistente). */
24
+ this.selectedItemId = null;
25
+ /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */
26
+ this.collapsed = false;
27
+ this.itemSelect = new EventEmitter();
28
+ /**
29
+ * Valor efectivo de `compressText` em `app-menu-list`: ao expandir, mantém-se comprimido
30
+ * até a lateral terminar a animação de largura (evita flicker de texto).
31
+ */
32
+ this.listCompressText = signal(true);
33
+ this.listRevealTimeoutId = null;
34
+ this.destroyRef.onDestroy(() => this.clearListRevealTimeout());
35
+ }
36
+ ngOnChanges(changes) {
37
+ const collapsedCh = changes['collapsed'];
38
+ if (!collapsedCh) {
39
+ return;
40
+ }
41
+ this.clearListRevealTimeout();
42
+ if (collapsedCh.firstChange) {
43
+ this.listCompressText.set(this.collapsed);
44
+ return;
45
+ }
46
+ if (this.collapsed) {
47
+ this.listCompressText.set(true);
48
+ return;
49
+ }
50
+ this.listCompressText.set(true);
51
+ this.listRevealTimeoutId = setTimeout(() => {
52
+ this.listRevealTimeoutId = null;
53
+ this.listCompressText.set(false);
54
+ }, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS);
55
+ }
56
+ clearListRevealTimeout() {
57
+ if (this.listRevealTimeoutId !== null) {
58
+ clearTimeout(this.listRevealTimeoutId);
59
+ this.listRevealTimeoutId = null;
60
+ }
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
63
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.12", type: AppSidebarComponent, isStandalone: true, selector: "app-sidebar", inputs: { items: "items", menuId: "menuId", selectedItemId: "selectedItemId", collapsed: ["collapsed", "collapsed", booleanAttribute] }, outputs: { itemSelect: "itemSelect" }, host: { properties: { "class": "this.hostThemeClasses" } }, usesOnChanges: true, ngImport: i0, template: "<nav class=\"app-sidebar app-nav-surface\" [class.app-sidebar--collapsed]=\"collapsed\"\r\n [attr.aria-label]=\"'Navega\u00E7\u00E3o principal'\">\r\n <div class=\"app-sidebar__toolbar\"><ng-content select=\"[appSidebarToolbar]\" /></div>\r\n <app-menu-list\r\n class=\"app-sidebar__list\"\r\n [items]=\"items\"\r\n [menuId]=\"menuId\"\r\n [dense]=\"collapsed\"\r\n [compressText]=\"listCompressText()\"\r\n [selectedItemId]=\"selectedItemId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n />\r\n</nav>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;min-width:0;height:100%;box-sizing:border-box}.app-sidebar{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;box-sizing:border-box;padding:.65rem .5rem;background:var(--app-color-nav-shell-bg);border-right:1px solid var(--app-color-nav-border-subtle)}.app-sidebar--collapsed{padding-left:.5rem;padding-right:.5rem}.app-sidebar__toolbar{flex:0 0 auto;display:flex;justify-content:flex-end;align-items:center;padding:0 .1rem .4rem;min-height:0}.app-sidebar__toolbar:empty{display:none}.app-sidebar--collapsed .app-sidebar__toolbar:not(:empty){justify-content:center;padding-left:0;padding-right:0}.app-sidebar__list{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "component", type: MenuListComponent, selector: "app-menu-list", inputs: ["items", "menuId", "dense", "nested", "selectedItemId", "compressText"], outputs: ["itemSelect", "closeRequest", "submenuBack"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppSidebarComponent, decorators: [{
66
+ type: Component,
67
+ args: [{ selector: 'app-sidebar', standalone: true, imports: [MenuListComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav class=\"app-sidebar app-nav-surface\" [class.app-sidebar--collapsed]=\"collapsed\"\r\n [attr.aria-label]=\"'Navega\u00E7\u00E3o principal'\">\r\n <div class=\"app-sidebar__toolbar\"><ng-content select=\"[appSidebarToolbar]\" /></div>\r\n <app-menu-list\r\n class=\"app-sidebar__list\"\r\n [items]=\"items\"\r\n [menuId]=\"menuId\"\r\n [dense]=\"collapsed\"\r\n [compressText]=\"listCompressText()\"\r\n [selectedItemId]=\"selectedItemId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n />\r\n</nav>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;min-width:0;height:100%;box-sizing:border-box}.app-sidebar{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;box-sizing:border-box;padding:.65rem .5rem;background:var(--app-color-nav-shell-bg);border-right:1px solid var(--app-color-nav-border-subtle)}.app-sidebar--collapsed{padding-left:.5rem;padding-right:.5rem}.app-sidebar__toolbar{flex:0 0 auto;display:flex;justify-content:flex-end;align-items:center;padding:0 .1rem .4rem;min-height:0}.app-sidebar__toolbar:empty{display:none}.app-sidebar--collapsed .app-sidebar__toolbar:not(:empty){justify-content:center;padding-left:0;padding-right:0}.app-sidebar__list{flex:1 1 auto;min-height:0;overflow:auto}\n"] }]
68
+ }], ctorParameters: () => [], propDecorators: { hostThemeClasses: [{
69
+ type: HostBinding,
70
+ args: ['class']
71
+ }], items: [{
72
+ type: Input,
73
+ args: [{ required: true }]
74
+ }], menuId: [{
75
+ type: Input
76
+ }], selectedItemId: [{
77
+ type: Input
78
+ }], collapsed: [{
79
+ type: Input,
80
+ args: [{ transform: booleanAttribute }]
81
+ }], itemSelect: [{
82
+ type: Output
83
+ }] } });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2FwcC1zaGVsbC9zaWRlYmFyL3NpZGViYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvc2lkZWJhci9zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFFTCxNQUFNLEVBRU4sZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFOUU7Ozs7R0FJRztBQVNILE1BQU0sT0FBTyxtQkFBbUI7SUFJOUI7OztPQUdHO0lBQ0gsSUFDYyxnQkFBZ0I7UUFDNUIsT0FBTyxxQkFBcUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFzQkQ7UUFoQ2lCLFVBQUssR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQWF4QyxXQUFNLEdBQUcsbUJBQW1CLENBQUM7UUFFdEMsdUVBQXVFO1FBQzlELG1CQUFjLEdBQWEsSUFBSSxDQUFDO1FBRXpDLCtGQUErRjtRQUN2RCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXZDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO1FBRXREOzs7V0FHRztRQUNNLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyx3QkFBbUIsR0FBeUMsSUFBSSxDQUFDO1FBR3ZFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFOUIsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUN6QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxFQUFFLCtCQUErQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQzsrR0FsRVUsbUJBQW1CO21HQUFuQixtQkFBbUIsbUtBcUJWLGdCQUFnQixxSkNyRHRDLHdoQkFhQSwwd0JEY1ksaUJBQWlCOzs0RkFLaEIsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNO3dEQVdqQyxnQkFBZ0I7c0JBRDdCLFdBQVc7dUJBQUMsT0FBTztnQkFLTyxLQUFLO3NCQUEvQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFaEIsTUFBTTtzQkFBZCxLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR2tDLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRW5CLFVBQVU7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBEZXN0cm95UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcclxuICBpbmplY3QsXHJcbiAgc2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZW51TGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21lbnVzL21lbnUtbGlzdC9tZW51LWxpc3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQXBwVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdGhlbWUnO1xyXG5pbXBvcnQgdHlwZSB7IE1lbnVOb2RlSXRlbSB9IGZyb20gJy4uLy4uL21lbnVzL19tb2RlbHMvbWVudS1pdGVtLm1vZGVsJztcclxuaW1wb3J0IHsgQVBQX1NJREVCQVJfTkFWX1JFVkVBTF9UT1RBTF9NUyB9IGZyb20gJy4uL3NpZGViYXItcmV2ZWFsLmNvbnN0YW50cyc7XHJcblxyXG4vKipcclxuICogTmF2ZWdhw6fDo28gbGF0ZXJhbCBjb20gbyBtZXNtbyBtb2RlbG8gYE1lbnVOb2RlSXRlbWAgZG9zIG1lbnVzIGRhIGxpYiAoZ3J1cG9zLCBzdWJtZW51cywgdGVjbGFkbykuXHJcbiAqIENvbSBgY29sbGFwc2VkYCwgYGFwcC1tZW51LWxpc3RgIHVzYSBgY29tcHJlc3NUZXh0YDogcsOzdHVsb3MgZGUgZ3J1cG8gKGV4LiDCq1ByaW5jaXBhbMK7KSBmaWNhbSBvY3VsdG9zO1xyXG4gKiBpdGVucyBtb3N0cmFtIHPDsyDDrWNvbmVzIGNvbSBgdGl0bGVgIC8gYGFyaWEtbGFiZWxgIHBhcmEgYWNlc3NpYmlsaWRhZGUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zaWRlYmFyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtNZW51TGlzdENvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zaWRlYmFyLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNpZGViYXJDb21wb25lbnQ8VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWUgPSBpbmplY3QoQXBwVGhlbWVTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdhcmFudGUgYC5hcHAtbGlicmFyeS10aGVtZWAgKyBgdGhlbWUtKmAgbm8gaG9zdCBwYXJhIHRva2VucyBgLS1hcHAtY29sb3ItbmF2LSpgIGUgbGlzdGFcclxuICAgKiBoZXJkYXJlbSBhIHBhbGV0YSBhY3RpdmEgKMO6dGlsIGZvcmEgZGEgZGVtbyBvdSBzZW0gYW50ZXBhc3NhZG8gdGVtYXRpemFkbykuXHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXHJcbiAgcHJvdGVjdGVkIGdldCBob3N0VGhlbWVDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGFwcC1saWJyYXJ5LXRoZW1lICR7dGhpcy50aGVtZS50aGVtZUNsYXNzKCl9YDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGl0ZW1zITogcmVhZG9ubHkgTWVudU5vZGVJdGVtPFQ+W107XHJcblxyXG4gIEBJbnB1dCgpIG1lbnVJZCA9ICdhcHAtc2hlbGwtc2lkZWJhcic7XHJcblxyXG4gIC8qKiBTaW5jcm9uaXphciBjb20gbyBpdGVtIGRlIG5hdmVnYcOnw6NvIGFjdGl2byAocmVhbGNlIHBlcnNpc3RlbnRlKS4gKi9cclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZDogVCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogTW9kbyBlc3RyZWl0bzogc8OzIMOtY29uZXMgKyBgY29tcHJlc3NUZXh0YCBuYSBsaXN0YSAocsOzdHVsb3MgdmlhIGB0aXRsZWAgLyBgYXJpYS1sYWJlbGApLiAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb2xsYXBzZWQgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGl0ZW1TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbG9yIGVmZWN0aXZvIGRlIGBjb21wcmVzc1RleHRgIGVtIGBhcHAtbWVudS1saXN0YDogYW8gZXhwYW5kaXIsIG1hbnTDqW0tc2UgY29tcHJpbWlkb1xyXG4gICAqIGF0w6kgYSBsYXRlcmFsIHRlcm1pbmFyIGEgYW5pbWHDp8OjbyBkZSBsYXJndXJhIChldml0YSBmbGlja2VyIGRlIHRleHRvKS5cclxuICAgKi9cclxuICByZWFkb25seSBsaXN0Q29tcHJlc3NUZXh0ID0gc2lnbmFsKHRydWUpO1xyXG5cclxuICBwcml2YXRlIGxpc3RSZXZlYWxUaW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB0aGlzLmNsZWFyTGlzdFJldmVhbFRpbWVvdXQoKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb2xsYXBzZWRDaCA9IGNoYW5nZXNbJ2NvbGxhcHNlZCddO1xyXG4gICAgaWYgKCFjb2xsYXBzZWRDaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyTGlzdFJldmVhbFRpbWVvdXQoKTtcclxuXHJcbiAgICBpZiAoY29sbGFwc2VkQ2guZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5saXN0Q29tcHJlc3NUZXh0LnNldCh0aGlzLmNvbGxhcHNlZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb2xsYXBzZWQpIHtcclxuICAgICAgdGhpcy5saXN0Q29tcHJlc3NUZXh0LnNldCh0cnVlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGlzdENvbXByZXNzVGV4dC5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmxpc3RSZXZlYWxUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5saXN0UmV2ZWFsVGltZW91dElkID0gbnVsbDtcclxuICAgICAgdGhpcy5saXN0Q29tcHJlc3NUZXh0LnNldChmYWxzZSk7XHJcbiAgICB9LCBBUFBfU0lERUJBUl9OQVZfUkVWRUFMX1RPVEFMX01TKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJMaXN0UmV2ZWFsVGltZW91dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxpc3RSZXZlYWxUaW1lb3V0SWQgIT09IG51bGwpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubGlzdFJldmVhbFRpbWVvdXRJZCk7XHJcbiAgICAgIHRoaXMubGlzdFJldmVhbFRpbWVvdXRJZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxuYXYgY2xhc3M9XCJhcHAtc2lkZWJhciBhcHAtbmF2LXN1cmZhY2VcIiBbY2xhc3MuYXBwLXNpZGViYXItLWNvbGxhcHNlZF09XCJjb2xsYXBzZWRcIlxyXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiJ05hdmVnYcOnw6NvIHByaW5jaXBhbCdcIj5cclxuICA8ZGl2IGNsYXNzPVwiYXBwLXNpZGViYXJfX3Rvb2xiYXJcIj48bmctY29udGVudCBzZWxlY3Q9XCJbYXBwU2lkZWJhclRvb2xiYXJdXCIgLz48L2Rpdj5cclxuICA8YXBwLW1lbnUtbGlzdFxyXG4gICAgY2xhc3M9XCJhcHAtc2lkZWJhcl9fbGlzdFwiXHJcbiAgICBbaXRlbXNdPVwiaXRlbXNcIlxyXG4gICAgW21lbnVJZF09XCJtZW51SWRcIlxyXG4gICAgW2RlbnNlXT1cImNvbGxhcHNlZFwiXHJcbiAgICBbY29tcHJlc3NUZXh0XT1cImxpc3RDb21wcmVzc1RleHQoKVwiXHJcbiAgICBbc2VsZWN0ZWRJdGVtSWRdPVwic2VsZWN0ZWRJdGVtSWRcIlxyXG4gICAgKGl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdC5lbWl0KCRldmVudClcIlxyXG4gIC8+XHJcbjwvbmF2PlxyXG4iXX0=
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Duração da animação de largura da lateral (`flex-basis` / `width` / `padding`).
3
+ * Manter alinhado com `$app-sidebar-layout-duration` em `_sidebar-reveal.scss`.
4
+ */
5
+ export const APP_SIDEBAR_LAYOUT_DURATION_MS = 0;
6
+ /** Folga após o layout, antes de revelar rótulos (evita texto a “comprimir”). */
7
+ export const APP_SIDEBAR_LABEL_REVEAL_LAG_MS = 48;
8
+ export const APP_SIDEBAR_NAV_REVEAL_TOTAL_MS = APP_SIDEBAR_LAYOUT_DURATION_MS + APP_SIDEBAR_LABEL_REVEAL_LAG_MS;
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1yZXZlYWwuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvc2lkZWJhci1yZXZlYWwuY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUMsQ0FBQztBQUVoRCxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsRUFBRSxDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyw4QkFBOEIsR0FBRywrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBEdXJhw6fDo28gZGEgYW5pbWHDp8OjbyBkZSBsYXJndXJhIGRhIGxhdGVyYWwgKGBmbGV4LWJhc2lzYCAvIGB3aWR0aGAgLyBgcGFkZGluZ2ApLlxyXG4gKiBNYW50ZXIgYWxpbmhhZG8gY29tIGAkYXBwLXNpZGViYXItbGF5b3V0LWR1cmF0aW9uYCBlbSBgX3NpZGViYXItcmV2ZWFsLnNjc3NgLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFQUF9TSURFQkFSX0xBWU9VVF9EVVJBVElPTl9NUyA9IDA7XHJcblxyXG4vKiogRm9sZ2EgYXDDs3MgbyBsYXlvdXQsIGFudGVzIGRlIHJldmVsYXIgcsOzdHVsb3MgKGV2aXRhIHRleHRvIGEg4oCcY29tcHJpbWly4oCdKS4gKi9cclxuZXhwb3J0IGNvbnN0IEFQUF9TSURFQkFSX0xBQkVMX1JFVkVBTF9MQUdfTVMgPSA0ODtcclxuXHJcbmV4cG9ydCBjb25zdCBBUFBfU0lERUJBUl9OQVZfUkVWRUFMX1RPVEFMX01TID1cclxuICBBUFBfU0lERUJBUl9MQVlPVVRfRFVSQVRJT05fTVMgKyBBUFBfU0lERUJBUl9MQUJFTF9SRVZFQUxfTEFHX01TO1xyXG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Barra superior com três zonas de projeção: início (ex.: menu), título, fim (ex.: usuário).
5
+ */
6
+ export class AppTopbarComponent {
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppTopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AppTopbarComponent, isStandalone: true, selector: "app-topbar", ngImport: i0, template: "<div class=\"app-topbar\" role=\"banner\">\r\n <div class=\"app-topbar__start\">\r\n <ng-content select=\"[appTopbarStart]\" />\r\n </div>\r\n <div class=\"app-topbar__title\">\r\n <ng-content select=\"[appTopbarTitle]\" />\r\n </div>\r\n <div class=\"app-topbar__end\">\r\n <ng-content select=\"[appTopbarEnd]\" />\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0;box-sizing:border-box}.app-topbar{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem .75rem;min-height:3.25rem;padding:.5rem .85rem;box-sizing:border-box;background:var(--app-color-surface, #fff);border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));box-shadow:0 1px 2px var(--app-color-shell-shadow, rgba(26, 47, 69, .05))}.app-topbar__start,.app-topbar__end{display:flex;flex:0 0 auto;align-items:center;gap:.5rem;min-width:0}.app-topbar__title{flex:1 1 auto;min-width:0;margin:0;font-size:1.05rem;font-weight:600;color:var(--app-color-text-primary, #1a2f45);line-height:1.3}@media (max-width: 767.98px){.app-topbar{display:grid;grid-template-columns:auto 1fr auto;grid-template-rows:auto auto;align-items:center;column-gap:.5rem;row-gap:.35rem;min-height:auto;padding:.45rem .65rem .55rem}.app-topbar__start{grid-column:1;grid-row:1}.app-topbar__end{grid-column:3;grid-row:1;justify-self:end}.app-topbar__title{grid-column:1/-1;grid-row:2;flex:unset;font-size:.98rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppTopbarComponent, decorators: [{
11
+ type: Component,
12
+ args: [{ selector: 'app-topbar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"app-topbar\" role=\"banner\">\r\n <div class=\"app-topbar__start\">\r\n <ng-content select=\"[appTopbarStart]\" />\r\n </div>\r\n <div class=\"app-topbar__title\">\r\n <ng-content select=\"[appTopbarTitle]\" />\r\n </div>\r\n <div class=\"app-topbar__end\">\r\n <ng-content select=\"[appTopbarEnd]\" />\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0;box-sizing:border-box}.app-topbar{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem .75rem;min-height:3.25rem;padding:.5rem .85rem;box-sizing:border-box;background:var(--app-color-surface, #fff);border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));box-shadow:0 1px 2px var(--app-color-shell-shadow, rgba(26, 47, 69, .05))}.app-topbar__start,.app-topbar__end{display:flex;flex:0 0 auto;align-items:center;gap:.5rem;min-width:0}.app-topbar__title{flex:1 1 auto;min-width:0;margin:0;font-size:1.05rem;font-weight:600;color:var(--app-color-text-primary, #1a2f45);line-height:1.3}@media (max-width: 767.98px){.app-topbar{display:grid;grid-template-columns:auto 1fr auto;grid-template-rows:auto auto;align-items:center;column-gap:.5rem;row-gap:.35rem;min-height:auto;padding:.45rem .65rem .55rem}.app-topbar__start{grid-column:1;grid-row:1}.app-topbar__end{grid-column:3;grid-row:1;justify-self:end}.app-topbar__title{grid-column:1/-1;grid-row:2;flex:unset;font-size:.98rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}\n"] }]
13
+ }] });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvYXBwLXNoZWxsL3RvcGJhci90b3BiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvdG9wYmFyL3RvcGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUVuRTs7R0FFRztBQVFILE1BQU0sT0FBTyxrQkFBa0I7K0dBQWxCLGtCQUFrQjttR0FBbEIsa0JBQWtCLHNFQ1ovQixxV0FXQTs7NEZEQ2Esa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKipcclxuICogQmFycmEgc3VwZXJpb3IgY29tIHRyw6pzIHpvbmFzIGRlIHByb2plw6fDo286IGluw61jaW8gKGV4LjogbWVudSksIHTDrXR1bG8sIGZpbSAoZXguOiB1c3XDoXJpbykuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC10b3BiYXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RvcGJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RvcGJhci5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcHBUb3BiYXJDb21wb25lbnQge31cclxuIiwiPGRpdiBjbGFzcz1cImFwcC10b3BiYXJcIiByb2xlPVwiYmFubmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImFwcC10b3BiYXJfX3N0YXJ0XCI+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwVG9wYmFyU3RhcnRdXCIgLz5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiYXBwLXRvcGJhcl9fdGl0bGVcIj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthcHBUb3BiYXJUaXRsZV1cIiAvPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJhcHAtdG9wYmFyX19lbmRcIj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthcHBUb3BiYXJFbmRdXCIgLz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, booleanAttribute, } from '@angular/core';
2
+ import { DropdownMenuComponent } from '../../menus/dropdown-menu/dropdown-menu.component';
3
+ import { MenuDropdownPlacement } from '../../menus/_models/menu-dropdown-placement.model';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Menu do usuário: `app-dropdown-menu` com gatilho personalizado (avatar ou ícone).
7
+ */
8
+ export class AppUserMenuComponent {
9
+ constructor() {
10
+ this.menuId = 'app-user-menu';
11
+ this.placement = MenuDropdownPlacement.Below;
12
+ this.minWidthPx = 220;
13
+ /** Texto junto ao avatar (oculto em ecrãs muito estreitos via CSS). */
14
+ this.displayName = '';
15
+ /** URL de imagem para avatar; sem valor usa ícone genérico. */
16
+ this.avatarUrl = '';
17
+ this.triggerLabel = 'Menu do usuário';
18
+ this.showName = true;
19
+ this.itemSelect = new EventEmitter();
20
+ this.openChange = new EventEmitter();
21
+ this.MenuDropdownPlacement = MenuDropdownPlacement;
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppUserMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AppUserMenuComponent, isStandalone: true, selector: "app-user-menu", inputs: { items: "items", menuId: "menuId", placement: "placement", minWidthPx: "minWidthPx", displayName: "displayName", avatarUrl: "avatarUrl", triggerLabel: "triggerLabel", showName: ["showName", "showName", booleanAttribute] }, outputs: { itemSelect: "itemSelect", openChange: "openChange" }, ngImport: i0, template: "<app-dropdown-menu\r\n class=\"user-menu__dropdown\"\r\n [items]=\"items\"\r\n [placement]=\"placement\"\r\n [minWidthPx]=\"minWidthPx\"\r\n [matchTriggerWidth]=\"false\"\r\n [menuId]=\"menuId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n (openChange)=\"openChange.emit($event)\"\r\n>\r\n <button type=\"button\" class=\"user-menu__trigger\" [attr.aria-label]=\"triggerLabel\">\r\n @if (avatarUrl.trim()) {\r\n <img class=\"user-menu__avatar\" [src]=\"avatarUrl\" alt=\"\" width=\"32\" height=\"32\" />\r\n } @else {\r\n <span class=\"user-menu__avatar-fallback\" aria-hidden=\"true\">\r\n <i class=\"fa-solid fa-user\"></i>\r\n </span>\r\n }\r\n @if (showName && displayName.trim()) {\r\n <span class=\"user-menu__name\">{{ displayName }}</span>\r\n }\r\n </button>\r\n</app-dropdown-menu>\r\n", styles: [":host{display:inline-block;max-width:100%;vertical-align:middle}.user-menu__dropdown{display:inline-block;max-width:100%}.user-menu__trigger{display:inline-flex;align-items:center;gap:.5rem;max-width:100%;min-height:2.25rem;padding:.2rem .5rem;margin:0;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));border-radius:8px;background:var(--app-color-surface-alt, #fff);color:var(--app-color-text-primary, #1a2f45);font:inherit;cursor:pointer;box-sizing:border-box}.user-menu__trigger:hover{background:var(--app-color-hover-bg, rgba(43, 127, 217, .08))}.user-menu__trigger:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:2px}.user-menu__avatar{flex:0 0 auto;border-radius:50%;object-fit:cover}.user-menu__avatar-fallback{display:inline-flex;width:2rem;height:2rem;align-items:center;justify-content:center;border-radius:50%;background:var(--app-color-primary-muted, rgba(43, 127, 217, .14));color:var(--app-color-primary, #2b7fd9);font-size:.95rem}.user-menu__name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:500}@media (max-width: 480px){.user-menu__name{display:none}}\n"], dependencies: [{ kind: "component", type: DropdownMenuComponent, selector: "app-dropdown-menu", inputs: ["items", "placement", "minWidthPx", "matchTriggerWidth", "menuId"], outputs: ["itemSelect", "openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
+ }
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppUserMenuComponent, decorators: [{
27
+ type: Component,
28
+ args: [{ selector: 'app-user-menu', standalone: true, imports: [DropdownMenuComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-dropdown-menu\r\n class=\"user-menu__dropdown\"\r\n [items]=\"items\"\r\n [placement]=\"placement\"\r\n [minWidthPx]=\"minWidthPx\"\r\n [matchTriggerWidth]=\"false\"\r\n [menuId]=\"menuId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n (openChange)=\"openChange.emit($event)\"\r\n>\r\n <button type=\"button\" class=\"user-menu__trigger\" [attr.aria-label]=\"triggerLabel\">\r\n @if (avatarUrl.trim()) {\r\n <img class=\"user-menu__avatar\" [src]=\"avatarUrl\" alt=\"\" width=\"32\" height=\"32\" />\r\n } @else {\r\n <span class=\"user-menu__avatar-fallback\" aria-hidden=\"true\">\r\n <i class=\"fa-solid fa-user\"></i>\r\n </span>\r\n }\r\n @if (showName && displayName.trim()) {\r\n <span class=\"user-menu__name\">{{ displayName }}</span>\r\n }\r\n </button>\r\n</app-dropdown-menu>\r\n", styles: [":host{display:inline-block;max-width:100%;vertical-align:middle}.user-menu__dropdown{display:inline-block;max-width:100%}.user-menu__trigger{display:inline-flex;align-items:center;gap:.5rem;max-width:100%;min-height:2.25rem;padding:.2rem .5rem;margin:0;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .12));border-radius:8px;background:var(--app-color-surface-alt, #fff);color:var(--app-color-text-primary, #1a2f45);font:inherit;cursor:pointer;box-sizing:border-box}.user-menu__trigger:hover{background:var(--app-color-hover-bg, rgba(43, 127, 217, .08))}.user-menu__trigger:focus-visible{outline:2px solid var(--app-color-focus-ring-strong, rgba(43, 127, 217, .45));outline-offset:2px}.user-menu__avatar{flex:0 0 auto;border-radius:50%;object-fit:cover}.user-menu__avatar-fallback{display:inline-flex;width:2rem;height:2rem;align-items:center;justify-content:center;border-radius:50%;background:var(--app-color-primary-muted, rgba(43, 127, 217, .14));color:var(--app-color-primary, #2b7fd9);font-size:.95rem}.user-menu__name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:500}@media (max-width: 480px){.user-menu__name{display:none}}\n"] }]
29
+ }], propDecorators: { items: [{
30
+ type: Input,
31
+ args: [{ required: true }]
32
+ }], menuId: [{
33
+ type: Input
34
+ }], placement: [{
35
+ type: Input
36
+ }], minWidthPx: [{
37
+ type: Input
38
+ }], displayName: [{
39
+ type: Input
40
+ }], avatarUrl: [{
41
+ type: Input
42
+ }], triggerLabel: [{
43
+ type: Input
44
+ }], showName: [{
45
+ type: Input,
46
+ args: [{ transform: booleanAttribute }]
47
+ }], itemSelect: [{
48
+ type: Output
49
+ }], openChange: [{
50
+ type: Output
51
+ }] } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvYXBwLXNoZWxsL3VzZXItbWVudS91c2VyLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvdXNlci1tZW51L3VzZXItbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDMUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbURBQW1ELENBQUM7O0FBRzFGOztHQUVHO0FBU0gsTUFBTSxPQUFPLG9CQUFvQjtJQVJqQztRQVdXLFdBQU0sR0FBRyxlQUFlLENBQUM7UUFFekIsY0FBUyxHQUEwQixxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFFL0QsZUFBVSxHQUFHLEdBQUcsQ0FBQztRQUUxQix1RUFBdUU7UUFDOUQsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFMUIsK0RBQStEO1FBQ3RELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZixpQkFBWSxHQUFHLGlCQUFpQixDQUFDO1FBRUYsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztRQUNuQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVuRCwwQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztLQUN4RDsrR0F2Qlksb0JBQW9CO21HQUFwQixvQkFBb0Isb1FBaUJYLGdCQUFnQiw4RkN4Q3RDLHExQkF1QkEsNnZDRExZLHFCQUFxQjs7NEZBS3BCLG9CQUFvQjtrQkFSaEMsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQLENBQUMscUJBQXFCLENBQUMsbUJBR2YsdUJBQXVCLENBQUMsTUFBTTs4QkFHcEIsS0FBSztzQkFBL0IsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBRWhCLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRWtDLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRW5CLFVBQVU7c0JBQTVCLE1BQU07Z0JBQ1ksVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEcm9wZG93bk1lbnVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tZW51cy9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE1lbnVEcm9wZG93blBsYWNlbWVudCB9IGZyb20gJy4uLy4uL21lbnVzL19tb2RlbHMvbWVudS1kcm9wZG93bi1wbGFjZW1lbnQubW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBNZW51Tm9kZUl0ZW0gfSBmcm9tICcuLi8uLi9tZW51cy9fbW9kZWxzL21lbnUtaXRlbS5tb2RlbCc7XG5cbi8qKlxuICogTWVudSBkbyB1c3XDoXJpbzogYGFwcC1kcm9wZG93bi1tZW51YCBjb20gZ2F0aWxobyBwZXJzb25hbGl6YWRvIChhdmF0YXIgb3Ugw61jb25lKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItbWVudScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtEcm9wZG93bk1lbnVDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3VzZXItbWVudS5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBVc2VyTWVudUNvbXBvbmVudDxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGl0ZW1zITogcmVhZG9ubHkgTWVudU5vZGVJdGVtPFQ+W107XG5cbiAgQElucHV0KCkgbWVudUlkID0gJ2FwcC11c2VyLW1lbnUnO1xuXG4gIEBJbnB1dCgpIHBsYWNlbWVudDogTWVudURyb3Bkb3duUGxhY2VtZW50ID0gTWVudURyb3Bkb3duUGxhY2VtZW50LkJlbG93O1xuXG4gIEBJbnB1dCgpIG1pbldpZHRoUHggPSAyMjA7XG5cbiAgLyoqIFRleHRvIGp1bnRvIGFvIGF2YXRhciAob2N1bHRvIGVtIGVjcsOjcyBtdWl0byBlc3RyZWl0b3MgdmlhIENTUykuICovXG4gIEBJbnB1dCgpIGRpc3BsYXlOYW1lID0gJyc7XG5cbiAgLyoqIFVSTCBkZSBpbWFnZW0gcGFyYSBhdmF0YXI7IHNlbSB2YWxvciB1c2Egw61jb25lIGdlbsOpcmljby4gKi9cbiAgQElucHV0KCkgYXZhdGFyVXJsID0gJyc7XG5cbiAgQElucHV0KCkgdHJpZ2dlckxhYmVsID0gJ01lbnUgZG8gdXN1w6FyaW8nO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TmFtZSA9IHRydWU7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGl0ZW1TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IE1lbnVEcm9wZG93blBsYWNlbWVudCA9IE1lbnVEcm9wZG93blBsYWNlbWVudDtcbn1cbiIsIjxhcHAtZHJvcGRvd24tbWVudVxyXG4gIGNsYXNzPVwidXNlci1tZW51X19kcm9wZG93blwiXHJcbiAgW2l0ZW1zXT1cIml0ZW1zXCJcclxuICBbcGxhY2VtZW50XT1cInBsYWNlbWVudFwiXHJcbiAgW21pbldpZHRoUHhdPVwibWluV2lkdGhQeFwiXHJcbiAgW21hdGNoVHJpZ2dlcldpZHRoXT1cImZhbHNlXCJcclxuICBbbWVudUlkXT1cIm1lbnVJZFwiXHJcbiAgKGl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdC5lbWl0KCRldmVudClcIlxyXG4gIChvcGVuQ2hhbmdlKT1cIm9wZW5DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcclxuPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidXNlci1tZW51X190cmlnZ2VyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmlnZ2VyTGFiZWxcIj5cclxuICAgIEBpZiAoYXZhdGFyVXJsLnRyaW0oKSkge1xyXG4gICAgICA8aW1nIGNsYXNzPVwidXNlci1tZW51X19hdmF0YXJcIiBbc3JjXT1cImF2YXRhclVybFwiIGFsdD1cIlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIC8+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLW1lbnVfX2F2YXRhci1mYWxsYmFja1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtdXNlclwiPjwvaT5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgfVxyXG4gICAgQGlmIChzaG93TmFtZSAmJiBkaXNwbGF5TmFtZS50cmltKCkpIHtcclxuICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLW1lbnVfX25hbWVcIj57eyBkaXNwbGF5TmFtZSB9fTwvc3Bhbj5cclxuICAgIH1cclxuICA8L2J1dHRvbj5cclxuPC9hcHAtZHJvcGRvd24tbWVudT5cclxuIl19
@@ -0,0 +1,97 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, ViewChild, booleanAttribute, } from '@angular/core';
2
+ import { SkeletonBlockComponent } from '../../loading/skeleton-loading';
3
+ import * as i0 from "@angular/core";
4
+ export var BaseButtonVariant;
5
+ (function (BaseButtonVariant) {
6
+ BaseButtonVariant["Primary"] = "primary";
7
+ BaseButtonVariant["Secondary"] = "secondary";
8
+ /** Texto/ícone sem caixa — navegação secundária, “link” com aparência de botão acessível. */
9
+ BaseButtonVariant["Ghost"] = "ghost";
10
+ })(BaseButtonVariant || (BaseButtonVariant = {}));
11
+ export var BaseButtonType;
12
+ (function (BaseButtonType) {
13
+ BaseButtonType["Button"] = "button";
14
+ BaseButtonType["Submit"] = "submit";
15
+ BaseButtonType["Reset"] = "reset";
16
+ })(BaseButtonType || (BaseButtonType = {}));
17
+ export class BaseButtonComponent {
18
+ constructor() {
19
+ /** `submit` envia o `<form>` ancestral; use `button` para ações sem submit. */
20
+ this.type = BaseButtonType.Button;
21
+ this.disabled = false;
22
+ /**
23
+ * Não interage (como `disabled`), mas com aparência em cinza (tema somente leitura),
24
+ * distinta do estado desabilitado genérico.
25
+ */
26
+ this.readonly = false;
27
+ /**
28
+ * `true` (por defeito): estica à largura do contentor (útil em `app-layout-stack` com `fill`).
29
+ * `false`: largura só ao conteúdo (texto + padding).
30
+ */
31
+ this.fullWidth = true;
32
+ /** Placeholder de carregamento (skeleton no lugar do rótulo). */
33
+ this.loading = false;
34
+ /** Estilo visual base; pode ser estendido no SCSS do projeto. */
35
+ this.variant = BaseButtonVariant.Primary;
36
+ }
37
+ /** Alias de {@link variant} (nome comum em design systems). */
38
+ set appearance(value) {
39
+ if (value === BaseButtonVariant.Primary ||
40
+ value === BaseButtonVariant.Secondary ||
41
+ value === BaseButtonVariant.Ghost) {
42
+ this.variant = value;
43
+ }
44
+ }
45
+ get hostClasses() {
46
+ const parts = ['base-button', `base-button--${this.variant}`];
47
+ if (this.disabled) {
48
+ parts.push('base-button--disabled');
49
+ }
50
+ if (this.readonly) {
51
+ parts.push('base-button--readonly');
52
+ }
53
+ if (this.fullWidth) {
54
+ parts.push('base-button--full-width');
55
+ }
56
+ if (this.loading) {
57
+ parts.push('base-button--loading');
58
+ }
59
+ return parts.join(' ');
60
+ }
61
+ /** Foca o `<button>` nativo (o host do componente não é focável). */
62
+ focusNative(options) {
63
+ this.nativeBtn?.nativeElement?.focus(options);
64
+ }
65
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
66
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BaseButtonComponent, isStandalone: true, selector: "app-base-button", inputs: { type: "type", disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], fullWidth: ["fullWidth", "fullWidth", booleanAttribute], loading: ["loading", "loading", booleanAttribute], variant: "variant", appearance: "appearance" }, host: { properties: { "class": "this.hostClasses" } }, viewQueries: [{ propertyName: "nativeBtn", first: true, predicate: ["nativeBtn"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if (!loading) {\r\n<button\r\n #nativeBtn\r\n class=\"base-button__native\"\r\n [attr.type]=\"type\"\r\n [disabled]=\"disabled || readonly\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n>\r\n <ng-content />\r\n</button>\r\n} @else {\r\n<div class=\"base-button__native base-button__native--skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\"\r\n aria-label=\"A carregar\">\r\n <app-skeleton-block width=\"40%\" height=\"0.7rem\" radius=\"8px\" />\r\n</div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:inline-block;width:fit-content;max-width:100%;box-sizing:border-box;vertical-align:middle}.base-button__native{-webkit-appearance:none;appearance:none;display:flex;width:auto;min-width:5rem;align-items:center;justify-content:center;text-align:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1.25rem;margin:0;border:1px solid transparent;border-radius:var(--ui-field-float-border-radius, 14px);font:inherit;font-size:.9375rem;font-weight:600;line-height:1.25;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease}:host(.base-button--full-width){display:block;width:auto;min-width:0;max-width:100%;box-sizing:border-box}:host(.base-button--full-width) .base-button__native{width:100%;min-width:0}.base-button__native:focus-visible{outline:none;box-shadow:0 0 0 3px var(--ui-field-float-focus-ring, rgba(43, 127, 217, .35))}:host(.base-button--primary) .base-button__native{color:var(--app-color-primary-contrast, #ffffff);background:var(--ui-field-float-border-focus, #2b7fd9);border-color:var(--ui-field-float-border-focus, #2b7fd9)}:host(.base-button--primary) .base-button__native:hover:not(:disabled){filter:brightness(.95)}:host(.base-button--secondary) .base-button__native{color:var(--ui-field-float-label-top-color, #4a6d8c);background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--secondary) .base-button__native:hover:not(:disabled){background:var(--app-color-button-secondary-hover-bg, #e8f0fa)}:host(.base-button--ghost) .base-button__native{color:var(--app-color-text-primary, #1a2f45);background:transparent;border-color:transparent;min-width:0;min-height:2.25rem;padding:.35rem .5rem;border-radius:8px;font-size:.95rem;font-weight:600;justify-content:flex-start;gap:.45rem}:host(.base-button--ghost) .base-button__native:hover:not(:disabled){color:var(--app-color-nav-link);background:color-mix(in srgb,var(--app-color-primary) 6%,transparent)}:host(.base-button--disabled:not(.base-button--readonly)) .base-button__native,.base-button__native:disabled:not([aria-readonly=true]){cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity, .65)}:host(.base-button--readonly) .base-button__native{cursor:default;opacity:1;color:var(--ui-field-readonly-button-text, #37474f);background:var(--ui-field-readonly-button-bg, #cfd8dc);border-color:var(--ui-field-readonly-button-border, #90a4ae)}:host(.base-button--readonly) .base-button__native:hover:not(:disabled){filter:brightness(.97)}:host(.base-button--readonly) .base-button__native:focus-visible{box-shadow:0 0 0 3px var(--ui-field-readonly-button-focus-ring, rgba(96, 125, 139, .35))}.base-button__native--skeleton{pointer-events:none;cursor:default}:host(.base-button--primary.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff);border-color:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff)}:host(.base-button--secondary.base-button--loading) .base-button__native--skeleton{background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--ghost.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--app-color-text-primary, #1a2f45) 8%,transparent);border-color:transparent}\n"], dependencies: [{ kind: "component", type: SkeletonBlockComponent, selector: "app-skeleton-block", inputs: ["width", "height", "radius", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseButtonComponent, decorators: [{
69
+ type: Component,
70
+ args: [{ selector: 'app-base-button', standalone: true, imports: [SkeletonBlockComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!loading) {\r\n<button\r\n #nativeBtn\r\n class=\"base-button__native\"\r\n [attr.type]=\"type\"\r\n [disabled]=\"disabled || readonly\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n>\r\n <ng-content />\r\n</button>\r\n} @else {\r\n<div class=\"base-button__native base-button__native--skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\"\r\n aria-label=\"A carregar\">\r\n <app-skeleton-block width=\"40%\" height=\"0.7rem\" radius=\"8px\" />\r\n</div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:inline-block;width:fit-content;max-width:100%;box-sizing:border-box;vertical-align:middle}.base-button__native{-webkit-appearance:none;appearance:none;display:flex;width:auto;min-width:5rem;align-items:center;justify-content:center;text-align:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1.25rem;margin:0;border:1px solid transparent;border-radius:var(--ui-field-float-border-radius, 14px);font:inherit;font-size:.9375rem;font-weight:600;line-height:1.25;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease}:host(.base-button--full-width){display:block;width:auto;min-width:0;max-width:100%;box-sizing:border-box}:host(.base-button--full-width) .base-button__native{width:100%;min-width:0}.base-button__native:focus-visible{outline:none;box-shadow:0 0 0 3px var(--ui-field-float-focus-ring, rgba(43, 127, 217, .35))}:host(.base-button--primary) .base-button__native{color:var(--app-color-primary-contrast, #ffffff);background:var(--ui-field-float-border-focus, #2b7fd9);border-color:var(--ui-field-float-border-focus, #2b7fd9)}:host(.base-button--primary) .base-button__native:hover:not(:disabled){filter:brightness(.95)}:host(.base-button--secondary) .base-button__native{color:var(--ui-field-float-label-top-color, #4a6d8c);background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--secondary) .base-button__native:hover:not(:disabled){background:var(--app-color-button-secondary-hover-bg, #e8f0fa)}:host(.base-button--ghost) .base-button__native{color:var(--app-color-text-primary, #1a2f45);background:transparent;border-color:transparent;min-width:0;min-height:2.25rem;padding:.35rem .5rem;border-radius:8px;font-size:.95rem;font-weight:600;justify-content:flex-start;gap:.45rem}:host(.base-button--ghost) .base-button__native:hover:not(:disabled){color:var(--app-color-nav-link);background:color-mix(in srgb,var(--app-color-primary) 6%,transparent)}:host(.base-button--disabled:not(.base-button--readonly)) .base-button__native,.base-button__native:disabled:not([aria-readonly=true]){cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity, .65)}:host(.base-button--readonly) .base-button__native{cursor:default;opacity:1;color:var(--ui-field-readonly-button-text, #37474f);background:var(--ui-field-readonly-button-bg, #cfd8dc);border-color:var(--ui-field-readonly-button-border, #90a4ae)}:host(.base-button--readonly) .base-button__native:hover:not(:disabled){filter:brightness(.97)}:host(.base-button--readonly) .base-button__native:focus-visible{box-shadow:0 0 0 3px var(--ui-field-readonly-button-focus-ring, rgba(96, 125, 139, .35))}.base-button__native--skeleton{pointer-events:none;cursor:default}:host(.base-button--primary.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff);border-color:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff)}:host(.base-button--secondary.base-button--loading) .base-button__native--skeleton{background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--ghost.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--app-color-text-primary, #1a2f45) 8%,transparent);border-color:transparent}\n"] }]
71
+ }], propDecorators: { nativeBtn: [{
72
+ type: ViewChild,
73
+ args: ['nativeBtn', { read: ElementRef }]
74
+ }], type: [{
75
+ type: Input
76
+ }], disabled: [{
77
+ type: Input,
78
+ args: [{ transform: booleanAttribute }]
79
+ }], readonly: [{
80
+ type: Input,
81
+ args: [{ transform: booleanAttribute }]
82
+ }], fullWidth: [{
83
+ type: Input,
84
+ args: [{ transform: booleanAttribute }]
85
+ }], loading: [{
86
+ type: Input,
87
+ args: [{ transform: booleanAttribute }]
88
+ }], variant: [{
89
+ type: Input
90
+ }], appearance: [{
91
+ type: Input,
92
+ args: ['appearance']
93
+ }], hostClasses: [{
94
+ type: HostBinding,
95
+ args: ['class']
96
+ }] } });
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9idXR0b25zL2Jhc2UtYnV0dG9uL2Jhc2UtYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvYnV0dG9ucy9iYXNlLWJ1dHRvbi9iYXNlLWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUV4RSxNQUFNLENBQU4sSUFBWSxpQkFLWDtBQUxELFdBQVksaUJBQWlCO0lBQzNCLHdDQUFtQixDQUFBO0lBQ25CLDRDQUF1QixDQUFBO0lBQ3ZCLDZGQUE2RjtJQUM3RixvQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBSzVCO0FBRUQsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN4QixtQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBaUIsQ0FBQTtJQUNqQixpQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQVVELE1BQU0sT0FBTyxtQkFBbUI7SUFSaEM7UUFZRSwrRUFBK0U7UUFDdEUsU0FBSSxHQUFtQixjQUFjLENBQUMsTUFBTSxDQUFDO1FBRWQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV6RDs7O1dBR0c7UUFDcUMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV6RDs7O1dBR0c7UUFDcUMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUV6RCxpRUFBaUU7UUFDekIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV4RCxpRUFBaUU7UUFDeEQsWUFBTyxHQUFzQixpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FvQ2pFO0lBbENDLCtEQUErRDtJQUMvRCxJQUNJLFVBQVUsQ0FBQyxLQUF3QjtRQUNyQyxJQUNFLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxPQUFPO1lBQ25DLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxTQUFTO1lBQ3JDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLEVBQ2pDLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQ0ksV0FBVztRQUNiLE1BQU0sS0FBSyxHQUFHLENBQUMsYUFBYSxFQUFFLGdCQUFnQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzsrR0E1RFUsbUJBQW1CO21HQUFuQixtQkFBbUIsOEdBT1YsZ0JBQWdCLHNDQU1oQixnQkFBZ0IseUNBTWhCLGdCQUFnQixtQ0FHaEIsZ0JBQWdCLHFOQXJCSixVQUFVLDZCQ2pDNUMscWZBZ0JBLGc5R0RXWSxzQkFBc0I7OzRGQUtyQixtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsc0JBQXNCLENBQUMsbUJBR2hCLHVCQUF1QixDQUFDLE1BQU07OEJBSXZDLFNBQVM7c0JBRGhCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJbkMsSUFBSTtzQkFBWixLQUFLO2dCQUVrQyxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTUUsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFHRSxPQUFPO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUc3QixPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsVUFBVTtzQkFEYixLQUFLO3VCQUFDLFlBQVk7Z0JBWWYsV0FBVztzQkFEZCxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTa2VsZXRvbkJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbG9hZGluZy9za2VsZXRvbi1sb2FkaW5nJztcclxuXHJcbmV4cG9ydCBlbnVtIEJhc2VCdXR0b25WYXJpYW50IHtcclxuICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxyXG4gIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxyXG4gIC8qKiBUZXh0by/DrWNvbmUgc2VtIGNhaXhhIOKAlCBuYXZlZ2HDp8OjbyBzZWN1bmTDoXJpYSwg4oCcbGlua+KAnSBjb20gYXBhcsOqbmNpYSBkZSBib3TDo28gYWNlc3PDrXZlbC4gKi9cclxuICBHaG9zdCA9ICdnaG9zdCcsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEJhc2VCdXR0b25UeXBlIHtcclxuICBCdXR0b24gPSAnYnV0dG9uJyxcclxuICBTdWJtaXQgPSAnc3VibWl0JyxcclxuICBSZXNldCA9ICdyZXNldCcsXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtYnV0dG9uJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtTa2VsZXRvbkJsb2NrQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9iYXNlLWJ1dHRvbi5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlQnV0dG9uQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKCduYXRpdmVCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcclxuICBwcml2YXRlIG5hdGl2ZUJ0bj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xyXG5cclxuICAvKiogYHN1Ym1pdGAgZW52aWEgbyBgPGZvcm0+YCBhbmNlc3RyYWw7IHVzZSBgYnV0dG9uYCBwYXJhIGHDp8O1ZXMgc2VtIHN1Ym1pdC4gKi9cclxuICBASW5wdXQoKSB0eXBlOiBCYXNlQnV0dG9uVHlwZSA9IEJhc2VCdXR0b25UeXBlLkJ1dHRvbjtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIE7Do28gaW50ZXJhZ2UgKGNvbW8gYGRpc2FibGVkYCksIG1hcyBjb20gYXBhcsOqbmNpYSBlbSBjaW56YSAodGVtYSBzb21lbnRlIGxlaXR1cmEpLFxyXG4gICAqIGRpc3RpbnRhIGRvIGVzdGFkbyBkZXNhYmlsaXRhZG8gZ2Vuw6lyaWNvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkb25seSA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBgdHJ1ZWAgKHBvciBkZWZlaXRvKTogZXN0aWNhIMOgIGxhcmd1cmEgZG8gY29udGVudG9yICjDunRpbCBlbSBgYXBwLWxheW91dC1zdGFja2AgY29tIGBmaWxsYCkuXHJcbiAgICogYGZhbHNlYDogbGFyZ3VyYSBzw7MgYW8gY29udGXDumRvICh0ZXh0byArIHBhZGRpbmcpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBmdWxsV2lkdGggPSB0cnVlO1xyXG5cclxuICAvKiogUGxhY2Vob2xkZXIgZGUgY2FycmVnYW1lbnRvIChza2VsZXRvbiBubyBsdWdhciBkbyByw7N0dWxvKS4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAvKiogRXN0aWxvIHZpc3VhbCBiYXNlOyBwb2RlIHNlciBlc3RlbmRpZG8gbm8gU0NTUyBkbyBwcm9qZXRvLiAqL1xyXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEJhc2VCdXR0b25WYXJpYW50ID0gQmFzZUJ1dHRvblZhcmlhbnQuUHJpbWFyeTtcclxuXHJcbiAgLyoqIEFsaWFzIGRlIHtAbGluayB2YXJpYW50fSAobm9tZSBjb211bSBlbSBkZXNpZ24gc3lzdGVtcykuICovXHJcbiAgQElucHV0KCdhcHBlYXJhbmNlJylcclxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogQmFzZUJ1dHRvblZhcmlhbnQpIHtcclxuICAgIGlmIChcclxuICAgICAgdmFsdWUgPT09IEJhc2VCdXR0b25WYXJpYW50LlByaW1hcnkgfHxcclxuICAgICAgdmFsdWUgPT09IEJhc2VCdXR0b25WYXJpYW50LlNlY29uZGFyeSB8fFxyXG4gICAgICB2YWx1ZSA9PT0gQmFzZUJ1dHRvblZhcmlhbnQuR2hvc3RcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhcmlhbnQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGdldCBob3N0Q2xhc3NlcygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSBbJ2Jhc2UtYnV0dG9uJywgYGJhc2UtYnV0dG9uLS0ke3RoaXMudmFyaWFudH1gXTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHBhcnRzLnB1c2goJ2Jhc2UtYnV0dG9uLS1kaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcGFydHMucHVzaCgnYmFzZS1idXR0b24tLXJlYWRvbmx5Jyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mdWxsV2lkdGgpIHtcclxuICAgICAgcGFydHMucHVzaCgnYmFzZS1idXR0b24tLWZ1bGwtd2lkdGgnKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcGFydHMucHVzaCgnYmFzZS1idXR0b24tLWxvYWRpbmcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jYSBvIGA8YnV0dG9uPmAgbmF0aXZvIChvIGhvc3QgZG8gY29tcG9uZW50ZSBuw6NvIMOpIGZvY8OhdmVsKS4gKi9cclxuICBmb2N1c05hdGl2ZShvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLm5hdGl2ZUJ0bj8ubmF0aXZlRWxlbWVudD8uZm9jdXMob3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoIWxvYWRpbmcpIHtcclxuPGJ1dHRvblxyXG4gICNuYXRpdmVCdG5cclxuICBjbGFzcz1cImJhc2UtYnV0dG9uX19uYXRpdmVcIlxyXG4gIFthdHRyLnR5cGVdPVwidHlwZVwiXHJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcclxuICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInJlYWRvbmx5ID8gdHJ1ZSA6IG51bGxcIlxyXG4+XHJcbiAgPG5nLWNvbnRlbnQgLz5cclxuPC9idXR0b24+XHJcbn0gQGVsc2Uge1xyXG48ZGl2IGNsYXNzPVwiYmFzZS1idXR0b25fX25hdGl2ZSBiYXNlLWJ1dHRvbl9fbmF0aXZlLS1za2VsZXRvblwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWJ1c3k9XCJ0cnVlXCJcclxuICBhcmlhLWxhYmVsPVwiQSBjYXJyZWdhclwiPlxyXG4gIDxhcHAtc2tlbGV0b24tYmxvY2sgd2lkdGg9XCI0MCVcIiBoZWlnaHQ9XCIwLjdyZW1cIiByYWRpdXM9XCI4cHhcIiAvPlxyXG48L2Rpdj5cclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { BaseButtonComponent, BaseButtonType, BaseButtonVariant, } from './base-button/base-button.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2J1dHRvbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsaUJBQWlCLEdBQ2xCLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xyXG4gIEJhc2VCdXR0b25Db21wb25lbnQsXHJcbiAgQmFzZUJ1dHRvblR5cGUsXHJcbiAgQmFzZUJ1dHRvblZhcmlhbnQsXHJcbn0gZnJvbSAnLi9iYXNlLWJ1dHRvbi9iYXNlLWJ1dHRvbi5jb21wb25lbnQnO1xyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1pdGVtLXZpZXcubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9fbW9kZWxzL2NhcmQtaXRlbS12aWV3Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVmlzdGEgbWFwZWFkYSBwb3IgaXRlbSBwYXJhIHtAbGluayBDYXJkTGlzdENvbXBvbmVudH0uICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FyZEl0ZW1WaWV3IHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHN1YnRpdGxlPzogc3RyaW5nO1xyXG4gIC8qKiBUZXh0byBjdXJ0byBwYXJhIG8gYXZhdGFyIChleC46IGluaWNpYWlzKS4gKi9cclxuICBhdmF0YXJUZXh0Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBDYXJkTGlzdE1hcEZuPFQ+ID0gKGl0ZW06IFQpID0+IENhcmRJdGVtVmlldztcclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1kaXNwbGF5Lm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L19tb2RlbHMvZGF0YS1kaXNwbGF5Lm1vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFZhcmlhbnRlcyB2aXN1YWlzIGRvIGBhcHAtc3RhdHVzLWJhZGdlYCAoY29yZXMgc2Vtw6JudGljYXMgZGEgbGliKS4gKi9cclxuZXhwb3J0IHR5cGUgU3RhdHVzQmFkZ2VWYXJpYW50ID1cclxuICB8ICdzdWNjZXNzJ1xyXG4gIHwgJ2Vycm9yJ1xyXG4gIHwgJ3dhcm5pbmcnXHJcbiAgfCAnaW5mbydcclxuICB8ICduZXV0cmFsJztcclxuXHJcbi8qKiBUYW1hbmhvIGRvIGBhcHAtc3RhdHVzLWJhZGdlYC4gKi9cclxuZXhwb3J0IHR5cGUgU3RhdHVzQmFkZ2VTaXplID0gJ3NtJyB8ICdtZCc7XHJcblxyXG4vKiogTGluaGEgY2hhdmUg4oaSIHZhbG9yIHBhcmEgYGFwcC1kZXRhaWxzLXZpZXdgIChtb2RvIGxpc3RhKS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxzVmlld0l0ZW0ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG4vKiogVG9tIGRhIHZhcmlhw6fDo28gb3BjaW9uYWwgbm8gYGFwcC1zdGF0LWNhcmRgIChleC46ICsxMiUgdnMgbcOqcyBhbnRlcmlvcikuICovXHJcbmV4cG9ydCB0eXBlIFN0YXRDYXJkRGVsdGFUb25lID0gJ3Bvc2l0aXZlJyB8ICduZWdhdGl2ZScgfCAnbmV1dHJhbCc7XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLWNvbHVtbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L19tb2RlbHMvZGF0YS1ncmlkLWNvbHVtbi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmHDp8OjbyBkZSBjb2x1bmEgZGEgbGliIOKAlCBjb252ZXJ0aWRhIGludGVybmFtZW50ZSBwYXJhIGBDb2xEZWZgIGRvIEFHIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUdyaWRDb2x1bW48VCA9IHVua25vd24+IHtcbiAgLyoqIENhbXBvIG5vIHJlZ2lzdHJvIG91IGlkZW50aWZpY2Fkb3IgbMOzZ2ljbyAoZXguOiBgX19hY3Rpb25zYCBwYXJhIGNvbHVuYSBkZSBhw6fDtWVzKS4gKi9cbiAga2V5OiBrZXlvZiBUIHwgc3RyaW5nO1xuICBoZWFkZXI6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGZsZXg/OiBudW1iZXI7XG4gIHR5cGU/OiAndGV4dCcgfCAnbnVtYmVyJyB8ICdhY3Rpb25zJztcbiAgLyoqIFBvciBvbWlzc8OjbyBgdHJ1ZWAgcGFyYSB0ZXh0by9uw7ptZXJvOyBpZ25vcmFkbyBwYXJhIGBhY3Rpb25zYC4gKi9cbiAgc29ydGFibGU/OiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9fbW9kZWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IERhdGFHcmlkQ29sdW1uIH0gZnJvbSAnLi9kYXRhLWdyaWQtY29sdW1uLm1vZGVsJztcbmV4cG9ydCB0eXBlIHsgQ2FyZEl0ZW1WaWV3LCBDYXJkTGlzdE1hcEZuIH0gZnJvbSAnLi9jYXJkLWl0ZW0tdmlldy5tb2RlbCc7XG4iXX0=
@@ -0,0 +1,124 @@
1
+ import { BreakpointObserver } from '@angular/cdk/layout';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, EventEmitter, Input, Output, inject, } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { DataGridComponent } from '../data-grid/data-grid.component';
5
+ import { CardListComponent } from '../card-list/card-list.component';
6
+ import * as i0 from "@angular/core";
7
+ /** Limite de largura para tratar como “mobile” na escolha grid vs card. */
8
+ export const ADAPTIVE_DATA_VIEW_MOBILE_QUERY = '(max-width: 767.98px)';
9
+ /**
10
+ * Escolhe **um** de `app-data-grid` ou `app-card-list` conforme breakpoint e preferências.
11
+ * Nunca renderiza os dois em simultâneo.
12
+ */
13
+ export class AdaptiveDataViewComponent {
14
+ constructor() {
15
+ this.bp = inject(BreakpointObserver);
16
+ this.cdr = inject(ChangeDetectorRef);
17
+ this.destroyRef = inject(DestroyRef);
18
+ this.pageSize = 15;
19
+ this.gridHeight = 'min(28rem, 50vh)';
20
+ this.cardScrollMaxHeight = 'min(28rem, 50vh)';
21
+ this.emptyMessageGrid = 'Sem registros para mostrar.';
22
+ this.emptyMessageCard = 'Sem itens para mostrar.';
23
+ this.pagination = true;
24
+ this.showActionsColumn = true;
25
+ this.showCardItemActions = true;
26
+ this.scrollBatchSize = 10;
27
+ this.showCardFooter = false;
28
+ /** Estado de carregamento reposto no grid ou na lista conforme a vista ativa. */
29
+ this.loading = false;
30
+ /**
31
+ * Mostra uma linha de contagem **abaixo** da grade ou da lista (incluindo paginação interna).
32
+ * Texto padrão em português; use `{count}` como marcador do número de linhas em `items`.
33
+ */
34
+ this.showResultCount = true;
35
+ this.resultCountTemplate = '{count} registro(s)';
36
+ /** Vista quando `ADAPTIVE_DATA_VIEW_MOBILE_QUERY` corresponde. Por padrão `card`. */
37
+ this.mobileView = 'card';
38
+ /** Vista quando a tela é maior. Por padrão `grid`. */
39
+ this.desktopView = 'grid';
40
+ this.edit = new EventEmitter();
41
+ this.remove = new EventEmitter();
42
+ this.loadMore = new EventEmitter();
43
+ /** Corresponde ao breakpoint mobile. */
44
+ this.isMobileLayout = false;
45
+ }
46
+ ngOnInit() {
47
+ this.bp
48
+ .observe([ADAPTIVE_DATA_VIEW_MOBILE_QUERY])
49
+ .pipe(takeUntilDestroyed(this.destroyRef))
50
+ .subscribe((state) => {
51
+ this.isMobileLayout = state.matches;
52
+ this.cdr.markForCheck();
53
+ });
54
+ }
55
+ get effectiveKind() {
56
+ return this.isMobileLayout ? this.mobileView : this.desktopView;
57
+ }
58
+ get showGrid() {
59
+ return this.effectiveKind === 'grid';
60
+ }
61
+ get showCard() {
62
+ return this.effectiveKind === 'card';
63
+ }
64
+ get resultCountDisplay() {
65
+ const tpl = (this.resultCountTemplate ?? '').trim();
66
+ if (!tpl) {
67
+ return '';
68
+ }
69
+ const n = this.items?.length ?? 0;
70
+ return tpl.replaceAll('{count}', String(n));
71
+ }
72
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AdaptiveDataViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
73
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AdaptiveDataViewComponent, isStandalone: true, selector: "app-adaptive-data-view", inputs: { items: "items", gridColumns: "gridColumns", mapItem: "mapItem", pageSize: "pageSize", gridHeight: "gridHeight", cardScrollMaxHeight: "cardScrollMaxHeight", emptyMessageGrid: "emptyMessageGrid", emptyMessageCard: "emptyMessageCard", pagination: "pagination", showActionsColumn: "showActionsColumn", showCardItemActions: "showCardItemActions", scrollBatchSize: "scrollBatchSize", showCardFooter: "showCardFooter", loading: "loading", showResultCount: "showResultCount", resultCountTemplate: "resultCountTemplate", mobileView: "mobileView", desktopView: "desktopView" }, outputs: { edit: "edit", remove: "remove", loadMore: "loadMore" }, ngImport: i0, template: "<div class=\"adaptive-data-view\">\r\n <div class=\"adaptive-data-view__main\">\r\n @if (showGrid) {\r\n <app-data-grid\r\n [rows]=\"items\"\r\n [columns]=\"gridColumns\"\r\n [pageSize]=\"pageSize\"\r\n [pagination]=\"pagination\"\r\n [height]=\"gridHeight\"\r\n [emptyMessage]=\"emptyMessageGrid\"\r\n [showActionsColumn]=\"showActionsColumn\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n />\r\n }\r\n @if (showCard) {\r\n <app-card-list\r\n [items]=\"items\"\r\n [mapItem]=\"mapItem\"\r\n [scrollBatchSize]=\"scrollBatchSize\"\r\n [showItemActions]=\"showCardItemActions\"\r\n [showFooter]=\"showCardFooter\"\r\n [scrollMaxHeight]=\"cardScrollMaxHeight\"\r\n [emptyMessage]=\"emptyMessageCard\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n (loadMore)=\"loadMore.emit()\"\r\n />\r\n }\r\n </div>\r\n @if (showResultCount && resultCountDisplay) {\r\n <div class=\"adaptive-data-view__result-count\" aria-live=\"polite\">\r\n {{ resultCountDisplay }}\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;min-width:0}.adaptive-data-view{display:flex;flex-direction:column;align-items:stretch;gap:.5rem;width:100%;min-width:0}.adaptive-data-view__main{display:block;flex:1 1 auto;min-width:0;min-height:0}.adaptive-data-view__result-count{flex:0 0 auto;width:100%;box-sizing:border-box;font-size:.875rem;line-height:1.35;color:#525252}\n"], dependencies: [{ kind: "component", type: DataGridComponent, selector: "app-data-grid", inputs: ["rows", "columns", "pageSize", "loading", "initialPaginationPage", "height", "emptyMessage", "pagination", "showActionsColumn"], outputs: ["edit", "remove", "selectionChange", "paginationChanged"] }, { kind: "component", type: CardListComponent, selector: "app-card-list", inputs: ["items", "loading", "loadingMore", "emptyMessage", "variant", "mapItem", "showItemActions", "trackByProp", "dataMode", "scrollBatchSize", "scrollLoadThresholdPx", "showFooter", "scrollMaxHeight", "totalCountRemote", "hasNextPage"], outputs: ["loadMore", "edit", "remove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AdaptiveDataViewComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'app-adaptive-data-view', standalone: true, imports: [DataGridComponent, CardListComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"adaptive-data-view\">\r\n <div class=\"adaptive-data-view__main\">\r\n @if (showGrid) {\r\n <app-data-grid\r\n [rows]=\"items\"\r\n [columns]=\"gridColumns\"\r\n [pageSize]=\"pageSize\"\r\n [pagination]=\"pagination\"\r\n [height]=\"gridHeight\"\r\n [emptyMessage]=\"emptyMessageGrid\"\r\n [showActionsColumn]=\"showActionsColumn\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n />\r\n }\r\n @if (showCard) {\r\n <app-card-list\r\n [items]=\"items\"\r\n [mapItem]=\"mapItem\"\r\n [scrollBatchSize]=\"scrollBatchSize\"\r\n [showItemActions]=\"showCardItemActions\"\r\n [showFooter]=\"showCardFooter\"\r\n [scrollMaxHeight]=\"cardScrollMaxHeight\"\r\n [emptyMessage]=\"emptyMessageCard\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n (loadMore)=\"loadMore.emit()\"\r\n />\r\n }\r\n </div>\r\n @if (showResultCount && resultCountDisplay) {\r\n <div class=\"adaptive-data-view__result-count\" aria-live=\"polite\">\r\n {{ resultCountDisplay }}\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;min-width:0}.adaptive-data-view{display:flex;flex-direction:column;align-items:stretch;gap:.5rem;width:100%;min-width:0}.adaptive-data-view__main{display:block;flex:1 1 auto;min-width:0;min-height:0}.adaptive-data-view__result-count{flex:0 0 auto;width:100%;box-sizing:border-box;font-size:.875rem;line-height:1.35;color:#525252}\n"] }]
78
+ }], propDecorators: { items: [{
79
+ type: Input,
80
+ args: [{ required: true }]
81
+ }], gridColumns: [{
82
+ type: Input,
83
+ args: [{ required: true }]
84
+ }], mapItem: [{
85
+ type: Input,
86
+ args: [{ required: true }]
87
+ }], pageSize: [{
88
+ type: Input
89
+ }], gridHeight: [{
90
+ type: Input
91
+ }], cardScrollMaxHeight: [{
92
+ type: Input
93
+ }], emptyMessageGrid: [{
94
+ type: Input
95
+ }], emptyMessageCard: [{
96
+ type: Input
97
+ }], pagination: [{
98
+ type: Input
99
+ }], showActionsColumn: [{
100
+ type: Input
101
+ }], showCardItemActions: [{
102
+ type: Input
103
+ }], scrollBatchSize: [{
104
+ type: Input
105
+ }], showCardFooter: [{
106
+ type: Input
107
+ }], loading: [{
108
+ type: Input
109
+ }], showResultCount: [{
110
+ type: Input
111
+ }], resultCountTemplate: [{
112
+ type: Input
113
+ }], mobileView: [{
114
+ type: Input
115
+ }], desktopView: [{
116
+ type: Input
117
+ }], edit: [{
118
+ type: Output
119
+ }], remove: [{
120
+ type: Output
121
+ }], loadMore: [{
122
+ type: Output
123
+ }] } });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRpdmUtZGF0YS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2FkYXB0aXZlLWRhdGEtdmlldy9hZGFwdGl2ZS1kYXRhLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvYWRhcHRpdmUtZGF0YS12aWV3L2FkYXB0aXZlLWRhdGEtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFJckUsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLHVCQUF1QixDQUFDO0FBSXZFOzs7R0FHRztBQVNILE1BQU0sT0FBTyx5QkFBeUI7SUFSdEM7UUFTbUIsT0FBRSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBTXhDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxlQUFVLEdBQWtCLGtCQUFrQixDQUFDO1FBQy9DLHdCQUFtQixHQUFrQixrQkFBa0IsQ0FBQztRQUN4RCxxQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQztRQUNqRCxxQkFBZ0IsR0FBRyx5QkFBeUIsQ0FBQztRQUM3QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUN6Qix3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDM0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDaEMsaUZBQWlGO1FBQ3hFLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFekI7OztXQUdHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsd0JBQW1CLEdBQUcscUJBQXFCLENBQUM7UUFFckQscUZBQXFGO1FBQzVFLGVBQVUsR0FBeUIsTUFBTSxDQUFDO1FBQ25ELHNEQUFzRDtRQUM3QyxnQkFBVyxHQUF5QixNQUFNLENBQUM7UUFFakMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7UUFDN0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7UUFDL0IsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFdkQsd0NBQXdDO1FBQ3hDLG1CQUFjLEdBQUcsS0FBSyxDQUFDO0tBZ0N4QjtJQTlCQyxRQUFRO1FBQ04sSUFBSSxDQUFDLEVBQUU7YUFDSixPQUFPLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDOytHQXRFVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qix1dEJDbkN0Qyw4c0NBc0NBLG9hRFJZLGlCQUFpQix5UUFBRSxpQkFBaUI7OzRGQUtuQyx5QkFBeUI7a0JBUnJDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBQ3RCLElBQUksV0FDUCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLG1CQUc5Qix1QkFBdUIsQ0FBQyxNQUFNOzhCQU9wQixLQUFLO3NCQUEvQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxXQUFXO3NCQUFyQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxPQUFPO3NCQUFqQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQU1HLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFYSxJQUFJO3NCQUF0QixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9kYXRhLWdyaWQvZGF0YS1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYXJkTGlzdENvbXBvbmVudCB9IGZyb20gJy4uL2NhcmQtbGlzdC9jYXJkLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgRGF0YUdyaWRDb2x1bW4gfSBmcm9tICcuLi9fbW9kZWxzL2RhdGEtZ3JpZC1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBDYXJkTGlzdE1hcEZuIH0gZnJvbSAnLi4vX21vZGVscy9jYXJkLWl0ZW0tdmlldy5tb2RlbCc7XG5cbi8qKiBMaW1pdGUgZGUgbGFyZ3VyYSBwYXJhIHRyYXRhciBjb21vIOKAnG1vYmlsZeKAnSBuYSBlc2NvbGhhIGdyaWQgdnMgY2FyZC4gKi9cbmV4cG9ydCBjb25zdCBBREFQVElWRV9EQVRBX1ZJRVdfTU9CSUxFX1FVRVJZID0gJyhtYXgtd2lkdGg6IDc2Ny45OHB4KSc7XG5cbmV4cG9ydCB0eXBlIEFkYXB0aXZlRGF0YVZpZXdNb2RlID0gJ2dyaWQnIHwgJ2NhcmQnO1xuXG4vKipcbiAqIEVzY29saGUgKip1bSoqIGRlIGBhcHAtZGF0YS1ncmlkYCBvdSBgYXBwLWNhcmQtbGlzdGAgY29uZm9ybWUgYnJlYWtwb2ludCBlIHByZWZlcsOqbmNpYXMuXG4gKiBOdW5jYSByZW5kZXJpemEgb3MgZG9pcyBlbSBzaW11bHTDom5lby5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkYXB0aXZlLWRhdGEtdmlldycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtEYXRhR3JpZENvbXBvbmVudCwgQ2FyZExpc3RDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRhcHRpdmUtZGF0YS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FkYXB0aXZlLWRhdGEtdmlldy5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBZGFwdGl2ZURhdGFWaWV3Q29tcG9uZW50PFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnAgPSBpbmplY3QoQnJlYWtwb2ludE9ic2VydmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgaXRlbXMhOiBUW107XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGdyaWRDb2x1bW5zITogRGF0YUdyaWRDb2x1bW48VD5bXTtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbWFwSXRlbSE6IENhcmRMaXN0TWFwRm48VD47XG5cbiAgQElucHV0KCkgcGFnZVNpemUgPSAxNTtcbiAgQElucHV0KCkgZ3JpZEhlaWdodDogc3RyaW5nIHwgbnVsbCA9ICdtaW4oMjhyZW0sIDUwdmgpJztcbiAgQElucHV0KCkgY2FyZFNjcm9sbE1heEhlaWdodDogc3RyaW5nIHwgbnVsbCA9ICdtaW4oMjhyZW0sIDUwdmgpJztcbiAgQElucHV0KCkgZW1wdHlNZXNzYWdlR3JpZCA9ICdTZW0gcmVnaXN0cm9zIHBhcmEgbW9zdHJhci4nO1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2VDYXJkID0gJ1NlbSBpdGVucyBwYXJhIG1vc3RyYXIuJztcbiAgQElucHV0KCkgcGFnaW5hdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBY3Rpb25zQ29sdW1uID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NhcmRJdGVtQWN0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIHNjcm9sbEJhdGNoU2l6ZSA9IDEwO1xuICBASW5wdXQoKSBzaG93Q2FyZEZvb3RlciA9IGZhbHNlO1xuICAvKiogRXN0YWRvIGRlIGNhcnJlZ2FtZW50byByZXBvc3RvIG5vIGdyaWQgb3UgbmEgbGlzdGEgY29uZm9ybWUgYSB2aXN0YSBhdGl2YS4gKi9cbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNb3N0cmEgdW1hIGxpbmhhIGRlIGNvbnRhZ2VtICoqYWJhaXhvKiogZGEgZ3JhZGUgb3UgZGEgbGlzdGEgKGluY2x1aW5kbyBwYWdpbmHDp8OjbyBpbnRlcm5hKS5cbiAgICogVGV4dG8gcGFkcsOjbyBlbSBwb3J0dWd1w6pzOyB1c2UgYHtjb3VudH1gIGNvbW8gbWFyY2Fkb3IgZG8gbsO6bWVybyBkZSBsaW5oYXMgZW0gYGl0ZW1zYC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dSZXN1bHRDb3VudCA9IHRydWU7XG4gIEBJbnB1dCgpIHJlc3VsdENvdW50VGVtcGxhdGUgPSAne2NvdW50fSByZWdpc3RybyhzKSc7XG5cbiAgLyoqIFZpc3RhIHF1YW5kbyBgQURBUFRJVkVfREFUQV9WSUVXX01PQklMRV9RVUVSWWAgY29ycmVzcG9uZGUuIFBvciBwYWRyw6NvIGBjYXJkYC4gKi9cbiAgQElucHV0KCkgbW9iaWxlVmlldzogQWRhcHRpdmVEYXRhVmlld01vZGUgPSAnY2FyZCc7XG4gIC8qKiBWaXN0YSBxdWFuZG8gYSB0ZWxhIMOpIG1haW9yLiBQb3IgcGFkcsOjbyBgZ3JpZGAuICovXG4gIEBJbnB1dCgpIGRlc2t0b3BWaWV3OiBBZGFwdGl2ZURhdGFWaWV3TW9kZSA9ICdncmlkJztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBDb3JyZXNwb25kZSBhbyBicmVha3BvaW50IG1vYmlsZS4gKi9cbiAgaXNNb2JpbGVMYXlvdXQgPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJwXG4gICAgICAub2JzZXJ2ZShbQURBUFRJVkVfREFUQV9WSUVXX01PQklMRV9RVUVSWV0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIHRoaXMuaXNNb2JpbGVMYXlvdXQgPSBzdGF0ZS5tYXRjaGVzO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGVmZmVjdGl2ZUtpbmQoKTogQWRhcHRpdmVEYXRhVmlld01vZGUge1xuICAgIHJldHVybiB0aGlzLmlzTW9iaWxlTGF5b3V0ID8gdGhpcy5tb2JpbGVWaWV3IDogdGhpcy5kZXNrdG9wVmlldztcbiAgfVxuXG4gIGdldCBzaG93R3JpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3RpdmVLaW5kID09PSAnZ3JpZCc7XG4gIH1cblxuICBnZXQgc2hvd0NhcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0aXZlS2luZCA9PT0gJ2NhcmQnO1xuICB9XG5cbiAgZ2V0IHJlc3VsdENvdW50RGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRwbCA9ICh0aGlzLnJlc3VsdENvdW50VGVtcGxhdGUgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoIXRwbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBuID0gdGhpcy5pdGVtcz8ubGVuZ3RoID8/IDA7XG4gICAgcmV0dXJuIHRwbC5yZXBsYWNlQWxsKCd7Y291bnR9JywgU3RyaW5nKG4pKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkYXB0aXZlLWRhdGEtdmlld1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJhZGFwdGl2ZS1kYXRhLXZpZXdfX21haW5cIj5cclxuICAgIEBpZiAoc2hvd0dyaWQpIHtcclxuICAgIDxhcHAtZGF0YS1ncmlkXHJcbiAgICAgIFtyb3dzXT1cIml0ZW1zXCJcclxuICAgICAgW2NvbHVtbnNdPVwiZ3JpZENvbHVtbnNcIlxyXG4gICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcclxuICAgICAgW2hlaWdodF09XCJncmlkSGVpZ2h0XCJcclxuICAgICAgW2VtcHR5TWVzc2FnZV09XCJlbXB0eU1lc3NhZ2VHcmlkXCJcclxuICAgICAgW3Nob3dBY3Rpb25zQ29sdW1uXT1cInNob3dBY3Rpb25zQ29sdW1uXCJcclxuICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICAgIChlZGl0KT1cImVkaXQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgKHJlbW92ZSk9XCJyZW1vdmUuZW1pdCgkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICB9XHJcbiAgICBAaWYgKHNob3dDYXJkKSB7XHJcbiAgICA8YXBwLWNhcmQtbGlzdFxyXG4gICAgICBbaXRlbXNdPVwiaXRlbXNcIlxyXG4gICAgICBbbWFwSXRlbV09XCJtYXBJdGVtXCJcclxuICAgICAgW3Njcm9sbEJhdGNoU2l6ZV09XCJzY3JvbGxCYXRjaFNpemVcIlxyXG4gICAgICBbc2hvd0l0ZW1BY3Rpb25zXT1cInNob3dDYXJkSXRlbUFjdGlvbnNcIlxyXG4gICAgICBbc2hvd0Zvb3Rlcl09XCJzaG93Q2FyZEZvb3RlclwiXHJcbiAgICAgIFtzY3JvbGxNYXhIZWlnaHRdPVwiY2FyZFNjcm9sbE1heEhlaWdodFwiXHJcbiAgICAgIFtlbXB0eU1lc3NhZ2VdPVwiZW1wdHlNZXNzYWdlQ2FyZFwiXHJcbiAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAoZWRpdCk9XCJlZGl0LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIChyZW1vdmUpPVwicmVtb3ZlLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIChsb2FkTW9yZSk9XCJsb2FkTW9yZS5lbWl0KClcIlxyXG4gICAgLz5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICBAaWYgKHNob3dSZXN1bHRDb3VudCAmJiByZXN1bHRDb3VudERpc3BsYXkpIHtcclxuICA8ZGl2IGNsYXNzPVwiYWRhcHRpdmUtZGF0YS12aWV3X19yZXN1bHQtY291bnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cclxuICAgIHt7IHJlc3VsdENvdW50RGlzcGxheSB9fVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==