ngx-kit 8.1.0 → 8.2.0
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/fesm2022/ngx-kit-dialog.mjs +2 -2
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-tooltip.mjs +432 -0
- package/fesm2022/ngx-kit-tooltip.mjs.map +1 -0
- package/package.json +5 -1
- package/styles/all.css +125 -35
- package/styles/tootip.css +120 -0
- package/tooltip/README.md +1 -0
- package/types/ngx-kit-tooltip.d.ts +88 -0
|
@@ -294,14 +294,14 @@ class NgxDialogComponent {
|
|
|
294
294
|
this.dialogRef._setPanelElement(inject((ElementRef)).nativeElement);
|
|
295
295
|
}
|
|
296
296
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
297
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDialogComponent, isStandalone: true, selector: "ngx-dialog-panel", host: { properties: { "class": "sizeClass()" }, classAttribute: "ngx-dialog-panel" }, ngImport: i0, template: "@if (config.header?.enable) {\n <div\n ngxDialogHeader\n [showCloseButton]=\"config.header?.showCloseButton ?? true\"\n [showMaximizeButton]=\"config.header?.showMaximizeButton ?? true\">\n {{ config.header?.title }}\n </div>\n}\n\n<ng-container *ngComponentOutlet=\"content\" />\n\n@if (config.footer?.enable) {\n <div ngxDialogFooter [align]=\"config.footer?.align ?? 'end'\">\n <button type=\"button\" class=\"ngx-dialog-default-close-btn\" (click)=\"dialogRef.close()\">\n {{ config.footer?.closeText ?? 'Close' }}\n </button>\n </div>\n}\n", styles: [":host{--ngx-dialog-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-fg: light-dark(#000000, #f0f0f5);--ngx-dialog-header-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-header-fg: light-dark(#1c1c22, #ffffff);display:flex;flex-direction:column;box-sizing:border-box;width:100%;height:100%;min-width:var(--ngx-dialog-min-width);overflow:hidden;background-color:var(--
|
|
297
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDialogComponent, isStandalone: true, selector: "ngx-dialog-panel", host: { properties: { "class": "sizeClass()" }, classAttribute: "ngx-dialog-panel" }, ngImport: i0, template: "@if (config.header?.enable) {\n <div\n ngxDialogHeader\n [showCloseButton]=\"config.header?.showCloseButton ?? true\"\n [showMaximizeButton]=\"config.header?.showMaximizeButton ?? true\">\n {{ config.header?.title }}\n </div>\n}\n\n<ng-container *ngComponentOutlet=\"content\" />\n\n@if (config.footer?.enable) {\n <div ngxDialogFooter [align]=\"config.footer?.align ?? 'end'\">\n <button type=\"button\" class=\"ngx-dialog-default-close-btn\" (click)=\"dialogRef.close()\">\n {{ config.footer?.closeText ?? 'Close' }}\n </button>\n </div>\n}\n", styles: [":host{--ngx-dialog-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-fg: light-dark(#000000, #f0f0f5);--ngx-dialog-header-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-header-fg: light-dark(#1c1c22, #ffffff);display:flex;flex-direction:column;box-sizing:border-box;width:100%;height:100%;min-width:var(--ngx-dialog-min-width);min-height:inherit;overflow:hidden;background-color:var(--ngx-dialog-bg);color:var(--ngx-dialog-fg);animation:ngxDialogZoomIn .18s cubic-bezier(.25,.8,.25,1);max-height:100dvh}:host(.ngx-dialog-size-sm){--ngx-dialog-min-width: 30dvw}:host(.ngx-dialog-size-md){--ngx-dialog-min-width: 50dvw}:host(.ngx-dialog-size-lg){--ngx-dialog-min-width: 60dvw}:host(.ngx-dialog-size-xl){--ngx-dialog-min-width: 80dvw}:host(.ngx-dialog-size-full){width:100dvw;height:100dvh;max-width:none;border-radius:0}::ng-deep .dialog-header{display:flex;align-items:center;justify-content:space-between;gap:8px;flex:0 0 auto;padding:0 15px;height:50px;box-sizing:border-box;color:var(--ngx-dialog-header-fg);background:var(--ngx-dialog-header-bg);font-size:.95rem;font-weight:600;border-bottom:1px solid rgba(107,107,107,.2)}::ng-deep .dialog-header .dialog-header-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;display:flex;align-items:center}::ng-deep .dialog-header:not(.disable-drag) .dialog-header-title{cursor:move}::ng-deep .dialog-header .ngx-dialog-action-btn{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:inherit;padding:1px;border-radius:6px;width:24px;height:24px;background:light-dark(#efeff1,#2b2b33)}::ng-deep .dialog-header .ngx-dialog-action-btn svg{width:100%}::ng-deep .dialog-header .ngx-dialog-action-btn:hover{background:light-dark(#e2e2e6,#34343d)}::ng-deep .dialog-body{display:block;overflow:auto;padding:20px;box-sizing:border-box}::ng-deep .dialog-footer{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:12px 15px;box-shadow:0 -1px #72727233}::ng-deep .dialog-footer.align-start{justify-content:flex-start}::ng-deep .dialog-footer.align-end{justify-content:flex-end}::ng-deep .dialog-footer.align-center{justify-content:center}::ng-deep .dialog-footer.align-space-between{justify-content:space-between}::ng-deep .dialog-footer.align-space-around{justify-content:space-around}::ng-deep .ngx-dialog-backdrop{background:light-dark(rgba(71,71,71,.5490196078),rgba(39,38,38,.4509803922))!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}::ng-deep .ngx-dialog-fullscreen{width:100dvw!important;height:100dvh!important;max-height:unset!important;max-width:unset!important;transform:none!important;inset:0!important}@keyframes ngxDialogZoomIn{0%{transform:scale(.92);opacity:0}to{transform:scale(1);opacity:1}}@media(prefers-reduced-motion:reduce){:host{animation:none}}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgxDialogHeader, selector: "ngx-dialog-header,[ngxDialogHeader]", inputs: ["showCloseButton", "showMaximizeButton"], exportAs: ["ngxDialogHeader"] }, { kind: "directive", type: NgxDialogFooter, selector: "ngx-dialog-footer,[ngxDialogFooter]", inputs: ["align"], exportAs: ["ngxDialogFooter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
298
298
|
}
|
|
299
299
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogComponent, decorators: [{
|
|
300
300
|
type: Component,
|
|
301
301
|
args: [{ selector: 'ngx-dialog-panel', standalone: true, imports: [NgComponentOutlet, NgxDialogHeader, NgxDialogFooter], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
302
302
|
class: 'ngx-dialog-panel',
|
|
303
303
|
'[class]': 'sizeClass()',
|
|
304
|
-
}, template: "@if (config.header?.enable) {\n <div\n ngxDialogHeader\n [showCloseButton]=\"config.header?.showCloseButton ?? true\"\n [showMaximizeButton]=\"config.header?.showMaximizeButton ?? true\">\n {{ config.header?.title }}\n </div>\n}\n\n<ng-container *ngComponentOutlet=\"content\" />\n\n@if (config.footer?.enable) {\n <div ngxDialogFooter [align]=\"config.footer?.align ?? 'end'\">\n <button type=\"button\" class=\"ngx-dialog-default-close-btn\" (click)=\"dialogRef.close()\">\n {{ config.footer?.closeText ?? 'Close' }}\n </button>\n </div>\n}\n", styles: [":host{--ngx-dialog-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-fg: light-dark(#000000, #f0f0f5);--ngx-dialog-header-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-header-fg: light-dark(#1c1c22, #ffffff);display:flex;flex-direction:column;box-sizing:border-box;width:100%;height:100%;min-width:var(--ngx-dialog-min-width);overflow:hidden;background-color:var(--
|
|
304
|
+
}, template: "@if (config.header?.enable) {\n <div\n ngxDialogHeader\n [showCloseButton]=\"config.header?.showCloseButton ?? true\"\n [showMaximizeButton]=\"config.header?.showMaximizeButton ?? true\">\n {{ config.header?.title }}\n </div>\n}\n\n<ng-container *ngComponentOutlet=\"content\" />\n\n@if (config.footer?.enable) {\n <div ngxDialogFooter [align]=\"config.footer?.align ?? 'end'\">\n <button type=\"button\" class=\"ngx-dialog-default-close-btn\" (click)=\"dialogRef.close()\">\n {{ config.footer?.closeText ?? 'Close' }}\n </button>\n </div>\n}\n", styles: [":host{--ngx-dialog-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-fg: light-dark(#000000, #f0f0f5);--ngx-dialog-header-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-header-fg: light-dark(#1c1c22, #ffffff);display:flex;flex-direction:column;box-sizing:border-box;width:100%;height:100%;min-width:var(--ngx-dialog-min-width);min-height:inherit;overflow:hidden;background-color:var(--ngx-dialog-bg);color:var(--ngx-dialog-fg);animation:ngxDialogZoomIn .18s cubic-bezier(.25,.8,.25,1);max-height:100dvh}:host(.ngx-dialog-size-sm){--ngx-dialog-min-width: 30dvw}:host(.ngx-dialog-size-md){--ngx-dialog-min-width: 50dvw}:host(.ngx-dialog-size-lg){--ngx-dialog-min-width: 60dvw}:host(.ngx-dialog-size-xl){--ngx-dialog-min-width: 80dvw}:host(.ngx-dialog-size-full){width:100dvw;height:100dvh;max-width:none;border-radius:0}::ng-deep .dialog-header{display:flex;align-items:center;justify-content:space-between;gap:8px;flex:0 0 auto;padding:0 15px;height:50px;box-sizing:border-box;color:var(--ngx-dialog-header-fg);background:var(--ngx-dialog-header-bg);font-size:.95rem;font-weight:600;border-bottom:1px solid rgba(107,107,107,.2)}::ng-deep .dialog-header .dialog-header-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;display:flex;align-items:center}::ng-deep .dialog-header:not(.disable-drag) .dialog-header-title{cursor:move}::ng-deep .dialog-header .ngx-dialog-action-btn{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:inherit;padding:1px;border-radius:6px;width:24px;height:24px;background:light-dark(#efeff1,#2b2b33)}::ng-deep .dialog-header .ngx-dialog-action-btn svg{width:100%}::ng-deep .dialog-header .ngx-dialog-action-btn:hover{background:light-dark(#e2e2e6,#34343d)}::ng-deep .dialog-body{display:block;overflow:auto;padding:20px;box-sizing:border-box}::ng-deep .dialog-footer{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:12px 15px;box-shadow:0 -1px #72727233}::ng-deep .dialog-footer.align-start{justify-content:flex-start}::ng-deep .dialog-footer.align-end{justify-content:flex-end}::ng-deep .dialog-footer.align-center{justify-content:center}::ng-deep .dialog-footer.align-space-between{justify-content:space-between}::ng-deep .dialog-footer.align-space-around{justify-content:space-around}::ng-deep .ngx-dialog-backdrop{background:light-dark(rgba(71,71,71,.5490196078),rgba(39,38,38,.4509803922))!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}::ng-deep .ngx-dialog-fullscreen{width:100dvw!important;height:100dvh!important;max-height:unset!important;max-width:unset!important;transform:none!important;inset:0!important}@keyframes ngxDialogZoomIn{0%{transform:scale(.92);opacity:0}to{transform:scale(1);opacity:1}}@media(prefers-reduced-motion:reduce){:host{animation:none}}\n"] }]
|
|
305
305
|
}], ctorParameters: () => [] });
|
|
306
306
|
|
|
307
307
|
class NgxDialogService {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-kit-dialog.mjs","sources":["../../../projects/libs/dialog/configs/dialog-ref.ts","../../../projects/libs/dialog/configs/dialog-config.ts","../../../projects/libs/dialog/tokens/dialog.tokens.ts","../../../projects/libs/dialog/directives/footer.directive.ts","../../../projects/libs/dialog/directives/header.directive.ts","../../../projects/libs/dialog/components/ngx-dialog.component.ts","../../../projects/libs/dialog/components/ngx-dialog.component.html","../../../projects/libs/dialog/services/ngx-dialog.service.ts","../../../projects/libs/dialog/dialog.facade.ts","../../../projects/libs/dialog/ngx-dialog.provider.ts","../../../projects/libs/dialog/directives/body.directive.ts","../../../projects/libs/dialog/ngx-dialog.module.ts","../../../projects/libs/dialog/ngx-kit-dialog.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { OverlayRef } from 'ngx-kit/core';\n\nlet uniqueId = 0;\nfunction nextDialogId(): string {\n uniqueId += 1;\n return `ngx-dialog-${Date.now().toString(36)}-${uniqueId}`;\n}\n\nexport class NgxDialogRef<R = any> {\n readonly id = nextDialogId();\n\n /** true from the moment `close()` is called, even before teardown finishes. */\n readonly closing = signal(false);\n /** true once the dialog has been fully removed from the DOM. */\n readonly closed = signal(false);\n\n private readonly _afterClosed = new Subject<R | undefined>();\n /** Emits the result exactly once, after the dialog has been fully torn down. */\n readonly afterClosed: Observable<R | undefined> = this._afterClosed.asObservable();\n\n /** @internal set by the layout directives; read by NgxDialogBody to size itself. */\n readonly headerEl = signal<HTMLElement | null>(null);\n /** @internal */\n readonly footerEl = signal<HTMLElement | null>(null);\n /** @internal */\n readonly bodyEl = signal<HTMLElement | null>(null);\n /** @internal the dialog panel's own host element. */\n readonly panelEl = signal<HTMLElement | null>(null);\n\n /** Optional synchronous guard - return `false` to prevent Escape/outside-click from closing. */\n beforeClose?: () => boolean;\n\n private overlayRef?: OverlayRef<unknown>;\n private result: R | undefined;\n\n /** @internal used by NgxDialogService right after creating the overlay. */\n _attachOverlayRef(ref: OverlayRef<unknown>): void {\n this.overlayRef = ref;\n }\n\n /** @internal used by the header/footer/body directives and the panel component. */\n _setHeaderElement(el: HTMLElement | null): void {\n this.headerEl.set(el);\n }\n /** @internal */\n _setFooterElement(el: HTMLElement | null): void {\n this.footerEl.set(el);\n }\n /** @internal */\n _setBodyElement(el: HTMLElement | null): void {\n this.bodyEl.set(el);\n }\n /** @internal */\n _setPanelElement(el: HTMLElement | null): void {\n this.panelEl.set(el);\n }\n\n /** Closes the dialog and emits `result` on `afterClosed` once torn down. Idempotent. */\n close(result?: R): void {\n if (this.closing() || this.closed()) {\n return;\n }\n this.closing.set(true);\n this.result = result;\n this.overlayRef?.close();\n }\n\n /** @internal called by NgxDialogService's `onClosed` callback once the overlay is fully torn down. */\n _finalizeClose(): void {\n if (this.closed()) {\n return;\n }\n this.closed.set(true);\n this._afterClosed.next(this.result);\n this._afterClosed.complete();\n }\n}\n","import { Injector } from '@angular/core';\nimport { NgxDialogFooterAlign } from '../directives/footer.directive';\n\nexport type NgxDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nexport interface NgxDialogHeaderConfig {\n enable?: boolean;\n title?: string;\n showCloseButton?: boolean;\n showMaximizeButton?: boolean;\n}\n\nexport interface NgxDialogFooterConfig {\n enable?: boolean;\n /** Text for the auto-generated close button. Default: 'Close'. */\n closeText?: string;\n align?: NgxDialogFooterAlign;\n}\n\n/**\n * BREAKING CHANGE from the previous version of this config:\n * - `allowCloseOnOutsideClick` -> `closeOnOutsideClick` (naming now matches\n * `ngx-kit/overlay`'s options, which this service is built directly on).\n * - `header`/`footer` are now actually wired up (previously declared but\n * unused) - set `enable: true` to get an automatic header/footer without\n * having to place the `ngxDialogHeader`/`ngxDialogFooter` directives\n * yourself inside the content component.\n */\nexport class NgxDialogConfig<DataType = any> {\n /** Data made available to the content component (and to `ngx-dialog-panel`\n * itself) via the `DIALOG_DATA` injection token. */\n data?: DataType = {} as DataType;\n\n /** Named size preset - sets sensible min/max width bounds. Combine with\n * `width`/`maxWidth`/... for full manual control. */\n size?: NgxDialogSize = 'lg';\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n height?: string;\n minHeight?: string;\n maxHeight?: string;\n\n /** Extra class(es) on the dialog panel (the `ngx-dialog-panel` host). */\n panelClass?: string | string[] = 'ngx-kit';\n /** Extra class(es) on the backdrop element behind the panel. */\n backdropClass?: string | string[] = 'ngx-dialog-backdrop';\n\n header?: NgxDialogHeaderConfig = {\n enable: false,\n showCloseButton: true,\n showMaximizeButton: true,\n };\n footer?: NgxDialogFooterConfig = { enable: false, align: 'end' };\n\n /** Close when clicking outside the panel.\n * - Default: `true`\n * */\n closeOnOutsideClick?: boolean = true;\n /** Close on Escape.\n * - Default: `true`\n * */\n closeOnEscape?: boolean = true;\n /** Shorthand for `closeOnOutsideClick: false, closeOnEscape: false` - the\n * dialog can then only be closed programmatically (e.g. via its own\n * buttons calling `dialogRef.close()`). */\n disableClose?: boolean = false;\n /** Synchronous guard consulted before Escape/outside-click would close the\n * dialog - return `false` to block it (e.g. unsaved changes). Does not\n * affect a programmatic `dialogRef.close()` call. */\n beforeClose?: () => boolean;\n\n /** Prevent the page behind the dialog from scrolling while it's open. Default: true. */\n lockBodyScroll?: boolean = true;\n /** Move focus into the dialog on open. Default: true. */\n autoFocus?: boolean = true;\n /** Restore focus to the previously focused element on close. Default: true. */\n restoreFocus?: boolean = true;\n /** Render via the native Popover API when supported. Default: true. */\n usePopover?: boolean = true;\n\n role?: 'dialog' | 'alertdialog' = 'dialog';\n ariaLabel?: string;\n ariaLabelledby?: string;\n ariaDescribedby?: string;\n\n /** Entry animation for the panel. Default: 'zoom'. */\n animation?: 'zoom' | 'fade' | 'slide-up' | 'none' = 'zoom';\n\n /** Parent injector for the content component (and `ngx-dialog-panel`\n * itself). Defaults to the root injector. */\n injector?: Injector;\n\n constructor(init?: Partial<NgxDialogConfig<DataType>>) {\n Object.assign(this, init);\n }\n}\n","import { InjectionToken, Type } from '@angular/core';\nimport { NgxDialogConfig } from '../configs/dialog-config';\nimport { NgxDialogRef } from '../configs/dialog-ref';\n\nexport const DIALOG_DATA = new InjectionToken<any>('NGX_DIALOG_DATA');\nexport const DIALOG_REF = new InjectionToken<NgxDialogRef<any>>('NGX_DIALOG_REF');\n/** The resolved config for the dialog currently being rendered. */\n\nexport const NGX_DIALOG_CONFIG = new InjectionToken<NgxDialogConfig<any>>('NGX_DIALOG_CONFIG', {\n factory: () => new NgxDialogConfig(),\n});\n/** The arbitrary content component passed to `open()`, projected via `*ngComponentOutlet`. */\nexport const DIALOG_CONTENT = new InjectionToken<Type<any>>('NGX_DIALOG_CONTENT');\n","import { Directive, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport { DIALOG_REF } from '../tokens/dialog.tokens';\n\nexport type NgxDialogFooterAlign = 'start' | 'end' | 'center' | 'space-between' | 'space-around';\n\n@Directive({\n selector: 'ngx-dialog-footer,[ngxDialogFooter]',\n standalone: true,\n host: {\n class: 'dialog-footer',\n '[class.align-start]': 'align() === \"start\"',\n '[class.align-end]': 'align() === \"end\"',\n '[class.align-space-between]': 'align() === \"space-between\"',\n '[class.align-center]': 'align() === \"center\"',\n '[class.align-space-around]': 'align() === \"space-around\"',\n },\n exportAs: 'ngxDialogFooter',\n})\nexport class NgxDialogFooter implements OnInit, OnDestroy {\n readonly align = input<NgxDialogFooterAlign>('end');\n\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly dialogRef = inject(DIALOG_REF);\n\n ngOnInit(): void {\n this.dialogRef._setFooterElement(this.el.nativeElement);\n }\n\n ngOnDestroy(): void {\n this.dialogRef._setFooterElement(null);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, inject, input, OnInit } from '@angular/core';\nimport { DIALOG_REF, NGX_DIALOG_CONFIG } from '../tokens/dialog.tokens';\nimport { NgxDraggable } from 'ngx-kit/drag-resize';\nimport { DIALOG_OVERLAY_CLASSNAME } from 'ngx-kit/core';\n\nconst CLOSE_ICON_SVG = `<svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 320 512\" aria-hidden=\"true\">\n <path d=\"M312.1 375c9.369 9.369 9.369 24.57 0 33.94s-24.57 9.369-33.94 0L160 289.9l-119 119c-9.369 9.369-24.57 9.369-33.94 0s-9.369-24.57 0-33.94L126.1 256L7.027 136.1c-9.369-9.369-9.369-24.57 0-33.94s24.57-9.369 33.94 0L160 222.1l119-119c9.369-9.369 24.57-9.369 33.94 0s9.369 24.57 0 33.94L193.9 256L312.1 375z\"/>\n </svg>`;\nconst MAXIMIZE_ICON_SVG = `<svg name=\"maximize\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M7.4852 16.5149C6.9104 15.9401 7.00595 13.4982 7.00595 13.4982M7.4852 16.5149C8.06001 17.0897 10.5019 16.994 10.5019 16.994M7.4852 16.5149L11 13M16.5149 7.48512C15.9401 6.91031 13.4982 7.00596 13.4982 7.00596M16.5149 7.48512C17.0897 8.05993 16.994 10.5018 16.994 10.5018M16.5149 7.48512L13 11\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n<path d=\"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\" stroke-width=\"1.5\"/>\n</svg>`;\nconst RESTORE_ICON_SVG = `<svg name=\"restore\" stroke=\"currentColor\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\" stroke-width=\"1.5\"/>\n<path d=\"M12.9833 11.0167C12.4085 10.4419 12.5041 8 12.5041 8M12.9833 11.0167C13.5581 11.5915 16 11.4958 16 11.4958M12.9833 11.0167L17 7M11.0131 12.9868C10.4383 12.412 7.99641 12.5077 7.99641 12.5077M11.0131 12.9868C11.5879 13.5616 11.4922 16.0035 11.4922 16.0035M11.0131 12.9868L7 16.9999\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>`;\n\n@Directive({\n selector: 'ngx-dialog-header,[ngxDialogHeader]',\n standalone: true,\n hostDirectives: [NgxDraggable],\n host: { class: 'dialog-header' },\n exportAs: 'ngxDialogHeader',\n})\nexport class NgxDialogHeader implements OnInit {\n private config = inject(NGX_DIALOG_CONFIG);\n readonly showCloseButton = input(this.config.header?.showCloseButton ?? true);\n readonly showMaximizeButton = input(this.config.header?.showMaximizeButton ?? true);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly document = inject(DOCUMENT);\n private readonly dialogRef = inject(DIALOG_REF);\n\n private readonly drag = inject(NgxDraggable);\n\n private isMaximized = false;\n\n ngOnInit(): void {\n this.drag.dragRootElement.set('.ngx-ui-overlay');\n this.drag.dragHandle.set('.dialog-header-title');\n // Wrap the existing (Angular-rendered) header content in a title span by\n // MOVING the actual DOM nodes, not by re-serializing/re-parsing\n // `innerHTML`. The original implementation did\n // `el.innerHTML = '<span>' + el.innerHTML + '</span>'`, which silently\n // destroys any event listeners or component state living inside the\n // header content (anything beyond static text) because the browser\n // throws away and re-parses the whole subtree.\n const titleWrapper = this.document.createElement('span');\n titleWrapper.className = 'dialog-header-title';\n while (this.el.nativeElement.firstChild) {\n titleWrapper.appendChild(this.el.nativeElement.firstChild);\n }\n this.el.nativeElement.appendChild(titleWrapper);\n if (this.showMaximizeButton()) {\n const fullScreenBtn = this.document.createElement('button');\n fullScreenBtn.type = 'button';\n fullScreenBtn.className = 'ngx-dialog-action-btn';\n fullScreenBtn.setAttribute('aria-label', 'Maximaize');\n fullScreenBtn.setAttribute('title', 'Maximaize');\n fullScreenBtn.innerHTML = MAXIMIZE_ICON_SVG;\n fullScreenBtn.addEventListener('click', (ev: Event) => this.fullScreen(ev));\n this.el.nativeElement.appendChild(fullScreenBtn);\n }\n if (this.showCloseButton()) {\n const closeBtn = this.document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'ngx-dialog-action-btn close-btn';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.setAttribute('title', 'Close');\n closeBtn.innerHTML = CLOSE_ICON_SVG;\n closeBtn.addEventListener('click', () => this.dialogRef.close());\n this.el.nativeElement.appendChild(closeBtn);\n }\n\n this.dialogRef._setHeaderElement(this.el.nativeElement);\n }\n\n private fullScreen(ev: Event) {\n const overlay = this.el.nativeElement.closest(`.${DIALOG_OVERLAY_CLASSNAME}`);\n this.isMaximized = !this.isMaximized;\n this.drag.disabled.set(this.isMaximized);\n if (overlay) {\n overlay.classList.toggle('ngx-dialog-fullscreen');\n const btn = ev.currentTarget as HTMLButtonElement;\n btn.innerHTML = this.isMaximized ? RESTORE_ICON_SVG : MAXIMIZE_ICON_SVG;\n btn.setAttribute('aria-label', this.isMaximized ? 'Restore' : 'Maximaize');\n btn.setAttribute('title', this.isMaximized ? 'Restore' : 'Maximaize');\n }\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, computed, inject } from '@angular/core';\nimport { NGX_DIALOG_CONFIG, DIALOG_CONTENT, DIALOG_REF } from '../tokens/dialog.tokens';\nimport { NgxDialogFooter } from '../directives/footer.directive';\nimport { NgxDialogHeader } from '../directives/header.directive';\n\n/**\n * The dialog \"panel\" shell. It no longer owns the backdrop, centering,\n * focus trap, Escape handling or outside-click handling - all of that now\n * lives in `OverlayService`, which this component is rendered inside of.\n * This is intentionally a thin, fully signal-driven shell: no\n * `AfterViewInit`, no manual `ChangeDetectorRef.detectChanges()`, no\n * imperative style writes. Angular schedules change detection automatically\n * whenever a signal read from the template changes, including in zoneless\n * apps.\n */\n@Component({\n selector: 'ngx-dialog-panel',\n standalone: true,\n imports: [NgComponentOutlet, NgxDialogHeader, NgxDialogFooter],\n templateUrl: './ngx-dialog.component.html',\n styleUrl: './ngx-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-dialog-panel',\n '[class]': 'sizeClass()',\n },\n})\nexport class NgxDialogComponent {\n protected readonly dialogRef = inject(DIALOG_REF);\n protected readonly config = inject(NGX_DIALOG_CONFIG);\n protected readonly content = inject(DIALOG_CONTENT);\n\n protected readonly sizeClass = computed(() =>\n this.config.size ? `ngx-dialog-size-${this.config.size}` : '',\n );\n\n constructor() {\n this.dialogRef._setPanelElement(inject(ElementRef<HTMLElement>).nativeElement);\n }\n}\n","@if (config.header?.enable) {\n <div\n ngxDialogHeader\n [showCloseButton]=\"config.header?.showCloseButton ?? true\"\n [showMaximizeButton]=\"config.header?.showMaximizeButton ?? true\">\n {{ config.header?.title }}\n </div>\n}\n\n<ng-container *ngComponentOutlet=\"content\" />\n\n@if (config.footer?.enable) {\n <div ngxDialogFooter [align]=\"config.footer?.align ?? 'end'\">\n <button type=\"button\" class=\"ngx-dialog-default-close-btn\" (click)=\"dialogRef.close()\">\n {{ config.footer?.closeText ?? 'Close' }}\n </button>\n </div>\n}\n","import { Injectable, Injector, Type, computed, inject, signal } from '@angular/core';\nimport { OverlayService, OverlayOptions } from 'ngx-kit/core';\nimport { NgxDialogRef } from '../configs/dialog-ref';\nimport { NgxDialogConfig } from '../configs/dialog-config';\nimport {\n NGX_DIALOG_CONFIG,\n DIALOG_CONTENT,\n DIALOG_DATA,\n DIALOG_REF,\n} from '../tokens/dialog.tokens';\nimport { NgxDialogComponent } from '../components/ngx-dialog.component';\n\n@Injectable({ providedIn: 'root' })\nexport class NgxDialogService {\n private readonly overlay = inject(OverlayService);\n private readonly injector = inject(Injector);\n\n private readonly _openRefs = signal<NgxDialogRef<any>[]>([]);\n /** Every currently open dialog, oldest first. */\n readonly openDialogs = this._openRefs.asReadonly();\n /** How many dialogs are currently open. */\n readonly openCount = computed(() => this._openRefs().length);\n readonly defaultConfig = inject(NGX_DIALOG_CONFIG);\n /**\n * Opens `content` inside a dialog panel and returns a ref you can use to\n * close it and read the result back (`afterClosed`).\n */\n open<R = any, DataType = any>(\n content: Type<any>,\n config?: Partial<NgxDialogConfig<DataType>>,\n ): NgxDialogRef<R> {\n const resolvedConfig = { ...this.defaultConfig, ...config };\n const dialogRef = new NgxDialogRef<R>();\n dialogRef.beforeClose = resolvedConfig.beforeClose;\n\n const componentInjector = Injector.create({\n providers: [\n { provide: DIALOG_DATA, useValue: resolvedConfig.data },\n { provide: DIALOG_REF, useValue: dialogRef },\n { provide: NGX_DIALOG_CONFIG, useValue: resolvedConfig },\n { provide: DIALOG_CONTENT, useValue: content },\n ],\n parent: resolvedConfig.injector ?? this.injector,\n });\n\n const disableClose = resolvedConfig.disableClose ?? false;\n\n const overlayRef = this.overlay.open<NgxDialogComponent>({\n component: NgxDialogComponent,\n injector: componentInjector,\n placement: 'center',\n alignment: 'center',\n margin: 0,\n role: resolvedConfig.role ?? 'dialog',\n ariaModal: true,\n ariaLabel: resolvedConfig.ariaLabel,\n ariaLabelledby: resolvedConfig.ariaLabelledby,\n ariaDescribedby: resolvedConfig.ariaDescribedby,\n usePopover: resolvedConfig.usePopover ?? true,\n closeOnEscape: disableClose ? false : (resolvedConfig.closeOnEscape ?? true),\n closeOnOutsideClick: disableClose ? false : (resolvedConfig.closeOnOutsideClick ?? false),\n canClose: () => dialogRef.beforeClose?.() ?? true,\n restoreFocus: resolvedConfig.restoreFocus ?? true,\n autoFocus: resolvedConfig.autoFocus ?? true,\n lockBodyScroll: resolvedConfig.lockBodyScroll ?? true,\n backdropClass: resolvedConfig.backdropClass,\n panelClass: resolvedConfig.panelClass,\n configure: (_instance, ref) => this.applySizing(ref.nativeElement, resolvedConfig),\n onClosed: () => {\n this._openRefs.update((refs) => refs.filter((r) => r !== dialogRef));\n dialogRef._finalizeClose();\n },\n } satisfies OverlayOptions<NgxDialogComponent>);\n\n dialogRef._attachOverlayRef(overlayRef);\n this._openRefs.update((refs) => [...refs, dialogRef]);\n return dialogRef;\n }\n\n /** Closes every currently open dialog (ignores `disableClose`/guards - use sparingly, e.g. on logout). */\n closeAll(): void {\n [...this._openRefs()].forEach((ref) => ref.close());\n }\n\n private applySizing(el: HTMLElement | null, config: NgxDialogConfig): void {\n if (!el) return;\n if (config.width) el.style.width = config.width;\n if (config.minWidth) el.style.minWidth = config.minWidth;\n if (config.maxWidth) el.style.maxWidth = config.maxWidth;\n if (config.height) el.style.height = config.height;\n if (config.minHeight) el.style.minHeight = config.minHeight;\n if (config.maxHeight) el.style.maxHeight = config.maxHeight;\n }\n}\n","import { Type } from '@angular/core';\nimport { NgxDialogConfig } from './configs/dialog-config';\nimport { NgxDialogRef } from './configs/dialog-ref';\nimport { NgxDialogService } from './services/ngx-dialog.service';\n\nconst NOT_INITIALIZED_MESSAGE =\n '[ngx-kit/dialog] Dialog.* was called before provideNgxDialog() ran. ' +\n 'Add provideNgxDialog() to your app providers, or inject NgxDialogService directly instead of using the static Dialog API.';\n\n/**\n * Static convenience API over `NgxDialogService`, so you can call\n * `Dialog.open(...)` from anywhere without injecting the service manually.\n *\n * SSR note: the instance backing this static class is process-wide, not\n * per-request, so it is deliberately left unset on the server (see\n * `provideNgxDialog()`). Inject `NgxDialogService` directly in SSR code paths.\n */\nexport class Dialog {\n private static serviceInstance: NgxDialogService | null = null;\n\n /** @internal set by `provideNgxDialog()`'s environment initializer. */\n static _setService(svc: NgxDialogService): void {\n this.serviceInstance = svc;\n }\n\n private static get service(): NgxDialogService {\n if (!this.serviceInstance) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n return this.serviceInstance;\n }\n\n static open<R = any, DataType = any>(\n component: Type<any>,\n config?: Partial<NgxDialogConfig<DataType>>,\n ): NgxDialogRef<R> {\n return this.service.open<R, DataType>(component, config);\n }\n\n static closeAll(): void {\n this.service.closeAll();\n }\n}\n","import {\n EnvironmentProviders,\n PLATFORM_ID,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { NgxDialogService } from './services/ngx-dialog.service';\nimport { Dialog } from './dialog.facade';\nimport { NgxDialogConfig } from './configs/dialog-config';\nimport { NGX_DIALOG_CONFIG } from './tokens/dialog.tokens';\n\nexport function provideNgxDialog(config?: NgxDialogConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_DIALOG_CONFIG,\n useValue: { ...new NgxDialogConfig(), ...(config || {}) },\n },\n NgxDialogService,\n provideEnvironmentInitializer(() => {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n return;\n }\n\n Dialog._setService(inject(NgxDialogService));\n }),\n ]);\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n HostListener,\n Renderer2,\n effect,\n inject,\n} from '@angular/core';\nimport { DIALOG_REF } from '../tokens/dialog.tokens';\n\n/**\n * Why this can't be pure CSS flexbox: the header/body/footer elements are\n * *grandchildren* of the dialog panel (panel -> `*ngComponentOutlet`'s host\n * element -> header/body/footer), not direct children, because the content\n * component that hosts them is arbitrary and we don't control its own host\n * styling. `display:flex;flex-direction:column` on the panel therefore can't\n * size the body against the header/footer through that extra layer, so we\n * measure and set an explicit `max-height` instead, driven by a\n * `ResizeObserver` on the panel (not a `window:resize` listener, so it also\n * reacts to the dialog itself changing size, e.g. via `config.size`).\n */\n@Directive({\n selector: 'ngx-dialog-body,[ngxDialogBody]',\n standalone: true,\n host: { class: 'dialog-body' },\n exportAs: 'ngxDialogBody',\n})\nexport class NgxDialogBody {\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly dialogRef = inject(DIALOG_REF);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n this.dialogRef._setBodyElement(this.el.nativeElement);\n this.destroyRef.onDestroy(() => this.dialogRef._setBodyElement(null));\n effect((onCleanup) => {\n const panel = this.dialogRef.panelEl();\n if (!panel || typeof ResizeObserver === 'undefined') {\n return;\n }\n const recompute = (): void => this.recomputeHeight(panel);\n\n const observer = new ResizeObserver(recompute);\n observer.observe(panel);\n recompute();\n onCleanup(() => observer.disconnect());\n });\n }\n\n private recomputeHeight(panel: HTMLElement): void {\n const headerHeight = this.dialogRef.headerEl()?.offsetHeight ?? 0;\n const footerHeight = this.dialogRef.footerEl()?.offsetHeight ?? 0;\n const panelHeight = Math.min(panel.clientHeight, window.innerHeight);\n const available = panelHeight - headerHeight - footerHeight;\n console.log('available', available);\n if (available > 0) {\n this.renderer.setStyle(this.el.nativeElement, 'height', `${available}px`);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgxDialogBody } from './directives/body.directive';\nimport { NgxDialogFooter } from './directives/footer.directive';\nimport { NgxDialogHeader } from './directives/header.directive';\nimport { NgxDialogComponent } from './components/ngx-dialog.component';\n\n@NgModule({\n declarations: [],\n imports: [NgxDialogComponent, NgxDialogHeader, NgxDialogFooter, NgxDialogBody],\n exports: [NgxDialogComponent, NgxDialogHeader, NgxDialogFooter, NgxDialogBody],\n})\nexport class NgxDialogModule {}\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":"ngx-kit-dialog.mjs","sources":["../../../projects/libs/dialog/configs/dialog-ref.ts","../../../projects/libs/dialog/configs/dialog-config.ts","../../../projects/libs/dialog/tokens/dialog.tokens.ts","../../../projects/libs/dialog/directives/footer.directive.ts","../../../projects/libs/dialog/directives/header.directive.ts","../../../projects/libs/dialog/components/ngx-dialog.component.ts","../../../projects/libs/dialog/components/ngx-dialog.component.html","../../../projects/libs/dialog/services/ngx-dialog.service.ts","../../../projects/libs/dialog/dialog.facade.ts","../../../projects/libs/dialog/ngx-dialog.provider.ts","../../../projects/libs/dialog/directives/body.directive.ts","../../../projects/libs/dialog/ngx-dialog.module.ts","../../../projects/libs/dialog/ngx-kit-dialog.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { OverlayRef } from 'ngx-kit/core';\n\nlet uniqueId = 0;\nfunction nextDialogId(): string {\n uniqueId += 1;\n return `ngx-dialog-${Date.now().toString(36)}-${uniqueId}`;\n}\n\nexport class NgxDialogRef<R = any> {\n readonly id = nextDialogId();\n\n /** true from the moment `close()` is called, even before teardown finishes. */\n readonly closing = signal(false);\n /** true once the dialog has been fully removed from the DOM. */\n readonly closed = signal(false);\n\n private readonly _afterClosed = new Subject<R | undefined>();\n /** Emits the result exactly once, after the dialog has been fully torn down. */\n readonly afterClosed: Observable<R | undefined> = this._afterClosed.asObservable();\n\n /** @internal set by the layout directives; read by NgxDialogBody to size itself. */\n readonly headerEl = signal<HTMLElement | null>(null);\n /** @internal */\n readonly footerEl = signal<HTMLElement | null>(null);\n /** @internal */\n readonly bodyEl = signal<HTMLElement | null>(null);\n /** @internal the dialog panel's own host element. */\n readonly panelEl = signal<HTMLElement | null>(null);\n\n /** Optional synchronous guard - return `false` to prevent Escape/outside-click from closing. */\n beforeClose?: () => boolean;\n\n private overlayRef?: OverlayRef<unknown>;\n private result: R | undefined;\n\n /** @internal used by NgxDialogService right after creating the overlay. */\n _attachOverlayRef(ref: OverlayRef<unknown>): void {\n this.overlayRef = ref;\n }\n\n /** @internal used by the header/footer/body directives and the panel component. */\n _setHeaderElement(el: HTMLElement | null): void {\n this.headerEl.set(el);\n }\n /** @internal */\n _setFooterElement(el: HTMLElement | null): void {\n this.footerEl.set(el);\n }\n /** @internal */\n _setBodyElement(el: HTMLElement | null): void {\n this.bodyEl.set(el);\n }\n /** @internal */\n _setPanelElement(el: HTMLElement | null): void {\n this.panelEl.set(el);\n }\n\n /** Closes the dialog and emits `result` on `afterClosed` once torn down. Idempotent. */\n close(result?: R): void {\n if (this.closing() || this.closed()) {\n return;\n }\n this.closing.set(true);\n this.result = result;\n this.overlayRef?.close();\n }\n\n /** @internal called by NgxDialogService's `onClosed` callback once the overlay is fully torn down. */\n _finalizeClose(): void {\n if (this.closed()) {\n return;\n }\n this.closed.set(true);\n this._afterClosed.next(this.result);\n this._afterClosed.complete();\n }\n}\n","import { Injector } from '@angular/core';\nimport { NgxDialogFooterAlign } from '../directives/footer.directive';\n\nexport type NgxDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nexport interface NgxDialogHeaderConfig {\n enable?: boolean;\n title?: string;\n showCloseButton?: boolean;\n showMaximizeButton?: boolean;\n}\n\nexport interface NgxDialogFooterConfig {\n enable?: boolean;\n /** Text for the auto-generated close button. Default: 'Close'. */\n closeText?: string;\n align?: NgxDialogFooterAlign;\n}\n\n/**\n * BREAKING CHANGE from the previous version of this config:\n * - `allowCloseOnOutsideClick` -> `closeOnOutsideClick` (naming now matches\n * `ngx-kit/overlay`'s options, which this service is built directly on).\n * - `header`/`footer` are now actually wired up (previously declared but\n * unused) - set `enable: true` to get an automatic header/footer without\n * having to place the `ngxDialogHeader`/`ngxDialogFooter` directives\n * yourself inside the content component.\n */\nexport class NgxDialogConfig<DataType = any> {\n /** Data made available to the content component (and to `ngx-dialog-panel`\n * itself) via the `DIALOG_DATA` injection token. */\n data?: DataType = {} as DataType;\n\n /** Named size preset - sets sensible min/max width bounds. Combine with\n * `width`/`maxWidth`/... for full manual control. */\n size?: NgxDialogSize = 'lg';\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n height?: string;\n minHeight?: string;\n maxHeight?: string;\n\n /** Extra class(es) on the dialog panel (the `ngx-dialog-panel` host). */\n panelClass?: string | string[] = 'ngx-kit';\n /** Extra class(es) on the backdrop element behind the panel. */\n backdropClass?: string | string[] = 'ngx-dialog-backdrop';\n\n header?: NgxDialogHeaderConfig = {\n enable: false,\n showCloseButton: true,\n showMaximizeButton: true,\n };\n footer?: NgxDialogFooterConfig = { enable: false, align: 'end' };\n\n /** Close when clicking outside the panel.\n * - Default: `true`\n * */\n closeOnOutsideClick?: boolean = true;\n /** Close on Escape.\n * - Default: `true`\n * */\n closeOnEscape?: boolean = true;\n /** Shorthand for `closeOnOutsideClick: false, closeOnEscape: false` - the\n * dialog can then only be closed programmatically (e.g. via its own\n * buttons calling `dialogRef.close()`). */\n disableClose?: boolean = false;\n /** Synchronous guard consulted before Escape/outside-click would close the\n * dialog - return `false` to block it (e.g. unsaved changes). Does not\n * affect a programmatic `dialogRef.close()` call. */\n beforeClose?: () => boolean;\n\n /** Prevent the page behind the dialog from scrolling while it's open. Default: true. */\n lockBodyScroll?: boolean = true;\n /** Move focus into the dialog on open. Default: true. */\n autoFocus?: boolean = true;\n /** Restore focus to the previously focused element on close. Default: true. */\n restoreFocus?: boolean = true;\n /** Render via the native Popover API when supported. Default: true. */\n usePopover?: boolean = true;\n\n role?: 'dialog' | 'alertdialog' = 'dialog';\n ariaLabel?: string;\n ariaLabelledby?: string;\n ariaDescribedby?: string;\n\n /** Entry animation for the panel. Default: 'zoom'. */\n animation?: 'zoom' | 'fade' | 'slide-up' | 'none' = 'zoom';\n\n /** Parent injector for the content component (and `ngx-dialog-panel`\n * itself). Defaults to the root injector. */\n injector?: Injector;\n\n constructor(init?: Partial<NgxDialogConfig<DataType>>) {\n Object.assign(this, init);\n }\n}\n","import { InjectionToken, Type } from '@angular/core';\nimport { NgxDialogConfig } from '../configs/dialog-config';\nimport { NgxDialogRef } from '../configs/dialog-ref';\n\nexport const DIALOG_DATA = new InjectionToken<any>('NGX_DIALOG_DATA');\nexport const DIALOG_REF = new InjectionToken<NgxDialogRef<any>>('NGX_DIALOG_REF');\n/** The resolved config for the dialog currently being rendered. */\n\nexport const NGX_DIALOG_CONFIG = new InjectionToken<NgxDialogConfig<any>>('NGX_DIALOG_CONFIG', {\n factory: () => new NgxDialogConfig(),\n});\n/** The arbitrary content component passed to `open()`, projected via `*ngComponentOutlet`. */\nexport const DIALOG_CONTENT = new InjectionToken<Type<any>>('NGX_DIALOG_CONTENT');\n","import { Directive, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport { DIALOG_REF } from '../tokens/dialog.tokens';\n\nexport type NgxDialogFooterAlign = 'start' | 'end' | 'center' | 'space-between' | 'space-around';\n\n@Directive({\n selector: 'ngx-dialog-footer,[ngxDialogFooter]',\n standalone: true,\n host: {\n class: 'dialog-footer',\n '[class.align-start]': 'align() === \"start\"',\n '[class.align-end]': 'align() === \"end\"',\n '[class.align-space-between]': 'align() === \"space-between\"',\n '[class.align-center]': 'align() === \"center\"',\n '[class.align-space-around]': 'align() === \"space-around\"',\n },\n exportAs: 'ngxDialogFooter',\n})\nexport class NgxDialogFooter implements OnInit, OnDestroy {\n readonly align = input<NgxDialogFooterAlign>('end');\n\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly dialogRef = inject(DIALOG_REF);\n\n ngOnInit(): void {\n this.dialogRef._setFooterElement(this.el.nativeElement);\n }\n\n ngOnDestroy(): void {\n this.dialogRef._setFooterElement(null);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, inject, input, OnInit } from '@angular/core';\nimport { DIALOG_REF, NGX_DIALOG_CONFIG } from '../tokens/dialog.tokens';\nimport { NgxDraggable } from 'ngx-kit/drag-resize';\nimport { DIALOG_OVERLAY_CLASSNAME } from 'ngx-kit/core';\n\nconst CLOSE_ICON_SVG = `<svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 320 512\" aria-hidden=\"true\">\n <path d=\"M312.1 375c9.369 9.369 9.369 24.57 0 33.94s-24.57 9.369-33.94 0L160 289.9l-119 119c-9.369 9.369-24.57 9.369-33.94 0s-9.369-24.57 0-33.94L126.1 256L7.027 136.1c-9.369-9.369-9.369-24.57 0-33.94s24.57-9.369 33.94 0L160 222.1l119-119c9.369-9.369 24.57-9.369 33.94 0s9.369 24.57 0 33.94L193.9 256L312.1 375z\"/>\n </svg>`;\nconst MAXIMIZE_ICON_SVG = `<svg name=\"maximize\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M7.4852 16.5149C6.9104 15.9401 7.00595 13.4982 7.00595 13.4982M7.4852 16.5149C8.06001 17.0897 10.5019 16.994 10.5019 16.994M7.4852 16.5149L11 13M16.5149 7.48512C15.9401 6.91031 13.4982 7.00596 13.4982 7.00596M16.5149 7.48512C17.0897 8.05993 16.994 10.5018 16.994 10.5018M16.5149 7.48512L13 11\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n<path d=\"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\" stroke-width=\"1.5\"/>\n</svg>`;\nconst RESTORE_ICON_SVG = `<svg name=\"restore\" stroke=\"currentColor\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\" stroke-width=\"1.5\"/>\n<path d=\"M12.9833 11.0167C12.4085 10.4419 12.5041 8 12.5041 8M12.9833 11.0167C13.5581 11.5915 16 11.4958 16 11.4958M12.9833 11.0167L17 7M11.0131 12.9868C10.4383 12.412 7.99641 12.5077 7.99641 12.5077M11.0131 12.9868C11.5879 13.5616 11.4922 16.0035 11.4922 16.0035M11.0131 12.9868L7 16.9999\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>`;\n\n@Directive({\n selector: 'ngx-dialog-header,[ngxDialogHeader]',\n standalone: true,\n hostDirectives: [NgxDraggable],\n host: { class: 'dialog-header' },\n exportAs: 'ngxDialogHeader',\n})\nexport class NgxDialogHeader implements OnInit {\n private config = inject(NGX_DIALOG_CONFIG);\n readonly showCloseButton = input(this.config.header?.showCloseButton ?? true);\n readonly showMaximizeButton = input(this.config.header?.showMaximizeButton ?? true);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly document = inject(DOCUMENT);\n private readonly dialogRef = inject(DIALOG_REF);\n\n private readonly drag = inject(NgxDraggable);\n\n private isMaximized = false;\n\n ngOnInit(): void {\n this.drag.dragRootElement.set('.ngx-ui-overlay');\n this.drag.dragHandle.set('.dialog-header-title');\n // Wrap the existing (Angular-rendered) header content in a title span by\n // MOVING the actual DOM nodes, not by re-serializing/re-parsing\n // `innerHTML`. The original implementation did\n // `el.innerHTML = '<span>' + el.innerHTML + '</span>'`, which silently\n // destroys any event listeners or component state living inside the\n // header content (anything beyond static text) because the browser\n // throws away and re-parses the whole subtree.\n const titleWrapper = this.document.createElement('span');\n titleWrapper.className = 'dialog-header-title';\n while (this.el.nativeElement.firstChild) {\n titleWrapper.appendChild(this.el.nativeElement.firstChild);\n }\n this.el.nativeElement.appendChild(titleWrapper);\n if (this.showMaximizeButton()) {\n const fullScreenBtn = this.document.createElement('button');\n fullScreenBtn.type = 'button';\n fullScreenBtn.className = 'ngx-dialog-action-btn';\n fullScreenBtn.setAttribute('aria-label', 'Maximaize');\n fullScreenBtn.setAttribute('title', 'Maximaize');\n fullScreenBtn.innerHTML = MAXIMIZE_ICON_SVG;\n fullScreenBtn.addEventListener('click', (ev: Event) => this.fullScreen(ev));\n this.el.nativeElement.appendChild(fullScreenBtn);\n }\n if (this.showCloseButton()) {\n const closeBtn = this.document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'ngx-dialog-action-btn close-btn';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.setAttribute('title', 'Close');\n closeBtn.innerHTML = CLOSE_ICON_SVG;\n closeBtn.addEventListener('click', () => this.dialogRef.close());\n this.el.nativeElement.appendChild(closeBtn);\n }\n\n this.dialogRef._setHeaderElement(this.el.nativeElement);\n }\n\n private fullScreen(ev: Event) {\n const overlay = this.el.nativeElement.closest(`.${DIALOG_OVERLAY_CLASSNAME}`);\n this.isMaximized = !this.isMaximized;\n this.drag.disabled.set(this.isMaximized);\n if (overlay) {\n overlay.classList.toggle('ngx-dialog-fullscreen');\n const btn = ev.currentTarget as HTMLButtonElement;\n btn.innerHTML = this.isMaximized ? RESTORE_ICON_SVG : MAXIMIZE_ICON_SVG;\n btn.setAttribute('aria-label', this.isMaximized ? 'Restore' : 'Maximaize');\n btn.setAttribute('title', this.isMaximized ? 'Restore' : 'Maximaize');\n }\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, computed, inject } from '@angular/core';\nimport { NGX_DIALOG_CONFIG, DIALOG_CONTENT, DIALOG_REF } from '../tokens/dialog.tokens';\nimport { NgxDialogFooter } from '../directives/footer.directive';\nimport { NgxDialogHeader } from '../directives/header.directive';\n\n/**\n * The dialog \"panel\" shell. It no longer owns the backdrop, centering,\n * focus trap, Escape handling or outside-click handling - all of that now\n * lives in `OverlayService`, which this component is rendered inside of.\n * This is intentionally a thin, fully signal-driven shell: no\n * `AfterViewInit`, no manual `ChangeDetectorRef.detectChanges()`, no\n * imperative style writes. Angular schedules change detection automatically\n * whenever a signal read from the template changes, including in zoneless\n * apps.\n */\n@Component({\n selector: 'ngx-dialog-panel',\n standalone: true,\n imports: [NgComponentOutlet, NgxDialogHeader, NgxDialogFooter],\n templateUrl: './ngx-dialog.component.html',\n styleUrl: './ngx-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-dialog-panel',\n '[class]': 'sizeClass()',\n },\n})\nexport class NgxDialogComponent {\n protected readonly dialogRef = inject(DIALOG_REF);\n protected readonly config = inject(NGX_DIALOG_CONFIG);\n protected readonly content = inject(DIALOG_CONTENT);\n\n protected readonly sizeClass = computed(() =>\n this.config.size ? `ngx-dialog-size-${this.config.size}` : '',\n );\n\n constructor() {\n this.dialogRef._setPanelElement(inject(ElementRef<HTMLElement>).nativeElement);\n }\n}\n","@if (config.header?.enable) {\n <div\n ngxDialogHeader\n [showCloseButton]=\"config.header?.showCloseButton ?? true\"\n [showMaximizeButton]=\"config.header?.showMaximizeButton ?? true\">\n {{ config.header?.title }}\n </div>\n}\n\n<ng-container *ngComponentOutlet=\"content\" />\n\n@if (config.footer?.enable) {\n <div ngxDialogFooter [align]=\"config.footer?.align ?? 'end'\">\n <button type=\"button\" class=\"ngx-dialog-default-close-btn\" (click)=\"dialogRef.close()\">\n {{ config.footer?.closeText ?? 'Close' }}\n </button>\n </div>\n}\n","import { Injectable, Injector, Type, computed, inject, signal } from '@angular/core';\nimport { OverlayService, OverlayOptions } from 'ngx-kit/core';\nimport { NgxDialogRef } from '../configs/dialog-ref';\nimport { NgxDialogConfig } from '../configs/dialog-config';\nimport {\n NGX_DIALOG_CONFIG,\n DIALOG_CONTENT,\n DIALOG_DATA,\n DIALOG_REF,\n} from '../tokens/dialog.tokens';\nimport { NgxDialogComponent } from '../components/ngx-dialog.component';\n\n@Injectable({ providedIn: 'root' })\nexport class NgxDialogService {\n private readonly overlay = inject(OverlayService);\n private readonly injector = inject(Injector);\n\n private readonly _openRefs = signal<NgxDialogRef<any>[]>([]);\n /** Every currently open dialog, oldest first. */\n readonly openDialogs = this._openRefs.asReadonly();\n /** How many dialogs are currently open. */\n readonly openCount = computed(() => this._openRefs().length);\n readonly defaultConfig = inject(NGX_DIALOG_CONFIG);\n /**\n * Opens `content` inside a dialog panel and returns a ref you can use to\n * close it and read the result back (`afterClosed`).\n */\n open<R = any, DataType = any>(\n content: Type<any>,\n config?: Partial<NgxDialogConfig<DataType>>,\n ): NgxDialogRef<R> {\n const resolvedConfig = { ...this.defaultConfig, ...config };\n const dialogRef = new NgxDialogRef<R>();\n dialogRef.beforeClose = resolvedConfig.beforeClose;\n\n const componentInjector = Injector.create({\n providers: [\n { provide: DIALOG_DATA, useValue: resolvedConfig.data },\n { provide: DIALOG_REF, useValue: dialogRef },\n { provide: NGX_DIALOG_CONFIG, useValue: resolvedConfig },\n { provide: DIALOG_CONTENT, useValue: content },\n ],\n parent: resolvedConfig.injector ?? this.injector,\n });\n\n const disableClose = resolvedConfig.disableClose ?? false;\n\n const overlayRef = this.overlay.open<NgxDialogComponent>({\n component: NgxDialogComponent,\n injector: componentInjector,\n placement: 'center',\n alignment: 'center',\n margin: 0,\n role: resolvedConfig.role ?? 'dialog',\n ariaModal: true,\n ariaLabel: resolvedConfig.ariaLabel,\n ariaLabelledby: resolvedConfig.ariaLabelledby,\n ariaDescribedby: resolvedConfig.ariaDescribedby,\n usePopover: resolvedConfig.usePopover ?? true,\n closeOnEscape: disableClose ? false : (resolvedConfig.closeOnEscape ?? true),\n closeOnOutsideClick: disableClose ? false : (resolvedConfig.closeOnOutsideClick ?? false),\n canClose: () => dialogRef.beforeClose?.() ?? true,\n restoreFocus: resolvedConfig.restoreFocus ?? true,\n autoFocus: resolvedConfig.autoFocus ?? true,\n lockBodyScroll: resolvedConfig.lockBodyScroll ?? true,\n backdropClass: resolvedConfig.backdropClass,\n panelClass: resolvedConfig.panelClass,\n configure: (_instance, ref) => this.applySizing(ref.nativeElement, resolvedConfig),\n onClosed: () => {\n this._openRefs.update((refs) => refs.filter((r) => r !== dialogRef));\n dialogRef._finalizeClose();\n },\n } satisfies OverlayOptions<NgxDialogComponent>);\n\n dialogRef._attachOverlayRef(overlayRef);\n this._openRefs.update((refs) => [...refs, dialogRef]);\n return dialogRef;\n }\n\n /** Closes every currently open dialog (ignores `disableClose`/guards - use sparingly, e.g. on logout). */\n closeAll(): void {\n [...this._openRefs()].forEach((ref) => ref.close());\n }\n\n private applySizing(el: HTMLElement | null, config: NgxDialogConfig): void {\n if (!el) return;\n if (config.width) el.style.width = config.width;\n if (config.minWidth) el.style.minWidth = config.minWidth;\n if (config.maxWidth) el.style.maxWidth = config.maxWidth;\n if (config.height) el.style.height = config.height;\n if (config.minHeight) el.style.minHeight = config.minHeight;\n if (config.maxHeight) el.style.maxHeight = config.maxHeight;\n }\n}\n","import { Type } from '@angular/core';\nimport { NgxDialogConfig } from './configs/dialog-config';\nimport { NgxDialogRef } from './configs/dialog-ref';\nimport { NgxDialogService } from './services/ngx-dialog.service';\n\nconst NOT_INITIALIZED_MESSAGE =\n '[ngx-kit/dialog] Dialog.* was called before provideNgxDialog() ran. ' +\n 'Add provideNgxDialog() to your app providers, or inject NgxDialogService directly instead of using the static Dialog API.';\n\n/**\n * Static convenience API over `NgxDialogService`, so you can call\n * `Dialog.open(...)` from anywhere without injecting the service manually.\n *\n * SSR note: the instance backing this static class is process-wide, not\n * per-request, so it is deliberately left unset on the server (see\n * `provideNgxDialog()`). Inject `NgxDialogService` directly in SSR code paths.\n */\nexport class Dialog {\n private static serviceInstance: NgxDialogService | null = null;\n\n /** @internal set by `provideNgxDialog()`'s environment initializer. */\n static _setService(svc: NgxDialogService): void {\n this.serviceInstance = svc;\n }\n\n private static get service(): NgxDialogService {\n if (!this.serviceInstance) {\n throw new Error(NOT_INITIALIZED_MESSAGE);\n }\n return this.serviceInstance;\n }\n\n static open<R = any, DataType = any>(\n component: Type<any>,\n config?: Partial<NgxDialogConfig<DataType>>,\n ): NgxDialogRef<R> {\n return this.service.open<R, DataType>(component, config);\n }\n\n static closeAll(): void {\n this.service.closeAll();\n }\n}\n","import {\n EnvironmentProviders,\n PLATFORM_ID,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { NgxDialogService } from './services/ngx-dialog.service';\nimport { Dialog } from './dialog.facade';\nimport { NgxDialogConfig } from './configs/dialog-config';\nimport { NGX_DIALOG_CONFIG } from './tokens/dialog.tokens';\n\nexport function provideNgxDialog(config?: NgxDialogConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_DIALOG_CONFIG,\n useValue: { ...new NgxDialogConfig(), ...(config || {}) },\n },\n NgxDialogService,\n provideEnvironmentInitializer(() => {\n if (isPlatformServer(inject(PLATFORM_ID))) {\n return;\n }\n\n Dialog._setService(inject(NgxDialogService));\n }),\n ]);\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n HostListener,\n Renderer2,\n effect,\n inject,\n} from '@angular/core';\nimport { DIALOG_REF } from '../tokens/dialog.tokens';\n\n/**\n * Why this can't be pure CSS flexbox: the header/body/footer elements are\n * *grandchildren* of the dialog panel (panel -> `*ngComponentOutlet`'s host\n * element -> header/body/footer), not direct children, because the content\n * component that hosts them is arbitrary and we don't control its own host\n * styling. `display:flex;flex-direction:column` on the panel therefore can't\n * size the body against the header/footer through that extra layer, so we\n * measure and set an explicit `max-height` instead, driven by a\n * `ResizeObserver` on the panel (not a `window:resize` listener, so it also\n * reacts to the dialog itself changing size, e.g. via `config.size`).\n */\n@Directive({\n selector: 'ngx-dialog-body,[ngxDialogBody]',\n standalone: true,\n host: { class: 'dialog-body' },\n exportAs: 'ngxDialogBody',\n})\nexport class NgxDialogBody {\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly dialogRef = inject(DIALOG_REF);\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n this.dialogRef._setBodyElement(this.el.nativeElement);\n this.destroyRef.onDestroy(() => this.dialogRef._setBodyElement(null));\n effect((onCleanup) => {\n const panel = this.dialogRef.panelEl();\n if (!panel || typeof ResizeObserver === 'undefined') {\n return;\n }\n const recompute = (): void => this.recomputeHeight(panel);\n\n const observer = new ResizeObserver(recompute);\n observer.observe(panel);\n recompute();\n onCleanup(() => observer.disconnect());\n });\n }\n\n private recomputeHeight(panel: HTMLElement): void {\n const headerHeight = this.dialogRef.headerEl()?.offsetHeight ?? 0;\n const footerHeight = this.dialogRef.footerEl()?.offsetHeight ?? 0;\n const panelHeight = Math.min(panel.clientHeight, window.innerHeight);\n const available = panelHeight - headerHeight - footerHeight;\n console.log('available', available);\n if (available > 0) {\n this.renderer.setStyle(this.el.nativeElement, 'height', `${available}px`);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgxDialogBody } from './directives/body.directive';\nimport { NgxDialogFooter } from './directives/footer.directive';\nimport { NgxDialogHeader } from './directives/header.directive';\nimport { NgxDialogComponent } from './components/ngx-dialog.component';\n\n@NgModule({\n declarations: [],\n imports: [NgxDialogComponent, NgxDialogHeader, NgxDialogFooter, NgxDialogBody],\n exports: [NgxDialogComponent, NgxDialogHeader, NgxDialogFooter, NgxDialogBody],\n})\nexport class NgxDialogModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, makeEnvironmentProviders, inject, ElementRef, Renderer2, DOCUMENT, input, effect, SecurityContext, Directive } from '@angular/core';
|
|
3
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_OFFSET = 8;
|
|
6
|
+
const SHOW_DELAY = 80;
|
|
7
|
+
const HIDE_DELAY = 40;
|
|
8
|
+
class NgxTooltipConfig {
|
|
9
|
+
placement = 'bottom';
|
|
10
|
+
offset = DEFAULT_OFFSET;
|
|
11
|
+
delay = SHOW_DELAY;
|
|
12
|
+
hideDelay = HIDE_DELAY;
|
|
13
|
+
useHtml = false;
|
|
14
|
+
usePopOver = true;
|
|
15
|
+
trigger = 'hover';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const NGX_TOOLTIP_CONFIG = new InjectionToken('ngx-tooltip-config', {
|
|
19
|
+
factory: () => new NgxTooltipConfig(),
|
|
20
|
+
});
|
|
21
|
+
function provideTooltip(configs) {
|
|
22
|
+
return makeEnvironmentProviders([
|
|
23
|
+
{
|
|
24
|
+
provide: NGX_TOOLTIP_CONFIG,
|
|
25
|
+
useValue: { ...new NgxTooltipConfig(), ...(configs || {}) },
|
|
26
|
+
},
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const TOOLTIP_CLASS = 'ngx-tooltip';
|
|
31
|
+
const VISIBLE_CLASS = 'ngx-tooltip-visible';
|
|
32
|
+
const VIEWPORT_PADDING = 8;
|
|
33
|
+
class NgxTooltip {
|
|
34
|
+
configs = inject(NGX_TOOLTIP_CONFIG);
|
|
35
|
+
elementRef = inject((ElementRef));
|
|
36
|
+
renderer = inject(Renderer2);
|
|
37
|
+
sanitizer = inject(DomSanitizer);
|
|
38
|
+
doc = inject(DOCUMENT);
|
|
39
|
+
element = this.elementRef.nativeElement;
|
|
40
|
+
tooltip;
|
|
41
|
+
showTimer;
|
|
42
|
+
hideTimer;
|
|
43
|
+
rafId = 0;
|
|
44
|
+
visible = false;
|
|
45
|
+
destroyed = false;
|
|
46
|
+
removeMouseEnter;
|
|
47
|
+
removeMouseLeave;
|
|
48
|
+
removeFocusIn;
|
|
49
|
+
removeFocusOut;
|
|
50
|
+
removeScroll;
|
|
51
|
+
removeResize;
|
|
52
|
+
tooltipText = input.required({ ...(ngDevMode ? { debugName: "tooltipText" } : /* istanbul ignore next */ {}), alias: 'ngxTooltip' });
|
|
53
|
+
ngxTooltipUseOverlay = input(true, /* @ts-ignore */
|
|
54
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipUseOverlay" }] : /* istanbul ignore next */ []));
|
|
55
|
+
ngxTooltipPlacement = input('bottom', /* @ts-ignore */
|
|
56
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipPlacement" }] : /* istanbul ignore next */ []));
|
|
57
|
+
ngxTooltipOffset = input(this.configs.offset, /* @ts-ignore */
|
|
58
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipOffset" }] : /* istanbul ignore next */ []));
|
|
59
|
+
ngxTooltipDelay = input(this.configs.delay, /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipDelay" }] : /* istanbul ignore next */ []));
|
|
61
|
+
ngxTooltipHideDelay = input(this.configs.hideDelay, /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipHideDelay" }] : /* istanbul ignore next */ []));
|
|
63
|
+
ngxTooltipAllowHtml = input(false, /* @ts-ignore */
|
|
64
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipAllowHtml" }] : /* istanbul ignore next */ []));
|
|
65
|
+
ngxTooltipTrigger = input('hover', /* @ts-ignore */
|
|
66
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipTrigger" }] : /* istanbul ignore next */ []));
|
|
67
|
+
/**
|
|
68
|
+
* If true, the tooltip automatically changes placement
|
|
69
|
+
* when there is not enough room.
|
|
70
|
+
*/
|
|
71
|
+
ngxTooltipFlip = input(true, /* @ts-ignore */
|
|
72
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipFlip" }] : /* istanbul ignore next */ []));
|
|
73
|
+
/**
|
|
74
|
+
* Keeps the tooltip inside the viewport.
|
|
75
|
+
*/
|
|
76
|
+
ngxTooltipShift = input(true, /* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [{ debugName: "ngxTooltipShift" }] : /* istanbul ignore next */ []));
|
|
78
|
+
constructor() {
|
|
79
|
+
effect(() => {
|
|
80
|
+
const trigger = this.ngxTooltipTrigger();
|
|
81
|
+
this.bindEvents();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
ngOnDestroy() {
|
|
85
|
+
this.destroyed = true;
|
|
86
|
+
this.clearTimers();
|
|
87
|
+
if (this.rafId) {
|
|
88
|
+
cancelAnimationFrame(this.rafId);
|
|
89
|
+
this.rafId = 0;
|
|
90
|
+
}
|
|
91
|
+
this.removeListeners();
|
|
92
|
+
this.tooltip?.remove();
|
|
93
|
+
this.tooltip = undefined;
|
|
94
|
+
}
|
|
95
|
+
bindEvents() {
|
|
96
|
+
const trigger = this.ngxTooltipTrigger();
|
|
97
|
+
this.removeMouseEnter?.();
|
|
98
|
+
this.removeMouseLeave?.();
|
|
99
|
+
this.removeFocusIn?.();
|
|
100
|
+
this.removeFocusOut?.();
|
|
101
|
+
if (trigger === 'hover' || trigger === 'hover-focus') {
|
|
102
|
+
this.removeMouseEnter = this.renderer.listen(this.element, 'mouseenter', () => this.scheduleShow());
|
|
103
|
+
this.removeMouseLeave = this.renderer.listen(this.element, 'mouseleave', () => this.scheduleHide());
|
|
104
|
+
}
|
|
105
|
+
if (trigger === 'focus' || trigger === 'hover-focus') {
|
|
106
|
+
this.removeFocusIn = this.renderer.listen(this.element, 'focusin', () => this.scheduleShow());
|
|
107
|
+
this.removeFocusOut = this.renderer.listen(this.element, 'focusout', () => this.scheduleHide());
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
scheduleShow() {
|
|
111
|
+
if (this.destroyed || !this.hasContent()) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this.clearHideTimer();
|
|
115
|
+
if (this.visible) {
|
|
116
|
+
this.schedulePositionUpdate();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.clearShowTimer();
|
|
120
|
+
this.showTimer = setTimeout(() => {
|
|
121
|
+
this.showTimer = undefined;
|
|
122
|
+
if (!this.destroyed) {
|
|
123
|
+
this.show();
|
|
124
|
+
}
|
|
125
|
+
}, Math.max(0, this.ngxTooltipDelay()));
|
|
126
|
+
}
|
|
127
|
+
scheduleHide() {
|
|
128
|
+
this.clearShowTimer();
|
|
129
|
+
if (!this.visible) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.clearHideTimer();
|
|
133
|
+
this.hideTimer = setTimeout(() => {
|
|
134
|
+
this.hideTimer = undefined;
|
|
135
|
+
if (!this.destroyed) {
|
|
136
|
+
this.hide();
|
|
137
|
+
}
|
|
138
|
+
}, Math.max(0, this.ngxTooltipHideDelay()));
|
|
139
|
+
}
|
|
140
|
+
show() {
|
|
141
|
+
if (this.visible || this.destroyed || !this.hasContent()) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const tooltip = this.getOrCreateTooltip();
|
|
145
|
+
this.updateContent(tooltip);
|
|
146
|
+
const doc = this.element.ownerDocument;
|
|
147
|
+
if (!tooltip.isConnected) {
|
|
148
|
+
doc.body.appendChild(tooltip);
|
|
149
|
+
}
|
|
150
|
+
this.applyDirection();
|
|
151
|
+
this.visible = true;
|
|
152
|
+
if (this.ngxTooltipUseOverlay()) {
|
|
153
|
+
const popover = tooltip;
|
|
154
|
+
popover.showPopover?.();
|
|
155
|
+
}
|
|
156
|
+
tooltip.classList.add(VISIBLE_CLASS);
|
|
157
|
+
this.schedulePositionUpdate();
|
|
158
|
+
this.addViewportListeners();
|
|
159
|
+
}
|
|
160
|
+
hide() {
|
|
161
|
+
if (!this.visible) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.visible = false;
|
|
165
|
+
this.clearShowTimer();
|
|
166
|
+
if (this.rafId) {
|
|
167
|
+
cancelAnimationFrame(this.rafId);
|
|
168
|
+
this.rafId = 0;
|
|
169
|
+
}
|
|
170
|
+
this.tooltip?.classList.remove(VISIBLE_CLASS);
|
|
171
|
+
if (this.ngxTooltipUseOverlay() && this.tooltip?.matches(':popover-open')) {
|
|
172
|
+
this.tooltip.hidePopover();
|
|
173
|
+
}
|
|
174
|
+
// Tooltip should not stay in the DOM while hidden.
|
|
175
|
+
this.tooltip?.remove();
|
|
176
|
+
this.removeViewportListeners();
|
|
177
|
+
}
|
|
178
|
+
getOrCreateTooltip() {
|
|
179
|
+
if (this.tooltip) {
|
|
180
|
+
return this.tooltip;
|
|
181
|
+
}
|
|
182
|
+
const doc = this.element.ownerDocument;
|
|
183
|
+
const tooltip = doc.createElement('div');
|
|
184
|
+
tooltip.className = TOOLTIP_CLASS;
|
|
185
|
+
tooltip.setAttribute('role', 'tooltip');
|
|
186
|
+
if (this.ngxTooltipUseOverlay()) {
|
|
187
|
+
tooltip.setAttribute('popover', 'manual');
|
|
188
|
+
}
|
|
189
|
+
tooltip.style.position = 'fixed';
|
|
190
|
+
tooltip.style.left = '0';
|
|
191
|
+
tooltip.style.top = '0';
|
|
192
|
+
const content = doc.createElement('div');
|
|
193
|
+
content.className = 'ngx-tooltip-content';
|
|
194
|
+
tooltip.appendChild(content);
|
|
195
|
+
this.tooltip = tooltip;
|
|
196
|
+
return tooltip;
|
|
197
|
+
}
|
|
198
|
+
updateContent(tooltip) {
|
|
199
|
+
const content = tooltip.firstElementChild;
|
|
200
|
+
if (!content) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const value = this.tooltipText() ?? '';
|
|
204
|
+
if (this.ngxTooltipAllowHtml()) {
|
|
205
|
+
content.innerHTML = this.sanitizer.sanitize(SecurityContext.STYLE, value) ?? '';
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
content.textContent = value;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
applyDirection() {
|
|
212
|
+
if (!this.tooltip) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const direction = getComputedStyle(this.element).direction;
|
|
216
|
+
this.tooltip.style.direction = direction;
|
|
217
|
+
}
|
|
218
|
+
schedulePositionUpdate() {
|
|
219
|
+
if (!this.visible || this.destroyed || !this.tooltip) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (this.rafId) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
this.rafId = requestAnimationFrame(() => {
|
|
226
|
+
this.rafId = 0;
|
|
227
|
+
if (!this.visible || this.destroyed) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this.positionTooltip();
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
positionTooltip() {
|
|
234
|
+
const tooltip = this.tooltip;
|
|
235
|
+
if (!tooltip || !this.visible) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const win = this.element.ownerDocument.defaultView;
|
|
239
|
+
if (!win) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const targetRect = this.element.getBoundingClientRect();
|
|
243
|
+
if (targetRect.width === 0 || targetRect.height === 0 || !this.intersectsViewport(targetRect)) {
|
|
244
|
+
tooltip.style.visibility = 'hidden';
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
tooltip.style.visibility = 'hidden';
|
|
248
|
+
const tooltipRect = tooltip.getBoundingClientRect();
|
|
249
|
+
const viewportWidth = win.innerWidth;
|
|
250
|
+
const viewportHeight = win.innerHeight;
|
|
251
|
+
const requestedPlacement = this.ngxTooltipPlacement();
|
|
252
|
+
const placement = this.ngxTooltipFlip()
|
|
253
|
+
? this.findBestPlacement(requestedPlacement, targetRect, tooltipRect, viewportWidth, viewportHeight)
|
|
254
|
+
: requestedPlacement;
|
|
255
|
+
let { left, top } = this.calculatePosition(placement, targetRect, tooltipRect, this.ngxTooltipOffset());
|
|
256
|
+
if (this.ngxTooltipShift()) {
|
|
257
|
+
const shifted = this.shiftIntoViewport(left, top, tooltipRect, viewportWidth, viewportHeight);
|
|
258
|
+
left = shifted.left;
|
|
259
|
+
top = shifted.top;
|
|
260
|
+
}
|
|
261
|
+
tooltip.dataset['placement'] = placement;
|
|
262
|
+
tooltip.style.left = `${Math.round(left)}px`;
|
|
263
|
+
tooltip.style.top = `${Math.round(top)}px`;
|
|
264
|
+
tooltip.style.visibility = 'visible';
|
|
265
|
+
}
|
|
266
|
+
calculatePosition(placement, target, tooltip, offset) {
|
|
267
|
+
const [side, align] = this.parsePlacement(placement);
|
|
268
|
+
let left = 0;
|
|
269
|
+
let top = 0;
|
|
270
|
+
switch (side) {
|
|
271
|
+
case 'top':
|
|
272
|
+
top = target.top - tooltip.height - offset;
|
|
273
|
+
break;
|
|
274
|
+
case 'bottom':
|
|
275
|
+
top = target.bottom + offset;
|
|
276
|
+
break;
|
|
277
|
+
case 'left':
|
|
278
|
+
left = target.left - tooltip.width - offset;
|
|
279
|
+
break;
|
|
280
|
+
case 'right':
|
|
281
|
+
left = target.right + offset;
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
if (side === 'top' || side === 'bottom') {
|
|
285
|
+
switch (align) {
|
|
286
|
+
case 'start':
|
|
287
|
+
left = target.left;
|
|
288
|
+
break;
|
|
289
|
+
case 'end':
|
|
290
|
+
left = target.right - tooltip.width;
|
|
291
|
+
break;
|
|
292
|
+
default:
|
|
293
|
+
left = target.left + (target.width - tooltip.width) / 2;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
switch (align) {
|
|
298
|
+
case 'start':
|
|
299
|
+
top = target.top;
|
|
300
|
+
break;
|
|
301
|
+
case 'end':
|
|
302
|
+
top = target.bottom - tooltip.height;
|
|
303
|
+
break;
|
|
304
|
+
default:
|
|
305
|
+
top = target.top + (target.height - tooltip.height) / 2;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return { left, top };
|
|
309
|
+
}
|
|
310
|
+
findBestPlacement(requested, target, tooltip, viewportWidth, viewportHeight) {
|
|
311
|
+
const candidates = this.getPlacementCandidates(requested);
|
|
312
|
+
for (const placement of candidates) {
|
|
313
|
+
const position = this.calculatePosition(placement, target, tooltip, this.ngxTooltipOffset());
|
|
314
|
+
if (this.fitsViewport(position.left, position.top, tooltip, viewportWidth, viewportHeight)) {
|
|
315
|
+
return placement;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return requested;
|
|
319
|
+
}
|
|
320
|
+
getPlacementCandidates(placement) {
|
|
321
|
+
switch (placement) {
|
|
322
|
+
case 'top':
|
|
323
|
+
return ['top', 'bottom', 'right', 'left'];
|
|
324
|
+
case 'bottom':
|
|
325
|
+
return ['bottom', 'top', 'right', 'left'];
|
|
326
|
+
case 'left':
|
|
327
|
+
return ['left', 'right', 'top', 'bottom'];
|
|
328
|
+
case 'right':
|
|
329
|
+
return ['right', 'left', 'top', 'bottom'];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
shiftIntoViewport(left, top, tooltip, viewportWidth, viewportHeight) {
|
|
333
|
+
const minLeft = VIEWPORT_PADDING;
|
|
334
|
+
const maxLeft = viewportWidth - tooltip.width - VIEWPORT_PADDING;
|
|
335
|
+
const minTop = VIEWPORT_PADDING;
|
|
336
|
+
const maxTop = viewportHeight - tooltip.height - VIEWPORT_PADDING;
|
|
337
|
+
left = Math.min(Math.max(left, minLeft), Math.max(minLeft, maxLeft));
|
|
338
|
+
top = Math.min(Math.max(top, minTop), Math.max(minTop, maxTop));
|
|
339
|
+
return { left, top };
|
|
340
|
+
}
|
|
341
|
+
fitsViewport(left, top, tooltip, viewportWidth, viewportHeight) {
|
|
342
|
+
return (left >= VIEWPORT_PADDING &&
|
|
343
|
+
top >= VIEWPORT_PADDING &&
|
|
344
|
+
left + tooltip.width <= viewportWidth - VIEWPORT_PADDING &&
|
|
345
|
+
top + tooltip.height <= viewportHeight - VIEWPORT_PADDING);
|
|
346
|
+
}
|
|
347
|
+
intersectsViewport(rect) {
|
|
348
|
+
const win = this.element.ownerDocument.defaultView;
|
|
349
|
+
if (!win) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
return (rect.bottom > 0 && rect.right > 0 && rect.top < win.innerHeight && rect.left < win.innerWidth);
|
|
353
|
+
}
|
|
354
|
+
parsePlacement(placement) {
|
|
355
|
+
const [side, alignment] = placement.split('-');
|
|
356
|
+
return [side, alignment ?? 'center'];
|
|
357
|
+
}
|
|
358
|
+
addViewportListeners() {
|
|
359
|
+
if (this.removeScroll || this.removeResize) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const win = this.element.ownerDocument.defaultView;
|
|
363
|
+
if (!win) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const onScroll = () => this.schedulePositionUpdate();
|
|
367
|
+
const onResize = () => this.schedulePositionUpdate();
|
|
368
|
+
win.addEventListener('scroll', onScroll, {
|
|
369
|
+
passive: true,
|
|
370
|
+
});
|
|
371
|
+
win.addEventListener('resize', onResize, {
|
|
372
|
+
passive: true,
|
|
373
|
+
});
|
|
374
|
+
this.removeScroll = () => {
|
|
375
|
+
win.removeEventListener('scroll', onScroll);
|
|
376
|
+
};
|
|
377
|
+
this.removeResize = () => {
|
|
378
|
+
win.removeEventListener('resize', onResize);
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
removeViewportListeners() {
|
|
382
|
+
this.removeScroll?.();
|
|
383
|
+
this.removeScroll = undefined;
|
|
384
|
+
this.removeResize?.();
|
|
385
|
+
this.removeResize = undefined;
|
|
386
|
+
}
|
|
387
|
+
removeListeners() {
|
|
388
|
+
this.removeMouseEnter?.();
|
|
389
|
+
this.removeMouseLeave?.();
|
|
390
|
+
this.removeFocusIn?.();
|
|
391
|
+
this.removeFocusOut?.();
|
|
392
|
+
this.removeMouseEnter = undefined;
|
|
393
|
+
this.removeMouseLeave = undefined;
|
|
394
|
+
this.removeFocusIn = undefined;
|
|
395
|
+
this.removeFocusOut = undefined;
|
|
396
|
+
}
|
|
397
|
+
hasContent() {
|
|
398
|
+
return !!this.tooltipText()?.trim();
|
|
399
|
+
}
|
|
400
|
+
clearTimers() {
|
|
401
|
+
this.clearShowTimer();
|
|
402
|
+
this.clearHideTimer();
|
|
403
|
+
}
|
|
404
|
+
clearShowTimer() {
|
|
405
|
+
if (this.showTimer !== undefined) {
|
|
406
|
+
clearTimeout(this.showTimer);
|
|
407
|
+
this.showTimer = undefined;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
clearHideTimer() {
|
|
411
|
+
if (this.hideTimer !== undefined) {
|
|
412
|
+
clearTimeout(this.hideTimer);
|
|
413
|
+
this.hideTimer = undefined;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
417
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: NgxTooltip, isStandalone: true, selector: "[ngxTooltip]", inputs: { tooltipText: { classPropertyName: "tooltipText", publicName: "ngxTooltip", isSignal: true, isRequired: true, transformFunction: null }, ngxTooltipUseOverlay: { classPropertyName: "ngxTooltipUseOverlay", publicName: "ngxTooltipUseOverlay", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipPlacement: { classPropertyName: "ngxTooltipPlacement", publicName: "ngxTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipOffset: { classPropertyName: "ngxTooltipOffset", publicName: "ngxTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipDelay: { classPropertyName: "ngxTooltipDelay", publicName: "ngxTooltipDelay", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipHideDelay: { classPropertyName: "ngxTooltipHideDelay", publicName: "ngxTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipAllowHtml: { classPropertyName: "ngxTooltipAllowHtml", publicName: "ngxTooltipAllowHtml", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipTrigger: { classPropertyName: "ngxTooltipTrigger", publicName: "ngxTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipFlip: { classPropertyName: "ngxTooltipFlip", publicName: "ngxTooltipFlip", isSignal: true, isRequired: false, transformFunction: null }, ngxTooltipShift: { classPropertyName: "ngxTooltipShift", publicName: "ngxTooltipShift", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
418
|
+
}
|
|
419
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxTooltip, decorators: [{
|
|
420
|
+
type: Directive,
|
|
421
|
+
args: [{
|
|
422
|
+
selector: '[ngxTooltip]',
|
|
423
|
+
standalone: true,
|
|
424
|
+
}]
|
|
425
|
+
}], ctorParameters: () => [], propDecorators: { tooltipText: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltip", required: true }] }], ngxTooltipUseOverlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipUseOverlay", required: false }] }], ngxTooltipPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipPlacement", required: false }] }], ngxTooltipOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipOffset", required: false }] }], ngxTooltipDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipDelay", required: false }] }], ngxTooltipHideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipHideDelay", required: false }] }], ngxTooltipAllowHtml: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipAllowHtml", required: false }] }], ngxTooltipTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipTrigger", required: false }] }], ngxTooltipFlip: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipFlip", required: false }] }], ngxTooltipShift: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTooltipShift", required: false }] }] } });
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Generated bundle index. Do not edit.
|
|
429
|
+
*/
|
|
430
|
+
|
|
431
|
+
export { NGX_TOOLTIP_CONFIG, NgxTooltip, provideTooltip };
|
|
432
|
+
//# sourceMappingURL=ngx-kit-tooltip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-kit-tooltip.mjs","sources":["../../../projects/libs/tooltip/types/configs.ts","../../../projects/libs/tooltip/providers/tootip.provider.ts","../../../projects/libs/tooltip/directives/ngx-tooltip.directive.ts","../../../projects/libs/tooltip/ngx-kit-tooltip.ts"],"sourcesContent":["import type { NgxTooltipPlacement, NgxTooltipTrigger } from '../public-api';\n\nconst DEFAULT_OFFSET = 8;\nconst SHOW_DELAY = 80;\nconst HIDE_DELAY = 40;\n\nexport class NgxTooltipConfig {\n placement: NgxTooltipPlacement = 'bottom';\n offset: number = DEFAULT_OFFSET;\n delay: number = SHOW_DELAY;\n hideDelay: number = HIDE_DELAY;\n useHtml: boolean = false;\n usePopOver: boolean = true;\n trigger: NgxTooltipTrigger = 'hover';\n \n}\n","import { InjectionToken, makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\nimport { NgxTooltipConfig } from '../types/configs';\n\nexport const NGX_TOOLTIP_CONFIG = new InjectionToken<NgxTooltipConfig>('ngx-tooltip-config', {\n factory: () => new NgxTooltipConfig(),\n});\nexport function provideTooltip(configs?: NgxTooltipConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_TOOLTIP_CONFIG,\n useValue: { ...new NgxTooltipConfig(), ...(configs || {}) },\n },\n ]);\n}\n","import {\n Directive,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n Renderer2,\n SecurityContext,\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { NgxTooltipPlacement } from '../types/placement';\nimport { NgxTooltipTrigger } from '../types/trigger';\nimport { NGX_TOOLTIP_CONFIG } from '../providers/tootip.provider';\n\nconst TOOLTIP_CLASS = 'ngx-tooltip';\nconst VISIBLE_CLASS = 'ngx-tooltip-visible';\nconst VIEWPORT_PADDING = 8;\n\n@Directive({\n selector: '[ngxTooltip]',\n standalone: true,\n})\nexport class NgxTooltip implements OnDestroy {\n private readonly configs = inject(NGX_TOOLTIP_CONFIG);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly doc = inject(DOCUMENT);\n\n private readonly element = this.elementRef.nativeElement;\n\n private tooltip?: HTMLElement;\n\n private showTimer?: ReturnType<typeof setTimeout>;\n private hideTimer?: ReturnType<typeof setTimeout>;\n\n private rafId = 0;\n private visible = false;\n private destroyed = false;\n\n private removeMouseEnter?: () => void;\n private removeMouseLeave?: () => void;\n private removeFocusIn?: () => void;\n private removeFocusOut?: () => void;\n private removeScroll?: () => void;\n private removeResize?: () => void;\n\n readonly tooltipText = input.required<string>({ alias: 'ngxTooltip' });\n readonly ngxTooltipUseOverlay = input<boolean>(true);\n\n readonly ngxTooltipPlacement = input<NgxTooltipPlacement>('bottom');\n\n readonly ngxTooltipOffset = input<number>(this.configs.offset);\n\n readonly ngxTooltipDelay = input<number>(this.configs.delay);\n\n readonly ngxTooltipHideDelay = input<number>(this.configs.hideDelay);\n\n readonly ngxTooltipAllowHtml = input<boolean>(false);\n\n readonly ngxTooltipTrigger = input<NgxTooltipTrigger>('hover');\n\n /**\n * If true, the tooltip automatically changes placement\n * when there is not enough room.\n */\n readonly ngxTooltipFlip = input<boolean>(true);\n\n /**\n * Keeps the tooltip inside the viewport.\n */\n readonly ngxTooltipShift = input<boolean>(true);\n\n constructor() {\n effect(() => {\n const trigger = this.ngxTooltipTrigger();\n this.bindEvents();\n });\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n\n this.clearTimers();\n\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n }\n\n this.removeListeners();\n\n this.tooltip?.remove();\n this.tooltip = undefined;\n }\n\n private bindEvents(): void {\n const trigger = this.ngxTooltipTrigger();\n this.removeMouseEnter?.();\n this.removeMouseLeave?.();\n this.removeFocusIn?.();\n this.removeFocusOut?.();\n\n if (trigger === 'hover' || trigger === 'hover-focus') {\n this.removeMouseEnter = this.renderer.listen(this.element, 'mouseenter', () =>\n this.scheduleShow(),\n );\n\n this.removeMouseLeave = this.renderer.listen(this.element, 'mouseleave', () =>\n this.scheduleHide(),\n );\n }\n\n if (trigger === 'focus' || trigger === 'hover-focus') {\n this.removeFocusIn = this.renderer.listen(this.element, 'focusin', () => this.scheduleShow());\n\n this.removeFocusOut = this.renderer.listen(this.element, 'focusout', () =>\n this.scheduleHide(),\n );\n }\n }\n\n private scheduleShow(): void {\n if (this.destroyed || !this.hasContent()) {\n return;\n }\n\n this.clearHideTimer();\n\n if (this.visible) {\n this.schedulePositionUpdate();\n return;\n }\n\n this.clearShowTimer();\n\n this.showTimer = setTimeout(\n () => {\n this.showTimer = undefined;\n\n if (!this.destroyed) {\n this.show();\n }\n },\n Math.max(0, this.ngxTooltipDelay()),\n );\n }\n\n private scheduleHide(): void {\n this.clearShowTimer();\n\n if (!this.visible) {\n return;\n }\n\n this.clearHideTimer();\n\n this.hideTimer = setTimeout(\n () => {\n this.hideTimer = undefined;\n\n if (!this.destroyed) {\n this.hide();\n }\n },\n Math.max(0, this.ngxTooltipHideDelay()),\n );\n }\n\n private show(): void {\n if (this.visible || this.destroyed || !this.hasContent()) {\n return;\n }\n\n const tooltip = this.getOrCreateTooltip();\n\n this.updateContent(tooltip);\n\n const doc = this.element.ownerDocument;\n\n if (!tooltip.isConnected) {\n doc.body.appendChild(tooltip);\n }\n\n this.applyDirection();\n\n this.visible = true;\n\n if (this.ngxTooltipUseOverlay()) {\n const popover = tooltip as HTMLElement & {\n showPopover?: () => void;\n };\n\n popover.showPopover?.();\n }\n\n tooltip.classList.add(VISIBLE_CLASS);\n\n this.schedulePositionUpdate();\n this.addViewportListeners();\n }\n\n private hide(): void {\n if (!this.visible) {\n return;\n }\n\n this.visible = false;\n\n this.clearShowTimer();\n\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n }\n\n this.tooltip?.classList.remove(VISIBLE_CLASS);\n\n if (this.ngxTooltipUseOverlay() && this.tooltip?.matches(':popover-open')) {\n (\n this.tooltip as HTMLElement & {\n hidePopover(): void;\n }\n ).hidePopover();\n }\n\n // Tooltip should not stay in the DOM while hidden.\n this.tooltip?.remove();\n\n this.removeViewportListeners();\n }\n\n private getOrCreateTooltip(): HTMLElement {\n if (this.tooltip) {\n return this.tooltip;\n }\n\n const doc = this.element.ownerDocument;\n\n const tooltip = doc.createElement('div');\n\n tooltip.className = TOOLTIP_CLASS;\n tooltip.setAttribute('role', 'tooltip');\n\n if (this.ngxTooltipUseOverlay()) {\n tooltip.setAttribute('popover', 'manual');\n }\n\n tooltip.style.position = 'fixed';\n tooltip.style.left = '0';\n tooltip.style.top = '0';\n\n const content = doc.createElement('div');\n content.className = 'ngx-tooltip-content';\n\n tooltip.appendChild(content);\n\n this.tooltip = tooltip;\n\n return tooltip;\n }\n\n private updateContent(tooltip: HTMLElement): void {\n const content = tooltip.firstElementChild as HTMLElement | null;\n\n if (!content) {\n return;\n }\n\n const value = this.tooltipText() ?? '';\n if (this.ngxTooltipAllowHtml()) {\n content.innerHTML = this.sanitizer.sanitize(SecurityContext.STYLE, value) ?? '';\n } else {\n content.textContent = value;\n }\n }\n\n private applyDirection(): void {\n if (!this.tooltip) {\n return;\n }\n\n const direction = getComputedStyle(this.element).direction;\n\n this.tooltip.style.direction = direction;\n }\n\n private schedulePositionUpdate(): void {\n if (!this.visible || this.destroyed || !this.tooltip) {\n return;\n }\n\n if (this.rafId) {\n return;\n }\n\n this.rafId = requestAnimationFrame(() => {\n this.rafId = 0;\n\n if (!this.visible || this.destroyed) {\n return;\n }\n\n this.positionTooltip();\n });\n }\n\n private positionTooltip(): void {\n const tooltip = this.tooltip;\n\n if (!tooltip || !this.visible) {\n return;\n }\n\n const win = this.element.ownerDocument.defaultView;\n\n if (!win) {\n return;\n }\n\n const targetRect = this.element.getBoundingClientRect();\n\n if (targetRect.width === 0 || targetRect.height === 0 || !this.intersectsViewport(targetRect)) {\n tooltip.style.visibility = 'hidden';\n return;\n }\n\n tooltip.style.visibility = 'hidden';\n\n const tooltipRect = tooltip.getBoundingClientRect();\n\n const viewportWidth = win.innerWidth;\n const viewportHeight = win.innerHeight;\n\n const requestedPlacement = this.ngxTooltipPlacement();\n\n const placement = this.ngxTooltipFlip()\n ? this.findBestPlacement(\n requestedPlacement,\n targetRect,\n tooltipRect,\n viewportWidth,\n viewportHeight,\n )\n : requestedPlacement;\n\n let { left, top } = this.calculatePosition(\n placement,\n targetRect,\n tooltipRect,\n this.ngxTooltipOffset(),\n );\n\n if (this.ngxTooltipShift()) {\n const shifted = this.shiftIntoViewport(left, top, tooltipRect, viewportWidth, viewportHeight);\n\n left = shifted.left;\n top = shifted.top;\n }\n\n tooltip.dataset['placement'] = placement;\n\n tooltip.style.left = `${Math.round(left)}px`;\n tooltip.style.top = `${Math.round(top)}px`;\n\n tooltip.style.visibility = 'visible';\n }\n\n private calculatePosition(\n placement: NgxTooltipPlacement,\n target: DOMRect,\n tooltip: DOMRect,\n offset: number,\n ): { left: number; top: number } {\n const [side, align] = this.parsePlacement(placement);\n\n let left: number = 0;\n let top: number = 0;\n\n switch (side) {\n case 'top':\n top = target.top - tooltip.height - offset;\n break;\n\n case 'bottom':\n top = target.bottom + offset;\n break;\n\n case 'left':\n left = target.left - tooltip.width - offset;\n break;\n\n case 'right':\n left = target.right + offset;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = target.left;\n break;\n\n case 'end':\n left = target.right - tooltip.width;\n break;\n\n default:\n left = target.left + (target.width - tooltip.width) / 2;\n }\n } else {\n switch (align) {\n case 'start':\n top = target.top;\n break;\n\n case 'end':\n top = target.bottom - tooltip.height;\n break;\n\n default:\n top = target.top + (target.height - tooltip.height) / 2;\n }\n }\n\n return { left, top };\n }\n\n private findBestPlacement(\n requested: NgxTooltipPlacement,\n target: DOMRect,\n tooltip: DOMRect,\n viewportWidth: number,\n viewportHeight: number,\n ): NgxTooltipPlacement {\n const candidates = this.getPlacementCandidates(requested);\n\n for (const placement of candidates) {\n const position = this.calculatePosition(placement, target, tooltip, this.ngxTooltipOffset());\n\n if (this.fitsViewport(position.left, position.top, tooltip, viewportWidth, viewportHeight)) {\n return placement;\n }\n }\n\n return requested;\n }\n\n private getPlacementCandidates(placement: NgxTooltipPlacement): NgxTooltipPlacement[] {\n switch (placement) {\n case 'top':\n return ['top', 'bottom', 'right', 'left'];\n\n case 'bottom':\n return ['bottom', 'top', 'right', 'left'];\n\n case 'left':\n return ['left', 'right', 'top', 'bottom'];\n\n case 'right':\n return ['right', 'left', 'top', 'bottom'];\n }\n }\n\n private shiftIntoViewport(\n left: number,\n top: number,\n tooltip: DOMRect,\n viewportWidth: number,\n viewportHeight: number,\n ): { left: number; top: number } {\n const minLeft = VIEWPORT_PADDING;\n const maxLeft = viewportWidth - tooltip.width - VIEWPORT_PADDING;\n\n const minTop = VIEWPORT_PADDING;\n const maxTop = viewportHeight - tooltip.height - VIEWPORT_PADDING;\n\n left = Math.min(Math.max(left, minLeft), Math.max(minLeft, maxLeft));\n\n top = Math.min(Math.max(top, minTop), Math.max(minTop, maxTop));\n\n return { left, top };\n }\n\n private fitsViewport(\n left: number,\n top: number,\n tooltip: DOMRect,\n viewportWidth: number,\n viewportHeight: number,\n ): boolean {\n return (\n left >= VIEWPORT_PADDING &&\n top >= VIEWPORT_PADDING &&\n left + tooltip.width <= viewportWidth - VIEWPORT_PADDING &&\n top + tooltip.height <= viewportHeight - VIEWPORT_PADDING\n );\n }\n\n private intersectsViewport(rect: DOMRect): boolean {\n const win = this.element.ownerDocument.defaultView;\n\n if (!win) {\n return false;\n }\n\n return (\n rect.bottom > 0 && rect.right > 0 && rect.top < win.innerHeight && rect.left < win.innerWidth\n );\n }\n\n private parsePlacement(\n placement: NgxTooltipPlacement,\n ): ['top' | 'bottom' | 'left' | 'right', 'start' | 'end' | 'center'] {\n const [side, alignment] = placement.split('-') as [\n 'top' | 'bottom' | 'left' | 'right',\n 'start' | 'end' | undefined,\n ];\n\n return [side, alignment ?? 'center'];\n }\n\n private addViewportListeners(): void {\n if (this.removeScroll || this.removeResize) {\n return;\n }\n\n const win = this.element.ownerDocument.defaultView;\n\n if (!win) {\n return;\n }\n\n const onScroll = () => this.schedulePositionUpdate();\n const onResize = () => this.schedulePositionUpdate();\n\n win.addEventListener('scroll', onScroll, {\n passive: true,\n });\n\n win.addEventListener('resize', onResize, {\n passive: true,\n });\n\n this.removeScroll = () => {\n win.removeEventListener('scroll', onScroll);\n };\n\n this.removeResize = () => {\n win.removeEventListener('resize', onResize);\n };\n }\n\n private removeViewportListeners(): void {\n this.removeScroll?.();\n this.removeScroll = undefined;\n\n this.removeResize?.();\n this.removeResize = undefined;\n }\n\n private removeListeners(): void {\n this.removeMouseEnter?.();\n this.removeMouseLeave?.();\n this.removeFocusIn?.();\n this.removeFocusOut?.();\n\n this.removeMouseEnter = undefined;\n this.removeMouseLeave = undefined;\n this.removeFocusIn = undefined;\n this.removeFocusOut = undefined;\n }\n\n private hasContent(): boolean {\n return !!this.tooltipText()?.trim();\n }\n\n private clearTimers(): void {\n this.clearShowTimer();\n this.clearHideTimer();\n }\n\n private clearShowTimer(): void {\n if (this.showTimer !== undefined) {\n clearTimeout(this.showTimer);\n this.showTimer = undefined;\n }\n }\n\n private clearHideTimer(): void {\n if (this.hideTimer !== undefined) {\n clearTimeout(this.hideTimer);\n this.hideTimer = undefined;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-kit",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.2.0",
|
|
4
4
|
"description": "Angular input components",
|
|
5
5
|
"author": "Mohammadreza Samani <mr.samani1368@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -117,6 +117,10 @@
|
|
|
117
117
|
"types": "./types/ngx-kit-time-picker.d.ts",
|
|
118
118
|
"default": "./fesm2022/ngx-kit-time-picker.mjs"
|
|
119
119
|
},
|
|
120
|
+
"./tooltip": {
|
|
121
|
+
"types": "./types/ngx-kit-tooltip.d.ts",
|
|
122
|
+
"default": "./fesm2022/ngx-kit-tooltip.mjs"
|
|
123
|
+
},
|
|
120
124
|
"./virtual-scroll": {
|
|
121
125
|
"types": "./types/ngx-kit-virtual-scroll.d.ts",
|
|
122
126
|
"default": "./fesm2022/ngx-kit-virtual-scroll.mjs"
|
package/styles/all.css
CHANGED
|
@@ -12,41 +12,6 @@
|
|
|
12
12
|
color-scheme: only dark;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
dialog.ngx-ui-overlay::backdrop {
|
|
16
|
-
background: transparent;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
@keyframes menu-enter {
|
|
20
|
-
from {
|
|
21
|
-
opacity: 0;
|
|
22
|
-
transform: scale(0.8);
|
|
23
|
-
}
|
|
24
|
-
to {
|
|
25
|
-
opacity: 1;
|
|
26
|
-
transform: none;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
@keyframes menu-exit {
|
|
30
|
-
from {
|
|
31
|
-
opacity: 1;
|
|
32
|
-
}
|
|
33
|
-
to {
|
|
34
|
-
opacity: 0;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
dialog.ngx-image-viewer-dialog {
|
|
38
|
-
border: none;
|
|
39
|
-
padding: 1rem;
|
|
40
|
-
max-inline-size: 96vw;
|
|
41
|
-
max-block-size: 96vh;
|
|
42
|
-
inline-size: min(900px, 96vw);
|
|
43
|
-
background: light-dark(#ffffff, #1c1c20);
|
|
44
|
-
border-radius: 12px;
|
|
45
|
-
}
|
|
46
|
-
dialog.ngx-image-viewer-dialog::backdrop {
|
|
47
|
-
background: rgba(0, 0, 0, 0.75);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
15
|
/* ---------- confetti (success only) ---------- */
|
|
51
16
|
.confetti {
|
|
52
17
|
position: absolute;
|
|
@@ -75,3 +40,128 @@ dialog.ngx-image-viewer-dialog::backdrop {
|
|
|
75
40
|
transform: translateY(340px) rotate(340deg);
|
|
76
41
|
}
|
|
77
42
|
}
|
|
43
|
+
.ngx-tooltip {
|
|
44
|
+
--ngx-tooltip-bg: light-dark(#f4f4f5, #18181b);
|
|
45
|
+
--ngx-tooltip-fg: light-dark(#18181b, #f4f4f5);
|
|
46
|
+
--ngx-tooltip-border: light-dark(#63636336, #ffffff1a);
|
|
47
|
+
--ngx-tooltip-shadow: 0 10px 30px rgb(0 0 0 / 0.25), 0 2px 8px rgb(0 0 0 / 0.18);
|
|
48
|
+
--ngx-tooltip-font-size: 12px;
|
|
49
|
+
--ngx-tooltip-radius: 7px;
|
|
50
|
+
--ngx-tooltip-arrow-size: 6px;
|
|
51
|
+
--ngx-tooltip-max-height: 200px;
|
|
52
|
+
position: fixed;
|
|
53
|
+
inset: auto;
|
|
54
|
+
margin: 0;
|
|
55
|
+
z-index: 2147483000;
|
|
56
|
+
display: block;
|
|
57
|
+
max-width: min(360px, 100vw - 16px);
|
|
58
|
+
padding: 8px 10px;
|
|
59
|
+
box-sizing: border-box;
|
|
60
|
+
background: var(--ngx-tooltip-bg);
|
|
61
|
+
color: var(--ngx-tooltip-fg);
|
|
62
|
+
border: 1px solid var(--ngx-tooltip-border);
|
|
63
|
+
border-radius: var(--ngx-tooltip-radius);
|
|
64
|
+
box-shadow: var(--ngx-tooltip-shadow);
|
|
65
|
+
font-size: var(--ngx-tooltip-font-size);
|
|
66
|
+
font-weight: 450;
|
|
67
|
+
line-height: 1.45;
|
|
68
|
+
text-align: start;
|
|
69
|
+
user-select: none;
|
|
70
|
+
opacity: 0;
|
|
71
|
+
visibility: hidden;
|
|
72
|
+
transform: scale(0.96);
|
|
73
|
+
transition: opacity 120ms ease, transform 120ms cubic-bezier(0.2, 0.8, 0.2, 1), visibility 120ms linear;
|
|
74
|
+
overflow-wrap: anywhere;
|
|
75
|
+
overflow: visible;
|
|
76
|
+
}
|
|
77
|
+
.ngx-tooltip[data-placement^=top] {
|
|
78
|
+
transform-origin: bottom center;
|
|
79
|
+
}
|
|
80
|
+
.ngx-tooltip[data-placement^=bottom] {
|
|
81
|
+
transform-origin: top center;
|
|
82
|
+
}
|
|
83
|
+
.ngx-tooltip[data-placement^=left] {
|
|
84
|
+
transform-origin: right center;
|
|
85
|
+
}
|
|
86
|
+
.ngx-tooltip[data-placement^=right] {
|
|
87
|
+
transform-origin: left center;
|
|
88
|
+
}
|
|
89
|
+
.ngx-tooltip.ngx-tooltip-visible {
|
|
90
|
+
opacity: 1;
|
|
91
|
+
visibility: visible;
|
|
92
|
+
transform: scale(1);
|
|
93
|
+
}
|
|
94
|
+
.ngx-tooltip .ngx-tooltip-content {
|
|
95
|
+
position: relative;
|
|
96
|
+
white-space: pre;
|
|
97
|
+
max-height: var(--ngx-tooltip-max-height);
|
|
98
|
+
overflow: auto;
|
|
99
|
+
padding: 1px;
|
|
100
|
+
}
|
|
101
|
+
.ngx-tooltip .ngx-tooltip-content p {
|
|
102
|
+
margin: 0 0 6px;
|
|
103
|
+
}
|
|
104
|
+
.ngx-tooltip .ngx-tooltip-content p:last-child {
|
|
105
|
+
margin-bottom: 0;
|
|
106
|
+
}
|
|
107
|
+
.ngx-tooltip .ngx-tooltip-content code {
|
|
108
|
+
padding: 1px 4px;
|
|
109
|
+
border-radius: 4px;
|
|
110
|
+
background: rgba(255, 255, 255, 0.08);
|
|
111
|
+
font-family: "Cascadia Code", "SFMono-Regular", Consolas, monospace;
|
|
112
|
+
font-size: 0.9em;
|
|
113
|
+
}
|
|
114
|
+
.ngx-tooltip .ngx-tooltip-content strong {
|
|
115
|
+
font-weight: 650;
|
|
116
|
+
}
|
|
117
|
+
.ngx-tooltip .ngx-tooltip-content a {
|
|
118
|
+
color: inherit;
|
|
119
|
+
text-decoration: underline;
|
|
120
|
+
text-underline-offset: 2px;
|
|
121
|
+
}
|
|
122
|
+
.ngx-tooltip::before {
|
|
123
|
+
content: " ";
|
|
124
|
+
position: absolute;
|
|
125
|
+
width: calc(var(--ngx-tooltip-arrow-size) * 2);
|
|
126
|
+
height: calc(var(--ngx-tooltip-arrow-size) * 2);
|
|
127
|
+
background: var(--ngx-tooltip-bg);
|
|
128
|
+
border: 1px solid var(--ngx-tooltip-border);
|
|
129
|
+
transform: rotate(45deg);
|
|
130
|
+
pointer-events: none;
|
|
131
|
+
}
|
|
132
|
+
.ngx-tooltip[data-placement^=top]:before {
|
|
133
|
+
left: var(--ngx-tooltip-arrow-offset, 50%);
|
|
134
|
+
bottom: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
135
|
+
transform: translateX(-50%) rotate(45deg);
|
|
136
|
+
border-left: 0;
|
|
137
|
+
border-top: 0;
|
|
138
|
+
}
|
|
139
|
+
.ngx-tooltip[data-placement^=bottom]:before {
|
|
140
|
+
left: var(--ngx-tooltip-arrow-offset, 50%);
|
|
141
|
+
top: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
142
|
+
transform: translateX(-50%) rotate(45deg);
|
|
143
|
+
border-right: 0;
|
|
144
|
+
border-bottom: 0;
|
|
145
|
+
}
|
|
146
|
+
.ngx-tooltip[data-placement^=left]:before {
|
|
147
|
+
right: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
148
|
+
top: var(--ngx-tooltip-arrow-offset, 50%);
|
|
149
|
+
transform: translateY(-50%) rotate(45deg);
|
|
150
|
+
border-left: 0;
|
|
151
|
+
border-bottom: 0;
|
|
152
|
+
}
|
|
153
|
+
.ngx-tooltip[data-placement^=right]:before {
|
|
154
|
+
left: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
155
|
+
top: var(--ngx-tooltip-arrow-offset, 50%);
|
|
156
|
+
transform: translateY(-50%) rotate(45deg);
|
|
157
|
+
border-right: 0;
|
|
158
|
+
border-top: 0;
|
|
159
|
+
}
|
|
160
|
+
@media (prefers-reduced-motion: reduce) {
|
|
161
|
+
.ngx-tooltip {
|
|
162
|
+
transition: none;
|
|
163
|
+
}
|
|
164
|
+
.ngx-tooltip.ngx-tooltip-visible {
|
|
165
|
+
transform: none;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
.ngx-tooltip {
|
|
2
|
+
--ngx-tooltip-bg: light-dark(#f4f4f5, #18181b);
|
|
3
|
+
--ngx-tooltip-fg: light-dark(#18181b, #f4f4f5);
|
|
4
|
+
--ngx-tooltip-border: #ffffff1a;
|
|
5
|
+
--ngx-tooltip-shadow: 0 10px 30px rgb(0 0 0 / 0.25), 0 2px 8px rgb(0 0 0 / 0.18);
|
|
6
|
+
--ngx-tooltip-radius: 7px;
|
|
7
|
+
--ngx-tooltip-arrow-size: 6px;
|
|
8
|
+
position: fixed;
|
|
9
|
+
inset: auto;
|
|
10
|
+
margin: 0;
|
|
11
|
+
z-index: 2147483000;
|
|
12
|
+
display: block;
|
|
13
|
+
max-width: min(360px, 100vw - 16px);
|
|
14
|
+
padding: 8px 10px;
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
background: var(--ngx-tooltip-bg);
|
|
17
|
+
color: var(--ngx-tooltip-fg);
|
|
18
|
+
border: 1px solid var(--ngx-tooltip-border);
|
|
19
|
+
border-radius: var(--ngx-tooltip-radius);
|
|
20
|
+
box-shadow: var(--ngx-tooltip-shadow);
|
|
21
|
+
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
22
|
+
font-size: 12px;
|
|
23
|
+
font-weight: 450;
|
|
24
|
+
line-height: 1.45;
|
|
25
|
+
text-align: start;
|
|
26
|
+
pointer-events: none;
|
|
27
|
+
user-select: none;
|
|
28
|
+
opacity: 0;
|
|
29
|
+
visibility: hidden;
|
|
30
|
+
transform: scale(0.96);
|
|
31
|
+
transition: opacity 120ms ease, transform 120ms cubic-bezier(0.2, 0.8, 0.2, 1), visibility 120ms linear;
|
|
32
|
+
overflow-wrap: anywhere;
|
|
33
|
+
}
|
|
34
|
+
.ngx-tooltip[data-placement^=top] {
|
|
35
|
+
transform-origin: bottom center;
|
|
36
|
+
}
|
|
37
|
+
.ngx-tooltip[data-placement^=bottom] {
|
|
38
|
+
transform-origin: top center;
|
|
39
|
+
}
|
|
40
|
+
.ngx-tooltip[data-placement^=left] {
|
|
41
|
+
transform-origin: right center;
|
|
42
|
+
}
|
|
43
|
+
.ngx-tooltip[data-placement^=right] {
|
|
44
|
+
transform-origin: left center;
|
|
45
|
+
}
|
|
46
|
+
.ngx-tooltip.ngx-tooltip-visible {
|
|
47
|
+
opacity: 1;
|
|
48
|
+
visibility: visible;
|
|
49
|
+
transform: scale(1);
|
|
50
|
+
}
|
|
51
|
+
.ngx-tooltip .ngx-tooltip-content {
|
|
52
|
+
position: relative;
|
|
53
|
+
max-width: inherit;
|
|
54
|
+
}
|
|
55
|
+
.ngx-tooltip .ngx-tooltip-content p {
|
|
56
|
+
margin: 0 0 6px;
|
|
57
|
+
}
|
|
58
|
+
.ngx-tooltip .ngx-tooltip-content p:last-child {
|
|
59
|
+
margin-bottom: 0;
|
|
60
|
+
}
|
|
61
|
+
.ngx-tooltip .ngx-tooltip-content code {
|
|
62
|
+
padding: 1px 4px;
|
|
63
|
+
border-radius: 4px;
|
|
64
|
+
background: rgba(255, 255, 255, 0.08);
|
|
65
|
+
font-family: "Cascadia Code", "SFMono-Regular", Consolas, monospace;
|
|
66
|
+
font-size: 0.9em;
|
|
67
|
+
}
|
|
68
|
+
.ngx-tooltip .ngx-tooltip-content strong {
|
|
69
|
+
font-weight: 650;
|
|
70
|
+
}
|
|
71
|
+
.ngx-tooltip .ngx-tooltip-content a {
|
|
72
|
+
color: inherit;
|
|
73
|
+
text-decoration: underline;
|
|
74
|
+
text-underline-offset: 2px;
|
|
75
|
+
}
|
|
76
|
+
.ngx-tooltip .ngx-tooltip-arrow {
|
|
77
|
+
position: absolute;
|
|
78
|
+
width: calc(var(--ngx-tooltip-arrow-size) * 2);
|
|
79
|
+
height: calc(var(--ngx-tooltip-arrow-size) * 2);
|
|
80
|
+
background: var(--ngx-tooltip-bg);
|
|
81
|
+
border: 1px solid var(--ngx-tooltip-border);
|
|
82
|
+
transform: rotate(45deg);
|
|
83
|
+
pointer-events: none;
|
|
84
|
+
}
|
|
85
|
+
.ngx-tooltip[data-placement^=top] .ngx-tooltip-arrow {
|
|
86
|
+
left: var(--ngx-tooltip-arrow-offset, 50%);
|
|
87
|
+
bottom: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
88
|
+
transform: translateX(-50%) rotate(45deg);
|
|
89
|
+
border-left: 0;
|
|
90
|
+
border-top: 0;
|
|
91
|
+
}
|
|
92
|
+
.ngx-tooltip[data-placement^=bottom] .ngx-tooltip-arrow {
|
|
93
|
+
left: var(--ngx-tooltip-arrow-offset, 50%);
|
|
94
|
+
top: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
95
|
+
transform: translateX(-50%) rotate(45deg);
|
|
96
|
+
border-right: 0;
|
|
97
|
+
border-bottom: 0;
|
|
98
|
+
}
|
|
99
|
+
.ngx-tooltip[data-placement^=left] .ngx-tooltip-arrow {
|
|
100
|
+
right: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
101
|
+
top: var(--ngx-tooltip-arrow-offset, 50%);
|
|
102
|
+
transform: translateY(-50%) rotate(45deg);
|
|
103
|
+
border-left: 0;
|
|
104
|
+
border-bottom: 0;
|
|
105
|
+
}
|
|
106
|
+
.ngx-tooltip[data-placement^=right] .ngx-tooltip-arrow {
|
|
107
|
+
left: calc(var(--ngx-tooltip-arrow-size) * -1);
|
|
108
|
+
top: var(--ngx-tooltip-arrow-offset, 50%);
|
|
109
|
+
transform: translateY(-50%) rotate(45deg);
|
|
110
|
+
border-right: 0;
|
|
111
|
+
border-top: 0;
|
|
112
|
+
}
|
|
113
|
+
@media (prefers-reduced-motion: reduce) {
|
|
114
|
+
.ngx-tooltip {
|
|
115
|
+
transition: none;
|
|
116
|
+
}
|
|
117
|
+
.ngx-tooltip.ngx-tooltip-visible {
|
|
118
|
+
transform: none;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @ngx-kit/tooltip
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { OnDestroy, InjectionToken, EnvironmentProviders } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
type NgxTooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
5
|
+
|
|
6
|
+
type NgxTooltipTrigger = 'hover' | 'focus' | 'hover-focus';
|
|
7
|
+
|
|
8
|
+
declare class NgxTooltip implements OnDestroy {
|
|
9
|
+
private readonly configs;
|
|
10
|
+
private readonly elementRef;
|
|
11
|
+
private readonly renderer;
|
|
12
|
+
private readonly sanitizer;
|
|
13
|
+
private readonly doc;
|
|
14
|
+
private readonly element;
|
|
15
|
+
private tooltip?;
|
|
16
|
+
private showTimer?;
|
|
17
|
+
private hideTimer?;
|
|
18
|
+
private rafId;
|
|
19
|
+
private visible;
|
|
20
|
+
private destroyed;
|
|
21
|
+
private removeMouseEnter?;
|
|
22
|
+
private removeMouseLeave?;
|
|
23
|
+
private removeFocusIn?;
|
|
24
|
+
private removeFocusOut?;
|
|
25
|
+
private removeScroll?;
|
|
26
|
+
private removeResize?;
|
|
27
|
+
readonly tooltipText: _angular_core.InputSignal<string>;
|
|
28
|
+
readonly ngxTooltipUseOverlay: _angular_core.InputSignal<boolean>;
|
|
29
|
+
readonly ngxTooltipPlacement: _angular_core.InputSignal<NgxTooltipPlacement>;
|
|
30
|
+
readonly ngxTooltipOffset: _angular_core.InputSignal<number>;
|
|
31
|
+
readonly ngxTooltipDelay: _angular_core.InputSignal<number>;
|
|
32
|
+
readonly ngxTooltipHideDelay: _angular_core.InputSignal<number>;
|
|
33
|
+
readonly ngxTooltipAllowHtml: _angular_core.InputSignal<boolean>;
|
|
34
|
+
readonly ngxTooltipTrigger: _angular_core.InputSignal<NgxTooltipTrigger>;
|
|
35
|
+
/**
|
|
36
|
+
* If true, the tooltip automatically changes placement
|
|
37
|
+
* when there is not enough room.
|
|
38
|
+
*/
|
|
39
|
+
readonly ngxTooltipFlip: _angular_core.InputSignal<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Keeps the tooltip inside the viewport.
|
|
42
|
+
*/
|
|
43
|
+
readonly ngxTooltipShift: _angular_core.InputSignal<boolean>;
|
|
44
|
+
constructor();
|
|
45
|
+
ngOnDestroy(): void;
|
|
46
|
+
private bindEvents;
|
|
47
|
+
private scheduleShow;
|
|
48
|
+
private scheduleHide;
|
|
49
|
+
private show;
|
|
50
|
+
private hide;
|
|
51
|
+
private getOrCreateTooltip;
|
|
52
|
+
private updateContent;
|
|
53
|
+
private applyDirection;
|
|
54
|
+
private schedulePositionUpdate;
|
|
55
|
+
private positionTooltip;
|
|
56
|
+
private calculatePosition;
|
|
57
|
+
private findBestPlacement;
|
|
58
|
+
private getPlacementCandidates;
|
|
59
|
+
private shiftIntoViewport;
|
|
60
|
+
private fitsViewport;
|
|
61
|
+
private intersectsViewport;
|
|
62
|
+
private parsePlacement;
|
|
63
|
+
private addViewportListeners;
|
|
64
|
+
private removeViewportListeners;
|
|
65
|
+
private removeListeners;
|
|
66
|
+
private hasContent;
|
|
67
|
+
private clearTimers;
|
|
68
|
+
private clearShowTimer;
|
|
69
|
+
private clearHideTimer;
|
|
70
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTooltip, never>;
|
|
71
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxTooltip, "[ngxTooltip]", never, { "tooltipText": { "alias": "ngxTooltip"; "required": true; "isSignal": true; }; "ngxTooltipUseOverlay": { "alias": "ngxTooltipUseOverlay"; "required": false; "isSignal": true; }; "ngxTooltipPlacement": { "alias": "ngxTooltipPlacement"; "required": false; "isSignal": true; }; "ngxTooltipOffset": { "alias": "ngxTooltipOffset"; "required": false; "isSignal": true; }; "ngxTooltipDelay": { "alias": "ngxTooltipDelay"; "required": false; "isSignal": true; }; "ngxTooltipHideDelay": { "alias": "ngxTooltipHideDelay"; "required": false; "isSignal": true; }; "ngxTooltipAllowHtml": { "alias": "ngxTooltipAllowHtml"; "required": false; "isSignal": true; }; "ngxTooltipTrigger": { "alias": "ngxTooltipTrigger"; "required": false; "isSignal": true; }; "ngxTooltipFlip": { "alias": "ngxTooltipFlip"; "required": false; "isSignal": true; }; "ngxTooltipShift": { "alias": "ngxTooltipShift"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
declare class NgxTooltipConfig {
|
|
75
|
+
placement: NgxTooltipPlacement;
|
|
76
|
+
offset: number;
|
|
77
|
+
delay: number;
|
|
78
|
+
hideDelay: number;
|
|
79
|
+
useHtml: boolean;
|
|
80
|
+
usePopOver: boolean;
|
|
81
|
+
trigger: NgxTooltipTrigger;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
declare const NGX_TOOLTIP_CONFIG: InjectionToken<NgxTooltipConfig>;
|
|
85
|
+
declare function provideTooltip(configs?: NgxTooltipConfig): EnvironmentProviders;
|
|
86
|
+
|
|
87
|
+
export { NGX_TOOLTIP_CONFIG, NgxTooltip, provideTooltip };
|
|
88
|
+
export type { NgxTooltipPlacement, NgxTooltipTrigger };
|