@seniorsistemas/angular-components 19.9.7 → 19.9.8-develop-dbc2f1b4
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/card/lib/card/card.component.d.ts +6 -2
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +0 -1
- package/dialog/lib/src/dialog/services/dialog.service.d.ts +2 -0
- package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +3 -3
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +8 -3
- package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +4 -3
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.component.mjs +3 -3
- package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.component.mjs +4 -2
- package/esm2022/button/lib/button/button.component.mjs +3 -3
- package/esm2022/card/lib/card/card.component.mjs +13 -5
- package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +3 -3
- package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +3 -3
- package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
- package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/themes/sds-light/sds-light-style.mjs +3 -2
- package/esm2022/collapse-link/lib/collapse-link/collapse-link.component.mjs +3 -3
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +14 -9
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/dialog/lib/src/dialog/dialog.component.mjs +3 -3
- package/esm2022/dialog/lib/src/dialog/services/dialog.service.mjs +13 -1
- package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +6 -4
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
- package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
- package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +3 -3
- package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +3 -3
- package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +3 -3
- package/esm2022/gantt/lib/gantt/components/gantt/bar.mjs +2 -1
- package/esm2022/gantt/lib/gantt/gantt.component.mjs +3 -3
- package/esm2022/global-search/lib/global-search/global-search.component.mjs +16 -25
- package/esm2022/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.mjs +3 -3
- package/esm2022/input-text/lib/input-text/input-text.directive.mjs +3 -3
- package/esm2022/lib/locale/fallback.mjs +5 -2
- package/esm2022/navigation-button/lib/navigation-button/navigation-button.component.mjs +3 -3
- package/esm2022/object-card/lib/object-card/object-card.component.mjs +3 -3
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +3 -3
- package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +3 -3
- package/esm2022/radio-button/lib/radio-button/radio-button.component.mjs +4 -10
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +3 -3
- package/esm2022/select/lib/select/select.component.mjs +3 -3
- package/esm2022/select-button/lib/select-button/components/select-button-item/select-button-item.component.mjs +3 -3
- package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +6 -6
- package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +3 -3
- package/esm2022/slider/lib/slider/slider.component.mjs +67 -65
- package/esm2022/slider/lib/slider/slider.module.mjs +2 -2
- package/esm2022/split-button/lib/split-button/split-button.component.mjs +3 -3
- package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
- package/esm2022/stepper/lib/stepper/stepper.component.mjs +3 -3
- package/esm2022/switch/lib/switch/switch.component.mjs +5 -19
- package/esm2022/tabs/lib/tabs/tabs.component.mjs +3 -3
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +10 -3
- package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +3 -3
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
- package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.global.service.mjs +4 -3
- package/esm2022/tile/lib/tile/tile.component.mjs +3 -3
- package/esm2022/tree/lib/tree/components/tree-node-item/tree-node-item.component.mjs +20 -3
- package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.component.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +10 -5
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -3
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-card.mjs +12 -4
- package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +4 -4
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +2 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +13 -8
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dialog.mjs +14 -2
- package/fesm2022/seniorsistemas-angular-components-dialog.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +13 -12
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +4 -4
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs +3 -2
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs +14 -23
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-text.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-radio-button.mjs +3 -9
- package/fesm2022/seniorsistemas-angular-components-radio-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +5 -5
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slider.mjs +67 -65
- package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-switch.mjs +4 -18
- package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tabs.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +9 -2
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +5 -4
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tile.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tree.mjs +20 -3
- package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +4 -1
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/global-search/lib/global-search/global-search.component.d.ts +7 -3
- package/package.json +1 -1
- package/radio-button/lib/radio-button/radio-button.component.d.ts +0 -1
- package/slider/lib/slider/slider.component.d.ts +25 -7
- package/styles.css +5 -0
- package/switch/lib/switch/switch.component.d.ts +0 -2
- package/thumbnail/lib/thumbnail/thumbnail.component.d.ts +1 -0
- package/tree/lib/tree/components/tree-node-item/tree-node-item.component.d.ts +4 -0
|
@@ -6,6 +6,7 @@ import { InteractiveContentDirective } from '@seniorsistemas/angular-components/
|
|
|
6
6
|
import { TemplateDirective } from '@seniorsistemas/angular-components/template';
|
|
7
7
|
import { Subject, take, takeUntil } from 'rxjs';
|
|
8
8
|
import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
|
|
9
|
+
import { FocusTrapFactory } from '@angular/cdk/a11y';
|
|
9
10
|
import { Overlay } from '@angular/cdk/overlay';
|
|
10
11
|
|
|
11
12
|
class ActiveDialog {
|
|
@@ -29,6 +30,7 @@ class DialogService {
|
|
|
29
30
|
activeDialogInstances = [];
|
|
30
31
|
overlay = inject(Overlay);
|
|
31
32
|
injector = inject(Injector);
|
|
33
|
+
focusTrapFactory = inject(FocusTrapFactory);
|
|
32
34
|
constructor() {
|
|
33
35
|
this.checkEscapeEvent();
|
|
34
36
|
}
|
|
@@ -57,8 +59,18 @@ class DialogService {
|
|
|
57
59
|
handleDialogDestroyEvents(injector, overlayRef, dialogOptions) {
|
|
58
60
|
const destroyClickOutside = dialogOptions?.destroyClickOutside ?? true;
|
|
59
61
|
const activeDialog = this.getActiveDialog(injector);
|
|
62
|
+
// Modal a11y: move focus into the dialog on open, trap Tab/Shift+Tab inside it while
|
|
63
|
+
// open, and restore focus to whatever triggered it on close — same pattern already
|
|
64
|
+
// used by side-sheet/drawer/spotlight in this lib. Done here (not as a `cdkTrapFocus`
|
|
65
|
+
// directive in dialog.component.html) so it also covers `DialogService.open(Component)`
|
|
66
|
+
// with an arbitrary consumer component, not just the declarative `<s-dialog>` template.
|
|
67
|
+
const elementToRefocus = document.activeElement;
|
|
68
|
+
const focusTrap = this.focusTrapFactory.create(overlayRef.overlayElement);
|
|
69
|
+
focusTrap.focusInitialElementWhenReady();
|
|
60
70
|
const destroyDialog = () => {
|
|
71
|
+
focusTrap.destroy();
|
|
61
72
|
overlayRef.dispose();
|
|
73
|
+
elementToRefocus?.focus();
|
|
62
74
|
const index = this.activeDialogInstances.indexOf(activeDialog);
|
|
63
75
|
this.activeDialogInstances.splice(index, 1);
|
|
64
76
|
};
|
|
@@ -270,11 +282,11 @@ class DialogComponent {
|
|
|
270
282
|
});
|
|
271
283
|
}
|
|
272
284
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
273
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DialogComponent, isStandalone: true, selector: "s-dialog", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, contentClassName: { classPropertyName: "contentClassName", publicName: "contentClassName", isSignal: true, isRequired: false, transformFunction: null }, escapeOnEsc: { classPropertyName: "escapeOnEsc", publicName: "escapeOnEsc", isSignal: true, isRequired: false, transformFunction: null }, destroyClickOutside: { classPropertyName: "destroyClickOutside", publicName: "destroyClickOutside", isSignal: true, isRequired: false, transformFunction: null }, closeAriaLabel: { classPropertyName: "closeAriaLabel", publicName: "closeAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange" }, providers: [{ provide: ActiveDialog, useValue: null }], queries: [{ propertyName: "templateDiretives", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "template", first: true, predicate: ["dialogTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "@let activeDialogContext = { activeDialog: activeDialog };\n<ng-template #dialogTemplate>\n @if (activeDialog) {\n @let isSm = activeDialog.dialogSize === 'sm';\n @let isMd = activeDialog.dialogSize === 'md';\n @let isLg = activeDialog.dialogSize === 'lg';\n @let isXl = activeDialog.dialogSize === 'xl';\n @let isFullscreen = activeDialog.dialogSize === 'fullscreen';\n\n <div\n [class]=\"contentClassName()\"\n class=\"max-sm:h-screen max-sm:w-screen flex h-min max-h-screen w-screen flex-col bg-grayscale-0 border border-grayscale-20 shadow-[0_8px_10px_rgba(0,0,0,0.2),0_6px_30px_rgba(0,0,0,0.12),0_16px_24px_rgba(0,0,0,0.14)]\"\n [ngClass]=\"{\n 'max-w-[300px]': isSm,\n 'max-w-[500px]': isMd,\n 'max-w-[800px]': isLg,\n 'max-w-[1140px]': isXl,\n 'h-screen': isFullscreen,\n }\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-main-title\"\n >\n <header class=\"flex flex-wrap justify-between gap-4 p-4 pb-3\">\n @let _header = headerTemplate();\n @if (_header) {\n <ng-container *ngTemplateOutlet=\"_header; context: activeDialogContext\"></ng-container>\n } @else {\n <h3\n id=\"dialog-main-title\"\n class=\"text-base font-open-sans font-normal uppercase text-grayscale-90\"\n >\n {{ header() }}\n </h3>\n }\n\n <button\n type=\"button\"\n class=\"rounded-medium flex cursor-pointer items-center justify-center border-none bg-transparent p-2 outline-none focus-visible:
|
|
285
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DialogComponent, isStandalone: true, selector: "s-dialog", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, contentClassName: { classPropertyName: "contentClassName", publicName: "contentClassName", isSignal: true, isRequired: false, transformFunction: null }, escapeOnEsc: { classPropertyName: "escapeOnEsc", publicName: "escapeOnEsc", isSignal: true, isRequired: false, transformFunction: null }, destroyClickOutside: { classPropertyName: "destroyClickOutside", publicName: "destroyClickOutside", isSignal: true, isRequired: false, transformFunction: null }, closeAriaLabel: { classPropertyName: "closeAriaLabel", publicName: "closeAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange" }, providers: [{ provide: ActiveDialog, useValue: null }], queries: [{ propertyName: "templateDiretives", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "template", first: true, predicate: ["dialogTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "@let activeDialogContext = { activeDialog: activeDialog };\n<ng-template #dialogTemplate>\n @if (activeDialog) {\n @let isSm = activeDialog.dialogSize === 'sm';\n @let isMd = activeDialog.dialogSize === 'md';\n @let isLg = activeDialog.dialogSize === 'lg';\n @let isXl = activeDialog.dialogSize === 'xl';\n @let isFullscreen = activeDialog.dialogSize === 'fullscreen';\n\n <div\n [class]=\"contentClassName()\"\n class=\"max-sm:h-screen max-sm:w-screen flex h-min max-h-screen w-screen flex-col bg-grayscale-0 border border-grayscale-20 shadow-[0_8px_10px_rgba(0,0,0,0.2),0_6px_30px_rgba(0,0,0,0.12),0_16px_24px_rgba(0,0,0,0.14)]\"\n [ngClass]=\"{\n 'max-w-[300px]': isSm,\n 'max-w-[500px]': isMd,\n 'max-w-[800px]': isLg,\n 'max-w-[1140px]': isXl,\n 'h-screen': isFullscreen,\n }\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-main-title\"\n >\n <header class=\"flex flex-wrap justify-between gap-4 p-4 pb-3\">\n @let _header = headerTemplate();\n @if (_header) {\n <ng-container *ngTemplateOutlet=\"_header; context: activeDialogContext\"></ng-container>\n } @else {\n <h3\n id=\"dialog-main-title\"\n class=\"text-base font-open-sans font-normal uppercase text-grayscale-90\"\n >\n {{ header() }}\n </h3>\n }\n\n <button\n type=\"button\"\n class=\"rounded-medium flex cursor-pointer items-center justify-center border-none bg-transparent p-2 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [attr.aria-label]=\"closeAriaLabel()\"\n (click)=\"onDismiss()\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </header>\n <hr class=\"mx-4 h-[1px] border-0 bg-grayscale-20\" />\n\n <main class=\"flex-1 p-4\">\n @let _bodyTemplate = bodyTemplate();\n @if (_bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"_bodyTemplate; context: activeDialogContext\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </main>\n\n @let footer = footerTemplate();\n @if (footer) {\n <footer class=\"flex flex-wrap gap-3 p-4 pt-0\">\n <hr class=\"h-[1px] w-full border-0 bg-grayscale-20\" />\n <div class=\"flex w-full flex-wrap justify-end gap-5\">\n <ng-container *ngTemplateOutlet=\"footer; context: activeDialogContext\"></ng-container>\n </div>\n </footer>\n }\n </div>\n }\n</ng-template>\n\n@if (visible() === undefined) {\n <ng-container *ngTemplateOutlet=\"dialogTemplate\"></ng-container>\n}\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
274
286
|
}
|
|
275
287
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DialogComponent, decorators: [{
|
|
276
288
|
type: Component,
|
|
277
|
-
args: [{ selector: 's-dialog', standalone: true, imports: [NgTemplateOutlet, InteractiveContentDirective, NgClass], providers: [{ provide: ActiveDialog, useValue: null }], template: "@let activeDialogContext = { activeDialog: activeDialog };\n<ng-template #dialogTemplate>\n @if (activeDialog) {\n @let isSm = activeDialog.dialogSize === 'sm';\n @let isMd = activeDialog.dialogSize === 'md';\n @let isLg = activeDialog.dialogSize === 'lg';\n @let isXl = activeDialog.dialogSize === 'xl';\n @let isFullscreen = activeDialog.dialogSize === 'fullscreen';\n\n <div\n [class]=\"contentClassName()\"\n class=\"max-sm:h-screen max-sm:w-screen flex h-min max-h-screen w-screen flex-col bg-grayscale-0 border border-grayscale-20 shadow-[0_8px_10px_rgba(0,0,0,0.2),0_6px_30px_rgba(0,0,0,0.12),0_16px_24px_rgba(0,0,0,0.14)]\"\n [ngClass]=\"{\n 'max-w-[300px]': isSm,\n 'max-w-[500px]': isMd,\n 'max-w-[800px]': isLg,\n 'max-w-[1140px]': isXl,\n 'h-screen': isFullscreen,\n }\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-main-title\"\n >\n <header class=\"flex flex-wrap justify-between gap-4 p-4 pb-3\">\n @let _header = headerTemplate();\n @if (_header) {\n <ng-container *ngTemplateOutlet=\"_header; context: activeDialogContext\"></ng-container>\n } @else {\n <h3\n id=\"dialog-main-title\"\n class=\"text-base font-open-sans font-normal uppercase text-grayscale-90\"\n >\n {{ header() }}\n </h3>\n }\n\n <button\n type=\"button\"\n class=\"rounded-medium flex cursor-pointer items-center justify-center border-none bg-transparent p-2 outline-none focus-visible:
|
|
289
|
+
args: [{ selector: 's-dialog', standalone: true, imports: [NgTemplateOutlet, InteractiveContentDirective, NgClass], providers: [{ provide: ActiveDialog, useValue: null }], template: "@let activeDialogContext = { activeDialog: activeDialog };\n<ng-template #dialogTemplate>\n @if (activeDialog) {\n @let isSm = activeDialog.dialogSize === 'sm';\n @let isMd = activeDialog.dialogSize === 'md';\n @let isLg = activeDialog.dialogSize === 'lg';\n @let isXl = activeDialog.dialogSize === 'xl';\n @let isFullscreen = activeDialog.dialogSize === 'fullscreen';\n\n <div\n [class]=\"contentClassName()\"\n class=\"max-sm:h-screen max-sm:w-screen flex h-min max-h-screen w-screen flex-col bg-grayscale-0 border border-grayscale-20 shadow-[0_8px_10px_rgba(0,0,0,0.2),0_6px_30px_rgba(0,0,0,0.12),0_16px_24px_rgba(0,0,0,0.14)]\"\n [ngClass]=\"{\n 'max-w-[300px]': isSm,\n 'max-w-[500px]': isMd,\n 'max-w-[800px]': isLg,\n 'max-w-[1140px]': isXl,\n 'h-screen': isFullscreen,\n }\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-main-title\"\n >\n <header class=\"flex flex-wrap justify-between gap-4 p-4 pb-3\">\n @let _header = headerTemplate();\n @if (_header) {\n <ng-container *ngTemplateOutlet=\"_header; context: activeDialogContext\"></ng-container>\n } @else {\n <h3\n id=\"dialog-main-title\"\n class=\"text-base font-open-sans font-normal uppercase text-grayscale-90\"\n >\n {{ header() }}\n </h3>\n }\n\n <button\n type=\"button\"\n class=\"rounded-medium flex cursor-pointer items-center justify-center border-none bg-transparent p-2 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [attr.aria-label]=\"closeAriaLabel()\"\n (click)=\"onDismiss()\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </header>\n <hr class=\"mx-4 h-[1px] border-0 bg-grayscale-20\" />\n\n <main class=\"flex-1 p-4\">\n @let _bodyTemplate = bodyTemplate();\n @if (_bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"_bodyTemplate; context: activeDialogContext\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </main>\n\n @let footer = footerTemplate();\n @if (footer) {\n <footer class=\"flex flex-wrap gap-3 p-4 pt-0\">\n <hr class=\"h-[1px] w-full border-0 bg-grayscale-20\" />\n <div class=\"flex w-full flex-wrap justify-end gap-5\">\n <ng-container *ngTemplateOutlet=\"footer; context: activeDialogContext\"></ng-container>\n </div>\n </footer>\n }\n </div>\n }\n</ng-template>\n\n@if (visible() === undefined) {\n <ng-container *ngTemplateOutlet=\"dialogTemplate\"></ng-container>\n}\n" }]
|
|
278
290
|
}], ctorParameters: () => [] });
|
|
279
291
|
|
|
280
292
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-dialog.mjs","sources":["../../projects/angular-components/dialog/src/lib/src/dialog/models/active-dialog.ts","../../projects/angular-components/dialog/src/lib/src/dialog/services/dialog.service.ts","../../projects/angular-components/dialog/src/lib/src/dialog/services/internal-dialog.service.ts","../../projects/angular-components/dialog/src/lib/src/dialog/dialog.component.ts","../../projects/angular-components/dialog/src/lib/src/dialog/dialog.component.html","../../projects/angular-components/dialog/src/seniorsistemas-angular-components-dialog.ts"],"sourcesContent":["import { Subject } from \"rxjs\";\nimport { DialogSize } from \"./dialog-models\";\n\nexport class ActiveDialog {\n dialogSize: DialogSize = 'md';\n escapeOnEsc = true;\n private _close = new Subject<any>();\n private _dismiss = new Subject<any>();\n\n close<T>(result?: T) {\n this._close.next(result);\n this._close.complete();\n }\n\n dismiss<T>(reason?: T) {\n this._dismiss.next(reason);\n this._dismiss.complete();\n }\n\n onClose$ = this._close.asObservable();\n onDismiss$ = this._dismiss.asObservable();\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable, Injector, Type } from '@angular/core';\nimport { take } from 'rxjs';\nimport { ActiveDialog } from '../models/active-dialog';\nimport { DialogOptions, DialogRef } from '../models/dialog-models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DialogService {\n protected readonly activeDialogInstances: ActiveDialog[] = [];\n protected readonly overlay = inject(Overlay);\n protected readonly injector = inject(Injector);\n\n constructor() {\n this.checkEscapeEvent();\n }\n\n open<T>(componentRef: Type<T>, options?: DialogOptions): DialogRef<T> {\n const createdComponent = this.createComponent(componentRef, options);\n return {\n componentInstance: createdComponent.componentInstance as T,\n closed: createdComponent.activeDialog.onClose$,\n dismissed: createdComponent.activeDialog.onDismiss$,\n };\n }\n\n protected createComponent<T>(\n componentRef: Type<T>,\n dialogOptions?: DialogOptions,\n ): {\n componentInstance?: T;\n activeDialog: ActiveDialog;\n } {\n const injector = this.dialogInjector;\n const overlayRef = this.getOverlayRef();\n const portal = new ComponentPortal(componentRef, null, injector);\n const _componentRef = overlayRef.attach(portal);\n const activeDialog = this.getActiveDialog(injector);\n this.activeDialogInstances.push(activeDialog);\n this.applyDialogOptionsIntoActiveDialog(activeDialog, dialogOptions);\n this.handleDialogDestroyEvents(injector, overlayRef, dialogOptions);\n return {\n activeDialog,\n componentInstance: _componentRef.instance,\n };\n }\n\n protected handleDialogDestroyEvents(injector: Injector, overlayRef: OverlayRef, dialogOptions?: DialogOptions) {\n const destroyClickOutside = dialogOptions?.destroyClickOutside ?? true;\n const activeDialog = this.getActiveDialog(injector);\n const destroyDialog = () => {\n overlayRef.dispose();\n const index = this.activeDialogInstances.indexOf(activeDialog);\n this.activeDialogInstances.splice(index, 1);\n };\n if (destroyClickOutside) {\n overlayRef\n .backdropClick()\n .pipe(take(1))\n .subscribe(() => {\n activeDialog.dismiss();\n });\n }\n activeDialog.onClose$.pipe(take(1)).subscribe(destroyDialog);\n activeDialog.onDismiss$.pipe(take(1)).subscribe(destroyDialog);\n }\n\n protected applyDialogOptionsIntoActiveDialog(activeDialog: ActiveDialog, dialogOptions: DialogOptions | undefined) {\n activeDialog.dialogSize = dialogOptions?.size ?? 'md';\n activeDialog.escapeOnEsc = dialogOptions?.escapeOnEsc ?? true;\n }\n\n protected getOverlayRef() {\n const panelClass = ['h-min'];\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\n panelClass,\n });\n return overlayRef;\n }\n\n protected getActiveDialog(injector: Injector) {\n return injector.get(ActiveDialog);\n }\n\n protected get dialogInjector() {\n const injector = Injector.create({\n providers: [{ provide: ActiveDialog, useClass: ActiveDialog }],\n parent: this.injector,\n });\n return injector;\n }\n\n protected checkEscapeEvent() {\n document.body.addEventListener('keydown', (keyboardEvent: KeyboardEvent) => {\n const isEscapePressed = keyboardEvent.key === 'Escape';\n if (!isEscapePressed) {\n return;\n }\n const lastActiveModal = this.activeDialogInstances.at(this.activeDialogInstances.length - 1);\n if (lastActiveModal && lastActiveModal.escapeOnEsc) {\n lastActiveModal.dismiss();\n }\n });\n }\n}\n\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport { Injectable, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { DialogOptions } from '../models/dialog-models';\nimport { DialogService } from './dialog.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InternalDialogService extends DialogService {\n constructor() {\n super();\n }\n\n openByTemplate(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef, dialogOptions?: DialogOptions) {\n const injector = this.dialogInjector;\n const overlayRef = this.getOverlayRef();\n const portal = new TemplatePortal(templateRef, viewContainerRef);\n overlayRef.attach(portal);\n const activeDialog = this.getActiveDialog(injector);\n this.applyDialogOptionsIntoActiveDialog(activeDialog, dialogOptions);\n this.activeDialogInstances.push(activeDialog);\n this.handleDialogDestroyEvents(injector, overlayRef, dialogOptions);\n return activeDialog;\n }\n}\n\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n computed,\n contentChildren,\n inject,\n input,\n model,\n OnDestroy,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport { ActiveDialog } from './models/active-dialog';\nimport { InternalDialogService } from './services/internal-dialog.service';\nimport { DialogSize } from './models/dialog-models';\n\n/**\n * @description Componente de diálogo modal que exibe conteúdo em uma janela sobreposta.\n * Suporta templates customizados para cabeçalho, corpo e rodapé via `sTemplate`.\n * Pode ser utilizado de forma declarativa (via `visible`) ou programática (via `DialogService`).\n *\n * @example\n * ```html\n * <!-- Modo declarativo -->\n * <s-dialog header=\"Título\" [(visible)]=\"showDialog\">\n * <ng-template sTemplate=\"body\">Conteúdo</ng-template>\n * <ng-template sTemplate=\"footer\"><button (click)=\"showDialog = false\">Fechar</button></ng-template>\n * </s-dialog>\n * ```\n *\n * @category Overlay\n */\n@Component({\n selector: 's-dialog',\n standalone: true,\n templateUrl: './dialog.component.html',\n imports: [NgTemplateOutlet, InteractiveContentDirective, NgClass],\n providers: [{ provide: ActiveDialog, useValue: null }],\n})\nexport class DialogComponent implements AfterViewInit, OnDestroy {\n /** @description Texto exibido no cabeçalho do diálogo. Pode ser substituído por um template com `sTemplate=\"header\"`. */\n header = input();\n\n /**\n * @description Controla a visibilidade do diálogo. Suporta two-way binding via `[(visible)]`.\n * Ao definir `true`, o diálogo é aberto; ao definir `false`, é fechado.\n * Não deve ser usado em conjunto com `DialogService` (modo programático).\n */\n visible = model<boolean | undefined>(undefined);\n\n /**\n * @description Instância do diálogo ativo.\n * Em modo programático (aberto via `DialogService`): injetado do pai via `skipSelf`.\n * Em modo declarativo (via `visible`): atribuído internamente ao abrir.\n *\n * O `providers` do componente sobrescreve o token com `null` para que descendentes\n * (ex: `s-dialog` dentro de um lookup dentro deste diálogo) não herdem esta instância.\n */\n activeDialog = inject(ActiveDialog, { optional: true, skipSelf: true });\n\n /**\n * @description Tamanho do diálogo.\n * Valores aceitos: `'sm'`, `'md'` (padrão), `'lg'`, `'xl'`, `'fullscreen'`.\n *\n * @default 'md'\n */\n size = input<DialogSize>('md');\n\n /**\n * @description Classes CSS adicionais aplicadas ao container de conteúdo do diálogo.\n *\n * @default ''\n */\n contentClassName = input('');\n\n /**\n * @description Quando `true`, pressionar a tecla Escape fecha o diálogo.\n *\n * @default true\n */\n escapeOnEsc = input(true);\n\n /**\n * @description Quando `true`, clicar fora do diálogo (no backdrop) fecha o diálogo.\n *\n * @default true\n */\n destroyClickOutside = input(true);\n\n /**\n * @description Valor do aria-label do botão de fechar a dialog.\n *\n * @default 'Fechar'\n */\n closeAriaLabel = input('Fechar');\n\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly dialogService = inject(InternalDialogService);\n private readonly template = viewChild<TemplateRef<any>>('dialogTemplate');\n private readonly templateDiretives = contentChildren(TemplateDirective);\n private readonly onDestroy$ = new Subject<void>();\n\n protected headerTemplate = computed(() => {\n return this.getTemplate('header');\n });\n\n protected bodyTemplate = computed(() => {\n return this.getTemplate('body');\n });\n\n protected footerTemplate = computed(() => {\n return this.getTemplate('footer');\n });\n\n constructor() {\n toObservable(this.visible)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe(() => {\n const visible = this.visible();\n if (visible === true) {\n this.openDialog();\n } else if (visible === false) {\n this.activeDialog?.dismiss();\n }\n });\n }\n\n ngAfterViewInit(): void {\n if (!this.header() && !this.headerTemplate()) {\n console.error('Header is required. provide header via input or sTemplate=\"header\"');\n }\n\n if (this.activeDialog && this.visible() !== undefined) {\n throw new Error(\n '[s-dialog] O input \"visible\" não pode ser usado em um componente aberto via DialogService. ' +\n 'Remova o binding \"[visible]\" — o ciclo de vida deste diálogo já é controlado pelo ActiveDialog injetado.',\n );\n }\n }\n\n ngOnDestroy(): void {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n protected onDismiss() {\n this.activeDialog?.dismiss();\n }\n\n private getTemplate(templateType: string) {\n return this.templateDiretives().find((template) => template.type === templateType)?.template;\n }\n\n private openDialog(): void {\n this.activeDialog = this.dialogService.openByTemplate(this.template()!, this.viewContainerRef, {\n size: this.size(),\n destroyClickOutside: this.destroyClickOutside(),\n escapeOnEsc: this.escapeOnEsc(),\n });\n this.activeDialog.onClose$.pipe(take(1)).subscribe(() => {\n this.activeDialog = null;\n this.visible.set(false);\n });\n\n this.activeDialog.onDismiss$.pipe(take(1)).subscribe(() => {\n this.activeDialog = null;\n this.visible.set(false);\n });\n }\n}\n\n","@let activeDialogContext = { activeDialog: activeDialog };\n<ng-template #dialogTemplate>\n @if (activeDialog) {\n @let isSm = activeDialog.dialogSize === 'sm';\n @let isMd = activeDialog.dialogSize === 'md';\n @let isLg = activeDialog.dialogSize === 'lg';\n @let isXl = activeDialog.dialogSize === 'xl';\n @let isFullscreen = activeDialog.dialogSize === 'fullscreen';\n\n <div\n [class]=\"contentClassName()\"\n class=\"max-sm:h-screen max-sm:w-screen flex h-min max-h-screen w-screen flex-col bg-grayscale-0 border border-grayscale-20 shadow-[0_8px_10px_rgba(0,0,0,0.2),0_6px_30px_rgba(0,0,0,0.12),0_16px_24px_rgba(0,0,0,0.14)]\"\n [ngClass]=\"{\n 'max-w-[300px]': isSm,\n 'max-w-[500px]': isMd,\n 'max-w-[800px]': isLg,\n 'max-w-[1140px]': isXl,\n 'h-screen': isFullscreen,\n }\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-main-title\"\n >\n <header class=\"flex flex-wrap justify-between gap-4 p-4 pb-3\">\n @let _header = headerTemplate();\n @if (_header) {\n <ng-container *ngTemplateOutlet=\"_header; context: activeDialogContext\"></ng-container>\n } @else {\n <h3\n id=\"dialog-main-title\"\n class=\"text-base font-open-sans font-normal uppercase text-grayscale-90\"\n >\n {{ header() }}\n </h3>\n }\n\n <button\n type=\"button\"\n class=\"rounded-medium flex cursor-pointer items-center justify-center border-none bg-transparent p-2 outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n [attr.aria-label]=\"closeAriaLabel()\"\n (click)=\"onDismiss()\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </header>\n <hr class=\"mx-4 h-[1px] border-0 bg-grayscale-20\" />\n\n <main class=\"flex-1 p-4\">\n @let _bodyTemplate = bodyTemplate();\n @if (_bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"_bodyTemplate; context: activeDialogContext\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </main>\n\n @let footer = footerTemplate();\n @if (footer) {\n <footer class=\"flex flex-wrap gap-3 p-4 pt-0\">\n <hr class=\"h-[1px] w-full border-0 bg-grayscale-20\" />\n <div class=\"flex w-full flex-wrap justify-end gap-5\">\n <ng-container *ngTemplateOutlet=\"footer; context: activeDialogContext\"></ng-container>\n </div>\n </footer>\n }\n </div>\n }\n</ng-template>\n\n@if (visible() === undefined) {\n <ng-container *ngTemplateOutlet=\"dialogTemplate\"></ng-container>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-dialog.mjs","sources":["../../projects/angular-components/dialog/src/lib/src/dialog/models/active-dialog.ts","../../projects/angular-components/dialog/src/lib/src/dialog/services/dialog.service.ts","../../projects/angular-components/dialog/src/lib/src/dialog/services/internal-dialog.service.ts","../../projects/angular-components/dialog/src/lib/src/dialog/dialog.component.ts","../../projects/angular-components/dialog/src/lib/src/dialog/dialog.component.html","../../projects/angular-components/dialog/src/seniorsistemas-angular-components-dialog.ts"],"sourcesContent":["import { Subject } from \"rxjs\";\nimport { DialogSize } from \"./dialog-models\";\n\nexport class ActiveDialog {\n dialogSize: DialogSize = 'md';\n escapeOnEsc = true;\n private _close = new Subject<any>();\n private _dismiss = new Subject<any>();\n\n close<T>(result?: T) {\n this._close.next(result);\n this._close.complete();\n }\n\n dismiss<T>(reason?: T) {\n this._dismiss.next(reason);\n this._dismiss.complete();\n }\n\n onClose$ = this._close.asObservable();\n onDismiss$ = this._dismiss.asObservable();\n}\n","import { FocusTrapFactory } from '@angular/cdk/a11y';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable, Injector, Type } from '@angular/core';\nimport { take } from 'rxjs';\nimport { ActiveDialog } from '../models/active-dialog';\nimport { DialogOptions, DialogRef } from '../models/dialog-models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DialogService {\n protected readonly activeDialogInstances: ActiveDialog[] = [];\n protected readonly overlay = inject(Overlay);\n protected readonly injector = inject(Injector);\n protected readonly focusTrapFactory = inject(FocusTrapFactory);\n\n constructor() {\n this.checkEscapeEvent();\n }\n\n open<T>(componentRef: Type<T>, options?: DialogOptions): DialogRef<T> {\n const createdComponent = this.createComponent(componentRef, options);\n return {\n componentInstance: createdComponent.componentInstance as T,\n closed: createdComponent.activeDialog.onClose$,\n dismissed: createdComponent.activeDialog.onDismiss$,\n };\n }\n\n protected createComponent<T>(\n componentRef: Type<T>,\n dialogOptions?: DialogOptions,\n ): {\n componentInstance?: T;\n activeDialog: ActiveDialog;\n } {\n const injector = this.dialogInjector;\n const overlayRef = this.getOverlayRef();\n const portal = new ComponentPortal(componentRef, null, injector);\n const _componentRef = overlayRef.attach(portal);\n const activeDialog = this.getActiveDialog(injector);\n this.activeDialogInstances.push(activeDialog);\n this.applyDialogOptionsIntoActiveDialog(activeDialog, dialogOptions);\n this.handleDialogDestroyEvents(injector, overlayRef, dialogOptions);\n return {\n activeDialog,\n componentInstance: _componentRef.instance,\n };\n }\n\n protected handleDialogDestroyEvents(injector: Injector, overlayRef: OverlayRef, dialogOptions?: DialogOptions) {\n const destroyClickOutside = dialogOptions?.destroyClickOutside ?? true;\n const activeDialog = this.getActiveDialog(injector);\n\n // Modal a11y: move focus into the dialog on open, trap Tab/Shift+Tab inside it while\n // open, and restore focus to whatever triggered it on close — same pattern already\n // used by side-sheet/drawer/spotlight in this lib. Done here (not as a `cdkTrapFocus`\n // directive in dialog.component.html) so it also covers `DialogService.open(Component)`\n // with an arbitrary consumer component, not just the declarative `<s-dialog>` template.\n const elementToRefocus = document.activeElement as HTMLElement | null;\n const focusTrap = this.focusTrapFactory.create(overlayRef.overlayElement);\n focusTrap.focusInitialElementWhenReady();\n\n const destroyDialog = () => {\n focusTrap.destroy();\n overlayRef.dispose();\n elementToRefocus?.focus();\n const index = this.activeDialogInstances.indexOf(activeDialog);\n this.activeDialogInstances.splice(index, 1);\n };\n if (destroyClickOutside) {\n overlayRef\n .backdropClick()\n .pipe(take(1))\n .subscribe(() => {\n activeDialog.dismiss();\n });\n }\n activeDialog.onClose$.pipe(take(1)).subscribe(destroyDialog);\n activeDialog.onDismiss$.pipe(take(1)).subscribe(destroyDialog);\n }\n\n protected applyDialogOptionsIntoActiveDialog(activeDialog: ActiveDialog, dialogOptions: DialogOptions | undefined) {\n activeDialog.dialogSize = dialogOptions?.size ?? 'md';\n activeDialog.escapeOnEsc = dialogOptions?.escapeOnEsc ?? true;\n }\n\n protected getOverlayRef() {\n const panelClass = ['h-min'];\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\n panelClass,\n });\n return overlayRef;\n }\n\n protected getActiveDialog(injector: Injector) {\n return injector.get(ActiveDialog);\n }\n\n protected get dialogInjector() {\n const injector = Injector.create({\n providers: [{ provide: ActiveDialog, useClass: ActiveDialog }],\n parent: this.injector,\n });\n return injector;\n }\n\n protected checkEscapeEvent() {\n document.body.addEventListener('keydown', (keyboardEvent: KeyboardEvent) => {\n const isEscapePressed = keyboardEvent.key === 'Escape';\n if (!isEscapePressed) {\n return;\n }\n const lastActiveModal = this.activeDialogInstances.at(this.activeDialogInstances.length - 1);\n if (lastActiveModal && lastActiveModal.escapeOnEsc) {\n lastActiveModal.dismiss();\n }\n });\n }\n}\n\n","import { TemplatePortal } from '@angular/cdk/portal';\nimport { Injectable, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { DialogOptions } from '../models/dialog-models';\nimport { DialogService } from './dialog.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InternalDialogService extends DialogService {\n constructor() {\n super();\n }\n\n openByTemplate(templateRef: TemplateRef<any>, viewContainerRef: ViewContainerRef, dialogOptions?: DialogOptions) {\n const injector = this.dialogInjector;\n const overlayRef = this.getOverlayRef();\n const portal = new TemplatePortal(templateRef, viewContainerRef);\n overlayRef.attach(portal);\n const activeDialog = this.getActiveDialog(injector);\n this.applyDialogOptionsIntoActiveDialog(activeDialog, dialogOptions);\n this.activeDialogInstances.push(activeDialog);\n this.handleDialogDestroyEvents(injector, overlayRef, dialogOptions);\n return activeDialog;\n }\n}\n\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n computed,\n contentChildren,\n inject,\n input,\n model,\n OnDestroy,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport { ActiveDialog } from './models/active-dialog';\nimport { InternalDialogService } from './services/internal-dialog.service';\nimport { DialogSize } from './models/dialog-models';\n\n/**\n * @description Componente de diálogo modal que exibe conteúdo em uma janela sobreposta.\n * Suporta templates customizados para cabeçalho, corpo e rodapé via `sTemplate`.\n * Pode ser utilizado de forma declarativa (via `visible`) ou programática (via `DialogService`).\n *\n * @example\n * ```html\n * <!-- Modo declarativo -->\n * <s-dialog header=\"Título\" [(visible)]=\"showDialog\">\n * <ng-template sTemplate=\"body\">Conteúdo</ng-template>\n * <ng-template sTemplate=\"footer\"><button (click)=\"showDialog = false\">Fechar</button></ng-template>\n * </s-dialog>\n * ```\n *\n * @category Overlay\n */\n@Component({\n selector: 's-dialog',\n standalone: true,\n templateUrl: './dialog.component.html',\n imports: [NgTemplateOutlet, InteractiveContentDirective, NgClass],\n providers: [{ provide: ActiveDialog, useValue: null }],\n})\nexport class DialogComponent implements AfterViewInit, OnDestroy {\n /** @description Texto exibido no cabeçalho do diálogo. Pode ser substituído por um template com `sTemplate=\"header\"`. */\n header = input();\n\n /**\n * @description Controla a visibilidade do diálogo. Suporta two-way binding via `[(visible)]`.\n * Ao definir `true`, o diálogo é aberto; ao definir `false`, é fechado.\n * Não deve ser usado em conjunto com `DialogService` (modo programático).\n */\n visible = model<boolean | undefined>(undefined);\n\n /**\n * @description Instância do diálogo ativo.\n * Em modo programático (aberto via `DialogService`): injetado do pai via `skipSelf`.\n * Em modo declarativo (via `visible`): atribuído internamente ao abrir.\n *\n * O `providers` do componente sobrescreve o token com `null` para que descendentes\n * (ex: `s-dialog` dentro de um lookup dentro deste diálogo) não herdem esta instância.\n */\n activeDialog = inject(ActiveDialog, { optional: true, skipSelf: true });\n\n /**\n * @description Tamanho do diálogo.\n * Valores aceitos: `'sm'`, `'md'` (padrão), `'lg'`, `'xl'`, `'fullscreen'`.\n *\n * @default 'md'\n */\n size = input<DialogSize>('md');\n\n /**\n * @description Classes CSS adicionais aplicadas ao container de conteúdo do diálogo.\n *\n * @default ''\n */\n contentClassName = input('');\n\n /**\n * @description Quando `true`, pressionar a tecla Escape fecha o diálogo.\n *\n * @default true\n */\n escapeOnEsc = input(true);\n\n /**\n * @description Quando `true`, clicar fora do diálogo (no backdrop) fecha o diálogo.\n *\n * @default true\n */\n destroyClickOutside = input(true);\n\n /**\n * @description Valor do aria-label do botão de fechar a dialog.\n *\n * @default 'Fechar'\n */\n closeAriaLabel = input('Fechar');\n\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly dialogService = inject(InternalDialogService);\n private readonly template = viewChild<TemplateRef<any>>('dialogTemplate');\n private readonly templateDiretives = contentChildren(TemplateDirective);\n private readonly onDestroy$ = new Subject<void>();\n\n protected headerTemplate = computed(() => {\n return this.getTemplate('header');\n });\n\n protected bodyTemplate = computed(() => {\n return this.getTemplate('body');\n });\n\n protected footerTemplate = computed(() => {\n return this.getTemplate('footer');\n });\n\n constructor() {\n toObservable(this.visible)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe(() => {\n const visible = this.visible();\n if (visible === true) {\n this.openDialog();\n } else if (visible === false) {\n this.activeDialog?.dismiss();\n }\n });\n }\n\n ngAfterViewInit(): void {\n if (!this.header() && !this.headerTemplate()) {\n console.error('Header is required. provide header via input or sTemplate=\"header\"');\n }\n\n if (this.activeDialog && this.visible() !== undefined) {\n throw new Error(\n '[s-dialog] O input \"visible\" não pode ser usado em um componente aberto via DialogService. ' +\n 'Remova o binding \"[visible]\" — o ciclo de vida deste diálogo já é controlado pelo ActiveDialog injetado.',\n );\n }\n }\n\n ngOnDestroy(): void {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n protected onDismiss() {\n this.activeDialog?.dismiss();\n }\n\n private getTemplate(templateType: string) {\n return this.templateDiretives().find((template) => template.type === templateType)?.template;\n }\n\n private openDialog(): void {\n this.activeDialog = this.dialogService.openByTemplate(this.template()!, this.viewContainerRef, {\n size: this.size(),\n destroyClickOutside: this.destroyClickOutside(),\n escapeOnEsc: this.escapeOnEsc(),\n });\n this.activeDialog.onClose$.pipe(take(1)).subscribe(() => {\n this.activeDialog = null;\n this.visible.set(false);\n });\n\n this.activeDialog.onDismiss$.pipe(take(1)).subscribe(() => {\n this.activeDialog = null;\n this.visible.set(false);\n });\n }\n}\n\n","@let activeDialogContext = { activeDialog: activeDialog };\n<ng-template #dialogTemplate>\n @if (activeDialog) {\n @let isSm = activeDialog.dialogSize === 'sm';\n @let isMd = activeDialog.dialogSize === 'md';\n @let isLg = activeDialog.dialogSize === 'lg';\n @let isXl = activeDialog.dialogSize === 'xl';\n @let isFullscreen = activeDialog.dialogSize === 'fullscreen';\n\n <div\n [class]=\"contentClassName()\"\n class=\"max-sm:h-screen max-sm:w-screen flex h-min max-h-screen w-screen flex-col bg-grayscale-0 border border-grayscale-20 shadow-[0_8px_10px_rgba(0,0,0,0.2),0_6px_30px_rgba(0,0,0,0.12),0_16px_24px_rgba(0,0,0,0.14)]\"\n [ngClass]=\"{\n 'max-w-[300px]': isSm,\n 'max-w-[500px]': isMd,\n 'max-w-[800px]': isLg,\n 'max-w-[1140px]': isXl,\n 'h-screen': isFullscreen,\n }\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-main-title\"\n >\n <header class=\"flex flex-wrap justify-between gap-4 p-4 pb-3\">\n @let _header = headerTemplate();\n @if (_header) {\n <ng-container *ngTemplateOutlet=\"_header; context: activeDialogContext\"></ng-container>\n } @else {\n <h3\n id=\"dialog-main-title\"\n class=\"text-base font-open-sans font-normal uppercase text-grayscale-90\"\n >\n {{ header() }}\n </h3>\n }\n\n <button\n type=\"button\"\n class=\"rounded-medium flex cursor-pointer items-center justify-center border-none bg-transparent p-2 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [attr.aria-label]=\"closeAriaLabel()\"\n (click)=\"onDismiss()\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </header>\n <hr class=\"mx-4 h-[1px] border-0 bg-grayscale-20\" />\n\n <main class=\"flex-1 p-4\">\n @let _bodyTemplate = bodyTemplate();\n @if (_bodyTemplate) {\n <ng-container *ngTemplateOutlet=\"_bodyTemplate; context: activeDialogContext\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </main>\n\n @let footer = footerTemplate();\n @if (footer) {\n <footer class=\"flex flex-wrap gap-3 p-4 pt-0\">\n <hr class=\"h-[1px] w-full border-0 bg-grayscale-20\" />\n <div class=\"flex w-full flex-wrap justify-end gap-5\">\n <ng-container *ngTemplateOutlet=\"footer; context: activeDialogContext\"></ng-container>\n </div>\n </footer>\n }\n </div>\n }\n</ng-template>\n\n@if (visible() === undefined) {\n <ng-container *ngTemplateOutlet=\"dialogTemplate\"></ng-container>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -154,7 +154,7 @@ class DrawerComponent {
|
|
|
154
154
|
removalVersion: '20.0.0',
|
|
155
155
|
},
|
|
156
156
|
},
|
|
157
|
-
], queries: [{ propertyName: "footerComponent", first: true, predicate: FooterComponent, descendants: true, isSignal: true }, { propertyName: "templates", predicate: TemplateDirective }], hostDirectives: [{ directive: i1.DeprecatedSelectorDirective }], ngImport: i0, template: "@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeDrawer()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n [cdkTrapFocus]=\"visible()\"\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"drawer\"\n [class.drawer--open]=\"visible()\"\n [class.drawer--large-size]=\"largeSized\"\n [attr.role]=\"visible() ? 'dialog' : null\"\n [attr.aria-modal]=\"visible() ? true : null\"\n [attr.aria-labelledby]=\"headerTemplate ? null : titleId\"\n [attr.aria-label]=\"headerTemplate ? ariaLabel : null\"\n [attr.inert]=\"visible() ? null : ''\"\n [attr.aria-hidden]=\"visible() ? null : 'true'\"\n >\n <div class=\"drawer__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <h2\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"drawer__header__title\"\n >\n {{ header }}\n </h2>\n }\n @if (closable) {\n <button\n type=\"button\"\n class=\"drawer__header__close\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n (click)=\"closeDrawer()\"\n >\n <i\n class=\"fas fa-times\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </button>\n }\n </div>\n <div class=\"drawer__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"drawer__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n", styles: [".backdrop{background-color:#00000080;height:100%;left:0;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:998}.drawer{background-color:#fff;box-shadow:0 1px 5px #00000040;display:flex;flex-direction:column;height:100%;right:-100%;padding:1rem;position:fixed;top:0;transition:right .3s;width:100%;z-index:999}.drawer__header{border-bottom:1px solid #dedce5;display:flex;justify-content:space-between;padding-bottom:.75rem}.drawer__header__title{color:#212533;font-family:Inter,sans-serif;font-size:1rem;font-weight:400;margin:0;outline:none;text-transform:uppercase;-webkit-user-select:none;user-select:none}.drawer__header__close{background-color:transparent;border:none;color:#212533;cursor:pointer;font-size:1rem;padding:.5rem}.drawer__body{flex-grow:1;overflow:auto;padding:1rem .5rem}.drawer__footer{border-top:1px solid #dedce5;padding-top:.75rem}.drawer--open{right:0}@media (min-width: 768px){.drawer{width:75%}}@media (min-width: 992px){.drawer{width:50%}}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], animations: [
|
|
157
|
+
], queries: [{ propertyName: "footerComponent", first: true, predicate: FooterComponent, descendants: true, isSignal: true }, { propertyName: "templates", predicate: TemplateDirective }], hostDirectives: [{ directive: i1.DeprecatedSelectorDirective }], ngImport: i0, template: "@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeDrawer()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n [cdkTrapFocus]=\"visible()\"\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"drawer\"\n [class.drawer--open]=\"visible()\"\n [class.drawer--large-size]=\"largeSized\"\n [attr.role]=\"visible() ? 'dialog' : null\"\n [attr.aria-modal]=\"visible() ? true : null\"\n [attr.aria-labelledby]=\"headerTemplate ? null : titleId\"\n [attr.aria-label]=\"headerTemplate ? ariaLabel : null\"\n [attr.inert]=\"visible() ? null : ''\"\n [attr.aria-hidden]=\"visible() ? null : 'true'\"\n >\n <div class=\"drawer__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <h2\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"drawer__header__title\"\n >\n {{ header }}\n </h2>\n }\n @if (closable) {\n <button\n type=\"button\"\n class=\"drawer__header__close\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n (click)=\"closeDrawer()\"\n >\n <i\n class=\"fas fa-times\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </button>\n }\n </div>\n <div class=\"drawer__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"drawer__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n", styles: [".backdrop{background-color:#00000080;height:100%;left:0;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:998}.drawer{background-color:#fff;box-shadow:0 1px 5px #00000040;display:flex;flex-direction:column;height:100%;right:-100%;padding:1rem;position:fixed;top:0;transition:right .3s;width:100%;z-index:999}.drawer__header{border-bottom:1px solid #dedce5;display:flex;justify-content:space-between;padding-bottom:.75rem}.drawer__header__title{color:#212533;font-family:Inter,sans-serif;font-size:1rem;font-weight:400;margin:0;outline:none;text-transform:uppercase;-webkit-user-select:none;user-select:none}.drawer__header__close{background-color:transparent;border:none;color:#212533;cursor:pointer;font-size:1rem;padding:.5rem}.drawer__header__close:focus-visible{border-radius:4px;outline:2px solid var(--s-focus-ring-color);outline-offset:3px}.drawer__body{flex-grow:1;overflow:auto;padding:1rem .5rem}.drawer__footer{border-top:1px solid #dedce5;padding-top:.75rem}.drawer--open{right:0}@media (min-width: 768px){.drawer{width:75%}}@media (min-width: 992px){.drawer{width:50%}}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], animations: [
|
|
158
158
|
trigger('visibilityChanged', [
|
|
159
159
|
transition(':enter', [
|
|
160
160
|
style({ transform: 'translateX(100%)' }),
|
|
@@ -191,7 +191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
191
191
|
animate('300ms', style({ transform: 'translateX(100%)' })),
|
|
192
192
|
]),
|
|
193
193
|
]),
|
|
194
|
-
], standalone: true, imports: [CdkTrapFocus, NgTemplateOutlet, TranslateModule], template: "@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeDrawer()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n [cdkTrapFocus]=\"visible()\"\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"drawer\"\n [class.drawer--open]=\"visible()\"\n [class.drawer--large-size]=\"largeSized\"\n [attr.role]=\"visible() ? 'dialog' : null\"\n [attr.aria-modal]=\"visible() ? true : null\"\n [attr.aria-labelledby]=\"headerTemplate ? null : titleId\"\n [attr.aria-label]=\"headerTemplate ? ariaLabel : null\"\n [attr.inert]=\"visible() ? null : ''\"\n [attr.aria-hidden]=\"visible() ? null : 'true'\"\n >\n <div class=\"drawer__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <h2\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"drawer__header__title\"\n >\n {{ header }}\n </h2>\n }\n @if (closable) {\n <button\n type=\"button\"\n class=\"drawer__header__close\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n (click)=\"closeDrawer()\"\n >\n <i\n class=\"fas fa-times\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </button>\n }\n </div>\n <div class=\"drawer__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"drawer__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n", styles: [".backdrop{background-color:#00000080;height:100%;left:0;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:998}.drawer{background-color:#fff;box-shadow:0 1px 5px #00000040;display:flex;flex-direction:column;height:100%;right:-100%;padding:1rem;position:fixed;top:0;transition:right .3s;width:100%;z-index:999}.drawer__header{border-bottom:1px solid #dedce5;display:flex;justify-content:space-between;padding-bottom:.75rem}.drawer__header__title{color:#212533;font-family:Inter,sans-serif;font-size:1rem;font-weight:400;margin:0;outline:none;text-transform:uppercase;-webkit-user-select:none;user-select:none}.drawer__header__close{background-color:transparent;border:none;color:#212533;cursor:pointer;font-size:1rem;padding:.5rem}.drawer__body{flex-grow:1;overflow:auto;padding:1rem .5rem}.drawer__footer{border-top:1px solid #dedce5;padding-top:.75rem}.drawer--open{right:0}@media (min-width: 768px){.drawer{width:75%}}@media (min-width: 992px){.drawer{width:50%}}\n"] }]
|
|
194
|
+
], standalone: true, imports: [CdkTrapFocus, NgTemplateOutlet, TranslateModule], template: "@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeDrawer()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n [cdkTrapFocus]=\"visible()\"\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"drawer\"\n [class.drawer--open]=\"visible()\"\n [class.drawer--large-size]=\"largeSized\"\n [attr.role]=\"visible() ? 'dialog' : null\"\n [attr.aria-modal]=\"visible() ? true : null\"\n [attr.aria-labelledby]=\"headerTemplate ? null : titleId\"\n [attr.aria-label]=\"headerTemplate ? ariaLabel : null\"\n [attr.inert]=\"visible() ? null : ''\"\n [attr.aria-hidden]=\"visible() ? null : 'true'\"\n >\n <div class=\"drawer__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <h2\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"drawer__header__title\"\n >\n {{ header }}\n </h2>\n }\n @if (closable) {\n <button\n type=\"button\"\n class=\"drawer__header__close\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n (click)=\"closeDrawer()\"\n >\n <i\n class=\"fas fa-times\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </button>\n }\n </div>\n <div class=\"drawer__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"drawer__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n", styles: [".backdrop{background-color:#00000080;height:100%;left:0;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:998}.drawer{background-color:#fff;box-shadow:0 1px 5px #00000040;display:flex;flex-direction:column;height:100%;right:-100%;padding:1rem;position:fixed;top:0;transition:right .3s;width:100%;z-index:999}.drawer__header{border-bottom:1px solid #dedce5;display:flex;justify-content:space-between;padding-bottom:.75rem}.drawer__header__title{color:#212533;font-family:Inter,sans-serif;font-size:1rem;font-weight:400;margin:0;outline:none;text-transform:uppercase;-webkit-user-select:none;user-select:none}.drawer__header__close{background-color:transparent;border:none;color:#212533;cursor:pointer;font-size:1rem;padding:.5rem}.drawer__header__close:focus-visible{border-radius:4px;outline:2px solid var(--s-focus-ring-color);outline-offset:3px}.drawer__body{flex-grow:1;overflow:auto;padding:1rem .5rem}.drawer__footer{border-top:1px solid #dedce5;padding-top:.75rem}.drawer--open{right:0}@media (min-width: 768px){.drawer{width:75%}}@media (min-width: 992px){.drawer{width:50%}}\n"] }]
|
|
195
195
|
}], propDecorators: { templates: [{
|
|
196
196
|
type: ContentChildren,
|
|
197
197
|
args: [TemplateDirective]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-drawer.mjs","sources":["../../projects/angular-components/drawer/src/lib/drawer/drawer.component.ts","../../projects/angular-components/drawer/src/lib/drawer/drawer.component.html","../../projects/angular-components/drawer/src/lib/drawer/drawer.module.ts","../../projects/angular-components/drawer/src/seniorsistemas-angular-components-drawer.ts"],"sourcesContent":["import { animate, style, transition, trigger } from '@angular/animations';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n AfterContentInit,\n Component,\n contentChild,\n ContentChildren,\n effect,\n Input,\n model,\n OnDestroy,\n QueryList,\n TemplateRef,\n} from '@angular/core';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DEPRECATED_CONFIG, DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';\nimport { FooterComponent } from '@seniorsistemas/angular-components/structure';\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\nimport { createScrollLock, randomHash } from '@seniorsistemas/angular-components/utils';\n\n/**\n * @description Componente de painel lateral deslizante (drawer) que aparece sobre o conteúdo\n * vindo do lado direito da tela. Suporta templates customizados para cabeçalho, corpo e rodapé\n * via `sTemplate`, bloqueio de scroll automático e confirmação de fechamento.\n *\n * Também responde ao seletor legado `s-sidebar`.\n *\n * @example\n * ```html\n * <s-drawer [(visible)]=\"drawerOpen\" header=\"Filtros\" [closable]=\"true\">\n * <ng-template sTemplate=\"body\">Conteúdo</ng-template>\n * </s-drawer>\n * ```\n *\n * @category Overlay\n */\n@Component({\n selector: 's-drawer, s-sidebar',\n templateUrl: './drawer.component.html',\n styleUrls: ['./drawer.component.scss'],\n host: {\n '(document:keydown.escape)': 'handleEscape()',\n },\n hostDirectives: [DeprecatedSelectorDirective],\n providers: [\n {\n provide: DEPRECATED_CONFIG,\n useValue: {\n oldSelector: 's-sidebar',\n newSelector: 's-drawer',\n removalVersion: '20.0.0',\n },\n },\n ],\n animations: [\n trigger('visibilityChanged', [\n transition(':enter', [\n style({ transform: 'translateX(100%)' }),\n animate('300ms', style({ transform: 'translateX(0)' })),\n ]),\n transition(':leave', [\n style({ transform: 'translateX(0)' }),\n animate('300ms', style({ transform: 'translateX(100%)' })),\n ]),\n ]),\n ],\n standalone: true,\n imports: [CdkTrapFocus, NgTemplateOutlet, TranslateModule],\n})\nexport class DrawerComponent implements AfterContentInit, OnDestroy {\n @ContentChildren(TemplateDirective)\n public templates: QueryList<TemplateDirective> | null = null;\n\n /**\n * @description Controla a visibilidade do drawer. Suporta two-way binding via `[(visible)]`.\n *\n * @default false\n */\n public visible = model<boolean>(false);\n\n /**\n * @description Quando `true`, exibe o botão de fechar (X) no cabeçalho do drawer.\n *\n * @default true\n */\n @Input()\n public closable = true;\n\n /**\n * @description Quando `true`, clicar no backdrop (área escurecida fora do drawer) fecha o painel.\n *\n * @default true\n */\n @Input()\n public dismissible = true;\n\n /**\n * @description Quando `true`, pressionar a tecla Escape fecha o drawer.\n *\n * @default true\n */\n @Input()\n public closeOnEscape = true;\n\n /**\n * @description Texto exibido no cabeçalho padrão do drawer.\n * Pode ser substituído por um template customizado via `sTemplate=\"header\"`.\n */\n @Input()\n public header?: string;\n\n /**\n * @description Nome acessível do drawer, usado quando o cabeçalho é um template\n * customizado via `sTemplate=\"header\"` (nesse caso não há `header` para associar\n * via `aria-labelledby`). Ignorado quando `header` está definido.\n */\n @Input()\n public ariaLabel?: string;\n\n /**\n * @description Quando `true`, aumenta a largura do drawer para acomodar mais conteúdo.\n *\n * @default false\n */\n @Input()\n public largeSized = false;\n\n /**\n * @description Quando `true`, mantém o conteúdo do drawer no DOM mesmo quando oculto,\n * preservando o estado interno dos componentes filhos.\n *\n * @default false\n */\n @Input()\n public cache = false;\n\n /**\n * @description Função de confirmação chamada antes de fechar o drawer.\n * Quando retornar `false`, o fechamento é bloqueado. Útil para validar formulários não salvos.\n */\n @Input()\n public set registerConfirmClose(fn: () => boolean) {\n this._confirmClose = fn;\n }\n\n /** @description Id único usado para associar o título ao painel via `aria-labelledby`. */\n protected readonly titleId = randomHash('drawer-title');\n\n public headerTemplate: TemplateRef<unknown> | null = null;\n public bodyTemplate: TemplateRef<unknown> | null = null;\n public footerTemplate: TemplateRef<unknown> | null = null;\n\n protected readonly footerComponent = contentChild(FooterComponent);\n\n private _confirmClose = () => true;\n\n private _elementToRefocus: HTMLElement | null = null;\n\n private readonly _scrollLock = createScrollLock();\n\n private readonly visibleEffect = effect(() => {\n const visible = this.visible();\n if (visible) {\n this._scrollLock.lock();\n this._elementToRefocus = document.activeElement as HTMLElement | null;\n } else {\n this._scrollLock.unlock();\n this._restoreFocus();\n }\n });\n\n public ngAfterContentInit(): void {\n this._getTemplates();\n }\n\n public ngOnDestroy(): void {\n this.visibleEffect.destroy();\n this._scrollLock.unlock();\n this._restoreFocus();\n }\n\n public closeDrawer(): void {\n if (this._confirmClose()) {\n this.visible.set(false);\n }\n }\n\n public handleEscape(): void {\n if (!this.visible() || !this.closeOnEscape) {\n return;\n }\n\n this.closeDrawer();\n }\n\n private _restoreFocus(): void {\n this._elementToRefocus?.focus();\n this._elementToRefocus = null;\n }\n\n private _getCustomTemplate(type: string): TemplateRef<any> | null {\n return this.templates?.find((template: TemplateDirective) => template.type === type)?.template ?? null;\n }\n\n private getHeaderTemplate(): TemplateRef<unknown> | null {\n return this._getCustomTemplate('header') ?? null;\n }\n\n private getBodyTemplate(): TemplateRef<unknown> | null {\n return this._getCustomTemplate('body') ?? null;\n }\n\n private getFooterTemplate(): TemplateRef<unknown> | null {\n return this._getCustomTemplate('footer') ?? null;\n }\n\n private _getTemplates(): void {\n this.headerTemplate = this.getHeaderTemplate();\n this.bodyTemplate = this.getBodyTemplate();\n this.footerTemplate = this.getFooterTemplate();\n }\n}\n","@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeDrawer()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n [cdkTrapFocus]=\"visible()\"\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"drawer\"\n [class.drawer--open]=\"visible()\"\n [class.drawer--large-size]=\"largeSized\"\n [attr.role]=\"visible() ? 'dialog' : null\"\n [attr.aria-modal]=\"visible() ? true : null\"\n [attr.aria-labelledby]=\"headerTemplate ? null : titleId\"\n [attr.aria-label]=\"headerTemplate ? ariaLabel : null\"\n [attr.inert]=\"visible() ? null : ''\"\n [attr.aria-hidden]=\"visible() ? null : 'true'\"\n >\n <div class=\"drawer__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <h2\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"drawer__header__title\"\n >\n {{ header }}\n </h2>\n }\n @if (closable) {\n <button\n type=\"button\"\n class=\"drawer__header__close\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n (click)=\"closeDrawer()\"\n >\n <i\n class=\"fas fa-times\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </button>\n }\n </div>\n <div class=\"drawer__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"drawer__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { TemplateModule } from '@seniorsistemas/angular-components/template';\n\nimport { DrawerComponent } from './drawer.component';\n\n@NgModule({\n imports: [DrawerComponent],\n exports: [DrawerComponent, TemplateModule],\n})\nexport class DrawerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-drawer.mjs","sources":["../../projects/angular-components/drawer/src/lib/drawer/drawer.component.ts","../../projects/angular-components/drawer/src/lib/drawer/drawer.component.html","../../projects/angular-components/drawer/src/lib/drawer/drawer.module.ts","../../projects/angular-components/drawer/src/seniorsistemas-angular-components-drawer.ts"],"sourcesContent":["import { animate, style, transition, trigger } from '@angular/animations';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n AfterContentInit,\n Component,\n contentChild,\n ContentChildren,\n effect,\n Input,\n model,\n OnDestroy,\n QueryList,\n TemplateRef,\n} from '@angular/core';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DEPRECATED_CONFIG, DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';\nimport { FooterComponent } from '@seniorsistemas/angular-components/structure';\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\nimport { createScrollLock, randomHash } from '@seniorsistemas/angular-components/utils';\n\n/**\n * @description Componente de painel lateral deslizante (drawer) que aparece sobre o conteúdo\n * vindo do lado direito da tela. Suporta templates customizados para cabeçalho, corpo e rodapé\n * via `sTemplate`, bloqueio de scroll automático e confirmação de fechamento.\n *\n * Também responde ao seletor legado `s-sidebar`.\n *\n * @example\n * ```html\n * <s-drawer [(visible)]=\"drawerOpen\" header=\"Filtros\" [closable]=\"true\">\n * <ng-template sTemplate=\"body\">Conteúdo</ng-template>\n * </s-drawer>\n * ```\n *\n * @category Overlay\n */\n@Component({\n selector: 's-drawer, s-sidebar',\n templateUrl: './drawer.component.html',\n styleUrls: ['./drawer.component.scss'],\n host: {\n '(document:keydown.escape)': 'handleEscape()',\n },\n hostDirectives: [DeprecatedSelectorDirective],\n providers: [\n {\n provide: DEPRECATED_CONFIG,\n useValue: {\n oldSelector: 's-sidebar',\n newSelector: 's-drawer',\n removalVersion: '20.0.0',\n },\n },\n ],\n animations: [\n trigger('visibilityChanged', [\n transition(':enter', [\n style({ transform: 'translateX(100%)' }),\n animate('300ms', style({ transform: 'translateX(0)' })),\n ]),\n transition(':leave', [\n style({ transform: 'translateX(0)' }),\n animate('300ms', style({ transform: 'translateX(100%)' })),\n ]),\n ]),\n ],\n standalone: true,\n imports: [CdkTrapFocus, NgTemplateOutlet, TranslateModule],\n})\nexport class DrawerComponent implements AfterContentInit, OnDestroy {\n @ContentChildren(TemplateDirective)\n public templates: QueryList<TemplateDirective> | null = null;\n\n /**\n * @description Controla a visibilidade do drawer. Suporta two-way binding via `[(visible)]`.\n *\n * @default false\n */\n public visible = model<boolean>(false);\n\n /**\n * @description Quando `true`, exibe o botão de fechar (X) no cabeçalho do drawer.\n *\n * @default true\n */\n @Input()\n public closable = true;\n\n /**\n * @description Quando `true`, clicar no backdrop (área escurecida fora do drawer) fecha o painel.\n *\n * @default true\n */\n @Input()\n public dismissible = true;\n\n /**\n * @description Quando `true`, pressionar a tecla Escape fecha o drawer.\n *\n * @default true\n */\n @Input()\n public closeOnEscape = true;\n\n /**\n * @description Texto exibido no cabeçalho padrão do drawer.\n * Pode ser substituído por um template customizado via `sTemplate=\"header\"`.\n */\n @Input()\n public header?: string;\n\n /**\n * @description Nome acessível do drawer, usado quando o cabeçalho é um template\n * customizado via `sTemplate=\"header\"` (nesse caso não há `header` para associar\n * via `aria-labelledby`). Ignorado quando `header` está definido.\n */\n @Input()\n public ariaLabel?: string;\n\n /**\n * @description Quando `true`, aumenta a largura do drawer para acomodar mais conteúdo.\n *\n * @default false\n */\n @Input()\n public largeSized = false;\n\n /**\n * @description Quando `true`, mantém o conteúdo do drawer no DOM mesmo quando oculto,\n * preservando o estado interno dos componentes filhos.\n *\n * @default false\n */\n @Input()\n public cache = false;\n\n /**\n * @description Função de confirmação chamada antes de fechar o drawer.\n * Quando retornar `false`, o fechamento é bloqueado. Útil para validar formulários não salvos.\n */\n @Input()\n public set registerConfirmClose(fn: () => boolean) {\n this._confirmClose = fn;\n }\n\n /** @description Id único usado para associar o título ao painel via `aria-labelledby`. */\n protected readonly titleId = randomHash('drawer-title');\n\n public headerTemplate: TemplateRef<unknown> | null = null;\n public bodyTemplate: TemplateRef<unknown> | null = null;\n public footerTemplate: TemplateRef<unknown> | null = null;\n\n protected readonly footerComponent = contentChild(FooterComponent);\n\n private _confirmClose = () => true;\n\n private _elementToRefocus: HTMLElement | null = null;\n\n private readonly _scrollLock = createScrollLock();\n\n private readonly visibleEffect = effect(() => {\n const visible = this.visible();\n if (visible) {\n this._scrollLock.lock();\n this._elementToRefocus = document.activeElement as HTMLElement | null;\n } else {\n this._scrollLock.unlock();\n this._restoreFocus();\n }\n });\n\n public ngAfterContentInit(): void {\n this._getTemplates();\n }\n\n public ngOnDestroy(): void {\n this.visibleEffect.destroy();\n this._scrollLock.unlock();\n this._restoreFocus();\n }\n\n public closeDrawer(): void {\n if (this._confirmClose()) {\n this.visible.set(false);\n }\n }\n\n public handleEscape(): void {\n if (!this.visible() || !this.closeOnEscape) {\n return;\n }\n\n this.closeDrawer();\n }\n\n private _restoreFocus(): void {\n this._elementToRefocus?.focus();\n this._elementToRefocus = null;\n }\n\n private _getCustomTemplate(type: string): TemplateRef<any> | null {\n return this.templates?.find((template: TemplateDirective) => template.type === type)?.template ?? null;\n }\n\n private getHeaderTemplate(): TemplateRef<unknown> | null {\n return this._getCustomTemplate('header') ?? null;\n }\n\n private getBodyTemplate(): TemplateRef<unknown> | null {\n return this._getCustomTemplate('body') ?? null;\n }\n\n private getFooterTemplate(): TemplateRef<unknown> | null {\n return this._getCustomTemplate('footer') ?? null;\n }\n\n private _getTemplates(): void {\n this.headerTemplate = this.getHeaderTemplate();\n this.bodyTemplate = this.getBodyTemplate();\n this.footerTemplate = this.getFooterTemplate();\n }\n}\n","@if (visible()) {\n <div\n class=\"backdrop\"\n (click)=\"dismissible && closeDrawer()\"\n ></div>\n}\n\n@if (cache || visible()) {\n <div\n [cdkTrapFocus]=\"visible()\"\n [cdkTrapFocusAutoCapture]=\"visible()\"\n [@visibilityChanged]\n class=\"drawer\"\n [class.drawer--open]=\"visible()\"\n [class.drawer--large-size]=\"largeSized\"\n [attr.role]=\"visible() ? 'dialog' : null\"\n [attr.aria-modal]=\"visible() ? true : null\"\n [attr.aria-labelledby]=\"headerTemplate ? null : titleId\"\n [attr.aria-label]=\"headerTemplate ? ariaLabel : null\"\n [attr.inert]=\"visible() ? null : ''\"\n [attr.aria-hidden]=\"visible() ? null : 'true'\"\n >\n <div class=\"drawer__header\">\n @if (headerTemplate) {\n <ng-template *ngTemplateOutlet=\"headerTemplate\"></ng-template>\n } @else {\n <h2\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"drawer__header__title\"\n >\n {{ header }}\n </h2>\n }\n @if (closable) {\n <button\n type=\"button\"\n class=\"drawer__header__close\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n (click)=\"closeDrawer()\"\n >\n <i\n class=\"fas fa-times\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </button>\n }\n </div>\n <div class=\"drawer__body\">\n @if (bodyTemplate) {\n <ng-template [ngTemplateOutlet]=\"bodyTemplate\"></ng-template>\n } @else {\n <ng-content select=\":not(s-footer)\"></ng-content>\n }\n </div>\n @if (footerTemplate || footerComponent()) {\n <div class=\"drawer__footer\">\n @if (footerTemplate) {\n <ng-template [ngTemplateOutlet]=\"footerTemplate\"></ng-template>\n } @else {\n <ng-content select=\"s-footer\"></ng-content>\n }\n </div>\n }\n </div>\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { TemplateModule } from '@seniorsistemas/angular-components/template';\n\nimport { DrawerComponent } from './drawer.component';\n\n@NgModule({\n imports: [DrawerComponent],\n exports: [DrawerComponent, TemplateModule],\n})\nexport class DrawerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|