@testgorilla/tgo-ui 12.1.0 → 12.3.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 (64) hide show
  1. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +3 -0
  2. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  3. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +3 -0
  4. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  5. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +3 -0
  6. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  7. package/fesm2022/testgorilla-tgo-ui-components-badge.mjs +2 -2
  8. package/fesm2022/testgorilla-tgo-ui-components-badge.mjs.map +1 -1
  9. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +3 -0
  10. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  11. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +19 -4
  12. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  13. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +3 -0
  14. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  15. package/fesm2022/testgorilla-tgo-ui-components-core.mjs +11 -1
  16. package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
  17. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +6 -0
  18. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  19. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +3 -0
  20. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  21. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +3 -0
  22. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  23. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +3 -0
  24. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  25. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +3 -0
  26. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  27. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +3 -0
  28. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  29. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +3 -0
  30. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  31. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +3 -0
  32. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  33. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +6 -0
  34. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  35. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +3 -0
  36. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  37. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +3 -0
  38. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  39. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +250 -50
  40. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
  41. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +4 -0
  42. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  43. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +3 -0
  44. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  45. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +3 -0
  46. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  47. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +89 -7
  48. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  49. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +3 -0
  50. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  51. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +3 -0
  52. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  53. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +3 -0
  54. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  55. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +3 -0
  56. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  57. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +3 -0
  58. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  59. package/mcp/catalog.json +1 -1
  60. package/package.json +1 -1
  61. package/types/testgorilla-tgo-ui-components-button.d.ts +32 -0
  62. package/types/testgorilla-tgo-ui-components-core.d.ts +1 -0
  63. package/types/testgorilla-tgo-ui-components-popover.d.ts +51 -5
  64. package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +59 -1
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-navbar.mjs","names":["i1","i2"],"sources":["../../../components/navbar/mobile-navbar-side-sheet/mobile-navbar-side-sheet.component.ts","../../../components/navbar/mobile-navbar-side-sheet/mobile-navbar-side-sheet.component.html","../../../components/navbar/navbar.component.ts","../../../components/navbar/navbar.component.html","../../../components/navbar/navbar.component.module.ts"],"sourcesContent":["import { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, output, Signal, TemplateRef } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\n\nimport { AccordionComponentModule } from '@testgorilla/tgo-ui/components/accordion';\nimport { AvatarComponentModule, AvatarSize } from '@testgorilla/tgo-ui/components/avatar';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe, ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { IRoute, MenuItem } from '../navbar.model';\n\n@Component({\n selector: 'ui-mobile-navbar-side-sheet',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './mobile-navbar-side-sheet.component.html',\n styleUrls: ['./mobile-navbar-side-sheet.component.scss'],\n imports: [\n NgClass,\n IconComponentModule,\n MatIconModule,\n MatMenuModule,\n UiTranslatePipe,\n MatButtonModule,\n AccordionComponentModule,\n NgTemplateOutlet,\n AvatarComponentModule,\n ButtonComponentModule,\n AsyncPipe,\n ],\n})\nexport class MobileNavbarSideSheetComponent {\n readonly routes = input<IRoute[]>([]);\n readonly activedRoute = input('');\n readonly email = input('');\n readonly userName = input('');\n readonly menuItems = input<MenuItem[]>([]);\n readonly contentTemplateRef = input<TemplateRef<unknown>>();\n readonly userInfoExtraTemplateRef = input<TemplateRef<unknown>>();\n readonly menuContentTemplateRef = input<TemplateRef<unknown>>();\n readonly isDesktop = input(false);\n readonly applicationTheme = input<ApplicationTheme>('light');\n\n readonly navigateEvent = output<string>();\n readonly menuItemClicked = output<string>();\n readonly logoutEvent = output<void>();\n\n protected readonly translationContext = 'NAVBAR.';\n protected readonly avatarSize = AvatarSize;\n\n readonly activeRoutesMap: Signal<Map<string, boolean>> = computed(() => {\n const currentRoute = this.activedRoute();\n return new Map(this.routes().map(route => [route.id, currentRoute?.startsWith(route.id)]));\n });\n\n navigate(routeId: string) {\n this.navigateEvent.emit(`/${routeId}`);\n }\n\n logout(): void {\n this.logoutEvent.emit();\n }\n\n clickMenuItem(id: string) {\n this.menuItemClicked.emit(id);\n }\n}\n","<div class=\"mobile-navbar-container\" [ngClass]=\"{ desktop: isDesktop() }\">\n @if (isDesktop()) {\n <ng-container [ngTemplateOutlet]=\"userInfo\"></ng-container>\n }\n\n @if (menuContentTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"menuContentTemplateRef()!\"></ng-container>\n }\n\n @if (!isDesktop()) {\n <div class=\"routes\">\n @for (route of routes(); track route) {\n <div\n [attr.data-testid]=\"route.id\"\n data-test-role=\"nav-route\"\n tabindex=\"0\"\n (click)=\"navigate(route.id)\"\n (keydown.enter)=\"navigate(route.id)\"\n class=\"route\"\n [ngClass]=\"{ active: activeRoutesMap().get(route.id) }\"\n >\n <span>{{ route.title }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"settings\">\n @for (e of menuItems(); track e) {\n @if (e) {\n <div class=\"menu-item\">\n <ui-button\n [attr.data-testid]=\"e.id\"\n data-test-role=\"menu-item\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [disabledScaleOnClick]=\"true\"\n [variant]=\"'menuCell'\"\n iconPosition=\"left\"\n [iconName]=\"e.icon\"\n [label]=\"e.text\"\n (buttonClickEvent)=\"clickMenuItem(e.id)\"\n (keydown.Tab)=\"$event.stopPropagation()\"\n (keydown.shift.tab)=\"$event.stopPropagation()\"\n [ariaLabel]=\"e.text + '--' + e.text\"\n ></ui-button>\n </div>\n }\n }\n </div>\n</div>\n\n<div class=\"bottom-content\" [ngClass]=\"{ desktop: isDesktop() }\">\n @if (!isDesktop() && contentTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"contentTemplateRef()!\"></ng-container>\n }\n @if (isDesktop()) {\n <div class=\"menu-item\">\n <ui-button\n data-testid=\"logout-button\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [disabledScaleOnClick]=\"true\"\n [variant]=\"'menuCell'\"\n iconPosition=\"left\"\n [iconName]=\"'Logout-in-line'\"\n [label]=\"(translationContext + 'LOG_OUT' | uiTranslate | async)!\"\n (buttonClickEvent)=\"logout()\"\n (keydown.Tab)=\"$event.stopPropagation()\"\n (keydown.shift.tab)=\"$event.stopPropagation()\"\n ></ui-button>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"userInfo\"></ng-container>\n }\n</div>\n\n<ng-template #userInfo>\n <div class=\"user-info\" [ngClass]=\"{ desktop: isDesktop() }\">\n <ui-avatar [size]=\"avatarSize.MEDIUM\" [name]=\"userName()\"></ui-avatar>\n <div class=\"details-container\">\n <div class=\"name-container\">\n <span class=\"user-name dd-privacy-mask\">{{ userName() }}</span>\n <span class=\"user-email dd-privacy-mask\">{{ email() }}</span>\n @if (userInfoExtraTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"userInfoExtraTemplateRef()!\"></ng-container>\n }\n </div>\n @if (!isDesktop()) {\n <ui-button\n data-testid=\"logout-button\"\n [tooltip]=\"(translationContext + 'LOG_OUT' | uiTranslate | async)!\"\n [iconName]=\"'Logout-in-line'\"\n [applicationTheme]=\"'light'\"\n [variant]=\"'icon-button'\"\n (click)=\"logout()\"\n ></ui-button>\n }\n </div>\n </div>\n</ng-template>\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n OutputRefSubscription,\n ProviderToken,\n signal,\n Signal,\n TemplateRef,\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { MatButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';\nimport { MatToolbar } from '@angular/material/toolbar';\nimport { map, Subject, switchMap, take } from 'rxjs';\n\nimport { AvatarSize, AvatarComponent } from '@testgorilla/tgo-ui/components/avatar';\nimport { BadgeComponent } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, ScreenBreakpoints, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { LogoTypeEnum, LogoComponent } from '@testgorilla/tgo-ui/components/logo';\nimport { SideSheetService, SideSheetComponentModule } from '@testgorilla/tgo-ui/components/side-sheet';\n\nimport { MobileNavbarSideSheetComponent } from './mobile-navbar-side-sheet/mobile-navbar-side-sheet.component';\nimport { IRoute, MenuItem, MenuState, ScreenSize } from './navbar.model';\n\n/**\n * Injected by string for backwards compatibility — consumers provide this token by its string name.\n */\nconst DEFAULT_APPLICATION_THEME_TOKEN =\n 'CANOPYUI_DEFAULT_APPLICATION_THEME' as unknown as ProviderToken<ApplicationTheme>;\n\n@Component({\n selector: 'ui-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SideSheetComponentModule,\n MatToolbar,\n LogoComponent,\n ButtonComponent,\n NgClass,\n BadgeComponent,\n MatButton,\n MatMenuTrigger,\n AvatarComponent,\n MatIcon,\n IconComponentModule,\n MatMenu,\n MatMenuItem,\n MobileNavbarSideSheetComponent,\n AsyncPipe,\n UiTranslatePipe,\n ],\n providers: [UiTranslatePipe],\n})\nexport class NavbarComponent {\n private readonly breakpointObserver = inject(BreakpointObserver);\n private readonly sideSheetService = inject(SideSheetService);\n private readonly translatePipe = inject(UiTranslatePipe);\n private readonly defaultAppTheme = inject(DEFAULT_APPLICATION_THEME_TOKEN, { optional: true });\n\n /**\n * Routes object\n *\n * @memberof NavbarComponent\n * @ignore\n */\n readonly routes = input<IRoute[]>([]);\n\n /**\n * Actived route id\n *\n * @memberof NavbarComponent\n */\n readonly activedRoute = input('');\n\n /**\n * User first name and last name\n *\n * @memberof NavbarComponent\n */\n readonly userName = input('');\n\n /**\n * User email\n *\n * @memberof NavbarComponent\n */\n readonly email = input('');\n\n /**\n * Menu items to show in menu above the Log out button\n *\n * @memberof NavbarComponent\n */\n readonly menuItems = input<MenuItem[]>([]);\n\n /**\n * Defines the application theme\n *\n * @memberof NavbarComponent\n */\n readonly applicationTheme = input<ApplicationTheme>(this.defaultAppTheme ?? 'light');\n\n /**\n * It's ng-content for the collapsed (drawer) version\n *\n * @memberof NavbarComponent\n */\n readonly contentTemplateRef = input<TemplateRef<unknown>>();\n\n /**\n * Additional info template reference for the extra user info in the dropdown/sidesheet\n *\n * @memberof NavbarComponent\n */\n readonly userInfoExtraTemplateRef = input<TemplateRef<unknown>>();\n\n /**\n * Custom content template reference for the menu section between user info and menu items.\n * Use this to add custom components like credits display.\n *\n * @memberof NavbarComponent\n */\n readonly menuContentTemplateRef = input<TemplateRef<unknown>>();\n\n /**\n * Width at or below which the navbar renders its compact (brandmark) logo\n *\n * @memberof NavbarComponent\n */\n readonly mobileBreakpoint = input(ScreenBreakpoints.MOBILE, {\n // `[mobileBreakpoint]=\"maybeUndefined\"` must not produce `(max-width: undefinedpx)`.\n transform: (value: number) => value || ScreenBreakpoints.MOBILE,\n });\n\n /**\n * Width at or below which the horizontal navigation and the profile menu collapse\n * into the hamburger-triggered drawer\n *\n * @memberof NavbarComponent\n */\n readonly collapseBreakpoint = input(ScreenBreakpoints.LARGE_TABLET, {\n // `[collapseBreakpoint]=\"maybeUndefined\"` must not produce `(max-width: undefinedpx)`.\n transform: (value: number) => value || ScreenBreakpoints.LARGE_TABLET,\n });\n\n /**\n * Show avatar with user initials\n *\n * @memberof NavbarComponent\n */\n readonly isAvatar = input(true);\n\n /**\n * Sets class for the menu\n *\n * @memberof NavbarComponent\n */\n readonly menuClass = input('');\n\n /**\n * @ignore\n */\n readonly navigateEvent = output<string>();\n\n /**\n * @ignore\n */\n readonly menuItemClicked = output<string>();\n\n /**\n * @ignore\n */\n readonly logoutEvent = output<void>();\n readonly menuState = output<MenuState>();\n\n protected readonly isMobile = this.observeMaxWidth(this.mobileBreakpoint);\n protected readonly isCollapsed = this.observeMaxWidth(this.collapseBreakpoint);\n protected readonly screenSize = computed<ScreenSize>(() => {\n if (this.isMobile()) {\n return 'mobile';\n }\n return this.isCollapsed() ? 'tablet' : 'desktop';\n });\n\n /**\n * @deprecated Use the `screenSize` reported by `menuState` instead. Removed in the next major.\n */\n protected readonly isMobile$ = toObservable(this.isMobile);\n\n /**\n * @deprecated Use the `screenSize` reported by `menuState` instead. Removed in the next major.\n */\n protected readonly isTablet$ = toObservable(this.isCollapsed);\n\n protected readonly translationContext = 'NAVBAR.';\n protected readonly logoType = LogoTypeEnum;\n protected readonly AvatarSize = AvatarSize;\n\n readonly activeRoutesMap: Signal<Map<string, boolean>> = computed(() => {\n const currentRoute = this.activedRoute();\n return new Map(this.routes().map(route => [route.id, currentRoute?.startsWith(route.id)]));\n });\n\n /**\n * Output subscriptions of the currently open drawer. Torn down when it closes, so repeated\n * opens don't accumulate one set per open.\n */\n private drawerSubscriptions: OutputRefSubscription[] = [];\n private readonly isDrawerOpened = signal(false);\n\n // The hamburger disappears once the viewport grows past `collapseBreakpoint`, so an open\n // drawer would have no dismiss affordance left — close it as soon as the nav expands.\n private readonly closeDrawerOnExpand = effect(() => {\n if (!this.isCollapsed() && this.isDrawerOpened()) {\n this.sideSheetService.close();\n }\n });\n\n openMobileMenu(): void {\n // Defensive: never stack a second set of subscriptions if a close never reported back.\n this.teardownDrawerSubscriptions();\n\n const isSideSheetClosed$ = new Subject<void>();\n\n // `LanguageService` is backed by a BehaviorSubject, so this resolves synchronously.\n let title = '';\n this.translatePipe\n .transform(`${this.translationContext}MENU`)\n .pipe(take(1))\n .subscribe(translated => (title = translated));\n\n const navbarSideSheetComponent = this.sideSheetService.open<MobileNavbarSideSheetComponent>({\n componentRef: MobileNavbarSideSheetComponent,\n title,\n showLogo: false,\n closed: isSideSheetClosed$,\n inputs: {\n userName: this.userName(),\n menuItems: this.menuItems(),\n activedRoute: this.activedRoute(),\n routes: this.routes(),\n email: this.email(),\n contentTemplateRef: this.contentTemplateRef(),\n userInfoExtraTemplateRef: this.userInfoExtraTemplateRef(),\n menuContentTemplateRef: this.menuContentTemplateRef(),\n applicationTheme: this.applicationTheme(),\n },\n });\n\n this.drawerSubscriptions = [\n navbarSideSheetComponent.logoutEvent.subscribe(() => {\n this.logoutEvent.emit();\n isSideSheetClosed$.next();\n }),\n navbarSideSheetComponent.menuItemClicked.subscribe(value => {\n this.menuItemClicked.emit(value);\n isSideSheetClosed$.next();\n }),\n navbarSideSheetComponent.navigateEvent.subscribe(value => {\n this.navigateEvent.emit(value);\n isSideSheetClosed$.next();\n }),\n ];\n }\n\n /**\n * Closes the drawer if the navbar is currently collapsed. Consumers use this to dismiss the\n * menu on navigation without reaching into the component's internals.\n */\n closeMenu(): void {\n // The open check matters: `SideSheetService.close()` broadcasts to the sheet regardless of\n // its state, so calling it with the drawer already closed must stay a no-op.\n if (this.isCollapsed() && this.isDrawerOpened()) {\n this.sideSheetService.close();\n }\n }\n\n navigate(routeId: string) {\n this.navigateEvent.emit(`/${routeId}`);\n }\n\n logout(): void {\n this.logoutEvent.emit();\n }\n\n clickMenuItem(id: string) {\n this.menuItemClicked.emit(id);\n }\n\n onChangeMenuState(isOpened: boolean, screenSize: ScreenSize) {\n this.menuState.emit({ isOpened, screenSize });\n }\n\n protected onSideSheetOpenChange(isOpened: boolean): void {\n this.isDrawerOpened.set(isOpened);\n\n if (!isOpened) {\n this.teardownDrawerSubscriptions();\n }\n\n this.onChangeMenuState(isOpened, this.screenSize());\n }\n\n private teardownDrawerSubscriptions(): void {\n this.drawerSubscriptions.forEach(subscription => subscription.unsubscribe());\n this.drawerSubscriptions = [];\n }\n\n private observeMaxWidth(breakpointPx: Signal<number>): Signal<boolean> {\n return toSignal(\n toObservable(breakpointPx).pipe(\n switchMap(breakpoint => this.breakpointObserver.observe(`(max-width: ${breakpoint}px)`)),\n map(state => state.matches)\n ),\n { initialValue: false }\n );\n }\n}\n","<ui-side-sheet\n class=\"navbar-sheet\"\n [applicationTheme]=\"applicationTheme()\"\n (openChange)=\"onSideSheetOpenChange($event)\"\n position=\"end\"\n>\n <mat-toolbar [attr.theme]=\"applicationTheme()\">\n <div class=\"custom-toolbar row\">\n <div class=\"brand\">\n <ui-logo\n [applicationTheme]=\"applicationTheme()\"\n class=\"logo\"\n (click)=\"navigate('')\"\n [allowResizing]=\"true\"\n [width]=\"isMobile() ? 27 : 160\"\n [type]=\"isMobile() ? logoType.PRIMARY_BRANDMARK_PINK : logoType.DEFAULT\"\n ></ui-logo>\n\n @if (!isCollapsed()) {\n <div class=\"navigation row\">\n @for (route of routes(); track route) {\n <a\n (click)=\"navigate(route.id); $event.preventDefault()\"\n [href]=\"route.id\"\n [attr.data-testid]=\"route.id\"\n data-test-role=\"nav-route\"\n [ngClass]=\"{ active: activeRoutesMap().get(route.id) }\"\n >\n @if (route?.badgeOptions) {\n <ui-badge\n [label]=\"route.badgeOptions!.text ?? ''\"\n [rebrandColor]=\"route.badgeOptions!.color\"\n [variant]=\"route.badgeOptions!.variant ?? 'primary'\"\n [notificationsAmount]=\"route.badgeOptions!.notificationsAmount ?? 0\"\n ></ui-badge>\n }\n <span [attr.data-text]=\"route.title\">{{ route.title }}</span>\n </a>\n }\n </div>\n }\n </div>\n\n <div class=\"actions\">\n <div class=\"custom-actions\">\n <ng-content select=\"[actions]\"></ng-content>\n </div>\n\n @if (isCollapsed()) {\n <ui-button\n data-testid=\"navbar-menu-button\"\n (click)=\"openMobileMenu()\"\n [variant]=\"'text'\"\n [companyColor]=\"'#242424'\"\n [applicationTheme]=\"'light'\"\n [iconName]=\"'Menu-burger-in-line'\"\n [justIcon]=\"true\"\n ></ui-button>\n } @else {\n <button\n mat-button\n class=\"profile-menu\"\n [disableRipple]=\"applicationTheme() !== 'classic'\"\n (menuOpened)=\"onChangeMenuState(true, 'desktop')\"\n (menuClosed)=\"onChangeMenuState(false, 'desktop')\"\n [matMenuTriggerFor]=\"menu\"\n >\n <div class=\"profile-button-content\">\n @if (isAvatar()) {\n <ui-avatar\n data-testid=\"profile-button\"\n [ngClass]=\"{ opened: menu._panelAnimationState !== 'void' }\"\n [applicationTheme]=\"applicationTheme()\"\n [name]=\"userName()\"\n [size]=\"AvatarSize.SMALL_MEDIUM\"\n ></ui-avatar>\n } @else {\n {{ userName() }}\n }\n\n @if (applicationTheme() === 'classic') {\n <mat-icon iconPositionEnd>expand_more</mat-icon>\n } @else {\n @if (!isAvatar()) {\n <ui-icon\n [size]=\"'24'\"\n [name]=\"\n menu._panelAnimationState === 'void' ? 'Arrow-chevron-down-filled' : 'Arrow-chevron-up-filled'\n \"\n [applicationTheme]=\"applicationTheme()\"\n ></ui-icon>\n }\n }\n </div>\n </button>\n }\n </div>\n </div>\n </mat-toolbar>\n\n <ng-content></ng-content>\n\n <mat-menu [class]=\"menuClass()\" #menu=\"matMenu\">\n @if (applicationTheme() === 'classic') {\n @for (e of menuItems(); track e) {\n <button\n mat-menu-item\n (click)=\"clickMenuItem(e.id)\"\n [attr.data-testid]=\"e.id\"\n data-test-role=\"profile-menu-item\"\n >\n <div class=\"menu-item\">\n @if (e?.icon) {\n <ui-icon [name]=\"e.icon\" size=\"24\"></ui-icon>\n }\n {{ e.text }}\n </div>\n </button>\n }\n <button data-testid=\"logout-button\" mat-menu-item (click)=\"logout()\">\n <mat-icon>power_settings_new</mat-icon>\n {{ translationContext + 'LOG_OUT' | uiTranslate | async }}\n </button>\n } @else {\n <ui-mobile-navbar-side-sheet\n [isDesktop]=\"true\"\n [menuItems]=\"menuItems()\"\n [userName]=\"userName()\"\n [routes]=\"routes()\"\n [activedRoute]=\"activedRoute()\"\n [email]=\"email()\"\n [applicationTheme]=\"applicationTheme()\"\n [contentTemplateRef]=\"contentTemplateRef()\"\n [userInfoExtraTemplateRef]=\"userInfoExtraTemplateRef()\"\n [menuContentTemplateRef]=\"menuContentTemplateRef()\"\n (menuItemClicked)=\"clickMenuItem($event)\"\n (logoutEvent)=\"logout()\"\n >\n </ui-mobile-navbar-side-sheet>\n }\n </mat-menu>\n</ui-side-sheet>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatToolbarModule } from '@angular/material/toolbar';\n\nimport { AvatarComponentModule } from '@testgorilla/tgo-ui/components/avatar';\nimport { BadgeComponentModule } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { LogoComponentModule } from '@testgorilla/tgo-ui/components/logo';\nimport { SideSheetComponentModule } from '@testgorilla/tgo-ui/components/side-sheet';\n\nimport { MobileNavbarSideSheetComponent } from './mobile-navbar-side-sheet/mobile-navbar-side-sheet.component';\nimport { NavbarComponent } from './navbar.component';\n\n@NgModule({\n imports: [\n CommonModule,\n MatToolbarModule,\n MatIconModule,\n MatButtonModule,\n MatRippleModule,\n MatMenuModule,\n LogoComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n AvatarComponentModule,\n SideSheetComponentModule,\n ButtonComponentModule,\n MobileNavbarSideSheetComponent,\n BadgeComponentModule,\n NavbarComponent,\n ],\n exports: [NavbarComponent],\n})\nexport class NavbarComponentModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-navbar.mjs","names":["i1","i2"],"sources":["../../../components/navbar/mobile-navbar-side-sheet/mobile-navbar-side-sheet.component.ts","../../../components/navbar/mobile-navbar-side-sheet/mobile-navbar-side-sheet.component.html","../../../components/navbar/navbar.component.ts","../../../components/navbar/navbar.component.html","../../../components/navbar/navbar.component.module.ts"],"sourcesContent":["import { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, output, Signal, TemplateRef } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\n\nimport { AccordionComponentModule } from '@testgorilla/tgo-ui/components/accordion';\nimport { AvatarComponentModule, AvatarSize } from '@testgorilla/tgo-ui/components/avatar';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe, ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { IRoute, MenuItem } from '../navbar.model';\n\n@Component({\n selector: 'ui-mobile-navbar-side-sheet',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './mobile-navbar-side-sheet.component.html',\n styleUrls: ['./mobile-navbar-side-sheet.component.scss'],\n imports: [\n NgClass,\n IconComponentModule,\n MatIconModule,\n MatMenuModule,\n UiTranslatePipe,\n MatButtonModule,\n AccordionComponentModule,\n NgTemplateOutlet,\n AvatarComponentModule,\n ButtonComponentModule,\n AsyncPipe,\n ],\n})\nexport class MobileNavbarSideSheetComponent {\n readonly routes = input<IRoute[]>([]);\n readonly activedRoute = input('');\n readonly email = input('');\n readonly userName = input('');\n readonly menuItems = input<MenuItem[]>([]);\n readonly contentTemplateRef = input<TemplateRef<unknown>>();\n readonly userInfoExtraTemplateRef = input<TemplateRef<unknown>>();\n readonly menuContentTemplateRef = input<TemplateRef<unknown>>();\n readonly isDesktop = input(false);\n readonly applicationTheme = input<ApplicationTheme>('light');\n\n readonly navigateEvent = output<string>();\n readonly menuItemClicked = output<string>();\n readonly logoutEvent = output<void>();\n\n protected readonly translationContext = 'NAVBAR.';\n protected readonly avatarSize = AvatarSize;\n\n readonly activeRoutesMap: Signal<Map<string, boolean>> = computed(() => {\n const currentRoute = this.activedRoute();\n return new Map(this.routes().map(route => [route.id, currentRoute?.startsWith(route.id)]));\n });\n\n navigate(routeId: string) {\n this.navigateEvent.emit(`/${routeId}`);\n }\n\n logout(): void {\n this.logoutEvent.emit();\n }\n\n clickMenuItem(id: string) {\n this.menuItemClicked.emit(id);\n }\n}\n","<div class=\"mobile-navbar-container\" [ngClass]=\"{ desktop: isDesktop() }\">\n @if (isDesktop()) {\n <ng-container [ngTemplateOutlet]=\"userInfo\"></ng-container>\n }\n\n @if (menuContentTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"menuContentTemplateRef()!\"></ng-container>\n }\n\n @if (!isDesktop()) {\n <div class=\"routes\">\n @for (route of routes(); track route) {\n <div\n [attr.data-testid]=\"route.id\"\n data-test-role=\"nav-route\"\n tabindex=\"0\"\n (click)=\"navigate(route.id)\"\n (keydown.enter)=\"navigate(route.id)\"\n class=\"route\"\n [ngClass]=\"{ active: activeRoutesMap().get(route.id) }\"\n >\n <span>{{ route.title }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"settings\">\n @for (e of menuItems(); track e) {\n @if (e) {\n <div class=\"menu-item\">\n <ui-button\n [attr.data-testid]=\"e.id\"\n data-test-role=\"menu-item\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [disabledScaleOnClick]=\"true\"\n [variant]=\"'menuCell'\"\n iconPosition=\"left\"\n [iconName]=\"e.icon\"\n [label]=\"e.text\"\n (buttonClickEvent)=\"clickMenuItem(e.id)\"\n (keydown.Tab)=\"$event.stopPropagation()\"\n (keydown.shift.tab)=\"$event.stopPropagation()\"\n [ariaLabel]=\"e.text + '--' + e.text\"\n ></ui-button>\n </div>\n }\n }\n </div>\n</div>\n\n<div class=\"bottom-content\" [ngClass]=\"{ desktop: isDesktop() }\">\n @if (!isDesktop() && contentTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"contentTemplateRef()!\"></ng-container>\n }\n @if (isDesktop()) {\n <div class=\"menu-item\">\n <ui-button\n data-testid=\"logout-button\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [disabledScaleOnClick]=\"true\"\n [variant]=\"'menuCell'\"\n iconPosition=\"left\"\n [iconName]=\"'Logout-in-line'\"\n [label]=\"(translationContext + 'LOG_OUT' | uiTranslate | async)!\"\n (buttonClickEvent)=\"logout()\"\n (keydown.Tab)=\"$event.stopPropagation()\"\n (keydown.shift.tab)=\"$event.stopPropagation()\"\n ></ui-button>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"userInfo\"></ng-container>\n }\n</div>\n\n<ng-template #userInfo>\n <div class=\"user-info\" [ngClass]=\"{ desktop: isDesktop() }\">\n <ui-avatar [size]=\"avatarSize.MEDIUM\" [name]=\"userName()\"></ui-avatar>\n <div class=\"details-container\">\n <div class=\"name-container\">\n <span class=\"user-name dd-privacy-mask\">{{ userName() }}</span>\n <span class=\"user-email dd-privacy-mask\">{{ email() }}</span>\n @if (userInfoExtraTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"userInfoExtraTemplateRef()!\"></ng-container>\n }\n </div>\n @if (!isDesktop()) {\n <ui-button\n data-testid=\"logout-button\"\n [tooltip]=\"(translationContext + 'LOG_OUT' | uiTranslate | async)!\"\n [iconName]=\"'Logout-in-line'\"\n [applicationTheme]=\"'light'\"\n [variant]=\"'icon-button'\"\n (click)=\"logout()\"\n ></ui-button>\n }\n </div>\n </div>\n</ng-template>\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n OutputRefSubscription,\n ProviderToken,\n signal,\n Signal,\n TemplateRef,\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { MatButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';\nimport { MatToolbar } from '@angular/material/toolbar';\nimport { map, Subject, switchMap, take } from 'rxjs';\n\nimport { AvatarSize, AvatarComponent } from '@testgorilla/tgo-ui/components/avatar';\nimport { BadgeComponent } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, ScreenBreakpoints, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { LogoTypeEnum, LogoComponent } from '@testgorilla/tgo-ui/components/logo';\nimport { SideSheetService, SideSheetComponentModule } from '@testgorilla/tgo-ui/components/side-sheet';\n\nimport { MobileNavbarSideSheetComponent } from './mobile-navbar-side-sheet/mobile-navbar-side-sheet.component';\nimport { IRoute, MenuItem, MenuState, ScreenSize } from './navbar.model';\n\n/**\n * Injected by string for backwards compatibility — consumers provide this token by its string name.\n */\nconst DEFAULT_APPLICATION_THEME_TOKEN =\n 'CANOPYUI_DEFAULT_APPLICATION_THEME' as unknown as ProviderToken<ApplicationTheme>;\n\n@Component({\n selector: 'ui-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SideSheetComponentModule,\n MatToolbar,\n LogoComponent,\n ButtonComponent,\n NgClass,\n BadgeComponent,\n MatButton,\n MatMenuTrigger,\n AvatarComponent,\n MatIcon,\n IconComponentModule,\n MatMenu,\n MatMenuItem,\n MobileNavbarSideSheetComponent,\n AsyncPipe,\n UiTranslatePipe,\n ],\n providers: [UiTranslatePipe],\n})\nexport class NavbarComponent {\n private readonly breakpointObserver = inject(BreakpointObserver);\n private readonly sideSheetService = inject(SideSheetService);\n private readonly translatePipe = inject(UiTranslatePipe);\n private readonly defaultAppTheme = inject(DEFAULT_APPLICATION_THEME_TOKEN, { optional: true });\n\n /**\n * Routes object\n *\n * @memberof NavbarComponent\n * @ignore\n */\n readonly routes = input<IRoute[]>([]);\n\n /**\n * Actived route id\n *\n * @memberof NavbarComponent\n */\n readonly activedRoute = input('');\n\n /**\n * User first name and last name\n *\n * @memberof NavbarComponent\n */\n readonly userName = input('');\n\n /**\n * User email\n *\n * @memberof NavbarComponent\n */\n readonly email = input('');\n\n /**\n * Menu items to show in menu above the Log out button\n *\n * @memberof NavbarComponent\n */\n readonly menuItems = input<MenuItem[]>([]);\n\n /**\n * Defines the application theme\n *\n * @memberof NavbarComponent\n */\n readonly applicationTheme = input<ApplicationTheme>(this.defaultAppTheme ?? 'light');\n\n /**\n * It's ng-content for the collapsed (drawer) version\n *\n * @memberof NavbarComponent\n */\n readonly contentTemplateRef = input<TemplateRef<unknown>>();\n\n /**\n * Additional info template reference for the extra user info in the dropdown/sidesheet\n *\n * @memberof NavbarComponent\n */\n readonly userInfoExtraTemplateRef = input<TemplateRef<unknown>>();\n\n /**\n * Custom content template reference for the menu section between user info and menu items.\n * Use this to add custom components like credits display.\n *\n * @memberof NavbarComponent\n */\n readonly menuContentTemplateRef = input<TemplateRef<unknown>>();\n\n /**\n * Width at or below which the navbar renders its compact (brandmark) logo\n *\n * @memberof NavbarComponent\n */\n readonly mobileBreakpoint = input(ScreenBreakpoints.MOBILE, {\n // `[mobileBreakpoint]=\"maybeUndefined\"` must not produce `(max-width: undefinedpx)`.\n transform: (value: number) => value || ScreenBreakpoints.MOBILE,\n });\n\n /**\n * Width at or below which the horizontal navigation and the profile menu collapse\n * into the hamburger-triggered drawer\n *\n * @memberof NavbarComponent\n */\n readonly collapseBreakpoint = input(ScreenBreakpoints.LARGE_TABLET, {\n // `[collapseBreakpoint]=\"maybeUndefined\"` must not produce `(max-width: undefinedpx)`.\n transform: (value: number) => value || ScreenBreakpoints.LARGE_TABLET,\n });\n\n /**\n * Show avatar with user initials\n *\n * @memberof NavbarComponent\n */\n readonly isAvatar = input(true);\n\n /**\n * Sets class for the menu\n *\n * @memberof NavbarComponent\n */\n readonly menuClass = input('');\n\n /**\n * @ignore\n */\n readonly navigateEvent = output<string>();\n\n /**\n * @ignore\n */\n readonly menuItemClicked = output<string>();\n\n /**\n * @ignore\n */\n readonly logoutEvent = output<void>();\n readonly menuState = output<MenuState>();\n\n protected readonly isMobile = this.observeMaxWidth(this.mobileBreakpoint);\n protected readonly isCollapsed = this.observeMaxWidth(this.collapseBreakpoint);\n protected readonly screenSize = computed<ScreenSize>(() => {\n if (this.isMobile()) {\n return 'mobile';\n }\n return this.isCollapsed() ? 'tablet' : 'desktop';\n });\n\n /**\n * @deprecated Use the `screenSize` reported by `menuState` instead. Removed in the next major.\n */\n protected readonly isMobile$ = toObservable(this.isMobile);\n\n /**\n * @deprecated Use the `screenSize` reported by `menuState` instead. Removed in the next major.\n */\n protected readonly isTablet$ = toObservable(this.isCollapsed);\n\n protected readonly translationContext = 'NAVBAR.';\n protected readonly logoType = LogoTypeEnum;\n protected readonly AvatarSize = AvatarSize;\n\n readonly activeRoutesMap: Signal<Map<string, boolean>> = computed(() => {\n const currentRoute = this.activedRoute();\n return new Map(this.routes().map(route => [route.id, currentRoute?.startsWith(route.id)]));\n });\n\n /**\n * Output subscriptions of the currently open drawer. Torn down when it closes, so repeated\n * opens don't accumulate one set per open.\n */\n private drawerSubscriptions: OutputRefSubscription[] = [];\n private readonly isDrawerOpened = signal(false);\n\n // The hamburger disappears once the viewport grows past `collapseBreakpoint`, so an open\n // drawer would have no dismiss affordance left — close it as soon as the nav expands.\n private readonly closeDrawerOnExpand = effect(() => {\n if (!this.isCollapsed() && this.isDrawerOpened()) {\n this.sideSheetService.close();\n }\n });\n\n openMobileMenu(): void {\n // Defensive: never stack a second set of subscriptions if a close never reported back.\n this.teardownDrawerSubscriptions();\n\n const isSideSheetClosed$ = new Subject<void>();\n\n // `LanguageService` is backed by a BehaviorSubject, so this resolves synchronously.\n let title = '';\n this.translatePipe\n .transform(`${this.translationContext}MENU`)\n .pipe(take(1))\n .subscribe(translated => (title = translated));\n\n const navbarSideSheetComponent = this.sideSheetService.open<MobileNavbarSideSheetComponent>({\n componentRef: MobileNavbarSideSheetComponent,\n title,\n showLogo: false,\n closed: isSideSheetClosed$,\n inputs: {\n userName: this.userName(),\n menuItems: this.menuItems(),\n activedRoute: this.activedRoute(),\n routes: this.routes(),\n email: this.email(),\n contentTemplateRef: this.contentTemplateRef(),\n userInfoExtraTemplateRef: this.userInfoExtraTemplateRef(),\n menuContentTemplateRef: this.menuContentTemplateRef(),\n applicationTheme: this.applicationTheme(),\n },\n });\n\n this.drawerSubscriptions = [\n navbarSideSheetComponent.logoutEvent.subscribe(() => {\n this.logoutEvent.emit();\n isSideSheetClosed$.next();\n }),\n navbarSideSheetComponent.menuItemClicked.subscribe(value => {\n this.menuItemClicked.emit(value);\n isSideSheetClosed$.next();\n }),\n navbarSideSheetComponent.navigateEvent.subscribe(value => {\n this.navigateEvent.emit(value);\n isSideSheetClosed$.next();\n }),\n ];\n }\n\n /**\n * Closes the drawer if the navbar is currently collapsed. Consumers use this to dismiss the\n * menu on navigation without reaching into the component's internals.\n */\n closeMenu(): void {\n // The open check matters: `SideSheetService.close()` broadcasts to the sheet regardless of\n // its state, so calling it with the drawer already closed must stay a no-op.\n if (this.isCollapsed() && this.isDrawerOpened()) {\n this.sideSheetService.close();\n }\n }\n\n navigate(routeId: string) {\n this.navigateEvent.emit(`/${routeId}`);\n }\n\n logout(): void {\n this.logoutEvent.emit();\n }\n\n clickMenuItem(id: string) {\n this.menuItemClicked.emit(id);\n }\n\n onChangeMenuState(isOpened: boolean, screenSize: ScreenSize) {\n this.menuState.emit({ isOpened, screenSize });\n }\n\n protected onSideSheetOpenChange(isOpened: boolean): void {\n this.isDrawerOpened.set(isOpened);\n\n if (!isOpened) {\n this.teardownDrawerSubscriptions();\n }\n\n this.onChangeMenuState(isOpened, this.screenSize());\n }\n\n private teardownDrawerSubscriptions(): void {\n this.drawerSubscriptions.forEach(subscription => subscription.unsubscribe());\n this.drawerSubscriptions = [];\n }\n\n private observeMaxWidth(breakpointPx: Signal<number>): Signal<boolean> {\n return toSignal(\n toObservable(breakpointPx).pipe(\n switchMap(breakpoint => this.breakpointObserver.observe(`(max-width: ${breakpoint}px)`)),\n map(state => state.matches)\n ),\n { initialValue: false }\n );\n }\n}\n","<ui-side-sheet\n class=\"navbar-sheet\"\n [applicationTheme]=\"applicationTheme()\"\n (openChange)=\"onSideSheetOpenChange($event)\"\n position=\"end\"\n>\n <mat-toolbar [attr.theme]=\"applicationTheme()\">\n <div class=\"custom-toolbar row\">\n <div class=\"brand\">\n <ui-logo\n [applicationTheme]=\"applicationTheme()\"\n class=\"logo\"\n (click)=\"navigate('')\"\n [allowResizing]=\"true\"\n [width]=\"isMobile() ? 27 : 160\"\n [type]=\"isMobile() ? logoType.PRIMARY_BRANDMARK_PINK : logoType.DEFAULT\"\n ></ui-logo>\n\n @if (!isCollapsed()) {\n <div class=\"navigation row\">\n @for (route of routes(); track route) {\n <a\n (click)=\"navigate(route.id); $event.preventDefault()\"\n [href]=\"route.id\"\n [attr.data-testid]=\"route.id\"\n data-test-role=\"nav-route\"\n [ngClass]=\"{ active: activeRoutesMap().get(route.id) }\"\n >\n @if (route?.badgeOptions) {\n <ui-badge\n [label]=\"route.badgeOptions!.text ?? ''\"\n [rebrandColor]=\"route.badgeOptions!.color\"\n [variant]=\"route.badgeOptions!.variant ?? 'primary'\"\n [notificationsAmount]=\"route.badgeOptions!.notificationsAmount ?? 0\"\n ></ui-badge>\n }\n <span [attr.data-text]=\"route.title\">{{ route.title }}</span>\n </a>\n }\n </div>\n }\n </div>\n\n <div class=\"actions\">\n <div class=\"custom-actions\">\n <ng-content select=\"[actions]\"></ng-content>\n </div>\n\n @if (isCollapsed()) {\n <ui-button\n data-testid=\"navbar-menu-button\"\n (click)=\"openMobileMenu()\"\n [variant]=\"'text'\"\n [companyColor]=\"'#242424'\"\n [applicationTheme]=\"'light'\"\n [iconName]=\"'Menu-burger-in-line'\"\n [justIcon]=\"true\"\n ></ui-button>\n } @else {\n <button\n mat-button\n class=\"profile-menu\"\n [disableRipple]=\"applicationTheme() !== 'classic'\"\n (menuOpened)=\"onChangeMenuState(true, 'desktop')\"\n (menuClosed)=\"onChangeMenuState(false, 'desktop')\"\n [matMenuTriggerFor]=\"menu\"\n >\n <div class=\"profile-button-content\">\n @if (isAvatar()) {\n <ui-avatar\n data-testid=\"profile-button\"\n [ngClass]=\"{ opened: menu._panelAnimationState !== 'void' }\"\n [applicationTheme]=\"applicationTheme()\"\n [name]=\"userName()\"\n [size]=\"AvatarSize.SMALL_MEDIUM\"\n ></ui-avatar>\n } @else {\n {{ userName() }}\n }\n\n @if (applicationTheme() === 'classic') {\n <mat-icon iconPositionEnd>expand_more</mat-icon>\n } @else {\n @if (!isAvatar()) {\n <ui-icon\n [size]=\"'24'\"\n [name]=\"\n menu._panelAnimationState === 'void' ? 'Arrow-chevron-down-filled' : 'Arrow-chevron-up-filled'\n \"\n [applicationTheme]=\"applicationTheme()\"\n ></ui-icon>\n }\n }\n </div>\n </button>\n }\n </div>\n </div>\n </mat-toolbar>\n\n <ng-content></ng-content>\n\n <mat-menu [class]=\"menuClass()\" #menu=\"matMenu\">\n @if (applicationTheme() === 'classic') {\n @for (e of menuItems(); track e) {\n <button\n mat-menu-item\n (click)=\"clickMenuItem(e.id)\"\n [attr.data-testid]=\"e.id\"\n data-test-role=\"profile-menu-item\"\n >\n <div class=\"menu-item\">\n @if (e?.icon) {\n <ui-icon [name]=\"e.icon\" size=\"24\"></ui-icon>\n }\n {{ e.text }}\n </div>\n </button>\n }\n <button data-testid=\"logout-button\" mat-menu-item (click)=\"logout()\">\n <mat-icon>power_settings_new</mat-icon>\n {{ translationContext + 'LOG_OUT' | uiTranslate | async }}\n </button>\n } @else {\n <ui-mobile-navbar-side-sheet\n [isDesktop]=\"true\"\n [menuItems]=\"menuItems()\"\n [userName]=\"userName()\"\n [routes]=\"routes()\"\n [activedRoute]=\"activedRoute()\"\n [email]=\"email()\"\n [applicationTheme]=\"applicationTheme()\"\n [contentTemplateRef]=\"contentTemplateRef()\"\n [userInfoExtraTemplateRef]=\"userInfoExtraTemplateRef()\"\n [menuContentTemplateRef]=\"menuContentTemplateRef()\"\n (menuItemClicked)=\"clickMenuItem($event)\"\n (logoutEvent)=\"logout()\"\n >\n </ui-mobile-navbar-side-sheet>\n }\n </mat-menu>\n</ui-side-sheet>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatToolbarModule } from '@angular/material/toolbar';\n\nimport { AvatarComponentModule } from '@testgorilla/tgo-ui/components/avatar';\nimport { BadgeComponentModule } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { LogoComponentModule } from '@testgorilla/tgo-ui/components/logo';\nimport { SideSheetComponentModule } from '@testgorilla/tgo-ui/components/side-sheet';\n\nimport { MobileNavbarSideSheetComponent } from './mobile-navbar-side-sheet/mobile-navbar-side-sheet.component';\nimport { NavbarComponent } from './navbar.component';\n\n@NgModule({\n imports: [\n CommonModule,\n MatToolbarModule,\n MatIconModule,\n MatButtonModule,\n MatRippleModule,\n MatMenuModule,\n LogoComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n AvatarComponentModule,\n SideSheetComponentModule,\n ButtonComponentModule,\n MobileNavbarSideSheetComponent,\n BadgeComponentModule,\n NavbarComponent,\n ],\n exports: [NavbarComponent],\n})\nexport class NavbarComponentModule {}\n"],"mappings":"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"}
@@ -425,12 +425,15 @@ var OverflowMenuComponent = class OverflowMenuComponent {
425
425
  "ariaExpanded",
426
426
  "ariaControls",
427
427
  "ariaPressed",
428
+ "ariaHasPopup",
428
429
  "ariaRequired",
429
430
  "ariaLabelledby",
430
431
  "ariaDescribedby",
431
432
  "preventDefault",
432
433
  "hasBackground",
433
434
  "circular",
435
+ "isSingleLineLabel",
436
+ "iconButtonShape",
434
437
  "tooltipPosition",
435
438
  "role",
436
439
  "iconFilled",
@@ -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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"}
@@ -85,12 +85,15 @@ var PageHeaderComponent = class PageHeaderComponent {
85
85
  "ariaExpanded",
86
86
  "ariaControls",
87
87
  "ariaPressed",
88
+ "ariaHasPopup",
88
89
  "ariaRequired",
89
90
  "ariaLabelledby",
90
91
  "ariaDescribedby",
91
92
  "preventDefault",
92
93
  "hasBackground",
93
94
  "circular",
95
+ "isSingleLineLabel",
96
+ "iconButtonShape",
94
97
  "tooltipPosition",
95
98
  "role",
96
99
  "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;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":"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"}