@muxima-ui/core 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +11 -0
  2. package/fesm2022/muxima-ui-core-alert.mjs +5 -3
  3. package/fesm2022/muxima-ui-core-alert.mjs.map +1 -1
  4. package/fesm2022/muxima-ui-core-breadcrumb.mjs +5 -3
  5. package/fesm2022/muxima-ui-core-breadcrumb.mjs.map +1 -1
  6. package/fesm2022/muxima-ui-core-carousel.mjs +19 -17
  7. package/fesm2022/muxima-ui-core-carousel.mjs.map +1 -1
  8. package/fesm2022/muxima-ui-core-chips.mjs +19 -14
  9. package/fesm2022/muxima-ui-core-chips.mjs.map +1 -1
  10. package/fesm2022/muxima-ui-core-clipboard.mjs +10 -6
  11. package/fesm2022/muxima-ui-core-clipboard.mjs.map +1 -1
  12. package/fesm2022/muxima-ui-core-color-picker.mjs +53 -50
  13. package/fesm2022/muxima-ui-core-color-picker.mjs.map +1 -1
  14. package/fesm2022/muxima-ui-core-combobox.mjs +15 -12
  15. package/fesm2022/muxima-ui-core-combobox.mjs.map +1 -1
  16. package/fesm2022/muxima-ui-core-command.mjs +21 -16
  17. package/fesm2022/muxima-ui-core-command.mjs.map +1 -1
  18. package/fesm2022/muxima-ui-core-data-grid.mjs +50 -52
  19. package/fesm2022/muxima-ui-core-data-grid.mjs.map +1 -1
  20. package/fesm2022/muxima-ui-core-date-picker.mjs +97 -69
  21. package/fesm2022/muxima-ui-core-date-picker.mjs.map +1 -1
  22. package/fesm2022/muxima-ui-core-editor.mjs +25 -19
  23. package/fesm2022/muxima-ui-core-editor.mjs.map +1 -1
  24. package/fesm2022/muxima-ui-core-file-upload.mjs +30 -25
  25. package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -1
  26. package/fesm2022/muxima-ui-core-i18n.mjs +550 -0
  27. package/fesm2022/muxima-ui-core-i18n.mjs.map +1 -0
  28. package/fesm2022/muxima-ui-core-image-cropper.mjs +27 -24
  29. package/fesm2022/muxima-ui-core-image-cropper.mjs.map +1 -1
  30. package/fesm2022/muxima-ui-core-kanban.mjs +22 -19
  31. package/fesm2022/muxima-ui-core-kanban.mjs.map +1 -1
  32. package/fesm2022/muxima-ui-core-notification-center.mjs +41 -36
  33. package/fesm2022/muxima-ui-core-notification-center.mjs.map +1 -1
  34. package/fesm2022/muxima-ui-core-pagination.mjs +29 -26
  35. package/fesm2022/muxima-ui-core-pagination.mjs.map +1 -1
  36. package/fesm2022/muxima-ui-core-progress.mjs +5 -3
  37. package/fesm2022/muxima-ui-core-progress.mjs.map +1 -1
  38. package/fesm2022/muxima-ui-core-rating.mjs +12 -8
  39. package/fesm2022/muxima-ui-core-rating.mjs.map +1 -1
  40. package/fesm2022/muxima-ui-core-select.mjs +14 -11
  41. package/fesm2022/muxima-ui-core-select.mjs.map +1 -1
  42. package/fesm2022/muxima-ui-core-sidebar.mjs +10 -7
  43. package/fesm2022/muxima-ui-core-sidebar.mjs.map +1 -1
  44. package/fesm2022/muxima-ui-core-slider.mjs +8 -6
  45. package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
  46. package/fesm2022/muxima-ui-core-stepper.mjs +5 -3
  47. package/fesm2022/muxima-ui-core-stepper.mjs.map +1 -1
  48. package/fesm2022/muxima-ui-core-table.mjs +4 -4
  49. package/fesm2022/muxima-ui-core-table.mjs.map +1 -1
  50. package/fesm2022/muxima-ui-core-time-picker.mjs +7 -5
  51. package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -1
  52. package/fesm2022/muxima-ui-core-toast.mjs +8 -5
  53. package/fesm2022/muxima-ui-core-toast.mjs.map +1 -1
  54. package/fesm2022/muxima-ui-core-tour.mjs +10 -11
  55. package/fesm2022/muxima-ui-core-tour.mjs.map +1 -1
  56. package/fesm2022/muxima-ui-core.mjs +1 -1
  57. package/fesm2022/muxima-ui-core.mjs.map +1 -1
  58. package/package.json +6 -2
  59. package/styles/components/data-grid.css +1 -0
  60. package/types/muxima-ui-core-alert.d.ts +3 -1
  61. package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
  62. package/types/muxima-ui-core-carousel.d.ts +4 -2
  63. package/types/muxima-ui-core-chips.d.ts +23 -3
  64. package/types/muxima-ui-core-clipboard.d.ts +6 -3
  65. package/types/muxima-ui-core-color-picker.d.ts +40 -7
  66. package/types/muxima-ui-core-combobox.d.ts +6 -3
  67. package/types/muxima-ui-core-command.d.ts +7 -3
  68. package/types/muxima-ui-core-data-grid.d.ts +31 -11
  69. package/types/muxima-ui-core-date-picker.d.ts +59 -14
  70. package/types/muxima-ui-core-editor.d.ts +13 -2
  71. package/types/muxima-ui-core-file-upload.d.ts +22 -6
  72. package/types/muxima-ui-core-i18n.d.ts +322 -0
  73. package/types/muxima-ui-core-image-cropper.d.ts +19 -6
  74. package/types/muxima-ui-core-kanban.d.ts +16 -3
  75. package/types/muxima-ui-core-notification-center.d.ts +30 -8
  76. package/types/muxima-ui-core-pagination.d.ts +16 -1
  77. package/types/muxima-ui-core-progress.d.ts +10 -8
  78. package/types/muxima-ui-core-rating.d.ts +6 -2
  79. package/types/muxima-ui-core-select.d.ts +6 -3
  80. package/types/muxima-ui-core-sidebar.d.ts +6 -3
  81. package/types/muxima-ui-core-slider.d.ts +4 -2
  82. package/types/muxima-ui-core-stepper.d.ts +10 -8
  83. package/types/muxima-ui-core-table.d.ts +3 -3
  84. package/types/muxima-ui-core-time-picker.d.ts +3 -1
  85. package/types/muxima-ui-core-toast.d.ts +3 -0
  86. package/types/muxima-ui-core-tour.d.ts +6 -1
  87. package/types/muxima-ui-core.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"muxima-ui-core-chips.mjs","sources":["../../../projects/core/chips/chips.ts","../../../projects/core/chips/muxima-ui-core-chips.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Injector,\n afterNextRender,\n Component,\n Directive,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { MX_FORM_FIELD_CONTROL, MxFormField, MxFormFieldControl, mxUniqueId } from '@muxima-ui/core/form-field';\n\n/**\n * Etiqueta curta, opcionalmente com botão para remover.\n *\n * ```html\n * <mx-chip>Luanda</mx-chip>\n * <mx-chip removable (removed)=\"tirar('Luanda')\">Luanda</mx-chip>\n * ```\n *\n * O botão de remover chama-se \"Remover Luanda\" (o texto do chip). Em listas, põe os chips num\n * `<ul>` com `<li>`, para o leitor de ecrã dizer quantos são.\n */\n@Component({\n selector: 'mx-chip',\n exportAs: 'mxChip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-chip',\n '[attr.data-variant]': 'variant() === \"default\" ? null : variant()',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n template: `\n <span class=\"mx-chip-label\" #label><ng-content /></span>\n @if (removable()) {\n <button type=\"button\" class=\"mx-chip-remove\" [disabled]=\"disabled()\" [attr.aria-label]=\"removeLabel() + ' ' + text()\" (click)=\"removed.emit()\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4.5 4.5l7 7M11.5 4.5l-7 7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" /></svg>\n </button>\n }\n `,\n})\nexport class MxChip {\n readonly removable = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly variant = input<'default' | 'outline' | 'accent'>('default');\n readonly size = input<'sm' | 'md'>('md');\n /** Verbo do botão de remover, seguido do texto do chip. */\n readonly removeLabel = input('Remover');\n readonly removed = output<void>();\n\n private readonly label = viewChild.required<ElementRef<HTMLElement>>('label');\n protected readonly text = signal('');\n\n constructor() {\n afterRenderEffect({ read: () => this.text.set(this.label().nativeElement.textContent?.trim() ?? '') });\n }\n\n /** Põe o foco no botão de remover (usado pelo MxTagInput). */\n focusRemove(): void {\n this.label().nativeElement.parentElement?.querySelector<HTMLButtonElement>('.mx-chip-remove')?.focus();\n }\n}\n\n/**\n * Chip que liga e desliga, para filtros. É um `<button>` com aria-pressed.\n *\n * ```html\n * <div role=\"group\" aria-label=\"Estado\">\n * <button mxChipToggle [(selected)]=\"soPagas\">Pagas</button>\n * </div>\n * ```\n */\n@Directive({\n selector: 'button[mxChipToggle]',\n exportAs: 'mxChipToggle',\n host: {\n class: 'mx-chip mx-chip-toggle',\n type: 'button',\n '[attr.aria-pressed]': 'selected()',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '(click)': 'selected.set(!selected())',\n },\n})\nexport class MxChipToggle {\n readonly selected = model(false);\n readonly size = input<'sm' | 'md'>('md');\n}\n\n/**\n * Campo de etiquetas: escreve-se e Enter (ou vírgula) acrescenta; Backspace no campo vazio\n * vai para a última etiqueta. O valor é `string[]`.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Destinatários</label>\n * <mx-tag-input formControlName=\"emails\" placeholder=\"Escreve e carrega Enter\" />\n * </mx-form-field>\n * ```\n *\n * Cada etiqueta acrescentada ou removida é anunciada pelo leitor de ecrã.\n */\n@Component({\n selector: 'mx-tag-input',\n exportAs: 'mxTagInput',\n imports: [MxChip],\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxTagInput }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-tag-input',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.aria-label]': 'null',\n '(click)': 'focusInput($event)',\n },\n template: `\n @if (tags().length) {\n <ul class=\"mx-tag-input-list\" [attr.aria-label]=\"listLabel()\">\n @for (t of tags(); track t; let i = $index) {\n <li>\n <mx-chip size=\"sm\" [removable]=\"!isDisabled()\" (removed)=\"remove(i)\" (keydown)=\"onChipKey($event, i)\">{{ t }}</mx-chip>\n </li>\n }\n </ul>\n }\n <input\n #input\n class=\"mx-tag-input-field\"\n type=\"text\"\n autocomplete=\"off\"\n [id]=\"controlId()\"\n [placeholder]=\"tags().length ? '' : placeholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"draft()\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n (input)=\"draft.set($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n (paste)=\"onPaste($event)\"\n />\n <span class=\"mx-visually-hidden\" [id]=\"helpId\">{{ helpText() }}</span>\n `,\n})\nexport class MxTagInput implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<string[]>([]);\n readonly placeholder = input('');\n /** Teclas que acrescentam a etiqueta, além de Enter. */\n readonly separators = input<string[]>([',', ';']);\n readonly maxTags = input(Infinity, { transform: numberAttribute });\n readonly allowDuplicates = input(false, { transform: booleanAttribute });\n /** Valida cada etiqueta antes de a acrescentar (ex.: email). Devolve a mensagem de erro ou null. */\n readonly validate = input<(tag: string) => string | null>(() => null);\n /** Nome da lista para o leitor de ecrã. */\n readonly listLabel = input('Etiquetas');\n readonly helpText = input('Enter para acrescentar. Backspace no campo vazio vai para a última etiqueta.');\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly id = input<string | undefined>(undefined);\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n /** Emite a etiqueta rejeitada por `validate`, duplicada ou acima do máximo. */\n readonly rejected = output<{ tag: string; reason: string }>();\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly announcer = inject(LiveAnnouncer);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly injector = inject(Injector);\n\n private readonly generatedId = mxUniqueId('mx-tag-input');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n protected readonly helpId = mxUniqueId('mx-tag-help');\n protected readonly draft = signal('');\n protected readonly tags = computed(() => this.value() ?? []);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n protected readonly describedBy = computed(() => [this.field?.describedBy(), this.helpId].filter(Boolean).join(' '));\n\n private onChange: (value: string[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n /** Acrescenta uma etiqueta. Devolve false se foi rejeitada. */\n add(raw: string): boolean {\n const tag = raw.trim();\n if (!tag) return false;\n const reject = (reason: string) => {\n this.rejected.emit({ tag, reason });\n this.announcer.announce(reason, 'assertive');\n return false;\n };\n if (this.tags().length >= this.maxTags()) return reject(`Máximo de ${this.maxTags()} etiquetas.`);\n if (!this.allowDuplicates() && this.tags().some((t) => t.toLocaleLowerCase() === tag.toLocaleLowerCase())) return reject(`${tag} já está na lista.`);\n const error = this.validate()(tag);\n if (error) return reject(error);\n this.update([...this.tags(), tag]);\n this.announcer.announce(`${tag} acrescentado.`);\n return true;\n }\n\n remove(index: number): void {\n const tag = this.tags()[index];\n this.update(this.tags().filter((_, i) => i !== index));\n this.announcer.announce(`${tag} removido.`);\n // o foco passa para a etiqueta seguinte, ou para o campo\n afterNextRender(() => {\n const chips = this.host.querySelectorAll<HTMLElement>('.mx-chip-remove');\n (chips[Math.min(index, chips.length - 1)] ?? this.input().nativeElement).focus();\n }, { injector: this.injector });\n }\n\n private update(tags: string[]): void {\n this.value.set(tags);\n this.onChange(tags);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const el = event.target as HTMLInputElement;\n if (event.key === 'Enter' || this.separators().includes(event.key)) {\n if (!this.draft().trim()) {\n if (event.key !== 'Enter') event.preventDefault();\n return;\n }\n event.preventDefault();\n if (this.add(this.draft())) this.clearDraft();\n } else if (event.key === 'Backspace' && !el.value && this.tags().length) {\n event.preventDefault();\n this.host.querySelectorAll<HTMLElement>('.mx-chip-remove')[this.tags().length - 1]?.focus();\n }\n }\n\n private clearDraft(): void {\n this.draft.set('');\n // o binding [value] pode não ter visto o texto escrito: limpa o elemento\n this.input().nativeElement.value = '';\n }\n\n protected onChipKey(event: KeyboardEvent, index: number): void {\n const removes = this.host.querySelectorAll<HTMLElement>('.mx-chip-remove');\n if (event.key === 'Backspace' || event.key === 'Delete') {\n event.preventDefault();\n this.remove(index);\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n removes[Math.max(index - 1, 0)]?.focus();\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n (removes[index + 1] ?? this.input().nativeElement).focus();\n }\n }\n\n protected onPaste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text') ?? '';\n const parts = text.split(new RegExp(`[\\\\n${this.separators().map((s) => '\\\\' + s).join('')}]`)).filter((p) => p.trim());\n if (parts.length > 1) {\n event.preventDefault();\n parts.forEach((p) => this.add(p));\n }\n }\n\n protected onBlur(): void {\n if (this.draft().trim() && this.add(this.draft())) this.clearDraft();\n this.onTouched();\n }\n\n protected focusInput(event: MouseEvent): void {\n if (!(event.target as HTMLElement).closest('button, input')) this.input().nativeElement.focus();\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const c = this.ngControl;\n return !!c && !!c.invalid && !!(c.touched || c.dirty);\n }\n isRequired(): boolean {\n return this.required() || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n // ---- ControlValueAccessor ----\n writeValue(value: string[] | null): void {\n this.value.set(value ?? []);\n }\n registerOnChange(fn: (value: string[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"muxima-ui-core-chips.mjs","sources":["../../../projects/core/chips/chips.ts","../../../projects/core/chips/muxima-ui-core-chips.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Injector,\n afterNextRender,\n Component,\n Directive,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { MX_FORM_FIELD_CONTROL, MxFormField, MxFormFieldControl, mxUniqueId } from '@muxima-ui/core/form-field';\n\n/**\n * Etiqueta curta, opcionalmente com botão para remover.\n *\n * ```html\n * <mx-chip>Luanda</mx-chip>\n * <mx-chip removable (removed)=\"tirar('Luanda')\">Luanda</mx-chip>\n * ```\n *\n * O botão de remover chama-se \"Remover Luanda\" (o texto do chip). Em listas, põe os chips num\n * `<ul>` com `<li>`, para o leitor de ecrã dizer quantos são.\n */\n@Component({\n selector: 'mx-chip',\n exportAs: 'mxChip',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-chip',\n '[attr.data-variant]': 'variant() === \"default\" ? null : variant()',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n template: `\n <span class=\"mx-chip-label\" #label><ng-content /></span>\n @if (removable()) {\n <button type=\"button\" class=\"mx-chip-remove\" [disabled]=\"disabled()\" [attr.aria-label]=\"(removeLabel() ?? msg().remove) + ' ' + text()\" (click)=\"removed.emit()\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4.5 4.5l7 7M11.5 4.5l-7 7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" /></svg>\n </button>\n }\n `,\n})\nexport class MxChip {\n readonly removable = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly variant = input<'default' | 'outline' | 'accent'>('default');\n readonly size = input<'sm' | 'md'>('md');\n /** Verbo do botão de remover, seguido do texto do chip. */\n readonly removeLabel = input<string>();\n readonly removed = output<void>();\n protected readonly msg = computed(() => this.i18n().chips);\n private readonly i18n = injectMxMessages();\n\n private readonly label = viewChild.required<ElementRef<HTMLElement>>('label');\n protected readonly text = signal('');\n\n constructor() {\n afterRenderEffect({ read: () => this.text.set(this.label().nativeElement.textContent?.trim() ?? '') });\n }\n\n /** Põe o foco no botão de remover (usado pelo MxTagInput). */\n focusRemove(): void {\n this.label().nativeElement.parentElement?.querySelector<HTMLButtonElement>('.mx-chip-remove')?.focus();\n }\n}\n\n/**\n * Chip que liga e desliga, para filtros. É um `<button>` com aria-pressed.\n *\n * ```html\n * <div role=\"group\" aria-label=\"Estado\">\n * <button mxChipToggle [(selected)]=\"soPagas\">Pagas</button>\n * </div>\n * ```\n */\n@Directive({\n selector: 'button[mxChipToggle]',\n exportAs: 'mxChipToggle',\n host: {\n class: 'mx-chip mx-chip-toggle',\n type: 'button',\n '[attr.aria-pressed]': 'selected()',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '(click)': 'selected.set(!selected())',\n },\n})\nexport class MxChipToggle {\n readonly selected = model(false);\n readonly size = input<'sm' | 'md'>('md');\n}\n\n/**\n * Campo de etiquetas: escreve-se e Enter (ou vírgula) acrescenta; Backspace no campo vazio\n * vai para a última etiqueta. O valor é `string[]`.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Destinatários</label>\n * <mx-tag-input formControlName=\"emails\" placeholder=\"Escreve e carrega Enter\" />\n * </mx-form-field>\n * ```\n *\n * Cada etiqueta acrescentada ou removida é anunciada pelo leitor de ecrã.\n */\n@Component({\n selector: 'mx-tag-input',\n exportAs: 'mxTagInput',\n imports: [MxChip],\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxTagInput }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-tag-input',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.aria-label]': 'null',\n '(click)': 'focusInput($event)',\n },\n template: `\n @if (tags().length) {\n <ul class=\"mx-tag-input-list\" [attr.aria-label]=\"listLabel() ?? msg().list\">\n @for (t of tags(); track t; let i = $index) {\n <li>\n <mx-chip size=\"sm\" [removable]=\"!isDisabled()\" (removed)=\"remove(i)\" (keydown)=\"onChipKey($event, i)\">{{ t }}</mx-chip>\n </li>\n }\n </ul>\n }\n <input\n #input\n class=\"mx-tag-input-field\"\n type=\"text\"\n autocomplete=\"off\"\n [id]=\"controlId()\"\n [placeholder]=\"tags().length ? '' : placeholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"draft()\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n (input)=\"draft.set($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n (paste)=\"onPaste($event)\"\n />\n <span class=\"mx-visually-hidden\" [id]=\"helpId\">{{ helpText() ?? msg().help }}</span>\n `,\n})\nexport class MxTagInput implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<string[]>([]);\n readonly placeholder = input('');\n /** Teclas que acrescentam a etiqueta, além de Enter. */\n readonly separators = input<string[]>([',', ';']);\n readonly maxTags = input(Infinity, { transform: numberAttribute });\n readonly allowDuplicates = input(false, { transform: booleanAttribute });\n /** Valida cada etiqueta antes de a acrescentar (ex.: email). Devolve a mensagem de erro ou null. */\n readonly validate = input<(tag: string) => string | null>(() => null);\n /** Nome da lista para o leitor de ecrã. */\n readonly listLabel = input<string>();\n readonly helpText = input<string>();\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly id = input<string | undefined>(undefined);\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n /** Emite a etiqueta rejeitada por `validate`, duplicada ou acima do máximo. */\n readonly rejected = output<{ tag: string; reason: string }>();\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly announcer = inject(LiveAnnouncer);\n private readonly i18n = injectMxMessages();\n protected readonly msg = computed(() => this.i18n().chips);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly injector = inject(Injector);\n\n private readonly generatedId = mxUniqueId('mx-tag-input');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n protected readonly helpId = mxUniqueId('mx-tag-help');\n protected readonly draft = signal('');\n protected readonly tags = computed(() => this.value() ?? []);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n protected readonly describedBy = computed(() => [this.field?.describedBy(), this.helpId].filter(Boolean).join(' '));\n\n private onChange: (value: string[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n /** Acrescenta uma etiqueta. Devolve false se foi rejeitada. */\n add(raw: string): boolean {\n const tag = raw.trim();\n if (!tag) return false;\n const reject = (reason: string) => {\n this.rejected.emit({ tag, reason });\n this.announcer.announce(reason, 'assertive');\n return false;\n };\n if (this.tags().length >= this.maxTags()) return reject(this.msg().max(this.maxTags()));\n if (!this.allowDuplicates() && this.tags().some((t) => t.toLocaleLowerCase() === tag.toLocaleLowerCase())) return reject(this.msg().duplicate(tag));\n const error = this.validate()(tag);\n if (error) return reject(error);\n this.update([...this.tags(), tag]);\n this.announcer.announce(this.msg().added(tag));\n return true;\n }\n\n remove(index: number): void {\n const tag = this.tags()[index];\n this.update(this.tags().filter((_, i) => i !== index));\n this.announcer.announce(this.msg().removed(tag));\n // o foco passa para a etiqueta seguinte, ou para o campo\n afterNextRender(() => {\n const chips = this.host.querySelectorAll<HTMLElement>('.mx-chip-remove');\n (chips[Math.min(index, chips.length - 1)] ?? this.input().nativeElement).focus();\n }, { injector: this.injector });\n }\n\n private update(tags: string[]): void {\n this.value.set(tags);\n this.onChange(tags);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const el = event.target as HTMLInputElement;\n if (event.key === 'Enter' || this.separators().includes(event.key)) {\n if (!this.draft().trim()) {\n if (event.key !== 'Enter') event.preventDefault();\n return;\n }\n event.preventDefault();\n if (this.add(this.draft())) this.clearDraft();\n } else if (event.key === 'Backspace' && !el.value && this.tags().length) {\n event.preventDefault();\n this.host.querySelectorAll<HTMLElement>('.mx-chip-remove')[this.tags().length - 1]?.focus();\n }\n }\n\n private clearDraft(): void {\n this.draft.set('');\n // o binding [value] pode não ter visto o texto escrito: limpa o elemento\n this.input().nativeElement.value = '';\n }\n\n protected onChipKey(event: KeyboardEvent, index: number): void {\n const removes = this.host.querySelectorAll<HTMLElement>('.mx-chip-remove');\n if (event.key === 'Backspace' || event.key === 'Delete') {\n event.preventDefault();\n this.remove(index);\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n removes[Math.max(index - 1, 0)]?.focus();\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n (removes[index + 1] ?? this.input().nativeElement).focus();\n }\n }\n\n protected onPaste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text') ?? '';\n const parts = text.split(new RegExp(`[\\\\n${this.separators().map((s) => '\\\\' + s).join('')}]`)).filter((p) => p.trim());\n if (parts.length > 1) {\n event.preventDefault();\n parts.forEach((p) => this.add(p));\n }\n }\n\n protected onBlur(): void {\n if (this.draft().trim() && this.add(this.draft())) this.clearDraft();\n this.onTouched();\n }\n\n protected focusInput(event: MouseEvent): void {\n if (!(event.target as HTMLElement).closest('button, input')) this.input().nativeElement.focus();\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const c = this.ngControl;\n return !!c && !!c.invalid && !!(c.touched || c.dirty);\n }\n isRequired(): boolean {\n return this.required() || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n // ---- ControlValueAccessor ----\n writeValue(value: string[] | null): void {\n this.value.set(value ?? []);\n }\n registerOnChange(fn: (value: string[]) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAwBA;;;;;;;;;;AAUG;MAqBU,MAAM,CAAA;IACR,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACzD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACxD,IAAA,OAAO,GAAG,KAAK,CAAmC,SAAS,8EAAC;AAC5D,IAAA,IAAI,GAAG,KAAK,CAAc,IAAI,2EAAC;;IAE/B,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC7B,OAAO,GAAG,MAAM,EAAQ;AACd,IAAA,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,0EAAC;IACzC,IAAI,GAAG,gBAAgB,EAAE;AAEzB,IAAA,KAAK,GAAG,SAAS,CAAC,QAAQ,CAA0B,OAAO,CAAC;AAC1D,IAAA,IAAI,GAAG,MAAM,CAAC,EAAE,2EAAC;AAEpC,IAAA,WAAA,GAAA;AACE,QAAA,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACxG;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAoB,iBAAiB,CAAC,EAAE,KAAK,EAAE;IACxG;wGArBW,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,8CAAA,EAAA,gBAAA,EAAA,mCAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,EAAA,cAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EATP;;;;;;;AAOT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAEU,MAAM,EAAA,UAAA,EAAA,CAAA;kBApBlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,qBAAqB,EAAE,4CAA4C;AACnE,wBAAA,kBAAkB,EAAE,iCAAiC;AACrD,wBAAA,sBAAsB,EAAE,wBAAwB;AACjD,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;AAOT,EAAA,CAAA;AACF,iBAAA;8mBAYsE,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;AAa9E;;;;;;;;AAQG;MAYU,YAAY,CAAA;AACd,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,IAAI,GAAG,KAAK,CAAc,IAAI,2EAAC;wGAF7B,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,2BAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,mCAAA,EAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAXxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,wBAAwB;AAC/B,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,qBAAqB,EAAE,YAAY;AACnC,wBAAA,kBAAkB,EAAE,iCAAiC;AACrD,wBAAA,SAAS,EAAE,2BAA2B;AACvC,qBAAA;AACF,iBAAA;;AAMD;;;;;;;;;;;;AAYG;MA+CU,UAAU,CAAA;AACZ,IAAA,KAAK,GAAG,KAAK,CAAW,EAAE,4EAAC;AAC3B,IAAA,WAAW,GAAG,KAAK,CAAC,EAAE,kFAAC;;IAEvB,UAAU,GAAG,KAAK,CAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IACxC,OAAO,GAAG,KAAK,CAAC,QAAQ,+EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IACzD,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAE/D,QAAQ,GAAG,KAAK,CAAiC,MAAM,IAAI,+EAAC;;IAE5D,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC3B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC1B,IAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,2EAAC;IACtC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACvD,IAAA,EAAE,GAAG,KAAK,CAAqB,SAAS,yEAAC;IACzC,SAAS,GAAG,KAAK,CAAqB,SAAS,iFAAI,KAAK,EAAE,YAAY,EAAA,CAAG;;IAEzE,QAAQ,GAAG,MAAM,EAAmC;IAE1C,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjD,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC7D,IAAA,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;IACjC,IAAI,GAAG,gBAAgB,EAAE;AACvB,IAAA,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,0EAAC;AACzC,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC,aAAa;AAChE,IAAA,KAAK,GAAG,SAAS,CAAC,QAAQ,CAA+B,OAAO,CAAC;AACjE,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE3B,IAAA,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC;AAChD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,WAAW,gFAAC;AAC/C,IAAA,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC;AAClC,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,2EAAC;AAC3C,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC1B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,iFAAC;AACnE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kFAAC;AAE3G,IAAA,QAAQ,GAA8B,MAAK,EAAE,CAAC;AAC9C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAExC,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;;AAGA,IAAA,GAAG,CAAC,GAAW,EAAA;AACb,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AACtB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;AACtB,QAAA,MAAM,MAAM,GAAG,CAAC,MAAc,KAAI;YAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;AAC5C,YAAA,OAAO,KAAK;AACd,QAAA,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,KAAK,GAAG,CAAC,iBAAiB,EAAE,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnJ,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC;AAClC,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9C,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;QAEhD,eAAe,CAAC,MAAK;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,iBAAiB,CAAC;YACxE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE;QAClF,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjC;AAEQ,IAAA,MAAM,CAAC,IAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAA0B;AAC3C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAClE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;AACxB,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;oBAAE,KAAK,CAAC,cAAc,EAAE;gBACjD;YACF;YACA,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAE,IAAI,CAAC,UAAU,EAAE;QAC/C;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;QAC7F;IACF;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;;QAElB,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;IACvC;IAEU,SAAS,CAAC,KAAoB,EAAE,KAAa,EAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,iBAAiB,CAAC;AAC1E,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACvD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACpB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YACpC,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;QAC1C;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE;YACrC,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE;QAC5D;IACF;AAEU,IAAA,OAAO,CAAC,KAAqB,EAAA;AACrC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACvH,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC;IACF;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAE,IAAI,CAAC,UAAU,EAAE;QACpE,IAAI,CAAC,SAAS,EAAE;IAClB;AAEU,IAAA,UAAU,CAAC,KAAiB,EAAA;QACpC,IAAI,CAAE,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IACjG;;IAGA,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,IAAI;AAC/B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS;QACxB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACvD;IACA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC;IAC1F;;AAGA,IAAA,UAAU,CAAC,KAAsB,EAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B;AACA,IAAA,gBAAgB,CAAC,EAA6B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AACA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;wGA3JW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,mCAAA,EAAA,mBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EA1CV,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAW9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA1GU,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FA4GN,UAAU,EAAA,UAAA,EAAA,CAAA;kBA9CtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,QAAQ,EAAE,YAAY;oBACtB,OAAO,EAAE,CAAC,MAAM,CAAC;oBACjB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAA,UAAY,EAAE,CAAC;oBACxE,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,cAAc;AACrB,wBAAA,kBAAkB,EAAE,iCAAiC;AACrD,wBAAA,qBAAqB,EAAE,0BAA0B;AACjD,wBAAA,sBAAsB,EAAE,0BAA0B;AAClD,wBAAA,mBAAmB,EAAE,MAAM;AAC3B,wBAAA,SAAS,EAAE,oBAAoB;AAChC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BT,EAAA,CAAA;AACF,iBAAA;6/CA4B2E,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC9LnF;;AAEG;;"}
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { input, output, inject, signal, DestroyRef, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { LiveAnnouncer } from '@angular/cdk/a11y';
4
4
  import { Clipboard } from '@angular/cdk/clipboard';
5
+ import { injectMxMessages } from '@muxima-ui/core/i18n';
5
6
 
6
7
  /**
7
8
  * Copia texto para a área de transferência quando o elemento é clicado.
@@ -14,7 +15,8 @@ import { Clipboard } from '@angular/cdk/clipboard';
14
15
  class MxCopy {
15
16
  text = input.required({ ...(ngDevMode ? { debugName: "text" } : /* istanbul ignore next */ {}), alias: 'mxCopy' });
16
17
  /** Mensagem anunciada ao copiar. */
17
- copiedMessage = input('Copiado', { ...(ngDevMode ? { debugName: "copiedMessage" } : /* istanbul ignore next */ {}), alias: 'mxCopyMessage' });
18
+ copiedMessage = input(undefined, { ...(ngDevMode ? { debugName: "copiedMessage" } : /* istanbul ignore next */ {}), alias: 'mxCopyMessage' });
19
+ i18n = injectMxMessages();
18
20
  copiedChange = output({ alias: 'mxCopied' });
19
21
  clipboard = inject(Clipboard);
20
22
  announcer = inject(LiveAnnouncer);
@@ -27,7 +29,8 @@ class MxCopy {
27
29
  copy() {
28
30
  const ok = this.clipboard.copy(this.text());
29
31
  this.copiedChange.emit(ok);
30
- this.announcer.announce(ok ? this.copiedMessage() : 'Não foi possível copiar', ok ? 'polite' : 'assertive');
32
+ const t = this.i18n().clipboard;
33
+ this.announcer.announce(ok ? (this.copiedMessage() ?? t.copied) : t.failed, ok ? 'polite' : 'assertive');
31
34
  if (ok) {
32
35
  this.copied.set(true);
33
36
  clearTimeout(this.timer);
@@ -58,11 +61,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
58
61
  */
59
62
  class MxCopyButton {
60
63
  copy = inject(MxCopy, { self: true });
61
- label = input('Copiar', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
62
- copiedLabel = input('Copiado', ...(ngDevMode ? [{ debugName: "copiedLabel" }] : /* istanbul ignore next */ []));
64
+ i18n = injectMxMessages();
65
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
66
+ copiedLabel = input(...(ngDevMode ? [undefined, { debugName: "copiedLabel" }] : /* istanbul ignore next */ []));
63
67
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
64
68
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxCopyButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
65
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: MxCopyButton, isStandalone: true, selector: "button[mxCopyButton]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, copiedLabel: { classPropertyName: "copiedLabel", publicName: "copiedLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, properties: { "attr.aria-label": "copy.copied() ? copiedLabel() : label()", "attr.data-size": "size() === \"md\" ? null : size()" }, classAttribute: "mx-copy-button" }, exportAs: ["mxCopyButton"], hostDirectives: [{ directive: MxCopy, inputs: ["mxCopy", "value"], outputs: ["mxCopied", "mxCopied"] }], ngImport: i0, template: `
69
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: MxCopyButton, isStandalone: true, selector: "button[mxCopyButton]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, copiedLabel: { classPropertyName: "copiedLabel", publicName: "copiedLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, properties: { "attr.aria-label": "copy.copied() ? (copiedLabel() ?? i18n().clipboard.copied) : (label() ?? i18n().clipboard.copy)", "attr.data-size": "size() === \"md\" ? null : size()" }, classAttribute: "mx-copy-button" }, exportAs: ["mxCopyButton"], hostDirectives: [{ directive: MxCopy, inputs: ["mxCopy", "value"], outputs: ["mxCopied", "mxCopied"] }], ngImport: i0, template: `
66
70
  @if (copy.copied()) {
67
71
  <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M3.5 8.5l3 3 6-7" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" /></svg>
68
72
  } @else {
@@ -85,7 +89,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
85
89
  host: {
86
90
  class: 'mx-copy-button',
87
91
  type: 'button',
88
- '[attr.aria-label]': 'copy.copied() ? copiedLabel() : label()',
92
+ '[attr.aria-label]': 'copy.copied() ? (copiedLabel() ?? i18n().clipboard.copied) : (label() ?? i18n().clipboard.copy)',
89
93
  '[attr.data-size]': 'size() === "md" ? null : size()',
90
94
  },
91
95
  template: `
@@ -1 +1 @@
1
- {"version":3,"file":"muxima-ui-core-clipboard.mjs","sources":["../../../projects/core/clipboard/clipboard.ts","../../../projects/core/clipboard/muxima-ui-core-clipboard.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ViewEncapsulation, inject, input, output, signal } from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { Clipboard } from '@angular/cdk/clipboard';\n\n/**\n * Copia texto para a área de transferência quando o elemento é clicado.\n * Durante 2 s o elemento fica com data-copied, e \"Copiado\" é anunciado ao leitor de ecrã.\n *\n * ```html\n * <button mxButton variant=\"outline\" [mxCopy]=\"iban\">Copiar IBAN</button>\n * ```\n */\n@Directive({\n selector: '[mxCopy]',\n exportAs: 'mxCopy',\n host: {\n '(click)': 'copy()',\n '[attr.data-copied]': 'copied() ? \"\" : null',\n },\n})\nexport class MxCopy {\n readonly text = input.required<string>({ alias: 'mxCopy' });\n /** Mensagem anunciada ao copiar. */\n readonly copiedMessage = input('Copiado', { alias: 'mxCopyMessage' });\n readonly copiedChange = output<boolean>({ alias: 'mxCopied' });\n\n private readonly clipboard = inject(Clipboard);\n private readonly announcer = inject(LiveAnnouncer);\n readonly copied = signal(false);\n private timer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n /** Copia; devolve false se o navegador recusar. */\n copy(): boolean {\n const ok = this.clipboard.copy(this.text());\n this.copiedChange.emit(ok);\n this.announcer.announce(ok ? this.copiedMessage() : 'Não foi possível copiar', ok ? 'polite' : 'assertive');\n if (ok) {\n this.copied.set(true);\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.copied.set(false), 2000);\n }\n return ok;\n }\n}\n\n/**\n * Botão de ícone que copia um valor. O nome acessível muda para \"Copiado\" durante 2 s.\n *\n * ```html\n * <button mxCopyButton [value]=\"chave\" label=\"Copiar chave da API\"></button>\n * ```\n */\n@Component({\n selector: 'button[mxCopyButton]',\n exportAs: 'mxCopyButton',\n hostDirectives: [{ directive: MxCopy, inputs: ['mxCopy: value'], outputs: ['mxCopied'] }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-copy-button',\n type: 'button',\n '[attr.aria-label]': 'copy.copied() ? copiedLabel() : label()',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n },\n template: `\n @if (copy.copied()) {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3.5 8.5l3 3 6-7\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /></svg>\n } @else {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.3\" />\n <path d=\"M10.5 3.5v-.5A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v5A1.5 1.5 0 0 0 4 9.5h.5\" stroke=\"currentColor\" stroke-width=\"1.3\" />\n </svg>\n }\n <ng-content />\n `,\n})\nexport class MxCopyButton {\n protected readonly copy = inject(MxCopy, { self: true });\n readonly label = input('Copiar');\n readonly copiedLabel = input('Copiado');\n readonly size = input<'sm' | 'md'>('md');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"muxima-ui-core-clipboard.mjs","sources":["../../../projects/core/clipboard/clipboard.ts","../../../projects/core/clipboard/muxima-ui-core-clipboard.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ViewEncapsulation, inject, input, output, signal } from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\n\n/**\n * Copia texto para a área de transferência quando o elemento é clicado.\n * Durante 2 s o elemento fica com data-copied, e \"Copiado\" é anunciado ao leitor de ecrã.\n *\n * ```html\n * <button mxButton variant=\"outline\" [mxCopy]=\"iban\">Copiar IBAN</button>\n * ```\n */\n@Directive({\n selector: '[mxCopy]',\n exportAs: 'mxCopy',\n host: {\n '(click)': 'copy()',\n '[attr.data-copied]': 'copied() ? \"\" : null',\n },\n})\nexport class MxCopy {\n readonly text = input.required<string>({ alias: 'mxCopy' });\n /** Mensagem anunciada ao copiar. */\n readonly copiedMessage = input<string | undefined>(undefined, { alias: 'mxCopyMessage' });\n private readonly i18n = injectMxMessages();\n readonly copiedChange = output<boolean>({ alias: 'mxCopied' });\n\n private readonly clipboard = inject(Clipboard);\n private readonly announcer = inject(LiveAnnouncer);\n readonly copied = signal(false);\n private timer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n /** Copia; devolve false se o navegador recusar. */\n copy(): boolean {\n const ok = this.clipboard.copy(this.text());\n this.copiedChange.emit(ok);\n const t = this.i18n().clipboard;\n this.announcer.announce(ok ? (this.copiedMessage() ?? t.copied) : t.failed, ok ? 'polite' : 'assertive');\n if (ok) {\n this.copied.set(true);\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.copied.set(false), 2000);\n }\n return ok;\n }\n}\n\n/**\n * Botão de ícone que copia um valor. O nome acessível muda para \"Copiado\" durante 2 s.\n *\n * ```html\n * <button mxCopyButton [value]=\"chave\" label=\"Copiar chave da API\"></button>\n * ```\n */\n@Component({\n selector: 'button[mxCopyButton]',\n exportAs: 'mxCopyButton',\n hostDirectives: [{ directive: MxCopy, inputs: ['mxCopy: value'], outputs: ['mxCopied'] }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-copy-button',\n type: 'button',\n '[attr.aria-label]': 'copy.copied() ? (copiedLabel() ?? i18n().clipboard.copied) : (label() ?? i18n().clipboard.copy)',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n },\n template: `\n @if (copy.copied()) {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3.5 8.5l3 3 6-7\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" /></svg>\n } @else {\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.3\" />\n <path d=\"M10.5 3.5v-.5A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v5A1.5 1.5 0 0 0 4 9.5h.5\" stroke=\"currentColor\" stroke-width=\"1.3\" />\n </svg>\n }\n <ng-content />\n `,\n})\nexport class MxCopyButton {\n protected readonly copy = inject(MxCopy, { self: true });\n protected readonly i18n = injectMxMessages();\n readonly label = input<string>();\n readonly copiedLabel = input<string>();\n readonly size = input<'sm' | 'md'>('md');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
+ import { MX_MESSAGES_PT, injectMxMessages } from '@muxima-ui/core/i18n';
1
2
  import * as i0 from '@angular/core';
2
- import { model, input, booleanAttribute, output, viewChild, signal, computed, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, inject, ElementRef } from '@angular/core';
3
+ import { model, input, booleanAttribute, computed, output, viewChild, signal, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, inject, ElementRef } from '@angular/core';
3
4
  import { mxUniqueId, MxFormField, MX_FORM_FIELD_CONTROL } from '@muxima-ui/core/form-field';
4
5
  import { CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
5
6
  import { NgControl, Validators } from '@angular/forms';
@@ -85,37 +86,34 @@ function mxContrast(a, b) {
85
86
  return (l1 + 0.05) / (l2 + 0.05);
86
87
  }
87
88
  const HUES = [
88
- [15, 'vermelho'],
89
- [40, 'laranja'],
90
- [65, 'amarelo'],
91
- [80, 'verde-lima'],
92
- [160, 'verde'],
93
- [195, 'azul-petróleo'],
94
- [250, 'azul'],
95
- [285, 'roxo'],
89
+ [15, 'red'],
90
+ [40, 'orange'],
91
+ [65, 'yellow'],
92
+ [80, 'lime'],
93
+ [160, 'green'],
94
+ [195, 'teal'],
95
+ [250, 'blue'],
96
+ [285, 'purple'],
96
97
  [330, 'magenta'],
97
- [360, 'vermelho'],
98
+ [360, 'red'],
98
99
  ];
99
- /** Nome aproximado da cor em português, para o leitor de ecrã: "azul escuro", "cinzento claro". */
100
- function mxColorName(hex) {
100
+ /**
101
+ * Nome aproximado da cor, para o leitor de ecrã: "azul escuro", "cinzento claro".
102
+ * Por omissão em português; passa `names` para outro idioma (ex.: `MX_MESSAGES_EN.colorPicker.names`).
103
+ */
104
+ function mxColorName(hex, names = MX_MESSAGES_PT.colorPicker.names) {
101
105
  const { h, s, v } = mxHexToHsva(hex);
102
106
  if (v < 0.12)
103
- return 'preto';
107
+ return names.black;
104
108
  if (s < 0.12)
105
- return v > 0.92
106
- ? 'branco'
107
- : v > 0.6
108
- ? 'cinzento claro'
109
- : v > 0.3
110
- ? 'cinzento'
111
- : 'cinzento escuro';
112
- let name = HUES.find(([max]) => h < max)[1];
113
- if (name === 'laranja' && v < 0.6)
114
- name = 'castanho';
109
+ return v > 0.92 ? names.white : v > 0.6 ? names.lightGray : v > 0.3 ? names.gray : names.darkGray;
110
+ let hue = HUES.find(([max]) => h < max)[1];
111
+ if (hue === 'orange' && v < 0.6)
112
+ hue = 'brown';
115
113
  // luminosidade HSL: escuro abaixo de 38%, claro acima de 70%
116
114
  const l = v * (1 - s / 2);
117
- const tone = l < 0.38 ? ' escuro' : l > 0.7 ? ' claro' : '';
118
- return name + tone;
115
+ const name = names[hue];
116
+ return l < 0.38 ? names.tone(name, 'dark') : l > 0.7 ? names.tone(name, 'light') : name;
119
117
  }
120
118
 
121
119
  /**
@@ -139,10 +137,12 @@ class MxColorPanel {
139
137
  /** Só as amostras: uma paleta fechada, sem área nem matiz. */
140
138
  swatchesOnly = input(false, { ...(ngDevMode ? { debugName: "swatchesOnly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
141
139
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
142
- areaLabel = input('Saturação e brilho', ...(ngDevMode ? [{ debugName: "areaLabel" }] : /* istanbul ignore next */ []));
143
- hueLabel = input('Matiz', ...(ngDevMode ? [{ debugName: "hueLabel" }] : /* istanbul ignore next */ []));
144
- alphaLabel = input('Opacidade', ...(ngDevMode ? [{ debugName: "alphaLabel" }] : /* istanbul ignore next */ []));
145
- swatchesLabel = input('Cores sugeridas', ...(ngDevMode ? [{ debugName: "swatchesLabel" }] : /* istanbul ignore next */ []));
140
+ areaLabel = input(...(ngDevMode ? [undefined, { debugName: "areaLabel" }] : /* istanbul ignore next */ []));
141
+ i18n = injectMxMessages();
142
+ msg = computed(() => this.i18n().colorPicker, ...(ngDevMode ? [{ debugName: "msg" }] : /* istanbul ignore next */ []));
143
+ hueLabel = input(...(ngDevMode ? [undefined, { debugName: "hueLabel" }] : /* istanbul ignore next */ []));
144
+ alphaLabel = input(...(ngDevMode ? [undefined, { debugName: "alphaLabel" }] : /* istanbul ignore next */ []));
145
+ swatchesLabel = input(...(ngDevMode ? [undefined, { debugName: "swatchesLabel" }] : /* istanbul ignore next */ []));
146
146
  /** Emite ao largar o rato, escolher amostra ou terminar de escrever (para guardar). */
147
147
  committed = output();
148
148
  area = viewChild.required('area');
@@ -154,14 +154,14 @@ class MxColorPanel {
154
154
  opaque = computed(() => mxHsvaToHex({ ...this.hsva(), a: 1 }), ...(ngDevMode ? [{ debugName: "opaque" }] : /* istanbul ignore next */ []));
155
155
  draft = signal(null, ...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
156
156
  draftInvalid = computed(() => !!this.draft() && !mxParseColor(this.draft()), ...(ngDevMode ? [{ debugName: "draftInvalid" }] : /* istanbul ignore next */ []));
157
- hueName = computed(() => mxColorName(mxHsvaToHex({ h: this.hsva().h, s: 1, v: 1, a: 1 })), ...(ngDevMode ? [{ debugName: "hueName" }] : /* istanbul ignore next */ []));
157
+ hueName = computed(() => mxColorName(mxHsvaToHex({ h: this.hsva().h, s: 1, v: 1, a: 1 }), this.msg().names), ...(ngDevMode ? [{ debugName: "hueName" }] : /* istanbul ignore next */ []));
158
158
  areaText = computed(() => {
159
159
  const c = this.hsva();
160
- return `Saturação ${this.pct(c.s)}%, brilho ${this.pct(c.v)}%, ${mxColorName(this.hex())}`;
160
+ return this.msg().areaValue(this.pct(c.s), this.pct(c.v), mxColorName(this.hex(), this.msg().names));
161
161
  }, ...(ngDevMode ? [{ debugName: "areaText" }] : /* istanbul ignore next */ []));
162
162
  swatchList = computed(() => this.swatches().map((s) => {
163
163
  const color = mxParseColor(typeof s === 'string' ? s : s.color) ?? '#000000';
164
- const label = typeof s === 'string' ? `${mxColorName(color)}, ${color}` : `${s.label}, ${color}`;
164
+ const label = typeof s === 'string' ? `${mxColorName(color, this.msg().names)}, ${color}` : `${s.label}, ${color}`;
165
165
  return { color, label };
166
166
  }), ...(ngDevMode ? [{ debugName: "swatchList" }] : /* istanbul ignore next */ []));
167
167
  constructor() {
@@ -271,7 +271,7 @@ class MxColorPanel {
271
271
  class="mx-color-area-thumb"
272
272
  role="slider"
273
273
  [attr.tabindex]="disabled() ? -1 : 0"
274
- [attr.aria-label]="areaLabel()"
274
+ [attr.aria-label]="(areaLabel() ?? msg().area)"
275
275
  aria-valuemin="0"
276
276
  aria-valuemax="100"
277
277
  [attr.aria-valuenow]="pct(hsva().s)"
@@ -293,8 +293,8 @@ class MxColorPanel {
293
293
  max="359"
294
294
  [value]="round(hsva().h)"
295
295
  [disabled]="disabled()"
296
- [attr.aria-label]="hueLabel()"
297
- [attr.aria-valuetext]="round(hsva().h) + ' graus, ' + hueName()"
296
+ [attr.aria-label]="(hueLabel() ?? msg().hue)"
297
+ [attr.aria-valuetext]="msg().hueValue(round(hsva().h), hueName())"
298
298
  (input)="setHue($event)"
299
299
  />
300
300
  @if (alpha()) {
@@ -305,7 +305,7 @@ class MxColorPanel {
305
305
  max="100"
306
306
  [value]="pct(hsva().a)"
307
307
  [disabled]="disabled()"
308
- [attr.aria-label]="alphaLabel()"
308
+ [attr.aria-label]="(alphaLabel() ?? msg().alpha)"
309
309
  [attr.aria-valuetext]="pct(hsva().a) + '%'"
310
310
  (input)="setAlpha($event)"
311
311
  />
@@ -316,7 +316,7 @@ class MxColorPanel {
316
316
  type="button"
317
317
  class="mx-color-tool"
318
318
  [disabled]="disabled()"
319
- aria-label="Escolher uma cor do ecrã"
319
+ [attr.aria-label]="msg().eyeDropper"
320
320
  (click)="pickFromScreen()"
321
321
  >
322
322
  <svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
@@ -334,7 +334,7 @@ class MxColorPanel {
334
334
 
335
335
  @if (showInput() && !swatchesOnly()) {
336
336
  <div class="mx-color-input-row">
337
- <label class="mx-color-input-label" [for]="inputId">Hex</label>
337
+ <label class="mx-color-input-label" [for]="inputId">{{ msg().hex }}</label>
338
338
  <input
339
339
  class="mx-input mx-color-hex"
340
340
  data-size="sm"
@@ -351,7 +351,7 @@ class MxColorPanel {
351
351
  }
352
352
 
353
353
  @if (swatchList().length) {
354
- <div class="mx-color-swatches" role="group" [attr.aria-label]="swatchesLabel()">
354
+ <div class="mx-color-swatches" role="group" [attr.aria-label]="(swatchesLabel() ?? msg().swatches)">
355
355
  @for (s of swatchList(); track s.color) {
356
356
  <button
357
357
  type="button"
@@ -389,7 +389,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
389
389
  class="mx-color-area-thumb"
390
390
  role="slider"
391
391
  [attr.tabindex]="disabled() ? -1 : 0"
392
- [attr.aria-label]="areaLabel()"
392
+ [attr.aria-label]="(areaLabel() ?? msg().area)"
393
393
  aria-valuemin="0"
394
394
  aria-valuemax="100"
395
395
  [attr.aria-valuenow]="pct(hsva().s)"
@@ -411,8 +411,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
411
411
  max="359"
412
412
  [value]="round(hsva().h)"
413
413
  [disabled]="disabled()"
414
- [attr.aria-label]="hueLabel()"
415
- [attr.aria-valuetext]="round(hsva().h) + ' graus, ' + hueName()"
414
+ [attr.aria-label]="(hueLabel() ?? msg().hue)"
415
+ [attr.aria-valuetext]="msg().hueValue(round(hsva().h), hueName())"
416
416
  (input)="setHue($event)"
417
417
  />
418
418
  @if (alpha()) {
@@ -423,7 +423,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
423
423
  max="100"
424
424
  [value]="pct(hsva().a)"
425
425
  [disabled]="disabled()"
426
- [attr.aria-label]="alphaLabel()"
426
+ [attr.aria-label]="(alphaLabel() ?? msg().alpha)"
427
427
  [attr.aria-valuetext]="pct(hsva().a) + '%'"
428
428
  (input)="setAlpha($event)"
429
429
  />
@@ -434,7 +434,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
434
434
  type="button"
435
435
  class="mx-color-tool"
436
436
  [disabled]="disabled()"
437
- aria-label="Escolher uma cor do ecrã"
437
+ [attr.aria-label]="msg().eyeDropper"
438
438
  (click)="pickFromScreen()"
439
439
  >
440
440
  <svg viewBox="0 0 16 16" fill="none" aria-hidden="true">
@@ -452,7 +452,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
452
452
 
453
453
  @if (showInput() && !swatchesOnly()) {
454
454
  <div class="mx-color-input-row">
455
- <label class="mx-color-input-label" [for]="inputId">Hex</label>
455
+ <label class="mx-color-input-label" [for]="inputId">{{ msg().hex }}</label>
456
456
  <input
457
457
  class="mx-input mx-color-hex"
458
458
  data-size="sm"
@@ -469,7 +469,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
469
469
  }
470
470
 
471
471
  @if (swatchList().length) {
472
- <div class="mx-color-swatches" role="group" [attr.aria-label]="swatchesLabel()">
472
+ <div class="mx-color-swatches" role="group" [attr.aria-label]="(swatchesLabel() ?? msg().swatches)">
473
473
  @for (s of swatchList(); track s.color) {
474
474
  <button
475
475
  type="button"
@@ -507,7 +507,9 @@ class MxColorPicker {
507
507
  alpha = input(false, { ...(ngDevMode ? { debugName: "alpha" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
508
508
  swatches = input([], ...(ngDevMode ? [{ debugName: "swatches" }] : /* istanbul ignore next */ []));
509
509
  placeholder = input('#RRGGBB', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
510
- dialogLabel = input('Escolher cor', ...(ngDevMode ? [{ debugName: "dialogLabel" }] : /* istanbul ignore next */ []));
510
+ dialogLabel = input(...(ngDevMode ? [undefined, { debugName: "dialogLabel" }] : /* istanbul ignore next */ []));
511
+ i18n = injectMxMessages();
512
+ msg = computed(() => this.i18n().colorPicker, ...(ngDevMode ? [{ debugName: "msg" }] : /* istanbul ignore next */ []));
511
513
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
512
514
  required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
513
515
  invalid = input(false, { ...(ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -529,7 +531,8 @@ class MxColorPicker {
529
531
  badFormat = computed(() => !!this.draft() && !mxParseColor(this.draft()), ...(ngDevMode ? [{ debugName: "badFormat" }] : /* istanbul ignore next */ []));
530
532
  toggleLabel = computed(() => {
531
533
  const v = this.value();
532
- return v ? `Mudar cor, ${mxColorName(v)}, ${v}` : 'Escolher cor';
534
+ const t = this.msg();
535
+ return v ? t.change(mxColorName(v, t.names), v) : t.choose;
533
536
  }, ...(ngDevMode ? [{ debugName: "toggleLabel" }] : /* istanbul ignore next */ []));
534
537
  onChange = () => { };
535
538
  onTouched = () => { };
@@ -660,7 +663,7 @@ class MxColorPicker {
660
663
  class="mx-color-picker-panel"
661
664
  role="dialog"
662
665
  aria-modal="false"
663
- [attr.aria-label]="dialogLabel()"
666
+ [attr.aria-label]="(dialogLabel() ?? msg().choose)"
664
667
  #panel
665
668
  >
666
669
  <mx-color-panel
@@ -731,7 +734,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
731
734
  class="mx-color-picker-panel"
732
735
  role="dialog"
733
736
  aria-modal="false"
734
- [attr.aria-label]="dialogLabel()"
737
+ [attr.aria-label]="(dialogLabel() ?? msg().choose)"
735
738
  #panel
736
739
  >
737
740
  <mx-color-panel