@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-editor.mjs","sources":["../../../projects/core/editor/editor.ts","../../../projects/core/editor/muxima-ui-core-editor.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Editor } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport { CharacterCount, Placeholder } from '@tiptap/extensions';\nimport {\n MX_FORM_FIELD_CONTROL,\n MxFormField,\n MxFormFieldControl,\n mxUniqueId,\n} from '@muxima-ui/core/form-field';\n\n/** Botões possíveis da barra de formatação. `|` desenha um separador. */\nexport type MxEditorTool =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'heading2'\n | 'heading3'\n | 'paragraph'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'link'\n | 'undo'\n | 'redo'\n | '|';\n\nexport const MX_EDITOR_DEFAULT_TOOLS: MxEditorTool[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n '|',\n 'heading2',\n 'heading3',\n '|',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n '|',\n 'link',\n '|',\n 'undo',\n 'redo',\n];\n\ninterface ToolDef {\n label: string;\n shortcut?: string;\n icon: string;\n run: (e: Editor) => void;\n active?: (e: Editor) => boolean;\n enabled?: (e: Editor) => boolean;\n toggle?: boolean;\n}\n\nconst I = (d: string) =>\n `<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${d}</svg>`;\n\nconst TOOLS: Record<Exclude<MxEditorTool, '|'>, ToolDef> = {\n bold: {\n label: 'Negrito',\n shortcut: 'Control+B',\n icon: I('<path d=\"M4.5 3h4.2a2.5 2.5 0 0 1 0 5H4.5zM4.5 8h4.8a2.5 2.5 0 0 1 0 5H4.5z\"/>'),\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive('bold'),\n toggle: true,\n },\n italic: {\n label: 'Itálico',\n shortcut: 'Control+I',\n icon: I('<path d=\"M10 3H6.5M9.5 13H6M9 3l-2 10\"/>'),\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive('italic'),\n toggle: true,\n },\n underline: {\n label: 'Sublinhado',\n shortcut: 'Control+U',\n icon: I('<path d=\"M4.5 3v4.5a3.5 3.5 0 0 0 7 0V3M4 13.5h8\"/>'),\n run: (e) => e.chain().focus().toggleUnderline().run(),\n active: (e) => e.isActive('underline'),\n toggle: true,\n },\n strike: {\n label: 'Riscado',\n icon: I(\n '<path d=\"M3 8h10M10.5 4.5c-.5-1-1.5-1.5-2.7-1.5C6.2 3 5 3.9 5 5.2c0 .9.5 1.5 1.3 1.9M5.5 11.5c.5 1 1.6 1.5 2.9 1.5 1.7 0 2.9-.9 2.9-2.3 0-.5-.1-.9-.4-1.2\"/>',\n ),\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive('strike'),\n toggle: true,\n },\n code: {\n label: 'Código',\n icon: I('<path d=\"M6 4.5L2.5 8 6 11.5M10 4.5L13.5 8 10 11.5\"/>'),\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive('code'),\n toggle: true,\n },\n heading2: {\n label: 'Título',\n icon: I(\n '<path d=\"M3 3.5v9M9 3.5v9M3 8h6M11.5 7.5c.3-.6.9-1 1.6-1 .9 0 1.4.6 1.4 1.3 0 1.3-3 2.4-3 4.7h3\"/>',\n ),\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive('heading', { level: 2 }),\n toggle: true,\n },\n heading3: {\n label: 'Subtítulo',\n icon: I(\n '<path d=\"M3 3.5v9M9 3.5v9M3 8h6M11.5 7c.3-.5.8-.7 1.4-.7.8 0 1.3.5 1.3 1.1 0 .7-.6 1.1-1.3 1.1.8 0 1.5.4 1.5 1.2 0 .8-.6 1.3-1.5 1.3-.6 0-1.1-.3-1.4-.8\"/>',\n ),\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive('heading', { level: 3 }),\n toggle: true,\n },\n paragraph: {\n label: 'Parágrafo',\n icon: I('<path d=\"M10 13V3M12.5 13V3M13.5 3H7.5a2.5 2.5 0 0 0 0 5H10\"/>'),\n run: (e) => e.chain().focus().setParagraph().run(),\n active: (e) => e.isActive('paragraph'),\n toggle: true,\n },\n bulletList: {\n label: 'Lista',\n icon: I(\n '<path d=\"M6.5 4h7M6.5 8h7M6.5 12h7\"/><circle cx=\"3\" cy=\"4\" r=\".6\" fill=\"currentColor\"/><circle cx=\"3\" cy=\"8\" r=\".6\" fill=\"currentColor\"/><circle cx=\"3\" cy=\"12\" r=\".6\" fill=\"currentColor\"/>',\n ),\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive('bulletList'),\n toggle: true,\n },\n orderedList: {\n label: 'Lista numerada',\n icon: I(\n '<path d=\"M6.5 4h7M6.5 8h7M6.5 12h7M2.5 3l1-.5V6M2.5 9.5c.2-.5.6-.7 1-.7.5 0 .9.3.9.8 0 .8-1.9 1.3-1.9 2.4h1.9\"/>',\n ),\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive('orderedList'),\n toggle: true,\n },\n blockquote: {\n label: 'Citação',\n icon: I('<path d=\"M3 4.5h4v4H4.5L3 11.5zM9 4.5h4v4h-2.5L9 11.5z\"/>'),\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive('blockquote'),\n toggle: true,\n },\n link: {\n label: 'Ligação',\n shortcut: 'Control+K',\n icon: I(\n '<path d=\"M6.5 9.5l3-3M7 4.5l1-1a2.8 2.8 0 0 1 4 4l-1 1M9 11.5l-1 1a2.8 2.8 0 0 1-4-4l1-1\"/>',\n ),\n run: () => {},\n active: (e) => e.isActive('link'),\n toggle: true,\n },\n undo: {\n label: 'Anular',\n shortcut: 'Control+Z',\n icon: I('<path d=\"M5.5 3.5L2.5 6.5l3 3M2.5 6.5H10a3.5 3.5 0 0 1 0 7H7\"/>'),\n run: (e) => e.chain().focus().undo().run(),\n enabled: (e) => e.can().undo(),\n },\n redo: {\n label: 'Refazer',\n shortcut: 'Control+Shift+Z',\n icon: I('<path d=\"M10.5 3.5l3 3-3 3M13.5 6.5H6a3.5 3.5 0 0 0 0 7h3\"/>'),\n run: (e) => e.chain().focus().redo().run(),\n enabled: (e) => e.can().redo(),\n },\n};\n\n/**\n * Editor de texto com formatação, sobre o Tiptap (ProseMirror). O Tiptap é uma dependência\n * opcional: instala-o só se usares este ponto de entrada.\n *\n * ```bash\n * npm install @tiptap/core @tiptap/pm @tiptap/starter-kit @tiptap/extensions\n * ```\n * ```html\n * <mx-form-field>\n * <label mxLabel>Notas da factura</label>\n * <mx-editor formControlName=\"notas\" placeholder=\"Escreve aqui...\" [maxLength]=\"2000\" />\n * </mx-form-field>\n * ```\n *\n * O valor é HTML (string; vazio quando não há texto). A barra é um role=toolbar:\n * setas entre botões, Alt + F10 vai do texto para a barra e Esc volta ao texto.\n */\n@Component({\n selector: 'mx-editor',\n exportAs: 'mxEditor',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxEditor }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-editor',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-readonly]': 'readonly() ? \"\" : null',\n '[attr.aria-label]': 'null',\n },\n template: `\n @if (!readonly()) {\n <div\n class=\"mx-editor-toolbar\"\n role=\"toolbar\"\n #toolbar\n [attr.aria-label]=\"toolbarLabel()\"\n [attr.aria-controls]=\"controlId()\"\n (keydown)=\"onToolbarKey($event)\"\n >\n @for (t of toolList(); track $index) {\n @if (t === '|') {\n <span class=\"mx-editor-sep\" role=\"separator\" aria-orientation=\"vertical\"></span>\n } @else {\n <button\n type=\"button\"\n class=\"mx-editor-tool\"\n [tabIndex]=\"$index === focusIndex() ? 0 : -1\"\n [attr.data-tool]=\"t\"\n [attr.aria-label]=\"tools[t].label\"\n [attr.aria-keyshortcuts]=\"tools[t].shortcut ?? null\"\n [attr.aria-pressed]=\"tools[t].toggle ? isActive(t) : null\"\n [disabled]=\"isDisabled() || !isEnabled(t)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"runTool(t, $index)\"\n >\n <span class=\"mx-editor-icon\" [innerHTML]=\"icon(t)\"></span>\n </button>\n }\n }\n </div>\n @if (linkOpen()) {\n <div class=\"mx-editor-linkbar\" role=\"group\" [attr.aria-label]=\"linkLabel()\">\n <input\n #linkInput\n class=\"mx-input\"\n data-size=\"sm\"\n type=\"url\"\n placeholder=\"https://\"\n [attr.aria-label]=\"linkLabel()\"\n [value]=\"linkUrl()\"\n (input)=\"linkUrl.set($any($event.target).value)\"\n (keydown.enter)=\"$event.preventDefault(); applyLink()\"\n (keydown.escape)=\"$event.preventDefault(); closeLink()\"\n />\n <button type=\"button\" class=\"mx-editor-text-button\" (click)=\"applyLink()\">Aplicar</button>\n @if (linkActive()) {\n <button type=\"button\" class=\"mx-editor-text-button\" (click)=\"removeLink()\">\n Remover\n </button>\n }\n <button type=\"button\" class=\"mx-editor-text-button\" (click)=\"closeLink()\">\n Cancelar\n </button>\n </div>\n }\n }\n <div\n class=\"mx-editor-content\"\n #content\n [style.min-height]=\"minHeight()\"\n [style.max-height]=\"maxHeight()\"\n ></div>\n @if (maxLength()) {\n <div class=\"mx-editor-footer\">\n <span\n class=\"mx-editor-count\"\n [attr.data-over]=\"count() > maxLength()! ? '' : null\"\n [attr.aria-live]=\"count() >= maxLength()! * 0.9 ? 'polite' : null\"\n >\n {{ count() }} / {{ maxLength() }}<span class=\"mx-visually-hidden\"> caracteres</span>\n </span>\n </div>\n }\n `,\n})\nexport class MxEditor implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<string>('');\n readonly placeholder = input('');\n readonly tools = TOOLS;\n readonly toolbar = input<MxEditorTool[]>(MX_EDITOR_DEFAULT_TOOLS);\n /** Máximo de caracteres; mostra a contagem. */\n readonly maxLength = input<number | null, unknown>(null, {\n transform: (v: unknown) => (v == null || v === '' ? null : numberAttribute(v)),\n });\n readonly minHeight = input('140px');\n readonly maxHeight = input<string | null>('420px');\n readonly readonly = input(false, { transform: booleanAttribute });\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 readonly toolbarLabel = input('Formatação');\n readonly linkLabel = input('Endereço da ligação');\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly content = viewChild.required<ElementRef<HTMLElement>>('content');\n private readonly toolbarEl = viewChild<ElementRef<HTMLElement>>('toolbar');\n private readonly linkInput = viewChild<ElementRef<HTMLInputElement>>('linkInput');\n private readonly injector = inject(Injector);\n\n private readonly generatedId = mxUniqueId('mx-editor');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n protected readonly toolList = computed(() => this.toolbar());\n protected readonly focusIndex = signal(0);\n /** Muda a cada transacção, para os botões reflectirem o estado. */\n private readonly tick = signal(0);\n protected readonly count = signal(0);\n protected readonly linkOpen = signal(false);\n protected readonly linkUrl = signal('');\n protected readonly linkActive = signal(false);\n /** O editor do Tiptap, para comandos próprios (editor()?.chain()...). */\n readonly editor = signal<Editor | null>(null);\n private writing = false;\n\n private onChange: (v: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n afterNextRender(() => this.create());\n inject(DestroyRef).onDestroy(() => this.editor()?.destroy());\n effect(() => {\n const e = this.editor();\n const editable = !this.isDisabled() && !this.readonly();\n if (e && e.isEditable !== editable) e.setEditable(editable);\n });\n // aria do conteúdo acompanha o form field\n effect(() => {\n const e = this.editor();\n this.tick();\n if (!e) return;\n const el = e.view.dom as HTMLElement;\n const set = (k: string, v: string | null) =>\n v == null ? el.removeAttribute(k) : el.setAttribute(k, v);\n set('aria-labelledby', this.field?.labelId() ?? null);\n set('aria-label', this.field?.labelId() ? null : (this.ariaLabel() ?? null));\n set('aria-describedby', this.field?.describedBy() ?? null);\n set('aria-invalid', this.errorState() ? 'true' : null);\n set('aria-required', this.isRequired() ? 'true' : null);\n set('aria-readonly', this.readonly() || this.isDisabled() ? 'true' : null);\n });\n }\n\n private create(): void {\n const editor = new Editor({\n element: this.content().nativeElement,\n content: untracked(() => this.value()) || '',\n editable: !this.isDisabled() && !this.readonly(),\n extensions: [\n StarterKit.configure({\n heading: { levels: [2, 3, 4] },\n link: { openOnClick: false, autolink: true, defaultProtocol: 'https' },\n }),\n Placeholder.configure({ placeholder: () => this.placeholder() }),\n CharacterCount.configure({ limit: null }),\n ],\n editorProps: {\n attributes: {\n id: this.controlId(),\n role: 'textbox',\n 'aria-multiline': 'true',\n class: 'mx-editor-prose',\n },\n handleKeyDown: (_view, event) => {\n if (event.altKey && event.key === 'F10') {\n event.preventDefault();\n this.focusToolbar();\n return true;\n }\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key.toLowerCase() === 'k' &&\n this.toolList().includes('link')\n ) {\n event.preventDefault();\n // dentro do texto, Ctrl + K é a ligação (não o atalho global da aplicação)\n event.stopPropagation();\n this.openLink();\n return true;\n }\n return false;\n },\n },\n onTransaction: () => this.tick.update((t) => t + 1),\n onUpdate: ({ editor: e }) => {\n this.count.set(e.storage.characterCount?.characters?.() ?? e.getText().length);\n if (this.writing) return;\n const html = e.isEmpty ? '' : e.getHTML();\n this.value.set(html);\n this.onChange(html);\n },\n onBlur: () => this.onTouched(),\n });\n this.count.set(editor.storage.characterCount?.characters?.() ?? editor.getText().length);\n this.editor.set(editor);\n }\n\n private readonly sanitizer = inject(DomSanitizer);\n private readonly icons = new Map<string, SafeHtml>();\n protected icon(t: Exclude<MxEditorTool, '|'>): SafeHtml {\n // os desenhos são constantes deste ficheiro, nunca texto de fora\n if (!this.icons.has(t))\n this.icons.set(t, this.sanitizer.bypassSecurityTrustHtml(TOOLS[t].icon));\n return this.icons.get(t)!;\n }\n protected isActive(t: Exclude<MxEditorTool, '|'>): boolean {\n this.tick();\n const e = this.editor();\n return !!e && !!TOOLS[t].active?.(e);\n }\n protected isEnabled(t: Exclude<MxEditorTool, '|'>): boolean {\n this.tick();\n const e = this.editor();\n return !!e && (TOOLS[t].enabled ? TOOLS[t].enabled!(e) : true);\n }\n protected runTool(t: Exclude<MxEditorTool, '|'>, index: number): void {\n this.focusIndex.set(index);\n const e = this.editor();\n if (!e) return;\n if (t === 'link') {\n this.openLink();\n return;\n }\n TOOLS[t].run(e);\n }\n\n // ---- ligações ----\n openLink(): void {\n const e = this.editor();\n if (!e) return;\n this.linkActive.set(e.isActive('link'));\n this.linkUrl.set(e.getAttributes('link')['href'] ?? '');\n this.linkOpen.set(true);\n afterNextRender(() => this.linkInput()?.nativeElement.focus(), { injector: this.injector });\n }\n protected applyLink(): void {\n const e = this.editor();\n const url = this.linkUrl().trim();\n if (!e) return;\n if (!url) this.removeLink();\n else {\n const href = /^(https?:|mailto:|tel:|\\/|#)/i.test(url) ? url : `https://${url}`;\n e.chain().focus().extendMarkRange('link').setLink({ href }).run();\n }\n this.linkOpen.set(false);\n }\n protected removeLink(): void {\n this.editor()?.chain().focus().extendMarkRange('link').unsetLink().run();\n this.linkOpen.set(false);\n }\n protected closeLink(): void {\n this.linkOpen.set(false);\n this.editor()?.commands.focus();\n }\n\n // ---- barra (roving tabindex) ----\n private buttons(): HTMLButtonElement[] {\n return Array.from(\n this.toolbarEl()?.nativeElement.querySelectorAll<HTMLButtonElement>(\n '.mx-editor-tool:not(:disabled)',\n ) ?? [],\n );\n }\n focusToolbar(): void {\n const b = this.buttons();\n const current = this.toolbarEl()?.nativeElement.querySelector<HTMLButtonElement>(\n '.mx-editor-tool[tabindex=\"0\"]:not(:disabled)',\n );\n (current ?? b[0])?.focus();\n }\n protected onToolbarKey(event: KeyboardEvent): void {\n const b = this.buttons();\n const i = b.indexOf(document.activeElement as HTMLButtonElement);\n let next = -1;\n if (event.key === 'ArrowRight') next = (i + 1) % b.length;\n else if (event.key === 'ArrowLeft') next = (i - 1 + b.length) % b.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = b.length - 1;\n else if (event.key === 'Escape') {\n event.preventDefault();\n this.editor()?.commands.focus();\n return;\n }\n if (next < 0 || !b[next]) return;\n event.preventDefault();\n const all = Array.from(\n this.toolbarEl()!.nativeElement.querySelectorAll<HTMLElement>(\n '.mx-editor-tool, .mx-editor-sep',\n ),\n );\n this.focusIndex.set(all.indexOf(b[next]));\n b[next].focus();\n }\n\n /** Põe o foco no texto. */\n focus(): void {\n this.editor()?.commands.focus();\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const max = this.maxLength();\n if (max && this.count() > max) 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 const html = value ?? '';\n this.value.set(html);\n const e = this.editor();\n if (e && (e.isEmpty ? '' : e.getHTML()) !== html) {\n this.writing = true;\n e.commands.setContent(html, { emitUpdate: false });\n this.count.set(e.storage.characterCount?.characters?.() ?? e.getText().length);\n this.writing = false;\n }\n }\n registerOnChange(fn: (v: 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-editor.mjs","sources":["../../../projects/core/editor/editor.ts","../../../projects/core/editor/muxima-ui-core-editor.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Editor } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport { CharacterCount, Placeholder } from '@tiptap/extensions';\nimport {\n MX_FORM_FIELD_CONTROL,\n MxFormField,\n MxFormFieldControl,\n mxUniqueId,\n} from '@muxima-ui/core/form-field';\n\n/** Botões possíveis da barra de formatação. `|` desenha um separador. */\nexport type MxEditorTool =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'heading2'\n | 'heading3'\n | 'paragraph'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'link'\n | 'undo'\n | 'redo'\n | '|';\n\nexport const MX_EDITOR_DEFAULT_TOOLS: MxEditorTool[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n '|',\n 'heading2',\n 'heading3',\n '|',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n '|',\n 'link',\n '|',\n 'undo',\n 'redo',\n];\n\ninterface ToolDef {\n label: string;\n shortcut?: string;\n icon: string;\n run: (e: Editor) => void;\n active?: (e: Editor) => boolean;\n enabled?: (e: Editor) => boolean;\n toggle?: boolean;\n}\n\nconst I = (d: string) =>\n `<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${d}</svg>`;\n\nconst TOOLS: Record<Exclude<MxEditorTool, '|'>, ToolDef> = {\n bold: {\n label: 'Negrito',\n shortcut: 'Control+B',\n icon: I('<path d=\"M4.5 3h4.2a2.5 2.5 0 0 1 0 5H4.5zM4.5 8h4.8a2.5 2.5 0 0 1 0 5H4.5z\"/>'),\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive('bold'),\n toggle: true,\n },\n italic: {\n label: 'Itálico',\n shortcut: 'Control+I',\n icon: I('<path d=\"M10 3H6.5M9.5 13H6M9 3l-2 10\"/>'),\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive('italic'),\n toggle: true,\n },\n underline: {\n label: 'Sublinhado',\n shortcut: 'Control+U',\n icon: I('<path d=\"M4.5 3v4.5a3.5 3.5 0 0 0 7 0V3M4 13.5h8\"/>'),\n run: (e) => e.chain().focus().toggleUnderline().run(),\n active: (e) => e.isActive('underline'),\n toggle: true,\n },\n strike: {\n label: 'Riscado',\n icon: I(\n '<path d=\"M3 8h10M10.5 4.5c-.5-1-1.5-1.5-2.7-1.5C6.2 3 5 3.9 5 5.2c0 .9.5 1.5 1.3 1.9M5.5 11.5c.5 1 1.6 1.5 2.9 1.5 1.7 0 2.9-.9 2.9-2.3 0-.5-.1-.9-.4-1.2\"/>',\n ),\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive('strike'),\n toggle: true,\n },\n code: {\n label: 'Código',\n icon: I('<path d=\"M6 4.5L2.5 8 6 11.5M10 4.5L13.5 8 10 11.5\"/>'),\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive('code'),\n toggle: true,\n },\n heading2: {\n label: 'Título',\n icon: I(\n '<path d=\"M3 3.5v9M9 3.5v9M3 8h6M11.5 7.5c.3-.6.9-1 1.6-1 .9 0 1.4.6 1.4 1.3 0 1.3-3 2.4-3 4.7h3\"/>',\n ),\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive('heading', { level: 2 }),\n toggle: true,\n },\n heading3: {\n label: 'Subtítulo',\n icon: I(\n '<path d=\"M3 3.5v9M9 3.5v9M3 8h6M11.5 7c.3-.5.8-.7 1.4-.7.8 0 1.3.5 1.3 1.1 0 .7-.6 1.1-1.3 1.1.8 0 1.5.4 1.5 1.2 0 .8-.6 1.3-1.5 1.3-.6 0-1.1-.3-1.4-.8\"/>',\n ),\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive('heading', { level: 3 }),\n toggle: true,\n },\n paragraph: {\n label: 'Parágrafo',\n icon: I('<path d=\"M10 13V3M12.5 13V3M13.5 3H7.5a2.5 2.5 0 0 0 0 5H10\"/>'),\n run: (e) => e.chain().focus().setParagraph().run(),\n active: (e) => e.isActive('paragraph'),\n toggle: true,\n },\n bulletList: {\n label: 'Lista',\n icon: I(\n '<path d=\"M6.5 4h7M6.5 8h7M6.5 12h7\"/><circle cx=\"3\" cy=\"4\" r=\".6\" fill=\"currentColor\"/><circle cx=\"3\" cy=\"8\" r=\".6\" fill=\"currentColor\"/><circle cx=\"3\" cy=\"12\" r=\".6\" fill=\"currentColor\"/>',\n ),\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive('bulletList'),\n toggle: true,\n },\n orderedList: {\n label: 'Lista numerada',\n icon: I(\n '<path d=\"M6.5 4h7M6.5 8h7M6.5 12h7M2.5 3l1-.5V6M2.5 9.5c.2-.5.6-.7 1-.7.5 0 .9.3.9.8 0 .8-1.9 1.3-1.9 2.4h1.9\"/>',\n ),\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive('orderedList'),\n toggle: true,\n },\n blockquote: {\n label: 'Citação',\n icon: I('<path d=\"M3 4.5h4v4H4.5L3 11.5zM9 4.5h4v4h-2.5L9 11.5z\"/>'),\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive('blockquote'),\n toggle: true,\n },\n link: {\n label: 'Ligação',\n shortcut: 'Control+K',\n icon: I(\n '<path d=\"M6.5 9.5l3-3M7 4.5l1-1a2.8 2.8 0 0 1 4 4l-1 1M9 11.5l-1 1a2.8 2.8 0 0 1-4-4l1-1\"/>',\n ),\n run: () => {},\n active: (e) => e.isActive('link'),\n toggle: true,\n },\n undo: {\n label: 'Anular',\n shortcut: 'Control+Z',\n icon: I('<path d=\"M5.5 3.5L2.5 6.5l3 3M2.5 6.5H10a3.5 3.5 0 0 1 0 7H7\"/>'),\n run: (e) => e.chain().focus().undo().run(),\n enabled: (e) => e.can().undo(),\n },\n redo: {\n label: 'Refazer',\n shortcut: 'Control+Shift+Z',\n icon: I('<path d=\"M10.5 3.5l3 3-3 3M13.5 6.5H6a3.5 3.5 0 0 0 0 7h3\"/>'),\n run: (e) => e.chain().focus().redo().run(),\n enabled: (e) => e.can().redo(),\n },\n};\n\n/**\n * Editor de texto com formatação, sobre o Tiptap (ProseMirror). O Tiptap é uma dependência\n * opcional: instala-o só se usares este ponto de entrada.\n *\n * ```bash\n * npm install @tiptap/core @tiptap/pm @tiptap/starter-kit @tiptap/extensions\n * ```\n * ```html\n * <mx-form-field>\n * <label mxLabel>Notas da factura</label>\n * <mx-editor formControlName=\"notas\" placeholder=\"Escreve aqui...\" [maxLength]=\"2000\" />\n * </mx-form-field>\n * ```\n *\n * O valor é HTML (string; vazio quando não há texto). A barra é um role=toolbar:\n * setas entre botões, Alt + F10 vai do texto para a barra e Esc volta ao texto.\n */\n@Component({\n selector: 'mx-editor',\n exportAs: 'mxEditor',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxEditor }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-editor',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-readonly]': 'readonly() ? \"\" : null',\n '[attr.aria-label]': 'null',\n },\n template: `\n @if (!readonly()) {\n <div\n class=\"mx-editor-toolbar\"\n role=\"toolbar\"\n #toolbar\n [attr.aria-label]=\"toolbarLabel() ?? msg().toolbar\"\n [attr.aria-controls]=\"controlId()\"\n (keydown)=\"onToolbarKey($event)\"\n >\n @for (t of toolList(); track $index) {\n @if (t === '|') {\n <span class=\"mx-editor-sep\" role=\"separator\" aria-orientation=\"vertical\"></span>\n } @else {\n <button\n type=\"button\"\n class=\"mx-editor-tool\"\n [tabIndex]=\"$index === focusIndex() ? 0 : -1\"\n [attr.data-tool]=\"t\"\n [attr.aria-label]=\"toolLabel(t)\"\n [attr.aria-keyshortcuts]=\"tools[t].shortcut ?? null\"\n [attr.aria-pressed]=\"tools[t].toggle ? isActive(t) : null\"\n [disabled]=\"isDisabled() || !isEnabled(t)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"runTool(t, $index)\"\n >\n <span class=\"mx-editor-icon\" [innerHTML]=\"icon(t)\"></span>\n </button>\n }\n }\n </div>\n @if (linkOpen()) {\n <div class=\"mx-editor-linkbar\" role=\"group\" [attr.aria-label]=\"linkLabel() ?? msg().link\">\n <input\n #linkInput\n class=\"mx-input\"\n data-size=\"sm\"\n type=\"url\"\n placeholder=\"https://\"\n [attr.aria-label]=\"linkLabel() ?? msg().link\"\n [value]=\"linkUrl()\"\n (input)=\"linkUrl.set($any($event.target).value)\"\n (keydown.enter)=\"$event.preventDefault(); applyLink()\"\n (keydown.escape)=\"$event.preventDefault(); closeLink()\"\n />\n <button type=\"button\" class=\"mx-editor-text-button\" (click)=\"applyLink()\">{{ msg().apply }}</button>\n @if (linkActive()) {\n <button type=\"button\" class=\"mx-editor-text-button\" (click)=\"removeLink()\">\n {{ msg().remove }}\n </button>\n }\n <button type=\"button\" class=\"mx-editor-text-button\" (click)=\"closeLink()\">\n {{ msg().cancel }}\n </button>\n </div>\n }\n }\n <div\n class=\"mx-editor-content\"\n #content\n [style.min-height]=\"minHeight()\"\n [style.max-height]=\"maxHeight()\"\n ></div>\n @if (maxLength()) {\n <div class=\"mx-editor-footer\">\n <span\n class=\"mx-editor-count\"\n [attr.data-over]=\"count() > maxLength()! ? '' : null\"\n [attr.aria-live]=\"count() >= maxLength()! * 0.9 ? 'polite' : null\"\n >\n {{ count() }} / {{ maxLength() }}<span class=\"mx-visually-hidden\"> {{ msg().characters }}</span>\n </span>\n </div>\n }\n `,\n})\nexport class MxEditor implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<string>('');\n readonly placeholder = input('');\n readonly tools = TOOLS;\n readonly toolbar = input<MxEditorTool[]>(MX_EDITOR_DEFAULT_TOOLS);\n /** Máximo de caracteres; mostra a contagem. */\n readonly maxLength = input<number | null, unknown>(null, {\n transform: (v: unknown) => (v == null || v === '' ? null : numberAttribute(v)),\n });\n readonly minHeight = input('140px');\n readonly maxHeight = input<string | null>('420px');\n readonly readonly = input(false, { transform: booleanAttribute });\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 readonly toolbarLabel = input<string>();\n readonly linkLabel = input<string>();\n private readonly i18n = injectMxMessages();\n protected readonly msg = computed(() => this.i18n().editor);\n protected toolLabel(t: MxEditorTool): string {\n return t === '|' ? '' : this.msg().tools[t];\n }\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly content = viewChild.required<ElementRef<HTMLElement>>('content');\n private readonly toolbarEl = viewChild<ElementRef<HTMLElement>>('toolbar');\n private readonly linkInput = viewChild<ElementRef<HTMLInputElement>>('linkInput');\n private readonly injector = inject(Injector);\n\n private readonly generatedId = mxUniqueId('mx-editor');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n protected readonly toolList = computed(() => this.toolbar());\n protected readonly focusIndex = signal(0);\n /** Muda a cada transacção, para os botões reflectirem o estado. */\n private readonly tick = signal(0);\n protected readonly count = signal(0);\n protected readonly linkOpen = signal(false);\n protected readonly linkUrl = signal('');\n protected readonly linkActive = signal(false);\n /** O editor do Tiptap, para comandos próprios (editor()?.chain()...). */\n readonly editor = signal<Editor | null>(null);\n private writing = false;\n\n private onChange: (v: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n afterNextRender(() => this.create());\n inject(DestroyRef).onDestroy(() => this.editor()?.destroy());\n effect(() => {\n const e = this.editor();\n const editable = !this.isDisabled() && !this.readonly();\n if (e && e.isEditable !== editable) e.setEditable(editable);\n });\n // aria do conteúdo acompanha o form field\n effect(() => {\n const e = this.editor();\n this.tick();\n if (!e) return;\n const el = e.view.dom as HTMLElement;\n const set = (k: string, v: string | null) =>\n v == null ? el.removeAttribute(k) : el.setAttribute(k, v);\n set('aria-labelledby', this.field?.labelId() ?? null);\n set('aria-label', this.field?.labelId() ? null : (this.ariaLabel() ?? null));\n set('aria-describedby', this.field?.describedBy() ?? null);\n set('aria-invalid', this.errorState() ? 'true' : null);\n set('aria-required', this.isRequired() ? 'true' : null);\n set('aria-readonly', this.readonly() || this.isDisabled() ? 'true' : null);\n });\n }\n\n private create(): void {\n const editor = new Editor({\n element: this.content().nativeElement,\n content: untracked(() => this.value()) || '',\n editable: !this.isDisabled() && !this.readonly(),\n extensions: [\n StarterKit.configure({\n heading: { levels: [2, 3, 4] },\n link: { openOnClick: false, autolink: true, defaultProtocol: 'https' },\n }),\n Placeholder.configure({ placeholder: () => this.placeholder() }),\n CharacterCount.configure({ limit: null }),\n ],\n editorProps: {\n attributes: {\n id: this.controlId(),\n role: 'textbox',\n 'aria-multiline': 'true',\n class: 'mx-editor-prose',\n },\n handleKeyDown: (_view, event) => {\n if (event.altKey && event.key === 'F10') {\n event.preventDefault();\n this.focusToolbar();\n return true;\n }\n if (\n (event.ctrlKey || event.metaKey) &&\n event.key.toLowerCase() === 'k' &&\n this.toolList().includes('link')\n ) {\n event.preventDefault();\n // dentro do texto, Ctrl + K é a ligação (não o atalho global da aplicação)\n event.stopPropagation();\n this.openLink();\n return true;\n }\n return false;\n },\n },\n onTransaction: () => this.tick.update((t) => t + 1),\n onUpdate: ({ editor: e }) => {\n this.count.set(e.storage.characterCount?.characters?.() ?? e.getText().length);\n if (this.writing) return;\n const html = e.isEmpty ? '' : e.getHTML();\n this.value.set(html);\n this.onChange(html);\n },\n onBlur: () => this.onTouched(),\n });\n this.count.set(editor.storage.characterCount?.characters?.() ?? editor.getText().length);\n this.editor.set(editor);\n }\n\n private readonly sanitizer = inject(DomSanitizer);\n private readonly icons = new Map<string, SafeHtml>();\n protected icon(t: Exclude<MxEditorTool, '|'>): SafeHtml {\n // os desenhos são constantes deste ficheiro, nunca texto de fora\n if (!this.icons.has(t))\n this.icons.set(t, this.sanitizer.bypassSecurityTrustHtml(TOOLS[t].icon));\n return this.icons.get(t)!;\n }\n protected isActive(t: Exclude<MxEditorTool, '|'>): boolean {\n this.tick();\n const e = this.editor();\n return !!e && !!TOOLS[t].active?.(e);\n }\n protected isEnabled(t: Exclude<MxEditorTool, '|'>): boolean {\n this.tick();\n const e = this.editor();\n return !!e && (TOOLS[t].enabled ? TOOLS[t].enabled!(e) : true);\n }\n protected runTool(t: Exclude<MxEditorTool, '|'>, index: number): void {\n this.focusIndex.set(index);\n const e = this.editor();\n if (!e) return;\n if (t === 'link') {\n this.openLink();\n return;\n }\n TOOLS[t].run(e);\n }\n\n // ---- ligações ----\n openLink(): void {\n const e = this.editor();\n if (!e) return;\n this.linkActive.set(e.isActive('link'));\n this.linkUrl.set(e.getAttributes('link')['href'] ?? '');\n this.linkOpen.set(true);\n afterNextRender(() => this.linkInput()?.nativeElement.focus(), { injector: this.injector });\n }\n protected applyLink(): void {\n const e = this.editor();\n const url = this.linkUrl().trim();\n if (!e) return;\n if (!url) this.removeLink();\n else {\n const href = /^(https?:|mailto:|tel:|\\/|#)/i.test(url) ? url : `https://${url}`;\n e.chain().focus().extendMarkRange('link').setLink({ href }).run();\n }\n this.linkOpen.set(false);\n }\n protected removeLink(): void {\n this.editor()?.chain().focus().extendMarkRange('link').unsetLink().run();\n this.linkOpen.set(false);\n }\n protected closeLink(): void {\n this.linkOpen.set(false);\n this.editor()?.commands.focus();\n }\n\n // ---- barra (roving tabindex) ----\n private buttons(): HTMLButtonElement[] {\n return Array.from(\n this.toolbarEl()?.nativeElement.querySelectorAll<HTMLButtonElement>(\n '.mx-editor-tool:not(:disabled)',\n ) ?? [],\n );\n }\n focusToolbar(): void {\n const b = this.buttons();\n const current = this.toolbarEl()?.nativeElement.querySelector<HTMLButtonElement>(\n '.mx-editor-tool[tabindex=\"0\"]:not(:disabled)',\n );\n (current ?? b[0])?.focus();\n }\n protected onToolbarKey(event: KeyboardEvent): void {\n const b = this.buttons();\n const i = b.indexOf(document.activeElement as HTMLButtonElement);\n let next = -1;\n if (event.key === 'ArrowRight') next = (i + 1) % b.length;\n else if (event.key === 'ArrowLeft') next = (i - 1 + b.length) % b.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = b.length - 1;\n else if (event.key === 'Escape') {\n event.preventDefault();\n this.editor()?.commands.focus();\n return;\n }\n if (next < 0 || !b[next]) return;\n event.preventDefault();\n const all = Array.from(\n this.toolbarEl()!.nativeElement.querySelectorAll<HTMLElement>(\n '.mx-editor-tool, .mx-editor-sep',\n ),\n );\n this.focusIndex.set(all.indexOf(b[next]));\n b[next].focus();\n }\n\n /** Põe o foco no texto. */\n focus(): void {\n this.editor()?.commands.focus();\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const max = this.maxLength();\n if (max && this.count() > max) 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 const html = value ?? '';\n this.value.set(html);\n const e = this.editor();\n if (e && (e.isEmpty ? '' : e.getHTML()) !== html) {\n this.writing = true;\n e.commands.setContent(html, { emitUpdate: false });\n this.count.set(e.storage.characterCount?.characters?.() ?? e.getText().length);\n this.writing = false;\n }\n }\n registerOnChange(fn: (v: 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,5 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { model, input, booleanAttribute, numberAttribute, output, inject, ElementRef, viewChild, Injector, computed, signal, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { model, input, booleanAttribute, numberAttribute, computed, output, inject, ElementRef, viewChild, Injector, signal, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { injectMxMessages } from '@muxima-ui/core/i18n';
3
4
  import { LiveAnnouncer } from '@angular/cdk/a11y';
4
5
  import { NgControl, Validators } from '@angular/forms';
5
6
  import { MxFormField, mxUniqueId, MX_FORM_FIELD_CONTROL } from '@muxima-ui/core/form-field';
@@ -54,14 +55,17 @@ class MxFileUpload {
54
55
  progress = input({}, ...(ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []));
55
56
  /** Erro de envio por nome de ficheiro. */
56
57
  errors = input({}, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
57
- dropText = input('Arrasta os ficheiros para aqui ou', ...(ngDevMode ? [{ debugName: "dropText" }] : /* istanbul ignore next */ []));
58
- buttonText = input('escolhe no computador', ...(ngDevMode ? [{ debugName: "buttonText" }] : /* istanbul ignore next */ []));
58
+ dropText = input(...(ngDevMode ? [undefined, { debugName: "dropText" }] : /* istanbul ignore next */ []));
59
+ i18n = injectMxMessages();
60
+ msg = computed(() => this.i18n().fileUpload, ...(ngDevMode ? [{ debugName: "msg" }] : /* istanbul ignore next */ []));
61
+ buttonText = input(...(ngDevMode ? [undefined, { debugName: "buttonText" }] : /* istanbul ignore next */ []));
59
62
  /** Linha de ajuda dentro da área (ex.: "PDF até 5 MB"). */
60
63
  description = input('', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
61
- listLabel = input('Ficheiros escolhidos', ...(ngDevMode ? [{ debugName: "listLabel" }] : /* istanbul ignore next */ []));
62
- removeText = input('Remover', ...(ngDevMode ? [{ debugName: "removeText" }] : /* istanbul ignore next */ []));
63
- doneText = input('Enviado', ...(ngDevMode ? [{ debugName: "doneText" }] : /* istanbul ignore next */ []));
64
- locale = input('pt-AO', ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
64
+ listLabel = input(...(ngDevMode ? [undefined, { debugName: "listLabel" }] : /* istanbul ignore next */ []));
65
+ removeText = input(...(ngDevMode ? [undefined, { debugName: "removeText" }] : /* istanbul ignore next */ []));
66
+ doneText = input(...(ngDevMode ? [undefined, { debugName: "doneText" }] : /* istanbul ignore next */ []));
67
+ /** Locale dos tamanhos ("1,2 MB"); por omissão o do idioma activo. */
68
+ locale = input(...(ngDevMode ? [undefined, { debugName: "locale" }] : /* istanbul ignore next */ []));
65
69
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
66
70
  required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
67
71
  invalid = input(false, { ...(ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -90,7 +94,7 @@ class MxFileUpload {
90
94
  this.ngControl.valueAccessor = this;
91
95
  }
92
96
  size(bytes) {
93
- return mxFormatBytes(bytes, this.locale());
97
+ return mxFormatBytes(bytes, this.locale() ?? this.i18n().intlLocale);
94
98
  }
95
99
  /** Abre o seletor de ficheiros do sistema. */
96
100
  browse() {
@@ -103,15 +107,16 @@ class MxFileUpload {
103
107
  const accepted = [];
104
108
  const rejected = [];
105
109
  const current = this.multiple() ? this.files() : [];
110
+ const t = this.msg();
106
111
  for (const file of incoming) {
107
112
  if (!mxFileMatches(file, this.accept())) {
108
- rejected.push({ file, reason: 'type', message: `${file.name}: tipo de ficheiro não aceite.` });
113
+ rejected.push({ file, reason: 'type', message: t.rejectedType(file.name) });
109
114
  }
110
115
  else if (file.size > this.maxSize()) {
111
- rejected.push({ file, reason: 'size', message: `${file.name}: tem ${this.size(file.size)}, o máximo é ${this.size(this.maxSize())}.` });
116
+ rejected.push({ file, reason: 'size', message: t.rejectedSize(file.name, this.size(file.size), this.size(this.maxSize())) });
112
117
  }
113
118
  else if (current.length + accepted.length >= (this.multiple() ? this.maxFiles() : 1)) {
114
- rejected.push({ file, reason: 'count', message: `${file.name}: só podes juntar ${this.multiple() ? this.maxFiles() : 1} ficheiro${this.maxFiles() === 1 || !this.multiple() ? '' : 's'}.` });
119
+ rejected.push({ file, reason: 'count', message: t.rejectedCount(file.name, this.multiple() ? this.maxFiles() : 1) });
115
120
  }
116
121
  else {
117
122
  accepted.push(file);
@@ -124,7 +129,7 @@ class MxFileUpload {
124
129
  this.update([...current, ...accepted]);
125
130
  const parts = [];
126
131
  if (accepted.length)
127
- parts.push(accepted.length === 1 ? `${accepted[0].name} juntado.` : `${accepted.length} ficheiros juntados.`);
132
+ parts.push(accepted.length === 1 ? t.addedOne(accepted[0].name) : t.addedMany(accepted.length));
128
133
  parts.push(...rejected.map((r) => r.message));
129
134
  if (parts.length)
130
135
  this.announcer.announce(parts.join(' '), rejected.length ? 'assertive' : 'polite');
@@ -133,7 +138,7 @@ class MxFileUpload {
133
138
  remove(index) {
134
139
  const file = this.files()[index];
135
140
  this.update(this.files().filter((_, i) => i !== index));
136
- this.announcer.announce(`${file.name} removido.`);
141
+ this.announcer.announce(this.msg().removed(file.name));
137
142
  afterNextRender(() => {
138
143
  const removes = this.host.querySelectorAll('.mx-file-upload-remove');
139
144
  (removes[Math.min(index, removes.length - 1)] ?? this.host.querySelector('.mx-file-upload-button'))?.focus();
@@ -218,7 +223,7 @@ class MxFileUpload {
218
223
  <path d="M4 14v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" />
219
224
  </svg>
220
225
  <p class="mx-file-upload-text">
221
- <span aria-hidden="true">{{ dropText() }}</span>
226
+ <span aria-hidden="true">{{ (dropText() ?? msg().drop) }}</span>
222
227
  <button
223
228
  type="button"
224
229
  class="mx-file-upload-button"
@@ -228,7 +233,7 @@ class MxFileUpload {
228
233
  [attr.aria-labelledby]="field?.labelId() ? field!.labelId() + ' ' + controlId() : null"
229
234
  (click)="browse()"
230
235
  >
231
- {{ buttonText() }}
236
+ {{ (buttonText() ?? msg().browse) }}
232
237
  </button>
233
238
  </p>
234
239
  @if (description()) {
@@ -256,7 +261,7 @@ class MxFileUpload {
256
261
  }
257
262
 
258
263
  @if (files().length) {
259
- <ul class="mx-file-upload-list" [attr.aria-label]="listLabel()">
264
+ <ul class="mx-file-upload-list" [attr.aria-label]="(listLabel() ?? msg().list)">
260
265
  @for (f of files(); track f; let i = $index) {
261
266
  <li class="mx-file-upload-item" [attr.data-error]="errors()[f.name] ? '' : null">
262
267
  <svg class="mx-file-upload-file-icon" viewBox="0 0 16 16" fill="none" aria-hidden="true">
@@ -270,14 +275,14 @@ class MxFileUpload {
270
275
  @if (errors()[f.name]; as e) {
271
276
  · <span class="mx-file-upload-error">{{ e }}</span>
272
277
  } @else if (progress()[f.name] !== undefined) {
273
- · {{ progress()[f.name] >= 100 ? doneText() : progress()[f.name] + '%' }}
278
+ · {{ progress()[f.name] >= 100 ? (doneText() ?? msg().done) : progress()[f.name] + '%' }}
274
279
  }
275
280
  </span>
276
281
  @if (progress()[f.name] !== undefined && progress()[f.name] < 100 && !errors()[f.name]) {
277
- <progress class="mx-file-upload-progress" max="100" [value]="progress()[f.name]" [attr.aria-label]="'A enviar ' + f.name"></progress>
282
+ <progress class="mx-file-upload-progress" max="100" [value]="progress()[f.name]" [attr.aria-label]="msg().uploading(f.name)"></progress>
278
283
  }
279
284
  </div>
280
- <button type="button" class="mx-file-upload-remove" [disabled]="isDisabled()" [attr.aria-label]="removeText() + ' ' + f.name" (click)="remove(i)">
285
+ <button type="button" class="mx-file-upload-remove" [disabled]="isDisabled()" [attr.aria-label]="(removeText() ?? msg().remove) + ' ' + f.name" (click)="remove(i)">
281
286
  <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>
282
287
  </button>
283
288
  </li>
@@ -314,7 +319,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
314
319
  <path d="M4 14v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" />
315
320
  </svg>
316
321
  <p class="mx-file-upload-text">
317
- <span aria-hidden="true">{{ dropText() }}</span>
322
+ <span aria-hidden="true">{{ (dropText() ?? msg().drop) }}</span>
318
323
  <button
319
324
  type="button"
320
325
  class="mx-file-upload-button"
@@ -324,7 +329,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
324
329
  [attr.aria-labelledby]="field?.labelId() ? field!.labelId() + ' ' + controlId() : null"
325
330
  (click)="browse()"
326
331
  >
327
- {{ buttonText() }}
332
+ {{ (buttonText() ?? msg().browse) }}
328
333
  </button>
329
334
  </p>
330
335
  @if (description()) {
@@ -352,7 +357,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
352
357
  }
353
358
 
354
359
  @if (files().length) {
355
- <ul class="mx-file-upload-list" [attr.aria-label]="listLabel()">
360
+ <ul class="mx-file-upload-list" [attr.aria-label]="(listLabel() ?? msg().list)">
356
361
  @for (f of files(); track f; let i = $index) {
357
362
  <li class="mx-file-upload-item" [attr.data-error]="errors()[f.name] ? '' : null">
358
363
  <svg class="mx-file-upload-file-icon" viewBox="0 0 16 16" fill="none" aria-hidden="true">
@@ -366,14 +371,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
366
371
  @if (errors()[f.name]; as e) {
367
372
  · <span class="mx-file-upload-error">{{ e }}</span>
368
373
  } @else if (progress()[f.name] !== undefined) {
369
- · {{ progress()[f.name] >= 100 ? doneText() : progress()[f.name] + '%' }}
374
+ · {{ progress()[f.name] >= 100 ? (doneText() ?? msg().done) : progress()[f.name] + '%' }}
370
375
  }
371
376
  </span>
372
377
  @if (progress()[f.name] !== undefined && progress()[f.name] < 100 && !errors()[f.name]) {
373
- <progress class="mx-file-upload-progress" max="100" [value]="progress()[f.name]" [attr.aria-label]="'A enviar ' + f.name"></progress>
378
+ <progress class="mx-file-upload-progress" max="100" [value]="progress()[f.name]" [attr.aria-label]="msg().uploading(f.name)"></progress>
374
379
  }
375
380
  </div>
376
- <button type="button" class="mx-file-upload-remove" [disabled]="isDisabled()" [attr.aria-label]="removeText() + ' ' + f.name" (click)="remove(i)">
381
+ <button type="button" class="mx-file-upload-remove" [disabled]="isDisabled()" [attr.aria-label]="(removeText() ?? msg().remove) + ' ' + f.name" (click)="remove(i)">
377
382
  <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>
378
383
  </button>
379
384
  </li>
@@ -1 +1 @@
1
- {"version":3,"file":"muxima-ui-core-file-upload.mjs","sources":["../../../projects/core/file-upload/file-upload.ts","../../../projects/core/file-upload/muxima-ui-core-file-upload.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Injector,\n afterNextRender,\n Component,\n ElementRef,\n ViewEncapsulation,\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\nexport interface MxFileRejection {\n file: File;\n reason: 'type' | 'size' | 'count';\n message: string;\n}\n\n/** \"1,2 MB\", \"340 kB\". */\nexport function mxFormatBytes(bytes: number, locale = 'pt-AO'): string {\n const units = ['B', 'kB', 'MB', 'GB'];\n let v = bytes;\n let u = 0;\n while (v >= 1000 && u < units.length - 1) {\n v /= 1000;\n u++;\n }\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: u ? 1 : 0 }).format(v)} ${units[u]}`;\n}\n\n/** true se o ficheiro corresponde a `accept` (\".pdf,image/*\"). */\nexport function mxFileMatches(file: File, accept: string): boolean {\n if (!accept.trim()) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return accept\n .split(',')\n .map((a) => a.trim().toLowerCase())\n .filter(Boolean)\n .some((a) => (a.startsWith('.') ? name.endsWith(a) : a.endsWith('/*') ? type.startsWith(a.slice(0, -1)) : type === a));\n}\n\n/**\n * Envio de ficheiros: arrastar para a área ou carregar no botão (que abre o seletor nativo).\n * Valida tipo, tamanho e número, mostra a lista com tamanho, progresso e botão de remover.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Comprovativos</label>\n * <mx-file-upload formControlName=\"ficheiros\" accept=\".pdf,image/*\" [maxSize]=\"5_000_000\" multiple />\n * <mx-hint>PDF ou imagem, até 5 MB cada.</mx-hint>\n * </mx-form-field>\n * ```\n *\n * O valor é `File[]`. O envio para o servidor fica do teu lado: passa a percentagem de cada\n * ficheiro em `[progress]` (pelo nome) e os erros em `[errors]`.\n */\n@Component({\n selector: 'mx-file-upload',\n exportAs: 'mxFileUpload',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxFileUpload }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-file-upload',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.aria-label]': 'null',\n },\n template: `\n <div\n class=\"mx-file-upload-zone\"\n [attr.data-dragging]=\"dragging() ? '' : null\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <svg class=\"mx-file-upload-icon\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 15V4M7.5 8.5L12 4l4.5 4.5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4 14v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n </svg>\n <p class=\"mx-file-upload-text\">\n <span aria-hidden=\"true\">{{ dropText() }}</span>\n <button\n type=\"button\"\n class=\"mx-file-upload-button\"\n [id]=\"controlId()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-labelledby]=\"field?.labelId() ? field!.labelId() + ' ' + controlId() : null\"\n (click)=\"browse()\"\n >\n {{ buttonText() }}\n </button>\n </p>\n @if (description()) {\n <p class=\"mx-file-upload-desc\" [id]=\"descId\">{{ description() }}</p>\n }\n <input\n #input\n type=\"file\"\n class=\"mx-visually-hidden\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onPick($event)\"\n />\n </div>\n\n @if (rejections().length) {\n <ul class=\"mx-file-upload-rejections\">\n @for (r of rejections(); track $index) {\n <li>{{ r.message }}</li>\n }\n </ul>\n }\n\n @if (files().length) {\n <ul class=\"mx-file-upload-list\" [attr.aria-label]=\"listLabel()\">\n @for (f of files(); track f; let i = $index) {\n <li class=\"mx-file-upload-item\" [attr.data-error]=\"errors()[f.name] ? '' : null\">\n <svg class=\"mx-file-upload-file-icon\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 1.75h5l3 3v9.5H4z\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linejoin=\"round\" />\n <path d=\"M9 1.75v3h3\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linejoin=\"round\" />\n </svg>\n <div class=\"mx-file-upload-info\">\n <span class=\"mx-file-upload-name\">{{ f.name }}</span>\n <span class=\"mx-file-upload-meta\">\n {{ size(f.size) }}\n @if (errors()[f.name]; as e) {\n · <span class=\"mx-file-upload-error\">{{ e }}</span>\n } @else if (progress()[f.name] !== undefined) {\n · {{ progress()[f.name] >= 100 ? doneText() : progress()[f.name] + '%' }}\n }\n </span>\n @if (progress()[f.name] !== undefined && progress()[f.name] < 100 && !errors()[f.name]) {\n <progress class=\"mx-file-upload-progress\" max=\"100\" [value]=\"progress()[f.name]\" [attr.aria-label]=\"'A enviar ' + f.name\"></progress>\n }\n </div>\n <button type=\"button\" class=\"mx-file-upload-remove\" [disabled]=\"isDisabled()\" [attr.aria-label]=\"removeText() + ' ' + f.name\" (click)=\"remove(i)\">\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 </li>\n }\n </ul>\n }\n `,\n})\nexport class MxFileUpload implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<File[]>([]);\n /** Tipos aceites, como no input nativo: \".pdf,image/*\". */\n readonly accept = input('');\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamanho máximo de cada ficheiro, em bytes. */\n readonly maxSize = input(Infinity, { transform: numberAttribute });\n readonly maxFiles = input(Infinity, { transform: numberAttribute });\n /** Percentagem de envio por nome de ficheiro. */\n readonly progress = input<Record<string, number>>({});\n /** Erro de envio por nome de ficheiro. */\n readonly errors = input<Record<string, string>>({});\n readonly dropText = input('Arrasta os ficheiros para aqui ou');\n readonly buttonText = input('escolhe no computador');\n /** Linha de ajuda dentro da área (ex.: \"PDF até 5 MB\"). */\n readonly description = input('');\n readonly listLabel = input('Ficheiros escolhidos');\n readonly removeText = input('Remover');\n readonly doneText = input('Enviado');\n readonly locale = input('pt-AO');\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 rejected = output<MxFileRejection[]>();\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-file-upload');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n protected readonly descId = mxUniqueId('mx-file-upload-desc');\n protected readonly files = computed(() => this.value() ?? []);\n protected readonly dragging = signal(false);\n protected readonly rejections = signal<MxFileRejection[]>([]);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n protected readonly describedBy = computed(\n () => [this.description() ? this.descId : null, this.field?.describedBy()].filter(Boolean).join(' ') || null,\n );\n private dragDepth = 0;\n\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n protected size(bytes: number): string {\n return mxFormatBytes(bytes, this.locale());\n }\n\n /** Abre o seletor de ficheiros do sistema. */\n browse(): void {\n if (!this.isDisabled()) this.input().nativeElement.click();\n }\n\n /** Acrescenta ficheiros, com as mesmas validações do arrastar e do seletor. */\n addFiles(list: Iterable<File> | ArrayLike<File>): void {\n const incoming = Array.from(list);\n const accepted: File[] = [];\n const rejected: MxFileRejection[] = [];\n const current = this.multiple() ? this.files() : [];\n for (const file of incoming) {\n if (!mxFileMatches(file, this.accept())) {\n rejected.push({ file, reason: 'type', message: `${file.name}: tipo de ficheiro não aceite.` });\n } else if (file.size > this.maxSize()) {\n rejected.push({ file, reason: 'size', message: `${file.name}: tem ${this.size(file.size)}, o máximo é ${this.size(this.maxSize())}.` });\n } else if (current.length + accepted.length >= (this.multiple() ? this.maxFiles() : 1)) {\n rejected.push({ file, reason: 'count', message: `${file.name}: só podes juntar ${this.multiple() ? this.maxFiles() : 1} ficheiro${this.maxFiles() === 1 || !this.multiple() ? '' : 's'}.` });\n } else {\n accepted.push(file);\n }\n }\n this.rejections.set(rejected);\n if (rejected.length) this.rejected.emit(rejected);\n if (accepted.length) this.update([...current, ...accepted]);\n const parts = [];\n if (accepted.length) parts.push(accepted.length === 1 ? `${accepted[0].name} juntado.` : `${accepted.length} ficheiros juntados.`);\n parts.push(...rejected.map((r) => r.message));\n if (parts.length) this.announcer.announce(parts.join(' '), rejected.length ? 'assertive' : 'polite');\n this.onTouched();\n }\n\n remove(index: number): void {\n const file = this.files()[index];\n this.update(this.files().filter((_, i) => i !== index));\n this.announcer.announce(`${file.name} removido.`);\n afterNextRender(() => {\n const removes = this.host.querySelectorAll<HTMLElement>('.mx-file-upload-remove');\n (removes[Math.min(index, removes.length - 1)] ?? this.host.querySelector<HTMLElement>('.mx-file-upload-button'))?.focus();\n }, { injector: this.injector });\n }\n\n private update(files: File[]): void {\n this.value.set(files);\n this.onChange(files);\n }\n\n protected onPick(event: Event): void {\n const el = event.target as HTMLInputElement;\n if (el.files?.length) this.addFiles(el.files);\n // permite escolher o mesmo ficheiro outra vez\n el.value = '';\n }\n\n protected onDragEnter(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.dragDepth++;\n this.dragging.set(true);\n }\n protected onDragOver(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n }\n protected onDragLeave(event: DragEvent): void {\n event.preventDefault();\n if (--this.dragDepth <= 0) {\n this.dragDepth = 0;\n this.dragging.set(false);\n }\n }\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragDepth = 0;\n this.dragging.set(false);\n if (this.isDisabled() || !event.dataTransfer?.files.length) return;\n this.addFiles(event.dataTransfer.files);\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: File[] | null): void {\n this.value.set(value ?? []);\n this.rejections.set([]);\n }\n registerOnChange(fn: (value: File[]) => 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-file-upload.mjs","sources":["../../../projects/core/file-upload/file-upload.ts","../../../projects/core/file-upload/muxima-ui-core-file-upload.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Injector,\n afterNextRender,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\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\nexport interface MxFileRejection {\n file: File;\n reason: 'type' | 'size' | 'count';\n message: string;\n}\n\n/** \"1,2 MB\", \"340 kB\". */\nexport function mxFormatBytes(bytes: number, locale = 'pt-AO'): string {\n const units = ['B', 'kB', 'MB', 'GB'];\n let v = bytes;\n let u = 0;\n while (v >= 1000 && u < units.length - 1) {\n v /= 1000;\n u++;\n }\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: u ? 1 : 0 }).format(v)} ${units[u]}`;\n}\n\n/** true se o ficheiro corresponde a `accept` (\".pdf,image/*\"). */\nexport function mxFileMatches(file: File, accept: string): boolean {\n if (!accept.trim()) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return accept\n .split(',')\n .map((a) => a.trim().toLowerCase())\n .filter(Boolean)\n .some((a) => (a.startsWith('.') ? name.endsWith(a) : a.endsWith('/*') ? type.startsWith(a.slice(0, -1)) : type === a));\n}\n\n/**\n * Envio de ficheiros: arrastar para a área ou carregar no botão (que abre o seletor nativo).\n * Valida tipo, tamanho e número, mostra a lista com tamanho, progresso e botão de remover.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Comprovativos</label>\n * <mx-file-upload formControlName=\"ficheiros\" accept=\".pdf,image/*\" [maxSize]=\"5_000_000\" multiple />\n * <mx-hint>PDF ou imagem, até 5 MB cada.</mx-hint>\n * </mx-form-field>\n * ```\n *\n * O valor é `File[]`. O envio para o servidor fica do teu lado: passa a percentagem de cada\n * ficheiro em `[progress]` (pelo nome) e os erros em `[errors]`.\n */\n@Component({\n selector: 'mx-file-upload',\n exportAs: 'mxFileUpload',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxFileUpload }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-file-upload',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.aria-label]': 'null',\n },\n template: `\n <div\n class=\"mx-file-upload-zone\"\n [attr.data-dragging]=\"dragging() ? '' : null\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <svg class=\"mx-file-upload-icon\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 15V4M7.5 8.5L12 4l4.5 4.5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4 14v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n </svg>\n <p class=\"mx-file-upload-text\">\n <span aria-hidden=\"true\">{{ (dropText() ?? msg().drop) }}</span>\n <button\n type=\"button\"\n class=\"mx-file-upload-button\"\n [id]=\"controlId()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-labelledby]=\"field?.labelId() ? field!.labelId() + ' ' + controlId() : null\"\n (click)=\"browse()\"\n >\n {{ (buttonText() ?? msg().browse) }}\n </button>\n </p>\n @if (description()) {\n <p class=\"mx-file-upload-desc\" [id]=\"descId\">{{ description() }}</p>\n }\n <input\n #input\n type=\"file\"\n class=\"mx-visually-hidden\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onPick($event)\"\n />\n </div>\n\n @if (rejections().length) {\n <ul class=\"mx-file-upload-rejections\">\n @for (r of rejections(); track $index) {\n <li>{{ r.message }}</li>\n }\n </ul>\n }\n\n @if (files().length) {\n <ul class=\"mx-file-upload-list\" [attr.aria-label]=\"(listLabel() ?? msg().list)\">\n @for (f of files(); track f; let i = $index) {\n <li class=\"mx-file-upload-item\" [attr.data-error]=\"errors()[f.name] ? '' : null\">\n <svg class=\"mx-file-upload-file-icon\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 1.75h5l3 3v9.5H4z\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linejoin=\"round\" />\n <path d=\"M9 1.75v3h3\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linejoin=\"round\" />\n </svg>\n <div class=\"mx-file-upload-info\">\n <span class=\"mx-file-upload-name\">{{ f.name }}</span>\n <span class=\"mx-file-upload-meta\">\n {{ size(f.size) }}\n @if (errors()[f.name]; as e) {\n · <span class=\"mx-file-upload-error\">{{ e }}</span>\n } @else if (progress()[f.name] !== undefined) {\n · {{ progress()[f.name] >= 100 ? (doneText() ?? msg().done) : progress()[f.name] + '%' }}\n }\n </span>\n @if (progress()[f.name] !== undefined && progress()[f.name] < 100 && !errors()[f.name]) {\n <progress class=\"mx-file-upload-progress\" max=\"100\" [value]=\"progress()[f.name]\" [attr.aria-label]=\"msg().uploading(f.name)\"></progress>\n }\n </div>\n <button type=\"button\" class=\"mx-file-upload-remove\" [disabled]=\"isDisabled()\" [attr.aria-label]=\"(removeText() ?? msg().remove) + ' ' + f.name\" (click)=\"remove(i)\">\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 </li>\n }\n </ul>\n }\n `,\n})\nexport class MxFileUpload implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<File[]>([]);\n /** Tipos aceites, como no input nativo: \".pdf,image/*\". */\n readonly accept = input('');\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamanho máximo de cada ficheiro, em bytes. */\n readonly maxSize = input(Infinity, { transform: numberAttribute });\n readonly maxFiles = input(Infinity, { transform: numberAttribute });\n /** Percentagem de envio por nome de ficheiro. */\n readonly progress = input<Record<string, number>>({});\n /** Erro de envio por nome de ficheiro. */\n readonly errors = input<Record<string, string>>({});\n readonly dropText = input<string>();\n private readonly i18n = injectMxMessages();\n protected readonly msg = computed(() => this.i18n().fileUpload);\n readonly buttonText = input<string>();\n /** Linha de ajuda dentro da área (ex.: \"PDF até 5 MB\"). */\n readonly description = input('');\n readonly listLabel = input<string>();\n readonly removeText = input<string>();\n readonly doneText = input<string>();\n /** Locale dos tamanhos (\"1,2 MB\"); por omissão o do idioma activo. */\n readonly locale = input<string>();\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 rejected = output<MxFileRejection[]>();\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-file-upload');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n protected readonly descId = mxUniqueId('mx-file-upload-desc');\n protected readonly files = computed(() => this.value() ?? []);\n protected readonly dragging = signal(false);\n protected readonly rejections = signal<MxFileRejection[]>([]);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n protected readonly describedBy = computed(\n () => [this.description() ? this.descId : null, this.field?.describedBy()].filter(Boolean).join(' ') || null,\n );\n private dragDepth = 0;\n\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n protected size(bytes: number): string {\n return mxFormatBytes(bytes, this.locale() ?? this.i18n().intlLocale);\n }\n\n /** Abre o seletor de ficheiros do sistema. */\n browse(): void {\n if (!this.isDisabled()) this.input().nativeElement.click();\n }\n\n /** Acrescenta ficheiros, com as mesmas validações do arrastar e do seletor. */\n addFiles(list: Iterable<File> | ArrayLike<File>): void {\n const incoming = Array.from(list);\n const accepted: File[] = [];\n const rejected: MxFileRejection[] = [];\n const current = this.multiple() ? this.files() : [];\n const t = this.msg();\n for (const file of incoming) {\n if (!mxFileMatches(file, this.accept())) {\n rejected.push({ file, reason: 'type', message: t.rejectedType(file.name) });\n } else if (file.size > this.maxSize()) {\n rejected.push({ file, reason: 'size', message: t.rejectedSize(file.name, this.size(file.size), this.size(this.maxSize())) });\n } else if (current.length + accepted.length >= (this.multiple() ? this.maxFiles() : 1)) {\n rejected.push({ file, reason: 'count', message: t.rejectedCount(file.name, this.multiple() ? this.maxFiles() : 1) });\n } else {\n accepted.push(file);\n }\n }\n this.rejections.set(rejected);\n if (rejected.length) this.rejected.emit(rejected);\n if (accepted.length) this.update([...current, ...accepted]);\n const parts = [];\n if (accepted.length) parts.push(accepted.length === 1 ? t.addedOne(accepted[0].name) : t.addedMany(accepted.length));\n parts.push(...rejected.map((r) => r.message));\n if (parts.length) this.announcer.announce(parts.join(' '), rejected.length ? 'assertive' : 'polite');\n this.onTouched();\n }\n\n remove(index: number): void {\n const file = this.files()[index];\n this.update(this.files().filter((_, i) => i !== index));\n this.announcer.announce(this.msg().removed(file.name));\n afterNextRender(() => {\n const removes = this.host.querySelectorAll<HTMLElement>('.mx-file-upload-remove');\n (removes[Math.min(index, removes.length - 1)] ?? this.host.querySelector<HTMLElement>('.mx-file-upload-button'))?.focus();\n }, { injector: this.injector });\n }\n\n private update(files: File[]): void {\n this.value.set(files);\n this.onChange(files);\n }\n\n protected onPick(event: Event): void {\n const el = event.target as HTMLInputElement;\n if (el.files?.length) this.addFiles(el.files);\n // permite escolher o mesmo ficheiro outra vez\n el.value = '';\n }\n\n protected onDragEnter(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n this.dragDepth++;\n this.dragging.set(true);\n }\n protected onDragOver(event: DragEvent): void {\n if (this.isDisabled()) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n }\n protected onDragLeave(event: DragEvent): void {\n event.preventDefault();\n if (--this.dragDepth <= 0) {\n this.dragDepth = 0;\n this.dragging.set(false);\n }\n }\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragDepth = 0;\n this.dragging.set(false);\n if (this.isDisabled() || !event.dataTransfer?.files.length) return;\n this.addFiles(event.dataTransfer.files);\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: File[] | null): void {\n this.value.set(value ?? []);\n this.rejections.set([]);\n }\n registerOnChange(fn: (value: File[]) => 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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"}