@testgorilla/tgo-ui 12.2.0 → 12.3.2

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 (85) hide show
  1. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +3 -0
  2. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  3. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +6 -1
  4. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  5. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs +1 -1
  6. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs.map +1 -1
  7. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs +6 -4
  8. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs.map +1 -1
  9. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs +1 -1
  10. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs.map +1 -1
  11. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +3 -0
  12. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  13. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +3 -0
  14. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  15. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +19 -4
  16. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  17. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +3 -0
  18. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  19. package/fesm2022/testgorilla-tgo-ui-components-core.mjs +11 -1
  20. package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
  21. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +7 -1
  22. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  23. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +3 -0
  24. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  25. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +3 -0
  26. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  27. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +8 -2
  28. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  29. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +3 -0
  30. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  31. package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs +12 -3
  32. package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs.map +1 -1
  33. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +6 -2
  34. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  35. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +3 -0
  36. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  37. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +3 -0
  38. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  39. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +6 -0
  40. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  41. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +3 -0
  42. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  43. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +3 -0
  44. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  45. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +250 -50
  46. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
  47. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +4 -0
  48. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  49. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +4 -1
  50. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  51. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs +5 -2
  52. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs.map +1 -1
  53. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +3 -0
  54. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  55. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs +9 -2
  56. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs.map +1 -1
  57. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +89 -7
  58. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  59. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +3 -0
  60. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  61. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +7 -4
  62. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  63. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs +13 -4
  64. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs.map +1 -1
  65. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +3 -0
  66. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  67. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs +1 -1
  68. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs.map +1 -1
  69. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +3 -0
  70. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  71. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +3 -0
  72. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  73. package/mcp/catalog.json +1 -1
  74. package/package.json +2 -2
  75. package/types/testgorilla-tgo-ui-components-alert-banner.d.ts +1 -0
  76. package/types/testgorilla-tgo-ui-components-autocomplete-v2.d.ts +1 -1
  77. package/types/testgorilla-tgo-ui-components-button.d.ts +32 -0
  78. package/types/testgorilla-tgo-ui-components-core.d.ts +1 -0
  79. package/types/testgorilla-tgo-ui-components-field.d.ts +1 -0
  80. package/types/testgorilla-tgo-ui-components-infinite-scroll-table.d.ts +3 -3
  81. package/types/testgorilla-tgo-ui-components-popover.d.ts +51 -5
  82. package/types/testgorilla-tgo-ui-components-radio-button.d.ts +1 -0
  83. package/types/testgorilla-tgo-ui-components-scale.d.ts +1 -0
  84. package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +59 -1
  85. package/types/testgorilla-tgo-ui-components-slider.d.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-popover.mjs","names":[],"sources":["../../../components/popover/popover.component.ts","../../../components/popover/popover.component.html","../../../components/popover/popover.directive.ts"],"sourcesContent":["import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, TemplateRef } from '@angular/core';\n\nimport { CardComponentModule, CardSize } from '@testgorilla/tgo-ui/components/card';\n\n@Component({\n selector: 'ui-popover',\n standalone: true,\n imports: [NgTemplateOutlet, CardComponentModule, CdkTrapFocus],\n templateUrl: './popover.component.html',\n styleUrls: ['./popover.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PopoverComponent {\n templateRef = input<TemplateRef<unknown> | null>(null);\n ctx = input<Record<string, unknown>>({});\n popoverCard = input(true);\n popoverCardSize = input<CardSize>('medium');\n trapFocus = input(false);\n ariaLabel = input('');\n}\n","@if (templateRef()) {\n <div class=\"popover-focus-scope\" [cdkTrapFocus]=\"trapFocus()\" [cdkTrapFocusAutoCapture]=\"trapFocus()\">\n <div\n class=\"popover-surface\"\n [attr.role]=\"trapFocus() ? 'dialog' : null\"\n [attr.aria-label]=\"trapFocus() && ariaLabel() ? ariaLabel() : null\"\n [attr.tabindex]=\"trapFocus() ? '-1' : null\"\n [attr.cdkFocusInitial]=\"trapFocus() ? '' : null\"\n >\n @if (popoverCard()) {\n <ui-card [size]=\"popoverCardSize()\">\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n </ui-card>\n } @else {\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n }\n </div>\n </div>\n}\n","import { HorizontalConnectionPos, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Directive,\n ElementRef,\n HostListener,\n inject,\n Injector,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { CardSize } from '@testgorilla/tgo-ui/components/card';\n\nimport { PopoverComponent } from './popover.component';\nimport { PopoverTrigger } from './popover.model';\n\n@Directive({\n selector: '[uiPopover]',\n exportAs: 'uiPopover',\n standalone: true,\n})\nexport class PopoverDirective implements OnInit, OnDestroy {\n uiPopover = input.required<TemplateRef<unknown>>();\n popoverOffset = input(4);\n popoverAlign = input<HorizontalConnectionPos>('center');\n popoverOpen = input(false);\n popoverCard = input(true);\n popoverCardSize = input<CardSize>('medium');\n popoverTrigger = input<PopoverTrigger>('hover');\n popoverAriaLabel = input('');\n uiPopoverDisabled = input(false);\n\n private readonly openState = signal(false);\n\n /** Whether the popover is currently showing. Read it via `#ref=\"uiPopover\"` or `viewChild(PopoverDirective)`. */\n readonly isOpen = this.openState.asReadonly();\n\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly ngZone = inject(NgZone);\n\n private overlayRef: OverlayRef | null = null;\n private openTimeout: ReturnType<typeof setTimeout> | null = null;\n private closeTimeout: ReturnType<typeof setTimeout> | null = null;\n private overlayListeners: { enter: () => void; leave: () => void } | null = null;\n private dismissSubscriptions: Subscription | null = null;\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.popoverTrigger() !== 'hover' || this.uiPopoverDisabled()) {\n return;\n }\n this.cancelClose();\n this.scheduleOpen();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.popoverTrigger() !== 'hover') {\n return;\n }\n this.cancelOpen();\n this.scheduleClose();\n }\n\n @HostListener('click')\n onClick(): void {\n if (this.popoverTrigger() !== 'click') {\n return;\n }\n this.toggle();\n }\n\n /** Opens the popover. No-op while `uiPopoverDisabled` is `true` or it is already open. */\n open(): void {\n if (this.uiPopoverDisabled()) {\n return;\n }\n\n if (!this.overlayRef) {\n this.createOverlay();\n }\n\n const overlayRef = this.overlayRef;\n if (!overlayRef || overlayRef.hasAttached()) {\n return;\n }\n\n const portal = new ComponentPortal(PopoverComponent, null, this.injector);\n const ref = overlayRef.attach(portal);\n ref.setInput('templateRef', this.uiPopover());\n ref.setInput('ctx', { close: () => this.close() });\n ref.setInput('popoverCard', this.popoverCard());\n ref.setInput('popoverCardSize', this.popoverCardSize());\n ref.setInput('trapFocus', this.popoverTrigger() === 'click');\n ref.setInput('ariaLabel', this.popoverAriaLabel());\n\n if (this.popoverTrigger() === 'hover') {\n const el = overlayRef.overlayElement;\n const enter = (): void => this.ngZone.run(() => this.cancelClose());\n const leave = (): void => this.ngZone.run(() => this.scheduleClose());\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n this.overlayListeners = { enter, leave };\n }\n\n this.openState.set(true);\n }\n\n /** Closes the popover. Safe to call when it is already closed. */\n close(): void {\n if (!this.overlayRef) {\n return;\n }\n\n if (this.overlayListeners) {\n const el = this.overlayRef.overlayElement;\n el.removeEventListener('mouseenter', this.overlayListeners.enter);\n el.removeEventListener('mouseleave', this.overlayListeners.leave);\n this.overlayListeners = null;\n }\n\n this.overlayRef.detach();\n this.openState.set(false);\n }\n\n /** Opens the popover when closed, closes it when open. */\n toggle(): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private createOverlay(): void {\n const align = this.popoverAlign();\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions([\n { originX: align, originY: 'bottom', overlayX: align, overlayY: 'top', offsetY: this.popoverOffset() },\n { originX: align, originY: 'top', overlayX: align, overlayY: 'bottom', offsetY: -this.popoverOffset() },\n ]);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n });\n\n if (this.popoverTrigger() === 'click') {\n this.listenForDismiss(this.overlayRef);\n }\n }\n\n /** Click-triggered popovers dismiss on an outside pointer event or on Escape. */\n private listenForDismiss(overlayRef: OverlayRef): void {\n const subscriptions = new Subscription();\n\n subscriptions.add(\n overlayRef.outsidePointerEvents().subscribe(event => {\n // The anchor's own click handler toggles, so ignore it here to avoid closing and reopening.\n if (this.elementRef.nativeElement.contains(event.target as Node)) {\n return;\n }\n this.close();\n })\n );\n\n subscriptions.add(\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n // cdkTrapFocusAutoCapture restores focus to whatever was focused before the popover opened,\n // so closing is all this has to do.\n this.close();\n })\n );\n\n this.dismissSubscriptions = subscriptions;\n }\n\n private scheduleOpen(): void {\n this.openTimeout = setTimeout(() => this.open(), 100);\n }\n\n private cancelOpen(): void {\n if (this.openTimeout) {\n clearTimeout(this.openTimeout);\n this.openTimeout = null;\n }\n }\n\n private scheduleClose(): void {\n this.closeTimeout = setTimeout(() => this.close(), 150);\n }\n\n private cancelClose(): void {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n }\n\n ngOnInit(): void {\n if (this.popoverOpen()) {\n this.open();\n }\n }\n\n ngOnDestroy(): void {\n this.cancelOpen();\n this.cancelClose();\n this.close();\n this.dismissSubscriptions?.unsubscribe();\n this.overlayRef?.dispose();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-popover.mjs","names":[],"sources":["../../../components/popover/popover.component.ts","../../../components/popover/popover.component.html","../../../components/popover/popover-overlay.service.ts","../../../components/popover/popover.constants.ts","../../../components/popover/popover.directive.ts","../../../components/popover/popover.service.ts"],"sourcesContent":["import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, OnInit, TemplateRef } from '@angular/core';\n\nimport { CardComponentModule, CardSize } from '@testgorilla/tgo-ui/components/card';\n\n@Component({\n selector: 'ui-popover',\n standalone: true,\n imports: [NgTemplateOutlet, CardComponentModule, CdkTrapFocus],\n templateUrl: './popover.component.html',\n styleUrls: ['./popover.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PopoverComponent implements OnInit {\n templateRef = input<TemplateRef<unknown> | null>(null);\n ctx = input<Record<string, unknown>>({});\n popoverCard = input(true);\n popoverCardSize = input<CardSize>('medium');\n trapFocus = input(false);\n restoreFocusTo = input<HTMLElement | null>(null);\n ariaLabel = input('');\n\n ngOnInit(): void {\n // Runs before the focus trap captures the element to restore on close: Safari does not focus a button on click.\n this.restoreFocusTo()?.focus({ preventScroll: true });\n }\n}\n","@if (templateRef()) {\n <div class=\"popover-focus-scope\" [cdkTrapFocus]=\"trapFocus()\" [cdkTrapFocusAutoCapture]=\"trapFocus()\">\n <div\n class=\"popover-surface\"\n [attr.role]=\"trapFocus() ? 'dialog' : null\"\n [attr.aria-label]=\"trapFocus() && ariaLabel() ? ariaLabel() : null\"\n [attr.tabindex]=\"trapFocus() ? '-1' : null\"\n [attr.cdkFocusInitial]=\"trapFocus() ? '' : null\"\n >\n @if (popoverCard()) {\n <ui-card [size]=\"popoverCardSize()\">\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n </ui-card>\n } @else {\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n }\n </div>\n </div>\n}\n","import { ConnectedPosition, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ComponentRef, ElementRef, inject, Injectable, Injector, TemplateRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { PopoverComponent } from './popover.component';\nimport { PopoverConfig } from './popover.model';\n\nexport interface PopoverAttachOptions extends Required<PopoverConfig> {\n trapFocus: boolean;\n restoreFocusTo?: HTMLElement;\n}\n\nconst END_PLACEMENT_VIEWPORT_MARGIN = 16;\n\nconst popoverPositions = ({ placement, align, offset }: Required<PopoverConfig>): ConnectedPosition[] =>\n placement === 'end'\n ? [\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\n ]\n : [\n { originX: align, originY: 'bottom', overlayX: align, overlayY: 'top', offsetY: offset },\n { originX: align, originY: 'top', overlayX: align, overlayY: 'bottom', offsetY: -offset },\n ];\n\n@Injectable({ providedIn: 'root' })\nexport class PopoverOverlayService {\n private readonly overlay = inject(Overlay);\n\n create(anchor: HTMLElement | ElementRef<HTMLElement>, config: Required<PopoverConfig>): OverlayRef {\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(anchor)\n .withPositions(popoverPositions(config))\n .withViewportMargin(config.placement === 'end' ? END_PLACEMENT_VIEWPORT_MARGIN : 0);\n\n return this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n });\n }\n\n attach(\n overlayRef: OverlayRef,\n injector: Injector,\n template: TemplateRef<unknown>,\n close: () => void,\n options: PopoverAttachOptions\n ): ComponentRef<PopoverComponent> {\n const ref = overlayRef.attach(new ComponentPortal(PopoverComponent, null, injector));\n ref.setInput('templateRef', template);\n ref.setInput('ctx', { close });\n ref.setInput('popoverCard', options.isCard);\n ref.setInput('popoverCardSize', options.cardSize);\n ref.setInput('trapFocus', options.trapFocus);\n ref.setInput('restoreFocusTo', options.restoreFocusTo ?? null);\n ref.setInput('ariaLabel', options.ariaLabel);\n return ref;\n }\n\n dismissOnOutsideOrEscape(overlayRef: OverlayRef, anchor: HTMLElement, close: () => void): Subscription {\n const subscriptions = new Subscription();\n\n subscriptions.add(\n overlayRef.outsidePointerEvents().subscribe(event => {\n // The anchor's own click handler toggles, so ignore it here to avoid closing and reopening.\n if (!anchor.contains(event.target as Node)) {\n close();\n }\n })\n );\n\n subscriptions.add(\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n // cdkTrapFocusAutoCapture restores focus to whatever was focused before the popover opened,\n // so closing is all this has to do.\n close();\n })\n );\n\n return subscriptions;\n }\n}\n","import { PopoverConfig } from './popover.model';\n\nexport const POPOVER_DEFAULTS: Required<Omit<PopoverConfig, 'ariaLabel'>> = {\n placement: 'below',\n align: 'center',\n offset: 4,\n isCard: true,\n cardSize: 'medium',\n};\n","import { HorizontalConnectionPos, OverlayRef } from '@angular/cdk/overlay';\nimport {\n Directive,\n ElementRef,\n HostListener,\n inject,\n Injector,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { CardSize } from '@testgorilla/tgo-ui/components/card';\n\nimport { PopoverOverlayService } from './popover-overlay.service';\nimport { POPOVER_DEFAULTS } from './popover.constants';\nimport { PopoverConfig, PopoverPlacement, PopoverTrigger } from './popover.model';\n\n@Directive({\n selector: '[uiPopover]',\n exportAs: 'uiPopover',\n standalone: true,\n})\nexport class PopoverDirective implements OnInit, OnDestroy {\n uiPopover = input.required<TemplateRef<unknown>>();\n popoverOffset = input(POPOVER_DEFAULTS.offset);\n popoverAlign = input<HorizontalConnectionPos>(POPOVER_DEFAULTS.align);\n popoverPlacement = input<PopoverPlacement>(POPOVER_DEFAULTS.placement);\n popoverOpen = input(false);\n popoverCard = input(POPOVER_DEFAULTS.isCard);\n popoverCardSize = input<CardSize>(POPOVER_DEFAULTS.cardSize);\n popoverTrigger = input<PopoverTrigger>('hover');\n popoverAriaLabel = input('');\n uiPopoverDisabled = input(false);\n\n private readonly openState = signal(false);\n\n /** Whether the popover is currently showing. Read it via `#ref=\"uiPopover\"` or `viewChild(PopoverDirective)`. */\n readonly isOpen = this.openState.asReadonly();\n\n private readonly popoverOverlay = inject(PopoverOverlayService);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly ngZone = inject(NgZone);\n\n private overlayRef: OverlayRef | null = null;\n private openTimeout: ReturnType<typeof setTimeout> | null = null;\n private closeTimeout: ReturnType<typeof setTimeout> | null = null;\n private overlayListeners: { enter: () => void; leave: () => void } | null = null;\n private dismissSubscriptions: Subscription | null = null;\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.popoverTrigger() !== 'hover' || this.uiPopoverDisabled()) {\n return;\n }\n this.cancelClose();\n this.scheduleOpen();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.popoverTrigger() !== 'hover') {\n return;\n }\n this.cancelOpen();\n this.scheduleClose();\n }\n\n @HostListener('click')\n onClick(): void {\n if (this.popoverTrigger() !== 'click') {\n return;\n }\n this.toggle();\n }\n\n /** Opens the popover. No-op while `uiPopoverDisabled` is `true` or it is already open. */\n open(): void {\n if (this.uiPopoverDisabled()) {\n return;\n }\n\n if (!this.overlayRef) {\n this.createOverlay();\n }\n\n const overlayRef = this.overlayRef;\n if (!overlayRef || overlayRef.hasAttached()) {\n return;\n }\n\n this.popoverOverlay.attach(overlayRef, this.injector, this.uiPopover(), () => this.close(), {\n ...this.config(),\n trapFocus: this.popoverTrigger() === 'click',\n });\n\n if (this.popoverTrigger() === 'hover') {\n const el = overlayRef.overlayElement;\n const enter = (): void => this.ngZone.run(() => this.cancelClose());\n const leave = (): void => this.ngZone.run(() => this.scheduleClose());\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n this.overlayListeners = { enter, leave };\n }\n\n this.openState.set(true);\n }\n\n /** Closes the popover. Safe to call when it is already closed. */\n close(): void {\n if (!this.overlayRef) {\n return;\n }\n\n if (this.overlayListeners) {\n const el = this.overlayRef.overlayElement;\n el.removeEventListener('mouseenter', this.overlayListeners.enter);\n el.removeEventListener('mouseleave', this.overlayListeners.leave);\n this.overlayListeners = null;\n }\n\n this.overlayRef.detach();\n this.openState.set(false);\n }\n\n /** Opens the popover when closed, closes it when open. */\n toggle(): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private config(): Required<PopoverConfig> {\n return {\n placement: this.popoverPlacement(),\n align: this.popoverAlign(),\n offset: this.popoverOffset(),\n isCard: this.popoverCard(),\n cardSize: this.popoverCardSize(),\n ariaLabel: this.popoverAriaLabel(),\n };\n }\n\n private createOverlay(): void {\n this.overlayRef = this.popoverOverlay.create(this.elementRef, this.config());\n\n if (this.popoverTrigger() === 'click') {\n this.dismissSubscriptions = this.popoverOverlay.dismissOnOutsideOrEscape(\n this.overlayRef,\n this.elementRef.nativeElement,\n () => this.close()\n );\n }\n }\n\n private scheduleOpen(): void {\n this.openTimeout = setTimeout(() => this.open(), 100);\n }\n\n private cancelOpen(): void {\n if (this.openTimeout) {\n clearTimeout(this.openTimeout);\n this.openTimeout = null;\n }\n }\n\n private scheduleClose(): void {\n this.closeTimeout = setTimeout(() => this.close(), 150);\n }\n\n private cancelClose(): void {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n }\n\n ngOnInit(): void {\n if (this.popoverOpen()) {\n this.open();\n }\n }\n\n ngOnDestroy(): void {\n this.cancelOpen();\n this.cancelClose();\n this.close();\n this.dismissSubscriptions?.unsubscribe();\n this.overlayRef?.dispose();\n }\n}\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { DestroyRef, inject, Injectable, Injector, signal, TemplateRef } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nimport { PopoverOverlayService } from './popover-overlay.service';\nimport { POPOVER_DEFAULTS } from './popover.constants';\nimport { PopoverConfig, PopoverOpenConfig } from './popover.model';\n\nexport class PopoverRef {\n private readonly openState = signal(true);\n private readonly closedSubject$ = new Subject<void>();\n\n readonly isOpen = this.openState.asReadonly();\n /** Emits once, however the popover closed. */\n readonly closed$: Observable<void> = this.closedSubject$.asObservable();\n\n private stopClosingOnDestroy?: () => void;\n\n constructor(\n readonly anchor: HTMLElement,\n private readonly overlayRef: OverlayRef,\n destroyRef?: DestroyRef\n ) {\n this.stopClosingOnDestroy = destroyRef?.onDestroy(() => {\n this.stopClosingOnDestroy = undefined;\n this.close();\n });\n }\n\n close(): void {\n if (!this.openState()) {\n return;\n }\n this.openState.set(false);\n this.stopClosingOnDestroy?.();\n this.overlayRef.dispose();\n this.closedSubject$.next();\n this.closedSubject$.complete();\n }\n}\n\n/** Opens a popover against an anchor you do not own, with the same semantics as `popoverTrigger=\"click\"`. */\n@Injectable({ providedIn: 'root' })\nexport class PopoverService {\n private readonly popoverOverlay = inject(PopoverOverlayService);\n private readonly injector = inject(Injector);\n\n private active: PopoverRef | null = null;\n\n /** Returns the open popover when `anchor` already has one; any other popover opened here closes first. */\n open(anchor: HTMLElement, template: TemplateRef<unknown>, config: PopoverOpenConfig = {}): PopoverRef {\n const current = this.openRefFor(anchor);\n if (current) {\n return current;\n }\n this.active?.close();\n\n const { destroyRef, ...popoverConfig } = config;\n const resolved: Required<PopoverConfig> = { ...POPOVER_DEFAULTS, ariaLabel: '', ...popoverConfig };\n const overlayRef = this.popoverOverlay.create(anchor, resolved);\n const ref = new PopoverRef(anchor, overlayRef, destroyRef);\n const close = (): void => ref.close();\n\n this.popoverOverlay.attach(overlayRef, this.injector, template, close, {\n ...resolved,\n trapFocus: true,\n restoreFocusTo: anchor,\n });\n this.popoverOverlay.dismissOnOutsideOrEscape(overlayRef, anchor, close);\n\n this.active = ref;\n return ref;\n }\n\n /** Closes the popover when `anchor` has one open (returning `null`), opens it otherwise. */\n toggle(anchor: HTMLElement, template: TemplateRef<unknown>, config: PopoverOpenConfig = {}): PopoverRef | null {\n const current = this.openRefFor(anchor);\n if (current) {\n current.close();\n return null;\n }\n return this.open(anchor, template, config);\n }\n\n private openRefFor(anchor: HTMLElement): PopoverRef | null {\n const active = this.active;\n return active?.anchor === anchor && active.isOpen() ? active : null;\n }\n}\n"],"mappings":"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"}
@@ -752,12 +752,15 @@ var PromptComponent = class PromptComponent {
752
752
  "ariaExpanded",
753
753
  "ariaControls",
754
754
  "ariaPressed",
755
+ "ariaHasPopup",
755
756
  "ariaRequired",
756
757
  "ariaLabelledby",
757
758
  "ariaDescribedby",
758
759
  "preventDefault",
759
760
  "hasBackground",
760
761
  "circular",
762
+ "isSingleLineLabel",
763
+ "iconButtonShape",
761
764
  "tooltipPosition",
762
765
  "role",
763
766
  "iconFilled",
@@ -879,6 +882,7 @@ var PromptComponent = class PromptComponent {
879
882
  "uiPopover",
880
883
  "popoverOffset",
881
884
  "popoverAlign",
885
+ "popoverPlacement",
882
886
  "popoverOpen",
883
887
  "popoverCard",
884
888
  "popoverCardSize",
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-prompt.mjs","names":["keyboardEvent"],"sources":["../../../components/prompt/prompt.component.ts","../../../components/prompt/prompt.component.html","../../../components/prompt/prompt.module.ts"],"sourcesContent":["import { ConnectedPosition, CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n Input,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { debounceTime, firstValueFrom, fromEvent, map, tap } from 'rxjs';\n\nimport { BadgeComponent } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponent } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponent, IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuButtonsType, OverflowMenuComponent } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { PopoverDirective } from '@testgorilla/tgo-ui/components/popover';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponent } from '@testgorilla/tgo-ui/components/tag';\n\nimport {\n PromptActionsMenuEntry,\n PromptActionTag,\n PromptData,\n PromptDropdownItem,\n PromptSecondaryActionTag,\n PromptTag,\n} from './prompt.model';\n\n/** Throttles outward `ControlValueAccessor` emissions only; the signal write is synchronous. */\nconst INPUT_EMIT_DEBOUNCE_MS = 200;\n\n/** Window after `compositionend` in which an Enter still counts as committing an IME candidate. */\nconst IME_COMMIT_GRACE_MS = 50;\n\nconst CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS = 1000;\n\nconst CHARACTER_COUNT_ANNOUNCE_THRESHOLD = 0.1;\n\nlet nextActionsMenuId = 0;\n\n/** `undefined` falls back to the default icon; `null` means no icon. */\nconst resolveIcon = (icon: IconName | null | undefined, fallback: IconName): IconName =>\n icon === null ? '' : (icon ?? fallback);\n\n@Component({\n selector: 'ui-prompt',\n templateUrl: './prompt.component.html',\n styleUrl: './prompt.component.scss',\n providers: [\n UiTranslatePipe,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PromptComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CdkOverlayOrigin,\n NgClass,\n SkeletonComponent,\n IconComponent,\n FieldComponent,\n TagComponent,\n ButtonComponent,\n BadgeComponent,\n OverflowMenuComponent,\n MatTooltip,\n CdkConnectedOverlay,\n PopoverDirective,\n AsyncPipe,\n UiTranslatePipe,\n ],\n})\nexport class PromptComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n private readonly disabledState = signal(false);\n\n tags = input<PromptTag[]>([]);\n actionTag = input<PromptActionTag | null>(null);\n\n /** Tag rendered next to the action tag or file upload button, e.g. \"Find similar profile\". */\n secondaryActionTag = input<PromptSecondaryActionTag | null>(null);\n\n /**\n * Collapses `actionTag` and `secondaryActionTag` behind a Plus button that opens a menu listing\n * them; the button turns into a Close button while the menu is open.\n */\n collapseActionTags = input(false, { transform: booleanAttribute });\n\n maxCharacters = input<number>(255);\n supportedFileTypes = input<string>('');\n autoClear = input<boolean>(true);\n showSendButton = input<boolean>(false);\n sendButtonDisabled = input(false, { transform: booleanAttribute });\n enableFileUpload = input<boolean>(false);\n loading = input(false, { transform: booleanAttribute });\n\n /**\n * Placeholder for the prompt.\n */\n placeholder = input<string>('');\n\n /**\n * Custom error message displayed below the prompt.\n */\n errorMessage = input<string>('');\n\n /** Items for the built-in dropdown; opens on focus, filters by label as the user types. */\n dropdownItems = input<PromptDropdownItem[]>([]);\n dropdownHeading = input<string>('');\n showDropdownClose = input(false, { transform: booleanAttribute });\n\n /**\n * Whether to display a live `used / max` character count in the footer.\n */\n showCharacterCount = input(false, { transform: booleanAttribute });\n\n /**\n * Lighter hint rendered right after the typed text to flag what is still missing, e.g. \"Add location\".\n * Display-only: it is never inserted into the value, and Tab does not accept it.\n */\n helpText = input<string>('');\n\n /**\n * Whether the prompt is disabled.\n * @type {boolean}\n * @memberof PromptComponent\n */\n @Input({ transform: booleanAttribute })\n get disabled(): boolean {\n return this.disabledState();\n }\n set disabled(value: boolean) {\n this.setDisabledState(value);\n }\n\n promptData = output<PromptData>();\n actionTagFileSelected = output<File>();\n secondaryActionTagPress = output<void>();\n dropdownItemSelected = output<PromptDropdownItem>();\n dropdownClosed = output<void>();\n\n promptFilesList = signal<File[]>([]);\n promptTextValue = signal<string>('');\n fileListMenuConfig = signal<OverflowMenuButtonsType[]>([]);\n\n tagsVisible = signal<PromptTag[]>([]);\n tagsInDropdown = signal<PromptTag[]>([]);\n autocompleteSuggestion = signal<string>('');\n\n isDropdownOpened = signal<boolean>(false);\n readonly actionsMenuId = `ui-prompt-actions-menu-${nextActionsMenuId++}`;\n private readonly keepDropdownClosed = signal(false);\n isFieldHovered = signal(false);\n isFieldFocused = signal(false);\n\n /** True while an IME candidate window is open (CJK input). */\n private readonly composing = signal(false);\n private compositionEndedAt = 0;\n\n filteredDropdownItems = computed(() => {\n const query = this.promptTextValue().trim().toLowerCase();\n return this.dropdownItems().filter(item => {\n const label = item.label.toLowerCase();\n return label !== query && (!query || label.includes(query));\n });\n });\n\n // Derived from focus so blur closes the overlay for free.\n itemsDropdownVisible = computed(\n () =>\n this.isFieldFocused() && !this.keepDropdownClosed() && this.filteredDropdownItems().length > 0 && !this.isLocked()\n );\n\n /** True while focus sits anywhere inside the prompt. */\n isContainerFocused = signal(false);\n\n isHighlighted = computed(() => this.isFieldHovered() || this.isContainerFocused());\n\n readonly showFocusRing = computed(() => this.isHighlighted() && !this.loading());\n fileInputAccept = computed(() => this.actionTag()?.acceptedFileTypes ?? this.supportedFileTypes());\n\n isLocked = computed(() => this.disabledState() || this.loading());\n\n /** Hidden on an empty prompt (the placeholder owns that state) and behind a tag's autocomplete suggestion. */\n readonly visibleHelpText = computed(() =>\n this.promptTextValue() && !this.autocompleteSuggestion() && !this.isLocked() ? this.helpText().trim() : ''\n );\n\n readonly actionTagIcon = computed(() => resolveIcon(this.actionTag()?.icon, 'Plus'));\n readonly actionTagMenuTrailingIcon = computed(() => resolveIcon(this.actionTag()?.menuTrailingIcon, 'Plus'));\n readonly secondaryActionTagMenuTrailingIcon = computed(() =>\n resolveIcon(this.secondaryActionTag()?.menuTrailingIcon, 'Arrow-chevron-right-in-line')\n );\n\n /** Menu items sorted by `menuOrder`; a stable sort keeps the default order for ties and omissions. */\n readonly actionsMenuEntries = computed<PromptActionsMenuEntry[]>(() => {\n const secondary = this.secondaryActionTag();\n const action = this.actionTag();\n const entries: PromptActionsMenuEntry[] = [];\n if (secondary) {\n entries.push({ kind: 'secondary', tag: secondary, trailingIcon: this.secondaryActionTagMenuTrailingIcon() });\n }\n if (action) {\n entries.push({ kind: 'action', tag: action, trailingIcon: this.actionTagMenuTrailingIcon() });\n }\n return entries.sort((a, b) => (a.tag.menuOrder ?? Infinity) - (b.tag.menuOrder ?? Infinity));\n });\n\n readonly isActionsMenuOpen = computed(() => this.actionsPopover()?.isOpen() ?? false);\n\n readonly showActionsMenuTrigger = computed(\n () => this.collapseActionTags() && Boolean(this.actionTag() ?? this.secondaryActionTag())\n );\n\n private readonly hasContent = computed(\n () => Boolean(this.promptTextValue().trim()) || this.promptFilesList().length > 0\n );\n\n /**\n * Shared by the Send button's disabled state and the Enter shortcut, so they cannot disagree.\n * Ignores `showSendButton` on purpose: this is whether submission is allowed, not whether a\n * button is rendered.\n */\n readonly canSubmit = computed(() => !this.isLocked() && !this.sendButtonDisabled() && this.hasContent());\n\n readonly isOverCharacterLimit = computed(() => this.promptTextValue().length > this.maxCharacters());\n\n private readonly announcedTextValue = toSignal(\n toObservable(computed(() => (this.showCharacterCount() ? this.promptTextValue() : ''))).pipe(\n debounceTime(CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS)\n ),\n { initialValue: '' }\n );\n\n readonly characterCountAnnouncement = computed<{ key: string; params: { count: number } } | null>(() => {\n if (!this.showCharacterCount()) {\n return null;\n }\n\n const max = this.maxCharacters();\n const remaining = max - this.announcedTextValue().length;\n\n if (remaining < 0) {\n return { key: 'PROMPT.CHARACTERS_OVER_LIMIT', params: { count: -remaining } };\n }\n if (remaining <= max * CHARACTER_COUNT_ANNOUNCE_THRESHOLD) {\n return { key: 'PROMPT.CHARACTERS_REMAINING', params: { count: remaining } };\n }\n\n return null;\n });\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly translationPipe = inject(UiTranslatePipe);\n\n private readonly resetOnLock = effect(() => {\n if (this.isLocked()) {\n this.isDropdownOpened.set(false);\n this.actionsPopover()?.close();\n this.isFieldFocused.set(false);\n this.isFieldHovered.set(false);\n this.isContainerFocused.set(false);\n this.autocompleteSuggestion.set('');\n this.composing.set(false);\n }\n });\n\n fileDrop = viewChild<ElementRef<HTMLInputElement>>('fileDropRef');\n tagDropdown = viewChild<ElementRef<HTMLInputElement>>('tagDropdown');\n fieldComponentRef = viewChild.required<FieldComponent>('textarea');\n private readonly promptContainer = viewChild.required<ElementRef<HTMLElement>>('promptContainerRef');\n private readonly actionsPopover = viewChild(PopoverDirective);\n private readonly actionsMenu = viewChild<ElementRef<HTMLElement>>('actionsMenu');\n\n readonly dropdownPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ];\n\n ngOnInit() {\n this.initTags();\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.syncInputChange();\n }, 0);\n }\n\n private async uploadFile(event: Event): Promise<void> {\n const files = (event.currentTarget as HTMLInputElement).files;\n if (files?.length) {\n this.promptFilesList.update(list => {\n list.push(files.item(0) as File);\n return list;\n });\n this.emitValue();\n await this.updateFileMenu();\n }\n }\n\n sendPromptData(): void {\n if (!this.canSubmit()) {\n return;\n }\n this.promptData.emit({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n\n if (this.autoClear()) {\n this.clearPromptData();\n }\n }\n\n selectedMenuOption(menuOptionValue: string): void {\n const updatedConfig = this.fileListMenuConfig().filter(menu => menu.value !== menuOptionValue);\n const updatedFileList = this.promptFilesList().filter(file => file.name !== menuOptionValue);\n this.promptFilesList.set(updatedFileList);\n this.fileListMenuConfig.set(updatedConfig);\n }\n\n selectTag(tag: PromptTag, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.isDropdownOpened.set(false);\n this.promptTextValue.set(tag.label);\n this.autocompleteSuggestion.set(`${tag.label} ${tag.autocomplete}`);\n this.fieldComponentRef().field.nativeElement.focus();\n this.onTouch();\n }\n\n onTextareaTab(event: Event): void {\n if (this.isLocked()) {\n return;\n }\n if (this.autocompleteSuggestion()) {\n event.preventDefault();\n this.promptTextValue.set(this.autocompleteSuggestion());\n this.autocompleteSuggestion.set('');\n }\n }\n\n onTextareaEnter(event: Event): void {\n const keyboardEvent = event as KeyboardEvent;\n // Three checks because browsers disagree on when `compositionend` fires relative to the\n // Enter that commits an IME candidate: Chrome/Firefox after, Safari before, Android during.\n if (keyboardEvent.isComposing || this.composing() || Date.now() - this.compositionEndedAt < IME_COMMIT_GRACE_MS) {\n return;\n }\n // Unconditional, so a blocked Enter is swallowed rather than inserting a newline.\n event.preventDefault();\n this.sendPromptData();\n }\n\n dropdownOutsideClick(): void {\n this.isDropdownOpened.set(false);\n }\n\n onFieldBlur(): void {\n this.isFieldFocused.set(false);\n }\n\n onContainerFocusIn(): void {\n this.isContainerFocused.set(true);\n }\n\n onContainerFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (next instanceof Node && this.promptContainer().nativeElement.contains(next)) {\n return;\n }\n\n this.isContainerFocused.set(false);\n }\n\n itemsDropdownOutsideClick(event: MouseEvent): void {\n if (this.promptContainer().nativeElement.contains(event.target as Node)) {\n return;\n }\n this.isFieldFocused.set(false);\n this.dropdownClosed.emit();\n }\n\n closeItemsDropdown(): void {\n this.keepDropdownClosed.set(true);\n this.dropdownClosed.emit();\n }\n\n onTextareaEscape(event: Event): void {\n if (this.itemsDropdownVisible()) {\n // Consume it only when it dismissed the dropdown, so an Escape with nothing open still\n // reaches an enclosing ui-dialog / ui-side-sheet.\n event.stopPropagation();\n this.closeItemsDropdown();\n }\n }\n\n selectDropdownItem(item: PromptDropdownItem, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.keepDropdownClosed.set(true);\n this.promptTextValue.set(item.label);\n this.autocompleteSuggestion.set('');\n this.fieldComponentRef().field.nativeElement.focus();\n this.dropdownItemSelected.emit(item);\n this.emitValue();\n }\n\n toggleDropdown(): void {\n if (this.isLocked()) {\n return;\n }\n this.isDropdownOpened.set(!this.isDropdownOpened());\n }\n\n focusTagDropdown(): void {\n setTimeout(() => {\n this.tagDropdown()?.nativeElement.focus();\n }, 300);\n }\n\n private syncInputChange() {\n if (!this.fieldComponentRef()?.field?.nativeElement) {\n return;\n }\n\n const textarea = this.fieldComponentRef().field.nativeElement;\n\n fromEvent(textarea, 'input')\n .pipe(\n map((event: Event) => (event.target as HTMLInputElement).value),\n // Synchronous, so Enter and the Send button never observe a stale value.\n tap(value => {\n this.promptTextValue.set(value);\n this.keepDropdownClosed.set(false);\n if (this.autocompleteSuggestion()) {\n this.autocompleteSuggestion.set('');\n }\n }),\n debounceTime(INPUT_EMIT_DEBOUNCE_MS),\n tap(() => this.emitValue()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionstart')\n .pipe(\n tap(() => this.composing.set(true)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionend')\n .pipe(\n tap(() => {\n this.composing.set(false);\n this.compositionEndedAt = Date.now();\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n private initTags(): void {\n if (!this.tags()?.length) {\n return;\n }\n if (this.tags().length <= 5) {\n this.tagsVisible.set(this.tags());\n return;\n }\n\n this.tagsVisible.set(this.tags().slice(0, 5));\n this.tagsInDropdown.set(this.tags().slice(5));\n }\n\n private async updateFileMenu(): Promise<void> {\n const menuConfig: OverflowMenuButtonsType[] = [];\n const tooltip = await firstValueFrom(this.translationPipe.transform('COMMON.DELETE'));\n this.promptFilesList().forEach(file => {\n menuConfig.push({\n label: file.name,\n value: file.name,\n icon: 'Delete',\n tooltipText: tooltip,\n });\n });\n this.fileListMenuConfig.set(menuConfig);\n }\n\n private clearPromptData(): void {\n this.promptTextValue.set('');\n this.promptFilesList.set([]);\n this.fileListMenuConfig.set([]);\n }\n\n writeValue(value: PromptData): void {\n this.promptTextValue.set(value?.text ?? '');\n this.promptFilesList.set(value?.files ?? []);\n }\n private onChange = (_value: PromptData): void => {};\n private onTouch = () => {};\n\n registerOnChange(fn: (value: PromptData) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n async onFileSelected(event: Event): Promise<void> {\n if (this.isLocked()) {\n return;\n }\n if (this.actionTag()) {\n this.handleActionTagFile(event);\n } else {\n await this.uploadFile(event);\n }\n }\n\n onActionTagPress(): void {\n if (this.isLocked() || this.actionTag()?.disabled) {\n return;\n }\n this.fileDrop()?.nativeElement.click();\n }\n\n onSecondaryActionTagPress(): void {\n if (this.isLocked() || this.secondaryActionTag()?.disabled) {\n return;\n }\n this.secondaryActionTagPress.emit();\n }\n\n /** The popover's focus trap hands focus back to the Plus button when the menu closes. */\n closeActionsMenu(): void {\n this.actionsPopover()?.close();\n }\n\n onActionsMenuKeydown(event: KeyboardEvent): void {\n const items = this.actionsMenuItems();\n const current = items.indexOf(document.activeElement as HTMLElement);\n const focusAt = (index: number) => {\n event.preventDefault();\n items[(index + items.length) % items.length]?.focus();\n };\n\n switch (event.key) {\n case 'ArrowDown':\n focusAt(current + 1);\n break;\n case 'ArrowUp':\n focusAt(current - 1);\n break;\n case 'Home':\n focusAt(0);\n break;\n case 'End':\n focusAt(items.length - 1);\n break;\n case 'Escape':\n // Consumed so an enclosing ui-dialog / ui-side-sheet does not close as well.\n event.preventDefault();\n event.stopPropagation();\n this.closeActionsMenu();\n break;\n }\n }\n\n selectActionsMenuEntry(entry: PromptActionsMenuEntry, event: Event): void {\n if (entry.kind === 'action') {\n this.selectActionTagFromMenu(event);\n } else {\n this.selectSecondaryActionTagFromMenu(event);\n }\n }\n\n private selectActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.actionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onActionTagPress();\n }\n\n private selectSecondaryActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.secondaryActionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onSecondaryActionTagPress();\n }\n\n private actionsMenuItems(): HTMLElement[] {\n const menu = this.actionsMenu()?.nativeElement;\n return menu ? Array.from(menu.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')) : [];\n }\n\n private handleActionTagFile(event: Event): void {\n const inputEl = event.currentTarget as HTMLInputElement;\n const file = inputEl.files?.item(0) ?? null;\n if (file) {\n this.actionTagFileSelected.emit(file);\n }\n inputEl.value = '';\n }\n\n private emitValue(): void {\n this.onChange({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n this.onTouch();\n }\n}\n","<ng-container>\n <div\n class=\"prompt-container\"\n [class.has-error]=\"!!errorMessage()\"\n [class.disabled]=\"isLocked()\"\n [attr.aria-disabled]=\"isLocked()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n cdkOverlayOrigin\n #promptOrigin=\"cdkOverlayOrigin\"\n #promptContainerRef\n [class.prompt-container-focused]=\"showFocusRing()\"\n (focusin)=\"onContainerFocusIn()\"\n (focusout)=\"onContainerFocusOut($event)\"\n >\n @if (loading()) {\n <div class=\"prompt-loading\" aria-hidden=\"true\" animate.enter=\"cnp-prompt-fade-in\">\n <ui-skeleton [theme]=\"{ width: '100%', height: '20px', margin: '0' }\"></ui-skeleton>\n <ui-skeleton [theme]=\"{ width: '30%', height: '20px', margin: '0' }\"></ui-skeleton>\n </div>\n }\n <div class=\"prompt-autocomplete\" [hidden]=\"loading()\">\n <textarea tabindex=\"-1\" class=\"ghost\" id=\"autocomplete\" [value]=\"autocompleteSuggestion()\" readonly></textarea>\n @if (visibleHelpText(); as help) {\n <!-- The mirror repeats the typed text invisibly so the hint lands right after its last character. -->\n <div class=\"ghost prompt-help-text\" aria-hidden=\"true\">\n <span class=\"prompt-help-text-mirror\">{{ promptTextValue() }}</span\n ><span class=\"prompt-help-text-hint\">{{ ' ' + help }}</span>\n </div>\n }\n\n @let showIcon = !isFieldFocused() && !promptTextValue();\n @if (showIcon) {\n <ui-icon\n class=\"prompt-icon\"\n animate.enter=\"cnp-prompt-icon-in\"\n animate.leave=\"cnp-prompt-icon-out\"\n [color]=\"'inherit'\"\n [class.hovered]=\"isFieldHovered()\"\n [name]=\"'Sparkle-in-line'\"\n ></ui-icon>\n }\n <!-- `keydown.enter` matches unmodified Enter only; Shift+Enter resolves to `shift.enter`\n and falls through to a newline. Do not add a shiftKey check. -->\n <ui-field\n #textarea\n class=\"prompt-text\"\n [class.show-icon]=\"showIcon\"\n role=\"input\"\n [showBottomContent]=\"false\"\n [borderless]=\"true\"\n [type]=\"'multi-line'\"\n [autosizableTextarea]=\"true\"\n [maxCharacters]=\"maxCharacters()\"\n [placeholder]=\"showIcon ? placeholder() || ('PROMPT.ASK_ANYTHING' | uiTranslate | async)! : ''\"\n [value]=\"promptTextValue() || ''\"\n [hasTextAreaCounter]=\"false\"\n [ariaDescribedby]=\"visibleHelpText()\"\n [disabled]=\"disabled\"\n (mouseenter)=\"isFieldHovered.set(true)\"\n (mouseleave)=\"isFieldHovered.set(false)\"\n (focusin)=\"isFieldFocused.set(true)\"\n (fieldBlur)=\"onFieldBlur()\"\n (keydown.tab)=\"onTextareaTab($event)\"\n (keydown.enter)=\"onTextareaEnter($event)\"\n (keydown.escape)=\"onTextareaEscape($event)\"\n ></ui-field>\n </div>\n <div class=\"prompt-footer flex-container\">\n <div class=\"flex-container\">\n @if (showActionsMenuTrigger()) {\n <ui-button\n [uiPopover]=\"actionsMenuTemplate\"\n [popoverTrigger]=\"'click'\"\n [popoverCardSize]=\"'small'\"\n [popoverAlign]=\"'start'\"\n [popoverOffset]=\"8\"\n [popoverAriaLabel]=\"('COMMON.ADD' | uiTranslate | async)!\"\n [uiPopoverDisabled]=\"isLocked()\"\n [variant]=\"'icon-button'\"\n [iconName]=\"isActionsMenuOpen() ? 'Close' : 'Plus'\"\n [tooltip]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [ariaExpanded]=\"isActionsMenuOpen()\"\n [ariaControls]=\"isActionsMenuOpen() ? actionsMenuId : undefined\"\n [disabled]=\"isLocked()\"\n ></ui-button>\n\n <ng-template #actionsMenuTemplate>\n <div\n class=\"actions-menu\"\n role=\"menu\"\n #actionsMenu\n [id]=\"actionsMenuId\"\n (keydown)=\"onActionsMenuKeydown($event)\"\n >\n @for (entry of actionsMenuEntries(); track entry.kind) {\n <div\n class=\"actions-menu-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.aria-label]=\"entry.tag.ariaLabel ?? entry.tag.label\"\n [attr.aria-disabled]=\"entry.tag.disabled ? 'true' : null\"\n (click)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.enter)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.space)=\"selectActionsMenuEntry(entry, $event)\"\n >\n @if (entry.tag.icon) {\n <ui-icon class=\"actions-menu-item-icon\" [name]=\"entry.tag.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"actions-menu-item-label\">{{ entry.tag.label }}</span>\n @if (entry.trailingIcon) {\n <ui-icon\n class=\"actions-menu-item-trailing\"\n [name]=\"entry.trailingIcon\"\n [color]=\"'inherit'\"\n ></ui-icon>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n\n @if (actionTag(); as at) {\n @if (!collapseActionTags()) {\n <ui-tag\n [label]=\"at.label\"\n [icon]=\"actionTagIcon()\"\n [ariaLabel]=\"at.ariaLabel ?? at.label\"\n [isDisabled]=\"isLocked() || !!at.disabled\"\n (press)=\"onActionTagPress()\"\n ></ui-tag>\n }\n } @else if (enableFileUpload()) {\n <ui-button\n [variant]=\"'icon-button'\"\n [tooltip]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [iconName]=\"'Plus'\"\n [disabled]=\"isLocked()\"\n (click)=\"fileDrop()?.nativeElement?.click()\"\n ></ui-button>\n\n @if (promptFilesList().length) {\n <div class=\"menu\" animate.enter=\"cnp-prompt-pop-in\">\n <ui-badge\n [notificationsAmount]=\"promptFilesList().length\"\n [variant]=\"'notification'\"\n class=\"menu-badge\"\n ></ui-badge>\n <ui-overflow-menu\n [matTooltip]=\"('PROMPT.FILES' | uiTranslate | async)!\"\n [matTooltipPosition]=\"'above'\"\n [buttonSize]=\"'medium'\"\n [iconTrigger]=\"'Document'\"\n [buttonVariant]=\"'ghost'\"\n [buttons]=\"fileListMenuConfig()\"\n [isDynamicMenu]=\"true\"\n [withRemovableOption]=\"true\"\n (selectItem)=\"selectedMenuOption($event)\"\n ></ui-overflow-menu>\n </div>\n }\n }\n\n @if (secondaryActionTag(); as sat) {\n @if (!collapseActionTags()) {\n <ui-tag\n class=\"prompt-secondary-action-tag\"\n [label]=\"sat.label\"\n [icon]=\"sat.icon ?? ''\"\n [ariaLabel]=\"sat.ariaLabel ?? sat.label\"\n [isDisabled]=\"isLocked() || !!sat.disabled\"\n (press)=\"onSecondaryActionTagPress()\"\n ></ui-tag>\n }\n }\n\n @if (actionTag() || enableFileUpload()) {\n <input\n data-testid=\"prompt-file-input\"\n [tabIndex]=\"-1\"\n class=\"form-control\"\n #fileDropRef\n type=\"file\"\n id=\"file-upload\"\n [accept]=\"fileInputAccept()\"\n [disabled]=\"isLocked()\"\n (change)=\"onFileSelected($event)\"\n />\n }\n </div>\n\n @if (tags()?.length && !promptTextValue()) {\n <div class=\"flex-container carousel\" animate.enter=\"cnp-prompt-row-in\">\n <div class=\"tag-container flex-container\" role=\"list\" #tagsScrollContainer>\n @for (tag of tagsVisible(); track tag) {\n <ui-tag\n [label]=\"tag.label\"\n role=\"listitem\"\n [ariaLabel]=\"tag.label\"\n [isDisabled]=\"isLocked()\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n ></ui-tag>\n }\n\n @if (tagsInDropdown().length) {\n <ui-button\n class=\"view-more\"\n variant=\"text-inline\"\n [label]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [ariaLabel]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [size]=\"'medium'\"\n [disabled]=\"isLocked()\"\n (click)=\"toggleDropdown()\"\n (keydown.enter)=\"focusTagDropdown()\"\n cdkOverlayOrigin\n #dropdownTrigger=\"cdkOverlayOrigin\"\n ></ui-button>\n }\n </div>\n\n <div class=\"flex-container\">\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Scroll left button'\"\n [iconName]=\"'Arrow-chevron-left-in-line'\"\n [disabled]=\"isLocked() || tagsScrollContainer.scrollLeft === 0\"\n (click)=\"tagsScrollContainer.scrollBy({ left: -100, behavior: 'smooth' })\"\n ></ui-button>\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Arrow-chevron-right-in-line'\"\n [ariaLabel]=\"'Scroll right button'\"\n [disabled]=\"\n isLocked() ||\n tagsScrollContainer.scrollLeft + tagsScrollContainer.clientWidth >= tagsScrollContainer.scrollWidth\n \"\n (click)=\"tagsScrollContainer.scrollBy({ left: 100, behavior: 'smooth' })\"\n ></ui-button>\n </div>\n </div>\n }\n\n @if (showCharacterCount()) {\n <span class=\"prompt-character-count\" [class.over-limit]=\"isOverCharacterLimit()\"\n >{{ promptTextValue().length }} / {{ maxCharacters() }}</span\n >\n <span class=\"prompt-character-count-status\" aria-live=\"polite\">\n @if (characterCountAnnouncement(); as announcement) {\n {{ announcement.key | uiTranslate: announcement.params | async }}\n }\n </span>\n }\n\n @if (showSendButton()) {\n <ui-button\n class=\"send-button\"\n animate.enter=\"cnp-prompt-pop-in\"\n [variant]=\"'secondary'\"\n [iconName]=\"'Arrow-up-in-line'\"\n [tooltip]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [size]=\"'medium'\"\n [disabled]=\"!canSubmit()\"\n (click)=\"sendPromptData()\"\n ></ui-button>\n }\n </div>\n\n <div class=\"prompt-projected-footer\">\n <ng-content select=\"[promptFooter]\"></ng-content>\n </div>\n </div>\n\n @if (errorMessage()) {\n <div class=\"prompt-error\" animate.enter=\"cnp-prompt-error-in\">\n <ui-icon [name]=\"'Error'\" color=\"red\"></ui-icon>\n <span>{{ errorMessage() }}</span>\n </div>\n }\n\n <!-- Dropdown for hidden tags -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"isDropdownOpened() && !isLocked()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"dropdownOutsideClick()\"\n >\n <div class=\"dropdown-container\" role=\"list\" #tagDropdown tabindex=\"0\" animate.enter=\"cnp-prompt-dropdown-in\">\n @for (tag of tagsInDropdown(); track tag) {\n <div\n class=\"dropdown-tag\"\n tabindex=\"0\"\n [attr.aria-label]=\"tag.label\"\n role=\"listitem\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n >\n {{ tag.label }}\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Built-in items dropdown (UI-877) — opens on focus, typing filters by label -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"itemsDropdownVisible()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"itemsDropdownOutsideClick($event)\"\n >\n <div\n class=\"dropdown-container custom-dropdown-container\"\n animate.enter=\"cnp-prompt-dropdown-in\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @if (dropdownHeading() || showDropdownClose()) {\n <div class=\"dropdown-header\">\n @if (dropdownHeading()) {\n <span class=\"dropdown-heading\">{{ dropdownHeading() }}</span>\n }\n @if (showDropdownClose()) {\n <ui-button\n class=\"dropdown-close\"\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Close-in-line'\"\n [tooltip]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n (click)=\"closeItemsDropdown()\"\n ></ui-button>\n }\n </div>\n }\n <div role=\"list\">\n @for (item of filteredDropdownItems(); track item.id) {\n <div\n class=\"dropdown-tag dropdown-item\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.label\"\n (click)=\"selectDropdownItem(item, $event)\"\n (keydown.enter)=\"selectDropdownItem(item, $event)\"\n (keydown.space)=\"selectDropdownItem(item, $event)\"\n >\n @if (item.icon) {\n <ui-icon class=\"dropdown-item-icon\" [name]=\"item.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"dropdown-item-label\">{{ item.label }}</span>\n <ui-icon class=\"dropdown-item-chevron\" [name]=\"'Arrow-chevron-right-in-line'\" [color]=\"'inherit'\"></ui-icon>\n </div>\n }\n </div>\n </div>\n </ng-template>\n</ng-container>\n","import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { BadgeComponentModule } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { TooltipComponentModule } from '@testgorilla/tgo-ui/components/tooltip';\n\nimport { PromptComponent } from './prompt.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FieldComponentModule,\n ButtonComponentModule,\n OverflowMenuComponentModule,\n TagComponentModule,\n BadgeComponentModule,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n CardComponentModule,\n CdkTextareaAutosize,\n TooltipComponentModule,\n MatTooltip,\n UiTranslatePipe,\n IconComponentModule,\n SkeletonComponent,\n PromptComponent,\n ],\n exports: [PromptComponent],\n})\nexport class PromptModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-prompt.mjs","names":["keyboardEvent"],"sources":["../../../components/prompt/prompt.component.ts","../../../components/prompt/prompt.component.html","../../../components/prompt/prompt.module.ts"],"sourcesContent":["import { ConnectedPosition, CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n Input,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { debounceTime, firstValueFrom, fromEvent, map, tap } from 'rxjs';\n\nimport { BadgeComponent } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponent } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponent, IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuButtonsType, OverflowMenuComponent } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { PopoverDirective } from '@testgorilla/tgo-ui/components/popover';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponent } from '@testgorilla/tgo-ui/components/tag';\n\nimport {\n PromptActionsMenuEntry,\n PromptActionTag,\n PromptData,\n PromptDropdownItem,\n PromptSecondaryActionTag,\n PromptTag,\n} from './prompt.model';\n\n/** Throttles outward `ControlValueAccessor` emissions only; the signal write is synchronous. */\nconst INPUT_EMIT_DEBOUNCE_MS = 200;\n\n/** Window after `compositionend` in which an Enter still counts as committing an IME candidate. */\nconst IME_COMMIT_GRACE_MS = 50;\n\nconst CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS = 1000;\n\nconst CHARACTER_COUNT_ANNOUNCE_THRESHOLD = 0.1;\n\nlet nextActionsMenuId = 0;\n\n/** `undefined` falls back to the default icon; `null` means no icon. */\nconst resolveIcon = (icon: IconName | null | undefined, fallback: IconName): IconName =>\n icon === null ? '' : (icon ?? fallback);\n\n@Component({\n selector: 'ui-prompt',\n templateUrl: './prompt.component.html',\n styleUrl: './prompt.component.scss',\n providers: [\n UiTranslatePipe,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PromptComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CdkOverlayOrigin,\n NgClass,\n SkeletonComponent,\n IconComponent,\n FieldComponent,\n TagComponent,\n ButtonComponent,\n BadgeComponent,\n OverflowMenuComponent,\n MatTooltip,\n CdkConnectedOverlay,\n PopoverDirective,\n AsyncPipe,\n UiTranslatePipe,\n ],\n})\nexport class PromptComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n private readonly disabledState = signal(false);\n\n tags = input<PromptTag[]>([]);\n actionTag = input<PromptActionTag | null>(null);\n\n /** Tag rendered next to the action tag or file upload button, e.g. \"Find similar profile\". */\n secondaryActionTag = input<PromptSecondaryActionTag | null>(null);\n\n /**\n * Collapses `actionTag` and `secondaryActionTag` behind a Plus button that opens a menu listing\n * them; the button turns into a Close button while the menu is open.\n */\n collapseActionTags = input(false, { transform: booleanAttribute });\n\n maxCharacters = input<number>(255);\n supportedFileTypes = input<string>('');\n autoClear = input<boolean>(true);\n showSendButton = input<boolean>(false);\n sendButtonDisabled = input(false, { transform: booleanAttribute });\n enableFileUpload = input<boolean>(false);\n loading = input(false, { transform: booleanAttribute });\n\n /**\n * Placeholder for the prompt.\n */\n placeholder = input<string>('');\n\n /**\n * Custom error message displayed below the prompt.\n */\n errorMessage = input<string>('');\n\n /** Items for the built-in dropdown; opens on focus, filters by label as the user types. */\n dropdownItems = input<PromptDropdownItem[]>([]);\n dropdownHeading = input<string>('');\n showDropdownClose = input(false, { transform: booleanAttribute });\n\n /**\n * Whether to display a live `used / max` character count in the footer.\n */\n showCharacterCount = input(false, { transform: booleanAttribute });\n\n /**\n * Lighter hint rendered right after the typed text to flag what is still missing, e.g. \"Add location\".\n * Display-only: it is never inserted into the value, and Tab does not accept it.\n */\n helpText = input<string>('');\n\n /**\n * Whether the prompt is disabled.\n * @type {boolean}\n * @memberof PromptComponent\n */\n @Input({ transform: booleanAttribute })\n get disabled(): boolean {\n return this.disabledState();\n }\n set disabled(value: boolean) {\n this.setDisabledState(value);\n }\n\n promptData = output<PromptData>();\n actionTagFileSelected = output<File>();\n secondaryActionTagPress = output<void>();\n dropdownItemSelected = output<PromptDropdownItem>();\n dropdownClosed = output<void>();\n\n promptFilesList = signal<File[]>([]);\n promptTextValue = signal<string>('');\n fileListMenuConfig = signal<OverflowMenuButtonsType[]>([]);\n\n tagsVisible = signal<PromptTag[]>([]);\n tagsInDropdown = signal<PromptTag[]>([]);\n autocompleteSuggestion = signal<string>('');\n\n isDropdownOpened = signal<boolean>(false);\n readonly actionsMenuId = `ui-prompt-actions-menu-${nextActionsMenuId++}`;\n private readonly keepDropdownClosed = signal(false);\n isFieldHovered = signal(false);\n isFieldFocused = signal(false);\n\n /** True while an IME candidate window is open (CJK input). */\n private readonly composing = signal(false);\n private compositionEndedAt = 0;\n\n filteredDropdownItems = computed(() => {\n const query = this.promptTextValue().trim().toLowerCase();\n return this.dropdownItems().filter(item => {\n const label = item.label.toLowerCase();\n return label !== query && (!query || label.includes(query));\n });\n });\n\n // Derived from focus so blur closes the overlay for free.\n itemsDropdownVisible = computed(\n () =>\n this.isFieldFocused() && !this.keepDropdownClosed() && this.filteredDropdownItems().length > 0 && !this.isLocked()\n );\n\n /** True while focus sits anywhere inside the prompt. */\n isContainerFocused = signal(false);\n\n isHighlighted = computed(() => this.isFieldHovered() || this.isContainerFocused());\n\n readonly showFocusRing = computed(() => this.isHighlighted() && !this.loading());\n fileInputAccept = computed(() => this.actionTag()?.acceptedFileTypes ?? this.supportedFileTypes());\n\n isLocked = computed(() => this.disabledState() || this.loading());\n\n /** Hidden on an empty prompt (the placeholder owns that state) and behind a tag's autocomplete suggestion. */\n readonly visibleHelpText = computed(() =>\n this.promptTextValue() && !this.autocompleteSuggestion() && !this.isLocked() ? this.helpText().trim() : ''\n );\n\n readonly actionTagIcon = computed(() => resolveIcon(this.actionTag()?.icon, 'Plus'));\n readonly actionTagMenuTrailingIcon = computed(() => resolveIcon(this.actionTag()?.menuTrailingIcon, 'Plus'));\n readonly secondaryActionTagMenuTrailingIcon = computed(() =>\n resolveIcon(this.secondaryActionTag()?.menuTrailingIcon, 'Arrow-chevron-right-in-line')\n );\n\n /** Menu items sorted by `menuOrder`; a stable sort keeps the default order for ties and omissions. */\n readonly actionsMenuEntries = computed<PromptActionsMenuEntry[]>(() => {\n const secondary = this.secondaryActionTag();\n const action = this.actionTag();\n const entries: PromptActionsMenuEntry[] = [];\n if (secondary) {\n entries.push({ kind: 'secondary', tag: secondary, trailingIcon: this.secondaryActionTagMenuTrailingIcon() });\n }\n if (action) {\n entries.push({ kind: 'action', tag: action, trailingIcon: this.actionTagMenuTrailingIcon() });\n }\n return entries.sort((a, b) => (a.tag.menuOrder ?? Infinity) - (b.tag.menuOrder ?? Infinity));\n });\n\n readonly isActionsMenuOpen = computed(() => this.actionsPopover()?.isOpen() ?? false);\n\n readonly showActionsMenuTrigger = computed(\n () => this.collapseActionTags() && Boolean(this.actionTag() ?? this.secondaryActionTag())\n );\n\n private readonly hasContent = computed(\n () => Boolean(this.promptTextValue().trim()) || this.promptFilesList().length > 0\n );\n\n /**\n * Shared by the Send button's disabled state and the Enter shortcut, so they cannot disagree.\n * Ignores `showSendButton` on purpose: this is whether submission is allowed, not whether a\n * button is rendered.\n */\n readonly canSubmit = computed(() => !this.isLocked() && !this.sendButtonDisabled() && this.hasContent());\n\n readonly isOverCharacterLimit = computed(() => this.promptTextValue().length > this.maxCharacters());\n\n private readonly announcedTextValue = toSignal(\n toObservable(computed(() => (this.showCharacterCount() ? this.promptTextValue() : ''))).pipe(\n debounceTime(CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS)\n ),\n { initialValue: '' }\n );\n\n readonly characterCountAnnouncement = computed<{ key: string; params: { count: number } } | null>(() => {\n if (!this.showCharacterCount()) {\n return null;\n }\n\n const max = this.maxCharacters();\n const remaining = max - this.announcedTextValue().length;\n\n if (remaining < 0) {\n return { key: 'PROMPT.CHARACTERS_OVER_LIMIT', params: { count: -remaining } };\n }\n if (remaining <= max * CHARACTER_COUNT_ANNOUNCE_THRESHOLD) {\n return { key: 'PROMPT.CHARACTERS_REMAINING', params: { count: remaining } };\n }\n\n return null;\n });\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly translationPipe = inject(UiTranslatePipe);\n\n private readonly resetOnLock = effect(() => {\n if (this.isLocked()) {\n this.isDropdownOpened.set(false);\n this.actionsPopover()?.close();\n this.isFieldFocused.set(false);\n this.isFieldHovered.set(false);\n this.isContainerFocused.set(false);\n this.autocompleteSuggestion.set('');\n this.composing.set(false);\n }\n });\n\n fileDrop = viewChild<ElementRef<HTMLInputElement>>('fileDropRef');\n tagDropdown = viewChild<ElementRef<HTMLInputElement>>('tagDropdown');\n fieldComponentRef = viewChild.required<FieldComponent>('textarea');\n private readonly promptContainer = viewChild.required<ElementRef<HTMLElement>>('promptContainerRef');\n private readonly actionsPopover = viewChild(PopoverDirective);\n private readonly actionsMenu = viewChild<ElementRef<HTMLElement>>('actionsMenu');\n\n readonly dropdownPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ];\n\n ngOnInit() {\n this.initTags();\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.syncInputChange();\n }, 0);\n }\n\n private async uploadFile(event: Event): Promise<void> {\n const files = (event.currentTarget as HTMLInputElement).files;\n if (files?.length) {\n this.promptFilesList.update(list => {\n list.push(files.item(0) as File);\n return list;\n });\n this.emitValue();\n await this.updateFileMenu();\n }\n }\n\n sendPromptData(): void {\n if (!this.canSubmit()) {\n return;\n }\n this.promptData.emit({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n\n if (this.autoClear()) {\n this.clearPromptData();\n }\n }\n\n selectedMenuOption(menuOptionValue: string): void {\n const updatedConfig = this.fileListMenuConfig().filter(menu => menu.value !== menuOptionValue);\n const updatedFileList = this.promptFilesList().filter(file => file.name !== menuOptionValue);\n this.promptFilesList.set(updatedFileList);\n this.fileListMenuConfig.set(updatedConfig);\n }\n\n selectTag(tag: PromptTag, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.isDropdownOpened.set(false);\n this.promptTextValue.set(tag.label);\n this.autocompleteSuggestion.set(`${tag.label} ${tag.autocomplete}`);\n this.fieldComponentRef().field.nativeElement.focus();\n this.onTouch();\n }\n\n onTextareaTab(event: Event): void {\n if (this.isLocked()) {\n return;\n }\n if (this.autocompleteSuggestion()) {\n event.preventDefault();\n this.promptTextValue.set(this.autocompleteSuggestion());\n this.autocompleteSuggestion.set('');\n }\n }\n\n onTextareaEnter(event: Event): void {\n const keyboardEvent = event as KeyboardEvent;\n // Three checks because browsers disagree on when `compositionend` fires relative to the\n // Enter that commits an IME candidate: Chrome/Firefox after, Safari before, Android during.\n if (keyboardEvent.isComposing || this.composing() || Date.now() - this.compositionEndedAt < IME_COMMIT_GRACE_MS) {\n return;\n }\n // Unconditional, so a blocked Enter is swallowed rather than inserting a newline.\n event.preventDefault();\n this.sendPromptData();\n }\n\n dropdownOutsideClick(): void {\n this.isDropdownOpened.set(false);\n }\n\n onFieldBlur(): void {\n this.isFieldFocused.set(false);\n }\n\n onContainerFocusIn(): void {\n this.isContainerFocused.set(true);\n }\n\n onContainerFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (next instanceof Node && this.promptContainer().nativeElement.contains(next)) {\n return;\n }\n\n this.isContainerFocused.set(false);\n }\n\n itemsDropdownOutsideClick(event: MouseEvent): void {\n if (this.promptContainer().nativeElement.contains(event.target as Node)) {\n return;\n }\n this.isFieldFocused.set(false);\n this.dropdownClosed.emit();\n }\n\n closeItemsDropdown(): void {\n this.keepDropdownClosed.set(true);\n this.dropdownClosed.emit();\n }\n\n onTextareaEscape(event: Event): void {\n if (this.itemsDropdownVisible()) {\n // Consume it only when it dismissed the dropdown, so an Escape with nothing open still\n // reaches an enclosing ui-dialog / ui-side-sheet.\n event.stopPropagation();\n this.closeItemsDropdown();\n }\n }\n\n selectDropdownItem(item: PromptDropdownItem, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.keepDropdownClosed.set(true);\n this.promptTextValue.set(item.label);\n this.autocompleteSuggestion.set('');\n this.fieldComponentRef().field.nativeElement.focus();\n this.dropdownItemSelected.emit(item);\n this.emitValue();\n }\n\n toggleDropdown(): void {\n if (this.isLocked()) {\n return;\n }\n this.isDropdownOpened.set(!this.isDropdownOpened());\n }\n\n focusTagDropdown(): void {\n setTimeout(() => {\n this.tagDropdown()?.nativeElement.focus();\n }, 300);\n }\n\n private syncInputChange() {\n if (!this.fieldComponentRef()?.field?.nativeElement) {\n return;\n }\n\n const textarea = this.fieldComponentRef().field.nativeElement;\n\n fromEvent(textarea, 'input')\n .pipe(\n map((event: Event) => (event.target as HTMLInputElement).value),\n // Synchronous, so Enter and the Send button never observe a stale value.\n tap(value => {\n this.promptTextValue.set(value);\n this.keepDropdownClosed.set(false);\n if (this.autocompleteSuggestion()) {\n this.autocompleteSuggestion.set('');\n }\n }),\n debounceTime(INPUT_EMIT_DEBOUNCE_MS),\n tap(() => this.emitValue()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionstart')\n .pipe(\n tap(() => this.composing.set(true)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionend')\n .pipe(\n tap(() => {\n this.composing.set(false);\n this.compositionEndedAt = Date.now();\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n private initTags(): void {\n if (!this.tags()?.length) {\n return;\n }\n if (this.tags().length <= 5) {\n this.tagsVisible.set(this.tags());\n return;\n }\n\n this.tagsVisible.set(this.tags().slice(0, 5));\n this.tagsInDropdown.set(this.tags().slice(5));\n }\n\n private async updateFileMenu(): Promise<void> {\n const menuConfig: OverflowMenuButtonsType[] = [];\n const tooltip = await firstValueFrom(this.translationPipe.transform('COMMON.DELETE'));\n this.promptFilesList().forEach(file => {\n menuConfig.push({\n label: file.name,\n value: file.name,\n icon: 'Delete',\n tooltipText: tooltip,\n });\n });\n this.fileListMenuConfig.set(menuConfig);\n }\n\n private clearPromptData(): void {\n this.promptTextValue.set('');\n this.promptFilesList.set([]);\n this.fileListMenuConfig.set([]);\n }\n\n writeValue(value: PromptData): void {\n this.promptTextValue.set(value?.text ?? '');\n this.promptFilesList.set(value?.files ?? []);\n }\n private onChange = (_value: PromptData): void => {};\n private onTouch = () => {};\n\n registerOnChange(fn: (value: PromptData) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n async onFileSelected(event: Event): Promise<void> {\n if (this.isLocked()) {\n return;\n }\n if (this.actionTag()) {\n this.handleActionTagFile(event);\n } else {\n await this.uploadFile(event);\n }\n }\n\n onActionTagPress(): void {\n if (this.isLocked() || this.actionTag()?.disabled) {\n return;\n }\n this.fileDrop()?.nativeElement.click();\n }\n\n onSecondaryActionTagPress(): void {\n if (this.isLocked() || this.secondaryActionTag()?.disabled) {\n return;\n }\n this.secondaryActionTagPress.emit();\n }\n\n /** The popover's focus trap hands focus back to the Plus button when the menu closes. */\n closeActionsMenu(): void {\n this.actionsPopover()?.close();\n }\n\n onActionsMenuKeydown(event: KeyboardEvent): void {\n const items = this.actionsMenuItems();\n const current = items.indexOf(document.activeElement as HTMLElement);\n const focusAt = (index: number) => {\n event.preventDefault();\n items[(index + items.length) % items.length]?.focus();\n };\n\n switch (event.key) {\n case 'ArrowDown':\n focusAt(current + 1);\n break;\n case 'ArrowUp':\n focusAt(current - 1);\n break;\n case 'Home':\n focusAt(0);\n break;\n case 'End':\n focusAt(items.length - 1);\n break;\n case 'Escape':\n // Consumed so an enclosing ui-dialog / ui-side-sheet does not close as well.\n event.preventDefault();\n event.stopPropagation();\n this.closeActionsMenu();\n break;\n }\n }\n\n selectActionsMenuEntry(entry: PromptActionsMenuEntry, event: Event): void {\n if (entry.kind === 'action') {\n this.selectActionTagFromMenu(event);\n } else {\n this.selectSecondaryActionTagFromMenu(event);\n }\n }\n\n private selectActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.actionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onActionTagPress();\n }\n\n private selectSecondaryActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.secondaryActionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onSecondaryActionTagPress();\n }\n\n private actionsMenuItems(): HTMLElement[] {\n const menu = this.actionsMenu()?.nativeElement;\n return menu ? Array.from(menu.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')) : [];\n }\n\n private handleActionTagFile(event: Event): void {\n const inputEl = event.currentTarget as HTMLInputElement;\n const file = inputEl.files?.item(0) ?? null;\n if (file) {\n this.actionTagFileSelected.emit(file);\n }\n inputEl.value = '';\n }\n\n private emitValue(): void {\n this.onChange({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n this.onTouch();\n }\n}\n","<ng-container>\n <div\n class=\"prompt-container\"\n [class.has-error]=\"!!errorMessage()\"\n [class.disabled]=\"isLocked()\"\n [attr.aria-disabled]=\"isLocked()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n cdkOverlayOrigin\n #promptOrigin=\"cdkOverlayOrigin\"\n #promptContainerRef\n [class.prompt-container-focused]=\"showFocusRing()\"\n (focusin)=\"onContainerFocusIn()\"\n (focusout)=\"onContainerFocusOut($event)\"\n >\n @if (loading()) {\n <div class=\"prompt-loading\" aria-hidden=\"true\" animate.enter=\"cnp-prompt-fade-in\">\n <ui-skeleton [theme]=\"{ width: '100%', height: '20px', margin: '0' }\"></ui-skeleton>\n <ui-skeleton [theme]=\"{ width: '30%', height: '20px', margin: '0' }\"></ui-skeleton>\n </div>\n }\n <div class=\"prompt-autocomplete\" [hidden]=\"loading()\">\n <textarea tabindex=\"-1\" class=\"ghost\" id=\"autocomplete\" [value]=\"autocompleteSuggestion()\" readonly></textarea>\n @if (visibleHelpText(); as help) {\n <!-- The mirror repeats the typed text invisibly so the hint lands right after its last character. -->\n <div class=\"ghost prompt-help-text\" aria-hidden=\"true\">\n <span class=\"prompt-help-text-mirror\">{{ promptTextValue() }}</span\n ><span class=\"prompt-help-text-hint\">{{ ' ' + help }}</span>\n </div>\n }\n\n @let showIcon = !isFieldFocused() && !promptTextValue();\n @if (showIcon) {\n <ui-icon\n class=\"prompt-icon\"\n animate.enter=\"cnp-prompt-icon-in\"\n animate.leave=\"cnp-prompt-icon-out\"\n [color]=\"'inherit'\"\n [class.hovered]=\"isFieldHovered()\"\n [name]=\"'Sparkle-in-line'\"\n ></ui-icon>\n }\n <!-- `keydown.enter` matches unmodified Enter only; Shift+Enter resolves to `shift.enter`\n and falls through to a newline. Do not add a shiftKey check. -->\n <ui-field\n #textarea\n class=\"prompt-text\"\n [class.show-icon]=\"showIcon\"\n role=\"input\"\n [showBottomContent]=\"false\"\n [borderless]=\"true\"\n [type]=\"'multi-line'\"\n [autosizableTextarea]=\"true\"\n [maxCharacters]=\"maxCharacters()\"\n [placeholder]=\"showIcon ? placeholder() || ('PROMPT.ASK_ANYTHING' | uiTranslate | async)! : ''\"\n [value]=\"promptTextValue() || ''\"\n [hasTextAreaCounter]=\"false\"\n [ariaDescribedby]=\"visibleHelpText()\"\n [disabled]=\"disabled\"\n (mouseenter)=\"isFieldHovered.set(true)\"\n (mouseleave)=\"isFieldHovered.set(false)\"\n (focusin)=\"isFieldFocused.set(true)\"\n (fieldBlur)=\"onFieldBlur()\"\n (keydown.tab)=\"onTextareaTab($event)\"\n (keydown.enter)=\"onTextareaEnter($event)\"\n (keydown.escape)=\"onTextareaEscape($event)\"\n ></ui-field>\n </div>\n <div class=\"prompt-footer flex-container\">\n <div class=\"flex-container\">\n @if (showActionsMenuTrigger()) {\n <ui-button\n [uiPopover]=\"actionsMenuTemplate\"\n [popoverTrigger]=\"'click'\"\n [popoverCardSize]=\"'small'\"\n [popoverAlign]=\"'start'\"\n [popoverOffset]=\"8\"\n [popoverAriaLabel]=\"('COMMON.ADD' | uiTranslate | async)!\"\n [uiPopoverDisabled]=\"isLocked()\"\n [variant]=\"'icon-button'\"\n [iconName]=\"isActionsMenuOpen() ? 'Close' : 'Plus'\"\n [tooltip]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [ariaExpanded]=\"isActionsMenuOpen()\"\n [ariaControls]=\"isActionsMenuOpen() ? actionsMenuId : undefined\"\n [disabled]=\"isLocked()\"\n ></ui-button>\n\n <ng-template #actionsMenuTemplate>\n <div\n class=\"actions-menu\"\n role=\"menu\"\n #actionsMenu\n [id]=\"actionsMenuId\"\n (keydown)=\"onActionsMenuKeydown($event)\"\n >\n @for (entry of actionsMenuEntries(); track entry.kind) {\n <div\n class=\"actions-menu-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.aria-label]=\"entry.tag.ariaLabel ?? entry.tag.label\"\n [attr.aria-disabled]=\"entry.tag.disabled ? 'true' : null\"\n (click)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.enter)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.space)=\"selectActionsMenuEntry(entry, $event)\"\n >\n @if (entry.tag.icon) {\n <ui-icon class=\"actions-menu-item-icon\" [name]=\"entry.tag.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"actions-menu-item-label\">{{ entry.tag.label }}</span>\n @if (entry.trailingIcon) {\n <ui-icon\n class=\"actions-menu-item-trailing\"\n [name]=\"entry.trailingIcon\"\n [color]=\"'inherit'\"\n ></ui-icon>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n\n @if (actionTag(); as at) {\n @if (!collapseActionTags()) {\n <ui-tag\n [label]=\"at.label\"\n [icon]=\"actionTagIcon()\"\n [ariaLabel]=\"at.ariaLabel ?? at.label\"\n [isDisabled]=\"isLocked() || !!at.disabled\"\n (press)=\"onActionTagPress()\"\n ></ui-tag>\n }\n } @else if (enableFileUpload()) {\n <ui-button\n [variant]=\"'icon-button'\"\n [tooltip]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [iconName]=\"'Plus'\"\n [disabled]=\"isLocked()\"\n (click)=\"fileDrop()?.nativeElement?.click()\"\n ></ui-button>\n\n @if (promptFilesList().length) {\n <div class=\"menu\" animate.enter=\"cnp-prompt-pop-in\">\n <ui-badge\n [notificationsAmount]=\"promptFilesList().length\"\n [variant]=\"'notification'\"\n class=\"menu-badge\"\n ></ui-badge>\n <ui-overflow-menu\n [matTooltip]=\"('PROMPT.FILES' | uiTranslate | async)!\"\n [matTooltipPosition]=\"'above'\"\n [buttonSize]=\"'medium'\"\n [iconTrigger]=\"'Document'\"\n [buttonVariant]=\"'ghost'\"\n [buttons]=\"fileListMenuConfig()\"\n [isDynamicMenu]=\"true\"\n [withRemovableOption]=\"true\"\n (selectItem)=\"selectedMenuOption($event)\"\n ></ui-overflow-menu>\n </div>\n }\n }\n\n @if (secondaryActionTag(); as sat) {\n @if (!collapseActionTags()) {\n <ui-tag\n class=\"prompt-secondary-action-tag\"\n [label]=\"sat.label\"\n [icon]=\"sat.icon ?? ''\"\n [ariaLabel]=\"sat.ariaLabel ?? sat.label\"\n [isDisabled]=\"isLocked() || !!sat.disabled\"\n (press)=\"onSecondaryActionTagPress()\"\n ></ui-tag>\n }\n }\n\n @if (actionTag() || enableFileUpload()) {\n <input\n data-testid=\"prompt-file-input\"\n [tabIndex]=\"-1\"\n class=\"form-control\"\n #fileDropRef\n type=\"file\"\n id=\"file-upload\"\n [accept]=\"fileInputAccept()\"\n [disabled]=\"isLocked()\"\n (change)=\"onFileSelected($event)\"\n />\n }\n </div>\n\n @if (tags()?.length && !promptTextValue()) {\n <div class=\"flex-container carousel\" animate.enter=\"cnp-prompt-row-in\">\n <div class=\"tag-container flex-container\" role=\"list\" #tagsScrollContainer>\n @for (tag of tagsVisible(); track tag) {\n <ui-tag\n [label]=\"tag.label\"\n role=\"listitem\"\n [ariaLabel]=\"tag.label\"\n [isDisabled]=\"isLocked()\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n ></ui-tag>\n }\n\n @if (tagsInDropdown().length) {\n <ui-button\n class=\"view-more\"\n variant=\"text-inline\"\n [label]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [ariaLabel]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [size]=\"'medium'\"\n [disabled]=\"isLocked()\"\n (click)=\"toggleDropdown()\"\n (keydown.enter)=\"focusTagDropdown()\"\n cdkOverlayOrigin\n #dropdownTrigger=\"cdkOverlayOrigin\"\n ></ui-button>\n }\n </div>\n\n <div class=\"flex-container\">\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Scroll left button'\"\n [iconName]=\"'Arrow-chevron-left-in-line'\"\n [disabled]=\"isLocked() || tagsScrollContainer.scrollLeft === 0\"\n (click)=\"tagsScrollContainer.scrollBy({ left: -100, behavior: 'smooth' })\"\n ></ui-button>\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Arrow-chevron-right-in-line'\"\n [ariaLabel]=\"'Scroll right button'\"\n [disabled]=\"\n isLocked() ||\n tagsScrollContainer.scrollLeft + tagsScrollContainer.clientWidth >= tagsScrollContainer.scrollWidth\n \"\n (click)=\"tagsScrollContainer.scrollBy({ left: 100, behavior: 'smooth' })\"\n ></ui-button>\n </div>\n </div>\n }\n\n @if (showCharacterCount()) {\n <span class=\"prompt-character-count\" [class.over-limit]=\"isOverCharacterLimit()\"\n >{{ promptTextValue().length }} / {{ maxCharacters() }}</span\n >\n <span class=\"prompt-character-count-status\" aria-live=\"polite\">\n @if (characterCountAnnouncement(); as announcement) {\n {{ announcement.key | uiTranslate: announcement.params | async }}\n }\n </span>\n }\n\n @if (showSendButton()) {\n <ui-button\n class=\"send-button\"\n animate.enter=\"cnp-prompt-pop-in\"\n [variant]=\"'secondary'\"\n [iconName]=\"'Arrow-up-in-line'\"\n [tooltip]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [size]=\"'medium'\"\n [disabled]=\"!canSubmit()\"\n (click)=\"sendPromptData()\"\n ></ui-button>\n }\n </div>\n\n <div class=\"prompt-projected-footer\">\n <ng-content select=\"[promptFooter]\"></ng-content>\n </div>\n </div>\n\n @if (errorMessage()) {\n <div class=\"prompt-error\" animate.enter=\"cnp-prompt-error-in\">\n <ui-icon [name]=\"'Error'\" color=\"red\"></ui-icon>\n <span>{{ errorMessage() }}</span>\n </div>\n }\n\n <!-- Dropdown for hidden tags -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"isDropdownOpened() && !isLocked()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"dropdownOutsideClick()\"\n >\n <div class=\"dropdown-container\" role=\"list\" #tagDropdown tabindex=\"0\" animate.enter=\"cnp-prompt-dropdown-in\">\n @for (tag of tagsInDropdown(); track tag) {\n <div\n class=\"dropdown-tag\"\n tabindex=\"0\"\n [attr.aria-label]=\"tag.label\"\n role=\"listitem\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n >\n {{ tag.label }}\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Built-in items dropdown (UI-877) — opens on focus, typing filters by label -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"itemsDropdownVisible()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"itemsDropdownOutsideClick($event)\"\n >\n <div\n class=\"dropdown-container custom-dropdown-container\"\n animate.enter=\"cnp-prompt-dropdown-in\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @if (dropdownHeading() || showDropdownClose()) {\n <div class=\"dropdown-header\">\n @if (dropdownHeading()) {\n <span class=\"dropdown-heading\">{{ dropdownHeading() }}</span>\n }\n @if (showDropdownClose()) {\n <ui-button\n class=\"dropdown-close\"\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Close-in-line'\"\n [tooltip]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n (click)=\"closeItemsDropdown()\"\n ></ui-button>\n }\n </div>\n }\n <div role=\"list\">\n @for (item of filteredDropdownItems(); track item.id) {\n <div\n class=\"dropdown-tag dropdown-item\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.label\"\n (click)=\"selectDropdownItem(item, $event)\"\n (keydown.enter)=\"selectDropdownItem(item, $event)\"\n (keydown.space)=\"selectDropdownItem(item, $event)\"\n >\n @if (item.icon) {\n <ui-icon class=\"dropdown-item-icon\" [name]=\"item.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"dropdown-item-label\">{{ item.label }}</span>\n <ui-icon class=\"dropdown-item-chevron\" [name]=\"'Arrow-chevron-right-in-line'\" [color]=\"'inherit'\"></ui-icon>\n </div>\n }\n </div>\n </div>\n </ng-template>\n</ng-container>\n","import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { BadgeComponentModule } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { TooltipComponentModule } from '@testgorilla/tgo-ui/components/tooltip';\n\nimport { PromptComponent } from './prompt.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FieldComponentModule,\n ButtonComponentModule,\n OverflowMenuComponentModule,\n TagComponentModule,\n BadgeComponentModule,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n CardComponentModule,\n CdkTextareaAutosize,\n TooltipComponentModule,\n MatTooltip,\n UiTranslatePipe,\n IconComponentModule,\n SkeletonComponent,\n PromptComponent,\n ],\n exports: [PromptComponent],\n})\nexport class PromptModule {}\n"],"mappings":"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"}
@@ -36,7 +36,7 @@ var RadialProgressComponent = class RadialProgressComponent {
36
36
  return this.size === RadialProgressSizeEnum.SMALL ? RadialProgressSizeValue.SMALL : RadialProgressSizeValue.LARGE;
37
37
  }
38
38
  get percentage() {
39
- return Math.round(this.total ? this.value * 100 / this.total : 0);
39
+ return Math.round(this.total ? (this.value ?? 0) * 100 / this.total : 0);
40
40
  }
41
41
  get strokeWidth() {
42
42
  return this.variant === "thin" || this.variant === "empty-thin" ? 4 : 8;
@@ -132,12 +132,15 @@ var RadialProgressComponent = class RadialProgressComponent {
132
132
  "ariaExpanded",
133
133
  "ariaControls",
134
134
  "ariaPressed",
135
+ "ariaHasPopup",
135
136
  "ariaRequired",
136
137
  "ariaLabelledby",
137
138
  "ariaDescribedby",
138
139
  "preventDefault",
139
140
  "hasBackground",
140
141
  "circular",
142
+ "isSingleLineLabel",
143
+ "iconButtonShape",
141
144
  "tooltipPosition",
142
145
  "role",
143
146
  "iconFilled",
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-radial-progress.mjs","names":[],"sources":["../../../components/radial-progress/radial-progress.model.ts","../../../components/radial-progress/radial-progress.component.ts","../../../components/radial-progress/radial-progress.component.html","../../../components/radial-progress/radial-progress.component.module.ts"],"sourcesContent":["export type RadialProgressSize = 'large' | 'small';\n\nexport enum RadialProgressSizeValue {\n LARGE = 64,\n SMALL = 40,\n}\n\nexport enum RadialProgressSizeEnum {\n LARGE = 'large',\n SMALL = 'small',\n}\n\nexport type RadialProgressVariant = 'number' | 'icon-button' | 'thin' | 'empty' | 'empty-thin';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n Optional,\n Output,\n SimpleChanges,\n OnChanges,\n} from '@angular/core';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\n\nimport {\n RadialProgressSize,\n RadialProgressSizeEnum,\n RadialProgressSizeValue,\n RadialProgressVariant,\n} from './radial-progress.model';\n\n@Component({\n selector: 'ui-radial-progress',\n templateUrl: './radial-progress.component.html',\n styleUrls: ['./radial-progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatProgressSpinner, ButtonComponent],\n})\nexport class RadialProgressComponent implements OnChanges {\n /**\n * The size of the component. Defaults to 'small'.\n * @type {RadialProgressSize}\n * @memberof RadialProgressComponent\n */\n @Input() size: RadialProgressSize = RadialProgressSizeEnum.SMALL;\n /**\n * The current value of the progress. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() value = 0;\n /**\n * The value of the total progress. Used to set the cap and used for percentage calculations. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() total = 0;\n\n /**\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() variant: RadialProgressVariant = 'number';\n\n /**\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input() showPercentageSign = true;\n\n /**\n * Icon for icon button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() icon: IconName = '';\n\n /**\n * The tooltip that is displayed on hover. Required for icon-button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() buttonTooltip = '';\n\n /**\n * Color of the progress bar.\n * Defaults to Test Gorilla primary color.\n *\n * @type {string}\n * @memberof RadialProgressComponent\n */\n @HostBinding('style.--color')\n @Input()\n companyColor: string | null;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof ButtonComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * When true (and size === 'large'), the projected content is revealed over\n * the variant's default inner content with a cross-fade animation. Bind to\n * the consumer's externally-controlled state (e.g. a parent card's hover\n * or focus-within state). Has no effect when size === 'small' — the slot\n * is suppressed via display: none at that size.\n *\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input({ transform: booleanAttribute }) showProjectedContent = false;\n\n @Output() buttonClicked = new EventEmitter<Event>();\n\n protected radialProgressSize = RadialProgressSizeEnum;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['companyColor']) {\n this.companyColor = this.applicationTheme === 'classic' ? '#46A997' : '#D410AA';\n }\n }\n\n protected get progressSize(): number {\n return this.size === (RadialProgressSizeEnum.SMALL as RadialProgressSize)\n ? RadialProgressSizeValue.SMALL\n : RadialProgressSizeValue.LARGE;\n }\n\n protected get percentage(): number {\n return Math.round(this.total ? (this.value * 100) / this.total : 0);\n }\n\n protected get strokeWidth(): number {\n return this.variant === 'thin' || this.variant === 'empty-thin' ? 4 : 8;\n }\n\n protected get displayValue(): string {\n return this.showPercentageSign ? `${this.percentage}%` : `${this.percentage}`;\n }\n\n protected onButtonClick(ev: Event): void {\n this.buttonClicked.emit(ev);\n }\n}\n","<div\n class=\"radial-progress-container\"\n [attr.theme]=\"applicationTheme\"\n [style.width]=\"progressSize + 'px'\"\n [style.height]=\"progressSize + 'px'\"\n>\n <div class=\"background\" [style.border-width]=\"strokeWidth + 'px'\"></div>\n\n <mat-progress-spinner\n [strokeWidth]=\"strokeWidth\"\n [diameter]=\"progressSize\"\n [value]=\"percentage\"\n ></mat-progress-spinner>\n\n <div\n class=\"inner-container size-{{ size }}\"\n [class.has-revealed-content]=\"showProjectedContent\"\n [class.small-font]=\"(variant === 'thin' || variant === 'empty-thin') && percentage !== 100\"\n [class.tiny-font]=\"percentage === 100 && showPercentageSign && variant === 'thin'\"\n >\n <div class=\"default-content\" [attr.inert]=\"showProjectedContent ? '' : null\">\n @if (variant === 'empty' || variant === 'empty-thin') {\n <div>{{ '-' }}</div>\n } @else if (variant === 'icon-button' && size !== 'small') {\n <ui-button\n [tooltip]=\"buttonTooltip\"\n [iconName]=\"icon\"\n [variant]=\"'icon-button'\"\n (click)=\"onButtonClick($event)\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-button>\n } @else if (size === radialProgressSize.LARGE || variant === 'thin') {\n <div class=\"value\">\n {{ displayValue }}\n </div>\n }\n </div>\n <div class=\"projected-content\" [attr.inert]=\"showProjectedContent ? null : ''\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\n\nimport { RadialProgressComponent } from './radial-progress.component';\n\n@NgModule({\n exports: [RadialProgressComponent],\n imports: [CommonModule, MatProgressSpinnerModule, ButtonComponentModule, RadialProgressComponent],\n})\nexport class RadialProgressComponentModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-radial-progress.mjs","names":[],"sources":["../../../components/radial-progress/radial-progress.model.ts","../../../components/radial-progress/radial-progress.component.ts","../../../components/radial-progress/radial-progress.component.html","../../../components/radial-progress/radial-progress.component.module.ts"],"sourcesContent":["export type RadialProgressSize = 'large' | 'small';\n\nexport enum RadialProgressSizeValue {\n LARGE = 64,\n SMALL = 40,\n}\n\nexport enum RadialProgressSizeEnum {\n LARGE = 'large',\n SMALL = 'small',\n}\n\nexport type RadialProgressVariant = 'number' | 'icon-button' | 'thin' | 'empty' | 'empty-thin';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n Optional,\n Output,\n SimpleChanges,\n OnChanges,\n} from '@angular/core';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\n\nimport {\n RadialProgressSize,\n RadialProgressSizeEnum,\n RadialProgressSizeValue,\n RadialProgressVariant,\n} from './radial-progress.model';\n\n@Component({\n selector: 'ui-radial-progress',\n templateUrl: './radial-progress.component.html',\n styleUrls: ['./radial-progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatProgressSpinner, ButtonComponent],\n})\nexport class RadialProgressComponent implements OnChanges {\n /**\n * The size of the component. Defaults to 'small'.\n * @type {RadialProgressSize}\n * @memberof RadialProgressComponent\n */\n @Input() size: RadialProgressSize = RadialProgressSizeEnum.SMALL;\n /**\n * The current value of the progress. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() value = 0;\n /**\n * The value of the total progress. Used to set the cap and used for percentage calculations. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() total = 0;\n\n /**\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() variant: RadialProgressVariant = 'number';\n\n /**\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input() showPercentageSign = true;\n\n /**\n * Icon for icon button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() icon: IconName = '';\n\n /**\n * The tooltip that is displayed on hover. Required for icon-button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() buttonTooltip = '';\n\n /**\n * Color of the progress bar.\n * Defaults to Test Gorilla primary color.\n *\n * @type {string}\n * @memberof RadialProgressComponent\n */\n @HostBinding('style.--color')\n @Input()\n companyColor: string | null;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof ButtonComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * When true (and size === 'large'), the projected content is revealed over\n * the variant's default inner content with a cross-fade animation. Bind to\n * the consumer's externally-controlled state (e.g. a parent card's hover\n * or focus-within state). Has no effect when size === 'small' — the slot\n * is suppressed via display: none at that size.\n *\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input({ transform: booleanAttribute }) showProjectedContent = false;\n\n @Output() buttonClicked = new EventEmitter<Event>();\n\n protected radialProgressSize = RadialProgressSizeEnum;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['companyColor']) {\n this.companyColor = this.applicationTheme === 'classic' ? '#46A997' : '#D410AA';\n }\n }\n\n protected get progressSize(): number {\n return this.size === (RadialProgressSizeEnum.SMALL as RadialProgressSize)\n ? RadialProgressSizeValue.SMALL\n : RadialProgressSizeValue.LARGE;\n }\n\n protected get percentage(): number {\n // A template `a?.b` binding yields `undefined` since Angular 22 (it was `null`, which counted as 0).\n return Math.round(this.total ? ((this.value ?? 0) * 100) / this.total : 0);\n }\n\n protected get strokeWidth(): number {\n return this.variant === 'thin' || this.variant === 'empty-thin' ? 4 : 8;\n }\n\n protected get displayValue(): string {\n return this.showPercentageSign ? `${this.percentage}%` : `${this.percentage}`;\n }\n\n protected onButtonClick(ev: Event): void {\n this.buttonClicked.emit(ev);\n }\n}\n","<div\n class=\"radial-progress-container\"\n [attr.theme]=\"applicationTheme\"\n [style.width]=\"progressSize + 'px'\"\n [style.height]=\"progressSize + 'px'\"\n>\n <div class=\"background\" [style.border-width]=\"strokeWidth + 'px'\"></div>\n\n <mat-progress-spinner\n [strokeWidth]=\"strokeWidth\"\n [diameter]=\"progressSize\"\n [value]=\"percentage\"\n ></mat-progress-spinner>\n\n <div\n class=\"inner-container size-{{ size }}\"\n [class.has-revealed-content]=\"showProjectedContent\"\n [class.small-font]=\"(variant === 'thin' || variant === 'empty-thin') && percentage !== 100\"\n [class.tiny-font]=\"percentage === 100 && showPercentageSign && variant === 'thin'\"\n >\n <div class=\"default-content\" [attr.inert]=\"showProjectedContent ? '' : null\">\n @if (variant === 'empty' || variant === 'empty-thin') {\n <div>{{ '-' }}</div>\n } @else if (variant === 'icon-button' && size !== 'small') {\n <ui-button\n [tooltip]=\"buttonTooltip\"\n [iconName]=\"icon\"\n [variant]=\"'icon-button'\"\n (click)=\"onButtonClick($event)\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-button>\n } @else if (size === radialProgressSize.LARGE || variant === 'thin') {\n <div class=\"value\">\n {{ displayValue }}\n </div>\n }\n </div>\n <div class=\"projected-content\" [attr.inert]=\"showProjectedContent ? null : ''\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\n\nimport { RadialProgressComponent } from './radial-progress.component';\n\n@NgModule({\n exports: [RadialProgressComponent],\n imports: [CommonModule, MatProgressSpinnerModule, ButtonComponentModule, RadialProgressComponent],\n})\nexport class RadialProgressComponentModule {}\n"],"mappings":"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"}
@@ -148,11 +148,14 @@ var RadioButtonComponent = class RadioButtonComponent {
148
148
  onLabelEllipsisChange(isEllipsis) {
149
149
  this.showTooltip = isEllipsis && !this.hideTooltipOnEllipsis;
150
150
  }
151
+ matchesControlValue(controlValue) {
152
+ return this.value !== void 0 && controlValue === this.value;
153
+ }
151
154
  checkHost() {
152
155
  if (this.hostNgControl) {
153
- this.selected = this.value === this.hostNgControl.value;
156
+ this.selected = this.matchesControlValue(this.hostNgControl.value);
154
157
  this.hostNgControl.valueChanges?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
155
- this.selected = value === this.value;
158
+ this.selected = this.matchesControlValue(value);
156
159
  this.classMultiple = this.setClass();
157
160
  });
158
161
  }