@testgorilla/tgo-ui 12.2.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.
- package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-button.mjs +19 -4
- package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-core.mjs +11 -1
- package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +6 -0
- package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-field.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +6 -0
- package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +250 -50
- package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +4 -0
- package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +89 -7
- package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-table.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +3 -0
- package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
- package/mcp/catalog.json +1 -1
- package/package.json +1 -1
- package/types/testgorilla-tgo-ui-components-button.d.ts +32 -0
- package/types/testgorilla-tgo-ui-components-core.d.ts +1 -0
- package/types/testgorilla-tgo-ui-components-popover.d.ts +51 -5
- package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +59 -1
|
@@ -303,12 +303,15 @@ var AiFeedbackComponent = class AiFeedbackComponent {
|
|
|
303
303
|
"ariaExpanded",
|
|
304
304
|
"ariaControls",
|
|
305
305
|
"ariaPressed",
|
|
306
|
+
"ariaHasPopup",
|
|
306
307
|
"ariaRequired",
|
|
307
308
|
"ariaLabelledby",
|
|
308
309
|
"ariaDescribedby",
|
|
309
310
|
"preventDefault",
|
|
310
311
|
"hasBackground",
|
|
311
312
|
"circular",
|
|
313
|
+
"isSingleLineLabel",
|
|
314
|
+
"iconButtonShape",
|
|
312
315
|
"tooltipPosition",
|
|
313
316
|
"role",
|
|
314
317
|
"iconFilled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-ai-feedback.mjs","names":[],"sources":["../../../components/ai-feedback/ai-feedback.model.ts","../../../components/ai-feedback/ai-feedback.component.ts","../../../components/ai-feedback/ai-feedback.component.html","../../../components/ai-feedback/ai-feedback.module.ts"],"sourcesContent":["export enum AiFeedbackPanelType {\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n}\n\nexport type AiFeedbackVariant = 'default' | 'panel' | 'input-only';\n\nexport interface AiFeedbackOption {\n id: string;\n label: string;\n}\n\nexport interface AiFeedbackConfig {\n title: string;\n options?: AiFeedbackOption[]; // \"Other\" option will be automatically appended if options are provided\n otherPlaceholder?: string;\n}\n\nexport interface AiFeedbackData {\n isPositiveFeedback: boolean | null;\n selectedOptions?: string[];\n otherText?: string;\n}\n","import { trigger, transition, style, animate } from '@angular/animations';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\n\nimport { AiCaveatComponent } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponent } from '@testgorilla/tgo-ui/components/card';\nimport {\n ApplicationTheme,\n IS_MOBILE_TOKEN,\n UiTranslatePipe,\n MemoizeFuncPipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { TagComponent } from '@testgorilla/tgo-ui/components/tag';\n\nimport { AiFeedbackPanelType, AiFeedbackConfig, AiFeedbackData, AiFeedbackVariant } from './ai-feedback.model';\n\n@Component({\n selector: 'ui-ai-feedback',\n templateUrl: './ai-feedback.component.html',\n styleUrl: './ai-feedback.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n /* eslint-disable @typescript-eslint/no-deprecated -- the @angular/animations trigger/state/style/animate/transition DSL is deprecated in 20.2 in favor of template-level animate.enter/animate.leave; migrating every Material/component animation is out of scope for this lint pass */\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('200ms ease-out', style({ height: '*', opacity: 1 })),\n ]),\n transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),\n ]),\n ],\n imports: [\n AiCaveatComponent,\n IconComponentModule,\n ButtonComponent,\n CardComponent,\n TagComponent,\n FieldComponentModule,\n FormsModule,\n ReactiveFormsModule,\n AsyncPipe,\n UiTranslatePipe,\n MemoizeFuncPipe,\n ],\n})\nexport class AiFeedbackComponent implements OnInit {\n positiveConfig = input<AiFeedbackConfig>();\n negativeConfig = input<AiFeedbackConfig>();\n skipPanelForPositive = input<boolean>(false);\n applicationTheme = input<ApplicationTheme>('light');\n variant = input<AiFeedbackVariant>('default');\n isRatingDisabled = input<boolean>(false);\n enableAutoEmit = input<boolean>(false);\n isPositiveFeedback = model<boolean | null>(null);\n\n selectionChange = output<boolean | null>();\n feedbackSubmitted = output<AiFeedbackData>();\n feedbackCancelled = output<AiFeedbackData>();\n feedbackChanged = output<AiFeedbackData>();\n\n protected readonly isMobile$ = inject(IS_MOBILE_TOKEN);\n private readonly destroyRef = inject(DestroyRef);\n\n isMobile = toSignal(this.isMobile$, { initialValue: false });\n\n showPanel = signal<boolean>(false);\n panelType = signal<AiFeedbackPanelType | null>(null);\n selectedOptions = signal<string[]>([]);\n otherTextControl = new FormControl<string>('');\n otherTextValue = signal<string>('');\n\n private readonly selectedOptionsSubject = new Subject<string[]>();\n private readonly otherTextSubject = new Subject<string>();\n\n readonly translationContext = 'AI_FEEDBACK.';\n readonly AiFeedbackPanelType = AiFeedbackPanelType;\n private readonly defaultPositiveTitle = `${this.translationContext}POSITIVE_TITLE`;\n private readonly defaultNegativeTitle = `${this.translationContext}NEGATIVE_TITLE`;\n private readonly OTHER_OPTION_ID = 'other';\n\n shouldAutoEmit = computed(() => this.enableAutoEmit() && this.variant() !== 'default');\n\n ngOnInit(): void {\n this.otherTextControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => {\n this.otherTextValue.set(value ?? '');\n\n if (this.shouldAutoEmit()) {\n this.otherTextSubject.next(value ?? '');\n }\n });\n\n this.selectedOptionsSubject\n .pipe(\n debounceTime(500),\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n });\n });\n\n this.otherTextSubject\n .pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n });\n });\n }\n\n getDefaultPanelTitleTranslation(panelType: AiFeedbackPanelType | null): string {\n return panelType === AiFeedbackPanelType.POSITIVE ? this.defaultPositiveTitle : this.defaultNegativeTitle;\n }\n\n activeConfig = computed(() => {\n const type = this.panelType();\n\n if (type === AiFeedbackPanelType.POSITIVE) {\n const config = this.positiveConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n if (type === AiFeedbackPanelType.NEGATIVE) {\n const config = this.negativeConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n return null;\n });\n\n arrowPosition = computed(() => (this.panelType() === AiFeedbackPanelType.POSITIVE ? 'left' : 'right'));\n\n isSubmitDisabled = computed(() => {\n switch (this.variant()) {\n case 'input-only':\n return this.otherTextValue().trim().length === 0;\n case 'panel':\n return this.selectedOptions().length === 0;\n case 'default':\n default:\n return false;\n }\n });\n\n private ensureOtherOption(config: AiFeedbackConfig): AiFeedbackConfig {\n if (this.variant() === 'input-only') {\n return config;\n }\n const hasOther = config.options?.some(opt => opt.id === this.OTHER_OPTION_ID);\n return hasOther\n ? config\n : {\n ...config,\n options: [...(config.options ?? []), { id: this.OTHER_OPTION_ID, label: 'Other' }],\n };\n }\n\n private buildFeedbackData(): AiFeedbackData {\n if (this.variant() === 'input-only') {\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n };\n }\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n };\n }\n\n private resetPanelState(): void {\n this.showPanel.set(false);\n this.panelType.set(null);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n\n private shouldShowPanelForVariant(): boolean {\n return this.variant() === 'panel' || this.variant() === 'input-only';\n }\n\n onSelectionChange(isPositive: boolean): void {\n if (this.isRatingDisabled()) {\n return;\n }\n\n const newValue = this.isPositiveFeedback() === isPositive ? null : isPositive;\n this.isPositiveFeedback.set(newValue);\n\n this.selectionChange.emit(newValue);\n\n if (newValue !== null) {\n const shouldSkipPanel = isPositive && this.skipPanelForPositive();\n\n if (this.shouldShowPanelForVariant() && !shouldSkipPanel) {\n this.panelType.set(isPositive ? AiFeedbackPanelType.POSITIVE : AiFeedbackPanelType.NEGATIVE);\n this.showPanel.set(true);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n } else {\n this.closePanel();\n }\n }\n\n toggleOption(optionId: string): void {\n const current = this.selectedOptions();\n const updated = current.includes(optionId) ? current.filter(id => id !== optionId) : [...current, optionId];\n this.selectedOptions.set(updated);\n\n if (this.shouldAutoEmit()) {\n this.selectedOptionsSubject.next(updated);\n }\n }\n\n isOptionSelected(optionId: string): boolean {\n return this.selectedOptions().includes(optionId);\n }\n\n showOtherField(): boolean {\n return this.variant() === 'input-only' || this.selectedOptions().includes(this.OTHER_OPTION_ID);\n }\n\n onSubmit(): void {\n this.feedbackSubmitted.emit(this.buildFeedbackData());\n this.showPanel.set(false);\n }\n\n closePanel(): void {\n this.feedbackCancelled.emit(this.buildFeedbackData());\n this.resetPanelState();\n }\n}\n","<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n","import { CommonModule, AsyncPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { AiCaveatComponentModule } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\n\nimport { AiFeedbackComponent } from './ai-feedback.component';\n\n@NgModule({\n imports: [\n CommonModule,\n AsyncPipe,\n ReactiveFormsModule,\n ButtonComponentModule,\n CardComponentModule,\n TagComponentModule,\n FieldComponentModule,\n AiCaveatComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MemoizeFuncPipe,\n AiFeedbackComponent,\n ],\n exports: [AiFeedbackComponent],\n})\nexport class AiFeedbackModule {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-ai-feedback.mjs","names":[],"sources":["../../../components/ai-feedback/ai-feedback.model.ts","../../../components/ai-feedback/ai-feedback.component.ts","../../../components/ai-feedback/ai-feedback.component.html","../../../components/ai-feedback/ai-feedback.module.ts"],"sourcesContent":["export enum AiFeedbackPanelType {\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n}\n\nexport type AiFeedbackVariant = 'default' | 'panel' | 'input-only';\n\nexport interface AiFeedbackOption {\n id: string;\n label: string;\n}\n\nexport interface AiFeedbackConfig {\n title: string;\n options?: AiFeedbackOption[]; // \"Other\" option will be automatically appended if options are provided\n otherPlaceholder?: string;\n}\n\nexport interface AiFeedbackData {\n isPositiveFeedback: boolean | null;\n selectedOptions?: string[];\n otherText?: string;\n}\n","import { trigger, transition, style, animate } from '@angular/animations';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\n\nimport { AiCaveatComponent } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponent } from '@testgorilla/tgo-ui/components/card';\nimport {\n ApplicationTheme,\n IS_MOBILE_TOKEN,\n UiTranslatePipe,\n MemoizeFuncPipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { TagComponent } from '@testgorilla/tgo-ui/components/tag';\n\nimport { AiFeedbackPanelType, AiFeedbackConfig, AiFeedbackData, AiFeedbackVariant } from './ai-feedback.model';\n\n@Component({\n selector: 'ui-ai-feedback',\n templateUrl: './ai-feedback.component.html',\n styleUrl: './ai-feedback.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n /* eslint-disable @typescript-eslint/no-deprecated -- the @angular/animations trigger/state/style/animate/transition DSL is deprecated in 20.2 in favor of template-level animate.enter/animate.leave; migrating every Material/component animation is out of scope for this lint pass */\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('200ms ease-out', style({ height: '*', opacity: 1 })),\n ]),\n transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),\n ]),\n ],\n imports: [\n AiCaveatComponent,\n IconComponentModule,\n ButtonComponent,\n CardComponent,\n TagComponent,\n FieldComponentModule,\n FormsModule,\n ReactiveFormsModule,\n AsyncPipe,\n UiTranslatePipe,\n MemoizeFuncPipe,\n ],\n})\nexport class AiFeedbackComponent implements OnInit {\n positiveConfig = input<AiFeedbackConfig>();\n negativeConfig = input<AiFeedbackConfig>();\n skipPanelForPositive = input<boolean>(false);\n applicationTheme = input<ApplicationTheme>('light');\n variant = input<AiFeedbackVariant>('default');\n isRatingDisabled = input<boolean>(false);\n enableAutoEmit = input<boolean>(false);\n isPositiveFeedback = model<boolean | null>(null);\n\n selectionChange = output<boolean | null>();\n feedbackSubmitted = output<AiFeedbackData>();\n feedbackCancelled = output<AiFeedbackData>();\n feedbackChanged = output<AiFeedbackData>();\n\n protected readonly isMobile$ = inject(IS_MOBILE_TOKEN);\n private readonly destroyRef = inject(DestroyRef);\n\n isMobile = toSignal(this.isMobile$, { initialValue: false });\n\n showPanel = signal<boolean>(false);\n panelType = signal<AiFeedbackPanelType | null>(null);\n selectedOptions = signal<string[]>([]);\n otherTextControl = new FormControl<string>('');\n otherTextValue = signal<string>('');\n\n private readonly selectedOptionsSubject = new Subject<string[]>();\n private readonly otherTextSubject = new Subject<string>();\n\n readonly translationContext = 'AI_FEEDBACK.';\n readonly AiFeedbackPanelType = AiFeedbackPanelType;\n private readonly defaultPositiveTitle = `${this.translationContext}POSITIVE_TITLE`;\n private readonly defaultNegativeTitle = `${this.translationContext}NEGATIVE_TITLE`;\n private readonly OTHER_OPTION_ID = 'other';\n\n shouldAutoEmit = computed(() => this.enableAutoEmit() && this.variant() !== 'default');\n\n ngOnInit(): void {\n this.otherTextControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => {\n this.otherTextValue.set(value ?? '');\n\n if (this.shouldAutoEmit()) {\n this.otherTextSubject.next(value ?? '');\n }\n });\n\n this.selectedOptionsSubject\n .pipe(\n debounceTime(500),\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n });\n });\n\n this.otherTextSubject\n .pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n });\n });\n }\n\n getDefaultPanelTitleTranslation(panelType: AiFeedbackPanelType | null): string {\n return panelType === AiFeedbackPanelType.POSITIVE ? this.defaultPositiveTitle : this.defaultNegativeTitle;\n }\n\n activeConfig = computed(() => {\n const type = this.panelType();\n\n if (type === AiFeedbackPanelType.POSITIVE) {\n const config = this.positiveConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n if (type === AiFeedbackPanelType.NEGATIVE) {\n const config = this.negativeConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n return null;\n });\n\n arrowPosition = computed(() => (this.panelType() === AiFeedbackPanelType.POSITIVE ? 'left' : 'right'));\n\n isSubmitDisabled = computed(() => {\n switch (this.variant()) {\n case 'input-only':\n return this.otherTextValue().trim().length === 0;\n case 'panel':\n return this.selectedOptions().length === 0;\n case 'default':\n default:\n return false;\n }\n });\n\n private ensureOtherOption(config: AiFeedbackConfig): AiFeedbackConfig {\n if (this.variant() === 'input-only') {\n return config;\n }\n const hasOther = config.options?.some(opt => opt.id === this.OTHER_OPTION_ID);\n return hasOther\n ? config\n : {\n ...config,\n options: [...(config.options ?? []), { id: this.OTHER_OPTION_ID, label: 'Other' }],\n };\n }\n\n private buildFeedbackData(): AiFeedbackData {\n if (this.variant() === 'input-only') {\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n };\n }\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty text is reported as undefined, not an empty string\n otherText: this.otherTextControl.value || undefined,\n };\n }\n\n private resetPanelState(): void {\n this.showPanel.set(false);\n this.panelType.set(null);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n\n private shouldShowPanelForVariant(): boolean {\n return this.variant() === 'panel' || this.variant() === 'input-only';\n }\n\n onSelectionChange(isPositive: boolean): void {\n if (this.isRatingDisabled()) {\n return;\n }\n\n const newValue = this.isPositiveFeedback() === isPositive ? null : isPositive;\n this.isPositiveFeedback.set(newValue);\n\n this.selectionChange.emit(newValue);\n\n if (newValue !== null) {\n const shouldSkipPanel = isPositive && this.skipPanelForPositive();\n\n if (this.shouldShowPanelForVariant() && !shouldSkipPanel) {\n this.panelType.set(isPositive ? AiFeedbackPanelType.POSITIVE : AiFeedbackPanelType.NEGATIVE);\n this.showPanel.set(true);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n } else {\n this.closePanel();\n }\n }\n\n toggleOption(optionId: string): void {\n const current = this.selectedOptions();\n const updated = current.includes(optionId) ? current.filter(id => id !== optionId) : [...current, optionId];\n this.selectedOptions.set(updated);\n\n if (this.shouldAutoEmit()) {\n this.selectedOptionsSubject.next(updated);\n }\n }\n\n isOptionSelected(optionId: string): boolean {\n return this.selectedOptions().includes(optionId);\n }\n\n showOtherField(): boolean {\n return this.variant() === 'input-only' || this.selectedOptions().includes(this.OTHER_OPTION_ID);\n }\n\n onSubmit(): void {\n this.feedbackSubmitted.emit(this.buildFeedbackData());\n this.showPanel.set(false);\n }\n\n closePanel(): void {\n this.feedbackCancelled.emit(this.buildFeedbackData());\n this.resetPanelState();\n }\n}\n","<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n","import { CommonModule, AsyncPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { AiCaveatComponentModule } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\n\nimport { AiFeedbackComponent } from './ai-feedback.component';\n\n@NgModule({\n imports: [\n CommonModule,\n AsyncPipe,\n ReactiveFormsModule,\n ButtonComponentModule,\n CardComponentModule,\n TagComponentModule,\n FieldComponentModule,\n AiCaveatComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MemoizeFuncPipe,\n AiFeedbackComponent,\n ],\n exports: [AiFeedbackComponent],\n})\nexport class AiFeedbackModule {}\n"],"mappings":"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"}
|
|
@@ -178,12 +178,15 @@ var AlertBannerComponent = class AlertBannerComponent {
|
|
|
178
178
|
"ariaExpanded",
|
|
179
179
|
"ariaControls",
|
|
180
180
|
"ariaPressed",
|
|
181
|
+
"ariaHasPopup",
|
|
181
182
|
"ariaRequired",
|
|
182
183
|
"ariaLabelledby",
|
|
183
184
|
"ariaDescribedby",
|
|
184
185
|
"preventDefault",
|
|
185
186
|
"hasBackground",
|
|
186
187
|
"circular",
|
|
188
|
+
"isSingleLineLabel",
|
|
189
|
+
"iconButtonShape",
|
|
187
190
|
"tooltipPosition",
|
|
188
191
|
"role",
|
|
189
192
|
"iconFilled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-alert-banner.mjs","names":[],"sources":["../../../components/alert-banner/alert-banner.component.ts","../../../components/alert-banner/alert-banner.component.html","../../../components/alert-banner/alert-banner.component.module.ts"],"sourcesContent":["import { animate, style, transition, trigger } from '@angular/animations';\nimport { NgClass, AsyncPipe, UpperCasePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n} from '@angular/core';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport {\n ApplicationTheme,\n Color,\n AlertBarType,\n AlertVariant,\n alertBarsUtil,\n UiTranslatePipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { IconName, IconComponentModule, IconSize } from '@testgorilla/tgo-ui/components/icon';\nimport { SpinnerComponent } from '@testgorilla/tgo-ui/components/spinner';\n\nimport { AlertBannerAction, AlertBannerSize, LinkTargetType } from './alert-banner.model';\n\n@Component({\n selector: 'ui-alert-banner',\n templateUrl: './alert-banner.component.html',\n styleUrls: ['./alert-banner.component.scss'],\n /* eslint-disable @typescript-eslint/no-deprecated -- the @angular/animations trigger/state/style/animate/transition DSL is deprecated in 20.2 in favor of template-level animate.enter/animate.leave; migrating every Material/component animation is out of scope for this lint pass */\n animations: [\n trigger('openClose', [\n transition(':enter', [animate('0.2s ease-out', style({ opacity: 1 }))]),\n transition(':leave', [animate('0.2s ease-in', style({ opacity: 0 }))]),\n ]),\n ],\n /* eslint-enable @typescript-eslint/no-deprecated */\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, IconComponentModule, SpinnerComponent, ButtonComponent, AsyncPipe, UpperCasePipe, UiTranslatePipe],\n})\nexport class AlertBannerComponent implements OnInit, OnChanges {\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n /**\n * Alert Banner type\n *\n * @type {AlertBarType}\n * @default 'success'\n * @memberof AlertBannerComponent\n */\n @Input() alertType: AlertBarType = 'success';\n\n /**\n * Alert Banner variant\n *\n * @type {AlertVariant}\n * @default 'banner'\n * @memberof AlertBannerComponent\n */\n @Input() alertVariant: AlertVariant = 'banner';\n\n /**\n * Alert banner message\n *\n * @memberof AlertBannerComponent\n */\n @Input() message = '';\n\n /**\n * Include dismmiss button\n *\n * @default true\n * @memberof AlertBannerComponent\n */\n @Input() includeDismissButton = true;\n\n /**\n * Include shadow or not\n *\n * @default false\n * @memberof AlertBannerComponent\n */\n @Input() shadow = false;\n\n /**\n * Link text that will appended at the end of message\n *\n * @default ''\n * @memberof AlertBannerComponent\n */\n @Input() linkText? = '';\n\n /**\n * Link url\n *\n * @memberof AlertBannerComponent\n */\n @Input() linkUrl?: string;\n\n /**\n * Link target\n *\n * @type {@type {LinkTargetType}}\n * @default '_blank'\n * @memberof AlertBannerComponent\n */\n @Input() linkTarget?: LinkTargetType = '_blank';\n\n /**\n * Optional action buttons displayed on the right side of the banner.\n *\n * @type {AlertBannerAction[]}\n * @default []\n * @memberof AlertBannerComponent\n */\n @Input() actions: AlertBannerAction[] = [];\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @default 'light'\n * @memberof AlertBannerComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Alert density\n *\n * @type {AlertBannerSize}\n * @default 'default'\n * @memberof AlertBannerComponent\n */\n @Input() size: AlertBannerSize = 'default';\n\n /**\n * Sets the full width\n *\n * @type {boolean}\n * @memberof AlertBannerComponent\n */\n @Input() isFullWidth: boolean | undefined;\n\n /**\n * Close button tooltip\n *\n * @type {string}\n * @default ''\n * @memberof AlertBannerComponent\n */\n @Input() closeButtonTooltip = '';\n\n @Input() testId: string | null = null;\n\n get dismissButtonTestId(): string | null {\n return this.testId ? `${this.testId}-dismiss` : null;\n }\n\n /**\n * Shows icon\n *\n * @type {boolean}\n * @default true\n * @memberof AlertBannerComponent\n */\n @Input() hasIcon = true;\n\n /**\n * Controls loading state for spinner visibility.\n *\n * @type {boolean}\n * @default false\n * @memberof AlertBannerComponent\n */\n @Input() isLoading = false;\n\n /**\n * Sets the alert banner position\n *\n * @type {boolean}\n * @default false\n * @memberof AlertBannerComponent\n */\n @Input() fixed = false;\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 {string}\n * @memberof AlertBannerComponent\n */\n @Input() ariaDescribedby = '';\n\n @Input() secondaryAlerts: string[] = [];\n\n /**\n * Emitted when the user clicks the built-in dismiss button.\n *\n * @memberof AlertBannerComponent\n */\n @Output() dismiss = new EventEmitter<void>();\n\n @HostBinding('class.display-none') get isDismissed() {\n return this.dismissAlertBanner;\n }\n\n get iconSize(): IconSize {\n return this.size === 'small' ? '16' : '24';\n }\n\n iconName: IconName;\n iconColor: Color;\n visible = true;\n fullWidth: boolean;\n position: string;\n cssClass: string;\n dismissAlertBanner = false;\n\n ngOnInit(): void {\n this.updateBanner();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['alertType']) {\n this.updateBanner();\n }\n }\n\n private updateBanner(): void {\n this.iconName = alertBarsUtil.setIcon(this.alertType) as IconName;\n this.iconColor = alertBarsUtil.setIconColor(this.alertType);\n this.position = alertBarsUtil.setPosition(this.fixed);\n this.fullWidth = this.isFullWidth ?? this.alertVariant === 'banner';\n this.cssClass = alertBarsUtil.setCssClass(this.fullWidth, this.alertType, this.position, this.alertVariant);\n }\n\n //Hide snackbar when dismiss button is clicked\n dismissClick() {\n this.visible = false;\n this.dismiss.emit();\n setTimeout(() => {\n this.dismissAlertBanner = true;\n }, 200);\n }\n}\n","@if (visible) {\n <div\n [ngClass]=\"cssClass\"\n [@openClose]\n role=\"alert\"\n class=\"alert-container\"\n [attr.theme]=\"applicationTheme\"\n [class.shadow]=\"alertVariant === 'callout' && shadow\"\n [class.size-small]=\"size === 'small'\"\n [attr.aria-live]=\"alertType === 'error' || alertType === 'warning' ? 'assertive' : 'polite'\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-labelledby]=\"'labelledby'\"\n [attr.data-testid]=\"testId\"\n [tabIndex]=\"0\"\n >\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{\n 'ALERT_BANNER.' + (alertType | uppercase) | uiTranslate | async\n }}</span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div class=\"primary-alert-container\">\n <div class=\"alert-text\">\n @if (hasIcon) {\n <ui-icon\n class=\"left-icon\"\n [name]=\"iconName\"\n [size]=\"iconSize\"\n [color]=\"iconColor\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-icon>\n }\n @if (isLoading) {\n <ui-spinner\n class=\"loading-spinner\"\n size=\"small\"\n [isLoader]=\"false\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-spinner>\n }\n <span [innerHTML]=\"message\"></span>\n <span class=\"projected-content\"><ng-content></ng-content></span>\n @if (!!linkText) {\n <a [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n }\n </div>\n @if (actions.length > 0) {\n <div class=\"actions-container\">\n @for (action of actions; track $index) {\n <ui-button\n class=\"action-button\"\n [variant]=\"action.variant ?? 'text-inline'\"\n [label]=\"action.label\"\n [size]=\"action.size ?? 'medium'\"\n [disabled]=\"!!action.disabled\"\n [applicationTheme]=\"applicationTheme\"\n (buttonClickEvent)=\"action.onClick($event)\"\n [testId]=\"action.testId ?? null\"\n [fullWidth]=\"true\"\n ></ui-button>\n }\n </div>\n }\n @let closeLabel = (closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!;\n @if (includeDismissButton && applicationTheme === 'classic') {\n <ui-button\n variant=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n [ariaLabel]=\"closeLabel\"\n [tooltip]=\"closeLabel\"\n (buttonClickEvent)=\"dismissClick()\"\n [testId]=\"dismissButtonTestId\"\n ></ui-button>\n }\n @if (includeDismissButton && applicationTheme !== 'classic') {\n <ui-button\n class=\"right-icon\"\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"'Close'\"\n [size]=\"'small'\"\n [justIcon]=\"true\"\n [tooltip]=\"closeLabel\"\n [ariaLabel]=\"closeLabel\"\n [testId]=\"dismissButtonTestId\"\n (click)=\"dismissClick()\"\n ></ui-button>\n }\n </div>\n @if (secondaryAlerts.length > 0) {\n <div class=\"secondary-alerts-container\">\n <ul>\n @for (alert of secondaryAlerts; track alert) {\n <li class=\"secondary-alert-item\" [innerHTML]=\"alert\"></li>\n }\n </ul>\n </div>\n }\n </div>\n}\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';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';\n\nimport { AlertBannerComponent } from './alert-banner.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ButtonComponentModule,\n IconComponentModule,\n SpinnerComponentModule,\n UiTranslatePipe,\n AlertBannerComponent,\n ],\n exports: [AlertBannerComponent],\n})\nexport class AlertBannerComponentModule {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-alert-banner.mjs","names":[],"sources":["../../../components/alert-banner/alert-banner.component.ts","../../../components/alert-banner/alert-banner.component.html","../../../components/alert-banner/alert-banner.component.module.ts"],"sourcesContent":["import { animate, style, transition, trigger } from '@angular/animations';\nimport { NgClass, AsyncPipe, UpperCasePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n} from '@angular/core';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport {\n ApplicationTheme,\n Color,\n AlertBarType,\n AlertVariant,\n alertBarsUtil,\n UiTranslatePipe,\n} from '@testgorilla/tgo-ui/components/core';\nimport { IconName, IconComponentModule, IconSize } from '@testgorilla/tgo-ui/components/icon';\nimport { SpinnerComponent } from '@testgorilla/tgo-ui/components/spinner';\n\nimport { AlertBannerAction, AlertBannerSize, LinkTargetType } from './alert-banner.model';\n\n@Component({\n selector: 'ui-alert-banner',\n templateUrl: './alert-banner.component.html',\n styleUrls: ['./alert-banner.component.scss'],\n /* eslint-disable @typescript-eslint/no-deprecated -- the @angular/animations trigger/state/style/animate/transition DSL is deprecated in 20.2 in favor of template-level animate.enter/animate.leave; migrating every Material/component animation is out of scope for this lint pass */\n animations: [\n trigger('openClose', [\n transition(':enter', [animate('0.2s ease-out', style({ opacity: 1 }))]),\n transition(':leave', [animate('0.2s ease-in', style({ opacity: 0 }))]),\n ]),\n ],\n /* eslint-enable @typescript-eslint/no-deprecated */\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, IconComponentModule, SpinnerComponent, ButtonComponent, AsyncPipe, UpperCasePipe, UiTranslatePipe],\n})\nexport class AlertBannerComponent implements OnInit, OnChanges {\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n /**\n * Alert Banner type\n *\n * @type {AlertBarType}\n * @default 'success'\n * @memberof AlertBannerComponent\n */\n @Input() alertType: AlertBarType = 'success';\n\n /**\n * Alert Banner variant\n *\n * @type {AlertVariant}\n * @default 'banner'\n * @memberof AlertBannerComponent\n */\n @Input() alertVariant: AlertVariant = 'banner';\n\n /**\n * Alert banner message\n *\n * @memberof AlertBannerComponent\n */\n @Input() message = '';\n\n /**\n * Include dismmiss button\n *\n * @default true\n * @memberof AlertBannerComponent\n */\n @Input() includeDismissButton = true;\n\n /**\n * Include shadow or not\n *\n * @default false\n * @memberof AlertBannerComponent\n */\n @Input() shadow = false;\n\n /**\n * Link text that will appended at the end of message\n *\n * @default ''\n * @memberof AlertBannerComponent\n */\n @Input() linkText? = '';\n\n /**\n * Link url\n *\n * @memberof AlertBannerComponent\n */\n @Input() linkUrl?: string;\n\n /**\n * Link target\n *\n * @type {@type {LinkTargetType}}\n * @default '_blank'\n * @memberof AlertBannerComponent\n */\n @Input() linkTarget?: LinkTargetType = '_blank';\n\n /**\n * Optional action buttons displayed on the right side of the banner.\n *\n * @type {AlertBannerAction[]}\n * @default []\n * @memberof AlertBannerComponent\n */\n @Input() actions: AlertBannerAction[] = [];\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @default 'light'\n * @memberof AlertBannerComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Alert density\n *\n * @type {AlertBannerSize}\n * @default 'default'\n * @memberof AlertBannerComponent\n */\n @Input() size: AlertBannerSize = 'default';\n\n /**\n * Sets the full width\n *\n * @type {boolean}\n * @memberof AlertBannerComponent\n */\n @Input() isFullWidth: boolean | undefined;\n\n /**\n * Close button tooltip\n *\n * @type {string}\n * @default ''\n * @memberof AlertBannerComponent\n */\n @Input() closeButtonTooltip = '';\n\n @Input() testId: string | null = null;\n\n get dismissButtonTestId(): string | null {\n return this.testId ? `${this.testId}-dismiss` : null;\n }\n\n /**\n * Shows icon\n *\n * @type {boolean}\n * @default true\n * @memberof AlertBannerComponent\n */\n @Input() hasIcon = true;\n\n /**\n * Controls loading state for spinner visibility.\n *\n * @type {boolean}\n * @default false\n * @memberof AlertBannerComponent\n */\n @Input() isLoading = false;\n\n /**\n * Sets the alert banner position\n *\n * @type {boolean}\n * @default false\n * @memberof AlertBannerComponent\n */\n @Input() fixed = false;\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 {string}\n * @memberof AlertBannerComponent\n */\n @Input() ariaDescribedby = '';\n\n @Input() secondaryAlerts: string[] = [];\n\n /**\n * Emitted when the user clicks the built-in dismiss button.\n *\n * @memberof AlertBannerComponent\n */\n @Output() dismiss = new EventEmitter<void>();\n\n @HostBinding('class.display-none') get isDismissed() {\n return this.dismissAlertBanner;\n }\n\n get iconSize(): IconSize {\n return this.size === 'small' ? '16' : '24';\n }\n\n iconName: IconName;\n iconColor: Color;\n visible = true;\n fullWidth: boolean;\n position: string;\n cssClass: string;\n dismissAlertBanner = false;\n\n ngOnInit(): void {\n this.updateBanner();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['alertType']) {\n this.updateBanner();\n }\n }\n\n private updateBanner(): void {\n this.iconName = alertBarsUtil.setIcon(this.alertType) as IconName;\n this.iconColor = alertBarsUtil.setIconColor(this.alertType);\n this.position = alertBarsUtil.setPosition(this.fixed);\n this.fullWidth = this.isFullWidth ?? this.alertVariant === 'banner';\n this.cssClass = alertBarsUtil.setCssClass(this.fullWidth, this.alertType, this.position, this.alertVariant);\n }\n\n //Hide snackbar when dismiss button is clicked\n dismissClick() {\n this.visible = false;\n this.dismiss.emit();\n setTimeout(() => {\n this.dismissAlertBanner = true;\n }, 200);\n }\n}\n","@if (visible) {\n <div\n [ngClass]=\"cssClass\"\n [@openClose]\n role=\"alert\"\n class=\"alert-container\"\n [attr.theme]=\"applicationTheme\"\n [class.shadow]=\"alertVariant === 'callout' && shadow\"\n [class.size-small]=\"size === 'small'\"\n [attr.aria-live]=\"alertType === 'error' || alertType === 'warning' ? 'assertive' : 'polite'\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-labelledby]=\"'labelledby'\"\n [attr.data-testid]=\"testId\"\n [tabIndex]=\"0\"\n >\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{\n 'ALERT_BANNER.' + (alertType | uppercase) | uiTranslate | async\n }}</span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div class=\"primary-alert-container\">\n <div class=\"alert-text\">\n @if (hasIcon) {\n <ui-icon\n class=\"left-icon\"\n [name]=\"iconName\"\n [size]=\"iconSize\"\n [color]=\"iconColor\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-icon>\n }\n @if (isLoading) {\n <ui-spinner\n class=\"loading-spinner\"\n size=\"small\"\n [isLoader]=\"false\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-spinner>\n }\n <span [innerHTML]=\"message\"></span>\n <span class=\"projected-content\"><ng-content></ng-content></span>\n @if (!!linkText) {\n <a [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n }\n </div>\n @if (actions.length > 0) {\n <div class=\"actions-container\">\n @for (action of actions; track $index) {\n <ui-button\n class=\"action-button\"\n [variant]=\"action.variant ?? 'text-inline'\"\n [label]=\"action.label\"\n [size]=\"action.size ?? 'medium'\"\n [disabled]=\"!!action.disabled\"\n [applicationTheme]=\"applicationTheme\"\n (buttonClickEvent)=\"action.onClick($event)\"\n [testId]=\"action.testId ?? null\"\n [fullWidth]=\"true\"\n ></ui-button>\n }\n </div>\n }\n @let closeLabel = (closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!;\n @if (includeDismissButton && applicationTheme === 'classic') {\n <ui-button\n variant=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n [ariaLabel]=\"closeLabel\"\n [tooltip]=\"closeLabel\"\n (buttonClickEvent)=\"dismissClick()\"\n [testId]=\"dismissButtonTestId\"\n ></ui-button>\n }\n @if (includeDismissButton && applicationTheme !== 'classic') {\n <ui-button\n class=\"right-icon\"\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"'Close'\"\n [size]=\"'small'\"\n [justIcon]=\"true\"\n [tooltip]=\"closeLabel\"\n [ariaLabel]=\"closeLabel\"\n [testId]=\"dismissButtonTestId\"\n (click)=\"dismissClick()\"\n ></ui-button>\n }\n </div>\n @if (secondaryAlerts.length > 0) {\n <div class=\"secondary-alerts-container\">\n <ul>\n @for (alert of secondaryAlerts; track alert) {\n <li class=\"secondary-alert-item\" [innerHTML]=\"alert\"></li>\n }\n </ul>\n </div>\n }\n </div>\n}\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';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';\n\nimport { AlertBannerComponent } from './alert-banner.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ButtonComponentModule,\n IconComponentModule,\n SpinnerComponentModule,\n UiTranslatePipe,\n AlertBannerComponent,\n ],\n exports: [AlertBannerComponent],\n})\nexport class AlertBannerComponentModule {}\n"],"mappings":"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"}
|
|
@@ -191,12 +191,15 @@ var AvatarComponent = class AvatarComponent {
|
|
|
191
191
|
"ariaExpanded",
|
|
192
192
|
"ariaControls",
|
|
193
193
|
"ariaPressed",
|
|
194
|
+
"ariaHasPopup",
|
|
194
195
|
"ariaRequired",
|
|
195
196
|
"ariaLabelledby",
|
|
196
197
|
"ariaDescribedby",
|
|
197
198
|
"preventDefault",
|
|
198
199
|
"hasBackground",
|
|
199
200
|
"circular",
|
|
201
|
+
"isSingleLineLabel",
|
|
202
|
+
"iconButtonShape",
|
|
200
203
|
"tooltipPosition",
|
|
201
204
|
"role",
|
|
202
205
|
"iconFilled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-avatar.mjs","names":[],"sources":["../../../components/avatar/avatar.model.ts","../../../components/avatar/name-initials.pipe.ts","../../../components/avatar/avatar.component.ts","../../../components/avatar/avatar.component.html","../../../components/avatar/avatar.component.module.ts"],"sourcesContent":["import { IconSize } from '@testgorilla/tgo-ui/components/icon';\n\nexport enum AvatarSize {\n SMALL = 'small',\n SMALL_MEDIUM = 'smallMedium',\n MEDIUM = 'medium',\n MEDIUM_LARGE = 'mediumLarge',\n LARGE = 'large',\n}\n\nexport type AvatarSizeType = `${AvatarSize}`;\n\nexport const iconSize: Record<string, IconSize> = {\n small: '16',\n medium: '24',\n large: '80',\n};\n\nexport enum AvatarBackgroundColor {\n PINK = '#FFE6FA',\n BLUE = '#D9E8FF',\n GREEN = '#D4F2C3',\n ORANGE = '#FFE1B3',\n RED = '#FFAC9A',\n}\n\nexport type BackgroundAvatarColorType = 'red' | 'blue' | 'green' | 'orange' | 'pink';\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'nameInitials' })\nexport class NameInitialsPipe implements PipeTransform {\n transform(value: string): string {\n const initials = value.split(' ').filter(Boolean);\n if (initials.length > 1) {\n return initials\n .map((initial, i) => (i === 0 || i === initials.length - 1 ? initial[0].toUpperCase() : ''))\n .join('');\n } else {\n const firstLetters = value.substring(0, 2);\n return `${firstLetters[0]?.toUpperCase() ?? ''}${firstLetters[1]?.toLowerCase() ?? ''}`;\n }\n }\n}\n","import { NgClass, NgStyle, AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { AvatarBackgroundColor, AvatarSize, AvatarSizeType, BackgroundAvatarColorType, iconSize } from './avatar.model';\nimport { NameInitialsPipe } from './name-initials.pipe';\n\n@Component({\n selector: 'ui-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n imports: [NgClass, NgStyle, IconComponentModule, ButtonComponentModule, AsyncPipe, UiTranslatePipe, NameInitialsPipe],\n})\nexport class AvatarComponent {\n /**\n * Input property for specifying the size of the avatar.\n * @type {AvatarSize}\n * @default AvatarSize.SMALL\n * @memberof AvatarComponent\n */\n @Input() size: AvatarSizeType = AvatarSize.SMALL;\n /**\n * Input property for specifying the URL of the image to display in the avatar.\n * @type {string}\n * @memberof AvatarComponent\n */\n @Input() imageUrl = '';\n\n /**\n * Input property for specifying the initials to display in the avatar.\n * @type {string}\n * @memberof AvatarComponent\n */\n @Input() name = '';\n\n /**\n * Input property for specifying the tooltip text for edit.\n * @type {string}\n * @memberof AvatarComponent\n */\n @Input() tooltipText = '';\n\n /**\n * Input property that makes avatar editable.\n * @type {boolean}\n * @memberof AvatarComponent\n */\n @Input() allowEdit = false;\n\n /**\n *\n * Defines the application theme where\n *\n * @type {ApplicationTheme}\n * @memberof AvatarComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n *\n * Defines the background color\n *\n * @type {BackgroundAvatarColorType}\n * @memberof AvatarComponent\n */\n @Input() set backgroundColor(colorName: BackgroundAvatarColorType) {\n this.backgroundAvatarColor = AvatarBackgroundColor[colorName.toUpperCase() as keyof typeof AvatarBackgroundColor];\n }\n\n /**\n * Event emitted when the edit button is clicked.\n * @type {Event}\n * @memberof AvatarComponent\n */\n @Output() editClick = new EventEmitter<Event>();\n\n protected backgroundAvatarColor: string;\n protected readonly iconSize = iconSize;\n protected readonly avatarSize = AvatarSize;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n protected handleImageError(): void {\n this.imageUrl = '';\n }\n\n protected onEditClick(event: Event): void {\n this.editClick.emit(event);\n }\n}\n","<div\n class=\"avatar-container\"\n [attr.type]=\"!imageUrl && !name ? 'icon' : 'initials'\"\n [ngClass]=\"[size]\"\n [attr.theme]=\"applicationTheme\"\n [ngStyle]=\"{ backgroundColor: backgroundAvatarColor }\"\n>\n @if (name && !imageUrl) {\n <span class=\"initials\">\n {{ name | nameInitials }}\n </span>\n }\n @if (imageUrl) {\n <img [attr.aria-hidden]=\"true\" [attr.src]=\"imageUrl\" [alt]=\"\" (error)=\"handleImageError()\" />\n }\n @if (!imageUrl && !name) {\n <ui-icon\n [attr.aria-hidden]=\"true\"\n [color]=\"applicationTheme === 'classic' ? 'dark' : 'rebrand-black'\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"iconSize[size]\"\n [name]=\"'User-profile'\"\n ></ui-icon>\n }\n @if (allowEdit && (size === avatarSize.LARGE || size === avatarSize.MEDIUM_LARGE)) {\n <div class=\"edit-avatar\">\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n [companyColor]=\"'black'\"\n [size]=\"'small'\"\n [iconName]=\"'Edit'\"\n [variant]=\"'icon-button'\"\n [tooltip]=\"tooltipText\"\n [ariaLabel]=\"('AVATAR.EDIT_AVATAR' | uiTranslate | async)!\"\n (buttonClickEvent)=\"onEditClick($event)\"\n ></ui-button>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { AvatarComponent } from './avatar.component';\nimport { NameInitialsPipe } from './name-initials.pipe';\n\n@NgModule({\n imports: [\n CommonModule,\n IconComponentModule,\n MatTooltipModule,\n ButtonComponentModule,\n UiTranslatePipe,\n AvatarComponent,\n NameInitialsPipe,\n ],\n exports: [AvatarComponent],\n})\nexport class AvatarComponentModule {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-avatar.mjs","names":[],"sources":["../../../components/avatar/avatar.model.ts","../../../components/avatar/name-initials.pipe.ts","../../../components/avatar/avatar.component.ts","../../../components/avatar/avatar.component.html","../../../components/avatar/avatar.component.module.ts"],"sourcesContent":["import { IconSize } from '@testgorilla/tgo-ui/components/icon';\n\nexport enum AvatarSize {\n SMALL = 'small',\n SMALL_MEDIUM = 'smallMedium',\n MEDIUM = 'medium',\n MEDIUM_LARGE = 'mediumLarge',\n LARGE = 'large',\n}\n\nexport type AvatarSizeType = `${AvatarSize}`;\n\nexport const iconSize: Record<string, IconSize> = {\n small: '16',\n medium: '24',\n large: '80',\n};\n\nexport enum AvatarBackgroundColor {\n PINK = '#FFE6FA',\n BLUE = '#D9E8FF',\n GREEN = '#D4F2C3',\n ORANGE = '#FFE1B3',\n RED = '#FFAC9A',\n}\n\nexport type BackgroundAvatarColorType = 'red' | 'blue' | 'green' | 'orange' | 'pink';\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'nameInitials' })\nexport class NameInitialsPipe implements PipeTransform {\n transform(value: string): string {\n const initials = value.split(' ').filter(Boolean);\n if (initials.length > 1) {\n return initials\n .map((initial, i) => (i === 0 || i === initials.length - 1 ? initial[0].toUpperCase() : ''))\n .join('');\n } else {\n const firstLetters = value.substring(0, 2);\n return `${firstLetters[0]?.toUpperCase() ?? ''}${firstLetters[1]?.toLowerCase() ?? ''}`;\n }\n }\n}\n","import { NgClass, NgStyle, AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { AvatarBackgroundColor, AvatarSize, AvatarSizeType, BackgroundAvatarColorType, iconSize } from './avatar.model';\nimport { NameInitialsPipe } from './name-initials.pipe';\n\n@Component({\n selector: 'ui-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n imports: [NgClass, NgStyle, IconComponentModule, ButtonComponentModule, AsyncPipe, UiTranslatePipe, NameInitialsPipe],\n})\nexport class AvatarComponent {\n /**\n * Input property for specifying the size of the avatar.\n * @type {AvatarSize}\n * @default AvatarSize.SMALL\n * @memberof AvatarComponent\n */\n @Input() size: AvatarSizeType = AvatarSize.SMALL;\n /**\n * Input property for specifying the URL of the image to display in the avatar.\n * @type {string}\n * @memberof AvatarComponent\n */\n @Input() imageUrl = '';\n\n /**\n * Input property for specifying the initials to display in the avatar.\n * @type {string}\n * @memberof AvatarComponent\n */\n @Input() name = '';\n\n /**\n * Input property for specifying the tooltip text for edit.\n * @type {string}\n * @memberof AvatarComponent\n */\n @Input() tooltipText = '';\n\n /**\n * Input property that makes avatar editable.\n * @type {boolean}\n * @memberof AvatarComponent\n */\n @Input() allowEdit = false;\n\n /**\n *\n * Defines the application theme where\n *\n * @type {ApplicationTheme}\n * @memberof AvatarComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n *\n * Defines the background color\n *\n * @type {BackgroundAvatarColorType}\n * @memberof AvatarComponent\n */\n @Input() set backgroundColor(colorName: BackgroundAvatarColorType) {\n this.backgroundAvatarColor = AvatarBackgroundColor[colorName.toUpperCase() as keyof typeof AvatarBackgroundColor];\n }\n\n /**\n * Event emitted when the edit button is clicked.\n * @type {Event}\n * @memberof AvatarComponent\n */\n @Output() editClick = new EventEmitter<Event>();\n\n protected backgroundAvatarColor: string;\n protected readonly iconSize = iconSize;\n protected readonly avatarSize = AvatarSize;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n protected handleImageError(): void {\n this.imageUrl = '';\n }\n\n protected onEditClick(event: Event): void {\n this.editClick.emit(event);\n }\n}\n","<div\n class=\"avatar-container\"\n [attr.type]=\"!imageUrl && !name ? 'icon' : 'initials'\"\n [ngClass]=\"[size]\"\n [attr.theme]=\"applicationTheme\"\n [ngStyle]=\"{ backgroundColor: backgroundAvatarColor }\"\n>\n @if (name && !imageUrl) {\n <span class=\"initials\">\n {{ name | nameInitials }}\n </span>\n }\n @if (imageUrl) {\n <img [attr.aria-hidden]=\"true\" [attr.src]=\"imageUrl\" [alt]=\"\" (error)=\"handleImageError()\" />\n }\n @if (!imageUrl && !name) {\n <ui-icon\n [attr.aria-hidden]=\"true\"\n [color]=\"applicationTheme === 'classic' ? 'dark' : 'rebrand-black'\"\n [applicationTheme]=\"applicationTheme\"\n [size]=\"iconSize[size]\"\n [name]=\"'User-profile'\"\n ></ui-icon>\n }\n @if (allowEdit && (size === avatarSize.LARGE || size === avatarSize.MEDIUM_LARGE)) {\n <div class=\"edit-avatar\">\n <ui-button\n [applicationTheme]=\"applicationTheme\"\n [companyColor]=\"'black'\"\n [size]=\"'small'\"\n [iconName]=\"'Edit'\"\n [variant]=\"'icon-button'\"\n [tooltip]=\"tooltipText\"\n [ariaLabel]=\"('AVATAR.EDIT_AVATAR' | uiTranslate | async)!\"\n (buttonClickEvent)=\"onEditClick($event)\"\n ></ui-button>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { AvatarComponent } from './avatar.component';\nimport { NameInitialsPipe } from './name-initials.pipe';\n\n@NgModule({\n imports: [\n CommonModule,\n IconComponentModule,\n MatTooltipModule,\n ButtonComponentModule,\n UiTranslatePipe,\n AvatarComponent,\n NameInitialsPipe,\n ],\n exports: [AvatarComponent],\n})\nexport class AvatarComponentModule {}\n"],"mappings":"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"}
|
|
@@ -267,12 +267,15 @@ var BreadcrumbComponent = class BreadcrumbComponent {
|
|
|
267
267
|
"ariaExpanded",
|
|
268
268
|
"ariaControls",
|
|
269
269
|
"ariaPressed",
|
|
270
|
+
"ariaHasPopup",
|
|
270
271
|
"ariaRequired",
|
|
271
272
|
"ariaLabelledby",
|
|
272
273
|
"ariaDescribedby",
|
|
273
274
|
"preventDefault",
|
|
274
275
|
"hasBackground",
|
|
275
276
|
"circular",
|
|
277
|
+
"isSingleLineLabel",
|
|
278
|
+
"iconButtonShape",
|
|
276
279
|
"tooltipPosition",
|
|
277
280
|
"role",
|
|
278
281
|
"iconFilled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-breadcrumb.mjs","names":[],"sources":["../../../components/breadcrumb/breadcrumb.component.ts","../../../components/breadcrumb/breadcrumb.component.html","../../../components/breadcrumb/breadcrumb.component.module.ts"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n input,\n signal,\n ViewChild,\n OnDestroy,\n computed,\n EventEmitter,\n Output,\n effect,\n ChangeDetectionStrategy,\n Injector,\n afterNextRender,\n ElementRef,\n} from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, TruncatePipe, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuButtonsType, OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\n\nimport { BreadcrumbItem, BreadcrumbSize } from './breadcrumb.model';\n\n@Component({\n selector: 'ui-breadcrumb',\n templateUrl: './breadcrumb.component.html',\n styleUrls: ['./breadcrumb.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ButtonComponentModule,\n OverflowMenuComponentModule,\n MatTooltip,\n IconComponentModule,\n SkeletonComponent,\n AsyncPipe,\n UiTranslatePipe,\n TruncatePipe,\n ],\n})\nexport class BreadcrumbComponent implements AfterViewInit, OnDestroy {\n size = input<BreadcrumbSize>('large');\n items = input<BreadcrumbItem[]>([]);\n applicationTheme = input<ApplicationTheme>('light');\n includeBackButton = input<boolean>(false);\n isLoading = input<boolean>(false);\n numberOfLoadingItems = input<number>(3);\n maxItemLength = input<number>(18);\n\n readonly testId = input<string | null>(null);\n\n protected readonly backButtonTestId = computed(() => (this.testId() ? `${this.testId()}-back` : null));\n\n protected itemTestId(value: string): string | null {\n const testId = this.testId();\n return testId ? `${testId}-item-${value}` : null;\n }\n @Output() selectItem: EventEmitter<string> = new EventEmitter<string>();\n @Output() backButtonClickEvent: EventEmitter<Event> = new EventEmitter<Event>();\n\n loadingItems = computed(() => new Array<undefined>(this.numberOfLoadingItems()));\n isOverflowing = signal<boolean>(false);\n visibleItems = signal<BreadcrumbItem[]>([]);\n overflowItems = signal<BreadcrumbItem[]>([]);\n overflowButtonItems = computed<OverflowMenuButtonsType[]>(() =>\n this.overflowItems().map(item => ({\n label: item.label,\n value: item.value,\n }))\n );\n shouldTruncateLastItem = signal<boolean>(false);\n\n @ViewChild('breadcrumbContainer') breadcrumbContainer!: ElementRef<HTMLElement>;\n\n private resizeObserver?: ResizeObserver;\n private itemsInOverflow = 0;\n private previousLoadingState?: boolean;\n private readonly injector: Injector;\n\n constructor(private readonly parentInjector: Injector) {\n this.injector = parentInjector;\n // React to items changes and recalculate overflow\n effect(() => {\n this.items();\n this.itemsInOverflow = 0;\n\n // Only proceed if not in loading state\n if (!this.isLoading()) {\n // Use afterNextRender to ensure DOM is updated before calculating\n afterNextRender(\n () => {\n if (this.breadcrumbContainer?.nativeElement) {\n this.calculateItemDistribution();\n }\n },\n { injector: this.injector }\n );\n }\n });\n\n // React to loading state changes and setup ResizeObserver when loading changes from true to false\n effect(() => {\n const currentLoadingState = this.isLoading();\n\n if (this.previousLoadingState === true && currentLoadingState === false) {\n // Use afterNextRender to ensure DOM is ready before setting up observer\n afterNextRender(\n () => {\n this.setupResizeObserver();\n },\n { injector: this.injector }\n );\n }\n\n this.previousLoadingState = currentLoadingState;\n });\n }\n\n ngAfterViewInit() {\n this.calculateItemDistribution();\n this.setupResizeObserver();\n }\n\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n }\n\n private calculateItemDistribution() {\n if (!this.breadcrumbContainer?.nativeElement || this.items().length === 0) {\n this.resetToAllVisible();\n return;\n }\n\n const element = this.breadcrumbContainer.nativeElement;\n const hasHorizontalOverflow = element.scrollWidth > element.clientWidth;\n\n if (hasHorizontalOverflow) {\n this.handleOverflow();\n } else if (this.itemsInOverflow > 0) {\n // Check if we can bring items back from overflow\n this.tryReduceOverflow();\n } else {\n this.resetToAllVisible();\n }\n }\n\n private handleOverflow() {\n this.itemsInOverflow = Math.min(this.itemsInOverflow + 1, this.items().length - 1);\n\n this.updateItemArrays();\n this.isOverflowing.set(true);\n\n // Wait for DOM to render the updated template after hiding items\n // We need to measure dimensions AFTER the DOM has been updated with the new visible items\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const element = this.breadcrumbContainer.nativeElement;\n const stillOverflowing = element.scrollWidth > element.clientWidth;\n\n if (stillOverflowing && this.itemsInOverflow < this.items().length - 1) {\n this.handleOverflow();\n } else if (stillOverflowing && this.itemsInOverflow === this.items().length - 1) {\n this.shouldTruncateLastItem.set(true);\n }\n }\n }, 0);\n }\n\n private tryReduceOverflow() {\n const testItemsInOverflow = this.itemsInOverflow - 1;\n\n if (testItemsInOverflow >= 0) {\n const testVisibleItems = this.items().slice(testItemsInOverflow);\n const testOverflowItems = testItemsInOverflow > 0 ? this.items().slice(0, testItemsInOverflow) : [];\n\n this.visibleItems.set(testVisibleItems);\n this.overflowItems.set(testOverflowItems);\n\n // Always reset truncation when trying to reduce overflow\n this.shouldTruncateLastItem.set(false);\n\n // Wait for DOM to render with test configuration before measuring\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const element = this.breadcrumbContainer.nativeElement;\n const hasOverflow = element.scrollWidth > element.clientWidth;\n\n if (!hasOverflow) {\n // It fits! Update the counter\n this.itemsInOverflow = testItemsInOverflow;\n this.isOverflowing.set(this.itemsInOverflow > 0);\n\n // Try to reduce more if there are still items in overflow\n if (this.itemsInOverflow > 0) {\n // Schedule next reduction attempt after current render cycle\n setTimeout(() => this.tryReduceOverflow(), 0);\n }\n } else {\n // Doesn't fit, revert to previous state\n this.updateItemArrays();\n\n // Wait for DOM to render reverted state before checking truncation\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const containerElement = this.breadcrumbContainer.nativeElement;\n const stillOverflowing = containerElement.scrollWidth > containerElement.clientWidth;\n\n if (stillOverflowing && this.itemsInOverflow === this.items().length - 1) {\n this.shouldTruncateLastItem.set(true);\n }\n }\n }, 0);\n }\n }\n }, 0);\n } else {\n // testItemsInOverflow < 0, means we're trying to show all items\n this.resetToAllVisible();\n\n // Wait for DOM to render all items before measuring overflow\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const element = this.breadcrumbContainer.nativeElement;\n const hasOverflow = element.scrollWidth > element.clientWidth;\n\n if (hasOverflow) {\n // Still overflows with all items, need to go back to overflow state\n this.itemsInOverflow = 1; // Start with minimal overflow\n this.handleOverflow();\n }\n }\n }, 0);\n }\n }\n\n private updateItemArrays() {\n if (this.itemsInOverflow > 0) {\n this.overflowItems.set(this.items().slice(0, this.itemsInOverflow));\n this.visibleItems.set(this.items().slice(this.itemsInOverflow));\n } else {\n this.resetToAllVisible();\n }\n }\n\n private resetToAllVisible() {\n this.visibleItems.set(this.items());\n this.overflowItems.set([]);\n this.isOverflowing.set(false);\n this.shouldTruncateLastItem.set(false);\n this.itemsInOverflow = 0;\n }\n\n private setupResizeObserver() {\n if (!this.breadcrumbContainer?.nativeElement) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.calculateItemDistribution();\n });\n\n this.resizeObserver.observe(this.breadcrumbContainer.nativeElement);\n }\n}\n","@if (!isLoading()) {\n <div\n class=\"breadcrumb\"\n [attr.theme]=\"applicationTheme()\"\n #breadcrumbContainer\n [class]=\"'breadcrumb-' + size()\"\n [attr.data-testid]=\"testId()\"\n >\n @if (includeBackButton()) {\n <ui-button\n [variant]=\"'icon-button'\"\n [tooltip]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [iconName]=\"'Arrow-chevron-left-filled'\"\n [ariaLabel]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [testId]=\"backButtonTestId()\"\n (buttonClickEvent)=\"backButtonClickEvent.emit($event)\"\n ></ui-button>\n }\n @if (isOverflowing()) {\n <ui-overflow-menu\n [applicationTheme]=\"applicationTheme()\"\n [contentTemplateRef]=\"overflowMenu\"\n [buttons]=\"overflowButtonItems()\"\n [matTooltip]=\"('COMMON.OPTIONS' | uiTranslate | async)!\"\n [matTooltipClass]=\"applicationTheme()\"\n [isDynamicMenu]=\"true\"\n (selectItem)=\"selectItem.emit($event)\"\n class=\"breadcrumb-overflow-menu\"\n ></ui-overflow-menu>\n <ui-icon name=\"Arrow-chevron-right-filled\" [applicationTheme]=\"applicationTheme()\" color=\"gray\"></ui-icon>\n }\n @for (item of visibleItems(); track item.value) {\n @if (!$last) {\n <span\n class=\"breadcrumb-item\"\n tabindex=\"0\"\n [matTooltip]=\"item.label.length > maxItemLength() ? item.label : ''\"\n [matTooltipClass]=\"applicationTheme()\"\n [attr.aria-label]=\"item.label\"\n [attr.data-testid]=\"itemTestId(item.value)\"\n (click)=\"selectItem.emit(item.value)\"\n (keydown.enter)=\"selectItem.emit(item.value)\"\n >\n {{ item.label | truncate: maxItemLength() : '...' }}\n </span>\n <ui-icon name=\"Arrow-chevron-right-filled\" [applicationTheme]=\"applicationTheme()\" color=\"gray\"></ui-icon>\n } @else {\n <strong\n class=\"breadcrumb-item-active\"\n tabindex=\"0\"\n [matTooltip]=\"shouldTruncateLastItem() ? item.label : ''\"\n [matTooltipClass]=\"applicationTheme()\"\n [class.breadcrumb-item-active-truncated]=\"shouldTruncateLastItem()\"\n [attr.aria-label]=\"item.label\"\n [attr.aria-current]=\"'page'\"\n [attr.data-testid]=\"itemTestId(item.value)\"\n (click)=\"selectItem.emit(item.value)\"\n (keydown.enter)=\"selectItem.emit(item.value)\"\n >\n {{ item.label }}\n </strong>\n }\n }\n </div>\n} @else {\n <div class=\"breadcrumb\">\n @for (i of loadingItems(); track $index) {\n <ui-skeleton count=\"1\" [theme]=\"{ width: '160px', margin: '10px 0 0' }\"></ui-skeleton>\n @if ($index !== numberOfLoadingItems() - 1) {\n <ui-icon name=\"Arrow-chevron-right-filled\" [applicationTheme]=\"applicationTheme()\" color=\"gray\"></ui-icon>\n }\n }\n </div>\n}\n<ng-template #overflowMenu>\n <div class=\"breadcrumb-item breadcrumb-overflow\" [class]=\"'breadcrumb-' + size()\">...</div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe, TruncatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\n\nimport { BreadcrumbComponent } from './breadcrumb.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconComponentModule,\n MatTooltipModule,\n OverflowMenuComponentModule,\n ButtonComponentModule,\n SkeletonComponent,\n UiTranslatePipe,\n TruncatePipe,\n BreadcrumbComponent,\n ],\n exports: [BreadcrumbComponent],\n})\nexport class BreadcrumbComponentModule {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-breadcrumb.mjs","names":[],"sources":["../../../components/breadcrumb/breadcrumb.component.ts","../../../components/breadcrumb/breadcrumb.component.html","../../../components/breadcrumb/breadcrumb.component.module.ts"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n input,\n signal,\n ViewChild,\n OnDestroy,\n computed,\n EventEmitter,\n Output,\n effect,\n ChangeDetectionStrategy,\n Injector,\n afterNextRender,\n ElementRef,\n} from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme, TruncatePipe, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuButtonsType, OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\n\nimport { BreadcrumbItem, BreadcrumbSize } from './breadcrumb.model';\n\n@Component({\n selector: 'ui-breadcrumb',\n templateUrl: './breadcrumb.component.html',\n styleUrls: ['./breadcrumb.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ButtonComponentModule,\n OverflowMenuComponentModule,\n MatTooltip,\n IconComponentModule,\n SkeletonComponent,\n AsyncPipe,\n UiTranslatePipe,\n TruncatePipe,\n ],\n})\nexport class BreadcrumbComponent implements AfterViewInit, OnDestroy {\n size = input<BreadcrumbSize>('large');\n items = input<BreadcrumbItem[]>([]);\n applicationTheme = input<ApplicationTheme>('light');\n includeBackButton = input<boolean>(false);\n isLoading = input<boolean>(false);\n numberOfLoadingItems = input<number>(3);\n maxItemLength = input<number>(18);\n\n readonly testId = input<string | null>(null);\n\n protected readonly backButtonTestId = computed(() => (this.testId() ? `${this.testId()}-back` : null));\n\n protected itemTestId(value: string): string | null {\n const testId = this.testId();\n return testId ? `${testId}-item-${value}` : null;\n }\n @Output() selectItem: EventEmitter<string> = new EventEmitter<string>();\n @Output() backButtonClickEvent: EventEmitter<Event> = new EventEmitter<Event>();\n\n loadingItems = computed(() => new Array<undefined>(this.numberOfLoadingItems()));\n isOverflowing = signal<boolean>(false);\n visibleItems = signal<BreadcrumbItem[]>([]);\n overflowItems = signal<BreadcrumbItem[]>([]);\n overflowButtonItems = computed<OverflowMenuButtonsType[]>(() =>\n this.overflowItems().map(item => ({\n label: item.label,\n value: item.value,\n }))\n );\n shouldTruncateLastItem = signal<boolean>(false);\n\n @ViewChild('breadcrumbContainer') breadcrumbContainer!: ElementRef<HTMLElement>;\n\n private resizeObserver?: ResizeObserver;\n private itemsInOverflow = 0;\n private previousLoadingState?: boolean;\n private readonly injector: Injector;\n\n constructor(private readonly parentInjector: Injector) {\n this.injector = parentInjector;\n // React to items changes and recalculate overflow\n effect(() => {\n this.items();\n this.itemsInOverflow = 0;\n\n // Only proceed if not in loading state\n if (!this.isLoading()) {\n // Use afterNextRender to ensure DOM is updated before calculating\n afterNextRender(\n () => {\n if (this.breadcrumbContainer?.nativeElement) {\n this.calculateItemDistribution();\n }\n },\n { injector: this.injector }\n );\n }\n });\n\n // React to loading state changes and setup ResizeObserver when loading changes from true to false\n effect(() => {\n const currentLoadingState = this.isLoading();\n\n if (this.previousLoadingState === true && currentLoadingState === false) {\n // Use afterNextRender to ensure DOM is ready before setting up observer\n afterNextRender(\n () => {\n this.setupResizeObserver();\n },\n { injector: this.injector }\n );\n }\n\n this.previousLoadingState = currentLoadingState;\n });\n }\n\n ngAfterViewInit() {\n this.calculateItemDistribution();\n this.setupResizeObserver();\n }\n\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n }\n\n private calculateItemDistribution() {\n if (!this.breadcrumbContainer?.nativeElement || this.items().length === 0) {\n this.resetToAllVisible();\n return;\n }\n\n const element = this.breadcrumbContainer.nativeElement;\n const hasHorizontalOverflow = element.scrollWidth > element.clientWidth;\n\n if (hasHorizontalOverflow) {\n this.handleOverflow();\n } else if (this.itemsInOverflow > 0) {\n // Check if we can bring items back from overflow\n this.tryReduceOverflow();\n } else {\n this.resetToAllVisible();\n }\n }\n\n private handleOverflow() {\n this.itemsInOverflow = Math.min(this.itemsInOverflow + 1, this.items().length - 1);\n\n this.updateItemArrays();\n this.isOverflowing.set(true);\n\n // Wait for DOM to render the updated template after hiding items\n // We need to measure dimensions AFTER the DOM has been updated with the new visible items\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const element = this.breadcrumbContainer.nativeElement;\n const stillOverflowing = element.scrollWidth > element.clientWidth;\n\n if (stillOverflowing && this.itemsInOverflow < this.items().length - 1) {\n this.handleOverflow();\n } else if (stillOverflowing && this.itemsInOverflow === this.items().length - 1) {\n this.shouldTruncateLastItem.set(true);\n }\n }\n }, 0);\n }\n\n private tryReduceOverflow() {\n const testItemsInOverflow = this.itemsInOverflow - 1;\n\n if (testItemsInOverflow >= 0) {\n const testVisibleItems = this.items().slice(testItemsInOverflow);\n const testOverflowItems = testItemsInOverflow > 0 ? this.items().slice(0, testItemsInOverflow) : [];\n\n this.visibleItems.set(testVisibleItems);\n this.overflowItems.set(testOverflowItems);\n\n // Always reset truncation when trying to reduce overflow\n this.shouldTruncateLastItem.set(false);\n\n // Wait for DOM to render with test configuration before measuring\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const element = this.breadcrumbContainer.nativeElement;\n const hasOverflow = element.scrollWidth > element.clientWidth;\n\n if (!hasOverflow) {\n // It fits! Update the counter\n this.itemsInOverflow = testItemsInOverflow;\n this.isOverflowing.set(this.itemsInOverflow > 0);\n\n // Try to reduce more if there are still items in overflow\n if (this.itemsInOverflow > 0) {\n // Schedule next reduction attempt after current render cycle\n setTimeout(() => this.tryReduceOverflow(), 0);\n }\n } else {\n // Doesn't fit, revert to previous state\n this.updateItemArrays();\n\n // Wait for DOM to render reverted state before checking truncation\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const containerElement = this.breadcrumbContainer.nativeElement;\n const stillOverflowing = containerElement.scrollWidth > containerElement.clientWidth;\n\n if (stillOverflowing && this.itemsInOverflow === this.items().length - 1) {\n this.shouldTruncateLastItem.set(true);\n }\n }\n }, 0);\n }\n }\n }, 0);\n } else {\n // testItemsInOverflow < 0, means we're trying to show all items\n this.resetToAllVisible();\n\n // Wait for DOM to render all items before measuring overflow\n setTimeout(() => {\n if (this.breadcrumbContainer?.nativeElement) {\n const element = this.breadcrumbContainer.nativeElement;\n const hasOverflow = element.scrollWidth > element.clientWidth;\n\n if (hasOverflow) {\n // Still overflows with all items, need to go back to overflow state\n this.itemsInOverflow = 1; // Start with minimal overflow\n this.handleOverflow();\n }\n }\n }, 0);\n }\n }\n\n private updateItemArrays() {\n if (this.itemsInOverflow > 0) {\n this.overflowItems.set(this.items().slice(0, this.itemsInOverflow));\n this.visibleItems.set(this.items().slice(this.itemsInOverflow));\n } else {\n this.resetToAllVisible();\n }\n }\n\n private resetToAllVisible() {\n this.visibleItems.set(this.items());\n this.overflowItems.set([]);\n this.isOverflowing.set(false);\n this.shouldTruncateLastItem.set(false);\n this.itemsInOverflow = 0;\n }\n\n private setupResizeObserver() {\n if (!this.breadcrumbContainer?.nativeElement) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.calculateItemDistribution();\n });\n\n this.resizeObserver.observe(this.breadcrumbContainer.nativeElement);\n }\n}\n","@if (!isLoading()) {\n <div\n class=\"breadcrumb\"\n [attr.theme]=\"applicationTheme()\"\n #breadcrumbContainer\n [class]=\"'breadcrumb-' + size()\"\n [attr.data-testid]=\"testId()\"\n >\n @if (includeBackButton()) {\n <ui-button\n [variant]=\"'icon-button'\"\n [tooltip]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [iconName]=\"'Arrow-chevron-left-filled'\"\n [ariaLabel]=\"('COMMON.BACK' | uiTranslate | async)!\"\n [testId]=\"backButtonTestId()\"\n (buttonClickEvent)=\"backButtonClickEvent.emit($event)\"\n ></ui-button>\n }\n @if (isOverflowing()) {\n <ui-overflow-menu\n [applicationTheme]=\"applicationTheme()\"\n [contentTemplateRef]=\"overflowMenu\"\n [buttons]=\"overflowButtonItems()\"\n [matTooltip]=\"('COMMON.OPTIONS' | uiTranslate | async)!\"\n [matTooltipClass]=\"applicationTheme()\"\n [isDynamicMenu]=\"true\"\n (selectItem)=\"selectItem.emit($event)\"\n class=\"breadcrumb-overflow-menu\"\n ></ui-overflow-menu>\n <ui-icon name=\"Arrow-chevron-right-filled\" [applicationTheme]=\"applicationTheme()\" color=\"gray\"></ui-icon>\n }\n @for (item of visibleItems(); track item.value) {\n @if (!$last) {\n <span\n class=\"breadcrumb-item\"\n tabindex=\"0\"\n [matTooltip]=\"item.label.length > maxItemLength() ? item.label : ''\"\n [matTooltipClass]=\"applicationTheme()\"\n [attr.aria-label]=\"item.label\"\n [attr.data-testid]=\"itemTestId(item.value)\"\n (click)=\"selectItem.emit(item.value)\"\n (keydown.enter)=\"selectItem.emit(item.value)\"\n >\n {{ item.label | truncate: maxItemLength() : '...' }}\n </span>\n <ui-icon name=\"Arrow-chevron-right-filled\" [applicationTheme]=\"applicationTheme()\" color=\"gray\"></ui-icon>\n } @else {\n <strong\n class=\"breadcrumb-item-active\"\n tabindex=\"0\"\n [matTooltip]=\"shouldTruncateLastItem() ? item.label : ''\"\n [matTooltipClass]=\"applicationTheme()\"\n [class.breadcrumb-item-active-truncated]=\"shouldTruncateLastItem()\"\n [attr.aria-label]=\"item.label\"\n [attr.aria-current]=\"'page'\"\n [attr.data-testid]=\"itemTestId(item.value)\"\n (click)=\"selectItem.emit(item.value)\"\n (keydown.enter)=\"selectItem.emit(item.value)\"\n >\n {{ item.label }}\n </strong>\n }\n }\n </div>\n} @else {\n <div class=\"breadcrumb\">\n @for (i of loadingItems(); track $index) {\n <ui-skeleton count=\"1\" [theme]=\"{ width: '160px', margin: '10px 0 0' }\"></ui-skeleton>\n @if ($index !== numberOfLoadingItems() - 1) {\n <ui-icon name=\"Arrow-chevron-right-filled\" [applicationTheme]=\"applicationTheme()\" color=\"gray\"></ui-icon>\n }\n }\n </div>\n}\n<ng-template #overflowMenu>\n <div class=\"breadcrumb-item breadcrumb-overflow\" [class]=\"'breadcrumb-' + size()\">...</div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe, TruncatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\n\nimport { BreadcrumbComponent } from './breadcrumb.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconComponentModule,\n MatTooltipModule,\n OverflowMenuComponentModule,\n ButtonComponentModule,\n SkeletonComponent,\n UiTranslatePipe,\n TruncatePipe,\n BreadcrumbComponent,\n ],\n exports: [BreadcrumbComponent],\n})\nexport class BreadcrumbComponentModule {}\n"],"mappings":";;;;;;;;;;;;AA2CA,IAAa,sBAAb,MAAa,oBAAmB;CAapB,WAAW,OAAa;EAChC,MAAM,SAAS,KAAK,OAAM;EAC1B,OAAO,SAAS,GAAG,OAAM,QAAS,UAAU;CAC9C;CAuBA,YAA6B,gBAAwB;EAAxB,KAAA,iBAAA;EAtC7B,KAAA,OAAO,MAAsB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EACrC,KAAA,QAAQ,MAAwB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EACnC,KAAA,mBAAmB,MAAwB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;EACnD,KAAA,oBAAoB,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;EACzC,KAAA,YAAY,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EACjC,KAAA,uBAAuB,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,uBAAA,CAAA,+BAAA,CAAA,CAAA;EACvC,KAAA,gBAAgB,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;EAExB,KAAA,SAAS,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;EAEzB,KAAA,mBAAmB,eAAgB,KAAK,OAAM,IAAK,GAAG,KAAK,OAAM,EAAE,SAAU,MAAM,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;EAM5F,KAAA,aAAmC,IAAI,aAAY;EACnD,KAAA,uBAA4C,IAAI,aAAY;EAEtE,KAAA,eAAe,eAAe,IAAI,MAAiB,KAAK,qBAAoB,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;EAChF,KAAA,gBAAgB,OAAgB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;EACtC,KAAA,eAAe,OAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;EAC3C,KAAA,gBAAgB,OAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;EAC5C,KAAA,sBAAsB,eACpB,KAAK,cAAa,CAAE,CAAC,KAAI,UAAS;GAChC,OAAO,KAAK;GACZ,OAAO,KAAK;EACb,EAAC,GACH,GAAA,YAAA,CAAA,EAAA,WAAA,sBAAA,CAAA,+BAAA,CAAA,CAAA;EACD,KAAA,yBAAyB,OAAgB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,yBAAA,CAAA,+BAAA,CAAA,CAAA;EAKvC,KAAA,kBAAkB;EAKxB,KAAK,WAAW;EAEhB,aAAY;GACV,KAAK,MAAK;GACV,KAAK,kBAAkB;GAGvB,IAAI,CAAC,KAAK,UAAS,GAEjB,sBACO;IACH,IAAI,KAAK,qBAAqB,eAC5B,KAAK,0BAAyB;GAElC,GACA,EAAE,UAAU,KAAK,SAAQ,CAAE;EAGjC,CAAC;EAGD,aAAY;GACV,MAAM,sBAAsB,KAAK,UAAS;GAE1C,IAAI,KAAK,yBAAyB,QAAQ,wBAAwB,OAEhE,sBACO;IACH,KAAK,oBAAmB;GAC1B,GACA,EAAE,UAAU,KAAK,SAAQ,CAAE;GAI/B,KAAK,uBAAuB;EAC9B,CAAC;CACH;CAEA,kBAAe;EACb,KAAK,0BAAyB;EAC9B,KAAK,oBAAmB;CAC1B;CAEA,cAAW;EACT,KAAK,gBAAgB,WAAU;CACjC;CAEQ,4BAAyB;EAC/B,IAAI,CAAC,KAAK,qBAAqB,iBAAiB,KAAK,MAAK,CAAE,CAAC,WAAW,GAAG;GACzE,KAAK,kBAAiB;GACtB;EACF;EAEA,MAAM,UAAU,KAAK,oBAAoB;EAGzC,IAF8B,QAAQ,cAAc,QAAQ,aAG1D,KAAK,eAAc;OACd,IAAI,KAAK,kBAAkB,GAEhC,KAAK,kBAAiB;OAEtB,KAAK,kBAAiB;CAE1B;CAEQ,iBAAc;EACpB,KAAK,kBAAkB,KAAK,IAAI,KAAK,kBAAkB,GAAG,KAAK,MAAK,CAAE,CAAC,SAAS,CAAC;EAEjF,KAAK,iBAAgB;EACrB,KAAK,cAAc,IAAI,IAAI;EAI3B,iBAAgB;GACd,IAAI,KAAK,qBAAqB,eAAe;IAC3C,MAAM,UAAU,KAAK,oBAAoB;IACzC,MAAM,mBAAmB,QAAQ,cAAc,QAAQ;IAEvD,IAAI,oBAAoB,KAAK,kBAAkB,KAAK,MAAK,CAAE,CAAC,SAAS,GACnE,KAAK,eAAc;SACd,IAAI,oBAAoB,KAAK,oBAAoB,KAAK,MAAK,CAAE,CAAC,SAAS,GAC5E,KAAK,uBAAuB,IAAI,IAAI;GAExC;EACF,GAAG,CAAC;CACN;CAEQ,oBAAiB;EACvB,MAAM,sBAAsB,KAAK,kBAAkB;EAEnD,IAAI,uBAAuB,GAAG;GAC5B,MAAM,mBAAmB,KAAK,MAAK,CAAE,CAAC,MAAM,mBAAmB;GAC/D,MAAM,oBAAoB,sBAAsB,IAAI,KAAK,MAAK,CAAE,CAAC,MAAM,GAAG,mBAAmB,IAAI,CAAA;GAEjG,KAAK,aAAa,IAAI,gBAAgB;GACtC,KAAK,cAAc,IAAI,iBAAiB;GAGxC,KAAK,uBAAuB,IAAI,KAAK;GAGrC,iBAAgB;IACd,IAAI,KAAK,qBAAqB,eAAe;KAC3C,MAAM,UAAU,KAAK,oBAAoB;KAGzC,IAAI,EAFgB,QAAQ,cAAc,QAAQ,cAEhC;MAEhB,KAAK,kBAAkB;MACvB,KAAK,cAAc,IAAI,KAAK,kBAAkB,CAAC;MAG/C,IAAI,KAAK,kBAAkB,GAEzB,iBAAiB,KAAK,kBAAiB,GAAI,CAAC;KAEhD,OAAO;MAEL,KAAK,iBAAgB;MAGrB,iBAAgB;OACd,IAAI,KAAK,qBAAqB,eAAe;QAC3C,MAAM,mBAAmB,KAAK,oBAAoB;QAGlD,IAFyB,iBAAiB,cAAc,iBAAiB,eAEjD,KAAK,oBAAoB,KAAK,MAAK,CAAE,CAAC,SAAS,GACrE,KAAK,uBAAuB,IAAI,IAAI;OAExC;MACF,GAAG,CAAC;KACN;IACF;GACF,GAAG,CAAC;EACN,OAAO;GAEL,KAAK,kBAAiB;GAGtB,iBAAgB;IACd,IAAI,KAAK,qBAAqB,eAAe;KAC3C,MAAM,UAAU,KAAK,oBAAoB;KAGzC,IAFoB,QAAQ,cAAc,QAAQ,aAEjC;MAEf,KAAK,kBAAkB;MACvB,KAAK,eAAc;KACrB;IACF;GACF,GAAG,CAAC;EACN;CACF;CAEQ,mBAAgB;EACtB,IAAI,KAAK,kBAAkB,GAAG;GAC5B,KAAK,cAAc,IAAI,KAAK,MAAK,CAAE,CAAC,MAAM,GAAG,KAAK,eAAe,CAAC;GAClE,KAAK,aAAa,IAAI,KAAK,MAAK,CAAE,CAAC,MAAM,KAAK,eAAe,CAAC;EAChE,OACE,KAAK,kBAAiB;CAE1B;CAEQ,oBAAiB;EACvB,KAAK,aAAa,IAAI,KAAK,MAAK,CAAE;EAClC,KAAK,cAAc,IAAI,CAAA,CAAE;EACzB,KAAK,cAAc,IAAI,KAAK;EAC5B,KAAK,uBAAuB,IAAI,KAAK;EACrC,KAAK,kBAAkB;CACzB;CAEQ,sBAAmB;EACzB,IAAI,CAAC,KAAK,qBAAqB,eAC7B;EAGF,KAAK,iBAAiB,IAAI,qBAAoB;GAC5C,KAAK,0BAAyB;EAChC,CAAC;EAED,KAAK,eAAe,QAAQ,KAAK,oBAAoB,aAAa;CACpE;CA9NW;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAmB,MAAA,CAAA,EAAA,OAAA,GAAA,SAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAnB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAmB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,MAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,OAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,kBAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,mBAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,WAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,sBAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,eAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,QAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,SAAA;IAAA,YAAA;IAAA,sBAAA;GAAA;GAAA,aAAA,CAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,qBAAA;IAAA,aAAA;GAAA,CAAA;GAAA,UAAA;GAAA,UC3ChC;GA6EA,QAAA,CAAA,myHAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MD5CI;IAAqB;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,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;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,oBAAA,kBAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACrB;IAA2B;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAC3B;KAAU,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,UAAA,CAAA,YAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACV;IAAmB;IAAA;KAAA,MAAA;KAAA,MAAA,GAAA;KAAA,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACnB;KAAiB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACjB;KAAS,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACT;KAAe,MAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACf;KAAY,MAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;EAAA,CAAA;CAAA;;AAGH,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAhB/B,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAe,iBAGR,wBAAwB;GAAM,SACtC;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;GAAA,UAAA;GAAA,QAAA,CAAA,myHAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E,eAmBA,MAAA,O;E,yBACA,MAAA,O;;GAcA,MAAA;GAAU,MAAA,CAAA,qBAAqB;;;;AEjDlC,IAAa,4BAAb,MAAa,0BAAyB;CAAzB;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAyB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAAzB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAyB,SAAA;IAZlC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GAAmB;GAAA,SAAA,CAEX,mBAAmB;EAAA,CAAA;CAAA;CAElB;EAAA,KAAA,OAAA,GAAA,oBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAyB,SAAA;IAZlC;IACA;IACA;IACA;IACA;IACA;IAGA;GAAmB;EAAA,CAAA;CAAA;;AAIV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EAdrC,MAAA;EAAS,MAAA,CAAA;GACR,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;GACD,SAAS,CAAC,mBAAmB;EAC9B,CAAA"}
|