@testgorilla/tgo-ui 12.1.0 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-badge.mjs +2 -2
- package/fesm2022/testgorilla-tgo-ui-components-badge.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-prompt.mjs","names":["keyboardEvent"],"sources":["../../../components/prompt/prompt.component.ts","../../../components/prompt/prompt.component.html","../../../components/prompt/prompt.module.ts"],"sourcesContent":["import { ConnectedPosition, CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n Input,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { debounceTime, firstValueFrom, fromEvent, map, tap } from 'rxjs';\n\nimport { BadgeComponent } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponent } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponent, IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuButtonsType, OverflowMenuComponent } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { PopoverDirective } from '@testgorilla/tgo-ui/components/popover';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponent } from '@testgorilla/tgo-ui/components/tag';\n\nimport {\n PromptActionsMenuEntry,\n PromptActionTag,\n PromptData,\n PromptDropdownItem,\n PromptSecondaryActionTag,\n PromptTag,\n} from './prompt.model';\n\n/** Throttles outward `ControlValueAccessor` emissions only; the signal write is synchronous. */\nconst INPUT_EMIT_DEBOUNCE_MS = 200;\n\n/** Window after `compositionend` in which an Enter still counts as committing an IME candidate. */\nconst IME_COMMIT_GRACE_MS = 50;\n\nconst CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS = 1000;\n\nconst CHARACTER_COUNT_ANNOUNCE_THRESHOLD = 0.1;\n\nlet nextActionsMenuId = 0;\n\n/** `undefined` falls back to the default icon; `null` means no icon. */\nconst resolveIcon = (icon: IconName | null | undefined, fallback: IconName): IconName =>\n icon === null ? '' : (icon ?? fallback);\n\n@Component({\n selector: 'ui-prompt',\n templateUrl: './prompt.component.html',\n styleUrl: './prompt.component.scss',\n providers: [\n UiTranslatePipe,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PromptComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CdkOverlayOrigin,\n NgClass,\n SkeletonComponent,\n IconComponent,\n FieldComponent,\n TagComponent,\n ButtonComponent,\n BadgeComponent,\n OverflowMenuComponent,\n MatTooltip,\n CdkConnectedOverlay,\n PopoverDirective,\n AsyncPipe,\n UiTranslatePipe,\n ],\n})\nexport class PromptComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n private readonly disabledState = signal(false);\n\n tags = input<PromptTag[]>([]);\n actionTag = input<PromptActionTag | null>(null);\n\n /** Tag rendered next to the action tag or file upload button, e.g. \"Find similar profile\". */\n secondaryActionTag = input<PromptSecondaryActionTag | null>(null);\n\n /**\n * Collapses `actionTag` and `secondaryActionTag` behind a Plus button that opens a menu listing\n * them; the button turns into a Close button while the menu is open.\n */\n collapseActionTags = input(false, { transform: booleanAttribute });\n\n maxCharacters = input<number>(255);\n supportedFileTypes = input<string>('');\n autoClear = input<boolean>(true);\n showSendButton = input<boolean>(false);\n sendButtonDisabled = input(false, { transform: booleanAttribute });\n enableFileUpload = input<boolean>(false);\n loading = input(false, { transform: booleanAttribute });\n\n /**\n * Placeholder for the prompt.\n */\n placeholder = input<string>('');\n\n /**\n * Custom error message displayed below the prompt.\n */\n errorMessage = input<string>('');\n\n /** Items for the built-in dropdown; opens on focus, filters by label as the user types. */\n dropdownItems = input<PromptDropdownItem[]>([]);\n dropdownHeading = input<string>('');\n showDropdownClose = input(false, { transform: booleanAttribute });\n\n /**\n * Whether to display a live `used / max` character count in the footer.\n */\n showCharacterCount = input(false, { transform: booleanAttribute });\n\n /**\n * Lighter hint rendered right after the typed text to flag what is still missing, e.g. \"Add location\".\n * Display-only: it is never inserted into the value, and Tab does not accept it.\n */\n helpText = input<string>('');\n\n /**\n * Whether the prompt is disabled.\n * @type {boolean}\n * @memberof PromptComponent\n */\n @Input({ transform: booleanAttribute })\n get disabled(): boolean {\n return this.disabledState();\n }\n set disabled(value: boolean) {\n this.setDisabledState(value);\n }\n\n promptData = output<PromptData>();\n actionTagFileSelected = output<File>();\n secondaryActionTagPress = output<void>();\n dropdownItemSelected = output<PromptDropdownItem>();\n dropdownClosed = output<void>();\n\n promptFilesList = signal<File[]>([]);\n promptTextValue = signal<string>('');\n fileListMenuConfig = signal<OverflowMenuButtonsType[]>([]);\n\n tagsVisible = signal<PromptTag[]>([]);\n tagsInDropdown = signal<PromptTag[]>([]);\n autocompleteSuggestion = signal<string>('');\n\n isDropdownOpened = signal<boolean>(false);\n readonly actionsMenuId = `ui-prompt-actions-menu-${nextActionsMenuId++}`;\n private readonly keepDropdownClosed = signal(false);\n isFieldHovered = signal(false);\n isFieldFocused = signal(false);\n\n /** True while an IME candidate window is open (CJK input). */\n private readonly composing = signal(false);\n private compositionEndedAt = 0;\n\n filteredDropdownItems = computed(() => {\n const query = this.promptTextValue().trim().toLowerCase();\n return this.dropdownItems().filter(item => {\n const label = item.label.toLowerCase();\n return label !== query && (!query || label.includes(query));\n });\n });\n\n // Derived from focus so blur closes the overlay for free.\n itemsDropdownVisible = computed(\n () =>\n this.isFieldFocused() && !this.keepDropdownClosed() && this.filteredDropdownItems().length > 0 && !this.isLocked()\n );\n\n /** True while focus sits anywhere inside the prompt. */\n isContainerFocused = signal(false);\n\n isHighlighted = computed(() => this.isFieldHovered() || this.isContainerFocused());\n\n readonly showFocusRing = computed(() => this.isHighlighted() && !this.loading());\n fileInputAccept = computed(() => this.actionTag()?.acceptedFileTypes ?? this.supportedFileTypes());\n\n isLocked = computed(() => this.disabledState() || this.loading());\n\n /** Hidden on an empty prompt (the placeholder owns that state) and behind a tag's autocomplete suggestion. */\n readonly visibleHelpText = computed(() =>\n this.promptTextValue() && !this.autocompleteSuggestion() && !this.isLocked() ? this.helpText().trim() : ''\n );\n\n readonly actionTagIcon = computed(() => resolveIcon(this.actionTag()?.icon, 'Plus'));\n readonly actionTagMenuTrailingIcon = computed(() => resolveIcon(this.actionTag()?.menuTrailingIcon, 'Plus'));\n readonly secondaryActionTagMenuTrailingIcon = computed(() =>\n resolveIcon(this.secondaryActionTag()?.menuTrailingIcon, 'Arrow-chevron-right-in-line')\n );\n\n /** Menu items sorted by `menuOrder`; a stable sort keeps the default order for ties and omissions. */\n readonly actionsMenuEntries = computed<PromptActionsMenuEntry[]>(() => {\n const secondary = this.secondaryActionTag();\n const action = this.actionTag();\n const entries: PromptActionsMenuEntry[] = [];\n if (secondary) {\n entries.push({ kind: 'secondary', tag: secondary, trailingIcon: this.secondaryActionTagMenuTrailingIcon() });\n }\n if (action) {\n entries.push({ kind: 'action', tag: action, trailingIcon: this.actionTagMenuTrailingIcon() });\n }\n return entries.sort((a, b) => (a.tag.menuOrder ?? Infinity) - (b.tag.menuOrder ?? Infinity));\n });\n\n readonly isActionsMenuOpen = computed(() => this.actionsPopover()?.isOpen() ?? false);\n\n readonly showActionsMenuTrigger = computed(\n () => this.collapseActionTags() && Boolean(this.actionTag() ?? this.secondaryActionTag())\n );\n\n private readonly hasContent = computed(\n () => Boolean(this.promptTextValue().trim()) || this.promptFilesList().length > 0\n );\n\n /**\n * Shared by the Send button's disabled state and the Enter shortcut, so they cannot disagree.\n * Ignores `showSendButton` on purpose: this is whether submission is allowed, not whether a\n * button is rendered.\n */\n readonly canSubmit = computed(() => !this.isLocked() && !this.sendButtonDisabled() && this.hasContent());\n\n readonly isOverCharacterLimit = computed(() => this.promptTextValue().length > this.maxCharacters());\n\n private readonly announcedTextValue = toSignal(\n toObservable(computed(() => (this.showCharacterCount() ? this.promptTextValue() : ''))).pipe(\n debounceTime(CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS)\n ),\n { initialValue: '' }\n );\n\n readonly characterCountAnnouncement = computed<{ key: string; params: { count: number } } | null>(() => {\n if (!this.showCharacterCount()) {\n return null;\n }\n\n const max = this.maxCharacters();\n const remaining = max - this.announcedTextValue().length;\n\n if (remaining < 0) {\n return { key: 'PROMPT.CHARACTERS_OVER_LIMIT', params: { count: -remaining } };\n }\n if (remaining <= max * CHARACTER_COUNT_ANNOUNCE_THRESHOLD) {\n return { key: 'PROMPT.CHARACTERS_REMAINING', params: { count: remaining } };\n }\n\n return null;\n });\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly translationPipe = inject(UiTranslatePipe);\n\n private readonly resetOnLock = effect(() => {\n if (this.isLocked()) {\n this.isDropdownOpened.set(false);\n this.actionsPopover()?.close();\n this.isFieldFocused.set(false);\n this.isFieldHovered.set(false);\n this.isContainerFocused.set(false);\n this.autocompleteSuggestion.set('');\n this.composing.set(false);\n }\n });\n\n fileDrop = viewChild<ElementRef<HTMLInputElement>>('fileDropRef');\n tagDropdown = viewChild<ElementRef<HTMLInputElement>>('tagDropdown');\n fieldComponentRef = viewChild.required<FieldComponent>('textarea');\n private readonly promptContainer = viewChild.required<ElementRef<HTMLElement>>('promptContainerRef');\n private readonly actionsPopover = viewChild(PopoverDirective);\n private readonly actionsMenu = viewChild<ElementRef<HTMLElement>>('actionsMenu');\n\n readonly dropdownPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ];\n\n ngOnInit() {\n this.initTags();\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.syncInputChange();\n }, 0);\n }\n\n private async uploadFile(event: Event): Promise<void> {\n const files = (event.currentTarget as HTMLInputElement).files;\n if (files?.length) {\n this.promptFilesList.update(list => {\n list.push(files.item(0) as File);\n return list;\n });\n this.emitValue();\n await this.updateFileMenu();\n }\n }\n\n sendPromptData(): void {\n if (!this.canSubmit()) {\n return;\n }\n this.promptData.emit({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n\n if (this.autoClear()) {\n this.clearPromptData();\n }\n }\n\n selectedMenuOption(menuOptionValue: string): void {\n const updatedConfig = this.fileListMenuConfig().filter(menu => menu.value !== menuOptionValue);\n const updatedFileList = this.promptFilesList().filter(file => file.name !== menuOptionValue);\n this.promptFilesList.set(updatedFileList);\n this.fileListMenuConfig.set(updatedConfig);\n }\n\n selectTag(tag: PromptTag, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.isDropdownOpened.set(false);\n this.promptTextValue.set(tag.label);\n this.autocompleteSuggestion.set(`${tag.label} ${tag.autocomplete}`);\n this.fieldComponentRef().field.nativeElement.focus();\n this.onTouch();\n }\n\n onTextareaTab(event: Event): void {\n if (this.isLocked()) {\n return;\n }\n if (this.autocompleteSuggestion()) {\n event.preventDefault();\n this.promptTextValue.set(this.autocompleteSuggestion());\n this.autocompleteSuggestion.set('');\n }\n }\n\n onTextareaEnter(event: Event): void {\n const keyboardEvent = event as KeyboardEvent;\n // Three checks because browsers disagree on when `compositionend` fires relative to the\n // Enter that commits an IME candidate: Chrome/Firefox after, Safari before, Android during.\n if (keyboardEvent.isComposing || this.composing() || Date.now() - this.compositionEndedAt < IME_COMMIT_GRACE_MS) {\n return;\n }\n // Unconditional, so a blocked Enter is swallowed rather than inserting a newline.\n event.preventDefault();\n this.sendPromptData();\n }\n\n dropdownOutsideClick(): void {\n this.isDropdownOpened.set(false);\n }\n\n onFieldBlur(): void {\n this.isFieldFocused.set(false);\n }\n\n onContainerFocusIn(): void {\n this.isContainerFocused.set(true);\n }\n\n onContainerFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (next instanceof Node && this.promptContainer().nativeElement.contains(next)) {\n return;\n }\n\n this.isContainerFocused.set(false);\n }\n\n itemsDropdownOutsideClick(event: MouseEvent): void {\n if (this.promptContainer().nativeElement.contains(event.target as Node)) {\n return;\n }\n this.isFieldFocused.set(false);\n this.dropdownClosed.emit();\n }\n\n closeItemsDropdown(): void {\n this.keepDropdownClosed.set(true);\n this.dropdownClosed.emit();\n }\n\n onTextareaEscape(event: Event): void {\n if (this.itemsDropdownVisible()) {\n // Consume it only when it dismissed the dropdown, so an Escape with nothing open still\n // reaches an enclosing ui-dialog / ui-side-sheet.\n event.stopPropagation();\n this.closeItemsDropdown();\n }\n }\n\n selectDropdownItem(item: PromptDropdownItem, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.keepDropdownClosed.set(true);\n this.promptTextValue.set(item.label);\n this.autocompleteSuggestion.set('');\n this.fieldComponentRef().field.nativeElement.focus();\n this.dropdownItemSelected.emit(item);\n this.emitValue();\n }\n\n toggleDropdown(): void {\n if (this.isLocked()) {\n return;\n }\n this.isDropdownOpened.set(!this.isDropdownOpened());\n }\n\n focusTagDropdown(): void {\n setTimeout(() => {\n this.tagDropdown()?.nativeElement.focus();\n }, 300);\n }\n\n private syncInputChange() {\n if (!this.fieldComponentRef()?.field?.nativeElement) {\n return;\n }\n\n const textarea = this.fieldComponentRef().field.nativeElement;\n\n fromEvent(textarea, 'input')\n .pipe(\n map((event: Event) => (event.target as HTMLInputElement).value),\n // Synchronous, so Enter and the Send button never observe a stale value.\n tap(value => {\n this.promptTextValue.set(value);\n this.keepDropdownClosed.set(false);\n if (this.autocompleteSuggestion()) {\n this.autocompleteSuggestion.set('');\n }\n }),\n debounceTime(INPUT_EMIT_DEBOUNCE_MS),\n tap(() => this.emitValue()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionstart')\n .pipe(\n tap(() => this.composing.set(true)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionend')\n .pipe(\n tap(() => {\n this.composing.set(false);\n this.compositionEndedAt = Date.now();\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n private initTags(): void {\n if (!this.tags()?.length) {\n return;\n }\n if (this.tags().length <= 5) {\n this.tagsVisible.set(this.tags());\n return;\n }\n\n this.tagsVisible.set(this.tags().slice(0, 5));\n this.tagsInDropdown.set(this.tags().slice(5));\n }\n\n private async updateFileMenu(): Promise<void> {\n const menuConfig: OverflowMenuButtonsType[] = [];\n const tooltip = await firstValueFrom(this.translationPipe.transform('COMMON.DELETE'));\n this.promptFilesList().forEach(file => {\n menuConfig.push({\n label: file.name,\n value: file.name,\n icon: 'Delete',\n tooltipText: tooltip,\n });\n });\n this.fileListMenuConfig.set(menuConfig);\n }\n\n private clearPromptData(): void {\n this.promptTextValue.set('');\n this.promptFilesList.set([]);\n this.fileListMenuConfig.set([]);\n }\n\n writeValue(value: PromptData): void {\n this.promptTextValue.set(value?.text ?? '');\n this.promptFilesList.set(value?.files ?? []);\n }\n private onChange = (_value: PromptData): void => {};\n private onTouch = () => {};\n\n registerOnChange(fn: (value: PromptData) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n async onFileSelected(event: Event): Promise<void> {\n if (this.isLocked()) {\n return;\n }\n if (this.actionTag()) {\n this.handleActionTagFile(event);\n } else {\n await this.uploadFile(event);\n }\n }\n\n onActionTagPress(): void {\n if (this.isLocked() || this.actionTag()?.disabled) {\n return;\n }\n this.fileDrop()?.nativeElement.click();\n }\n\n onSecondaryActionTagPress(): void {\n if (this.isLocked() || this.secondaryActionTag()?.disabled) {\n return;\n }\n this.secondaryActionTagPress.emit();\n }\n\n /** The popover's focus trap hands focus back to the Plus button when the menu closes. */\n closeActionsMenu(): void {\n this.actionsPopover()?.close();\n }\n\n onActionsMenuKeydown(event: KeyboardEvent): void {\n const items = this.actionsMenuItems();\n const current = items.indexOf(document.activeElement as HTMLElement);\n const focusAt = (index: number) => {\n event.preventDefault();\n items[(index + items.length) % items.length]?.focus();\n };\n\n switch (event.key) {\n case 'ArrowDown':\n focusAt(current + 1);\n break;\n case 'ArrowUp':\n focusAt(current - 1);\n break;\n case 'Home':\n focusAt(0);\n break;\n case 'End':\n focusAt(items.length - 1);\n break;\n case 'Escape':\n // Consumed so an enclosing ui-dialog / ui-side-sheet does not close as well.\n event.preventDefault();\n event.stopPropagation();\n this.closeActionsMenu();\n break;\n }\n }\n\n selectActionsMenuEntry(entry: PromptActionsMenuEntry, event: Event): void {\n if (entry.kind === 'action') {\n this.selectActionTagFromMenu(event);\n } else {\n this.selectSecondaryActionTagFromMenu(event);\n }\n }\n\n private selectActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.actionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onActionTagPress();\n }\n\n private selectSecondaryActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.secondaryActionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onSecondaryActionTagPress();\n }\n\n private actionsMenuItems(): HTMLElement[] {\n const menu = this.actionsMenu()?.nativeElement;\n return menu ? Array.from(menu.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')) : [];\n }\n\n private handleActionTagFile(event: Event): void {\n const inputEl = event.currentTarget as HTMLInputElement;\n const file = inputEl.files?.item(0) ?? null;\n if (file) {\n this.actionTagFileSelected.emit(file);\n }\n inputEl.value = '';\n }\n\n private emitValue(): void {\n this.onChange({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n this.onTouch();\n }\n}\n","<ng-container>\n <div\n class=\"prompt-container\"\n [class.has-error]=\"!!errorMessage()\"\n [class.disabled]=\"isLocked()\"\n [attr.aria-disabled]=\"isLocked()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n cdkOverlayOrigin\n #promptOrigin=\"cdkOverlayOrigin\"\n #promptContainerRef\n [class.prompt-container-focused]=\"showFocusRing()\"\n (focusin)=\"onContainerFocusIn()\"\n (focusout)=\"onContainerFocusOut($event)\"\n >\n @if (loading()) {\n <div class=\"prompt-loading\" aria-hidden=\"true\" animate.enter=\"cnp-prompt-fade-in\">\n <ui-skeleton [theme]=\"{ width: '100%', height: '20px', margin: '0' }\"></ui-skeleton>\n <ui-skeleton [theme]=\"{ width: '30%', height: '20px', margin: '0' }\"></ui-skeleton>\n </div>\n }\n <div class=\"prompt-autocomplete\" [hidden]=\"loading()\">\n <textarea tabindex=\"-1\" class=\"ghost\" id=\"autocomplete\" [value]=\"autocompleteSuggestion()\" readonly></textarea>\n @if (visibleHelpText(); as help) {\n <!-- The mirror repeats the typed text invisibly so the hint lands right after its last character. -->\n <div class=\"ghost prompt-help-text\" aria-hidden=\"true\">\n <span class=\"prompt-help-text-mirror\">{{ promptTextValue() }}</span\n ><span class=\"prompt-help-text-hint\">{{ ' ' + help }}</span>\n </div>\n }\n\n @let showIcon = !isFieldFocused() && !promptTextValue();\n @if (showIcon) {\n <ui-icon\n class=\"prompt-icon\"\n animate.enter=\"cnp-prompt-icon-in\"\n animate.leave=\"cnp-prompt-icon-out\"\n [color]=\"'inherit'\"\n [class.hovered]=\"isFieldHovered()\"\n [name]=\"'Sparkle-in-line'\"\n ></ui-icon>\n }\n <!-- `keydown.enter` matches unmodified Enter only; Shift+Enter resolves to `shift.enter`\n and falls through to a newline. Do not add a shiftKey check. -->\n <ui-field\n #textarea\n class=\"prompt-text\"\n [class.show-icon]=\"showIcon\"\n role=\"input\"\n [showBottomContent]=\"false\"\n [borderless]=\"true\"\n [type]=\"'multi-line'\"\n [autosizableTextarea]=\"true\"\n [maxCharacters]=\"maxCharacters()\"\n [placeholder]=\"showIcon ? placeholder() || ('PROMPT.ASK_ANYTHING' | uiTranslate | async)! : ''\"\n [value]=\"promptTextValue() || ''\"\n [hasTextAreaCounter]=\"false\"\n [ariaDescribedby]=\"visibleHelpText()\"\n [disabled]=\"disabled\"\n (mouseenter)=\"isFieldHovered.set(true)\"\n (mouseleave)=\"isFieldHovered.set(false)\"\n (focusin)=\"isFieldFocused.set(true)\"\n (fieldBlur)=\"onFieldBlur()\"\n (keydown.tab)=\"onTextareaTab($event)\"\n (keydown.enter)=\"onTextareaEnter($event)\"\n (keydown.escape)=\"onTextareaEscape($event)\"\n ></ui-field>\n </div>\n <div class=\"prompt-footer flex-container\">\n <div class=\"flex-container\">\n @if (showActionsMenuTrigger()) {\n <ui-button\n [uiPopover]=\"actionsMenuTemplate\"\n [popoverTrigger]=\"'click'\"\n [popoverCardSize]=\"'small'\"\n [popoverAlign]=\"'start'\"\n [popoverOffset]=\"8\"\n [popoverAriaLabel]=\"('COMMON.ADD' | uiTranslate | async)!\"\n [uiPopoverDisabled]=\"isLocked()\"\n [variant]=\"'icon-button'\"\n [iconName]=\"isActionsMenuOpen() ? 'Close' : 'Plus'\"\n [tooltip]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [ariaExpanded]=\"isActionsMenuOpen()\"\n [ariaControls]=\"isActionsMenuOpen() ? actionsMenuId : undefined\"\n [disabled]=\"isLocked()\"\n ></ui-button>\n\n <ng-template #actionsMenuTemplate>\n <div\n class=\"actions-menu\"\n role=\"menu\"\n #actionsMenu\n [id]=\"actionsMenuId\"\n (keydown)=\"onActionsMenuKeydown($event)\"\n >\n @for (entry of actionsMenuEntries(); track entry.kind) {\n <div\n class=\"actions-menu-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.aria-label]=\"entry.tag.ariaLabel ?? entry.tag.label\"\n [attr.aria-disabled]=\"entry.tag.disabled ? 'true' : null\"\n (click)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.enter)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.space)=\"selectActionsMenuEntry(entry, $event)\"\n >\n @if (entry.tag.icon) {\n <ui-icon class=\"actions-menu-item-icon\" [name]=\"entry.tag.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"actions-menu-item-label\">{{ entry.tag.label }}</span>\n @if (entry.trailingIcon) {\n <ui-icon\n class=\"actions-menu-item-trailing\"\n [name]=\"entry.trailingIcon\"\n [color]=\"'inherit'\"\n ></ui-icon>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n\n @if (actionTag(); as at) {\n @if (!collapseActionTags()) {\n <ui-tag\n [label]=\"at.label\"\n [icon]=\"actionTagIcon()\"\n [ariaLabel]=\"at.ariaLabel ?? at.label\"\n [isDisabled]=\"isLocked() || !!at.disabled\"\n (press)=\"onActionTagPress()\"\n ></ui-tag>\n }\n } @else if (enableFileUpload()) {\n <ui-button\n [variant]=\"'icon-button'\"\n [tooltip]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [iconName]=\"'Plus'\"\n [disabled]=\"isLocked()\"\n (click)=\"fileDrop()?.nativeElement?.click()\"\n ></ui-button>\n\n @if (promptFilesList().length) {\n <div class=\"menu\" animate.enter=\"cnp-prompt-pop-in\">\n <ui-badge\n [notificationsAmount]=\"promptFilesList().length\"\n [variant]=\"'notification'\"\n class=\"menu-badge\"\n ></ui-badge>\n <ui-overflow-menu\n [matTooltip]=\"('PROMPT.FILES' | uiTranslate | async)!\"\n [matTooltipPosition]=\"'above'\"\n [buttonSize]=\"'medium'\"\n [iconTrigger]=\"'Document'\"\n [buttonVariant]=\"'ghost'\"\n [buttons]=\"fileListMenuConfig()\"\n [isDynamicMenu]=\"true\"\n [withRemovableOption]=\"true\"\n (selectItem)=\"selectedMenuOption($event)\"\n ></ui-overflow-menu>\n </div>\n }\n }\n\n @if (secondaryActionTag(); as sat) {\n @if (!collapseActionTags()) {\n <ui-tag\n class=\"prompt-secondary-action-tag\"\n [label]=\"sat.label\"\n [icon]=\"sat.icon ?? ''\"\n [ariaLabel]=\"sat.ariaLabel ?? sat.label\"\n [isDisabled]=\"isLocked() || !!sat.disabled\"\n (press)=\"onSecondaryActionTagPress()\"\n ></ui-tag>\n }\n }\n\n @if (actionTag() || enableFileUpload()) {\n <input\n data-testid=\"prompt-file-input\"\n [tabIndex]=\"-1\"\n class=\"form-control\"\n #fileDropRef\n type=\"file\"\n id=\"file-upload\"\n [accept]=\"fileInputAccept()\"\n [disabled]=\"isLocked()\"\n (change)=\"onFileSelected($event)\"\n />\n }\n </div>\n\n @if (tags()?.length && !promptTextValue()) {\n <div class=\"flex-container carousel\" animate.enter=\"cnp-prompt-row-in\">\n <div class=\"tag-container flex-container\" role=\"list\" #tagsScrollContainer>\n @for (tag of tagsVisible(); track tag) {\n <ui-tag\n [label]=\"tag.label\"\n role=\"listitem\"\n [ariaLabel]=\"tag.label\"\n [isDisabled]=\"isLocked()\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n ></ui-tag>\n }\n\n @if (tagsInDropdown().length) {\n <ui-button\n class=\"view-more\"\n variant=\"text-inline\"\n [label]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [ariaLabel]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [size]=\"'medium'\"\n [disabled]=\"isLocked()\"\n (click)=\"toggleDropdown()\"\n (keydown.enter)=\"focusTagDropdown()\"\n cdkOverlayOrigin\n #dropdownTrigger=\"cdkOverlayOrigin\"\n ></ui-button>\n }\n </div>\n\n <div class=\"flex-container\">\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Scroll left button'\"\n [iconName]=\"'Arrow-chevron-left-in-line'\"\n [disabled]=\"isLocked() || tagsScrollContainer.scrollLeft === 0\"\n (click)=\"tagsScrollContainer.scrollBy({ left: -100, behavior: 'smooth' })\"\n ></ui-button>\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Arrow-chevron-right-in-line'\"\n [ariaLabel]=\"'Scroll right button'\"\n [disabled]=\"\n isLocked() ||\n tagsScrollContainer.scrollLeft + tagsScrollContainer.clientWidth >= tagsScrollContainer.scrollWidth\n \"\n (click)=\"tagsScrollContainer.scrollBy({ left: 100, behavior: 'smooth' })\"\n ></ui-button>\n </div>\n </div>\n }\n\n @if (showCharacterCount()) {\n <span class=\"prompt-character-count\" [class.over-limit]=\"isOverCharacterLimit()\"\n >{{ promptTextValue().length }} / {{ maxCharacters() }}</span\n >\n <span class=\"prompt-character-count-status\" aria-live=\"polite\">\n @if (characterCountAnnouncement(); as announcement) {\n {{ announcement.key | uiTranslate: announcement.params | async }}\n }\n </span>\n }\n\n @if (showSendButton()) {\n <ui-button\n class=\"send-button\"\n animate.enter=\"cnp-prompt-pop-in\"\n [variant]=\"'secondary'\"\n [iconName]=\"'Arrow-up-in-line'\"\n [tooltip]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [size]=\"'medium'\"\n [disabled]=\"!canSubmit()\"\n (click)=\"sendPromptData()\"\n ></ui-button>\n }\n </div>\n\n <div class=\"prompt-projected-footer\">\n <ng-content select=\"[promptFooter]\"></ng-content>\n </div>\n </div>\n\n @if (errorMessage()) {\n <div class=\"prompt-error\" animate.enter=\"cnp-prompt-error-in\">\n <ui-icon [name]=\"'Error'\" color=\"red\"></ui-icon>\n <span>{{ errorMessage() }}</span>\n </div>\n }\n\n <!-- Dropdown for hidden tags -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"isDropdownOpened() && !isLocked()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"dropdownOutsideClick()\"\n >\n <div class=\"dropdown-container\" role=\"list\" #tagDropdown tabindex=\"0\" animate.enter=\"cnp-prompt-dropdown-in\">\n @for (tag of tagsInDropdown(); track tag) {\n <div\n class=\"dropdown-tag\"\n tabindex=\"0\"\n [attr.aria-label]=\"tag.label\"\n role=\"listitem\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n >\n {{ tag.label }}\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Built-in items dropdown (UI-877) — opens on focus, typing filters by label -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"itemsDropdownVisible()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"itemsDropdownOutsideClick($event)\"\n >\n <div\n class=\"dropdown-container custom-dropdown-container\"\n animate.enter=\"cnp-prompt-dropdown-in\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @if (dropdownHeading() || showDropdownClose()) {\n <div class=\"dropdown-header\">\n @if (dropdownHeading()) {\n <span class=\"dropdown-heading\">{{ dropdownHeading() }}</span>\n }\n @if (showDropdownClose()) {\n <ui-button\n class=\"dropdown-close\"\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Close-in-line'\"\n [tooltip]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n (click)=\"closeItemsDropdown()\"\n ></ui-button>\n }\n </div>\n }\n <div role=\"list\">\n @for (item of filteredDropdownItems(); track item.id) {\n <div\n class=\"dropdown-tag dropdown-item\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.label\"\n (click)=\"selectDropdownItem(item, $event)\"\n (keydown.enter)=\"selectDropdownItem(item, $event)\"\n (keydown.space)=\"selectDropdownItem(item, $event)\"\n >\n @if (item.icon) {\n <ui-icon class=\"dropdown-item-icon\" [name]=\"item.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"dropdown-item-label\">{{ item.label }}</span>\n <ui-icon class=\"dropdown-item-chevron\" [name]=\"'Arrow-chevron-right-in-line'\" [color]=\"'inherit'\"></ui-icon>\n </div>\n }\n </div>\n </div>\n </ng-template>\n</ng-container>\n","import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { BadgeComponentModule } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { TooltipComponentModule } from '@testgorilla/tgo-ui/components/tooltip';\n\nimport { PromptComponent } from './prompt.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FieldComponentModule,\n ButtonComponentModule,\n OverflowMenuComponentModule,\n TagComponentModule,\n BadgeComponentModule,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n CardComponentModule,\n CdkTextareaAutosize,\n TooltipComponentModule,\n MatTooltip,\n UiTranslatePipe,\n IconComponentModule,\n SkeletonComponent,\n PromptComponent,\n ],\n exports: [PromptComponent],\n})\nexport class PromptModule {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-prompt.mjs","names":["keyboardEvent"],"sources":["../../../components/prompt/prompt.component.ts","../../../components/prompt/prompt.component.html","../../../components/prompt/prompt.module.ts"],"sourcesContent":["import { ConnectedPosition, CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n Input,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { debounceTime, firstValueFrom, fromEvent, map, tap } from 'rxjs';\n\nimport { BadgeComponent } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponent } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponent, IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuButtonsType, OverflowMenuComponent } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { PopoverDirective } from '@testgorilla/tgo-ui/components/popover';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponent } from '@testgorilla/tgo-ui/components/tag';\n\nimport {\n PromptActionsMenuEntry,\n PromptActionTag,\n PromptData,\n PromptDropdownItem,\n PromptSecondaryActionTag,\n PromptTag,\n} from './prompt.model';\n\n/** Throttles outward `ControlValueAccessor` emissions only; the signal write is synchronous. */\nconst INPUT_EMIT_DEBOUNCE_MS = 200;\n\n/** Window after `compositionend` in which an Enter still counts as committing an IME candidate. */\nconst IME_COMMIT_GRACE_MS = 50;\n\nconst CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS = 1000;\n\nconst CHARACTER_COUNT_ANNOUNCE_THRESHOLD = 0.1;\n\nlet nextActionsMenuId = 0;\n\n/** `undefined` falls back to the default icon; `null` means no icon. */\nconst resolveIcon = (icon: IconName | null | undefined, fallback: IconName): IconName =>\n icon === null ? '' : (icon ?? fallback);\n\n@Component({\n selector: 'ui-prompt',\n templateUrl: './prompt.component.html',\n styleUrl: './prompt.component.scss',\n providers: [\n UiTranslatePipe,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PromptComponent),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CdkOverlayOrigin,\n NgClass,\n SkeletonComponent,\n IconComponent,\n FieldComponent,\n TagComponent,\n ButtonComponent,\n BadgeComponent,\n OverflowMenuComponent,\n MatTooltip,\n CdkConnectedOverlay,\n PopoverDirective,\n AsyncPipe,\n UiTranslatePipe,\n ],\n})\nexport class PromptComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n private readonly disabledState = signal(false);\n\n tags = input<PromptTag[]>([]);\n actionTag = input<PromptActionTag | null>(null);\n\n /** Tag rendered next to the action tag or file upload button, e.g. \"Find similar profile\". */\n secondaryActionTag = input<PromptSecondaryActionTag | null>(null);\n\n /**\n * Collapses `actionTag` and `secondaryActionTag` behind a Plus button that opens a menu listing\n * them; the button turns into a Close button while the menu is open.\n */\n collapseActionTags = input(false, { transform: booleanAttribute });\n\n maxCharacters = input<number>(255);\n supportedFileTypes = input<string>('');\n autoClear = input<boolean>(true);\n showSendButton = input<boolean>(false);\n sendButtonDisabled = input(false, { transform: booleanAttribute });\n enableFileUpload = input<boolean>(false);\n loading = input(false, { transform: booleanAttribute });\n\n /**\n * Placeholder for the prompt.\n */\n placeholder = input<string>('');\n\n /**\n * Custom error message displayed below the prompt.\n */\n errorMessage = input<string>('');\n\n /** Items for the built-in dropdown; opens on focus, filters by label as the user types. */\n dropdownItems = input<PromptDropdownItem[]>([]);\n dropdownHeading = input<string>('');\n showDropdownClose = input(false, { transform: booleanAttribute });\n\n /**\n * Whether to display a live `used / max` character count in the footer.\n */\n showCharacterCount = input(false, { transform: booleanAttribute });\n\n /**\n * Lighter hint rendered right after the typed text to flag what is still missing, e.g. \"Add location\".\n * Display-only: it is never inserted into the value, and Tab does not accept it.\n */\n helpText = input<string>('');\n\n /**\n * Whether the prompt is disabled.\n * @type {boolean}\n * @memberof PromptComponent\n */\n @Input({ transform: booleanAttribute })\n get disabled(): boolean {\n return this.disabledState();\n }\n set disabled(value: boolean) {\n this.setDisabledState(value);\n }\n\n promptData = output<PromptData>();\n actionTagFileSelected = output<File>();\n secondaryActionTagPress = output<void>();\n dropdownItemSelected = output<PromptDropdownItem>();\n dropdownClosed = output<void>();\n\n promptFilesList = signal<File[]>([]);\n promptTextValue = signal<string>('');\n fileListMenuConfig = signal<OverflowMenuButtonsType[]>([]);\n\n tagsVisible = signal<PromptTag[]>([]);\n tagsInDropdown = signal<PromptTag[]>([]);\n autocompleteSuggestion = signal<string>('');\n\n isDropdownOpened = signal<boolean>(false);\n readonly actionsMenuId = `ui-prompt-actions-menu-${nextActionsMenuId++}`;\n private readonly keepDropdownClosed = signal(false);\n isFieldHovered = signal(false);\n isFieldFocused = signal(false);\n\n /** True while an IME candidate window is open (CJK input). */\n private readonly composing = signal(false);\n private compositionEndedAt = 0;\n\n filteredDropdownItems = computed(() => {\n const query = this.promptTextValue().trim().toLowerCase();\n return this.dropdownItems().filter(item => {\n const label = item.label.toLowerCase();\n return label !== query && (!query || label.includes(query));\n });\n });\n\n // Derived from focus so blur closes the overlay for free.\n itemsDropdownVisible = computed(\n () =>\n this.isFieldFocused() && !this.keepDropdownClosed() && this.filteredDropdownItems().length > 0 && !this.isLocked()\n );\n\n /** True while focus sits anywhere inside the prompt. */\n isContainerFocused = signal(false);\n\n isHighlighted = computed(() => this.isFieldHovered() || this.isContainerFocused());\n\n readonly showFocusRing = computed(() => this.isHighlighted() && !this.loading());\n fileInputAccept = computed(() => this.actionTag()?.acceptedFileTypes ?? this.supportedFileTypes());\n\n isLocked = computed(() => this.disabledState() || this.loading());\n\n /** Hidden on an empty prompt (the placeholder owns that state) and behind a tag's autocomplete suggestion. */\n readonly visibleHelpText = computed(() =>\n this.promptTextValue() && !this.autocompleteSuggestion() && !this.isLocked() ? this.helpText().trim() : ''\n );\n\n readonly actionTagIcon = computed(() => resolveIcon(this.actionTag()?.icon, 'Plus'));\n readonly actionTagMenuTrailingIcon = computed(() => resolveIcon(this.actionTag()?.menuTrailingIcon, 'Plus'));\n readonly secondaryActionTagMenuTrailingIcon = computed(() =>\n resolveIcon(this.secondaryActionTag()?.menuTrailingIcon, 'Arrow-chevron-right-in-line')\n );\n\n /** Menu items sorted by `menuOrder`; a stable sort keeps the default order for ties and omissions. */\n readonly actionsMenuEntries = computed<PromptActionsMenuEntry[]>(() => {\n const secondary = this.secondaryActionTag();\n const action = this.actionTag();\n const entries: PromptActionsMenuEntry[] = [];\n if (secondary) {\n entries.push({ kind: 'secondary', tag: secondary, trailingIcon: this.secondaryActionTagMenuTrailingIcon() });\n }\n if (action) {\n entries.push({ kind: 'action', tag: action, trailingIcon: this.actionTagMenuTrailingIcon() });\n }\n return entries.sort((a, b) => (a.tag.menuOrder ?? Infinity) - (b.tag.menuOrder ?? Infinity));\n });\n\n readonly isActionsMenuOpen = computed(() => this.actionsPopover()?.isOpen() ?? false);\n\n readonly showActionsMenuTrigger = computed(\n () => this.collapseActionTags() && Boolean(this.actionTag() ?? this.secondaryActionTag())\n );\n\n private readonly hasContent = computed(\n () => Boolean(this.promptTextValue().trim()) || this.promptFilesList().length > 0\n );\n\n /**\n * Shared by the Send button's disabled state and the Enter shortcut, so they cannot disagree.\n * Ignores `showSendButton` on purpose: this is whether submission is allowed, not whether a\n * button is rendered.\n */\n readonly canSubmit = computed(() => !this.isLocked() && !this.sendButtonDisabled() && this.hasContent());\n\n readonly isOverCharacterLimit = computed(() => this.promptTextValue().length > this.maxCharacters());\n\n private readonly announcedTextValue = toSignal(\n toObservable(computed(() => (this.showCharacterCount() ? this.promptTextValue() : ''))).pipe(\n debounceTime(CHARACTER_COUNT_ANNOUNCE_DEBOUNCE_MS)\n ),\n { initialValue: '' }\n );\n\n readonly characterCountAnnouncement = computed<{ key: string; params: { count: number } } | null>(() => {\n if (!this.showCharacterCount()) {\n return null;\n }\n\n const max = this.maxCharacters();\n const remaining = max - this.announcedTextValue().length;\n\n if (remaining < 0) {\n return { key: 'PROMPT.CHARACTERS_OVER_LIMIT', params: { count: -remaining } };\n }\n if (remaining <= max * CHARACTER_COUNT_ANNOUNCE_THRESHOLD) {\n return { key: 'PROMPT.CHARACTERS_REMAINING', params: { count: remaining } };\n }\n\n return null;\n });\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly translationPipe = inject(UiTranslatePipe);\n\n private readonly resetOnLock = effect(() => {\n if (this.isLocked()) {\n this.isDropdownOpened.set(false);\n this.actionsPopover()?.close();\n this.isFieldFocused.set(false);\n this.isFieldHovered.set(false);\n this.isContainerFocused.set(false);\n this.autocompleteSuggestion.set('');\n this.composing.set(false);\n }\n });\n\n fileDrop = viewChild<ElementRef<HTMLInputElement>>('fileDropRef');\n tagDropdown = viewChild<ElementRef<HTMLInputElement>>('tagDropdown');\n fieldComponentRef = viewChild.required<FieldComponent>('textarea');\n private readonly promptContainer = viewChild.required<ElementRef<HTMLElement>>('promptContainerRef');\n private readonly actionsPopover = viewChild(PopoverDirective);\n private readonly actionsMenu = viewChild<ElementRef<HTMLElement>>('actionsMenu');\n\n readonly dropdownPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ];\n\n ngOnInit() {\n this.initTags();\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.syncInputChange();\n }, 0);\n }\n\n private async uploadFile(event: Event): Promise<void> {\n const files = (event.currentTarget as HTMLInputElement).files;\n if (files?.length) {\n this.promptFilesList.update(list => {\n list.push(files.item(0) as File);\n return list;\n });\n this.emitValue();\n await this.updateFileMenu();\n }\n }\n\n sendPromptData(): void {\n if (!this.canSubmit()) {\n return;\n }\n this.promptData.emit({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n\n if (this.autoClear()) {\n this.clearPromptData();\n }\n }\n\n selectedMenuOption(menuOptionValue: string): void {\n const updatedConfig = this.fileListMenuConfig().filter(menu => menu.value !== menuOptionValue);\n const updatedFileList = this.promptFilesList().filter(file => file.name !== menuOptionValue);\n this.promptFilesList.set(updatedFileList);\n this.fileListMenuConfig.set(updatedConfig);\n }\n\n selectTag(tag: PromptTag, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.isDropdownOpened.set(false);\n this.promptTextValue.set(tag.label);\n this.autocompleteSuggestion.set(`${tag.label} ${tag.autocomplete}`);\n this.fieldComponentRef().field.nativeElement.focus();\n this.onTouch();\n }\n\n onTextareaTab(event: Event): void {\n if (this.isLocked()) {\n return;\n }\n if (this.autocompleteSuggestion()) {\n event.preventDefault();\n this.promptTextValue.set(this.autocompleteSuggestion());\n this.autocompleteSuggestion.set('');\n }\n }\n\n onTextareaEnter(event: Event): void {\n const keyboardEvent = event as KeyboardEvent;\n // Three checks because browsers disagree on when `compositionend` fires relative to the\n // Enter that commits an IME candidate: Chrome/Firefox after, Safari before, Android during.\n if (keyboardEvent.isComposing || this.composing() || Date.now() - this.compositionEndedAt < IME_COMMIT_GRACE_MS) {\n return;\n }\n // Unconditional, so a blocked Enter is swallowed rather than inserting a newline.\n event.preventDefault();\n this.sendPromptData();\n }\n\n dropdownOutsideClick(): void {\n this.isDropdownOpened.set(false);\n }\n\n onFieldBlur(): void {\n this.isFieldFocused.set(false);\n }\n\n onContainerFocusIn(): void {\n this.isContainerFocused.set(true);\n }\n\n onContainerFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (next instanceof Node && this.promptContainer().nativeElement.contains(next)) {\n return;\n }\n\n this.isContainerFocused.set(false);\n }\n\n itemsDropdownOutsideClick(event: MouseEvent): void {\n if (this.promptContainer().nativeElement.contains(event.target as Node)) {\n return;\n }\n this.isFieldFocused.set(false);\n this.dropdownClosed.emit();\n }\n\n closeItemsDropdown(): void {\n this.keepDropdownClosed.set(true);\n this.dropdownClosed.emit();\n }\n\n onTextareaEscape(event: Event): void {\n if (this.itemsDropdownVisible()) {\n // Consume it only when it dismissed the dropdown, so an Escape with nothing open still\n // reaches an enclosing ui-dialog / ui-side-sheet.\n event.stopPropagation();\n this.closeItemsDropdown();\n }\n }\n\n selectDropdownItem(item: PromptDropdownItem, event: Event): void {\n if (this.isLocked()) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n this.keepDropdownClosed.set(true);\n this.promptTextValue.set(item.label);\n this.autocompleteSuggestion.set('');\n this.fieldComponentRef().field.nativeElement.focus();\n this.dropdownItemSelected.emit(item);\n this.emitValue();\n }\n\n toggleDropdown(): void {\n if (this.isLocked()) {\n return;\n }\n this.isDropdownOpened.set(!this.isDropdownOpened());\n }\n\n focusTagDropdown(): void {\n setTimeout(() => {\n this.tagDropdown()?.nativeElement.focus();\n }, 300);\n }\n\n private syncInputChange() {\n if (!this.fieldComponentRef()?.field?.nativeElement) {\n return;\n }\n\n const textarea = this.fieldComponentRef().field.nativeElement;\n\n fromEvent(textarea, 'input')\n .pipe(\n map((event: Event) => (event.target as HTMLInputElement).value),\n // Synchronous, so Enter and the Send button never observe a stale value.\n tap(value => {\n this.promptTextValue.set(value);\n this.keepDropdownClosed.set(false);\n if (this.autocompleteSuggestion()) {\n this.autocompleteSuggestion.set('');\n }\n }),\n debounceTime(INPUT_EMIT_DEBOUNCE_MS),\n tap(() => this.emitValue()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionstart')\n .pipe(\n tap(() => this.composing.set(true)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n\n fromEvent(textarea, 'compositionend')\n .pipe(\n tap(() => {\n this.composing.set(false);\n this.compositionEndedAt = Date.now();\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe();\n }\n\n private initTags(): void {\n if (!this.tags()?.length) {\n return;\n }\n if (this.tags().length <= 5) {\n this.tagsVisible.set(this.tags());\n return;\n }\n\n this.tagsVisible.set(this.tags().slice(0, 5));\n this.tagsInDropdown.set(this.tags().slice(5));\n }\n\n private async updateFileMenu(): Promise<void> {\n const menuConfig: OverflowMenuButtonsType[] = [];\n const tooltip = await firstValueFrom(this.translationPipe.transform('COMMON.DELETE'));\n this.promptFilesList().forEach(file => {\n menuConfig.push({\n label: file.name,\n value: file.name,\n icon: 'Delete',\n tooltipText: tooltip,\n });\n });\n this.fileListMenuConfig.set(menuConfig);\n }\n\n private clearPromptData(): void {\n this.promptTextValue.set('');\n this.promptFilesList.set([]);\n this.fileListMenuConfig.set([]);\n }\n\n writeValue(value: PromptData): void {\n this.promptTextValue.set(value?.text ?? '');\n this.promptFilesList.set(value?.files ?? []);\n }\n private onChange = (_value: PromptData): void => {};\n private onTouch = () => {};\n\n registerOnChange(fn: (value: PromptData) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n async onFileSelected(event: Event): Promise<void> {\n if (this.isLocked()) {\n return;\n }\n if (this.actionTag()) {\n this.handleActionTagFile(event);\n } else {\n await this.uploadFile(event);\n }\n }\n\n onActionTagPress(): void {\n if (this.isLocked() || this.actionTag()?.disabled) {\n return;\n }\n this.fileDrop()?.nativeElement.click();\n }\n\n onSecondaryActionTagPress(): void {\n if (this.isLocked() || this.secondaryActionTag()?.disabled) {\n return;\n }\n this.secondaryActionTagPress.emit();\n }\n\n /** The popover's focus trap hands focus back to the Plus button when the menu closes. */\n closeActionsMenu(): void {\n this.actionsPopover()?.close();\n }\n\n onActionsMenuKeydown(event: KeyboardEvent): void {\n const items = this.actionsMenuItems();\n const current = items.indexOf(document.activeElement as HTMLElement);\n const focusAt = (index: number) => {\n event.preventDefault();\n items[(index + items.length) % items.length]?.focus();\n };\n\n switch (event.key) {\n case 'ArrowDown':\n focusAt(current + 1);\n break;\n case 'ArrowUp':\n focusAt(current - 1);\n break;\n case 'Home':\n focusAt(0);\n break;\n case 'End':\n focusAt(items.length - 1);\n break;\n case 'Escape':\n // Consumed so an enclosing ui-dialog / ui-side-sheet does not close as well.\n event.preventDefault();\n event.stopPropagation();\n this.closeActionsMenu();\n break;\n }\n }\n\n selectActionsMenuEntry(entry: PromptActionsMenuEntry, event: Event): void {\n if (entry.kind === 'action') {\n this.selectActionTagFromMenu(event);\n } else {\n this.selectSecondaryActionTagFromMenu(event);\n }\n }\n\n private selectActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.actionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onActionTagPress();\n }\n\n private selectSecondaryActionTagFromMenu(event: Event): void {\n event.preventDefault();\n if (this.secondaryActionTag()?.disabled) {\n return;\n }\n this.closeActionsMenu();\n this.onSecondaryActionTagPress();\n }\n\n private actionsMenuItems(): HTMLElement[] {\n const menu = this.actionsMenu()?.nativeElement;\n return menu ? Array.from(menu.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')) : [];\n }\n\n private handleActionTagFile(event: Event): void {\n const inputEl = event.currentTarget as HTMLInputElement;\n const file = inputEl.files?.item(0) ?? null;\n if (file) {\n this.actionTagFileSelected.emit(file);\n }\n inputEl.value = '';\n }\n\n private emitValue(): void {\n this.onChange({ text: this.promptTextValue() || '', files: this.promptFilesList() });\n this.onTouch();\n }\n}\n","<ng-container>\n <div\n class=\"prompt-container\"\n [class.has-error]=\"!!errorMessage()\"\n [class.disabled]=\"isLocked()\"\n [attr.aria-disabled]=\"isLocked()\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n cdkOverlayOrigin\n #promptOrigin=\"cdkOverlayOrigin\"\n #promptContainerRef\n [class.prompt-container-focused]=\"showFocusRing()\"\n (focusin)=\"onContainerFocusIn()\"\n (focusout)=\"onContainerFocusOut($event)\"\n >\n @if (loading()) {\n <div class=\"prompt-loading\" aria-hidden=\"true\" animate.enter=\"cnp-prompt-fade-in\">\n <ui-skeleton [theme]=\"{ width: '100%', height: '20px', margin: '0' }\"></ui-skeleton>\n <ui-skeleton [theme]=\"{ width: '30%', height: '20px', margin: '0' }\"></ui-skeleton>\n </div>\n }\n <div class=\"prompt-autocomplete\" [hidden]=\"loading()\">\n <textarea tabindex=\"-1\" class=\"ghost\" id=\"autocomplete\" [value]=\"autocompleteSuggestion()\" readonly></textarea>\n @if (visibleHelpText(); as help) {\n <!-- The mirror repeats the typed text invisibly so the hint lands right after its last character. -->\n <div class=\"ghost prompt-help-text\" aria-hidden=\"true\">\n <span class=\"prompt-help-text-mirror\">{{ promptTextValue() }}</span\n ><span class=\"prompt-help-text-hint\">{{ ' ' + help }}</span>\n </div>\n }\n\n @let showIcon = !isFieldFocused() && !promptTextValue();\n @if (showIcon) {\n <ui-icon\n class=\"prompt-icon\"\n animate.enter=\"cnp-prompt-icon-in\"\n animate.leave=\"cnp-prompt-icon-out\"\n [color]=\"'inherit'\"\n [class.hovered]=\"isFieldHovered()\"\n [name]=\"'Sparkle-in-line'\"\n ></ui-icon>\n }\n <!-- `keydown.enter` matches unmodified Enter only; Shift+Enter resolves to `shift.enter`\n and falls through to a newline. Do not add a shiftKey check. -->\n <ui-field\n #textarea\n class=\"prompt-text\"\n [class.show-icon]=\"showIcon\"\n role=\"input\"\n [showBottomContent]=\"false\"\n [borderless]=\"true\"\n [type]=\"'multi-line'\"\n [autosizableTextarea]=\"true\"\n [maxCharacters]=\"maxCharacters()\"\n [placeholder]=\"showIcon ? placeholder() || ('PROMPT.ASK_ANYTHING' | uiTranslate | async)! : ''\"\n [value]=\"promptTextValue() || ''\"\n [hasTextAreaCounter]=\"false\"\n [ariaDescribedby]=\"visibleHelpText()\"\n [disabled]=\"disabled\"\n (mouseenter)=\"isFieldHovered.set(true)\"\n (mouseleave)=\"isFieldHovered.set(false)\"\n (focusin)=\"isFieldFocused.set(true)\"\n (fieldBlur)=\"onFieldBlur()\"\n (keydown.tab)=\"onTextareaTab($event)\"\n (keydown.enter)=\"onTextareaEnter($event)\"\n (keydown.escape)=\"onTextareaEscape($event)\"\n ></ui-field>\n </div>\n <div class=\"prompt-footer flex-container\">\n <div class=\"flex-container\">\n @if (showActionsMenuTrigger()) {\n <ui-button\n [uiPopover]=\"actionsMenuTemplate\"\n [popoverTrigger]=\"'click'\"\n [popoverCardSize]=\"'small'\"\n [popoverAlign]=\"'start'\"\n [popoverOffset]=\"8\"\n [popoverAriaLabel]=\"('COMMON.ADD' | uiTranslate | async)!\"\n [uiPopoverDisabled]=\"isLocked()\"\n [variant]=\"'icon-button'\"\n [iconName]=\"isActionsMenuOpen() ? 'Close' : 'Plus'\"\n [tooltip]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"((isActionsMenuOpen() ? 'COMMON.CLOSE' : 'COMMON.ADD') | uiTranslate | async)!\"\n [ariaExpanded]=\"isActionsMenuOpen()\"\n [ariaControls]=\"isActionsMenuOpen() ? actionsMenuId : undefined\"\n [disabled]=\"isLocked()\"\n ></ui-button>\n\n <ng-template #actionsMenuTemplate>\n <div\n class=\"actions-menu\"\n role=\"menu\"\n #actionsMenu\n [id]=\"actionsMenuId\"\n (keydown)=\"onActionsMenuKeydown($event)\"\n >\n @for (entry of actionsMenuEntries(); track entry.kind) {\n <div\n class=\"actions-menu-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.aria-label]=\"entry.tag.ariaLabel ?? entry.tag.label\"\n [attr.aria-disabled]=\"entry.tag.disabled ? 'true' : null\"\n (click)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.enter)=\"selectActionsMenuEntry(entry, $event)\"\n (keydown.space)=\"selectActionsMenuEntry(entry, $event)\"\n >\n @if (entry.tag.icon) {\n <ui-icon class=\"actions-menu-item-icon\" [name]=\"entry.tag.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"actions-menu-item-label\">{{ entry.tag.label }}</span>\n @if (entry.trailingIcon) {\n <ui-icon\n class=\"actions-menu-item-trailing\"\n [name]=\"entry.trailingIcon\"\n [color]=\"'inherit'\"\n ></ui-icon>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n\n @if (actionTag(); as at) {\n @if (!collapseActionTags()) {\n <ui-tag\n [label]=\"at.label\"\n [icon]=\"actionTagIcon()\"\n [ariaLabel]=\"at.ariaLabel ?? at.label\"\n [isDisabled]=\"isLocked() || !!at.disabled\"\n (press)=\"onActionTagPress()\"\n ></ui-tag>\n }\n } @else if (enableFileUpload()) {\n <ui-button\n [variant]=\"'icon-button'\"\n [tooltip]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('PROMPT.ADD_FILES' | uiTranslate | async)!\"\n [iconName]=\"'Plus'\"\n [disabled]=\"isLocked()\"\n (click)=\"fileDrop()?.nativeElement?.click()\"\n ></ui-button>\n\n @if (promptFilesList().length) {\n <div class=\"menu\" animate.enter=\"cnp-prompt-pop-in\">\n <ui-badge\n [notificationsAmount]=\"promptFilesList().length\"\n [variant]=\"'notification'\"\n class=\"menu-badge\"\n ></ui-badge>\n <ui-overflow-menu\n [matTooltip]=\"('PROMPT.FILES' | uiTranslate | async)!\"\n [matTooltipPosition]=\"'above'\"\n [buttonSize]=\"'medium'\"\n [iconTrigger]=\"'Document'\"\n [buttonVariant]=\"'ghost'\"\n [buttons]=\"fileListMenuConfig()\"\n [isDynamicMenu]=\"true\"\n [withRemovableOption]=\"true\"\n (selectItem)=\"selectedMenuOption($event)\"\n ></ui-overflow-menu>\n </div>\n }\n }\n\n @if (secondaryActionTag(); as sat) {\n @if (!collapseActionTags()) {\n <ui-tag\n class=\"prompt-secondary-action-tag\"\n [label]=\"sat.label\"\n [icon]=\"sat.icon ?? ''\"\n [ariaLabel]=\"sat.ariaLabel ?? sat.label\"\n [isDisabled]=\"isLocked() || !!sat.disabled\"\n (press)=\"onSecondaryActionTagPress()\"\n ></ui-tag>\n }\n }\n\n @if (actionTag() || enableFileUpload()) {\n <input\n data-testid=\"prompt-file-input\"\n [tabIndex]=\"-1\"\n class=\"form-control\"\n #fileDropRef\n type=\"file\"\n id=\"file-upload\"\n [accept]=\"fileInputAccept()\"\n [disabled]=\"isLocked()\"\n (change)=\"onFileSelected($event)\"\n />\n }\n </div>\n\n @if (tags()?.length && !promptTextValue()) {\n <div class=\"flex-container carousel\" animate.enter=\"cnp-prompt-row-in\">\n <div class=\"tag-container flex-container\" role=\"list\" #tagsScrollContainer>\n @for (tag of tagsVisible(); track tag) {\n <ui-tag\n [label]=\"tag.label\"\n role=\"listitem\"\n [ariaLabel]=\"tag.label\"\n [isDisabled]=\"isLocked()\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n ></ui-tag>\n }\n\n @if (tagsInDropdown().length) {\n <ui-button\n class=\"view-more\"\n variant=\"text-inline\"\n [label]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [ariaLabel]=\"('PROMPT.VIEW_MORE' | uiTranslate | async)!\"\n [size]=\"'medium'\"\n [disabled]=\"isLocked()\"\n (click)=\"toggleDropdown()\"\n (keydown.enter)=\"focusTagDropdown()\"\n cdkOverlayOrigin\n #dropdownTrigger=\"cdkOverlayOrigin\"\n ></ui-button>\n }\n </div>\n\n <div class=\"flex-container\">\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Scroll left button'\"\n [iconName]=\"'Arrow-chevron-left-in-line'\"\n [disabled]=\"isLocked() || tagsScrollContainer.scrollLeft === 0\"\n (click)=\"tagsScrollContainer.scrollBy({ left: -100, behavior: 'smooth' })\"\n ></ui-button>\n <ui-button\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Arrow-chevron-right-in-line'\"\n [ariaLabel]=\"'Scroll right button'\"\n [disabled]=\"\n isLocked() ||\n tagsScrollContainer.scrollLeft + tagsScrollContainer.clientWidth >= tagsScrollContainer.scrollWidth\n \"\n (click)=\"tagsScrollContainer.scrollBy({ left: 100, behavior: 'smooth' })\"\n ></ui-button>\n </div>\n </div>\n }\n\n @if (showCharacterCount()) {\n <span class=\"prompt-character-count\" [class.over-limit]=\"isOverCharacterLimit()\"\n >{{ promptTextValue().length }} / {{ maxCharacters() }}</span\n >\n <span class=\"prompt-character-count-status\" aria-live=\"polite\">\n @if (characterCountAnnouncement(); as announcement) {\n {{ announcement.key | uiTranslate: announcement.params | async }}\n }\n </span>\n }\n\n @if (showSendButton()) {\n <ui-button\n class=\"send-button\"\n animate.enter=\"cnp-prompt-pop-in\"\n [variant]=\"'secondary'\"\n [iconName]=\"'Arrow-up-in-line'\"\n [tooltip]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.SEND' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [size]=\"'medium'\"\n [disabled]=\"!canSubmit()\"\n (click)=\"sendPromptData()\"\n ></ui-button>\n }\n </div>\n\n <div class=\"prompt-projected-footer\">\n <ng-content select=\"[promptFooter]\"></ng-content>\n </div>\n </div>\n\n @if (errorMessage()) {\n <div class=\"prompt-error\" animate.enter=\"cnp-prompt-error-in\">\n <ui-icon [name]=\"'Error'\" color=\"red\"></ui-icon>\n <span>{{ errorMessage() }}</span>\n </div>\n }\n\n <!-- Dropdown for hidden tags -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"isDropdownOpened() && !isLocked()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"dropdownOutsideClick()\"\n >\n <div class=\"dropdown-container\" role=\"list\" #tagDropdown tabindex=\"0\" animate.enter=\"cnp-prompt-dropdown-in\">\n @for (tag of tagsInDropdown(); track tag) {\n <div\n class=\"dropdown-tag\"\n tabindex=\"0\"\n [attr.aria-label]=\"tag.label\"\n role=\"listitem\"\n (click)=\"selectTag(tag, $event)\"\n (keyup.enter)=\"selectTag(tag, $event)\"\n (keyup.space)=\"selectTag(tag, $event)\"\n >\n {{ tag.label }}\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Built-in items dropdown (UI-877) — opens on focus, typing filters by label -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"promptOrigin\"\n [cdkConnectedOverlayOpen]=\"itemsDropdownVisible()\"\n [cdkConnectedOverlayPositions]=\"dropdownPositions\"\n [cdkConnectedOverlayWidth]=\"promptContainerRef?.offsetWidth || 0\"\n (overlayOutsideClick)=\"itemsDropdownOutsideClick($event)\"\n >\n <div\n class=\"dropdown-container custom-dropdown-container\"\n animate.enter=\"cnp-prompt-dropdown-in\"\n (mousedown)=\"$event.preventDefault()\"\n >\n @if (dropdownHeading() || showDropdownClose()) {\n <div class=\"dropdown-header\">\n @if (dropdownHeading()) {\n <span class=\"dropdown-heading\">{{ dropdownHeading() }}</span>\n }\n @if (showDropdownClose()) {\n <ui-button\n class=\"dropdown-close\"\n [variant]=\"'icon-button'\"\n [size]=\"'small'\"\n [iconName]=\"'Close-in-line'\"\n [tooltip]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n [tooltipPosition]=\"'above'\"\n [ariaLabel]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n (click)=\"closeItemsDropdown()\"\n ></ui-button>\n }\n </div>\n }\n <div role=\"list\">\n @for (item of filteredDropdownItems(); track item.id) {\n <div\n class=\"dropdown-tag dropdown-item\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.label\"\n (click)=\"selectDropdownItem(item, $event)\"\n (keydown.enter)=\"selectDropdownItem(item, $event)\"\n (keydown.space)=\"selectDropdownItem(item, $event)\"\n >\n @if (item.icon) {\n <ui-icon class=\"dropdown-item-icon\" [name]=\"item.icon\" [color]=\"'inherit'\"></ui-icon>\n }\n <span class=\"dropdown-item-label\">{{ item.label }}</span>\n <ui-icon class=\"dropdown-item-chevron\" [name]=\"'Arrow-chevron-right-in-line'\" [color]=\"'inherit'\"></ui-icon>\n </div>\n }\n </div>\n </div>\n </ng-template>\n</ng-container>\n","import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { BadgeComponentModule } from '@testgorilla/tgo-ui/components/badge';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { OverflowMenuComponentModule } from '@testgorilla/tgo-ui/components/overflow-menu';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { TooltipComponentModule } from '@testgorilla/tgo-ui/components/tooltip';\n\nimport { PromptComponent } from './prompt.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FieldComponentModule,\n ButtonComponentModule,\n OverflowMenuComponentModule,\n TagComponentModule,\n BadgeComponentModule,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n CardComponentModule,\n CdkTextareaAutosize,\n TooltipComponentModule,\n MatTooltip,\n UiTranslatePipe,\n IconComponentModule,\n SkeletonComponent,\n PromptComponent,\n ],\n exports: [PromptComponent],\n})\nexport class PromptModule {}\n"],"mappings":"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"}
|
|
@@ -132,12 +132,15 @@ var RadialProgressComponent = class RadialProgressComponent {
|
|
|
132
132
|
"ariaExpanded",
|
|
133
133
|
"ariaControls",
|
|
134
134
|
"ariaPressed",
|
|
135
|
+
"ariaHasPopup",
|
|
135
136
|
"ariaRequired",
|
|
136
137
|
"ariaLabelledby",
|
|
137
138
|
"ariaDescribedby",
|
|
138
139
|
"preventDefault",
|
|
139
140
|
"hasBackground",
|
|
140
141
|
"circular",
|
|
142
|
+
"isSingleLineLabel",
|
|
143
|
+
"iconButtonShape",
|
|
141
144
|
"tooltipPosition",
|
|
142
145
|
"role",
|
|
143
146
|
"iconFilled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-radial-progress.mjs","names":[],"sources":["../../../components/radial-progress/radial-progress.model.ts","../../../components/radial-progress/radial-progress.component.ts","../../../components/radial-progress/radial-progress.component.html","../../../components/radial-progress/radial-progress.component.module.ts"],"sourcesContent":["export type RadialProgressSize = 'large' | 'small';\n\nexport enum RadialProgressSizeValue {\n LARGE = 64,\n SMALL = 40,\n}\n\nexport enum RadialProgressSizeEnum {\n LARGE = 'large',\n SMALL = 'small',\n}\n\nexport type RadialProgressVariant = 'number' | 'icon-button' | 'thin' | 'empty' | 'empty-thin';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n Optional,\n Output,\n SimpleChanges,\n OnChanges,\n} from '@angular/core';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\n\nimport {\n RadialProgressSize,\n RadialProgressSizeEnum,\n RadialProgressSizeValue,\n RadialProgressVariant,\n} from './radial-progress.model';\n\n@Component({\n selector: 'ui-radial-progress',\n templateUrl: './radial-progress.component.html',\n styleUrls: ['./radial-progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatProgressSpinner, ButtonComponent],\n})\nexport class RadialProgressComponent implements OnChanges {\n /**\n * The size of the component. Defaults to 'small'.\n * @type {RadialProgressSize}\n * @memberof RadialProgressComponent\n */\n @Input() size: RadialProgressSize = RadialProgressSizeEnum.SMALL;\n /**\n * The current value of the progress. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() value = 0;\n /**\n * The value of the total progress. Used to set the cap and used for percentage calculations. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() total = 0;\n\n /**\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() variant: RadialProgressVariant = 'number';\n\n /**\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input() showPercentageSign = true;\n\n /**\n * Icon for icon button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() icon: IconName = '';\n\n /**\n * The tooltip that is displayed on hover. Required for icon-button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() buttonTooltip = '';\n\n /**\n * Color of the progress bar.\n * Defaults to Test Gorilla primary color.\n *\n * @type {string}\n * @memberof RadialProgressComponent\n */\n @HostBinding('style.--color')\n @Input()\n companyColor: string | null;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof ButtonComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * When true (and size === 'large'), the projected content is revealed over\n * the variant's default inner content with a cross-fade animation. Bind to\n * the consumer's externally-controlled state (e.g. a parent card's hover\n * or focus-within state). Has no effect when size === 'small' — the slot\n * is suppressed via display: none at that size.\n *\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input({ transform: booleanAttribute }) showProjectedContent = false;\n\n @Output() buttonClicked = new EventEmitter<Event>();\n\n protected radialProgressSize = RadialProgressSizeEnum;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['companyColor']) {\n this.companyColor = this.applicationTheme === 'classic' ? '#46A997' : '#D410AA';\n }\n }\n\n protected get progressSize(): number {\n return this.size === (RadialProgressSizeEnum.SMALL as RadialProgressSize)\n ? RadialProgressSizeValue.SMALL\n : RadialProgressSizeValue.LARGE;\n }\n\n protected get percentage(): number {\n return Math.round(this.total ? (this.value * 100) / this.total : 0);\n }\n\n protected get strokeWidth(): number {\n return this.variant === 'thin' || this.variant === 'empty-thin' ? 4 : 8;\n }\n\n protected get displayValue(): string {\n return this.showPercentageSign ? `${this.percentage}%` : `${this.percentage}`;\n }\n\n protected onButtonClick(ev: Event): void {\n this.buttonClicked.emit(ev);\n }\n}\n","<div\n class=\"radial-progress-container\"\n [attr.theme]=\"applicationTheme\"\n [style.width]=\"progressSize + 'px'\"\n [style.height]=\"progressSize + 'px'\"\n>\n <div class=\"background\" [style.border-width]=\"strokeWidth + 'px'\"></div>\n\n <mat-progress-spinner\n [strokeWidth]=\"strokeWidth\"\n [diameter]=\"progressSize\"\n [value]=\"percentage\"\n ></mat-progress-spinner>\n\n <div\n class=\"inner-container size-{{ size }}\"\n [class.has-revealed-content]=\"showProjectedContent\"\n [class.small-font]=\"(variant === 'thin' || variant === 'empty-thin') && percentage !== 100\"\n [class.tiny-font]=\"percentage === 100 && showPercentageSign && variant === 'thin'\"\n >\n <div class=\"default-content\" [attr.inert]=\"showProjectedContent ? '' : null\">\n @if (variant === 'empty' || variant === 'empty-thin') {\n <div>{{ '-' }}</div>\n } @else if (variant === 'icon-button' && size !== 'small') {\n <ui-button\n [tooltip]=\"buttonTooltip\"\n [iconName]=\"icon\"\n [variant]=\"'icon-button'\"\n (click)=\"onButtonClick($event)\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-button>\n } @else if (size === radialProgressSize.LARGE || variant === 'thin') {\n <div class=\"value\">\n {{ displayValue }}\n </div>\n }\n </div>\n <div class=\"projected-content\" [attr.inert]=\"showProjectedContent ? null : ''\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\n\nimport { RadialProgressComponent } from './radial-progress.component';\n\n@NgModule({\n exports: [RadialProgressComponent],\n imports: [CommonModule, MatProgressSpinnerModule, ButtonComponentModule, RadialProgressComponent],\n})\nexport class RadialProgressComponentModule {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-radial-progress.mjs","names":[],"sources":["../../../components/radial-progress/radial-progress.model.ts","../../../components/radial-progress/radial-progress.component.ts","../../../components/radial-progress/radial-progress.component.html","../../../components/radial-progress/radial-progress.component.module.ts"],"sourcesContent":["export type RadialProgressSize = 'large' | 'small';\n\nexport enum RadialProgressSizeValue {\n LARGE = 64,\n SMALL = 40,\n}\n\nexport enum RadialProgressSizeEnum {\n LARGE = 'large',\n SMALL = 'small',\n}\n\nexport type RadialProgressVariant = 'number' | 'icon-button' | 'thin' | 'empty' | 'empty-thin';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n Optional,\n Output,\n SimpleChanges,\n OnChanges,\n} from '@angular/core';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\n\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\n\nimport {\n RadialProgressSize,\n RadialProgressSizeEnum,\n RadialProgressSizeValue,\n RadialProgressVariant,\n} from './radial-progress.model';\n\n@Component({\n selector: 'ui-radial-progress',\n templateUrl: './radial-progress.component.html',\n styleUrls: ['./radial-progress.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatProgressSpinner, ButtonComponent],\n})\nexport class RadialProgressComponent implements OnChanges {\n /**\n * The size of the component. Defaults to 'small'.\n * @type {RadialProgressSize}\n * @memberof RadialProgressComponent\n */\n @Input() size: RadialProgressSize = RadialProgressSizeEnum.SMALL;\n /**\n * The current value of the progress. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() value = 0;\n /**\n * The value of the total progress. Used to set the cap and used for percentage calculations. Defaults to 0.\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() total = 0;\n\n /**\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() variant: RadialProgressVariant = 'number';\n\n /**\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input() showPercentageSign = true;\n\n /**\n * Icon for icon button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() icon: IconName = '';\n\n /**\n * The tooltip that is displayed on hover. Required for icon-button\n * @type {number}\n * @memberof RadialProgressComponent\n */\n @Input() buttonTooltip = '';\n\n /**\n * Color of the progress bar.\n * Defaults to Test Gorilla primary color.\n *\n * @type {string}\n * @memberof RadialProgressComponent\n */\n @HostBinding('style.--color')\n @Input()\n companyColor: string | null;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof ButtonComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * When true (and size === 'large'), the projected content is revealed over\n * the variant's default inner content with a cross-fade animation. Bind to\n * the consumer's externally-controlled state (e.g. a parent card's hover\n * or focus-within state). Has no effect when size === 'small' — the slot\n * is suppressed via display: none at that size.\n *\n * @type {boolean}\n * @memberof RadialProgressComponent\n */\n @Input({ transform: booleanAttribute }) showProjectedContent = false;\n\n @Output() buttonClicked = new EventEmitter<Event>();\n\n protected radialProgressSize = RadialProgressSizeEnum;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['companyColor']) {\n this.companyColor = this.applicationTheme === 'classic' ? '#46A997' : '#D410AA';\n }\n }\n\n protected get progressSize(): number {\n return this.size === (RadialProgressSizeEnum.SMALL as RadialProgressSize)\n ? RadialProgressSizeValue.SMALL\n : RadialProgressSizeValue.LARGE;\n }\n\n protected get percentage(): number {\n return Math.round(this.total ? (this.value * 100) / this.total : 0);\n }\n\n protected get strokeWidth(): number {\n return this.variant === 'thin' || this.variant === 'empty-thin' ? 4 : 8;\n }\n\n protected get displayValue(): string {\n return this.showPercentageSign ? `${this.percentage}%` : `${this.percentage}`;\n }\n\n protected onButtonClick(ev: Event): void {\n this.buttonClicked.emit(ev);\n }\n}\n","<div\n class=\"radial-progress-container\"\n [attr.theme]=\"applicationTheme\"\n [style.width]=\"progressSize + 'px'\"\n [style.height]=\"progressSize + 'px'\"\n>\n <div class=\"background\" [style.border-width]=\"strokeWidth + 'px'\"></div>\n\n <mat-progress-spinner\n [strokeWidth]=\"strokeWidth\"\n [diameter]=\"progressSize\"\n [value]=\"percentage\"\n ></mat-progress-spinner>\n\n <div\n class=\"inner-container size-{{ size }}\"\n [class.has-revealed-content]=\"showProjectedContent\"\n [class.small-font]=\"(variant === 'thin' || variant === 'empty-thin') && percentage !== 100\"\n [class.tiny-font]=\"percentage === 100 && showPercentageSign && variant === 'thin'\"\n >\n <div class=\"default-content\" [attr.inert]=\"showProjectedContent ? '' : null\">\n @if (variant === 'empty' || variant === 'empty-thin') {\n <div>{{ '-' }}</div>\n } @else if (variant === 'icon-button' && size !== 'small') {\n <ui-button\n [tooltip]=\"buttonTooltip\"\n [iconName]=\"icon\"\n [variant]=\"'icon-button'\"\n (click)=\"onButtonClick($event)\"\n [applicationTheme]=\"applicationTheme\"\n ></ui-button>\n } @else if (size === radialProgressSize.LARGE || variant === 'thin') {\n <div class=\"value\">\n {{ displayValue }}\n </div>\n }\n </div>\n <div class=\"projected-content\" [attr.inert]=\"showProjectedContent ? null : ''\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\n\nimport { RadialProgressComponent } from './radial-progress.component';\n\n@NgModule({\n exports: [RadialProgressComponent],\n imports: [CommonModule, MatProgressSpinnerModule, ButtonComponentModule, RadialProgressComponent],\n})\nexport class RadialProgressComponentModule {}\n"],"mappings":"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"}
|
|
@@ -157,12 +157,15 @@ var ScaleTableComponent = class ScaleTableComponent {
|
|
|
157
157
|
"ariaExpanded",
|
|
158
158
|
"ariaControls",
|
|
159
159
|
"ariaPressed",
|
|
160
|
+
"ariaHasPopup",
|
|
160
161
|
"ariaRequired",
|
|
161
162
|
"ariaLabelledby",
|
|
162
163
|
"ariaDescribedby",
|
|
163
164
|
"preventDefault",
|
|
164
165
|
"hasBackground",
|
|
165
166
|
"circular",
|
|
167
|
+
"isSingleLineLabel",
|
|
168
|
+
"iconButtonShape",
|
|
166
169
|
"tooltipPosition",
|
|
167
170
|
"role",
|
|
168
171
|
"iconFilled",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-scale-table.mjs","names":[],"sources":["../../../components/scale-table/scale-table.component.ts","../../../components/scale-table/scale-table.component.html"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model, 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';\nimport { ScaleComponentModule } from '@testgorilla/tgo-ui/components/scale';\n\nimport { ScaleItem } from './scale-table.model';\n\n@Component({\n selector: 'ui-scale-table',\n templateUrl: './scale-table.component.html',\n styleUrls: ['./scale-table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [UiTranslatePipe, ScaleComponentModule, AsyncPipe, IconComponentModule, ButtonComponentModule],\n host: {\n '[style.--scale-count]': 'scaleCount()',\n },\n})\nexport class ScaleTableComponent {\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof ScaleTableComponent\n */\n public applicationTheme = input<ApplicationTheme>('light');\n\n /**\n *\n * Defines items with their text and it's values\n *\n * @type {ScaleTable}\n * @memberof ScaleTableComponent\n */\n public scaleItems = model.required<ScaleItem[]>();\n\n /**\n *\n * Defines description of scales\n *\n * @type {string[]}\n * @memberof ScaleTableComponent\n */\n public labels = input.required<string[]>();\n public hideBetterExperience = model(false);\n public scaleItemChange = output<{\n item: ScaleItem;\n label: string;\n }>();\n scaleCount = computed(() => this.labels().length);\n\n protected readonly translationContext = 'SCALE_TABLE.';\n\n public select(scaleItemIndex: number, scaleIndex: number): void {\n this.scaleItems.update(items => {\n items[scaleItemIndex].value = scaleIndex;\n this.scaleItemChange.emit({\n item: items[scaleItemIndex],\n label: this.labels()[scaleIndex],\n });\n return [...items];\n });\n }\n}\n","<div class=\"scale-table\">\n <div class=\"better-experience\" [class.hide]=\"hideBetterExperience()\">\n <ui-icon [size]=\"'24'\" [name]=\"'Device-rotate-in-line'\" class=\"mobile-landscape-icon\" />\n <p>{{ 'SCALE_TABLE.ROTATE_DEVICE' | uiTranslate | async }}</p>\n <ui-button\n iconName=\"Close\"\n variant=\"icon-button\"\n size=\"small\"\n [justIcon]=\"true\"\n [tooltip]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n (click)=\"hideBetterExperience.set(true)\"\n />\n </div>\n <!-- Header -->\n <div tabindex=\"0\" [attr.aria-label]=\"'scale header'\" class=\"scale-table-header\">\n @for (label of labels(); track $index) {\n <div\n tabindex=\"0\"\n role=\"heading\"\n [attr.aria-level]=\"3\"\n [attr.aria-label]=\"label + ' as ' + ($index + 1)\"\n class=\"scale-size\"\n >\n {{ label }}\n </div>\n }\n </div>\n <!-- Scale Items -->\n @for (scale of scaleItems(); track scale.text) {\n <div class=\"scale-table-row\" tabindex=\"0\" role=\"radiogroup\" [attr.aria-label]=\"scale.text\">\n <div class=\"scale-text\">{{ scale.text }}</div>\n <ui-scale\n [selectedIndex]=\"scale.value ?? null\"\n [length]=\"scale.length ?? labels().length\"\n [applicationTheme]=\"applicationTheme()\"\n (selectedIndexChange)=\"select($index, $event)\"\n />\n </div>\n }\n</div>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-scale-table.mjs","names":[],"sources":["../../../components/scale-table/scale-table.component.ts","../../../components/scale-table/scale-table.component.html"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model, 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';\nimport { ScaleComponentModule } from '@testgorilla/tgo-ui/components/scale';\n\nimport { ScaleItem } from './scale-table.model';\n\n@Component({\n selector: 'ui-scale-table',\n templateUrl: './scale-table.component.html',\n styleUrls: ['./scale-table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [UiTranslatePipe, ScaleComponentModule, AsyncPipe, IconComponentModule, ButtonComponentModule],\n host: {\n '[style.--scale-count]': 'scaleCount()',\n },\n})\nexport class ScaleTableComponent {\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof ScaleTableComponent\n */\n public applicationTheme = input<ApplicationTheme>('light');\n\n /**\n *\n * Defines items with their text and it's values\n *\n * @type {ScaleTable}\n * @memberof ScaleTableComponent\n */\n public scaleItems = model.required<ScaleItem[]>();\n\n /**\n *\n * Defines description of scales\n *\n * @type {string[]}\n * @memberof ScaleTableComponent\n */\n public labels = input.required<string[]>();\n public hideBetterExperience = model(false);\n public scaleItemChange = output<{\n item: ScaleItem;\n label: string;\n }>();\n scaleCount = computed(() => this.labels().length);\n\n protected readonly translationContext = 'SCALE_TABLE.';\n\n public select(scaleItemIndex: number, scaleIndex: number): void {\n this.scaleItems.update(items => {\n items[scaleItemIndex].value = scaleIndex;\n this.scaleItemChange.emit({\n item: items[scaleItemIndex],\n label: this.labels()[scaleIndex],\n });\n return [...items];\n });\n }\n}\n","<div class=\"scale-table\">\n <div class=\"better-experience\" [class.hide]=\"hideBetterExperience()\">\n <ui-icon [size]=\"'24'\" [name]=\"'Device-rotate-in-line'\" class=\"mobile-landscape-icon\" />\n <p>{{ 'SCALE_TABLE.ROTATE_DEVICE' | uiTranslate | async }}</p>\n <ui-button\n iconName=\"Close\"\n variant=\"icon-button\"\n size=\"small\"\n [justIcon]=\"true\"\n [tooltip]=\"('COMMON.CLOSE' | uiTranslate | async)!\"\n (click)=\"hideBetterExperience.set(true)\"\n />\n </div>\n <!-- Header -->\n <div tabindex=\"0\" [attr.aria-label]=\"'scale header'\" class=\"scale-table-header\">\n @for (label of labels(); track $index) {\n <div\n tabindex=\"0\"\n role=\"heading\"\n [attr.aria-level]=\"3\"\n [attr.aria-label]=\"label + ' as ' + ($index + 1)\"\n class=\"scale-size\"\n >\n {{ label }}\n </div>\n }\n </div>\n <!-- Scale Items -->\n @for (scale of scaleItems(); track scale.text) {\n <div class=\"scale-table-row\" tabindex=\"0\" role=\"radiogroup\" [attr.aria-label]=\"scale.text\">\n <div class=\"scale-text\">{{ scale.text }}</div>\n <ui-scale\n [selectedIndex]=\"scale.value ?? null\"\n [length]=\"scale.length ?? labels().length\"\n [applicationTheme]=\"applicationTheme()\"\n (selectedIndexChange)=\"select($index, $event)\"\n />\n </div>\n }\n</div>\n"],"mappings":"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"}
|