@testgorilla/tgo-ui 12.0.4 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +1 -0
  2. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  3. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +1 -0
  4. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  5. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +1 -0
  6. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  7. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +1 -0
  8. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  9. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +14 -4
  10. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  11. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +1 -0
  12. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  13. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +2 -0
  14. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  15. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +1 -0
  16. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  17. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +1 -0
  18. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  19. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +1 -0
  20. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  21. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +1 -0
  22. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  23. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +1 -0
  24. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  25. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +1 -0
  26. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  27. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +1 -0
  28. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  29. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +2 -0
  30. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  31. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +1 -0
  32. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  33. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +1 -0
  34. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  35. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +1 -0
  36. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  37. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +1 -0
  38. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  39. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +1 -0
  40. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  41. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +1 -0
  42. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  43. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +1 -0
  44. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  45. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +1 -0
  46. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  47. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +1 -0
  48. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  49. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +1 -0
  50. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  51. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +1 -0
  52. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  53. package/mcp/catalog.json +1 -1
  54. package/package.json +1 -1
  55. package/types/testgorilla-tgo-ui-components-button.d.ts +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-overflow-menu.mjs","names":[],"sources":["../../../components/overflow-menu/overflow-menu.component.ts","../../../components/overflow-menu/overflow-menu.component.html","../../../components/overflow-menu/overflow-menu.component.module.ts"],"sourcesContent":["import { FocusMonitor } from '@angular/cdk/a11y';\nimport { DOCUMENT, NgClass, NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Inject,\n inject,\n Input,\n input,\n NgZone,\n OnInit,\n Optional,\n Output,\n QueryList,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewChildren,\n ViewEncapsulation,\n OnChanges,\n AfterViewInit,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatMenu, MatMenuTrigger, MatMenuItem } from '@angular/material/menu';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { startWith } from 'rxjs';\n\nimport { ButtonColor, ButtonSize, ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, EllipseTextDirective, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconName, IconComponent } from '@testgorilla/tgo-ui/components/icon';\n\nimport {\n MenuConfig,\n OverflowMenuButtonModify,\n OverflowMenuButtonsType,\n OverflowMenuSelectionMode,\n} from './overflow-menu.model';\n\nconst DEFAULT_MENU_CONFIG: MenuConfig = {\n overlapTrigger: false,\n panelClass: '',\n xPosition: 'after',\n yPosition: 'below',\n};\n\n@Component({\n selector: 'ui-overflow-menu',\n templateUrl: './overflow-menu.component.html',\n styleUrls: ['./overflow-menu.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n MatMenuTrigger,\n MatTooltip,\n ButtonComponent,\n NgTemplateOutlet,\n IconComponent,\n MatMenu,\n EllipseTextDirective,\n MatMenuItem,\n AsyncPipe,\n UiTranslatePipe,\n ],\n})\nexport class OverflowMenuComponent implements OnInit, OnChanges, AfterViewInit {\n /**\n * Menu buttons\n *\n * @type {OverflowMenuButtonsType[]}\n * @memberof OverflowMenuComponent\n */\n @Input() buttons: OverflowMenuButtonsType[];\n\n /**\n * Menu icon trigger\n *\n * @memberof OverflowMenuComponent\n */\n @Input() iconTrigger: IconName = 'Menu-ellipsis';\n\n /**\n * Label menu\n *\n * @memberof OverflowMenuComponent\n */\n @Input() menuLabel = '';\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof OverflowMenuComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * A string representing the ARIA label for accessibility.\n * This label is used to provide an accessible name for the input element.\n * @type {string}\n * @memberof OverflowMenuComponent\n */\n @Input() ariaLabel: string;\n\n @Input() testId: string | null = null;\n\n /**\n * A string representing the ARIA requirement for accessibility.\n * This attribute is used to indicate whether an input field is required for form submission.\n * @type {boolean}\n * @memberof OverflowMenuComponent\n */\n @Input() ariaRequired = false;\n\n /**\n * A string representing the ARIA requirement for accessibility.\n * This attribute is used to indicate whether an input for description.\n * @type {text}\n * @memberof OverflowMenuComponent\n */\n @Input() describedby = '';\n\n /**\n * Custom template for the button (optional)\n *\n * @type {TemplateRef<unknown>}\n * @memberof OverflowMenuComponent\n */\n @Input() contentTemplateRef: TemplateRef<unknown>;\n\n /**\n * Button variant for the overflow menu trigger\n * When null, uses the default icon rendering\n *\n * @type {ButtonColor | null}\n * @memberof OverflowMenuComponent\n */\n @Input() buttonVariant: ButtonColor | null = null;\n\n /**\n * Button size for the overflow menu trigger\n *\n * @type {ButtonSize}\n * @memberof OverflowMenuComponent\n */\n @Input() buttonSize: ButtonSize = 'medium';\n\n @Input() menuConfig: MenuConfig = DEFAULT_MENU_CONFIG;\n\n /**\n * Selection semantics of the menu. 'single' renders every entry as a menuitemradio whose\n * aria-checked and right-aligned check come from the button's isSelected flag; 'none' keeps\n * plain menuitem entries.\n *\n * @type {OverflowMenuSelectionMode}\n * @memberof OverflowMenuComponent\n */\n readonly selectionMode = input<OverflowMenuSelectionMode>('none');\n\n /**\n * Element the dropdown is positioned against, instead of the trigger: an element, or a selector\n * resolved as the trigger's closest matching ancestor (e.g. `'ui-tag'` to open from the start of\n * the tag the trigger sits in). Read when the dropdown is first opened.\n *\n * @type {string | HTMLElement | null}\n * @memberof OverflowMenuComponent\n */\n readonly menuAnchor = input<string | HTMLElement | null>(null);\n\n /**\n * Makes the open dropdown as wide as its anchor (`menuAnchor`, or the trigger when none is set),\n * instead of sizing it to its content. Measured each time it opens.\n *\n * @type {boolean}\n * @default false\n * @memberof OverflowMenuComponent\n */\n readonly shouldMatchAnchorWidth = input(false, { transform: booleanAttribute });\n\n @Input() isDynamicMenu = false;\n\n @Input() withRemovableOption = false;\n\n @Output() selectItem: EventEmitter<string> = new EventEmitter<string>();\n\n @Output() menuOpened = new EventEmitter<void>();\n\n @Output() menuClosed = new EventEmitter<void>();\n\n @ViewChildren(MatMenu) matmenus: QueryList<MatMenu>;\n @ViewChildren(MatMenuTrigger) matTrigger: QueryList<MatMenuTrigger>;\n @ViewChild('buttonElement') buttonElement: ElementRef<HTMLElement>;\n\n menuItems: string[] = [];\n submenus: Array<OverflowMenuButtonModify[]> = [];\n\n isMenuRendered = signal(false);\n isMenuOpened = signal(false);\n isFocused = signal(false);\n\n get menuItemHasHovered(): boolean {\n return this.submenus.some(menu => menu.some(item => item.isHovered));\n }\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly anchoredTriggers = new WeakSet<MatMenuTrigger>();\n private readonly document = inject(DOCUMENT);\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n private readonly focusMonitor: FocusMonitor,\n private readonly ngZone: NgZone\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnInit() {\n this.createSubmenus(this.buttons, 's0', 1);\n this.reindex();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Selection menus re-render on their own: the natural flow is to hand in a new buttons array\n // after a pick, and requiring isDynamicMenu for the check to move would be an untold coupling.\n if (changes['buttons'] && (this.isDynamicMenu || this.selectionMode() === 'single')) {\n this.resetSubmenus();\n this.createSubmenus(this.buttons, 's0', 1);\n this.reindex();\n }\n }\n\n ngAfterViewInit() {\n this.isMenuRendered.set(true);\n\n // The trigger renders after this hook (it waits on isMenuRendered), so anchor it once it appears.\n this.matTrigger.changes\n .pipe(startWith(this.matTrigger), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.anchorTrigger(this.matTrigger.first));\n\n setTimeout(() => {\n this.focusMonitor\n .monitor(this.buttonElement)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(origin =>\n this.ngZone.run(() => {\n if (origin === 'keyboard') {\n this.isFocused.set(true);\n } else {\n if (!this.isMenuOpened()) {\n this.isFocused.set(false);\n }\n }\n })\n );\n }, 300);\n }\n\n /**\n * MatMenuTrigger has no public way to position against another element: it takes its origin from\n * the protected `_getOverlayOrigin()` when it first creates the overlay. Overriding it on the root\n * trigger lets `menuAnchor` move the origin, falling back to the trigger itself.\n */\n private anchorTrigger(trigger: MatMenuTrigger | undefined): void {\n if (!trigger || this.anchoredTriggers.has(trigger)) {\n return;\n }\n this.anchoredTriggers.add(trigger);\n\n const anchorable = trigger as unknown as { _getOverlayOrigin: () => ElementRef<HTMLElement> | HTMLElement };\n // eslint-disable-next-line no-underscore-dangle -- _getOverlayOrigin is MatMenuTrigger's protected origin hook\n const ownOrigin = anchorable._getOverlayOrigin.bind(trigger);\n // eslint-disable-next-line no-underscore-dangle -- see above\n anchorable._getOverlayOrigin = () => this.resolveMenuAnchor() ?? ownOrigin();\n }\n\n private resolveMenuAnchor(): HTMLElement | null {\n const anchor = this.menuAnchor();\n if (typeof anchor === 'string') {\n return this.buttonElement?.nativeElement.closest<HTMLElement>(anchor) ?? null;\n }\n return anchor;\n }\n\n /** Sizes the open panel to the anchor (or the trigger), overriding Material's 112–280px panel limits. */\n private matchPanelToAnchorWidth(): void {\n if (!this.shouldMatchAnchorWidth()) {\n return;\n }\n const anchor = this.resolveMenuAnchor() ?? this.buttonElement?.nativeElement;\n const panelId = this.matmenus.first?.panelId;\n const panel = panelId ? this.document.getElementById(panelId) : null;\n if (!anchor || !panel) {\n return;\n }\n const width = `${anchor.getBoundingClientRect().width}px`;\n panel.style.width = width;\n panel.style.minWidth = width;\n panel.style.maxWidth = width;\n // The theme also caps the content at 340px; left alone, it would stop short of a wider panel.\n const content = panel.querySelector<HTMLElement>('.mat-mdc-menu-content');\n if (content) {\n content.style.maxWidth = 'none';\n }\n }\n\n /** Opens the dropdown programmatically, as if the trigger had been used. */\n openMenu(): void {\n this.matTrigger.first?.openMenu();\n }\n\n /** Closes the dropdown, whichever way it was opened. */\n closeMenu(): void {\n this.matTrigger.first?.closeMenu();\n }\n\n onSelectItem(event: Event, value: string) {\n if (value) {\n this.selectItem.emit(value);\n }\n }\n\n onMenuOpened(): void {\n this.menuOpened.emit();\n this.isMenuOpened.set(true);\n this.matchPanelToAnchorWidth();\n\n if (this.isFocused()) {\n setTimeout(() => {\n // eslint-disable-next-line no-underscore-dangle -- _allItems is MatMenu's internal item query\n this.matmenus.first._allItems.first.focus('keyboard');\n }, 300);\n }\n }\n\n onMenuClosed(): void {\n this.isMenuOpened.set(false);\n this.menuClosed.emit();\n }\n\n onButtonFocus(button: OverflowMenuButtonModify) {\n if (this.isFocused()) {\n button.isFocused = true;\n }\n }\n\n onButtonBlur(button: OverflowMenuButtonModify) {\n button.isFocused = false;\n }\n\n onButtonClick(button: OverflowMenuButtonModify, $event: Event) {\n if (button.disabled) {\n $event.preventDefault();\n $event.stopPropagation();\n } else {\n this.onSelectItem($event, button.value);\n }\n }\n\n onSubmenuOpened(): void {\n this.isMenuOpened.set(!this.isMenuOpened);\n if (this.isFocused()) {\n setTimeout(() => {\n // eslint-disable-next-line no-underscore-dangle -- _allItems is MatMenu's internal item query\n this.matmenus.last._allItems.first.focus('keyboard');\n }, 300);\n }\n }\n\n trackByButton = (_: number, btn: OverflowMenuButtonModify) => btn.action ?? btn.value ?? btn.label;\n\n onButtonHover(button: OverflowMenuButtonModify, state: boolean) {\n button.isHovered = state;\n }\n\n getMenu(index: unknown) {\n return typeof index === 'number' && index >= 0 && this.matmenus\n ? (this.matmenus.find((x, i) => i === index) ?? null)\n : null;\n }\n\n private reindex() {\n this.submenus.forEach((menu: OverflowMenuButtonsType[]) => {\n menu.forEach((item: OverflowMenuButtonsType) => {\n if (item.subMenu !== -1) {\n item.subMenu = this.menuItems.indexOf(`${item.action}`);\n }\n });\n });\n }\n\n private resetSubmenus() {\n this.submenus = [];\n this.menuItems = [];\n }\n\n private createSubmenus(menu: OverflowMenuButtonsType[], prefix: string, count: number): void {\n this.menuItems.push(prefix);\n this.submenus.push(\n menu.map((item: OverflowMenuButtonsType, index: number) => ({\n label: item.label,\n icon: item.icon,\n isDestructive: item.isDestructive,\n tooltipText: item.tooltipText,\n value: item.value,\n disabled: item.disabled,\n isSelected: item.isSelected,\n btnTemplate: item.btnTemplate,\n subMenu: item.subMenu ? 0 : -1,\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- an empty action falls back to a generated key\n action: item.action ? item.action : prefix + index,\n isTitleButton: item.isTitleButton,\n hideTitleButton: item.hideTitleButton,\n isPremium: item.isPremium,\n // The template reads these off the copy, so omitting them leaves the menu items' ARIA unset.\n ariaLabel: item.ariaLabel,\n describedby: item.describedby,\n testId: item.testId,\n }))\n );\n\n menu.forEach((item: OverflowMenuButtonsType, index: number) => {\n if (item.subMenu) {\n this.createSubmenus((item as { subMenu: OverflowMenuButtonsType[] }).subMenu, prefix + index, count + 1);\n }\n });\n }\n}\n","<div class=\"overflow-menu-container\" [attr.theme]=\"applicationTheme\">\n @if (isMenuRendered()) {\n <button\n #buttonElement\n [ngClass]=\"{\n 'icon-button': !contentTemplateRef && !buttonVariant,\n 'content-template': contentTemplateRef,\n 'no-hover': buttonVariant,\n }\"\n [matMenuTriggerFor]=\"matmenus.first\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-required]=\"ariaRequired\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"isMenuOpened()\"\n [attr.data-testid]=\"testId\"\n (menuOpened)=\"onMenuOpened()\"\n (menuClosed)=\"onMenuClosed()\"\n class=\"overflow-menu-opener\"\n [matTooltip]=\"menuLabel\"\n >\n <span [id]=\"'describedby'\" [style.display]=\"'none'\">{{ describedby }}</span>\n @if (buttonVariant) {\n <ui-button\n [variant]=\"buttonVariant\"\n [justIcon]=\"true\"\n [iconName]=\"iconTrigger\"\n [applicationTheme]=\"applicationTheme\"\n [disabled]=\"false\"\n [size]=\"buttonSize\"\n >\n </ui-button>\n } @else if (contentTemplateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTemplateRef\"></ng-container>\n } @else {\n <ui-icon\n [name]=\"iconTrigger\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'24'\"\n [color]=\"'rebrand-black'\"\n ></ui-icon>\n }\n </button>\n }\n\n <!-- Tracked by index so refreshing the buttons re-renders the rows without destroying an open\n mat-menu, whose trigger would otherwise be left holding a dead overlay. -->\n @for (menu of submenus; track $index) {\n <mat-menu\n [xPosition]=\"menuConfig.xPosition\"\n [yPosition]=\"menuConfig.yPosition\"\n #matMenu\n [class]=\"'overflow-menu ' + menuConfig.panelClass\"\n [overlapTrigger]=\"menuConfig.overlapTrigger\"\n backdropClass=\"overflow-menu-backdrop\"\n >\n @for (button of menu; track trackByButton(id, button); let id = $index) {\n @if (button.btnTemplate) {\n <!-- Menu option by provided button template-->\n <ng-container\n [ngTemplateOutlet]=\"button.btnTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: button }\"\n ></ng-container>\n } @else if (withRemovableOption) {\n <!-- Simple menu option that can be removed dynamically -->\n <div class=\"menu-option\" [ngClass]=\"{ 'is-destructive': button.isDestructive, disabled: button.disabled }\">\n <span\n [id]=\"'labelledby-' + button.label + id\"\n class=\"label\"\n uiEllipseText\n [refresh]=\"isMenuOpened()\"\n [maxDiffPixels]=\"1\"\n [isMultiline]=\"true\"\n (onChangeTextState)=\"button.isTextEllipsed = $event\"\n >{{ button.label }}\n </span>\n @if (button.icon) {\n <ui-button\n variant=\"icon-button\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"button.icon\"\n [tooltip]=\"button.tooltipText ? button.tooltipText : button.isTextEllipsed ? button.label : ''\"\n [tooltipPosition]=\"'above'\"\n [size]=\"'medium'\"\n (focus)=\"onButtonFocus(button)\"\n (blur)=\"onButtonBlur(button)\"\n (mouseenter)=\"onButtonHover(button, true)\"\n (mouseleave)=\"onButtonHover(button, false)\"\n (click)=\"onSelectItem($event, button.value)\"\n [testId]=\"button.testId ?? null\"\n [ariaLabel]=\"button.ariaLabel || button.label\"\n >\n </ui-button>\n }\n </div>\n } @else {\n <!-- Default non-removable menu option -->\n @if (button.isTitleButton && !button.hideTitleButton) {\n <div class=\"menu-title\">{{ button.label }}</div>\n }\n @if (!button.isTitleButton) {\n <button\n mat-menu-item\n [matMenuTriggerFor]=\"getMenu(button.subMenu)\"\n (menuOpened)=\"onSubmenuOpened()\"\n (focus)=\"onButtonFocus(button)\"\n (blur)=\"onButtonBlur(button)\"\n (mouseenter)=\"onButtonHover(button, true)\"\n (mouseleave)=\"onButtonHover(button, false)\"\n [ngClass]=\"{\n 'is-destructive': button.isDestructive,\n disabled: button.disabled,\n 'overflow-menu-item-selectable': selectionMode() === 'single',\n }\"\n disableRipple\n (click)=\"onButtonClick(button, $event)\"\n [matTooltip]=\"button.tooltipText ? button.tooltipText : button.isTextEllipsed ? button.label : ''\"\n [attr.aria-labelledby]=\"'labelledby-' + button.label + id\"\n [attr.aria-describedby]=\"'describedby-' + button.label + id\"\n [attr.aria-label]=\"button.ariaLabel || null\"\n [role]=\"selectionMode() === 'single' ? 'menuitemradio' : 'menuitem'\"\n [attr.aria-checked]=\"selectionMode() === 'single' ? !!button.isSelected : null\"\n [attr.data-testid]=\"button.testId ?? null\"\n matTooltipPosition=\"right\"\n >\n <span [id]=\"'describedby-' + button.label + id\" [style.display]=\"'none'\">\n {{\n button.disabled\n ? ('MENU.MENUITEM_DISABLED' | uiTranslate | async) + ' ' + (button.describedby || '')\n : button.describedby\n }}\n </span>\n @if (button.icon) {\n <ui-icon\n [name]=\"button.icon\"\n [toggleIconStyle]=\"true\"\n [filled]=\"\n button.disabled ? false : button.isHovered ? true : menuItemHasHovered ? false : !!button.isFocused\n \"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'24'\"\n [color]=\"button.disabled ? 'dark' : button.isDestructive ? 'red' : 'rebrand-black'\"\n ></ui-icon>\n }\n <span\n [id]=\"'labelledby-' + button.label + id\"\n class=\"label\"\n uiEllipseText\n [refresh]=\"isMenuOpened()\"\n [maxDiffPixels]=\"1\"\n [isMultiline]=\"true\"\n (onChangeTextState)=\"button.isTextEllipsed = $event\"\n >{{ button.label }}</span\n >\n @if (selectionMode() === 'single' && button.isSelected) {\n <ui-icon\n class=\"overflow-menu-selected-check\"\n [name]=\"'Check-small-in-line'\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'16'\"\n [color]=\"'rebrand-black'\"\n ></ui-icon>\n }\n @if (button.isPremium) {\n <ui-icon\n [name]=\"'Premium-circle-in-line'\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'24'\"\n class=\"premium-icon\"\n ></ui-icon>\n }\n </button>\n }\n }\n }\n\n <ng-content select=\"[menu-content]\"></ng-content>\n </mat-menu>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { EllipseTextDirective, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { OverflowMenuComponent } from './overflow-menu.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ButtonComponentModule,\n IconComponentModule,\n MatMenuModule,\n MatButtonModule,\n MatTooltipModule,\n EllipseTextDirective,\n UiTranslatePipe,\n OverflowMenuComponent,\n ],\n exports: [OverflowMenuComponent],\n})\nexport class OverflowMenuComponentModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-overflow-menu.mjs","names":[],"sources":["../../../components/overflow-menu/overflow-menu.component.ts","../../../components/overflow-menu/overflow-menu.component.html","../../../components/overflow-menu/overflow-menu.component.module.ts"],"sourcesContent":["import { FocusMonitor } from '@angular/cdk/a11y';\nimport { DOCUMENT, NgClass, NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Inject,\n inject,\n Input,\n input,\n NgZone,\n OnInit,\n Optional,\n Output,\n QueryList,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewChildren,\n ViewEncapsulation,\n OnChanges,\n AfterViewInit,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatMenu, MatMenuTrigger, MatMenuItem } from '@angular/material/menu';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { startWith } from 'rxjs';\n\nimport { ButtonColor, ButtonSize, ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, EllipseTextDirective, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconName, IconComponent } from '@testgorilla/tgo-ui/components/icon';\n\nimport {\n MenuConfig,\n OverflowMenuButtonModify,\n OverflowMenuButtonsType,\n OverflowMenuSelectionMode,\n} from './overflow-menu.model';\n\nconst DEFAULT_MENU_CONFIG: MenuConfig = {\n overlapTrigger: false,\n panelClass: '',\n xPosition: 'after',\n yPosition: 'below',\n};\n\n@Component({\n selector: 'ui-overflow-menu',\n templateUrl: './overflow-menu.component.html',\n styleUrls: ['./overflow-menu.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n MatMenuTrigger,\n MatTooltip,\n ButtonComponent,\n NgTemplateOutlet,\n IconComponent,\n MatMenu,\n EllipseTextDirective,\n MatMenuItem,\n AsyncPipe,\n UiTranslatePipe,\n ],\n})\nexport class OverflowMenuComponent implements OnInit, OnChanges, AfterViewInit {\n /**\n * Menu buttons\n *\n * @type {OverflowMenuButtonsType[]}\n * @memberof OverflowMenuComponent\n */\n @Input() buttons: OverflowMenuButtonsType[];\n\n /**\n * Menu icon trigger\n *\n * @memberof OverflowMenuComponent\n */\n @Input() iconTrigger: IconName = 'Menu-ellipsis';\n\n /**\n * Label menu\n *\n * @memberof OverflowMenuComponent\n */\n @Input() menuLabel = '';\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof OverflowMenuComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * A string representing the ARIA label for accessibility.\n * This label is used to provide an accessible name for the input element.\n * @type {string}\n * @memberof OverflowMenuComponent\n */\n @Input() ariaLabel: string;\n\n @Input() testId: string | null = null;\n\n /**\n * A string representing the ARIA requirement for accessibility.\n * This attribute is used to indicate whether an input field is required for form submission.\n * @type {boolean}\n * @memberof OverflowMenuComponent\n */\n @Input() ariaRequired = false;\n\n /**\n * A string representing the ARIA requirement for accessibility.\n * This attribute is used to indicate whether an input for description.\n * @type {text}\n * @memberof OverflowMenuComponent\n */\n @Input() describedby = '';\n\n /**\n * Custom template for the button (optional)\n *\n * @type {TemplateRef<unknown>}\n * @memberof OverflowMenuComponent\n */\n @Input() contentTemplateRef: TemplateRef<unknown>;\n\n /**\n * Button variant for the overflow menu trigger\n * When null, uses the default icon rendering\n *\n * @type {ButtonColor | null}\n * @memberof OverflowMenuComponent\n */\n @Input() buttonVariant: ButtonColor | null = null;\n\n /**\n * Button size for the overflow menu trigger\n *\n * @type {ButtonSize}\n * @memberof OverflowMenuComponent\n */\n @Input() buttonSize: ButtonSize = 'medium';\n\n @Input() menuConfig: MenuConfig = DEFAULT_MENU_CONFIG;\n\n /**\n * Selection semantics of the menu. 'single' renders every entry as a menuitemradio whose\n * aria-checked and right-aligned check come from the button's isSelected flag; 'none' keeps\n * plain menuitem entries.\n *\n * @type {OverflowMenuSelectionMode}\n * @memberof OverflowMenuComponent\n */\n readonly selectionMode = input<OverflowMenuSelectionMode>('none');\n\n /**\n * Element the dropdown is positioned against, instead of the trigger: an element, or a selector\n * resolved as the trigger's closest matching ancestor (e.g. `'ui-tag'` to open from the start of\n * the tag the trigger sits in). Read when the dropdown is first opened.\n *\n * @type {string | HTMLElement | null}\n * @memberof OverflowMenuComponent\n */\n readonly menuAnchor = input<string | HTMLElement | null>(null);\n\n /**\n * Makes the open dropdown as wide as its anchor (`menuAnchor`, or the trigger when none is set),\n * instead of sizing it to its content. Measured each time it opens.\n *\n * @type {boolean}\n * @default false\n * @memberof OverflowMenuComponent\n */\n readonly shouldMatchAnchorWidth = input(false, { transform: booleanAttribute });\n\n @Input() isDynamicMenu = false;\n\n @Input() withRemovableOption = false;\n\n @Output() selectItem: EventEmitter<string> = new EventEmitter<string>();\n\n @Output() menuOpened = new EventEmitter<void>();\n\n @Output() menuClosed = new EventEmitter<void>();\n\n @ViewChildren(MatMenu) matmenus: QueryList<MatMenu>;\n @ViewChildren(MatMenuTrigger) matTrigger: QueryList<MatMenuTrigger>;\n @ViewChild('buttonElement') buttonElement: ElementRef<HTMLElement>;\n\n menuItems: string[] = [];\n submenus: Array<OverflowMenuButtonModify[]> = [];\n\n isMenuRendered = signal(false);\n isMenuOpened = signal(false);\n isFocused = signal(false);\n\n get menuItemHasHovered(): boolean {\n return this.submenus.some(menu => menu.some(item => item.isHovered));\n }\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly anchoredTriggers = new WeakSet<MatMenuTrigger>();\n private readonly document = inject(DOCUMENT);\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n private readonly focusMonitor: FocusMonitor,\n private readonly ngZone: NgZone\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnInit() {\n this.createSubmenus(this.buttons, 's0', 1);\n this.reindex();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Selection menus re-render on their own: the natural flow is to hand in a new buttons array\n // after a pick, and requiring isDynamicMenu for the check to move would be an untold coupling.\n if (changes['buttons'] && (this.isDynamicMenu || this.selectionMode() === 'single')) {\n this.resetSubmenus();\n this.createSubmenus(this.buttons, 's0', 1);\n this.reindex();\n }\n }\n\n ngAfterViewInit() {\n this.isMenuRendered.set(true);\n\n // The trigger renders after this hook (it waits on isMenuRendered), so anchor it once it appears.\n this.matTrigger.changes\n .pipe(startWith(this.matTrigger), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.anchorTrigger(this.matTrigger.first));\n\n setTimeout(() => {\n this.focusMonitor\n .monitor(this.buttonElement)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(origin =>\n this.ngZone.run(() => {\n if (origin === 'keyboard') {\n this.isFocused.set(true);\n } else {\n if (!this.isMenuOpened()) {\n this.isFocused.set(false);\n }\n }\n })\n );\n }, 300);\n }\n\n /**\n * MatMenuTrigger has no public way to position against another element: it takes its origin from\n * the protected `_getOverlayOrigin()` when it first creates the overlay. Overriding it on the root\n * trigger lets `menuAnchor` move the origin, falling back to the trigger itself.\n */\n private anchorTrigger(trigger: MatMenuTrigger | undefined): void {\n if (!trigger || this.anchoredTriggers.has(trigger)) {\n return;\n }\n this.anchoredTriggers.add(trigger);\n\n const anchorable = trigger as unknown as { _getOverlayOrigin: () => ElementRef<HTMLElement> | HTMLElement };\n // eslint-disable-next-line no-underscore-dangle -- _getOverlayOrigin is MatMenuTrigger's protected origin hook\n const ownOrigin = anchorable._getOverlayOrigin.bind(trigger);\n // eslint-disable-next-line no-underscore-dangle -- see above\n anchorable._getOverlayOrigin = () => this.resolveMenuAnchor() ?? ownOrigin();\n }\n\n private resolveMenuAnchor(): HTMLElement | null {\n const anchor = this.menuAnchor();\n if (typeof anchor === 'string') {\n return this.buttonElement?.nativeElement.closest<HTMLElement>(anchor) ?? null;\n }\n return anchor;\n }\n\n /** Sizes the open panel to the anchor (or the trigger), overriding Material's 112–280px panel limits. */\n private matchPanelToAnchorWidth(): void {\n if (!this.shouldMatchAnchorWidth()) {\n return;\n }\n const anchor = this.resolveMenuAnchor() ?? this.buttonElement?.nativeElement;\n const panelId = this.matmenus.first?.panelId;\n const panel = panelId ? this.document.getElementById(panelId) : null;\n if (!anchor || !panel) {\n return;\n }\n const width = `${anchor.getBoundingClientRect().width}px`;\n panel.style.width = width;\n panel.style.minWidth = width;\n panel.style.maxWidth = width;\n // The theme also caps the content at 340px; left alone, it would stop short of a wider panel.\n const content = panel.querySelector<HTMLElement>('.mat-mdc-menu-content');\n if (content) {\n content.style.maxWidth = 'none';\n }\n }\n\n /** Opens the dropdown programmatically, as if the trigger had been used. */\n openMenu(): void {\n this.matTrigger.first?.openMenu();\n }\n\n /** Closes the dropdown, whichever way it was opened. */\n closeMenu(): void {\n this.matTrigger.first?.closeMenu();\n }\n\n onSelectItem(event: Event, value: string) {\n if (value) {\n this.selectItem.emit(value);\n }\n }\n\n onMenuOpened(): void {\n this.menuOpened.emit();\n this.isMenuOpened.set(true);\n this.matchPanelToAnchorWidth();\n\n if (this.isFocused()) {\n setTimeout(() => {\n // eslint-disable-next-line no-underscore-dangle -- _allItems is MatMenu's internal item query\n this.matmenus.first._allItems.first.focus('keyboard');\n }, 300);\n }\n }\n\n onMenuClosed(): void {\n this.isMenuOpened.set(false);\n this.menuClosed.emit();\n }\n\n onButtonFocus(button: OverflowMenuButtonModify) {\n if (this.isFocused()) {\n button.isFocused = true;\n }\n }\n\n onButtonBlur(button: OverflowMenuButtonModify) {\n button.isFocused = false;\n }\n\n onButtonClick(button: OverflowMenuButtonModify, $event: Event) {\n if (button.disabled) {\n $event.preventDefault();\n $event.stopPropagation();\n } else {\n this.onSelectItem($event, button.value);\n }\n }\n\n onSubmenuOpened(): void {\n this.isMenuOpened.set(!this.isMenuOpened);\n if (this.isFocused()) {\n setTimeout(() => {\n // eslint-disable-next-line no-underscore-dangle -- _allItems is MatMenu's internal item query\n this.matmenus.last._allItems.first.focus('keyboard');\n }, 300);\n }\n }\n\n trackByButton = (_: number, btn: OverflowMenuButtonModify) => btn.action ?? btn.value ?? btn.label;\n\n onButtonHover(button: OverflowMenuButtonModify, state: boolean) {\n button.isHovered = state;\n }\n\n getMenu(index: unknown) {\n return typeof index === 'number' && index >= 0 && this.matmenus\n ? (this.matmenus.find((x, i) => i === index) ?? null)\n : null;\n }\n\n private reindex() {\n this.submenus.forEach((menu: OverflowMenuButtonsType[]) => {\n menu.forEach((item: OverflowMenuButtonsType) => {\n if (item.subMenu !== -1) {\n item.subMenu = this.menuItems.indexOf(`${item.action}`);\n }\n });\n });\n }\n\n private resetSubmenus() {\n this.submenus = [];\n this.menuItems = [];\n }\n\n private createSubmenus(menu: OverflowMenuButtonsType[], prefix: string, count: number): void {\n this.menuItems.push(prefix);\n this.submenus.push(\n menu.map((item: OverflowMenuButtonsType, index: number) => ({\n label: item.label,\n icon: item.icon,\n isDestructive: item.isDestructive,\n tooltipText: item.tooltipText,\n value: item.value,\n disabled: item.disabled,\n isSelected: item.isSelected,\n btnTemplate: item.btnTemplate,\n subMenu: item.subMenu ? 0 : -1,\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- an empty action falls back to a generated key\n action: item.action ? item.action : prefix + index,\n isTitleButton: item.isTitleButton,\n hideTitleButton: item.hideTitleButton,\n isPremium: item.isPremium,\n // The template reads these off the copy, so omitting them leaves the menu items' ARIA unset.\n ariaLabel: item.ariaLabel,\n describedby: item.describedby,\n testId: item.testId,\n }))\n );\n\n menu.forEach((item: OverflowMenuButtonsType, index: number) => {\n if (item.subMenu) {\n this.createSubmenus((item as { subMenu: OverflowMenuButtonsType[] }).subMenu, prefix + index, count + 1);\n }\n });\n }\n}\n","<div class=\"overflow-menu-container\" [attr.theme]=\"applicationTheme\">\n @if (isMenuRendered()) {\n <button\n #buttonElement\n [ngClass]=\"{\n 'icon-button': !contentTemplateRef && !buttonVariant,\n 'content-template': contentTemplateRef,\n 'no-hover': buttonVariant,\n }\"\n [matMenuTriggerFor]=\"matmenus.first\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-required]=\"ariaRequired\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"isMenuOpened()\"\n [attr.data-testid]=\"testId\"\n (menuOpened)=\"onMenuOpened()\"\n (menuClosed)=\"onMenuClosed()\"\n class=\"overflow-menu-opener\"\n [matTooltip]=\"menuLabel\"\n >\n <span [id]=\"'describedby'\" [style.display]=\"'none'\">{{ describedby }}</span>\n @if (buttonVariant) {\n <ui-button\n [variant]=\"buttonVariant\"\n [justIcon]=\"true\"\n [iconName]=\"iconTrigger\"\n [applicationTheme]=\"applicationTheme\"\n [disabled]=\"false\"\n [size]=\"buttonSize\"\n >\n </ui-button>\n } @else if (contentTemplateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTemplateRef\"></ng-container>\n } @else {\n <ui-icon\n [name]=\"iconTrigger\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'24'\"\n [color]=\"'rebrand-black'\"\n ></ui-icon>\n }\n </button>\n }\n\n <!-- Tracked by index so refreshing the buttons re-renders the rows without destroying an open\n mat-menu, whose trigger would otherwise be left holding a dead overlay. -->\n @for (menu of submenus; track $index) {\n <mat-menu\n [xPosition]=\"menuConfig.xPosition\"\n [yPosition]=\"menuConfig.yPosition\"\n #matMenu\n [class]=\"'overflow-menu ' + menuConfig.panelClass\"\n [overlapTrigger]=\"menuConfig.overlapTrigger\"\n backdropClass=\"overflow-menu-backdrop\"\n >\n @for (button of menu; track trackByButton(id, button); let id = $index) {\n @if (button.btnTemplate) {\n <!-- Menu option by provided button template-->\n <ng-container\n [ngTemplateOutlet]=\"button.btnTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: button }\"\n ></ng-container>\n } @else if (withRemovableOption) {\n <!-- Simple menu option that can be removed dynamically -->\n <div class=\"menu-option\" [ngClass]=\"{ 'is-destructive': button.isDestructive, disabled: button.disabled }\">\n <span\n [id]=\"'labelledby-' + button.label + id\"\n class=\"label\"\n uiEllipseText\n [refresh]=\"isMenuOpened()\"\n [maxDiffPixels]=\"1\"\n [isMultiline]=\"true\"\n (onChangeTextState)=\"button.isTextEllipsed = $event\"\n >{{ button.label }}\n </span>\n @if (button.icon) {\n <ui-button\n variant=\"icon-button\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"button.icon\"\n [tooltip]=\"button.tooltipText ? button.tooltipText : button.isTextEllipsed ? button.label : ''\"\n [tooltipPosition]=\"'above'\"\n [size]=\"'medium'\"\n (focus)=\"onButtonFocus(button)\"\n (blur)=\"onButtonBlur(button)\"\n (mouseenter)=\"onButtonHover(button, true)\"\n (mouseleave)=\"onButtonHover(button, false)\"\n (click)=\"onSelectItem($event, button.value)\"\n [testId]=\"button.testId ?? null\"\n [ariaLabel]=\"button.ariaLabel || button.label\"\n >\n </ui-button>\n }\n </div>\n } @else {\n <!-- Default non-removable menu option -->\n @if (button.isTitleButton && !button.hideTitleButton) {\n <div class=\"menu-title\">{{ button.label }}</div>\n }\n @if (!button.isTitleButton) {\n <button\n mat-menu-item\n [matMenuTriggerFor]=\"getMenu(button.subMenu)\"\n (menuOpened)=\"onSubmenuOpened()\"\n (focus)=\"onButtonFocus(button)\"\n (blur)=\"onButtonBlur(button)\"\n (mouseenter)=\"onButtonHover(button, true)\"\n (mouseleave)=\"onButtonHover(button, false)\"\n [ngClass]=\"{\n 'is-destructive': button.isDestructive,\n disabled: button.disabled,\n 'overflow-menu-item-selectable': selectionMode() === 'single',\n }\"\n disableRipple\n (click)=\"onButtonClick(button, $event)\"\n [matTooltip]=\"button.tooltipText ? button.tooltipText : button.isTextEllipsed ? button.label : ''\"\n [attr.aria-labelledby]=\"'labelledby-' + button.label + id\"\n [attr.aria-describedby]=\"'describedby-' + button.label + id\"\n [attr.aria-label]=\"button.ariaLabel || null\"\n [role]=\"selectionMode() === 'single' ? 'menuitemradio' : 'menuitem'\"\n [attr.aria-checked]=\"selectionMode() === 'single' ? !!button.isSelected : null\"\n [attr.data-testid]=\"button.testId ?? null\"\n matTooltipPosition=\"right\"\n >\n <span [id]=\"'describedby-' + button.label + id\" [style.display]=\"'none'\">\n {{\n button.disabled\n ? ('MENU.MENUITEM_DISABLED' | uiTranslate | async) + ' ' + (button.describedby || '')\n : button.describedby\n }}\n </span>\n @if (button.icon) {\n <ui-icon\n [name]=\"button.icon\"\n [toggleIconStyle]=\"true\"\n [filled]=\"\n button.disabled ? false : button.isHovered ? true : menuItemHasHovered ? false : !!button.isFocused\n \"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'24'\"\n [color]=\"button.disabled ? 'dark' : button.isDestructive ? 'red' : 'rebrand-black'\"\n ></ui-icon>\n }\n <span\n [id]=\"'labelledby-' + button.label + id\"\n class=\"label\"\n uiEllipseText\n [refresh]=\"isMenuOpened()\"\n [maxDiffPixels]=\"1\"\n [isMultiline]=\"true\"\n (onChangeTextState)=\"button.isTextEllipsed = $event\"\n >{{ button.label }}</span\n >\n @if (selectionMode() === 'single' && button.isSelected) {\n <ui-icon\n class=\"overflow-menu-selected-check\"\n [name]=\"'Check-small-in-line'\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'16'\"\n [color]=\"'rebrand-black'\"\n ></ui-icon>\n }\n @if (button.isPremium) {\n <ui-icon\n [name]=\"'Premium-circle-in-line'\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"'24'\"\n class=\"premium-icon\"\n ></ui-icon>\n }\n </button>\n }\n }\n }\n\n <ng-content select=\"[menu-content]\"></ng-content>\n </mat-menu>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { EllipseTextDirective, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { OverflowMenuComponent } from './overflow-menu.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ButtonComponentModule,\n IconComponentModule,\n MatMenuModule,\n MatButtonModule,\n MatTooltipModule,\n EllipseTextDirective,\n UiTranslatePipe,\n OverflowMenuComponent,\n ],\n exports: [OverflowMenuComponent],\n})\nexport class OverflowMenuComponentModule {}\n"],"mappings":"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"}
@@ -90,6 +90,7 @@ var PageHeaderComponent = class PageHeaderComponent {
90
90
  "ariaDescribedby",
91
91
  "preventDefault",
92
92
  "hasBackground",
93
+ "circular",
93
94
  "tooltipPosition",
94
95
  "role",
95
96
  "iconFilled",
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-page-header.mjs","names":[],"sources":["../../../components/page-header/page-header.component.ts","../../../components/page-header/page-header.component.html","../../../components/page-header/page-header.component.module.ts"],"sourcesContent":["import { NgClass, AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n booleanAttribute,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n Optional,\n Output,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, IS_MOBILE_TOKEN, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\n\n@Component({\n selector: 'ui-page-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './page-header.component.html',\n styleUrls: ['./page-header.component.scss'],\n imports: [ButtonComponent, NgClass, AsyncPipe, UiTranslatePipe],\n})\nexport class PageHeaderComponent {\n /**\n * Flag to determine whether the \"Back\" button should be displayed.\n * @default true\n * @memberof PageHeaderComponent\n */\n @Input({ transform: booleanAttribute }) showBackButton = true;\n\n /**\n * Back button tooltip for mobile variation\n * @property tooltip\n * @memberof PageHeaderComponent\n */\n @Input() tooltip = 'COMMON.BACK';\n\n @Input() backButtonTestId: string | null = null;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof PageHeaderComponent\n */\n @HostBinding('attr.theme')\n @Input()\n applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Event triggered when the \"Back\" button is clicked.\n * @memberof PageHeaderComponent\n */\n @Output() back = new EventEmitter<void>();\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n @Inject(IS_MOBILE_TOKEN) protected readonly isMobile$: Observable<boolean>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n protected onBack(): void {\n this.back.emit();\n }\n}\n","<ng-container>\n <div class=\"page-header-container\">\n <div class=\"page-header-content\">\n @if ((isMobile$ | async) === false) {\n @if (showBackButton) {\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n [tooltip]=\"('COMMON.BACK' | uiTranslate | async)!\"\n (click)=\"onBack()\"\n [ariaLabel]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [variant]=\"'ghost'\"\n [justIcon]=\"true\"\n [iconName]=\"applicationTheme === 'classic' ? 'Arrow_left' : 'Arrow-chevron-left-in-line'\"\n [testId]=\"backButtonTestId\"\n ></ui-button>\n }\n } @else {\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n class=\"mobile-back-btn\"\n [tooltip]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [variant]=\"'icon-button'\"\n [ariaLabel]=\"('COMMON.BACK' | uiTranslate | async)!\"\n (click)=\"onBack()\"\n [justIcon]=\"true\"\n [iconName]=\"applicationTheme === 'classic' ? 'Arrow_left' : 'Arrow-chevron-left-in-line'\"\n [testId]=\"backButtonTestId\"\n ></ui-button>\n }\n\n <div class=\"main-content\" [ngClass]=\"{ 'remove-margin': !showBackButton }\">\n <ng-content select=\"[content]\"></ng-content>\n </div>\n\n <div class=\"right-side\">\n <ng-content select=\"[right-side]\"></ng-content>\n </div>\n </div>\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\n\nimport { PageHeaderComponent } from './page-header.component';\n\n@NgModule({\n imports: [CommonModule, ButtonComponentModule, UiTranslatePipe, PageHeaderComponent],\n exports: [PageHeaderComponent],\n})\nexport class PageHeaderModule {}\n"],"mappings":";;;;;;AAwBA,IAAa,sBAAb,MAAa,oBAAmB;CAkC9B,YAC6E,iBAC/B,WAA8B;EADC,KAAA,kBAAA;EAC/B,KAAA,YAAA;EA9BN,KAAA,iBAAiB;EAOhD,KAAA,UAAU;EAEV,KAAA,mBAAkC;EAW3C,KAAA,mBAAqC;EAM3B,KAAA,OAAO,IAAI,aAAY;EAM/B,IAAI,iBACF,KAAK,mBAAmB;CAE5B;CAEU,SAAM;EACd,KAAK,KAAK,KAAI;CAChB;CA7CW;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAmB,MAAA,CAAA;IAAA,OAmCR;IAAoC,UAAA;GAAA,GAAA,EAAA,OAChD,gBAAe,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CApCd;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAmB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,gBAAA;KAAA;KAAA;KAMV;IAAgB;IAAA,SAAA;IAAA,kBAAA;IAAA,kBAAA;GAAA;GAAA,SAAA,EAAA,MAAA,OAAA;GAAA,MAAA,EAAA,YAAA,EAAA,cAAA,wBAAA,EAAA;GAAA,UAAA;GAAA,UC9BtC;GAwCA,QAAA,CAAA,6+GAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDlBY;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,oBAAA,kBAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAS,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAe,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAEnD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,iBACT,wBAAwB;GAAM,SAGtC;IAAC;IAAiB;IAAS;IAAW;GAAe;GAAC,UAAA;GAAA,QAAA,CAAA,6+GAAA;EAAA,CAAA;;;;E,eAqC5D,MAAA,S;GAAY,MAAA;GAAO,MAAA,CAAA,oCAAoC;;;;;GACvD,MAAA;GAAO,MAAA,CAAA,eAAe;;;;;GA9BxB,MAAA;GAAM,MAAA,CAAA,EAAE,WAAW,iBAAgB,CAAE;;E,YAOrC,MAAA,M;E,qBAEA,MAAA,M;;GASA,MAAA;GAAY,MAAA,CAAA,YAAY;E,KACxB,MAAA,M;E,SAOA,MAAA,O;;;AE5CH,IAAa,mBAAb,MAAa,iBAAgB;CAAhB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAhB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,SAAA;IAHjB;IAAc;IAAuB;IAAiB;GAAmB;GAAA,SAAA,CACzE,mBAAmB;EAAA,CAAA;CAAA;CAElB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,SAAA;IAHjB;IAAc;IAAwC;GAAmB;EAAA,CAAA;CAAA;;AAGxE,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAJ5B,MAAA;EAAS,MAAA,CAAA;GACR,SAAS;IAAC;IAAc;IAAuB;IAAiB;GAAmB;GACnF,SAAS,CAAC,mBAAmB;EAC9B,CAAA"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-page-header.mjs","names":[],"sources":["../../../components/page-header/page-header.component.ts","../../../components/page-header/page-header.component.html","../../../components/page-header/page-header.component.module.ts"],"sourcesContent":["import { NgClass, AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n booleanAttribute,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n Optional,\n Output,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, IS_MOBILE_TOKEN, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\n\n@Component({\n selector: 'ui-page-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './page-header.component.html',\n styleUrls: ['./page-header.component.scss'],\n imports: [ButtonComponent, NgClass, AsyncPipe, UiTranslatePipe],\n})\nexport class PageHeaderComponent {\n /**\n * Flag to determine whether the \"Back\" button should be displayed.\n * @default true\n * @memberof PageHeaderComponent\n */\n @Input({ transform: booleanAttribute }) showBackButton = true;\n\n /**\n * Back button tooltip for mobile variation\n * @property tooltip\n * @memberof PageHeaderComponent\n */\n @Input() tooltip = 'COMMON.BACK';\n\n @Input() backButtonTestId: string | null = null;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof PageHeaderComponent\n */\n @HostBinding('attr.theme')\n @Input()\n applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Event triggered when the \"Back\" button is clicked.\n * @memberof PageHeaderComponent\n */\n @Output() back = new EventEmitter<void>();\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n @Inject(IS_MOBILE_TOKEN) protected readonly isMobile$: Observable<boolean>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n protected onBack(): void {\n this.back.emit();\n }\n}\n","<ng-container>\n <div class=\"page-header-container\">\n <div class=\"page-header-content\">\n @if ((isMobile$ | async) === false) {\n @if (showBackButton) {\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n [tooltip]=\"('COMMON.BACK' | uiTranslate | async)!\"\n (click)=\"onBack()\"\n [ariaLabel]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [variant]=\"'ghost'\"\n [justIcon]=\"true\"\n [iconName]=\"applicationTheme === 'classic' ? 'Arrow_left' : 'Arrow-chevron-left-in-line'\"\n [testId]=\"backButtonTestId\"\n ></ui-button>\n }\n } @else {\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n class=\"mobile-back-btn\"\n [tooltip]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [variant]=\"'icon-button'\"\n [ariaLabel]=\"('COMMON.BACK' | uiTranslate | async)!\"\n (click)=\"onBack()\"\n [justIcon]=\"true\"\n [iconName]=\"applicationTheme === 'classic' ? 'Arrow_left' : 'Arrow-chevron-left-in-line'\"\n [testId]=\"backButtonTestId\"\n ></ui-button>\n }\n\n <div class=\"main-content\" [ngClass]=\"{ 'remove-margin': !showBackButton }\">\n <ng-content select=\"[content]\"></ng-content>\n </div>\n\n <div class=\"right-side\">\n <ng-content select=\"[right-side]\"></ng-content>\n </div>\n </div>\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\n\nimport { PageHeaderComponent } from './page-header.component';\n\n@NgModule({\n imports: [CommonModule, ButtonComponentModule, UiTranslatePipe, PageHeaderComponent],\n exports: [PageHeaderComponent],\n})\nexport class PageHeaderModule {}\n"],"mappings":";;;;;;AAwBA,IAAa,sBAAb,MAAa,oBAAmB;CAkC9B,YAC6E,iBAC/B,WAA8B;EADC,KAAA,kBAAA;EAC/B,KAAA,YAAA;EA9BN,KAAA,iBAAiB;EAOhD,KAAA,UAAU;EAEV,KAAA,mBAAkC;EAW3C,KAAA,mBAAqC;EAM3B,KAAA,OAAO,IAAI,aAAY;EAM/B,IAAI,iBACF,KAAK,mBAAmB;CAE5B;CAEU,SAAM;EACd,KAAK,KAAK,KAAI;CAChB;CA7CW;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAmB,MAAA,CAAA;IAAA,OAmCR;IAAoC,UAAA;GAAA,GAAA,EAAA,OAChD,gBAAe,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CApCd;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAmB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,gBAAA;KAAA;KAAA;KAMV;IAAgB;IAAA,SAAA;IAAA,kBAAA;IAAA,kBAAA;GAAA;GAAA,SAAA,EAAA,MAAA,OAAA;GAAA,MAAA,EAAA,YAAA,EAAA,cAAA,wBAAA,EAAA;GAAA,UAAA;GAAA,UC9BtC;GAwCA,QAAA,CAAA,6+GAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDlBY;KAAe,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,oBAAA,kBAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAO,UAAA;KAAA,QAAA,CAAA,SAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAS,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAAE;KAAe,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAEnD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,iBACT,wBAAwB;GAAM,SAGtC;IAAC;IAAiB;IAAS;IAAW;GAAe;GAAC,UAAA;GAAA,QAAA,CAAA,6+GAAA;EAAA,CAAA;;;;E,eAqC5D,MAAA,S;GAAY,MAAA;GAAO,MAAA,CAAA,oCAAoC;;;;;GACvD,MAAA;GAAO,MAAA,CAAA,eAAe;;;;;GA9BxB,MAAA;GAAM,MAAA,CAAA,EAAE,WAAW,iBAAgB,CAAE;;E,YAOrC,MAAA,M;E,qBAEA,MAAA,M;;GASA,MAAA;GAAY,MAAA,CAAA,YAAY;E,KACxB,MAAA,M;E,SAOA,MAAA,O;;;AE5CH,IAAa,mBAAb,MAAa,iBAAgB;CAAhB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAhB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,SAAA;IAHjB;IAAc;IAAuB;IAAiB;GAAmB;GAAA,SAAA,CACzE,mBAAmB;EAAA,CAAA;CAAA;CAElB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAgB,SAAA;IAHjB;IAAc;IAAwC;GAAmB;EAAA,CAAA;CAAA;;AAGxE,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAJ5B,MAAA;EAAS,MAAA,CAAA;GACR,SAAS;IAAC;IAAc;IAAuB;IAAiB;GAAmB;GACnF,SAAS,CAAC,mBAAmB;EAC9B,CAAA"}
@@ -757,6 +757,7 @@ var PromptComponent = class PromptComponent {
757
757
  "ariaDescribedby",
758
758
  "preventDefault",
759
759
  "hasBackground",
760
+ "circular",
760
761
  "tooltipPosition",
761
762
  "role",
762
763
  "iconFilled",
@@ -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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"}
@@ -137,6 +137,7 @@ var RadialProgressComponent = class RadialProgressComponent {
137
137
  "ariaDescribedby",
138
138
  "preventDefault",
139
139
  "hasBackground",
140
+ "circular",
140
141
  "tooltipPosition",
141
142
  "role",
142
143
  "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 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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"}
@@ -162,6 +162,7 @@ var ScaleTableComponent = class ScaleTableComponent {
162
162
  "ariaDescribedby",
163
163
  "preventDefault",
164
164
  "hasBackground",
165
+ "circular",
165
166
  "tooltipPosition",
166
167
  "role",
167
168
  "iconFilled",