@theseam/ui-common 2.0.1-beta.99 → 2.1.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.
Files changed (39) hide show
  1. package/ai/index.d.ts +1 -363
  2. package/carousel/index.d.ts +1 -21
  3. package/data-filters/index.d.ts +30 -6
  4. package/datatable/index.d.ts +3 -299
  5. package/datatable-alterations-display/index.d.ts +1 -61
  6. package/fesm2022/theseam-ui-common-ai.mjs +1 -1368
  7. package/fesm2022/theseam-ui-common-ai.mjs.map +1 -1
  8. package/fesm2022/theseam-ui-common-carousel.mjs +1 -48
  9. package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
  10. package/fesm2022/theseam-ui-common-data-filters.mjs +61 -18
  11. package/fesm2022/theseam-ui-common-data-filters.mjs.map +1 -1
  12. package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +1 -197
  13. package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
  14. package/fesm2022/theseam-ui-common-datatable.mjs +4 -668
  15. package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
  16. package/fesm2022/theseam-ui-common-file-input.mjs +1 -156
  17. package/fesm2022/theseam-ui-common-file-input.mjs.map +1 -1
  18. package/fesm2022/theseam-ui-common-google-maps.mjs +299 -218
  19. package/fesm2022/theseam-ui-common-google-maps.mjs.map +1 -1
  20. package/fesm2022/theseam-ui-common-icon.mjs +1 -72
  21. package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
  22. package/fesm2022/theseam-ui-common-table-cell-types.mjs +0 -4
  23. package/fesm2022/theseam-ui-common-table-cell-types.mjs.map +1 -1
  24. package/fesm2022/theseam-ui-common-toggle-group.mjs +81 -112
  25. package/fesm2022/theseam-ui-common-toggle-group.mjs.map +1 -1
  26. package/fesm2022/theseam-ui-common-tooltip.mjs +1 -110
  27. package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
  28. package/fesm2022/theseam-ui-common-utils.mjs +112 -21
  29. package/fesm2022/theseam-ui-common-utils.mjs.map +1 -1
  30. package/fesm2022/theseam-ui-common-widget.mjs +1 -23
  31. package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
  32. package/file-input/index.d.ts +1 -78
  33. package/google-maps/index.d.ts +35 -23
  34. package/icon/index.d.ts +3 -33
  35. package/package.json +5 -2
  36. package/toggle-group/index.d.ts +42 -18
  37. package/tooltip/index.d.ts +2 -40
  38. package/utils/index.d.ts +38 -6
  39. package/widget/index.d.ts +2 -17
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-tooltip.mjs","sources":["../../../projects/ui-common/tooltip/tooltip.component.ts","../../../projects/ui-common/tooltip/tooltip.component.html","../../../projects/ui-common/tooltip/tooltip.directive.ts","../../../projects/ui-common/tooltip/tooltip.module.ts","../../../projects/ui-common/tooltip/testing/tooltip.harness.ts","../../../projects/ui-common/tooltip/theseam-ui-common-tooltip.ts"],"sourcesContent":["import {\n AnimationEvent,\n transition,\n trigger,\n style,\n animate,\n} from '@angular/animations'\nimport { NgClass, NgIf, NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n OnDestroy,\n TemplateRef,\n ViewChild,\n} from '@angular/core'\nimport { Subject } from 'rxjs'\n\nexport type TheSeamTooltipPlacement =\n | 'top'\n | 'top-left'\n | 'top-right'\n | 'bottom'\n | 'bottom-left'\n | 'bottom-right'\n | 'left'\n | 'left-top'\n | 'left-bottom'\n | 'right'\n | 'right-top'\n | 'right-bottom'\n | 'auto'\n\n@Component({\n selector: 'seam-tooltip',\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n animations: [\n trigger('fadeInOut', [\n transition(':enter', [\n style({ opacity: 0 }),\n animate('150ms ease-out', style({ opacity: 0.9 })),\n ]),\n transition(':leave', [\n style({ opacity: 0.9 }),\n animate('150ms ease-in', style({ opacity: 0 })),\n ]),\n ]),\n ],\n host: {\n class: 'tooltip show',\n '[id]': 'tooltipId',\n '[@fadeInOut]': '',\n '(@fadeInOut.start)': '_onAnimationStart($event)',\n '(@fadeInOut.done)': '_onAnimationDone($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIf, NgClass, NgTemplateOutlet],\n})\nexport class TheSeamTooltipComponent implements OnDestroy {\n @Input() content: string | TemplateRef<any> | null = null\n @Input() tooltipClass?: string\n @Input() context?: any\n @Input() placement: TheSeamTooltipPlacement = 'top'\n @Input() actualPlacement?: TheSeamTooltipPlacement // The actual placement determined by CDK Overlay\n @Input() tooltipId?: string\n @Input() triggerElement?: HTMLElement\n\n /** A subject emitting after the tooltip enters the view. */\n readonly _afterEnter = new Subject<void>()\n\n /** A subject emitting after the tooltip exits the view. */\n readonly _afterExit = new Subject<void>()\n\n @HostBinding('class')\n get hostClasses(): string {\n const baseClass = 'tooltip show'\n const placementClass = this._getPlacementClass()\n this._setArrowPosition()\n return `${baseClass} ${placementClass}`\n }\n\n @ViewChild('inner', { static: true }) innerElement!: ElementRef\n @ViewChild('arrow', { static: true }) arrowElement!: ElementRef\n\n ngOnDestroy() {\n this._afterEnter.complete()\n this._afterExit.complete()\n }\n\n get isStringContent(): boolean {\n return typeof this.content === 'string'\n }\n\n get isTemplateContent(): boolean {\n return this.content instanceof TemplateRef\n }\n\n get templateContent(): TemplateRef<any> | null {\n return this.isTemplateContent ? (this.content as TemplateRef<any>) : null\n }\n\n private _getPlacementClass(): string {\n // Use actualPlacement if available, otherwise fall back to initial placement\n const effectivePlacement = this.actualPlacement || this.placement\n\n switch (effectivePlacement) {\n case 'top':\n case 'top-left':\n case 'top-right':\n return 'bs-tooltip-top'\n case 'bottom':\n case 'bottom-left':\n case 'bottom-right':\n return 'bs-tooltip-bottom'\n case 'left':\n case 'left-top':\n case 'left-bottom':\n return 'bs-tooltip-left'\n case 'right':\n case 'right-top':\n case 'right-bottom':\n return 'bs-tooltip-right'\n case 'auto':\n return 'bs-tooltip-auto'\n default:\n return 'bs-tooltip-top'\n }\n }\n\n private _setArrowPosition() {\n if (!this.innerElement || !this.arrowElement || !this.triggerElement) {\n return\n }\n\n // Use actualPlacement if available, otherwise fall back to initial placement\n const effectivePlacement = this.actualPlacement || this.placement\n const paddingOffset = 8 // Default padding offset for arrow positioning\n const minDimension = 50 // Minimum tooltip width/height to use trigger-aligned positioning\n\n const triggerRect = this.triggerElement.getBoundingClientRect()\n const tooltipRect: DOMRect =\n this.innerElement.nativeElement.getBoundingClientRect()\n const arrowRect: DOMRect =\n this.arrowElement.nativeElement.getBoundingClientRect()\n\n // Default arrow offset (8px padding + half arrow size)\n const defaultArrowOffset =\n paddingOffset +\n (effectivePlacement.startsWith('top') ||\n effectivePlacement.startsWith('bottom')\n ? arrowRect.width / 2\n : arrowRect.height / 2)\n\n if (\n effectivePlacement.startsWith('top') ||\n effectivePlacement.startsWith('bottom')\n ) {\n // Check if tooltip is too narrow for trigger-aligned positioning\n if (tooltipRect.width < minDimension) {\n const arrowLeft = (tooltipRect.width - arrowRect.width) / 2\n this.arrowElement.nativeElement.style.left = `${arrowLeft}px`\n return\n }\n\n // Horizontal arrow positioning for top-* and bottom-* placements\n const triggerCenter = triggerRect.left + triggerRect.width / 2\n const adjustedArrowLeft =\n triggerCenter - tooltipRect.left - arrowRect.width / 2\n const arrowCenter =\n tooltipRect.left + adjustedArrowLeft + arrowRect.width / 2\n\n // If arrow's center is outside trigger's horizontal bounds, use default\n if (arrowCenter < triggerRect.left || arrowCenter > triggerRect.right) {\n this.arrowElement.nativeElement.style.left = `${defaultArrowOffset}px`\n return\n }\n\n // Ensure arrow's left is within rounded corner bounds\n const maxArrowLeft =\n tooltipRect.width - arrowRect.width - defaultArrowOffset\n const arrowLeft = Math.min(\n maxArrowLeft,\n Math.max(defaultArrowOffset, adjustedArrowLeft),\n )\n\n this.arrowElement.nativeElement.style.left = `${arrowLeft}px`\n } else if (\n effectivePlacement.startsWith('left') ||\n effectivePlacement.startsWith('right')\n ) {\n // Check if tooltip is too short for trigger-aligned positioning\n if (tooltipRect.height < minDimension) {\n const arrowTop = (tooltipRect.height - arrowRect.height) / 2\n this.arrowElement.nativeElement.style.top = `${arrowTop}px`\n return\n }\n\n // Vertical arrow positioning for left-* and right-* placements\n const triggerCenter = triggerRect.top + triggerRect.height / 2\n const adjustedArrowTop =\n triggerCenter - tooltipRect.top - arrowRect.height / 2\n const arrowCenter =\n tooltipRect.top + adjustedArrowTop + arrowRect.height / 2\n\n // If arrow's center is outside trigger's vertical bounds, use default\n if (arrowCenter < triggerRect.top || arrowCenter > triggerRect.bottom) {\n this.arrowElement.nativeElement.style.top = `${defaultArrowOffset}px`\n return\n }\n\n // Ensure arrow's top is within rounded corner bounds\n const maxArrowTop =\n tooltipRect.height - arrowRect.height - defaultArrowOffset\n const arrowTop = Math.min(\n maxArrowTop,\n Math.max(defaultArrowOffset, adjustedArrowTop),\n )\n\n this.arrowElement.nativeElement.style.top = `${arrowTop}px`\n }\n }\n\n /** Emit lifecycle events based on animation `start` callback. */\n _onAnimationStart(event: AnimationEvent) {\n // Animation start handling if needed\n }\n\n /** Emit lifecycle events based on animation `done` callback. */\n _onAnimationDone(event: AnimationEvent) {\n if (event.toState === 'void') {\n this._afterExit.next()\n this._afterExit.complete()\n } else {\n this._afterEnter.next()\n this._afterEnter.complete()\n }\n }\n}\n","<div #inner class=\"tooltip-inner\" [ngClass]=\"tooltipClass\">\n <!-- String content -->\n <span *ngIf=\"isStringContent\">{{ content }}</span>\n\n <!-- Template content -->\n <ng-container *ngIf=\"isTemplateContent\">\n <ng-container\n *ngTemplateOutlet=\"templateContent; context: context\"\n ></ng-container>\n </ng-container>\n</div>\n<div #arrow class=\"arrow\"></div>\n","import {\n coerceBooleanProperty,\n coerceNumberProperty,\n} from '@angular/cdk/coercion'\nimport { ESCAPE } from '@angular/cdk/keycodes'\nimport {\n ConnectionPositionPair,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayRef,\n} from '@angular/cdk/overlay'\nimport { ComponentPortal } from '@angular/cdk/portal'\nimport {\n ComponentRef,\n Directive,\n ElementRef,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core'\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs'\nimport { takeUntil, filter } from 'rxjs/operators'\n\nimport {\n TheSeamTooltipComponent,\n TheSeamTooltipPlacement,\n} from './tooltip.component'\n\nexport type TheSeamTooltipTrigger = 'hover' | 'focus' | 'both'\nexport type TheSeamTooltipPlacementInput =\n | TheSeamTooltipPlacement\n | TheSeamTooltipPlacement[]\n | string\n\n/**\n * A custom tooltip directive that replaces \\`ngbTooltip\\` with zero dependencies.\n * Supports both string and template content with full Bootstrap 4.6 compatibility.\n *\n * ## Features\n * - **String & Template Content**: Support for both simple text and complex HTML content\n * - **Multiple Triggers**: Hover, focus, or both\n * - **Flexible Positioning**: 12 placement options with auto-fallback\n * - **Configurable Timing**: Customizable show/hide delays\n * - **Bootstrap Compatible**: Uses Bootstrap 4.6 classes for seamless integration\n * - **Accessibility**: Full ARIA support and keyboard navigation\n * - **Performance**: Lazy creation and proper cleanup\n *\n * ## Migration from ngbTooltip\n * ```typescript\n * // Before\n * <button ngbTooltip=\"Help text\" placement=\"top\" tooltipClass=\"custom\">\n *\n * // After\n * <button seamTooltip=\"Help text\" placement=\"top\" tooltipClass=\"custom\">\n * ```\n */\n@Directive({\n selector: '[seamTooltip]',\n host: {\n '[attr.aria-describedby]': 'tooltipOpen() ? _tooltipId : null',\n },\n exportAs: 'seamTooltip',\n})\nexport class TheSeamTooltipDirective implements OnInit, OnChanges, OnDestroy {\n private readonly _elementRef = inject(ElementRef<HTMLElement>)\n private readonly _viewContainerRef = inject(ViewContainerRef)\n private readonly _overlay = inject(Overlay)\n\n private readonly _ngUnsubscribe = new Subject<void>()\n private readonly _tooltipId = `seam-tooltip-${Math.random().toString(36).slice(2, 11)}`\n\n @Input() seamTooltip: string | TemplateRef<any> | null = null\n\n @Input() tooltipClass?: string\n\n @Input() placement?: TheSeamTooltipPlacementInput | null = 'top'\n\n @Input() container?: string | HTMLElement\n\n @Input()\n get disableTooltip() {\n return this._disableTooltip.value\n }\n set disableTooltip(val: boolean) {\n this._disableTooltip.next(coerceBooleanProperty(val))\n }\n private readonly _disableTooltip = new BehaviorSubject<boolean>(false)\n\n @Input()\n get showDelay() {\n return this._showDelay.value\n }\n set showDelay(val: number) {\n this._showDelay.next(coerceNumberProperty(val, 500))\n }\n private readonly _showDelay = new BehaviorSubject<number>(500)\n\n @Input()\n get hideDelay() {\n return this._hideDelay.value\n }\n set hideDelay(val: number) {\n this._hideDelay.next(coerceNumberProperty(val, 0))\n }\n private readonly _hideDelay = new BehaviorSubject<number>(0)\n\n @Input() trigger: TheSeamTooltipTrigger = 'both'\n\n private _active = false\n private _overlayRef: OverlayRef | null = null\n private _compRef: ComponentRef<TheSeamTooltipComponent> | null = null\n private _showTimeoutId: any = null\n private _hideTimeoutId: any = null\n private _eventListenersSubject = new Subject<void>()\n private _documentKeydownSubject = new Subject<void>()\n\n ngOnInit() {\n this._setupEventListeners()\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Re-setup event listeners if trigger changes\n if (changes['trigger'] && !changes['trigger'].firstChange) {\n // Clear any pending timeouts\n this._clearTimeouts()\n // Close any existing tooltip first\n this._closeTooltip()\n // Re-setup event listeners with new trigger\n this._setupEventListeners()\n }\n }\n\n ngOnDestroy() {\n this._clearTimeouts()\n this._closeTooltip()\n this._eventListenersSubject.next()\n this._eventListenersSubject.complete()\n this._documentKeydownSubject.next()\n this._documentKeydownSubject.complete()\n this._ngUnsubscribe.next()\n this._ngUnsubscribe.complete()\n }\n\n private _setupEventListeners() {\n // Clean up existing event listeners\n this._eventListenersSubject.next()\n this._eventListenersSubject.complete()\n this._eventListenersSubject = new Subject<void>()\n\n const element = this._elementRef.nativeElement\n\n // Mouse events for hover trigger\n if (this.trigger === 'hover' || this.trigger === 'both') {\n fromEvent(element, 'mouseenter')\n .pipe(\n filter(() => !this._disableTooltip.value && !!this.seamTooltip),\n takeUntil(this._eventListenersSubject),\n )\n .subscribe(() => this._scheduleShow())\n\n fromEvent(element, 'mouseleave')\n .pipe(takeUntil(this._eventListenersSubject))\n .subscribe(() => this._scheduleHide())\n }\n\n // Focus events for focus trigger\n if (this.trigger === 'focus' || this.trigger === 'both') {\n fromEvent(element, 'focus')\n .pipe(\n filter(() => !this._disableTooltip.value && !!this.seamTooltip),\n takeUntil(this._eventListenersSubject),\n )\n .subscribe(() => this._scheduleShow())\n\n fromEvent(element, 'blur')\n .pipe(takeUntil(this._eventListenersSubject))\n .subscribe(() => this._scheduleHide())\n }\n }\n\n private _scheduleShow() {\n this._clearTimeouts()\n\n if (this._active) {\n return\n }\n\n this._showTimeoutId = setTimeout(() => {\n this._showTooltip()\n }, this.showDelay)\n }\n\n private _scheduleHide() {\n this._clearTimeouts()\n\n if (!this._active) {\n return\n }\n\n this._hideTimeoutId = setTimeout(() => {\n this._closeTooltip()\n }, this.hideDelay)\n }\n\n private _clearTimeouts() {\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId)\n this._showTimeoutId = null\n }\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId)\n this._hideTimeoutId = null\n }\n }\n\n private _showTooltip(): void {\n if (this._active || !this.seamTooltip || this._disableTooltip.value) {\n return\n }\n\n this._active = true\n\n const positionStrategy = this._getOverlayPosition()\n this._overlayRef = this._overlay.create({\n positionStrategy,\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n })\n\n this._compRef = this._overlayRef.attach(\n new ComponentPortal(TheSeamTooltipComponent, this._viewContainerRef),\n )\n\n // Set component properties\n const parsedPlacements = this._parsePlacementInput(this.placement)\n this._compRef.instance.content = this.seamTooltip\n this._compRef.instance.tooltipClass = this.tooltipClass\n this._compRef.instance.placement = parsedPlacements[0] || 'top' // Use first placement for initial display\n this._compRef.instance.tooltipId = this._tooltipId\n this._compRef.instance.triggerElement = this._elementRef.nativeElement\n this._compRef.changeDetectorRef.markForCheck()\n\n // Listen for position changes to update placement class\n positionStrategy.positionChanges\n .pipe(takeUntil(this._ngUnsubscribe))\n .subscribe((positionChange) => {\n if (this._compRef && positionChange.connectionPair) {\n const actualPlacement = this._getPlacementFromConnectionPair(\n positionChange.connectionPair,\n )\n this._compRef.instance.actualPlacement = actualPlacement\n this._compRef.changeDetectorRef.markForCheck()\n }\n })\n\n // Listen for tooltip exit animation\n this._compRef.instance._afterExit\n .pipe(takeUntil(this._ngUnsubscribe))\n .subscribe(() => {\n // Only detach if still attached (defensive check since _closeTooltip may have already detached)\n if (this._overlayRef?.hasAttached()) {\n this._overlayRef.detach()\n }\n // Ensure cleanup happens even if _closeTooltip didn't run\n if (this._active || this._overlayRef || this._compRef) {\n this._resetTooltip()\n }\n })\n\n // Set up document-level Escape key listener\n this._setupDocumentKeydownListener()\n }\n\n private _setupDocumentKeydownListener(): void {\n // Clean up any existing document listener\n this._documentKeydownSubject.next()\n this._documentKeydownSubject.complete()\n this._documentKeydownSubject = new Subject<void>()\n\n // Set up document-level Escape key listener\n fromEvent<KeyboardEvent>(document, 'keydown')\n .pipe(\n filter((event) => {\n // Check both keyCode and key for better compatibility\n return (\n (event.keyCode === ESCAPE || event.key === 'Escape') && this._active\n )\n }),\n takeUntil(this._documentKeydownSubject),\n takeUntil(this._ngUnsubscribe),\n )\n .subscribe(() => this._closeTooltip())\n }\n\n private _closeTooltip(): void {\n if (!this._active || !this._compRef) {\n return\n }\n\n // Mark as inactive immediately to prevent new tooltips from being blocked\n this._active = false\n\n // Clean up document listener\n this._documentKeydownSubject.next()\n\n // Immediately clean up for tests (when using NoopAnimationsModule)\n // In real usage, this will be handled by the animation callback\n this._resetTooltip()\n }\n\n private _resetTooltip(): void {\n this._active = false\n\n // Dispose of overlay if it exists and hasn't been disposed already\n if (this._overlayRef) {\n if (this._overlayRef.hasAttached()) {\n this._overlayRef.detach()\n }\n this._overlayRef.dispose()\n this._overlayRef = null\n }\n\n this._compRef = null\n }\n\n public tooltipOpen(): boolean {\n return this._active && this._compRef !== null\n }\n\n private _parsePlacementInput(\n placement?: TheSeamTooltipPlacementInput | null,\n ): TheSeamTooltipPlacement[] {\n if (placement === undefined || placement === null) {\n return ['top'] // Default placement\n }\n\n if (typeof placement === 'string') {\n if (placement === 'auto') {\n return ['auto']\n }\n // Parse space-delimited string\n const placements = placement.split(/\\s+/).filter((p) => p.trim())\n return placements.filter((p) =>\n this._isValidPlacement(p),\n ) as TheSeamTooltipPlacement[]\n }\n\n if (Array.isArray(placement)) {\n return placement.filter((p) => this._isValidPlacement(p))\n }\n\n return [placement]\n }\n\n private _isValidPlacement(\n placement: string,\n ): placement is TheSeamTooltipPlacement {\n const validPlacements: TheSeamTooltipPlacement[] = [\n 'top',\n 'top-left',\n 'top-right',\n 'bottom',\n 'bottom-left',\n 'bottom-right',\n 'left',\n 'left-top',\n 'left-bottom',\n 'right',\n 'right-top',\n 'right-bottom',\n 'auto',\n ]\n return validPlacements.includes(placement as TheSeamTooltipPlacement)\n }\n\n private _getOverlayPosition(): FlexibleConnectedPositionStrategy {\n const positions = this._getPositions()\n\n return this._overlay\n .position()\n .flexibleConnectedTo(this._elementRef)\n .withPositions(positions)\n .withFlexibleDimensions(false)\n .withPush(true)\n }\n\n private _getPositions(): ConnectionPositionPair[] {\n const parsedPlacements = this._parsePlacementInput(this.placement)\n\n // If 'auto' is specified or no valid placements, return all positions\n if (parsedPlacements.includes('auto') || parsedPlacements.length === 0) {\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n },\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n },\n ]\n }\n\n // Return positions for specified placements only\n const positions: ConnectionPositionPair[] = []\n\n for (const placement of parsedPlacements) {\n const placementPositions = this._getPositionForPlacement(placement)\n positions.push(...placementPositions)\n }\n\n return positions\n }\n\n private _getPositionForPlacement(\n placement: TheSeamTooltipPlacement,\n ): ConnectionPositionPair[] {\n switch (placement) {\n case 'top':\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n },\n ]\n case 'top-left':\n return [\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]\n case 'top-right':\n return [\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]\n case 'bottom':\n return [\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n },\n ]\n case 'bottom-left':\n return [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]\n case 'bottom-right':\n return [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n ]\n case 'left':\n return [\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n },\n ]\n case 'left-top':\n return [\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top',\n },\n ]\n case 'left-bottom':\n return [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]\n case 'right':\n return [\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n },\n ]\n case 'right-top':\n return [\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]\n case 'right-bottom':\n return [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]\n case 'auto':\n default:\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n },\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n },\n ]\n }\n }\n\n private _getPlacementFromConnectionPair(\n connectionPair: ConnectionPositionPair,\n ): TheSeamTooltipPlacement {\n const { originX, originY, overlayX, overlayY } = connectionPair\n\n // Top placements (overlay below origin)\n if (originY === 'top' && overlayY === 'bottom') {\n if (originX === 'start' && overlayX === 'start') return 'top-left'\n if (originX === 'end' && overlayX === 'end') return 'top-right'\n if (originX === 'center' && overlayX === 'center') return 'top'\n }\n\n // Bottom placements (overlay above origin)\n if (originY === 'bottom' && overlayY === 'top') {\n if (originX === 'start' && overlayX === 'start') return 'bottom-left'\n if (originX === 'end' && overlayX === 'end') return 'bottom-right'\n if (originX === 'center' && overlayX === 'center') return 'bottom'\n }\n\n // Left placements (overlay to the right of origin)\n if (originX === 'start' && overlayX === 'end') {\n if (originY === 'top' && overlayY === 'top') return 'left-top'\n if (originY === 'bottom' && overlayY === 'bottom') return 'left-bottom'\n if (originY === 'center' && overlayY === 'center') return 'left'\n }\n\n // Right placements (overlay to the left of origin)\n if (originX === 'end' && overlayX === 'start') {\n if (originY === 'top' && overlayY === 'top') return 'right-top'\n if (originY === 'bottom' && overlayY === 'bottom') return 'right-bottom'\n if (originY === 'center' && overlayY === 'center') return 'right'\n }\n\n // Default fallback\n return 'top'\n }\n}\n","import { NgModule } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { OverlayModule } from '@angular/cdk/overlay'\n\nimport { TheSeamTooltipComponent } from './tooltip.component'\nimport { TheSeamTooltipDirective } from './tooltip.directive'\n\n@NgModule({\n imports: [\n CommonModule,\n OverlayModule,\n TheSeamTooltipComponent,\n TheSeamTooltipDirective,\n ],\n exports: [TheSeamTooltipDirective],\n})\nexport class TheSeamTooltipModule {}\n","import {\n ComponentHarness,\n HarnessPredicate,\n BaseHarnessFilters,\n ElementDimensions,\n} from '@angular/cdk/testing'\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface TheSeamTooltipHarnessFilters extends BaseHarnessFilters {\n // Empty - use selector-based filtering\n}\n\n/**\n * Harness for interacting with tooltip directives in tests\n */\nexport class TheSeamTooltipHarness extends ComponentHarness {\n static hostSelector = '[seamTooltip]'\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a tooltip with specific attributes\n */\n static with(\n options: TheSeamTooltipHarnessFilters = {},\n ): HarnessPredicate<TheSeamTooltipHarness> {\n return new HarnessPredicate(TheSeamTooltipHarness, options)\n }\n\n /** Hovers over the element to show the tooltip */\n async hover(): Promise<void> {\n return (await this.host()).hover()\n }\n\n /** Moves the mouse away from the element to hide the tooltip */\n async mouseAway(): Promise<void> {\n return (await this.host()).mouseAway()\n }\n\n /** Focuses the element to show the tooltip */\n async focus(): Promise<void> {\n return (await this.host()).focus()\n }\n\n /** Blurs the element to hide the tooltip */\n async blur(): Promise<void> {\n return (await this.host()).blur()\n }\n\n /** Clicks the element */\n async click(): Promise<void> {\n return (await this.host()).click()\n }\n\n /** Gets whether the tooltip is currently visible */\n async isTooltipVisible(): Promise<boolean> {\n const tooltipId = await this._getTooltipId()\n if (!tooltipId) {\n return false\n }\n const tooltip = await this.documentRootLocatorFactory().locatorForOptional(\n `#${tooltipId}.tooltip.show`,\n )()\n return tooltip !== null\n }\n\n /** Gets the visible tooltip text content */\n async getVisibleTooltipText(): Promise<string | null> {\n const tooltipId = await this._getTooltipId()\n if (!tooltipId) {\n return null\n }\n const tooltipInner =\n await this.documentRootLocatorFactory().locatorForOptional(\n `#${tooltipId} .tooltip-inner`,\n )()\n if (!tooltipInner) {\n return null\n }\n return tooltipInner.text()\n }\n\n /** Gets the visible tooltip classes */\n async getVisibleTooltipClasses(): Promise<string[]> {\n const tooltipId = await this._getTooltipId()\n if (!tooltipId) {\n return []\n }\n const tooltip = await this.documentRootLocatorFactory().locatorForOptional(\n `#${tooltipId}.tooltip.show`,\n )()\n if (!tooltip) {\n return []\n }\n const classAttr = await tooltip.getAttribute('class')\n return classAttr ? classAttr.split(' ').filter((c) => c.trim()) : []\n }\n\n /** Gets the tooltip ID from the aria-describedby attribute */\n private async _getTooltipId(): Promise<string | null> {\n return (await this.host()).getAttribute('aria-describedby')\n }\n\n /** Waits for the tooltip to appear */\n async waitForTooltipToShow(timeout: number = 1000): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < timeout) {\n if (await this.isTooltipVisible()) {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 50))\n }\n throw new Error(`Tooltip did not appear within ${timeout}ms`)\n }\n\n /** Waits for the tooltip to disappear */\n async waitForTooltipToHide(timeout: number = 1000): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < timeout) {\n if (!(await this.isTooltipVisible())) {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 50))\n }\n throw new Error(`Tooltip did not hide within ${timeout}ms`)\n }\n\n async getTriggerDimensions(): Promise<ElementDimensions | null> {\n const host = await this.host()\n return host.getDimensions()\n }\n\n async getTooltipDimensions(): Promise<ElementDimensions | null> {\n const tooltipId = await this._getTooltipId()\n if (!tooltipId) {\n return null\n }\n const tooltip = await this.documentRootLocatorFactory().locatorForOptional(\n `#${tooltipId}.tooltip.show`,\n )()\n if (!tooltip) {\n return null\n }\n return tooltip.getDimensions()\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-tooltip.mjs","sources":["../../../projects/ui-common/tooltip/tooltip.component.ts","../../../projects/ui-common/tooltip/tooltip.component.html","../../../projects/ui-common/tooltip/tooltip.directive.ts","../../../projects/ui-common/tooltip/tooltip.module.ts","../../../projects/ui-common/tooltip/theseam-ui-common-tooltip.ts"],"sourcesContent":["import {\n AnimationEvent,\n transition,\n trigger,\n style,\n animate,\n} from '@angular/animations'\nimport { NgClass, NgIf, NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n OnDestroy,\n TemplateRef,\n ViewChild,\n} from '@angular/core'\nimport { Subject } from 'rxjs'\n\nexport type TheSeamTooltipPlacement =\n | 'top'\n | 'top-left'\n | 'top-right'\n | 'bottom'\n | 'bottom-left'\n | 'bottom-right'\n | 'left'\n | 'left-top'\n | 'left-bottom'\n | 'right'\n | 'right-top'\n | 'right-bottom'\n | 'auto'\n\n@Component({\n selector: 'seam-tooltip',\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n animations: [\n trigger('fadeInOut', [\n transition(':enter', [\n style({ opacity: 0 }),\n animate('150ms ease-out', style({ opacity: 0.9 })),\n ]),\n transition(':leave', [\n style({ opacity: 0.9 }),\n animate('150ms ease-in', style({ opacity: 0 })),\n ]),\n ]),\n ],\n host: {\n class: 'tooltip show',\n '[id]': 'tooltipId',\n '[@fadeInOut]': '',\n '(@fadeInOut.start)': '_onAnimationStart($event)',\n '(@fadeInOut.done)': '_onAnimationDone($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgIf, NgClass, NgTemplateOutlet],\n})\nexport class TheSeamTooltipComponent implements OnDestroy {\n @Input() content: string | TemplateRef<any> | null = null\n @Input() tooltipClass?: string\n @Input() context?: any\n @Input() placement: TheSeamTooltipPlacement = 'top'\n @Input() actualPlacement?: TheSeamTooltipPlacement // The actual placement determined by CDK Overlay\n @Input() tooltipId?: string\n @Input() triggerElement?: HTMLElement\n\n /** A subject emitting after the tooltip enters the view. */\n readonly _afterEnter = new Subject<void>()\n\n /** A subject emitting after the tooltip exits the view. */\n readonly _afterExit = new Subject<void>()\n\n @HostBinding('class')\n get hostClasses(): string {\n const baseClass = 'tooltip show'\n const placementClass = this._getPlacementClass()\n this._setArrowPosition()\n return `${baseClass} ${placementClass}`\n }\n\n @ViewChild('inner', { static: true }) innerElement!: ElementRef\n @ViewChild('arrow', { static: true }) arrowElement!: ElementRef\n\n ngOnDestroy() {\n this._afterEnter.complete()\n this._afterExit.complete()\n }\n\n get isStringContent(): boolean {\n return typeof this.content === 'string'\n }\n\n get isTemplateContent(): boolean {\n return this.content instanceof TemplateRef\n }\n\n get templateContent(): TemplateRef<any> | null {\n return this.isTemplateContent ? (this.content as TemplateRef<any>) : null\n }\n\n private _getPlacementClass(): string {\n // Use actualPlacement if available, otherwise fall back to initial placement\n const effectivePlacement = this.actualPlacement || this.placement\n\n switch (effectivePlacement) {\n case 'top':\n case 'top-left':\n case 'top-right':\n return 'bs-tooltip-top'\n case 'bottom':\n case 'bottom-left':\n case 'bottom-right':\n return 'bs-tooltip-bottom'\n case 'left':\n case 'left-top':\n case 'left-bottom':\n return 'bs-tooltip-left'\n case 'right':\n case 'right-top':\n case 'right-bottom':\n return 'bs-tooltip-right'\n case 'auto':\n return 'bs-tooltip-auto'\n default:\n return 'bs-tooltip-top'\n }\n }\n\n private _setArrowPosition() {\n if (!this.innerElement || !this.arrowElement || !this.triggerElement) {\n return\n }\n\n // Use actualPlacement if available, otherwise fall back to initial placement\n const effectivePlacement = this.actualPlacement || this.placement\n const paddingOffset = 8 // Default padding offset for arrow positioning\n const minDimension = 50 // Minimum tooltip width/height to use trigger-aligned positioning\n\n const triggerRect = this.triggerElement.getBoundingClientRect()\n const tooltipRect: DOMRect =\n this.innerElement.nativeElement.getBoundingClientRect()\n const arrowRect: DOMRect =\n this.arrowElement.nativeElement.getBoundingClientRect()\n\n // Default arrow offset (8px padding + half arrow size)\n const defaultArrowOffset =\n paddingOffset +\n (effectivePlacement.startsWith('top') ||\n effectivePlacement.startsWith('bottom')\n ? arrowRect.width / 2\n : arrowRect.height / 2)\n\n if (\n effectivePlacement.startsWith('top') ||\n effectivePlacement.startsWith('bottom')\n ) {\n // Check if tooltip is too narrow for trigger-aligned positioning\n if (tooltipRect.width < minDimension) {\n const arrowLeft = (tooltipRect.width - arrowRect.width) / 2\n this.arrowElement.nativeElement.style.left = `${arrowLeft}px`\n return\n }\n\n // Horizontal arrow positioning for top-* and bottom-* placements\n const triggerCenter = triggerRect.left + triggerRect.width / 2\n const adjustedArrowLeft =\n triggerCenter - tooltipRect.left - arrowRect.width / 2\n const arrowCenter =\n tooltipRect.left + adjustedArrowLeft + arrowRect.width / 2\n\n // If arrow's center is outside trigger's horizontal bounds, use default\n if (arrowCenter < triggerRect.left || arrowCenter > triggerRect.right) {\n this.arrowElement.nativeElement.style.left = `${defaultArrowOffset}px`\n return\n }\n\n // Ensure arrow's left is within rounded corner bounds\n const maxArrowLeft =\n tooltipRect.width - arrowRect.width - defaultArrowOffset\n const arrowLeft = Math.min(\n maxArrowLeft,\n Math.max(defaultArrowOffset, adjustedArrowLeft),\n )\n\n this.arrowElement.nativeElement.style.left = `${arrowLeft}px`\n } else if (\n effectivePlacement.startsWith('left') ||\n effectivePlacement.startsWith('right')\n ) {\n // Check if tooltip is too short for trigger-aligned positioning\n if (tooltipRect.height < minDimension) {\n const arrowTop = (tooltipRect.height - arrowRect.height) / 2\n this.arrowElement.nativeElement.style.top = `${arrowTop}px`\n return\n }\n\n // Vertical arrow positioning for left-* and right-* placements\n const triggerCenter = triggerRect.top + triggerRect.height / 2\n const adjustedArrowTop =\n triggerCenter - tooltipRect.top - arrowRect.height / 2\n const arrowCenter =\n tooltipRect.top + adjustedArrowTop + arrowRect.height / 2\n\n // If arrow's center is outside trigger's vertical bounds, use default\n if (arrowCenter < triggerRect.top || arrowCenter > triggerRect.bottom) {\n this.arrowElement.nativeElement.style.top = `${defaultArrowOffset}px`\n return\n }\n\n // Ensure arrow's top is within rounded corner bounds\n const maxArrowTop =\n tooltipRect.height - arrowRect.height - defaultArrowOffset\n const arrowTop = Math.min(\n maxArrowTop,\n Math.max(defaultArrowOffset, adjustedArrowTop),\n )\n\n this.arrowElement.nativeElement.style.top = `${arrowTop}px`\n }\n }\n\n /** Emit lifecycle events based on animation `start` callback. */\n _onAnimationStart(event: AnimationEvent) {\n // Animation start handling if needed\n }\n\n /** Emit lifecycle events based on animation `done` callback. */\n _onAnimationDone(event: AnimationEvent) {\n if (event.toState === 'void') {\n this._afterExit.next()\n this._afterExit.complete()\n } else {\n this._afterEnter.next()\n this._afterEnter.complete()\n }\n }\n}\n","<div #inner class=\"tooltip-inner\" [ngClass]=\"tooltipClass\">\n <!-- String content -->\n <span *ngIf=\"isStringContent\">{{ content }}</span>\n\n <!-- Template content -->\n <ng-container *ngIf=\"isTemplateContent\">\n <ng-container\n *ngTemplateOutlet=\"templateContent; context: context\"\n ></ng-container>\n </ng-container>\n</div>\n<div #arrow class=\"arrow\"></div>\n","import {\n coerceBooleanProperty,\n coerceNumberProperty,\n} from '@angular/cdk/coercion'\nimport { ESCAPE } from '@angular/cdk/keycodes'\nimport {\n ConnectionPositionPair,\n FlexibleConnectedPositionStrategy,\n Overlay,\n OverlayRef,\n} from '@angular/cdk/overlay'\nimport { ComponentPortal } from '@angular/cdk/portal'\nimport {\n ComponentRef,\n Directive,\n ElementRef,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core'\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs'\nimport { takeUntil, filter } from 'rxjs/operators'\n\nimport {\n TheSeamTooltipComponent,\n TheSeamTooltipPlacement,\n} from './tooltip.component'\n\nexport type TheSeamTooltipTrigger = 'hover' | 'focus' | 'both'\nexport type TheSeamTooltipPlacementInput =\n | TheSeamTooltipPlacement\n | TheSeamTooltipPlacement[]\n | string\n\n/**\n * A custom tooltip directive that replaces \\`ngbTooltip\\` with zero dependencies.\n * Supports both string and template content with full Bootstrap 4.6 compatibility.\n *\n * ## Features\n * - **String & Template Content**: Support for both simple text and complex HTML content\n * - **Multiple Triggers**: Hover, focus, or both\n * - **Flexible Positioning**: 12 placement options with auto-fallback\n * - **Configurable Timing**: Customizable show/hide delays\n * - **Bootstrap Compatible**: Uses Bootstrap 4.6 classes for seamless integration\n * - **Accessibility**: Full ARIA support and keyboard navigation\n * - **Performance**: Lazy creation and proper cleanup\n *\n * ## Migration from ngbTooltip\n * ```typescript\n * // Before\n * <button ngbTooltip=\"Help text\" placement=\"top\" tooltipClass=\"custom\">\n *\n * // After\n * <button seamTooltip=\"Help text\" placement=\"top\" tooltipClass=\"custom\">\n * ```\n */\n@Directive({\n selector: '[seamTooltip]',\n host: {\n '[attr.aria-describedby]': 'tooltipOpen() ? _tooltipId : null',\n },\n exportAs: 'seamTooltip',\n})\nexport class TheSeamTooltipDirective implements OnInit, OnChanges, OnDestroy {\n private readonly _elementRef = inject(ElementRef<HTMLElement>)\n private readonly _viewContainerRef = inject(ViewContainerRef)\n private readonly _overlay = inject(Overlay)\n\n private readonly _ngUnsubscribe = new Subject<void>()\n private readonly _tooltipId = `seam-tooltip-${Math.random().toString(36).slice(2, 11)}`\n\n @Input() seamTooltip: string | TemplateRef<any> | null = null\n\n @Input() tooltipClass?: string\n\n @Input() placement?: TheSeamTooltipPlacementInput | null = 'top'\n\n @Input() container?: string | HTMLElement\n\n @Input()\n get disableTooltip() {\n return this._disableTooltip.value\n }\n set disableTooltip(val: boolean) {\n this._disableTooltip.next(coerceBooleanProperty(val))\n }\n private readonly _disableTooltip = new BehaviorSubject<boolean>(false)\n\n @Input()\n get showDelay() {\n return this._showDelay.value\n }\n set showDelay(val: number) {\n this._showDelay.next(coerceNumberProperty(val, 500))\n }\n private readonly _showDelay = new BehaviorSubject<number>(500)\n\n @Input()\n get hideDelay() {\n return this._hideDelay.value\n }\n set hideDelay(val: number) {\n this._hideDelay.next(coerceNumberProperty(val, 0))\n }\n private readonly _hideDelay = new BehaviorSubject<number>(0)\n\n @Input() trigger: TheSeamTooltipTrigger = 'both'\n\n private _active = false\n private _overlayRef: OverlayRef | null = null\n private _compRef: ComponentRef<TheSeamTooltipComponent> | null = null\n private _showTimeoutId: any = null\n private _hideTimeoutId: any = null\n private _eventListenersSubject = new Subject<void>()\n private _documentKeydownSubject = new Subject<void>()\n\n ngOnInit() {\n this._setupEventListeners()\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Re-setup event listeners if trigger changes\n if (changes['trigger'] && !changes['trigger'].firstChange) {\n // Clear any pending timeouts\n this._clearTimeouts()\n // Close any existing tooltip first\n this._closeTooltip()\n // Re-setup event listeners with new trigger\n this._setupEventListeners()\n }\n }\n\n ngOnDestroy() {\n this._clearTimeouts()\n this._closeTooltip()\n this._eventListenersSubject.next()\n this._eventListenersSubject.complete()\n this._documentKeydownSubject.next()\n this._documentKeydownSubject.complete()\n this._ngUnsubscribe.next()\n this._ngUnsubscribe.complete()\n }\n\n private _setupEventListeners() {\n // Clean up existing event listeners\n this._eventListenersSubject.next()\n this._eventListenersSubject.complete()\n this._eventListenersSubject = new Subject<void>()\n\n const element = this._elementRef.nativeElement\n\n // Mouse events for hover trigger\n if (this.trigger === 'hover' || this.trigger === 'both') {\n fromEvent(element, 'mouseenter')\n .pipe(\n filter(() => !this._disableTooltip.value && !!this.seamTooltip),\n takeUntil(this._eventListenersSubject),\n )\n .subscribe(() => this._scheduleShow())\n\n fromEvent(element, 'mouseleave')\n .pipe(takeUntil(this._eventListenersSubject))\n .subscribe(() => this._scheduleHide())\n }\n\n // Focus events for focus trigger\n if (this.trigger === 'focus' || this.trigger === 'both') {\n fromEvent(element, 'focus')\n .pipe(\n filter(() => !this._disableTooltip.value && !!this.seamTooltip),\n takeUntil(this._eventListenersSubject),\n )\n .subscribe(() => this._scheduleShow())\n\n fromEvent(element, 'blur')\n .pipe(takeUntil(this._eventListenersSubject))\n .subscribe(() => this._scheduleHide())\n }\n }\n\n private _scheduleShow() {\n this._clearTimeouts()\n\n if (this._active) {\n return\n }\n\n this._showTimeoutId = setTimeout(() => {\n this._showTooltip()\n }, this.showDelay)\n }\n\n private _scheduleHide() {\n this._clearTimeouts()\n\n if (!this._active) {\n return\n }\n\n this._hideTimeoutId = setTimeout(() => {\n this._closeTooltip()\n }, this.hideDelay)\n }\n\n private _clearTimeouts() {\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId)\n this._showTimeoutId = null\n }\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId)\n this._hideTimeoutId = null\n }\n }\n\n private _showTooltip(): void {\n if (this._active || !this.seamTooltip || this._disableTooltip.value) {\n return\n }\n\n this._active = true\n\n const positionStrategy = this._getOverlayPosition()\n this._overlayRef = this._overlay.create({\n positionStrategy,\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n })\n\n this._compRef = this._overlayRef.attach(\n new ComponentPortal(TheSeamTooltipComponent, this._viewContainerRef),\n )\n\n // Set component properties\n const parsedPlacements = this._parsePlacementInput(this.placement)\n this._compRef.instance.content = this.seamTooltip\n this._compRef.instance.tooltipClass = this.tooltipClass\n this._compRef.instance.placement = parsedPlacements[0] || 'top' // Use first placement for initial display\n this._compRef.instance.tooltipId = this._tooltipId\n this._compRef.instance.triggerElement = this._elementRef.nativeElement\n this._compRef.changeDetectorRef.markForCheck()\n\n // Listen for position changes to update placement class\n positionStrategy.positionChanges\n .pipe(takeUntil(this._ngUnsubscribe))\n .subscribe((positionChange) => {\n if (this._compRef && positionChange.connectionPair) {\n const actualPlacement = this._getPlacementFromConnectionPair(\n positionChange.connectionPair,\n )\n this._compRef.instance.actualPlacement = actualPlacement\n this._compRef.changeDetectorRef.markForCheck()\n }\n })\n\n // Listen for tooltip exit animation\n this._compRef.instance._afterExit\n .pipe(takeUntil(this._ngUnsubscribe))\n .subscribe(() => {\n // Only detach if still attached (defensive check since _closeTooltip may have already detached)\n if (this._overlayRef?.hasAttached()) {\n this._overlayRef.detach()\n }\n // Ensure cleanup happens even if _closeTooltip didn't run\n if (this._active || this._overlayRef || this._compRef) {\n this._resetTooltip()\n }\n })\n\n // Set up document-level Escape key listener\n this._setupDocumentKeydownListener()\n }\n\n private _setupDocumentKeydownListener(): void {\n // Clean up any existing document listener\n this._documentKeydownSubject.next()\n this._documentKeydownSubject.complete()\n this._documentKeydownSubject = new Subject<void>()\n\n // Set up document-level Escape key listener\n fromEvent<KeyboardEvent>(document, 'keydown')\n .pipe(\n filter((event) => {\n // Check both keyCode and key for better compatibility\n return (\n (event.keyCode === ESCAPE || event.key === 'Escape') && this._active\n )\n }),\n takeUntil(this._documentKeydownSubject),\n takeUntil(this._ngUnsubscribe),\n )\n .subscribe(() => this._closeTooltip())\n }\n\n private _closeTooltip(): void {\n if (!this._active || !this._compRef) {\n return\n }\n\n // Mark as inactive immediately to prevent new tooltips from being blocked\n this._active = false\n\n // Clean up document listener\n this._documentKeydownSubject.next()\n\n // Immediately clean up for tests (when using NoopAnimationsModule)\n // In real usage, this will be handled by the animation callback\n this._resetTooltip()\n }\n\n private _resetTooltip(): void {\n this._active = false\n\n // Dispose of overlay if it exists and hasn't been disposed already\n if (this._overlayRef) {\n if (this._overlayRef.hasAttached()) {\n this._overlayRef.detach()\n }\n this._overlayRef.dispose()\n this._overlayRef = null\n }\n\n this._compRef = null\n }\n\n public tooltipOpen(): boolean {\n return this._active && this._compRef !== null\n }\n\n private _parsePlacementInput(\n placement?: TheSeamTooltipPlacementInput | null,\n ): TheSeamTooltipPlacement[] {\n if (placement === undefined || placement === null) {\n return ['top'] // Default placement\n }\n\n if (typeof placement === 'string') {\n if (placement === 'auto') {\n return ['auto']\n }\n // Parse space-delimited string\n const placements = placement.split(/\\s+/).filter((p) => p.trim())\n return placements.filter((p) =>\n this._isValidPlacement(p),\n ) as TheSeamTooltipPlacement[]\n }\n\n if (Array.isArray(placement)) {\n return placement.filter((p) => this._isValidPlacement(p))\n }\n\n return [placement]\n }\n\n private _isValidPlacement(\n placement: string,\n ): placement is TheSeamTooltipPlacement {\n const validPlacements: TheSeamTooltipPlacement[] = [\n 'top',\n 'top-left',\n 'top-right',\n 'bottom',\n 'bottom-left',\n 'bottom-right',\n 'left',\n 'left-top',\n 'left-bottom',\n 'right',\n 'right-top',\n 'right-bottom',\n 'auto',\n ]\n return validPlacements.includes(placement as TheSeamTooltipPlacement)\n }\n\n private _getOverlayPosition(): FlexibleConnectedPositionStrategy {\n const positions = this._getPositions()\n\n return this._overlay\n .position()\n .flexibleConnectedTo(this._elementRef)\n .withPositions(positions)\n .withFlexibleDimensions(false)\n .withPush(true)\n }\n\n private _getPositions(): ConnectionPositionPair[] {\n const parsedPlacements = this._parsePlacementInput(this.placement)\n\n // If 'auto' is specified or no valid placements, return all positions\n if (parsedPlacements.includes('auto') || parsedPlacements.length === 0) {\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n },\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n },\n ]\n }\n\n // Return positions for specified placements only\n const positions: ConnectionPositionPair[] = []\n\n for (const placement of parsedPlacements) {\n const placementPositions = this._getPositionForPlacement(placement)\n positions.push(...placementPositions)\n }\n\n return positions\n }\n\n private _getPositionForPlacement(\n placement: TheSeamTooltipPlacement,\n ): ConnectionPositionPair[] {\n switch (placement) {\n case 'top':\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n },\n ]\n case 'top-left':\n return [\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]\n case 'top-right':\n return [\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]\n case 'bottom':\n return [\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n },\n ]\n case 'bottom-left':\n return [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]\n case 'bottom-right':\n return [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n ]\n case 'left':\n return [\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n },\n ]\n case 'left-top':\n return [\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top',\n },\n ]\n case 'left-bottom':\n return [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]\n case 'right':\n return [\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n },\n ]\n case 'right-top':\n return [\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]\n case 'right-bottom':\n return [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]\n case 'auto':\n default:\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n },\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n },\n ]\n }\n }\n\n private _getPlacementFromConnectionPair(\n connectionPair: ConnectionPositionPair,\n ): TheSeamTooltipPlacement {\n const { originX, originY, overlayX, overlayY } = connectionPair\n\n // Top placements (overlay below origin)\n if (originY === 'top' && overlayY === 'bottom') {\n if (originX === 'start' && overlayX === 'start') return 'top-left'\n if (originX === 'end' && overlayX === 'end') return 'top-right'\n if (originX === 'center' && overlayX === 'center') return 'top'\n }\n\n // Bottom placements (overlay above origin)\n if (originY === 'bottom' && overlayY === 'top') {\n if (originX === 'start' && overlayX === 'start') return 'bottom-left'\n if (originX === 'end' && overlayX === 'end') return 'bottom-right'\n if (originX === 'center' && overlayX === 'center') return 'bottom'\n }\n\n // Left placements (overlay to the right of origin)\n if (originX === 'start' && overlayX === 'end') {\n if (originY === 'top' && overlayY === 'top') return 'left-top'\n if (originY === 'bottom' && overlayY === 'bottom') return 'left-bottom'\n if (originY === 'center' && overlayY === 'center') return 'left'\n }\n\n // Right placements (overlay to the left of origin)\n if (originX === 'end' && overlayX === 'start') {\n if (originY === 'top' && overlayY === 'top') return 'right-top'\n if (originY === 'bottom' && overlayY === 'bottom') return 'right-bottom'\n if (originY === 'center' && overlayY === 'center') return 'right'\n }\n\n // Default fallback\n return 'top'\n }\n}\n","import { NgModule } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { OverlayModule } from '@angular/cdk/overlay'\n\nimport { TheSeamTooltipComponent } from './tooltip.component'\nimport { TheSeamTooltipDirective } from './tooltip.directive'\n\n@NgModule({\n imports: [\n CommonModule,\n OverlayModule,\n TheSeamTooltipComponent,\n TheSeamTooltipDirective,\n ],\n exports: [TheSeamTooltipDirective],\n})\nexport class TheSeamTooltipModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;MA6Da,uBAAuB,CAAA;IACzB,OAAO,GAAqC,IAAI;AAChD,IAAA,YAAY;AACZ,IAAA,OAAO;IACP,SAAS,GAA4B,KAAK;IAC1C,eAAe,CAA0B;AACzC,IAAA,SAAS;AACT,IAAA,cAAc;;AAGd,IAAA,WAAW,GAAG,IAAI,OAAO,EAAQ;;AAGjC,IAAA,UAAU,GAAG,IAAI,OAAO,EAAQ;AAEzC,IAAA,IACI,WAAW,GAAA;QACb,MAAM,SAAS,GAAG,cAAc;AAChC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAChD,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,cAAc,EAAE;IACzC;AAEsC,IAAA,YAAY;AACZ,IAAA,YAAY;IAElD,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;IAC5B;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;IACzC;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,YAAY,WAAW;IAC5C;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,iBAAiB,GAAI,IAAI,CAAC,OAA4B,GAAG,IAAI;IAC3E;IAEQ,kBAAkB,GAAA;;QAExB,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS;QAEjE,QAAQ,kBAAkB;AACxB,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,gBAAgB;AACzB,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,aAAa;AAClB,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,mBAAmB;AAC5B,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,iBAAiB;AAC1B,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,kBAAkB;AAC3B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,iBAAiB;AAC1B,YAAA;AACE,gBAAA,OAAO,gBAAgB;;IAE7B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACpE;QACF;;QAGA,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS;AACjE,QAAA,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,QAAA,MAAM,YAAY,GAAG,EAAE,CAAA;QAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;QAC/D,MAAM,WAAW,GACf,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE;QACzD,MAAM,SAAS,GACb,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE;;QAGzD,MAAM,kBAAkB,GACtB,aAAa;AACb,aAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC;AACrC,gBAAA,kBAAkB,CAAC,UAAU,CAAC,QAAQ;AACpC,kBAAE,SAAS,CAAC,KAAK,GAAG;AACpB,kBAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAE3B,QAAA,IACE,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC;AACpC,YAAA,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,EACvC;;AAEA,YAAA,IAAI,WAAW,CAAC,KAAK,GAAG,YAAY,EAAE;AACpC,gBAAA,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,CAAC;AAC3D,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,SAAS,CAAA,EAAA,CAAI;gBAC7D;YACF;;YAGA,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;AAC9D,YAAA,MAAM,iBAAiB,GACrB,aAAa,GAAG,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC;AACxD,YAAA,MAAM,WAAW,GACf,WAAW,CAAC,IAAI,GAAG,iBAAiB,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC;;AAG5D,YAAA,IAAI,WAAW,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE;AACrE,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,kBAAkB,CAAA,EAAA,CAAI;gBACtE;YACF;;YAGA,MAAM,YAAY,GAChB,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,kBAAkB;AAC1D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,YAAY,EACZ,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAChD;AAED,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,SAAS,CAAA,EAAA,CAAI;QAC/D;AAAO,aAAA,IACL,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC;AACrC,YAAA,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,EACtC;;AAEA,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,YAAY,EAAE;AACrC,gBAAA,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC;AAC5D,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAI;gBAC3D;YACF;;YAGA,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;AAC9D,YAAA,MAAM,gBAAgB,GACpB,aAAa,GAAG,WAAW,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;AACxD,YAAA,MAAM,WAAW,GACf,WAAW,CAAC,GAAG,GAAG,gBAAgB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;;AAG3D,YAAA,IAAI,WAAW,GAAG,WAAW,CAAC,GAAG,IAAI,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE;AACrE,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,kBAAkB,CAAA,EAAA,CAAI;gBACrE;YACF;;YAGA,MAAM,WAAW,GACf,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,kBAAkB;AAC5D,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,WAAW,EACX,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAC/C;AAED,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAI;QAC7D;IACF;;AAGA,IAAA,iBAAiB,CAAC,KAAqB,EAAA;;IAEvC;;AAGA,IAAA,gBAAgB,CAAC,KAAqB,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;QAC5B;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC7B;IACF;wGAlLW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7DpC,0YAYA,EAAA,MAAA,EAAA,CAAA,2DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED+CY,IAAI,6FAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EApB7B;YACV,OAAO,CAAC,WAAW,EAAE;gBACnB,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;iBACnD,CAAC;gBACF,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;oBACvB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;iBAChD,CAAC;aACH,CAAC;AACH,SAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAWU,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA1BnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EAGZ;wBACV,OAAO,CAAC,WAAW,EAAE;4BACnB,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gCACrB,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;6BACnD,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;gCACvB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;6BAChD,CAAC;yBACH,CAAC;qBACH,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,cAAc;AACrB,wBAAA,MAAM,EAAE,WAAW;AACnB,wBAAA,cAAc,EAAE,EAAE;AAClB,wBAAA,oBAAoB,EAAE,2BAA2B;AACjD,wBAAA,mBAAmB,EAAE,0BAA0B;qBAChD,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,0YAAA,EAAA,MAAA,EAAA,CAAA,2DAAA,CAAA,EAAA;;sBAGzC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAQA,WAAW;uBAAC,OAAO;;sBAQnB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBACnC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;AE9CtC;;;;;;;;;;;;;;;;;;;;;AAqBG;MAQU,uBAAuB,CAAA;AACjB,IAAA,WAAW,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC7C,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC5C,IAAA,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAE1B,IAAA,cAAc,GAAG,IAAI,OAAO,EAAQ;AACpC,IAAA,UAAU,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;IAE9E,WAAW,GAAqC,IAAI;AAEpD,IAAA,YAAY;IAEZ,SAAS,GAAyC,KAAK;AAEvD,IAAA,SAAS;AAElB,IAAA,IACI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK;IACnC;IACA,IAAI,cAAc,CAAC,GAAY,EAAA;QAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACvD;AACiB,IAAA,eAAe,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAEtE,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK;IAC9B;IACA,IAAI,SAAS,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD;AACiB,IAAA,UAAU,GAAG,IAAI,eAAe,CAAS,GAAG,CAAC;AAE9D,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK;IAC9B;IACA,IAAI,SAAS,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD;AACiB,IAAA,UAAU,GAAG,IAAI,eAAe,CAAS,CAAC,CAAC;IAEnD,OAAO,GAA0B,MAAM;IAExC,OAAO,GAAG,KAAK;IACf,WAAW,GAAsB,IAAI;IACrC,QAAQ,GAAiD,IAAI;IAC7D,cAAc,GAAQ,IAAI;IAC1B,cAAc,GAAQ,IAAI;AAC1B,IAAA,sBAAsB,GAAG,IAAI,OAAO,EAAQ;AAC5C,IAAA,uBAAuB,GAAG,IAAI,OAAO,EAAQ;IAErD,QAAQ,GAAA;QACN,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;;AAEhC,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;;YAEzD,IAAI,CAAC,cAAc,EAAE;;YAErB,IAAI,CAAC,aAAa,EAAE;;YAEpB,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE;AACtC,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;AACnC,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAChC;IAEQ,oBAAoB,GAAA;;AAE1B,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE;AACtC,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,OAAO,EAAQ;AAEjD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;;AAG9C,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE;AACvD,YAAA,SAAS,CAAC,OAAO,EAAE,YAAY;iBAC5B,IAAI,CACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAC/D,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC;iBAEvC,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AAExC,YAAA,SAAS,CAAC,OAAO,EAAE,YAAY;AAC5B,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC;iBAC3C,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C;;AAGA,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE;AACvD,YAAA,SAAS,CAAC,OAAO,EAAE,OAAO;iBACvB,IAAI,CACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAC/D,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC;iBAEvC,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AAExC,YAAA,SAAS,CAAC,OAAO,EAAE,MAAM;AACtB,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC;iBAC3C,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C;IACF;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;YACpC,IAAI,CAAC,YAAY,EAAE;AACrB,QAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;IACpB;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;YACpC,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;IACpB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;YACnE;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AAEnB,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,EAAE;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtC,gBAAgB;YAChB,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC5D,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACrC,IAAI,eAAe,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CACrE;;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;QAClE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,KAAK,CAAA;QAC/D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;AACtE,QAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,EAAE;;AAG9C,QAAA,gBAAgB,CAAC;AACd,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;AACnC,aAAA,SAAS,CAAC,CAAC,cAAc,KAAI;YAC5B,IAAI,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,cAAc,EAAE;gBAClD,MAAM,eAAe,GAAG,IAAI,CAAC,+BAA+B,CAC1D,cAAc,CAAC,cAAc,CAC9B;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,GAAG,eAAe;AACxD,gBAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,EAAE;YAChD;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACpB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;aACnC,SAAS,CAAC,MAAK;;AAEd,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE;AACnC,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;;AAEA,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACrD,IAAI,CAAC,aAAa,EAAE;YACtB;AACF,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,6BAA6B,EAAE;IACtC;IAEQ,6BAA6B,GAAA;;AAEnC,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;AACnC,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;AACvC,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,OAAO,EAAQ;;AAGlD,QAAA,SAAS,CAAgB,QAAQ,EAAE,SAAS;AACzC,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAI;;AAEf,YAAA,QACE,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,KAAK,IAAI,CAAC,OAAO;AAExE,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,EACvC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;aAE/B,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC1C;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACnC;QACF;;AAGA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;AAGpB,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;;;QAInC,IAAI,CAAC,aAAa,EAAE;IACtB;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;AAGpB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE;AAClC,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACzB;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEO,WAAW,GAAA;QAChB,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;IAC/C;AAEQ,IAAA,oBAAoB,CAC1B,SAA+C,EAAA;QAE/C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE;AACjD,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB;AAEA,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,SAAS,KAAK,MAAM,EAAE;gBACxB,OAAO,CAAC,MAAM,CAAC;YACjB;;YAEA,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACjE,YAAA,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KACzB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CACG;QAChC;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AAC5B,YAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC3D;QAEA,OAAO,CAAC,SAAS,CAAC;IACpB;AAEQ,IAAA,iBAAiB,CACvB,SAAiB,EAAA;AAEjB,QAAA,MAAM,eAAe,GAA8B;YACjD,KAAK;YACL,UAAU;YACV,WAAW;YACX,QAAQ;YACR,aAAa;YACb,cAAc;YACd,MAAM;YACN,UAAU;YACV,aAAa;YACb,OAAO;YACP,WAAW;YACX,cAAc;YACd,MAAM;SACP;AACD,QAAA,OAAO,eAAe,CAAC,QAAQ,CAAC,SAAoC,CAAC;IACvE;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;QAEtC,OAAO,IAAI,CAAC;AACT,aAAA,QAAQ;AACR,aAAA,mBAAmB,CAAC,IAAI,CAAC,WAAW;aACpC,aAAa,CAAC,SAAS;aACvB,sBAAsB,CAAC,KAAK;aAC5B,QAAQ,CAAC,IAAI,CAAC;IACnB;IAEQ,aAAa,GAAA;QACnB,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGlE,QAAA,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;YACtE,OAAO;AACL,gBAAA;AACE,oBAAA,OAAO,EAAE,QAAQ;AACjB,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,QAAQ,EAAE,QAAQ;AACnB,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE,QAAQ;AACjB,oBAAA,OAAO,EAAE,QAAQ;AACjB,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,QAAQ,EAAE,KAAK;AAChB,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,OAAO,EAAE,QAAQ;AACjB,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,QAAQ,EAAE,QAAQ;AACnB,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE,OAAO;AAChB,oBAAA,OAAO,EAAE,QAAQ;AACjB,oBAAA,QAAQ,EAAE,KAAK;AACf,oBAAA,QAAQ,EAAE,QAAQ;AACnB,iBAAA;aACF;QACH;;QAGA,MAAM,SAAS,GAA6B,EAAE;AAE9C,QAAA,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE;YACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC;AACnE,YAAA,SAAS,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC;QACvC;AAEA,QAAA,OAAO,SAAS;IAClB;AAEQ,IAAA,wBAAwB,CAC9B,SAAkC,EAAA;QAElC,QAAQ,SAAS;AACf,YAAA,KAAK,KAAK;gBACR,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,UAAU;gBACb,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,WAAW;gBACd,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,QAAQ;gBACX,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA;iBACF;AACH,YAAA,KAAK,aAAa;gBAChB,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA;iBACF;AACH,YAAA,KAAK,cAAc;gBACjB,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA;iBACF;AACH,YAAA,KAAK,MAAM;gBACT,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,UAAU;gBACb,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA;iBACF;AACH,YAAA,KAAK,aAAa;gBAChB,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,OAAO;gBACV,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,WAAW;gBACd,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA;iBACF;AACH,YAAA,KAAK,cAAc;gBACjB,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;AACH,YAAA,KAAK,MAAM;AACX,YAAA;gBACE,OAAO;AACL,oBAAA;AACE,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;AACD,oBAAA;AACE,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,QAAQ,EAAE,KAAK;AAChB,qBAAA;AACD,oBAAA;AACE,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;AACD,oBAAA;AACE,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,OAAO,EAAE,QAAQ;AACjB,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;iBACF;;IAEP;AAEQ,IAAA,+BAA+B,CACrC,cAAsC,EAAA;QAEtC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,cAAc;;QAG/D,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,EAAE;AAC9C,YAAA,IAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AAAE,gBAAA,OAAO,UAAU;AAClE,YAAA,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAE,gBAAA,OAAO,WAAW;AAC/D,YAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,KAAK;QACjE;;QAGA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC9C,YAAA,IAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AAAE,gBAAA,OAAO,aAAa;AACrE,YAAA,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAE,gBAAA,OAAO,cAAc;AAClE,YAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,QAAQ;QACpE;;QAGA,IAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC7C,YAAA,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAE,gBAAA,OAAO,UAAU;AAC9D,YAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,aAAa;AACvE,YAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,MAAM;QAClE;;QAGA,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,OAAO,EAAE;AAC7C,YAAA,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAE,gBAAA,OAAO,WAAW;AAC/D,YAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,cAAc;AACxE,YAAA,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,gBAAA,OAAO,OAAO;QACnE;;AAGA,QAAA,OAAO,KAAK;IACd;wGAhiBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,mCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE;AACJ,wBAAA,yBAAyB,EAAE,mCAAmC;AAC/D,qBAAA;AACD,oBAAA,QAAQ,EAAE,aAAa;AACxB,iBAAA;;sBASE;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBASA;;sBASA;;sBASA;;;MC/FU,oBAAoB,CAAA;wGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAP7B,YAAY;YACZ,aAAa;YACb,uBAAuB;AACvB,YAAA,uBAAuB,aAEf,uBAAuB,CAAA,EAAA,CAAA;AAEtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAP7B,YAAY;YACZ,aAAa,CAAA,EAAA,CAAA;;4FAMJ,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAThC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,aAAa;wBACb,uBAAuB;wBACvB,uBAAuB;AACxB,qBAAA;oBACD,OAAO,EAAE,CAAC,uBAAuB,CAAC;AACnC,iBAAA;;;ACfD;;AAEG;;;;"}
@@ -1,10 +1,11 @@
1
1
  import { switchMap, startWith, map, distinctUntilChanged, mapTo, filter, take, pairwise, toArray, tap, auditTime, share } from 'rxjs/operators';
2
2
  import { of, merge, interval, from, combineLatest, Observable, isObservable, Subject, BehaviorSubject, EMPTY } from 'rxjs';
3
3
  import area from '@turf/area';
4
- import { convertArea } from '@turf/helpers';
4
+ import { convertArea, polygon } from '@turf/helpers';
5
5
  import kinks from '@turf/kinks';
6
6
  import { fileTypeFromBuffer } from 'file-type';
7
- import shp from 'shpjs';
7
+ import { parseShp, parseZip } from 'shpjs';
8
+ import booleanContains from '@turf/boolean-contains';
8
9
 
9
10
  /**
10
11
  *
@@ -476,6 +477,18 @@ function notNullOrUndefined(value) {
476
477
  return value !== null && value !== undefined;
477
478
  }
478
479
 
480
+ /**
481
+ * Checks if a single polygon ring's coordinate count violates the given
482
+ * min/max point bounds. `max` is only applied when it is greater than `min`.
483
+ */
484
+ function polygonViolatesMinMax(coordinateLength, min, max) {
485
+ if (coordinateLength < min ||
486
+ (notNullOrUndefined(max) && max > min && coordinateLength > max)) {
487
+ return true;
488
+ }
489
+ return false;
490
+ }
491
+
479
492
  const MIN_MAX_POINTS_VALIDATOR_NAME = 'min-max-points';
480
493
  function minMaxPointsValidator(min = 3, max) {
481
494
  return (control) => {
@@ -522,13 +535,6 @@ function collectionViolatesMinMax(featureCollection, min, max) {
522
535
  }
523
536
  return false;
524
537
  }
525
- function polygonViolatesMinMax(coordinateLength, min, max) {
526
- if (coordinateLength < min ||
527
- (notNullOrUndefined(max) && max > min && coordinateLength > max)) {
528
- return true;
529
- }
530
- return false;
531
- }
532
538
 
533
539
  const NO_EMPTY_FEATURE_COLLECTION_VALIDATOR_NAME = 'no-empty-feature-collection';
534
540
  function noEmptyFeatureCollectionValidator() {
@@ -757,7 +763,7 @@ async function coerceToArrayBuffer(fileOrBuffer) {
757
763
  return fileOrBuffer;
758
764
  }
759
765
  async function parseShpFile(buffer) {
760
- const geometries = await shp.parseShp(buffer, undefined);
766
+ const geometries = parseShp(buffer);
761
767
  const featCollection = {
762
768
  type: 'FeatureCollection',
763
769
  features: geometries.map((geom) => ({
@@ -769,7 +775,7 @@ async function parseShpFile(buffer) {
769
775
  return featCollection;
770
776
  }
771
777
  async function parseShpZip(buffer) {
772
- let featCollection = await shp.parseZip(buffer, undefined);
778
+ let featCollection = await parseZip(buffer);
773
779
  if (Array.isArray(featCollection)) {
774
780
  if (featCollection.length === 0) {
775
781
  throw Error(`Shape data not found.`);
@@ -819,11 +825,11 @@ function splitMultPolygon(multiPolygon) {
819
825
  }
820
826
 
821
827
  /**
822
- * Close all polygons in the GeoJSON.
828
+ * Close all polygons in the GeoJSON so the first and last position of every
829
+ * ring are identical.
823
830
  *
824
- * Google Maps requires that polygons be closed, but not all libraries have that
825
- * requirement. This may add redundent points to the GeoJSON, but it will ensure
826
- * that the GeoJSON is valid for Google Maps.
831
+ * Google Maps requires closed polygon rings, but not all libraries produce
832
+ * them. This is idempotent: rings that are already closed are left unchanged.
827
833
  */
828
834
  function closePolygons(geoJson) {
829
835
  if (geoJson.type === 'FeatureCollection') {
@@ -834,6 +840,12 @@ function closePolygons(geoJson) {
834
840
  else if (geoJson.type === 'Feature') {
835
841
  closePolygonsFeature(geoJson);
836
842
  }
843
+ else if (geoJson.type === 'Polygon') {
844
+ closePolygon(geoJson);
845
+ }
846
+ else if (geoJson.type === 'MultiPolygon') {
847
+ closeMultiPolygon(geoJson);
848
+ }
837
849
  }
838
850
  function closePolygonsFeature(feature) {
839
851
  if (feature.geometry.type === 'Polygon') {
@@ -844,17 +856,96 @@ function closePolygonsFeature(feature) {
844
856
  }
845
857
  }
846
858
  function closePolygon(polygon) {
847
- for (const c of polygon.coordinates) {
848
- c.push(c[0]);
859
+ for (const ring of polygon.coordinates) {
860
+ closeRing(ring);
849
861
  }
850
862
  }
851
863
  function closeMultiPolygon(multiPolygon) {
852
- for (const p of multiPolygon.coordinates) {
853
- for (const c of p) {
854
- c.push(c[0]);
864
+ for (const polygon of multiPolygon.coordinates) {
865
+ for (const ring of polygon) {
866
+ closeRing(ring);
855
867
  }
856
868
  }
857
869
  }
870
+ /**
871
+ * Appends the first position to the end of a ring only when it is not already
872
+ * closed. Exact equality is correct here: the closing point is a copy of the
873
+ * first point, so we compare a value against its own copy.
874
+ */
875
+ function closeRing(ring) {
876
+ if (ring.length < 1) {
877
+ return;
878
+ }
879
+ const first = ring[0];
880
+ const last = ring[ring.length - 1];
881
+ if (first[0] === last[0] && first[1] === last[1]) {
882
+ return;
883
+ }
884
+ ring.push([...first]);
885
+ }
886
+
887
+ /** Count distinct vertices in a ring, ignoring an explicit closing point. */
888
+ function distinctVertexCount(ring) {
889
+ if (ring.length === 0) {
890
+ return 0;
891
+ }
892
+ const first = ring[0];
893
+ const last = ring[ring.length - 1];
894
+ const isClosed = ring.length > 1 && first[0] === last[0] && first[1] === last[1];
895
+ return isClosed ? ring.length - 1 : ring.length;
896
+ }
897
+ /**
898
+ * Whether a polygon's outer ring has at least `min` distinct vertices.
899
+ * Ring closure (a repeated first/last point) does not count toward the total,
900
+ * so this behaves the same for closed and unclosed rings.
901
+ */
902
+ function polygonHasMinDistinctVertices(polygon, min = 3) {
903
+ const outer = polygon.coordinates[0] ?? [];
904
+ return !polygonViolatesMinMax(distinctVertexCount(outer), min, undefined);
905
+ }
906
+
907
+ /**
908
+ * Whether `outer` fully contains `inner`, using turf's boolean-contains on the
909
+ * GeoJSON geometries directly (no Google Maps dependency).
910
+ */
911
+ function polygonContains(outer, inner) {
912
+ return booleanContains(polygon(outer.coordinates), polygon(inner.coordinates));
913
+ }
914
+
915
+ /**
916
+ * Whether a ring is wound clockwise, via the shoelace signed-area sign.
917
+ * Sum of (x2 - x1) * (y2 + y1) is positive for clockwise rings in standard
918
+ * (x = lng, y = lat) orientation.
919
+ */
920
+ function ringIsClockwise(ring) {
921
+ let sum = 0;
922
+ for (let i = 0; i < ring.length - 1; i++) {
923
+ const [x1, y1] = ring[i];
924
+ const [x2, y2] = ring[i + 1];
925
+ sum += (x2 - x1) * (y2 + y1);
926
+ }
927
+ return sum > 0;
928
+ }
929
+ /** Return `ring` wound opposite to `reference`, reversing a copy if needed. */
930
+ function ringWoundOpposite(reference, ring) {
931
+ if (ringIsClockwise(reference) === ringIsClockwise(ring)) {
932
+ return [...ring].reverse();
933
+ }
934
+ return [...ring];
935
+ }
936
+ /**
937
+ * Append the outer ring of `hole` to `exterior` as an interior ring (a
938
+ * cutout), wound opposite the exterior ring so it renders as a hole. Returns a
939
+ * new Polygon; inputs are not mutated.
940
+ */
941
+ function addHoleToPolygon(exterior, hole) {
942
+ const exteriorRing = exterior.coordinates[0];
943
+ const holeRing = ringWoundOpposite(exteriorRing, hole.coordinates[0]);
944
+ return {
945
+ type: 'Polygon',
946
+ coordinates: [...exterior.coordinates, holeRing],
947
+ };
948
+ }
858
949
 
859
950
  // Based on source: https://github.com/sindresorhus/array-move/blob/main/index.js
860
951
  /**
@@ -1403,5 +1494,5 @@ function sanitizeFilename(filename, options) {
1403
1494
  * Generated bundle index. Do not edit.
1404
1495
  */
1405
1496
 
1406
- export { IS_FEATURE_COLLECTION_VALIDATOR_NAME, IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME, MIN_MAX_POINTS_VALIDATOR_NAME, NO_EMPTY_FEATURE_COLLECTION_VALIDATOR_NAME, NO_INNER_RINGS_VALIDATOR_NAME, NO_KINKS_VALIDATOR_NAME, PollingTickerOptions, Refreshable, activatedRoutesWithDataProperty, arrayMoveImmutable, arrayMoveMutable, calcPercentage, closePolygons, coerceFeatureCollection, createPadding, deleteProperties, deleteProperty, fileBufferToBlob, fileBufferToObjectUrl, fileDataFromBuffer, fractionalDigitsCount, geoJsonToArea, getAttribute, getClosestWidgetCdkDrag, getControlName, getControlPath, hasAttribute, hasProperty, hasRequiredControl, isAbsoluteUrl, isEmptyInputValue, isEmptyUrlRoute, isFeatureCollectionValidator, isNullOrUndefined, isNullOrUndefinedOrEmpty, isNumeric, isOnlyGeometryTypes, isOnlyGeometryTypesValidator, leafChildRoute, loadStyle, loadStyleSheet, mapEach, mergePolygons, minMaxPointsValidator, noEmptyFeatureCollectionValidator, noInnerRingsValidator, noKinksValidator, notNullOrUndefined, notNullOrUndefinedOrEmpty, observeControlIsDifferent, observeControlStatus, observeControlValid, observeControlValue, observeControlValueChange, observeQueryList, openBlob, padEnd, padStart, phoneNumberMask, pollingTicker, readFileAsDataUrlAsync, readFileAsync, readGeoFile, routeSnapshotPathFull, routeSnapshotPathRelative, sanitizeFilename, splitMultiPolygons, stripOuter, subscriberCount, tapFirst, toggleAttribute, trimRepeated, waitOnConditionAsync, waitOnNonPendingStatus, willHaveDataProp, withoutProperties, withoutProperty, wrapIntoObservable };
1497
+ export { IS_FEATURE_COLLECTION_VALIDATOR_NAME, IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME, MIN_MAX_POINTS_VALIDATOR_NAME, NO_EMPTY_FEATURE_COLLECTION_VALIDATOR_NAME, NO_INNER_RINGS_VALIDATOR_NAME, NO_KINKS_VALIDATOR_NAME, PollingTickerOptions, Refreshable, activatedRoutesWithDataProperty, addHoleToPolygon, arrayMoveImmutable, arrayMoveMutable, calcPercentage, closePolygons, coerceFeatureCollection, createPadding, deleteProperties, deleteProperty, fileBufferToBlob, fileBufferToObjectUrl, fileDataFromBuffer, fractionalDigitsCount, geoJsonToArea, getAttribute, getClosestWidgetCdkDrag, getControlName, getControlPath, hasAttribute, hasProperty, hasRequiredControl, isAbsoluteUrl, isEmptyInputValue, isEmptyUrlRoute, isFeatureCollectionValidator, isNullOrUndefined, isNullOrUndefinedOrEmpty, isNumeric, isOnlyGeometryTypes, isOnlyGeometryTypesValidator, leafChildRoute, loadStyle, loadStyleSheet, mapEach, mergePolygons, minMaxPointsValidator, noEmptyFeatureCollectionValidator, noInnerRingsValidator, noKinksValidator, notNullOrUndefined, notNullOrUndefinedOrEmpty, observeControlIsDifferent, observeControlStatus, observeControlValid, observeControlValue, observeControlValueChange, observeQueryList, openBlob, padEnd, padStart, phoneNumberMask, pollingTicker, polygonContains, polygonHasMinDistinctVertices, polygonViolatesMinMax, readFileAsDataUrlAsync, readFileAsync, readGeoFile, ringIsClockwise, routeSnapshotPathFull, routeSnapshotPathRelative, sanitizeFilename, splitMultiPolygons, stripOuter, subscriberCount, tapFirst, toggleAttribute, trimRepeated, waitOnConditionAsync, waitOnNonPendingStatus, willHaveDataProp, withoutProperties, withoutProperty, wrapIntoObservable };
1407
1498
  //# sourceMappingURL=theseam-ui-common-utils.mjs.map