@testgorilla/tgo-ui 12.2.0 → 12.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +3 -0
  2. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  3. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +6 -1
  4. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  5. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs +1 -1
  6. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs.map +1 -1
  7. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs +6 -4
  8. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs.map +1 -1
  9. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs +1 -1
  10. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs.map +1 -1
  11. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +3 -0
  12. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  13. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +3 -0
  14. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  15. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +19 -4
  16. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  17. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +3 -0
  18. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  19. package/fesm2022/testgorilla-tgo-ui-components-core.mjs +11 -1
  20. package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
  21. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +7 -1
  22. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  23. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +3 -0
  24. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  25. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +3 -0
  26. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  27. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +8 -2
  28. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  29. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +3 -0
  30. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  31. package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs +12 -3
  32. package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs.map +1 -1
  33. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +6 -2
  34. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  35. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +3 -0
  36. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  37. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +3 -0
  38. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  39. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +6 -0
  40. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  41. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +3 -0
  42. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  43. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +3 -0
  44. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  45. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +250 -50
  46. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
  47. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +4 -0
  48. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  49. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +4 -1
  50. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  51. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs +5 -2
  52. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs.map +1 -1
  53. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +3 -0
  54. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  55. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs +9 -2
  56. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs.map +1 -1
  57. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +89 -7
  58. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  59. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +3 -0
  60. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  61. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +7 -4
  62. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  63. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs +13 -4
  64. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs.map +1 -1
  65. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +3 -0
  66. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  67. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs +1 -1
  68. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs.map +1 -1
  69. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +3 -0
  70. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  71. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +3 -0
  72. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  73. package/mcp/catalog.json +1 -1
  74. package/package.json +2 -2
  75. package/types/testgorilla-tgo-ui-components-alert-banner.d.ts +1 -0
  76. package/types/testgorilla-tgo-ui-components-autocomplete-v2.d.ts +1 -1
  77. package/types/testgorilla-tgo-ui-components-button.d.ts +32 -0
  78. package/types/testgorilla-tgo-ui-components-core.d.ts +1 -0
  79. package/types/testgorilla-tgo-ui-components-field.d.ts +1 -0
  80. package/types/testgorilla-tgo-ui-components-infinite-scroll-table.d.ts +3 -3
  81. package/types/testgorilla-tgo-ui-components-popover.d.ts +51 -5
  82. package/types/testgorilla-tgo-ui-components-radio-button.d.ts +1 -0
  83. package/types/testgorilla-tgo-ui-components-scale.d.ts +1 -0
  84. package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +59 -1
  85. package/types/testgorilla-tgo-ui-components-slider.d.ts +2 -0
@@ -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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"}
@@ -1,7 +1,7 @@
1
1
  import { animate, style, transition, trigger } from "@angular/animations";
2
2
  import { AsyncPipe, CommonModule, NgClass, UpperCasePipe } from "@angular/common";
3
3
  import * as i0 from "@angular/core";
4
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Inject, Input, NgModule, Optional, Output } from "@angular/core";
4
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Inject, Input, NgModule, Optional, Output, inject } from "@angular/core";
5
5
  import { ButtonComponent, ButtonComponentModule } from "@testgorilla/tgo-ui/components/button";
6
6
  import { UiTranslatePipe, alertBarsUtil } from "@testgorilla/tgo-ui/components/core";
7
7
  import * as i1 from "@testgorilla/tgo-ui/components/icon";
@@ -10,6 +10,7 @@ import { SpinnerComponent, SpinnerComponentModule } from "@testgorilla/tgo-ui/co
10
10
  var AlertBannerComponent = class AlertBannerComponent {
11
11
  constructor(defaultAppTheme) {
12
12
  this.defaultAppTheme = defaultAppTheme;
13
+ this.cdr = inject(ChangeDetectorRef);
13
14
  this.alertType = "success";
14
15
  this.alertVariant = "banner";
15
16
  this.message = "";
@@ -59,6 +60,7 @@ var AlertBannerComponent = class AlertBannerComponent {
59
60
  this.dismiss.emit();
60
61
  setTimeout(() => {
61
62
  this.dismissAlertBanner = true;
63
+ this.cdr.markForCheck();
62
64
  }, 200);
63
65
  }
64
66
  static {
@@ -178,12 +180,15 @@ var AlertBannerComponent = class AlertBannerComponent {
178
180
  "ariaExpanded",
179
181
  "ariaControls",
180
182
  "ariaPressed",
183
+ "ariaHasPopup",
181
184
  "ariaRequired",
182
185
  "ariaLabelledby",
183
186
  "ariaDescribedby",
184
187
  "preventDefault",
185
188
  "hasBackground",
186
189
  "circular",
190
+ "isSingleLineLabel",
191
+ "iconButtonShape",
187
192
  "tooltipPosition",
188
193
  "role",
189
194
  "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 ChangeDetectorRef,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\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 private readonly cdr = inject(ChangeDetectorRef);\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 /**\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 // The `display-none` host binding is refreshed by the parent's view, which is OnPush by\n // default since Angular 22 and would otherwise never be checked again.\n this.cdr.markForCheck();\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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"}
@@ -119,7 +119,7 @@ var AudioWaveformComponent = class AudioWaveformComponent {
119
119
  this.smoothing = input(DEFAULT_AUDIO_WAVEFORM_CONFIG.smoothing, ...ngDevMode ? [{ debugName: "smoothing" }] : /* istanbul ignore next */ []);
120
120
  this.bars = input(null, ...ngDevMode ? [{ debugName: "bars" }] : /* istanbul ignore next */ []);
121
121
  this.active = input(null, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
122
- this.controlled = computed(() => this.active() !== null, ...ngDevMode ? [{ debugName: "controlled" }] : /* istanbul ignore next */ []);
122
+ this.controlled = computed(() => (this.active() ?? null) !== null, ...ngDevMode ? [{ debugName: "controlled" }] : /* istanbul ignore next */ []);
123
123
  this.effectiveBars = computed(() => {
124
124
  if (this.controlled()) return this.bars() ?? [];
125
125
  return this.waveformService.bars();
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-audio-waveform.mjs","names":[],"sources":["../../../components/audio-waveform/audio-waveform.model.ts","../../../components/audio-waveform/audio-waveform.service.ts","../../../components/audio-waveform/audio-waveform.component.ts","../../../components/audio-waveform/audio-waveform.component.html","../../../components/audio-waveform/audio-waveform.module.ts"],"sourcesContent":["export interface AudioWaveformConfig {\n barCount: number;\n smoothing: number;\n fftSize: number;\n}\n\nexport const DEFAULT_AUDIO_WAVEFORM_CONFIG: AudioWaveformConfig = {\n barCount: 5,\n smoothing: 0.55,\n fftSize: 256,\n};\n\n/** Per-bar colors for the 5-bar waveform (left to right) */\nexport const AUDIO_WAVEFORM_BAR_COLORS: string[] = ['#C065D0', '#A86FDA', '#9078E3', '#7882EC', '#6889F3'];\n","import { Injectable, OnDestroy, signal } from '@angular/core';\n\nimport { DEFAULT_AUDIO_WAVEFORM_CONFIG } from './audio-waveform.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AudioWaveformService implements OnDestroy {\n private ctx: AudioContext | null = null;\n private analyser: AnalyserNode | null = null;\n private source: MediaStreamAudioSourceNode | null = null;\n private stream: MediaStream | null = null;\n private raf: number | null = null;\n\n readonly bars = signal<number[]>([]);\n readonly active = signal<boolean>(false);\n\n async start(\n barCount = DEFAULT_AUDIO_WAVEFORM_CONFIG.barCount,\n smoothing = DEFAULT_AUDIO_WAVEFORM_CONFIG.smoothing\n ): Promise<void> {\n if (this.active()) {\n return;\n }\n\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.ctx = new AudioContext();\n this.analyser = this.ctx.createAnalyser();\n this.analyser.fftSize = DEFAULT_AUDIO_WAVEFORM_CONFIG.fftSize;\n this.analyser.smoothingTimeConstant = smoothing;\n this.source = this.ctx.createMediaStreamSource(this.stream);\n this.source.connect(this.analyser);\n this.active.set(true);\n\n const data = new Uint8Array(this.analyser.frequencyBinCount);\n // Focus on the lower ~60% of bins where speech energy concentrates\n const speechBinCount = Math.max(1, Math.floor(data.length * 0.6));\n\n const analyserRef = this.analyser;\n const tick = (): void => {\n analyserRef.getByteFrequencyData(data);\n\n // RMS (root mean square) of speech-range bins — represents perceived loudness,\n // unlike peak which saturates on any single spike\n let sumSq = 0;\n for (let i = 0; i < speechBinCount; i++) {\n const v = data[i] / 255;\n sumSq += v * v;\n }\n const rms = Math.sqrt(sumSq / speechBinCount);\n\n // Power curve keeps quiet→loud variation visible. Gain multiplier ensures\n // loud speech reaches full bar height. Clamped to [0, 1].\n const amplitude = Math.min(1, Math.pow(rms, 0.55) * 1.5);\n\n const values = this.createSymmetricBars(barCount, amplitude);\n this.bars.set(values);\n this.raf = requestAnimationFrame(tick);\n };\n tick();\n } catch (e) {\n console.error('[AudioWaveform] Mic access denied:', e);\n }\n }\n\n stop(): void {\n if (this.raf !== null) {\n cancelAnimationFrame(this.raf);\n }\n this.source?.disconnect();\n this.analyser?.disconnect();\n this.stream?.getTracks().forEach(t => t.stop());\n if (this.ctx && this.ctx.state !== 'closed') {\n void this.ctx.close();\n }\n this.ctx = null;\n this.analyser = null;\n this.source = null;\n this.stream = null;\n this.raf = null;\n this.active.set(false);\n this.bars.set([]);\n }\n\n ngOnDestroy(): void {\n this.stop();\n }\n\n /**\n * Creates a symmetric bar distribution where middle bars are highest.\n * Uses a bell-curve-like pattern centered at the middle bar.\n */\n private createSymmetricBars(barCount: number, amplitude: number): number[] {\n const center = (barCount - 1) / 2;\n const maxDistance = center;\n\n return Array.from({ length: barCount }, (_, i) => {\n const distance = Math.abs(i - center);\n // Weight decreases as distance from center increases\n // Using a quadratic falloff for smoother appearance\n const weight = 1 - (distance / maxDistance) * 0.65;\n return amplitude * weight;\n });\n }\n}\n","import { Component, ChangeDetectionStrategy, OnDestroy, computed, effect, inject, input } from '@angular/core';\n\nimport { DEFAULT_AUDIO_WAVEFORM_CONFIG, AUDIO_WAVEFORM_BAR_COLORS } from './audio-waveform.model';\nimport { AudioWaveformService } from './audio-waveform.service';\n\n@Component({\n selector: 'ui-audio-waveform',\n templateUrl: './audio-waveform.component.html',\n styleUrls: ['./audio-waveform.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n})\nexport class AudioWaveformComponent implements OnDestroy {\n private readonly waveformService = inject(AudioWaveformService);\n\n readonly barCount = DEFAULT_AUDIO_WAVEFORM_CONFIG.barCount;\n readonly width = input<number>(40);\n readonly height = input<number>(22);\n readonly gap = input<number>(3);\n readonly minScale = input<number>(0.08);\n readonly smoothing = input<number>(DEFAULT_AUDIO_WAVEFORM_CONFIG.smoothing);\n\n /**\n * When provided, the component operates in controlled mode —\n * it renders externally-supplied bar values instead of managing the mic itself.\n */\n readonly bars = input<number[] | null>(null);\n\n /** Mirror of `bars` for controlled mode; required when `bars` is set. */\n readonly active = input<boolean | null>(null);\n\n readonly controlled = computed(() => this.active() !== null);\n\n readonly effectiveBars = computed(() => {\n if (this.controlled()) {\n return this.bars() ?? [];\n }\n return this.waveformService.bars();\n });\n\n readonly effectiveActive = computed(() => {\n if (this.controlled()) {\n return this.active() ?? false;\n }\n return this.waveformService.active();\n });\n\n readonly barWidth = computed(() => {\n const count = this.barCount;\n return (this.width() - this.gap() * (count - 1)) / count;\n });\n\n constructor() {\n effect(() => {\n if (!this.controlled()) {\n void this.waveformService.start(this.barCount, this.smoothing());\n }\n });\n }\n\n barHeight(value: number): number {\n const h = this.height();\n const min = this.minScale();\n return h * (min + value * (1 - min));\n }\n\n barRadius(): number {\n return this.barWidth() / 2;\n }\n\n barValue(index: number): number {\n const bars = this.effectiveBars();\n return bars[index] ?? 0;\n }\n\n barColor(index: number): string {\n return AUDIO_WAVEFORM_BAR_COLORS[index] ?? AUDIO_WAVEFORM_BAR_COLORS[0];\n }\n\n /** Returns the x-offset for a bar so the shared CSS gradient aligns correctly. */\n barOffset(index: number): number {\n return (this.barWidth() + this.gap()) * index;\n }\n\n ngOnDestroy(): void {\n if (!this.controlled()) {\n this.waveformService.stop();\n }\n }\n}\n","<div\n class=\"waveform\"\n [style.width.px]=\"width()\"\n [style.height.px]=\"height()\"\n [style.gap.px]=\"gap()\"\n role=\"img\"\n [attr.aria-label]=\"effectiveActive() ? 'Audio waveform active' : 'Audio waveform inactive'\"\n>\n @for (item of effectiveBars(); track $index) {\n <div\n class=\"waveform-bar\"\n [style.width.px]=\"barWidth()\"\n [style.height.px]=\"barHeight(barValue($index))\"\n [style.border-radius.px]=\"barRadius()\"\n [style.background-color]=\"barColor($index)\"\n ></div>\n }\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { AudioWaveformComponent } from './audio-waveform.component';\n\n@NgModule({\n imports: [AudioWaveformComponent],\n exports: [AudioWaveformComponent],\n})\nexport class AudioWaveformModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-audio-waveform.mjs","names":[],"sources":["../../../components/audio-waveform/audio-waveform.model.ts","../../../components/audio-waveform/audio-waveform.service.ts","../../../components/audio-waveform/audio-waveform.component.ts","../../../components/audio-waveform/audio-waveform.component.html","../../../components/audio-waveform/audio-waveform.module.ts"],"sourcesContent":["export interface AudioWaveformConfig {\n barCount: number;\n smoothing: number;\n fftSize: number;\n}\n\nexport const DEFAULT_AUDIO_WAVEFORM_CONFIG: AudioWaveformConfig = {\n barCount: 5,\n smoothing: 0.55,\n fftSize: 256,\n};\n\n/** Per-bar colors for the 5-bar waveform (left to right) */\nexport const AUDIO_WAVEFORM_BAR_COLORS: string[] = ['#C065D0', '#A86FDA', '#9078E3', '#7882EC', '#6889F3'];\n","import { Injectable, OnDestroy, signal } from '@angular/core';\n\nimport { DEFAULT_AUDIO_WAVEFORM_CONFIG } from './audio-waveform.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AudioWaveformService implements OnDestroy {\n private ctx: AudioContext | null = null;\n private analyser: AnalyserNode | null = null;\n private source: MediaStreamAudioSourceNode | null = null;\n private stream: MediaStream | null = null;\n private raf: number | null = null;\n\n readonly bars = signal<number[]>([]);\n readonly active = signal<boolean>(false);\n\n async start(\n barCount = DEFAULT_AUDIO_WAVEFORM_CONFIG.barCount,\n smoothing = DEFAULT_AUDIO_WAVEFORM_CONFIG.smoothing\n ): Promise<void> {\n if (this.active()) {\n return;\n }\n\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.ctx = new AudioContext();\n this.analyser = this.ctx.createAnalyser();\n this.analyser.fftSize = DEFAULT_AUDIO_WAVEFORM_CONFIG.fftSize;\n this.analyser.smoothingTimeConstant = smoothing;\n this.source = this.ctx.createMediaStreamSource(this.stream);\n this.source.connect(this.analyser);\n this.active.set(true);\n\n const data = new Uint8Array(this.analyser.frequencyBinCount);\n // Focus on the lower ~60% of bins where speech energy concentrates\n const speechBinCount = Math.max(1, Math.floor(data.length * 0.6));\n\n const analyserRef = this.analyser;\n const tick = (): void => {\n analyserRef.getByteFrequencyData(data);\n\n // RMS (root mean square) of speech-range bins — represents perceived loudness,\n // unlike peak which saturates on any single spike\n let sumSq = 0;\n for (let i = 0; i < speechBinCount; i++) {\n const v = data[i] / 255;\n sumSq += v * v;\n }\n const rms = Math.sqrt(sumSq / speechBinCount);\n\n // Power curve keeps quiet→loud variation visible. Gain multiplier ensures\n // loud speech reaches full bar height. Clamped to [0, 1].\n const amplitude = Math.min(1, Math.pow(rms, 0.55) * 1.5);\n\n const values = this.createSymmetricBars(barCount, amplitude);\n this.bars.set(values);\n this.raf = requestAnimationFrame(tick);\n };\n tick();\n } catch (e) {\n console.error('[AudioWaveform] Mic access denied:', e);\n }\n }\n\n stop(): void {\n if (this.raf !== null) {\n cancelAnimationFrame(this.raf);\n }\n this.source?.disconnect();\n this.analyser?.disconnect();\n this.stream?.getTracks().forEach(t => t.stop());\n if (this.ctx && this.ctx.state !== 'closed') {\n void this.ctx.close();\n }\n this.ctx = null;\n this.analyser = null;\n this.source = null;\n this.stream = null;\n this.raf = null;\n this.active.set(false);\n this.bars.set([]);\n }\n\n ngOnDestroy(): void {\n this.stop();\n }\n\n /**\n * Creates a symmetric bar distribution where middle bars are highest.\n * Uses a bell-curve-like pattern centered at the middle bar.\n */\n private createSymmetricBars(barCount: number, amplitude: number): number[] {\n const center = (barCount - 1) / 2;\n const maxDistance = center;\n\n return Array.from({ length: barCount }, (_, i) => {\n const distance = Math.abs(i - center);\n // Weight decreases as distance from center increases\n // Using a quadratic falloff for smoother appearance\n const weight = 1 - (distance / maxDistance) * 0.65;\n return amplitude * weight;\n });\n }\n}\n","import { Component, ChangeDetectionStrategy, OnDestroy, computed, effect, inject, input } from '@angular/core';\n\nimport { DEFAULT_AUDIO_WAVEFORM_CONFIG, AUDIO_WAVEFORM_BAR_COLORS } from './audio-waveform.model';\nimport { AudioWaveformService } from './audio-waveform.service';\n\n@Component({\n selector: 'ui-audio-waveform',\n templateUrl: './audio-waveform.component.html',\n styleUrls: ['./audio-waveform.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n})\nexport class AudioWaveformComponent implements OnDestroy {\n private readonly waveformService = inject(AudioWaveformService);\n\n readonly barCount = DEFAULT_AUDIO_WAVEFORM_CONFIG.barCount;\n readonly width = input<number>(40);\n readonly height = input<number>(22);\n readonly gap = input<number>(3);\n readonly minScale = input<number>(0.08);\n readonly smoothing = input<number>(DEFAULT_AUDIO_WAVEFORM_CONFIG.smoothing);\n\n /**\n * When provided, the component operates in controlled mode —\n * it renders externally-supplied bar values instead of managing the mic itself.\n */\n readonly bars = input<number[] | null>(null);\n\n /** Mirror of `bars` for controlled mode; required when `bars` is set. */\n readonly active = input<boolean | null>(null);\n\n readonly controlled = computed(() => (this.active() ?? null) !== null);\n\n readonly effectiveBars = computed(() => {\n if (this.controlled()) {\n return this.bars() ?? [];\n }\n return this.waveformService.bars();\n });\n\n readonly effectiveActive = computed(() => {\n if (this.controlled()) {\n return this.active() ?? false;\n }\n return this.waveformService.active();\n });\n\n readonly barWidth = computed(() => {\n const count = this.barCount;\n return (this.width() - this.gap() * (count - 1)) / count;\n });\n\n constructor() {\n effect(() => {\n if (!this.controlled()) {\n void this.waveformService.start(this.barCount, this.smoothing());\n }\n });\n }\n\n barHeight(value: number): number {\n const h = this.height();\n const min = this.minScale();\n return h * (min + value * (1 - min));\n }\n\n barRadius(): number {\n return this.barWidth() / 2;\n }\n\n barValue(index: number): number {\n const bars = this.effectiveBars();\n return bars[index] ?? 0;\n }\n\n barColor(index: number): string {\n return AUDIO_WAVEFORM_BAR_COLORS[index] ?? AUDIO_WAVEFORM_BAR_COLORS[0];\n }\n\n /** Returns the x-offset for a bar so the shared CSS gradient aligns correctly. */\n barOffset(index: number): number {\n return (this.barWidth() + this.gap()) * index;\n }\n\n ngOnDestroy(): void {\n if (!this.controlled()) {\n this.waveformService.stop();\n }\n }\n}\n","<div\n class=\"waveform\"\n [style.width.px]=\"width()\"\n [style.height.px]=\"height()\"\n [style.gap.px]=\"gap()\"\n role=\"img\"\n [attr.aria-label]=\"effectiveActive() ? 'Audio waveform active' : 'Audio waveform inactive'\"\n>\n @for (item of effectiveBars(); track $index) {\n <div\n class=\"waveform-bar\"\n [style.width.px]=\"barWidth()\"\n [style.height.px]=\"barHeight(barValue($index))\"\n [style.border-radius.px]=\"barRadius()\"\n [style.background-color]=\"barColor($index)\"\n ></div>\n }\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { AudioWaveformComponent } from './audio-waveform.component';\n\n@NgModule({\n imports: [AudioWaveformComponent],\n exports: [AudioWaveformComponent],\n})\nexport class AudioWaveformModule {}\n"],"mappings":"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"}
@@ -300,7 +300,8 @@ var AutocompleteFilterService = class AutocompleteFilterService {
300
300
  this.userInput$.complete();
301
301
  this.dynamicSource$.complete();
302
302
  }
303
- setDynamicResults(list, loading) {
303
+ setDynamicResults(results, loading) {
304
+ const list = results ?? null;
304
305
  if ((list !== null || loading) && !this.isDynamicMode) {
305
306
  this.isDynamicMode = true;
306
307
  this.filteredItems$ = this.dynamicSource$;
@@ -655,7 +656,7 @@ var AutocompleteV2Component = class AutocompleteV2Component {
655
656
  effect(() => {
656
657
  const v = this.itemValue();
657
658
  if (this.ngControl) {
658
- if (isDevMode() && v !== null) console.warn("[ui-autocomplete-v2] [itemValue] is set alongside a form control. Use ngModel or formControl instead.");
659
+ if (isDevMode() && v !== null && v !== void 0) console.warn("[ui-autocomplete-v2] [itemValue] is set alongside a form control. Use ngModel or formControl instead.");
659
660
  return;
660
661
  }
661
662
  this.valueManager.value.set(AutocompleteV2Utils.isArray(v) ? v : v ? [v] : []);
@@ -770,8 +771,9 @@ var AutocompleteV2Component = class AutocompleteV2Component {
770
771
  }
771
772
  onInputChange(event) {
772
773
  const text = event.target.value;
773
- this.filterService.search(text, this.minCharactersSearch());
774
- if (text.length >= this.minCharactersSearch()) this.searchTextChange.emit(text);
774
+ const minCharacters = this.minCharactersSearch() ?? 0;
775
+ this.filterService.search(text, minCharacters);
776
+ if (text.length >= minCharacters) this.searchTextChange.emit(text);
775
777
  }
776
778
  onClear() {
777
779
  this.inputValue.set("");