structra-ui 0.1.4 → 0.1.6
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.
- package/README.md +16 -3
- package/app/_utils/date-pt-br.utils.d.ts +24 -0
- package/app/_utils/decimal-br.utils.d.ts +52 -0
- package/app/_utils/estados-br.data.d.ts +10 -0
- package/app/_utils/integer-br.utils.d.ts +17 -0
- package/app/_utils/integer-value.utils.d.ts +5 -0
- package/app/_utils/scroll/body-scroll-lock.util.d.ts +22 -0
- package/app/app-shell/_models/breadcrumb-item.model.d.ts +13 -0
- package/app/app-shell/app-shell-sidebar-template.directive.d.ts +19 -0
- package/app/app-shell/app-shell.component.d.ts +41 -0
- package/app/app-shell/breadcrumb/breadcrumb.component.d.ts +10 -0
- package/app/app-shell/index.d.ts +19 -0
- package/app/app-shell/sidebar/app-sidebar-toolbar.directive.d.ts +14 -0
- package/app/app-shell/sidebar/shell-sidebar-toggle.component.d.ts +19 -0
- package/app/app-shell/sidebar/sidebar.component.d.ts +36 -0
- package/app/app-shell/sidebar-reveal.constants.d.ts +8 -0
- package/app/app-shell/topbar/topbar.component.d.ts +8 -0
- package/app/app-shell/user-menu/user-menu.component.d.ts +25 -0
- package/app/buttons/base-button/base-button.component.d.ts +43 -0
- package/app/buttons/index.d.ts +1 -0
- package/app/data-display/_models/card-item-view.model.d.ts +8 -0
- package/app/data-display/_models/data-display.models.d.ts +11 -0
- package/app/data-display/_models/data-grid-column.model.d.ts +13 -0
- package/app/data-display/_models/index.d.ts +2 -0
- package/app/data-display/adaptive-data-view/adaptive-data-view.component.d.ts +53 -0
- package/app/data-display/card-list/card-list.component.d.ts +70 -0
- package/app/data-display/dashboard-section/dashboard-section.component.d.ts +12 -0
- package/app/data-display/data-card/data-card.component.d.ts +16 -0
- package/app/data-display/data-grid/data-grid-actions-cell-renderer.component.d.ts +21 -0
- package/app/data-display/data-grid/data-grid.component.d.ts +76 -0
- package/app/data-display/data-list/data-list.component.d.ts +18 -0
- package/app/data-display/data-toolbar/data-toolbar.component.d.ts +6 -0
- package/app/data-display/details-field/details-field.component.d.ts +10 -0
- package/app/data-display/details-view/details-view.component.d.ts +26 -0
- package/app/data-display/empty-state/empty-state-overlay.util.d.ts +5 -0
- package/app/data-display/empty-state/empty-state.component.d.ts +13 -0
- package/app/data-display/index.d.ts +20 -0
- package/app/data-display/list-item/list-item.component.d.ts +22 -0
- package/app/data-display/stat-card/stat-card.component.d.ts +23 -0
- package/app/data-display/status-badge/status-badge.component.d.ts +17 -0
- package/app/data-display/table-empty-state/table-empty-state.component.d.ts +14 -0
- package/app/data-display/table-toolbar/table-toolbar.component.d.ts +11 -0
- package/app/dialogs/_models/lib-dialog-size.model.d.ts +6 -0
- package/app/dialogs/_utils/lib-dialog-panel-classes.d.ts +3 -0
- package/app/dialogs/app-dialog/app-dialog.component.d.ts +57 -0
- package/app/dialogs/app-dialog/dialog-footer.directive.d.ts +6 -0
- package/app/dialogs/confirm-dialog/confirm-dialog-data.model.d.ts +13 -0
- package/app/dialogs/confirm-dialog/confirm-dialog.component.d.ts +20 -0
- package/app/dialogs/confirm-dialog/confirm-dialog.service.d.ts +17 -0
- package/app/dialogs/index.d.ts +13 -0
- package/app/dialogs/loading-dialog/loading-dialog-data.model.d.ts +7 -0
- package/app/dialogs/loading-dialog/loading-dialog.component.d.ts +9 -0
- package/app/dialogs/loading-dialog/loading-dialog.service.d.ts +15 -0
- package/app/dialogs/toast/toast-host.component.d.ts +13 -0
- package/app/dialogs/toast/toast.models.d.ts +26 -0
- package/app/dialogs/toast/toast.service.d.ts +17 -0
- package/app/fields/checkbox-fields/_base/boolean-field.directive.d.ts +42 -0
- package/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.d.ts +8 -0
- package/app/fields/checkbox-fields/index.d.ts +3 -0
- package/app/fields/checkbox-fields/switch-field/switch-field.component.d.ts +8 -0
- package/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.d.ts +62 -0
- package/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.d.ts +40 -0
- package/app/fields/dropdown-fields/_base/dropdown-option-field.base.d.ts +47 -0
- package/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.d.ts +18 -0
- package/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.d.ts +13 -0
- package/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.d.ts +7 -0
- package/app/fields/dropdown-fields/_models/index.d.ts +4 -0
- package/app/fields/dropdown-fields/_models/select-option.model.d.ts +5 -0
- package/app/fields/dropdown-fields/_models/select-pagination.model.d.ts +6 -0
- package/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.d.ts +84 -0
- package/app/fields/dropdown-fields/index.d.ts +7 -0
- package/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.d.ts +49 -0
- package/app/fields/dropdown-fields/select-field/select-field.component.d.ts +54 -0
- package/app/fields/input-fields/_base/base-field.component.d.ts +60 -0
- package/app/fields/input-fields/_base/base-field.directive.d.ts +102 -0
- package/app/fields/input-fields/_base/masked-text-field.base.d.ts +34 -0
- package/app/fields/input-fields/_base/ng-control-field.directive.d.ts +43 -0
- package/app/fields/input-fields/_models/field-common-inputs.model.d.ts +49 -0
- package/app/fields/input-fields/_models/index.d.ts +1 -0
- package/app/fields/input-fields/_utils/mask-complete.validators.d.ts +18 -0
- package/app/fields/input-fields/_utils/mask-format.utils.d.ts +13 -0
- package/app/fields/input-fields/cep-field/cep-field.component.d.ts +12 -0
- package/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.d.ts +20 -0
- package/app/fields/input-fields/date-field/date-field.component.d.ts +30 -0
- package/app/fields/input-fields/decimal-field/decimal-field.component.d.ts +17 -0
- package/app/fields/input-fields/index.d.ts +22 -0
- package/app/fields/input-fields/input-mask-field/input-mask-field.component.d.ts +16 -0
- package/app/fields/input-fields/integer-field/integer-field.component.d.ts +17 -0
- package/app/fields/input-fields/password-field/password-field.component.d.ts +30 -0
- package/app/fields/input-fields/phone-field/phone-field.component.d.ts +22 -0
- package/app/fields/input-fields/text-field/text-field.component.d.ts +16 -0
- package/app/fields/input-fields/textarea-field/textarea-field.component.d.ts +31 -0
- package/app/form-layout/_models/form-layout.model.d.ts +41 -0
- package/app/form-layout/_models/form-tabs.model.d.ts +1 -0
- package/app/form-layout/_models/index.d.ts +3 -0
- package/app/form-layout/_models/validation-summary.model.d.ts +8 -0
- package/app/form-layout/form-actions/form-actions.component.d.ts +21 -0
- package/app/form-layout/form-col/form-col.component.d.ts +25 -0
- package/app/form-layout/form-group/form-group.component.d.ts +125 -0
- package/app/form-layout/form-group/form-path.utils.d.ts +16 -0
- package/app/form-layout/form-group/form-root-invalid-ui-refresh.util.d.ts +8 -0
- package/app/form-layout/form-row/form-row.component.d.ts +14 -0
- package/app/form-layout/form-section/form-section.component.d.ts +13 -0
- package/app/form-layout/form-tab/form-tab.component.d.ts +32 -0
- package/app/form-layout/form-tabs/form-tabs.component.d.ts +44 -0
- package/app/form-layout/index.d.ts +14 -0
- package/app/form-layout/layout-stack/layout-stack.component.d.ts +25 -0
- package/app/form-layout/validation-summary/validation-summary.component.d.ts +105 -0
- package/app/loading/skeleton-loading/index.d.ts +6 -0
- package/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.d.ts +15 -0
- package/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.d.ts +10 -0
- package/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.d.ts +21 -0
- package/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.d.ts +17 -0
- package/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.d.ts +16 -0
- package/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.d.ts +17 -0
- package/app/menus/_models/drawer-side.model.d.ts +6 -0
- package/app/menus/_models/drawer-size.model.d.ts +6 -0
- package/app/menus/_models/menu-dropdown-placement.model.d.ts +10 -0
- package/app/menus/_models/menu-item.model.d.ts +47 -0
- package/app/menus/_utils/menu-connected-positions.util.d.ts +4 -0
- package/app/menus/_utils/menu-rows.util.d.ts +22 -0
- package/app/menus/_utils/submenu-connected-positions.util.d.ts +5 -0
- package/app/menus/action-menu/action-menu.component.d.ts +24 -0
- package/app/menus/context-menu/context-menu.component.d.ts +32 -0
- package/app/menus/drawer/drawer.component.d.ts +38 -0
- package/app/menus/dropdown-menu/dropdown-menu.component.d.ts +33 -0
- package/app/menus/index.d.ts +11 -0
- package/app/menus/menu-divider/menu-divider.component.d.ts +8 -0
- package/app/menus/menu-group/menu-group.component.d.ts +13 -0
- package/app/menus/menu-list/menu-list.component.d.ts +77 -0
- package/app/overlay/_models/overlay-placement.model.d.ts +9 -0
- package/app/overlay/_utils/anchored-overlay-positions.util.d.ts +9 -0
- package/app/overlay/anchored-overlay/anchored-overlay.component.d.ts +51 -0
- package/app/overlay/index.d.ts +20 -0
- package/app/overlay/popover/popover-body-template.directive.d.ts +7 -0
- package/app/overlay/popover/popover-footer-template.directive.d.ts +7 -0
- package/app/overlay/popover/popover-trigger.directive.d.ts +6 -0
- package/app/overlay/popover/popover.component.d.ts +38 -0
- package/app/overlay/tooltip/tooltip-panel-template.directive.d.ts +10 -0
- package/app/overlay/tooltip/tooltip.component.d.ts +40 -0
- package/app/theme/app-theme.service.d.ts +25 -0
- package/app/theme/index.d.ts +1 -0
- package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
- package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
- package/esm2022/app/_utils/estados-br.data.mjs +37 -0
- package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
- package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
- package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +43 -0
- package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
- package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
- package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
- package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
- package/esm2022/app/app-shell/index.mjs +19 -0
- package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
- package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
- package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
- package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
- package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
- package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
- package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
- package/esm2022/app/buttons/index.mjs +2 -0
- package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
- package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
- package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
- package/esm2022/app/data-display/_models/index.mjs +2 -0
- package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
- package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
- package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
- package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
- package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
- package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
- package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
- package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
- package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
- package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
- package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
- package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
- package/esm2022/app/data-display/index.mjs +19 -0
- package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
- package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
- package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
- package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
- package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
- package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
- package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
- package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +170 -0
- package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +45 -0
- package/esm2022/app/dialogs/index.mjs +11 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +36 -0
- package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
- package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
- package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
- package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
- package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
- package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
- package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
- package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
- package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
- package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
- package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
- package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
- package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
- package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
- package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
- package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
- package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
- package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
- package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
- package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
- package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
- package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
- package/esm2022/app/fields/input-fields/index.mjs +22 -0
- package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
- package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
- package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
- package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
- package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
- package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
- package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
- package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
- package/esm2022/app/form-layout/_models/index.mjs +2 -0
- package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
- package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
- package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
- package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
- package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
- package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
- package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
- package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
- package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
- package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
- package/esm2022/app/form-layout/index.mjs +14 -0
- package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
- package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
- package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
- package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
- package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
- package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
- package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
- package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
- package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
- package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
- package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
- package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
- package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
- package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
- package/esm2022/app/menus/index.mjs +11 -0
- package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
- package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
- package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
- package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
- package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
- package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
- package/esm2022/app/overlay/index.mjs +21 -0
- package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
- package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
- package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
- package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
- package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
- package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
- package/esm2022/app/theme/app-theme.service.mjs +49 -0
- package/esm2022/app/theme/index.mjs +2 -0
- package/esm2022/structra-public-api.mjs +18 -0
- package/esm2022/structra-ui.mjs +2 -2
- package/esm2022/structra-version.mjs +3 -0
- package/fesm2022/structra-ui.mjs +8856 -4
- package/fesm2022/structra-ui.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/package.json +7 -2
- package/structra-public-api.d.ts +17 -0
- package/structra-version.d.ts +2 -0
- package/esm2022/lib/version.mjs +0 -3
- package/esm2022/public-api.mjs +0 -5
- package/lib/version.d.ts +0 -2
- package/public-api.d.ts +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { DropdownMenuComponent, } from './dropdown-menu/dropdown-menu.component';
|
|
2
|
+
export { ContextMenuComponent, } from './context-menu/context-menu.component';
|
|
3
|
+
export { DrawerComponent } from './drawer/drawer.component';
|
|
4
|
+
export { MenuListComponent } from './menu-list/menu-list.component';
|
|
5
|
+
export { ActionMenuComponent } from './action-menu/action-menu.component';
|
|
6
|
+
export { MenuDividerComponent } from './menu-divider/menu-divider.component';
|
|
7
|
+
export { MenuGroupComponent } from './menu-group/menu-group.component';
|
|
8
|
+
export type { MenuItemKind, MenuLeafItem, MenuItemAction, MenuItemDivider, MenuItemGroup, MenuItemSubmenu, MenuNodeItem, } from './_models/menu-item.model';
|
|
9
|
+
export { MenuDropdownPlacement } from './_models/menu-dropdown-placement.model';
|
|
10
|
+
export { DrawerSize } from './_models/drawer-size.model';
|
|
11
|
+
export { DrawerSide } from './_models/drawer-side.model';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
/**
|
|
3
|
+
* Separador semântico reutilizável — mesma apresentação que o divisor do modelo de dados (`kind: 'divider'`).
|
|
4
|
+
*/
|
|
5
|
+
export declare class MenuDividerComponent {
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MenuDividerComponent, never>;
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MenuDividerComponent, "app-menu-divider", never, {}, {}, never, never, true, never>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
/**
|
|
3
|
+
* Cabeçalho opcional de grupo — alinhado a `MenuItemGroup` (`kind: 'group'`).
|
|
4
|
+
* Os itens do grupo continuam a ser renderizados pelo `menu-list` (renderização única).
|
|
5
|
+
*/
|
|
6
|
+
export declare class MenuGroupComponent {
|
|
7
|
+
label?: string;
|
|
8
|
+
/** Quando `true`, não mostra o título (ex.: sidebar colapsada só com ícones). */
|
|
9
|
+
hideLabel: boolean;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MenuGroupComponent, never>;
|
|
11
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MenuGroupComponent, "app-menu-group", never, { "label": { "alias": "label"; "required": false; }; "hideLabel": { "alias": "hideLabel"; "required": false; }; }, {}, never, never, true, never>;
|
|
12
|
+
static ngAcceptInputType_hideLabel: unknown;
|
|
13
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ElementRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { MenuItemAction, MenuNodeItem } from '../_models/menu-item.model';
|
|
3
|
+
import { type MenuRow } from '../_utils/menu-rows.util';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class MenuListComponent<T = string> implements OnChanges {
|
|
6
|
+
private readonly cdr;
|
|
7
|
+
private readonly appTheme;
|
|
8
|
+
readonly hostRef: ElementRef<any>;
|
|
9
|
+
items: readonly MenuNodeItem<T>[];
|
|
10
|
+
/** Prefixo dos `id` das opções focáveis (`${menuId}-opt-${focusIndex}`). */
|
|
11
|
+
menuId: string;
|
|
12
|
+
dense: boolean;
|
|
13
|
+
/** Quando `true`, o menu está dentro de um submenu — seta ← regressa um nível. */
|
|
14
|
+
nested: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Destaca visualmente o item cuja `id` coincide (navegação actual / rota activa).
|
|
17
|
+
* Só aplica a linhas `kind: 'item'` neste nível.
|
|
18
|
+
*/
|
|
19
|
+
selectedItemId: T | null;
|
|
20
|
+
/**
|
|
21
|
+
* Oculta rótulos e descrições (ex.: sidebar colapsada), mantendo ícones; define `title` nativo para hover.
|
|
22
|
+
*/
|
|
23
|
+
compressText: boolean;
|
|
24
|
+
readonly itemSelect: EventEmitter<T>;
|
|
25
|
+
readonly closeRequest: EventEmitter<void>;
|
|
26
|
+
readonly submenuBack: EventEmitter<void>;
|
|
27
|
+
private nestedLists?;
|
|
28
|
+
rows: MenuRow<T>[];
|
|
29
|
+
private focusableCount;
|
|
30
|
+
/** Índice entre `0` e `focusableCount - 1`, ou `-1` = nenhum realce. */
|
|
31
|
+
activeIndex: number;
|
|
32
|
+
/** Painel de submenu aberto (um por instância de lista). */
|
|
33
|
+
openSubmenuKey: string | null;
|
|
34
|
+
private submenuOpenTimer;
|
|
35
|
+
private submenuCloseTimer;
|
|
36
|
+
readonly submenuPositions: import("@angular/cdk/overlay").ConnectedPosition[];
|
|
37
|
+
readonly panelThemeNgClass: import("@angular/core").Signal<{
|
|
38
|
+
[x: string]: boolean;
|
|
39
|
+
'app-library-theme': boolean;
|
|
40
|
+
}>;
|
|
41
|
+
overlayPanelClasses(): string[];
|
|
42
|
+
onNestedItemSelect(id: T): void;
|
|
43
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
44
|
+
submenuRowKey(row: MenuRow<T>, index: number): string;
|
|
45
|
+
isSubmenuOpen(row: MenuRow<T>, index: number): boolean;
|
|
46
|
+
submenuMenuId(row: MenuRow<T>): string;
|
|
47
|
+
onRowMouseEnter(row: MenuRow<T>): void;
|
|
48
|
+
onSubmenuTriggerEnter(row: MenuRow<T>, index: number): void;
|
|
49
|
+
onSubmenuTriggerLeave(_row: MenuRow<T>, index: number): void;
|
|
50
|
+
onSubmenuPanelEnter(): void;
|
|
51
|
+
onSubmenuPanelLeave(row: MenuRow<T>, index: number): void;
|
|
52
|
+
private scheduleSubmenuClose;
|
|
53
|
+
private cancelSubmenuOpenTimer;
|
|
54
|
+
private cancelSubmenuCloseTimer;
|
|
55
|
+
/** Fecha o submenu deste nível (seta ← no filho ou fecho de irmão). */
|
|
56
|
+
closeOpenSubmenu(): void;
|
|
57
|
+
onSubmenuRowClick(ev: MouseEvent, row: MenuRow<T>, index: number): void;
|
|
58
|
+
onSubmenuOutsideClick(row: MenuRow<T>, index: number): void;
|
|
59
|
+
private openSubmenuForRowAt;
|
|
60
|
+
private queueFocusNestedFirst;
|
|
61
|
+
/** Primeira opção focável (abertura por teclado). */
|
|
62
|
+
focusFirstOption(): void;
|
|
63
|
+
onItemClick(ev: MouseEvent, item: MenuItemAction<T>): void;
|
|
64
|
+
optionId(focusIndex: number): string;
|
|
65
|
+
isActiveRow(row: MenuRow<T>): boolean;
|
|
66
|
+
/** Realce de selecção persistente (ex.: item de navegação activo). */
|
|
67
|
+
isRowSelected(row: MenuRow<T>): boolean;
|
|
68
|
+
resetHighlight(): void;
|
|
69
|
+
onMenuSurfaceLeave(): void;
|
|
70
|
+
private focusActiveDom;
|
|
71
|
+
onKeydown(ev: KeyboardEvent): void;
|
|
72
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MenuListComponent<any>, never>;
|
|
73
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MenuListComponent<any>, "app-menu-list", never, { "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "nested": { "alias": "nested"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "compressText": { "alias": "compressText"; "required": false; }; }, { "itemSelect": "itemSelect"; "closeRequest": "closeRequest"; "submenuBack": "submenuBack"; }, never, never, true, never>;
|
|
74
|
+
static ngAcceptInputType_dense: unknown;
|
|
75
|
+
static ngAcceptInputType_nested: unknown;
|
|
76
|
+
static ngAcceptInputType_compressText: unknown;
|
|
77
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConnectedPosition } from '@angular/cdk/overlay';
|
|
2
|
+
import { OverlayPlacement } from '../_models/overlay-placement.model';
|
|
3
|
+
/**
|
|
4
|
+
* Constrói posições CDK para overlay ancorado (tooltip, popover, autocomplete, etc.).
|
|
5
|
+
* Inclui alternativas para inverter quando não há espaço (`push` no componente).
|
|
6
|
+
*
|
|
7
|
+
* Menus dropdown usam {@link menuConnectedPositions} em `menus/_utils` (alinhamento `start`, gap tipicamente menor).
|
|
8
|
+
*/
|
|
9
|
+
export declare function anchoredOverlayPositions(placement: OverlayPlacement, offsetPx?: number): ConnectedPosition[];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { EventEmitter, TemplateRef } from '@angular/core';
|
|
2
|
+
import { type ConnectedPosition, type ScrollStrategy } from '@angular/cdk/overlay';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Fundação reutilizável para painéis ancorados (tooltip, popover, autocomplete, datepicker, etc.).
|
|
6
|
+
* Usa `CdkConnectedOverlay` + tema da lib.
|
|
7
|
+
*
|
|
8
|
+
* @see `DropdownBaseComponent` — overlay para painéis de **campo** (menus/select): backdrop e fecho por omissão
|
|
9
|
+
* alinhados a esse caso; mantido separado para não quebrar contratos públicos.
|
|
10
|
+
*/
|
|
11
|
+
export declare class AnchoredOverlayComponent {
|
|
12
|
+
private readonly appTheme;
|
|
13
|
+
private readonly overlay;
|
|
14
|
+
open: boolean;
|
|
15
|
+
readonly openChange: EventEmitter<boolean>;
|
|
16
|
+
panelTemplate: TemplateRef<unknown>;
|
|
17
|
+
connectedPositions: ConnectedPosition[];
|
|
18
|
+
pushConnectedOverlay: boolean;
|
|
19
|
+
hasBackdrop: boolean;
|
|
20
|
+
closeOnEscape: boolean;
|
|
21
|
+
/** Fecha ao clicar fora do painel e fora da âncora (popover, dialogs leves). */
|
|
22
|
+
closeOnOutsideClick: boolean;
|
|
23
|
+
panelWidthPx: number | null;
|
|
24
|
+
panelMinWidthPx: number | null;
|
|
25
|
+
panelMaxWidthPx: number | null;
|
|
26
|
+
/**
|
|
27
|
+
* Estratégia de scroll (predefinição: reposicionar; `close` para fechar ao scroll em certos modais).
|
|
28
|
+
*/
|
|
29
|
+
scrollStrategy: ScrollStrategy | null;
|
|
30
|
+
readonly overlayPanelClasses: import("@angular/core").Signal<string[]>;
|
|
31
|
+
readonly panelThemeNgClass: import("@angular/core").Signal<{
|
|
32
|
+
[x: string]: boolean;
|
|
33
|
+
'app-library-theme': boolean;
|
|
34
|
+
}>;
|
|
35
|
+
readonly defaultScrollStrategy: import("@angular/cdk/overlay").RepositionScrollStrategy;
|
|
36
|
+
get effectiveScrollStrategy(): ScrollStrategy;
|
|
37
|
+
get overlayWidthCss(): number | string | undefined;
|
|
38
|
+
get overlayMinWidthCss(): number | string | undefined;
|
|
39
|
+
onBackdropClick(): void;
|
|
40
|
+
onOverlayOutsideClick(): void;
|
|
41
|
+
onOverlayKeydown(ev: KeyboardEvent): void;
|
|
42
|
+
onDetach(): void;
|
|
43
|
+
setOpen(next: boolean): void;
|
|
44
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AnchoredOverlayComponent, never>;
|
|
45
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AnchoredOverlayComponent, "app-anchored-overlay", never, { "open": { "alias": "open"; "required": false; }; "panelTemplate": { "alias": "panelTemplate"; "required": true; }; "connectedPositions": { "alias": "connectedPositions"; "required": false; }; "pushConnectedOverlay": { "alias": "pushConnectedOverlay"; "required": false; }; "hasBackdrop": { "alias": "hasBackdrop"; "required": false; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; }; "closeOnOutsideClick": { "alias": "closeOnOutsideClick"; "required": false; }; "panelWidthPx": { "alias": "panelWidthPx"; "required": false; }; "panelMinWidthPx": { "alias": "panelMinWidthPx"; "required": false; }; "panelMaxWidthPx": { "alias": "panelMaxWidthPx"; "required": false; }; "scrollStrategy": { "alias": "scrollStrategy"; "required": false; }; }, { "openChange": "openChange"; }, never, ["*"], true, never>;
|
|
46
|
+
static ngAcceptInputType_open: unknown;
|
|
47
|
+
static ngAcceptInputType_pushConnectedOverlay: unknown;
|
|
48
|
+
static ngAcceptInputType_hasBackdrop: unknown;
|
|
49
|
+
static ngAcceptInputType_closeOnEscape: unknown;
|
|
50
|
+
static ngAcceptInputType_closeOnOutsideClick: unknown;
|
|
51
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Overlay (camada de UI flutuante)**
|
|
3
|
+
*
|
|
4
|
+
* - **`AnchoredOverlayComponent`**: primitives CDK (`CdkConnectedOverlay`) + tema (`AppThemeService`).
|
|
5
|
+
* Usado por **tooltip** e **popover** (comportamento genérico: `open`/`openChange`, Escape, clique fora opcional).
|
|
6
|
+
* - **Menus** (`app-dropdown-menu`, campos): usam **`DropdownBaseComponent`** em `fields/dropdown-fields` — contrato
|
|
7
|
+
* estável (backdrop, fecho, largura de painel alinhada ao campo); não foi fundido com `AnchoredOverlay` para
|
|
8
|
+
* não alterar comportamento dos formulários.
|
|
9
|
+
* - **Enums**: `OverlayPlacement` (tooltip/popover, centro do trigger) vs `MenuDropdownPlacement` (menus alinhados
|
|
10
|
+
* ao início do trigger, gap menor — ver `menu-connected-positions.util`).
|
|
11
|
+
*/
|
|
12
|
+
export { AnchoredOverlayComponent } from './anchored-overlay/anchored-overlay.component';
|
|
13
|
+
export { TooltipComponent } from './tooltip/tooltip.component';
|
|
14
|
+
export { TooltipPanelTemplateDirective } from './tooltip/tooltip-panel-template.directive';
|
|
15
|
+
export { PopoverComponent } from './popover/popover.component';
|
|
16
|
+
export { PopoverTriggerDirective } from './popover/popover-trigger.directive';
|
|
17
|
+
export { PopoverBodyTemplateDirective } from './popover/popover-body-template.directive';
|
|
18
|
+
export { PopoverFooterTemplateDirective } from './popover/popover-footer-template.directive';
|
|
19
|
+
export { OverlayPlacement } from './_models/overlay-placement.model';
|
|
20
|
+
export { anchoredOverlayPositions } from './_utils/anchored-overlay-positions.util';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class PopoverBodyTemplateDirective {
|
|
4
|
+
readonly templateRef: TemplateRef<any>;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PopoverBodyTemplateDirective, never>;
|
|
6
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<PopoverBodyTemplateDirective, "ng-template[appPopoverBody]", never, {}, {}, never, never, true, never>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class PopoverFooterTemplateDirective {
|
|
4
|
+
readonly templateRef: TemplateRef<any>;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PopoverFooterTemplateDirective, never>;
|
|
6
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<PopoverFooterTemplateDirective, "ng-template[appPopoverFooter]", never, {}, {}, never, never, true, never>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
/** Marca o elemento que abre/fecha o popover ao clicar. */
|
|
3
|
+
export declare class PopoverTriggerDirective {
|
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PopoverTriggerDirective, never>;
|
|
5
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<PopoverTriggerDirective, "[appPopoverTrigger]", never, {}, {}, never, never, true, never>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { EventEmitter, TemplateRef } from '@angular/core';
|
|
2
|
+
import { OverlayPlacement } from '../_models/overlay-placement.model';
|
|
3
|
+
import { PopoverBodyTemplateDirective } from './popover-body-template.directive';
|
|
4
|
+
import { PopoverFooterTemplateDirective } from './popover-footer-template.directive';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Painel flutuante ancorado (ações contextuais, ajuda rica, mini-formulários).
|
|
8
|
+
* Conteúdo: `ng-template appPopoverBody` obrigatório; `appPopoverFooter` opcional; trigger com `appPopoverTrigger`.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PopoverComponent {
|
|
11
|
+
private readonly cdr;
|
|
12
|
+
title: string;
|
|
13
|
+
/** Modo controlado: `open` + `openChange`. */
|
|
14
|
+
open: boolean;
|
|
15
|
+
readonly openChange: EventEmitter<boolean>;
|
|
16
|
+
placement: OverlayPlacement;
|
|
17
|
+
offsetPx: number;
|
|
18
|
+
minWidthPx: number;
|
|
19
|
+
maxWidthPx: number;
|
|
20
|
+
/** Rótulo acessível quando não há título visível. */
|
|
21
|
+
ariaLabel: string;
|
|
22
|
+
readonly bodyDirective?: PopoverBodyTemplateDirective;
|
|
23
|
+
readonly footerDirective?: PopoverFooterTemplateDirective;
|
|
24
|
+
panelTpl: TemplateRef<unknown>;
|
|
25
|
+
readonly popoverId: string;
|
|
26
|
+
get bodyTpl(): TemplateRef<unknown> | null;
|
|
27
|
+
get footerTpl(): TemplateRef<unknown> | null;
|
|
28
|
+
get positions(): import("@angular/cdk/overlay").ConnectedPosition[];
|
|
29
|
+
get titleId(): string;
|
|
30
|
+
get effectiveAriaLabel(): string | null;
|
|
31
|
+
onTriggerClick(ev: Event): void;
|
|
32
|
+
toggle(): void;
|
|
33
|
+
/** Sincroniza com `app-anchored-overlay` e notifica o pai (`[(open)]`). */
|
|
34
|
+
setOpen(next: boolean): void;
|
|
35
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PopoverComponent, never>;
|
|
36
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PopoverComponent, "app-popover", never, { "title": { "alias": "title"; "required": false; }; "open": { "alias": "open"; "required": false; }; "placement": { "alias": "placement"; "required": false; }; "offsetPx": { "alias": "offsetPx"; "required": false; }; "minWidthPx": { "alias": "minWidthPx"; "required": false; }; "maxWidthPx": { "alias": "maxWidthPx"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "openChange": "openChange"; }, ["bodyDirective", "footerDirective"], ["[appPopoverTrigger]"], true, never>;
|
|
37
|
+
static ngAcceptInputType_open: unknown;
|
|
38
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Marca um `ng-template` como conteúdo do painel do tooltip (em alternativa a `text`).
|
|
5
|
+
*/
|
|
6
|
+
export declare class TooltipPanelTemplateDirective {
|
|
7
|
+
readonly templateRef: TemplateRef<any>;
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TooltipPanelTemplateDirective, never>;
|
|
9
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipPanelTemplateDirective, "ng-template[appTooltipPanel]", never, {}, {}, never, never, true, never>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import { OverlayPlacement } from '../_models/overlay-placement.model';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Tooltip ancorado ao conteúdo projectado (trigger).
|
|
6
|
+
* — Texto: `text` ou `ng-template` com `appTooltipPanel`.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TooltipComponent {
|
|
9
|
+
private readonly cdr;
|
|
10
|
+
text: string;
|
|
11
|
+
placement: OverlayPlacement;
|
|
12
|
+
offsetPx: number;
|
|
13
|
+
showDelayMs: number;
|
|
14
|
+
hideDelayMs: number;
|
|
15
|
+
disabled: boolean;
|
|
16
|
+
private readonly panelDirective?;
|
|
17
|
+
panelTpl: TemplateRef<unknown>;
|
|
18
|
+
readonly placementEnum: typeof OverlayPlacement;
|
|
19
|
+
readonly tooltipId: string;
|
|
20
|
+
open: boolean;
|
|
21
|
+
private showTimer;
|
|
22
|
+
private hideTimer;
|
|
23
|
+
get panelContentTpl(): TemplateRef<unknown> | null;
|
|
24
|
+
get positions(): import("@angular/cdk/overlay").ConnectedPosition[];
|
|
25
|
+
get describedByWhenOpen(): string | null;
|
|
26
|
+
onTriggerMouseEnter(): void;
|
|
27
|
+
onTriggerMouseLeave(): void;
|
|
28
|
+
onTriggerFocusIn(): void;
|
|
29
|
+
onTriggerFocusOut(): void;
|
|
30
|
+
onPanelMouseEnter(): void;
|
|
31
|
+
onPanelMouseLeave(): void;
|
|
32
|
+
private scheduleShow;
|
|
33
|
+
private scheduleHide;
|
|
34
|
+
private cancelShow;
|
|
35
|
+
private cancelHide;
|
|
36
|
+
onAnchoredOpenChange(next: boolean): void;
|
|
37
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TooltipComponent, never>;
|
|
38
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TooltipComponent, "app-tooltip", never, { "text": { "alias": "text"; "required": false; }; "placement": { "alias": "placement"; "required": false; }; "offsetPx": { "alias": "offsetPx"; "required": false; }; "showDelayMs": { "alias": "showDelayMs"; "required": false; }; "hideDelayMs": { "alias": "hideDelayMs"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, ["panelDirective"], ["*"], true, never>;
|
|
39
|
+
static ngAcceptInputType_disabled: unknown;
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare const APP_THEME_IDS: readonly ["blue", "green", "purple", "orange", "white", "gray", "sepia", "black"];
|
|
3
|
+
export type AppThemeId = (typeof APP_THEME_IDS)[number];
|
|
4
|
+
/** Opção de tema para UI (selector, documentação). */
|
|
5
|
+
export interface AppThemeOption {
|
|
6
|
+
readonly id: AppThemeId;
|
|
7
|
+
readonly label: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Estado global do tema da library: classe CSS `theme-*` em conjunto com `.app-library-theme`.
|
|
11
|
+
* Os tokens `--app-color-*` são definidos em `src/app/_theme/`; paletas em `_theme-palettes.scss`.
|
|
12
|
+
*/
|
|
13
|
+
export declare class AppThemeService {
|
|
14
|
+
private readonly activeId;
|
|
15
|
+
/** Identificador do tema activo (`blue`, `green`, …). */
|
|
16
|
+
readonly activeThemeId: import("@angular/core").Signal<"blue" | "green" | "purple" | "orange" | "white" | "gray" | "sepia" | "black">;
|
|
17
|
+
/** Classe CSS do tema (ex.: `theme-green`) para `[ngClass]` no host tematizado. */
|
|
18
|
+
readonly themeClass: import("@angular/core").Signal<string>;
|
|
19
|
+
/** Lista fixa de temas suportados pela library. */
|
|
20
|
+
readonly themeOptions: readonly AppThemeOption[];
|
|
21
|
+
setTheme(id: AppThemeId): void;
|
|
22
|
+
isActive(id: AppThemeId): boolean;
|
|
23
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AppThemeService, never>;
|
|
24
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AppThemeService>;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { APP_THEME_IDS, AppThemeService, type AppThemeId, type AppThemeOption, } from './app-theme.service';
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatação e normalização de data/hora no padrão pt-BR (lib ui-fields).
|
|
3
|
+
*/
|
|
4
|
+
function pad2(n) {
|
|
5
|
+
return n.toString().padStart(2, '0');
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Exibe data como dd/mm/aaaa; com `showTimeHours`, dd/mm/aaaa hh:mm:ss (24h).
|
|
9
|
+
*/
|
|
10
|
+
export function formatDateTimePtBr(date, showTimeHours) {
|
|
11
|
+
const d = pad2(date.getDate());
|
|
12
|
+
const m = pad2(date.getMonth() + 1);
|
|
13
|
+
const y = date.getFullYear();
|
|
14
|
+
if (!showTimeHours) {
|
|
15
|
+
return `${d}/${m}/${y}`;
|
|
16
|
+
}
|
|
17
|
+
return `${d}/${m}/${y} ${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(date.getSeconds())}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Interpreta valor vindo do formulário / API.
|
|
21
|
+
* Aceita data local sem fuso (`YYYY-MM-DD` ou `YYYY-MM-DDTHH:mm:ss`), `Date`, número ou ISO com `Z`.
|
|
22
|
+
*/
|
|
23
|
+
export function parseUiFieldDateValue(value) {
|
|
24
|
+
if (value == null || value === '') {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (value instanceof Date) {
|
|
28
|
+
return Number.isNaN(value.getTime()) ? null : value;
|
|
29
|
+
}
|
|
30
|
+
if (typeof value === 'number') {
|
|
31
|
+
const d = new Date(value);
|
|
32
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
33
|
+
}
|
|
34
|
+
if (typeof value !== 'string') {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const s = value.trim();
|
|
38
|
+
const localDateOnly = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
|
|
39
|
+
if (localDateOnly) {
|
|
40
|
+
const y = +localDateOnly[1];
|
|
41
|
+
const m = +localDateOnly[2] - 1;
|
|
42
|
+
const d = +localDateOnly[3];
|
|
43
|
+
const out = new Date(y, m, d, 0, 0, 0, 0);
|
|
44
|
+
return Number.isNaN(out.getTime()) ? null : out;
|
|
45
|
+
}
|
|
46
|
+
const localDt = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/.exec(s);
|
|
47
|
+
if (localDt) {
|
|
48
|
+
const out = new Date(+localDt[1], +localDt[2] - 1, +localDt[3], +localDt[4], +localDt[5], +localDt[6], 0);
|
|
49
|
+
return Number.isNaN(out.getTime()) ? null : out;
|
|
50
|
+
}
|
|
51
|
+
const d = new Date(s);
|
|
52
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Valor persistido no `FormControl`: horário de parede local, sem `Z`
|
|
56
|
+
* (evita 14:59 no input virar 17:59 no `JSON.stringify` de `Date`).
|
|
57
|
+
*/
|
|
58
|
+
export function formatUiFieldDateValue(d, showTimeHours) {
|
|
59
|
+
const y = d.getFullYear();
|
|
60
|
+
const mo = pad2(d.getMonth() + 1);
|
|
61
|
+
const day = pad2(d.getDate());
|
|
62
|
+
if (!showTimeHours) {
|
|
63
|
+
return `${y}-${mo}-${day}`;
|
|
64
|
+
}
|
|
65
|
+
return `${y}-${mo}-${day}T${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;
|
|
66
|
+
}
|
|
67
|
+
/** @deprecated use {@link parseUiFieldDateValue} */
|
|
68
|
+
export function normalizeFormDateValue(value) {
|
|
69
|
+
return parseUiFieldDateValue(value);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Data escolhida no calendário: meia-noite local, ou com `showTimeHours` a hora completa
|
|
73
|
+
* (h, min, s, ms) do instante da seleção.
|
|
74
|
+
*/
|
|
75
|
+
export function applyPickedCalendarDate(picked, showTimeHours) {
|
|
76
|
+
if (!showTimeHours) {
|
|
77
|
+
return new Date(picked.getFullYear(), picked.getMonth(), picked.getDate(), 0, 0, 0, 0);
|
|
78
|
+
}
|
|
79
|
+
const now = new Date();
|
|
80
|
+
return new Date(picked.getFullYear(), picked.getMonth(), picked.getDate(), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1wdC1ici51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvX3V0aWxzL2RhdGUtcHQtYnIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxTQUFTLElBQUksQ0FBQyxDQUFTO0lBQ3JCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVUsRUFBRSxhQUFzQjtJQUNuRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQWM7SUFDbEQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7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byBkZSBkYXRhL2hvcmEgbm8gcGFkcsOjbyBwdC1CUiAobGliIHVpLWZpZWxkcykuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcGFkMihuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIHJldHVybiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEV4aWJlIGRhdGEgY29tbyBkZC9tbS9hYWFhOyBjb20gYHNob3dUaW1lSG91cnNgLCBkZC9tbS9hYWFhIGhoOm1tOnNzICgyNGgpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lUHRCcihkYXRlOiBEYXRlLCBzaG93VGltZUhvdXJzOiBib29sZWFuKTogc3RyaW5nIHtcclxuICBjb25zdCBkID0gcGFkMihkYXRlLmdldERhdGUoKSk7XHJcbiAgY29uc3QgbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSk7XHJcbiAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICBpZiAoIXNob3dUaW1lSG91cnMpIHtcclxuICAgIHJldHVybiBgJHtkfS8ke219LyR7eX1gO1xyXG4gIH1cclxuICByZXR1cm4gYCR7ZH0vJHttfS8ke3l9ICR7cGFkMihkYXRlLmdldEhvdXJzKCkpfToke3BhZDIoZGF0ZS5nZXRNaW51dGVzKCkpfToke3BhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcnByZXRhIHZhbG9yIHZpbmRvIGRvIGZvcm11bMOhcmlvIC8gQVBJLlxyXG4gKiBBY2VpdGEgZGF0YSBsb2NhbCBzZW0gZnVzbyAoYFlZWVktTU0tRERgIG91IGBZWVlZLU1NLUREVEhIOm1tOnNzYCksIGBEYXRlYCwgbsO6bWVybyBvdSBJU08gY29tIGBaYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVpRmllbGREYXRlVmFsdWUodmFsdWU6IHVua25vd24pOiBEYXRlIHwgbnVsbCB7XHJcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xyXG4gIH1cclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gbnVsbCA6IGQ7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgY29uc3QgcyA9IHZhbHVlLnRyaW0oKTtcclxuICBjb25zdCBsb2NhbERhdGVPbmx5ID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvLmV4ZWMocyk7XHJcbiAgaWYgKGxvY2FsRGF0ZU9ubHkpIHtcclxuICAgIGNvbnN0IHkgPSArbG9jYWxEYXRlT25seVsxXTtcclxuICAgIGNvbnN0IG0gPSArbG9jYWxEYXRlT25seVsyXSAtIDE7XHJcbiAgICBjb25zdCBkID0gK2xvY2FsRGF0ZU9ubHlbM107XHJcbiAgICBjb25zdCBvdXQgPSBuZXcgRGF0ZSh5LCBtLCBkLCAwLCAwLCAwLCAwKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ob3V0LmdldFRpbWUoKSkgPyBudWxsIDogb3V0O1xyXG4gIH1cclxuICBjb25zdCBsb2NhbER0ID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KVQoXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KSQvLmV4ZWMocyk7XHJcbiAgaWYgKGxvY2FsRHQpIHtcclxuICAgIGNvbnN0IG91dCA9IG5ldyBEYXRlKFxyXG4gICAgICArbG9jYWxEdFsxXSxcclxuICAgICAgK2xvY2FsRHRbMl0gLSAxLFxyXG4gICAgICArbG9jYWxEdFszXSxcclxuICAgICAgK2xvY2FsRHRbNF0sXHJcbiAgICAgICtsb2NhbER0WzVdLFxyXG4gICAgICArbG9jYWxEdFs2XSxcclxuICAgICAgMCxcclxuICAgICk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG91dC5nZXRUaW1lKCkpID8gbnVsbCA6IG91dDtcclxuICB9XHJcbiAgY29uc3QgZCA9IG5ldyBEYXRlKHMpO1xyXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gbnVsbCA6IGQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWYWxvciBwZXJzaXN0aWRvIG5vIGBGb3JtQ29udHJvbGA6IGhvcsOhcmlvIGRlIHBhcmVkZSBsb2NhbCwgc2VtIGBaYFxyXG4gKiAoZXZpdGEgMTQ6NTkgbm8gaW5wdXQgdmlyYXIgMTc6NTkgbm8gYEpTT04uc3RyaW5naWZ5YCBkZSBgRGF0ZWApLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFVpRmllbGREYXRlVmFsdWUoZDogRGF0ZSwgc2hvd1RpbWVIb3VyczogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgY29uc3QgeSA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICBjb25zdCBtbyA9IHBhZDIoZC5nZXRNb250aCgpICsgMSk7XHJcbiAgY29uc3QgZGF5ID0gcGFkMihkLmdldERhdGUoKSk7XHJcbiAgaWYgKCFzaG93VGltZUhvdXJzKSB7XHJcbiAgICByZXR1cm4gYCR7eX0tJHttb30tJHtkYXl9YDtcclxuICB9XHJcbiAgcmV0dXJuIGAke3l9LSR7bW99LSR7ZGF5fVQke3BhZDIoZC5nZXRIb3VycygpKX06JHtwYWQyKGQuZ2V0TWludXRlcygpKX06JHtwYWQyKGQuZ2V0U2Vjb25kcygpKX1gO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBwYXJzZVVpRmllbGREYXRlVmFsdWV9ICovXHJcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGb3JtRGF0ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IG51bGwge1xyXG4gIHJldHVybiBwYXJzZVVpRmllbGREYXRlVmFsdWUodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogRGF0YSBlc2NvbGhpZGEgbm8gY2FsZW5kw6FyaW86IG1laWEtbm9pdGUgbG9jYWwsIG91IGNvbSBgc2hvd1RpbWVIb3Vyc2AgYSBob3JhIGNvbXBsZXRhXHJcbiAqIChoLCBtaW4sIHMsIG1zKSBkbyBpbnN0YW50ZSBkYSBzZWxlw6fDo28uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQaWNrZWRDYWxlbmRhckRhdGUoXHJcbiAgcGlja2VkOiBEYXRlLFxyXG4gIHNob3dUaW1lSG91cnM6IGJvb2xlYW4sXHJcbik6IERhdGUge1xyXG4gIGlmICghc2hvd1RpbWVIb3Vycykge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKFxyXG4gICAgICBwaWNrZWQuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgcGlja2VkLmdldE1vbnRoKCksXHJcbiAgICAgIHBpY2tlZC5nZXREYXRlKCksXHJcbiAgICAgIDAsXHJcbiAgICAgIDAsXHJcbiAgICAgIDAsXHJcbiAgICAgIDAsXHJcbiAgICApO1xyXG4gIH1cclxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gIHJldHVybiBuZXcgRGF0ZShcclxuICAgIHBpY2tlZC5nZXRGdWxsWWVhcigpLFxyXG4gICAgcGlja2VkLmdldE1vbnRoKCksXHJcbiAgICBwaWNrZWQuZ2V0RGF0ZSgpLFxyXG4gICAgbm93LmdldEhvdXJzKCksXHJcbiAgICBub3cuZ2V0TWludXRlcygpLFxyXG4gICAgbm93LmdldFNlY29uZHMoKSxcclxuICAgIG5vdy5nZXRNaWxsaXNlY29uZHMoKSxcclxuICApO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitários pt-BR fixo: vírgula decimal, ponto milhar, duas casas na formatação final.
|
|
3
|
+
*/
|
|
4
|
+
import { formatIntegerThousandsBr } from './integer-br.utils';
|
|
5
|
+
export { formatIntegerThousandsBr } from './integer-br.utils';
|
|
6
|
+
export function sanitizeDecimalBrInput(raw) {
|
|
7
|
+
return raw.replace(/[^\d,.]/g, '');
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Remove pontos e interpreta a última vírgula como separador decimal.
|
|
11
|
+
* Retorna apenas dígitos na parte inteira e até 2 na fracionária.
|
|
12
|
+
*/
|
|
13
|
+
export function extractDecimalBrParts(rawDisplay) {
|
|
14
|
+
const noDots = rawDisplay.replace(/\./g, '');
|
|
15
|
+
const lastComma = noDots.lastIndexOf(',');
|
|
16
|
+
if (lastComma === -1) {
|
|
17
|
+
return {
|
|
18
|
+
intDigits: noDots.replace(/\D/g, ''),
|
|
19
|
+
fracDigits: '',
|
|
20
|
+
hasComma: false,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const intDigits = noDots.slice(0, lastComma).replace(/\D/g, '');
|
|
24
|
+
const fracDigits = noDots
|
|
25
|
+
.slice(lastComma + 1)
|
|
26
|
+
.replace(/\D/g, '')
|
|
27
|
+
.slice(0, 2);
|
|
28
|
+
return { intDigits, fracDigits, hasComma: true };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Monta o texto exibido durante a digitação (milhares com ponto, vírgula decimal).
|
|
32
|
+
*/
|
|
33
|
+
export function buildDecimalBrDisplay(parts) {
|
|
34
|
+
const { intDigits, fracDigits, hasComma } = parts;
|
|
35
|
+
if (!hasComma) {
|
|
36
|
+
return formatIntegerThousandsBr(intDigits);
|
|
37
|
+
}
|
|
38
|
+
const intDisplay = intDigits === '' ? '0' : formatIntegerThousandsBr(intDigits);
|
|
39
|
+
return `${intDisplay},${fracDigits}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Posição semântica do cursor para remapear após reformatar.
|
|
43
|
+
*/
|
|
44
|
+
export function semanticCaretAt(value, caret) {
|
|
45
|
+
const left = value.slice(0, caret);
|
|
46
|
+
const noDots = left.replace(/\./g, '');
|
|
47
|
+
const commaIdx = noDots.indexOf(',');
|
|
48
|
+
if (commaIdx === -1) {
|
|
49
|
+
return {
|
|
50
|
+
intCount: noDots.replace(/\D/g, '').length,
|
|
51
|
+
afterComma: false,
|
|
52
|
+
fracCount: 0,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const before = noDots.slice(0, commaIdx).replace(/\D/g, '');
|
|
56
|
+
const after = noDots.slice(commaIdx + 1).replace(/\D/g, '');
|
|
57
|
+
return {
|
|
58
|
+
intCount: before.length,
|
|
59
|
+
afterComma: true,
|
|
60
|
+
fracCount: after.length,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Índice do caret no texto formatado a partir da posição semântica.
|
|
65
|
+
*/
|
|
66
|
+
export function caretIndexFromSemantic(display, target) {
|
|
67
|
+
let intCount = 0;
|
|
68
|
+
let afterComma = false;
|
|
69
|
+
let fracCount = 0;
|
|
70
|
+
for (let i = 0; i < display.length; i++) {
|
|
71
|
+
const ch = display[i];
|
|
72
|
+
if (ch === ',') {
|
|
73
|
+
if (!afterComma) {
|
|
74
|
+
afterComma = true;
|
|
75
|
+
if (target.afterComma &&
|
|
76
|
+
target.fracCount === 0 &&
|
|
77
|
+
target.intCount === intCount) {
|
|
78
|
+
return i + 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (ch === '.') {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (/\d/.test(ch)) {
|
|
87
|
+
if (!afterComma) {
|
|
88
|
+
intCount++;
|
|
89
|
+
if (!target.afterComma && intCount === target.intCount) {
|
|
90
|
+
return i + 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
fracCount++;
|
|
95
|
+
if (target.afterComma &&
|
|
96
|
+
fracCount === target.fracCount &&
|
|
97
|
+
intCount === target.intCount) {
|
|
98
|
+
return i + 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return display.length;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* String passível de parseDecimalBr a partir das partes editáveis.
|
|
107
|
+
*/
|
|
108
|
+
export function buildDecimalBrParseString(parts) {
|
|
109
|
+
if (!parts.hasComma) {
|
|
110
|
+
return parts.intDigits;
|
|
111
|
+
}
|
|
112
|
+
return `${parts.intDigits},${parts.fracDigits}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Interpreta string já sanitizada e retorna número com até 2 casas decimais (arredondamento).
|
|
116
|
+
* Vazio → null. Vírgula como separador decimal; pontos são removidos da parte inteira.
|
|
117
|
+
*/
|
|
118
|
+
export function parseDecimalBr(sanitized) {
|
|
119
|
+
const t = sanitized.trim();
|
|
120
|
+
if (t === '') {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const lastComma = t.lastIndexOf(',');
|
|
124
|
+
let intRaw;
|
|
125
|
+
let fracRaw;
|
|
126
|
+
if (lastComma >= 0) {
|
|
127
|
+
intRaw = t.slice(0, lastComma).replace(/\./g, '');
|
|
128
|
+
fracRaw = t.slice(lastComma + 1).replace(/\./g, '');
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
intRaw = t.replace(/\./g, '');
|
|
132
|
+
fracRaw = '';
|
|
133
|
+
}
|
|
134
|
+
if (!/^\d*$/.test(intRaw) || !/^\d*$/.test(fracRaw)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (intRaw === '' && fracRaw === '') {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const intPart = intRaw === '' ? '0' : intRaw;
|
|
141
|
+
const fracPadded = (fracRaw + '00').slice(0, 2);
|
|
142
|
+
const n = Number(`${intPart}.${fracPadded}`);
|
|
143
|
+
if (!Number.isFinite(n)) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return Math.round(n * 100) / 100;
|
|
147
|
+
}
|
|
148
|
+
export function formatDecimalBr(value) {
|
|
149
|
+
return new Intl.NumberFormat('pt-BR', {
|
|
150
|
+
minimumFractionDigits: 2,
|
|
151
|
+
maximumFractionDigits: 2,
|
|
152
|
+
}).format(value);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaW1hbC1ici51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvX3V0aWxzL2RlY2ltYWwtYnIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsR0FBVztJQUNoRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsVUFBa0I7SUFLdEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLFVBQVUsRUFBRSxFQUFFO1lBQ2QsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE1BQU07U0FDdEIsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDcEIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7U0FDbEIsS0FBSyxDQUFDLENBQUMs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LENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYTtJQUMzQyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7UUFDcEMscUJBQXFCLEVBQUUsQ0FBQztRQUN4QixxQkFBcUIsRUFBRSxDQUFDO0tBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBVdGlsaXTDoXJpb3MgcHQtQlIgZml4bzogdsOtcmd1bGEgZGVjaW1hbCwgcG9udG8gbWlsaGFyLCBkdWFzIGNhc2FzIG5hIGZvcm1hdGHDp8OjbyBmaW5hbC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBmb3JtYXRJbnRlZ2VyVGhvdXNhbmRzQnIgfSBmcm9tICcuL2ludGVnZXItYnIudXRpbHMnO1xyXG5cclxuZXhwb3J0IHsgZm9ybWF0SW50ZWdlclRob3VzYW5kc0JyIH0gZnJvbSAnLi9pbnRlZ2VyLWJyLnV0aWxzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZURlY2ltYWxCcklucHV0KHJhdzogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gcmF3LnJlcGxhY2UoL1teXFxkLC5dL2csICcnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSBwb250b3MgZSBpbnRlcnByZXRhIGEgw7psdGltYSB2w61yZ3VsYSBjb21vIHNlcGFyYWRvciBkZWNpbWFsLlxyXG4gKiBSZXRvcm5hIGFwZW5hcyBkw61naXRvcyBuYSBwYXJ0ZSBpbnRlaXJhIGUgYXTDqSAyIG5hIGZyYWNpb27DoXJpYS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVjaW1hbEJyUGFydHMocmF3RGlzcGxheTogc3RyaW5nKToge1xyXG4gIGludERpZ2l0czogc3RyaW5nO1xyXG4gIGZyYWNEaWdpdHM6IHN0cmluZztcclxuICBoYXNDb21tYTogYm9vbGVhbjtcclxufSB7XHJcbiAgY29uc3Qgbm9Eb3RzID0gcmF3RGlzcGxheS5yZXBsYWNlKC9cXC4vZywgJycpO1xyXG4gIGNvbnN0IGxhc3RDb21tYSA9IG5vRG90cy5sYXN0SW5kZXhPZignLCcpO1xyXG4gIGlmIChsYXN0Q29tbWEgPT09IC0xKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbnREaWdpdHM6IG5vRG90cy5yZXBsYWNlKC9cXEQvZywgJycpLFxyXG4gICAgICBmcmFjRGlnaXRzOiAnJyxcclxuICAgICAgaGFzQ29tbWE6IGZhbHNlLFxyXG4gICAgfTtcclxuICB9XHJcbiAgY29uc3QgaW50RGlnaXRzID0gbm9Eb3RzLnNsaWNlKDAsIGxhc3RDb21tYSkucmVwbGFjZSgvXFxEL2csICcnKTtcclxuICBjb25zdCBmcmFjRGlnaXRzID0gbm9Eb3RzXHJcbiAgICAuc2xpY2UobGFzdENvbW1hICsgMSlcclxuICAgIC5yZXBsYWNlKC9cXEQvZywgJycpXHJcbiAgICAuc2xpY2UoMCwgMik7XHJcbiAgcmV0dXJuIHsgaW50RGlnaXRzLCBmcmFjRGlnaXRzLCBoYXNDb21tYTogdHJ1ZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogTW9udGEgbyB0ZXh0byBleGliaWRvIGR1cmFudGUgYSBkaWdpdGHDp8OjbyAobWlsaGFyZXMgY29tIHBvbnRvLCB2w61yZ3VsYSBkZWNpbWFsKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlY2ltYWxCckRpc3BsYXkocGFydHM6IHtcclxuICBpbnREaWdpdHM6IHN0cmluZztcclxuICBmcmFjRGlnaXRzOiBzdHJpbmc7XHJcbiAgaGFzQ29tbWE6IGJvb2xlYW47XHJcbn0pOiBzdHJpbmcge1xyXG4gIGNvbnN0IHsgaW50RGlnaXRzLCBmcmFjRGlnaXRzLCBoYXNDb21tYSB9ID0gcGFydHM7XHJcbiAgaWYgKCFoYXNDb21tYSkge1xyXG4gICAgcmV0dXJuIGZvcm1hdEludGVnZXJUaG91c2FuZHNCcihpbnREaWdpdHMpO1xyXG4gIH1cclxuICBjb25zdCBpbnREaXNwbGF5ID1cclxuICAgIGludERpZ2l0cyA9PT0gJycgPyAnMCcgOiBmb3JtYXRJbnRlZ2VyVGhvdXNhbmRzQnIoaW50RGlnaXRzKTtcclxuICByZXR1cm4gYCR7aW50RGlzcGxheX0sJHtmcmFjRGlnaXRzfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQb3Npw6fDo28gc2Vtw6JudGljYSBkbyBjdXJzb3IgcGFyYSByZW1hcGVhciBhcMOzcyByZWZvcm1hdGFyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNlbWFudGljQ2FyZXRBdChcclxuICB2YWx1ZTogc3RyaW5nLFxyXG4gIGNhcmV0OiBudW1iZXIsXHJcbik6IHsgaW50Q291bnQ6IG51bWJlcjsgYWZ0ZXJDb21tYTogYm9vbGVhbjsgZnJhY0NvdW50OiBudW1iZXIgfSB7XHJcbiAgY29uc3QgbGVmdCA9IHZhbHVlLnNsaWNlKDAsIGNhcmV0KTtcclxuICBjb25zdCBub0RvdHMgPSBsZWZ0LnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbiAgY29uc3QgY29tbWFJZHggPSBub0RvdHMuaW5kZXhPZignLCcpO1xyXG4gIGlmIChjb21tYUlkeCA9PT0gLTEpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGludENvdW50OiBub0RvdHMucmVwbGFjZSgvXFxEL2csICcnKS5sZW5ndGgsXHJcbiAgICAgIGFmdGVyQ29tbWE6IGZhbHNlLFxyXG4gICAgICBmcmFjQ291bnQ6IDAsXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBiZWZvcmUgPSBub0RvdHMuc2xpY2UoMCwgY29tbWFJZHgpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XHJcbiAgY29uc3QgYWZ0ZXIgPSBub0RvdHMuc2xpY2UoY29tbWFJZHggKyAxKS5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG4gIHJldHVybiB7XHJcbiAgICBpbnRDb3VudDogYmVmb3JlLmxlbmd0aCxcclxuICAgIGFmdGVyQ29tbWE6IHRydWUsXHJcbiAgICBmcmFjQ291bnQ6IGFmdGVyLmxlbmd0aCxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogw41uZGljZSBkbyBjYXJldCBubyB0ZXh0byBmb3JtYXRhZG8gYSBwYXJ0aXIgZGEgcG9zacOnw6NvIHNlbcOibnRpY2EuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2FyZXRJbmRleEZyb21TZW1hbnRpYyhcclxuICBkaXNwbGF5OiBzdHJpbmcsXHJcbiAgdGFyZ2V0OiB7IGludENvdW50OiBudW1iZXI7IGFmdGVyQ29tbWE6IGJvb2xlYW47IGZyYWNDb3VudDogbnVtYmVyIH0sXHJcbik6IG51bWJlciB7XHJcbiAgbGV0IGludENvdW50ID0gMDtcclxuICBsZXQgYWZ0ZXJDb21tYSA9IGZhbHNlO1xyXG4gIGxldCBmcmFjQ291bnQgPSAwO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXkubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGNoID0gZGlzcGxheVtpXTtcclxuICAgIGlmIChjaCA9PT0gJywnKSB7XHJcbiAgICAgIGlmICghYWZ0ZXJDb21tYSkge1xyXG4gICAgICAgIGFmdGVyQ29tbWEgPSB0cnVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRhcmdldC5hZnRlckNvbW1hICYmXHJcbiAgICAgICAgICB0YXJnZXQuZnJhY0NvdW50ID09PSAwICYmXHJcbiAgICAgICAgICB0YXJnZXQuaW50Q291bnQgPT09IGludENvdW50XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gaSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoID09PSAnLicpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoL1xcZC8udGVzdChjaCkpIHtcclxuICAgICAgaWYgKCFhZnRlckNvbW1hKSB7XHJcbiAgICAgICAgaW50Q291bnQrKztcclxuICAgICAgICBpZiAoIXRhcmdldC5hZnRlckNvbW1hICYmIGludENvdW50ID09PSB0YXJnZXQuaW50Q291bnQpIHtcclxuICAgICAgICAgIHJldHVybiBpICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZnJhY0NvdW50Kys7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGFyZ2V0LmFmdGVyQ29tbWEgJiZcclxuICAgICAgICAgIGZyYWNDb3VudCA9PT0gdGFyZ2V0LmZyYWNDb3VudCAmJlxyXG4gICAgICAgICAgaW50Q291bnQgPT09IHRhcmdldC5pbnRDb3VudFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIGkgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZGlzcGxheS5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdHJpbmcgcGFzc8OtdmVsIGRlIHBhcnNlRGVjaW1hbEJyIGEgcGFydGlyIGRhcyBwYXJ0ZXMgZWRpdMOhdmVpcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlY2ltYWxCclBhcnNlU3RyaW5nKHBhcnRzOiB7XHJcbiAgaW50RGlnaXRzOiBzdHJpbmc7XHJcbiAgZnJhY0RpZ2l0czogc3RyaW5nO1xyXG4gIGhhc0NvbW1hOiBib29sZWFuO1xyXG59KTogc3RyaW5nIHtcclxuICBpZiAoIXBhcnRzLmhhc0NvbW1hKSB7XHJcbiAgICByZXR1cm4gcGFydHMuaW50RGlnaXRzO1xyXG4gIH1cclxuICByZXR1cm4gYCR7cGFydHMuaW50RGlnaXRzfSwke3BhcnRzLmZyYWNEaWdpdHN9YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVycHJldGEgc3RyaW5nIGrDoSBzYW5pdGl6YWRhIGUgcmV0b3JuYSBuw7ptZXJvIGNvbSBhdMOpIDIgY2FzYXMgZGVjaW1haXMgKGFycmVkb25kYW1lbnRvKS5cclxuICogVmF6aW8g4oaSIG51bGwuIFbDrXJndWxhIGNvbW8gc2VwYXJhZG9yIGRlY2ltYWw7IHBvbnRvcyBzw6NvIHJlbW92aWRvcyBkYSBwYXJ0ZSBpbnRlaXJhLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVjaW1hbEJyKHNhbml0aXplZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgY29uc3QgdCA9IHNhbml0aXplZC50cmltKCk7XHJcbiAgaWYgKHQgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGxhc3RDb21tYSA9IHQubGFzdEluZGV4T2YoJywnKTtcclxuICBsZXQgaW50UmF3OiBzdHJpbmc7XHJcbiAgbGV0IGZyYWNSYXc6IHN0cmluZztcclxuXHJcbiAgaWYgKGxhc3RDb21tYSA+PSAwKSB7XHJcbiAgICBpbnRSYXcgPSB0LnNsaWNlKDAsIGxhc3RDb21tYSkucmVwbGFjZSgvXFwuL2csICcnKTtcclxuICAgIGZyYWNSYXcgPSB0LnNsaWNlKGxhc3RDb21tYSArIDEpLnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGludFJhdyA9IHQucmVwbGFjZSgvXFwuL2csICcnKTtcclxuICAgIGZyYWNSYXcgPSAnJztcclxuICB9XHJcblxyXG4gIGlmICghL15cXGQqJC8udGVzdChpbnRSYXcpIHx8ICEvXlxcZCokLy50ZXN0KGZyYWNSYXcpKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgaWYgKGludFJhdyA9PT0gJycgJiYgZnJhY1JhdyA9PT0gJycpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW50UGFydCA9IGludFJhdyA9PT0gJycgPyAnMCcgOiBpbnRSYXc7XHJcbiAgY29uc3QgZnJhY1BhZGRlZCA9IChmcmFjUmF3ICsgJzAwJykuc2xpY2UoMCwgMik7XHJcbiAgY29uc3QgbiA9IE51bWJlcihgJHtpbnRQYXJ0fS4ke2ZyYWNQYWRkZWR9YCk7XHJcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gTWF0aC5yb3VuZChuICogMTAwKSAvIDEwMDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxCcih2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHtcclxuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMixcclxuICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMixcclxuICB9KS5mb3JtYXQodmFsdWUpO1xyXG59XHJcbiJdfQ==
|