@muxima-ui/core 1.4.1 → 2.0.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/README.md +11 -0
- package/fesm2022/muxima-ui-core-alert.mjs +5 -3
- package/fesm2022/muxima-ui-core-alert.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-breadcrumb.mjs +5 -3
- package/fesm2022/muxima-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-carousel.mjs +19 -17
- package/fesm2022/muxima-ui-core-carousel.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-chips.mjs +19 -14
- package/fesm2022/muxima-ui-core-chips.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-clipboard.mjs +10 -6
- package/fesm2022/muxima-ui-core-clipboard.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-color-picker.mjs +53 -50
- package/fesm2022/muxima-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-combobox.mjs +15 -12
- package/fesm2022/muxima-ui-core-combobox.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-command.mjs +21 -16
- package/fesm2022/muxima-ui-core-command.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-data-grid.mjs +50 -52
- package/fesm2022/muxima-ui-core-data-grid.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-date-picker.mjs +102 -69
- package/fesm2022/muxima-ui-core-date-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-editor.mjs +25 -19
- package/fesm2022/muxima-ui-core-editor.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-file-upload.mjs +32 -27
- package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-form-field.mjs +2 -2
- package/fesm2022/muxima-ui-core-form-field.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-i18n.mjs +550 -0
- package/fesm2022/muxima-ui-core-i18n.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-image-cropper.mjs +27 -24
- package/fesm2022/muxima-ui-core-image-cropper.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-kanban.mjs +22 -19
- package/fesm2022/muxima-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-notification-center.mjs +42 -37
- package/fesm2022/muxima-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-pagination.mjs +29 -26
- package/fesm2022/muxima-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-progress.mjs +5 -3
- package/fesm2022/muxima-ui-core-progress.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-rating.mjs +12 -8
- package/fesm2022/muxima-ui-core-rating.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-select.mjs +14 -11
- package/fesm2022/muxima-ui-core-select.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-sidebar.mjs +10 -7
- package/fesm2022/muxima-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-slider.mjs +10 -8
- package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-stepper.mjs +5 -3
- package/fesm2022/muxima-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-table.mjs +4 -4
- package/fesm2022/muxima-ui-core-table.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-time-picker.mjs +7 -5
- package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-toast.mjs +8 -5
- package/fesm2022/muxima-ui-core-toast.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-tour.mjs +6 -12
- package/fesm2022/muxima-ui-core-tour.mjs.map +1 -1
- package/fesm2022/muxima-ui-core.mjs +1 -1
- package/fesm2022/muxima-ui-core.mjs.map +1 -1
- package/package.json +5 -1
- package/types/muxima-ui-core-alert.d.ts +3 -1
- package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
- package/types/muxima-ui-core-carousel.d.ts +4 -2
- package/types/muxima-ui-core-chips.d.ts +23 -3
- package/types/muxima-ui-core-clipboard.d.ts +6 -3
- package/types/muxima-ui-core-color-picker.d.ts +40 -7
- package/types/muxima-ui-core-combobox.d.ts +6 -3
- package/types/muxima-ui-core-command.d.ts +7 -3
- package/types/muxima-ui-core-data-grid.d.ts +30 -10
- package/types/muxima-ui-core-date-picker.d.ts +64 -15
- package/types/muxima-ui-core-editor.d.ts +13 -2
- package/types/muxima-ui-core-file-upload.d.ts +23 -7
- package/types/muxima-ui-core-form-field.d.ts +2 -2
- package/types/muxima-ui-core-i18n.d.ts +322 -0
- package/types/muxima-ui-core-image-cropper.d.ts +19 -6
- package/types/muxima-ui-core-kanban.d.ts +16 -3
- package/types/muxima-ui-core-notification-center.d.ts +31 -9
- package/types/muxima-ui-core-pagination.d.ts +16 -1
- package/types/muxima-ui-core-progress.d.ts +10 -8
- package/types/muxima-ui-core-rating.d.ts +6 -2
- package/types/muxima-ui-core-select.d.ts +6 -3
- package/types/muxima-ui-core-sidebar.d.ts +6 -3
- package/types/muxima-ui-core-slider.d.ts +6 -4
- package/types/muxima-ui-core-stepper.d.ts +10 -8
- package/types/muxima-ui-core-table.d.ts +3 -3
- package/types/muxima-ui-core-time-picker.d.ts +3 -1
- package/types/muxima-ui-core-toast.d.ts +3 -0
- package/types/muxima-ui-core-tour.d.ts +3 -3
- 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(
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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(
|
|
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_EN, injectMxMessages } from '@muxima-ui/core/i18n';
|
|
1
2
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { model, input, booleanAttribute, output, viewChild, signal,
|
|
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, '
|
|
89
|
-
[40, '
|
|
90
|
-
[65, '
|
|
91
|
-
[80, '
|
|
92
|
-
[160, '
|
|
93
|
-
[195, '
|
|
94
|
-
[250, '
|
|
95
|
-
[285, '
|
|
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, '
|
|
98
|
+
[360, 'red'],
|
|
98
99
|
];
|
|
99
|
-
/**
|
|
100
|
-
|
|
100
|
+
/**
|
|
101
|
+
* Nome aproximado da cor, para o leitor de ecrã: "azul escuro", "cinzento claro".
|
|
102
|
+
* Por omissão em inglês; passa `names` para outro idioma (ex.: `MX_MESSAGES_PT.colorPicker.names`).
|
|
103
|
+
*/
|
|
104
|
+
function mxColorName(hex, names = MX_MESSAGES_EN.colorPicker.names) {
|
|
101
105
|
const { h, s, v } = mxHexToHsva(hex);
|
|
102
106
|
if (v < 0.12)
|
|
103
|
-
return
|
|
107
|
+
return names.black;
|
|
104
108
|
if (s < 0.12)
|
|
105
|
-
return v > 0.92
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
|
118
|
-
return name
|
|
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(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
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)
|
|
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="
|
|
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">
|
|
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)
|
|
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="
|
|
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">
|
|
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(
|
|
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
|
-
|
|
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
|