@muxima-ui/core 1.4.1 → 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 (86) 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 +5 -1
  59. package/types/muxima-ui-core-alert.d.ts +3 -1
  60. package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
  61. package/types/muxima-ui-core-carousel.d.ts +4 -2
  62. package/types/muxima-ui-core-chips.d.ts +23 -3
  63. package/types/muxima-ui-core-clipboard.d.ts +6 -3
  64. package/types/muxima-ui-core-color-picker.d.ts +40 -7
  65. package/types/muxima-ui-core-combobox.d.ts +6 -3
  66. package/types/muxima-ui-core-command.d.ts +7 -3
  67. package/types/muxima-ui-core-data-grid.d.ts +31 -11
  68. package/types/muxima-ui-core-date-picker.d.ts +59 -14
  69. package/types/muxima-ui-core-editor.d.ts +13 -2
  70. package/types/muxima-ui-core-file-upload.d.ts +22 -6
  71. package/types/muxima-ui-core-i18n.d.ts +322 -0
  72. package/types/muxima-ui-core-image-cropper.d.ts +19 -6
  73. package/types/muxima-ui-core-kanban.d.ts +16 -3
  74. package/types/muxima-ui-core-notification-center.d.ts +30 -8
  75. package/types/muxima-ui-core-pagination.d.ts +16 -1
  76. package/types/muxima-ui-core-progress.d.ts +10 -8
  77. package/types/muxima-ui-core-rating.d.ts +6 -2
  78. package/types/muxima-ui-core-select.d.ts +6 -3
  79. package/types/muxima-ui-core-sidebar.d.ts +6 -3
  80. package/types/muxima-ui-core-slider.d.ts +4 -2
  81. package/types/muxima-ui-core-stepper.d.ts +10 -8
  82. package/types/muxima-ui-core-table.d.ts +3 -3
  83. package/types/muxima-ui-core-time-picker.d.ts +3 -1
  84. package/types/muxima-ui-core-toast.d.ts +3 -0
  85. package/types/muxima-ui-core-tour.d.ts +6 -1
  86. package/types/muxima-ui-core.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"muxima-ui-core-command.mjs","sources":["../../../projects/core/command/command.ts","../../../projects/core/command/muxima-ui-core-command.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n Injectable,\n TemplateRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport { MxDialog, MX_DIALOG_DATA } from '@muxima-ui/core/dialog';\nimport { mxNormalize, mxUniqueId } from '@muxima-ui/core/form-field';\n\nexport interface MxCommandItem<D = unknown> {\n /** Texto mostrado e pesquisado. */\n label: string;\n /** Grupo onde aparece (ex.: \"Páginas\", \"Acções\"). */\n group?: string;\n /** Palavras extra para a pesquisa, não mostradas. */\n keywords?: string[];\n /** Texto à direita, por exemplo um atalho. */\n hint?: string;\n disabled?: boolean;\n /** Dados livres (rota, id...). */\n data?: D;\n}\n\n/** Modelo opcional para desenhar cada item (ex.: com ícone). */\n@Directive({ selector: 'ng-template[mxCommandItem]' })\nexport class MxCommandItemTemplate {\n readonly template = inject<TemplateRef<{ $implicit: MxCommandItem }>>(TemplateRef);\n}\n\n/**\n * Pesquisa de comandos: campo + lista filtrada, por grupos (padrão combobox com lista).\n * Use-se dentro de um diálogo (MxCommandPalette) ou directamente na página.\n *\n * ```html\n * <mx-command [items]=\"comandos\" (selected)=\"executar($event)\" aria-label=\"Pesquisar comandos\" />\n * ```\n */\n@Component({\n selector: 'mx-command',\n exportAs: 'mxCommand',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-command', '[attr.aria-label]': 'null' },\n template: `\n <div class=\"mx-command-search\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.4\" />\n <path d=\"M10.5 10.5L14 14\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n <input\n #search\n class=\"mx-command-input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"flat().length ? optionId(active()) : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n <div class=\"mx-command-list\" role=\"listbox\" [id]=\"listId\" [attr.aria-label]=\"ariaLabel()\">\n @for (g of groups(); track g.name) {\n <div role=\"group\" class=\"mx-command-group\" [attr.aria-labelledby]=\"g.name ? groupId(g.name) : null\">\n @if (g.name) {\n <div class=\"mx-command-group-label\" [id]=\"groupId(g.name)\" aria-hidden=\"true\">{{ g.name }}</div>\n }\n @for (e of g.items; track e.index) {\n <div\n class=\"mx-command-item\"\n role=\"option\"\n [id]=\"optionId(e.index)\"\n [attr.aria-selected]=\"e.index === active()\"\n [attr.aria-disabled]=\"e.item.disabled ? 'true' : null\"\n [attr.data-active]=\"e.index === active() ? '' : null\"\n (mousemove)=\"active.set(e.index)\"\n (click)=\"choose(e.item)\"\n >\n @if (itemTemplate(); as t) {\n <ng-container *ngTemplateOutlet=\"t.template; context: { $implicit: e.item }\" />\n } @else {\n <span>{{ e.item.label }}</span>\n }\n @if (e.item.hint) {\n <span class=\"mx-command-hint\">{{ e.item.hint }}</span>\n }\n </div>\n }\n </div>\n } @empty {\n <div class=\"mx-command-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">{{ emptyText() }} \"{{ query() }}\"</div>\n }\n </div>\n <span class=\"mx-visually-hidden\" aria-live=\"polite\">{{ flat().length }} resultados</span>\n `,\n})\nexport class MxCommand<D = unknown> {\n readonly items = input.required<readonly MxCommandItem<D>[]>();\n readonly placeholder = input('Pesquisar...');\n readonly emptyText = input('Nada encontrado para');\n readonly ariaLabel = input('Pesquisar', { alias: 'aria-label' });\n readonly selected = output<MxCommandItem<D>>();\n\n protected readonly itemTemplate = contentChild(MxCommandItemTemplate);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n protected readonly listId = mxUniqueId('mx-command-list');\n protected readonly query = signal('');\n protected readonly active = signal(0);\n\n protected readonly flat = computed(() => {\n const q = mxNormalize(this.query().trim());\n const all = this.items();\n if (!q) return [...all];\n return all.filter((i) => mxNormalize([i.label, i.group ?? '', ...(i.keywords ?? [])].join(' ')).includes(q));\n });\n\n protected readonly groups = computed(() => {\n const out: { name: string; items: { item: MxCommandItem<D>; index: number }[] }[] = [];\n this.flat().forEach((item, index) => {\n const name = item.group ?? '';\n let g = out.find((x) => x.name === name);\n if (!g) out.push((g = { name, items: [] }));\n g.items.push({ item, index });\n });\n // a ordem do teclado segue a ordem visual\n let i = 0;\n out.forEach((g) => g.items.forEach((e) => (e.index = i++)));\n return out;\n });\n\n private readonly ordered = computed(() => this.groups().flatMap((g) => g.items.map((e) => e.item)));\n\n constructor() {\n afterNextRender(() => this.focus());\n }\n\n focus(): void {\n this.host.querySelector<HTMLInputElement>('.mx-command-input')?.focus();\n }\n\n protected optionId(i: number): string {\n return `${this.listId}-${i}`;\n }\n protected groupId(name: string): string {\n return `${this.listId}-g-${mxNormalize(name).replace(/\\W+/g, '-')}`;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.active.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const n = this.ordered().length;\n if (!n) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.active.update((i) => (i + 1) % n);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.active.update((i) => (i - 1 + n) % n);\n } else if (event.key === 'Home' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(0);\n } else if (event.key === 'End' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(n - 1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.choose(this.ordered()[this.active()]);\n return;\n } else {\n return;\n }\n queueMicrotask(() => document.getElementById(this.optionId(this.active()))?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n protected choose(item: MxCommandItem<D> | undefined): void {\n if (item && !item.disabled) this.selected.emit(item);\n }\n}\n\n/** Conteúdo do diálogo aberto por MxCommandPalette. */\n@Component({\n selector: 'mx-command-palette',\n imports: [MxCommand],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<mx-command [items]=\"data.items\" [placeholder]=\"data.placeholder\" [aria-label]=\"data.label\" (selected)=\"ref.close($event)\" />`,\n})\nexport class MxCommandPaletteDialog {\n protected readonly data = inject<{ items: MxCommandItem[]; placeholder: string; label: string }>(MX_DIALOG_DATA);\n protected readonly ref = inject<DialogRef<MxCommandItem>>(DialogRef);\n}\n\n/**\n * Abre a pesquisa de comandos num diálogo modal. O resultado é o item escolhido.\n *\n * ```ts\n * inject(MxCommandPalette).open(comandos).closed.subscribe((item) => item && executar(item));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MxCommandPalette {\n private readonly dialog = inject(MxDialog);\n\n open<D>(items: MxCommandItem<D>[], options: { placeholder?: string; label?: string } = {}): DialogRef<MxCommandItem<D>> {\n const ref = this.dialog.open<MxCommandItem<D>>(MxCommandPaletteDialog, {\n data: { items, placeholder: options.placeholder ?? 'Pesquisar...', label: options.label ?? 'Pesquisar' },\n size: 'md',\n ariaLabel: options.label ?? 'Pesquisar',\n });\n ref.addPanelClass('mx-command-panel');\n return ref as unknown as DialogRef<MxCommandItem<D>>;\n }\n}\n\nexport const MX_COMMAND = [MxCommand, MxCommandItemTemplate] as const;\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-command.mjs","sources":["../../../projects/core/command/command.ts","../../../projects/core/command/muxima-ui-core-command.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n Injectable,\n TemplateRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport { MxDialog, MX_DIALOG_DATA } from '@muxima-ui/core/dialog';\nimport { mxNormalize, mxUniqueId } from '@muxima-ui/core/form-field';\n\nexport interface MxCommandItem<D = unknown> {\n /** Texto mostrado e pesquisado. */\n label: string;\n /** Grupo onde aparece (ex.: \"Páginas\", \"Acções\"). */\n group?: string;\n /** Palavras extra para a pesquisa, não mostradas. */\n keywords?: string[];\n /** Texto à direita, por exemplo um atalho. */\n hint?: string;\n disabled?: boolean;\n /** Dados livres (rota, id...). */\n data?: D;\n}\n\n/** Modelo opcional para desenhar cada item (ex.: com ícone). */\n@Directive({ selector: 'ng-template[mxCommandItem]' })\nexport class MxCommandItemTemplate {\n readonly template = inject<TemplateRef<{ $implicit: MxCommandItem }>>(TemplateRef);\n}\n\n/**\n * Pesquisa de comandos: campo + lista filtrada, por grupos (padrão combobox com lista).\n * Use-se dentro de um diálogo (MxCommandPalette) ou directamente na página.\n *\n * ```html\n * <mx-command [items]=\"comandos\" (selected)=\"executar($event)\" aria-label=\"Pesquisar comandos\" />\n * ```\n */\n@Component({\n selector: 'mx-command',\n exportAs: 'mxCommand',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-command', '[attr.aria-label]': 'null' },\n template: `\n <div class=\"mx-command-search\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.4\" />\n <path d=\"M10.5 10.5L14 14\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n <input\n #search\n class=\"mx-command-input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"flat().length ? optionId(active()) : null\"\n [attr.aria-label]=\"labelText()\"\n [placeholder]=\"placeholder() ?? i18n().command.placeholder\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n <div class=\"mx-command-list\" role=\"listbox\" [id]=\"listId\" [attr.aria-label]=\"labelText()\">\n @for (g of groups(); track g.name) {\n <div role=\"group\" class=\"mx-command-group\" [attr.aria-labelledby]=\"g.name ? groupId(g.name) : null\">\n @if (g.name) {\n <div class=\"mx-command-group-label\" [id]=\"groupId(g.name)\" aria-hidden=\"true\">{{ g.name }}</div>\n }\n @for (e of g.items; track e.index) {\n <div\n class=\"mx-command-item\"\n role=\"option\"\n [id]=\"optionId(e.index)\"\n [attr.aria-selected]=\"e.index === active()\"\n [attr.aria-disabled]=\"e.item.disabled ? 'true' : null\"\n [attr.data-active]=\"e.index === active() ? '' : null\"\n (mousemove)=\"active.set(e.index)\"\n (click)=\"choose(e.item)\"\n >\n @if (itemTemplate(); as t) {\n <ng-container *ngTemplateOutlet=\"t.template; context: { $implicit: e.item }\" />\n } @else {\n <span>{{ e.item.label }}</span>\n }\n @if (e.item.hint) {\n <span class=\"mx-command-hint\">{{ e.item.hint }}</span>\n }\n </div>\n }\n </div>\n } @empty {\n <div class=\"mx-command-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">{{ emptyText() ?? i18n().command.empty }} \"{{ query() }}\"</div>\n }\n </div>\n <span class=\"mx-visually-hidden\" aria-live=\"polite\">{{ i18n().command.results(flat().length) }}</span>\n `,\n})\nexport class MxCommand<D = unknown> {\n readonly items = input.required<readonly MxCommandItem<D>[]>();\n readonly placeholder = input<string>();\n readonly emptyText = input<string>();\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n protected readonly i18n = injectMxMessages();\n protected readonly labelText = computed(() => this.ariaLabel() ?? this.i18n().command.label);\n readonly selected = output<MxCommandItem<D>>();\n\n protected readonly itemTemplate = contentChild(MxCommandItemTemplate);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n protected readonly listId = mxUniqueId('mx-command-list');\n protected readonly query = signal('');\n protected readonly active = signal(0);\n\n protected readonly flat = computed(() => {\n const q = mxNormalize(this.query().trim());\n const all = this.items();\n if (!q) return [...all];\n return all.filter((i) => mxNormalize([i.label, i.group ?? '', ...(i.keywords ?? [])].join(' ')).includes(q));\n });\n\n protected readonly groups = computed(() => {\n const out: { name: string; items: { item: MxCommandItem<D>; index: number }[] }[] = [];\n this.flat().forEach((item, index) => {\n const name = item.group ?? '';\n let g = out.find((x) => x.name === name);\n if (!g) out.push((g = { name, items: [] }));\n g.items.push({ item, index });\n });\n // a ordem do teclado segue a ordem visual\n let i = 0;\n out.forEach((g) => g.items.forEach((e) => (e.index = i++)));\n return out;\n });\n\n private readonly ordered = computed(() => this.groups().flatMap((g) => g.items.map((e) => e.item)));\n\n constructor() {\n afterNextRender(() => this.focus());\n }\n\n focus(): void {\n this.host.querySelector<HTMLInputElement>('.mx-command-input')?.focus();\n }\n\n protected optionId(i: number): string {\n return `${this.listId}-${i}`;\n }\n protected groupId(name: string): string {\n return `${this.listId}-g-${mxNormalize(name).replace(/\\W+/g, '-')}`;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.active.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const n = this.ordered().length;\n if (!n) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.active.update((i) => (i + 1) % n);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.active.update((i) => (i - 1 + n) % n);\n } else if (event.key === 'Home' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(0);\n } else if (event.key === 'End' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(n - 1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.choose(this.ordered()[this.active()]);\n return;\n } else {\n return;\n }\n queueMicrotask(() => document.getElementById(this.optionId(this.active()))?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n protected choose(item: MxCommandItem<D> | undefined): void {\n if (item && !item.disabled) this.selected.emit(item);\n }\n}\n\n/** Conteúdo do diálogo aberto por MxCommandPalette. */\n@Component({\n selector: 'mx-command-palette',\n imports: [MxCommand],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<mx-command [items]=\"data.items\" [placeholder]=\"data.placeholder\" [aria-label]=\"data.label\" (selected)=\"ref.close($event)\" />`,\n})\nexport class MxCommandPaletteDialog {\n protected readonly data = inject<{ items: MxCommandItem[]; placeholder: string; label: string }>(MX_DIALOG_DATA);\n protected readonly ref = inject<DialogRef<MxCommandItem>>(DialogRef);\n}\n\n/**\n * Abre a pesquisa de comandos num diálogo modal. O resultado é o item escolhido.\n *\n * ```ts\n * inject(MxCommandPalette).open(comandos).closed.subscribe((item) => item && executar(item));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MxCommandPalette {\n private readonly dialog = inject(MxDialog);\n private readonly i18n = injectMxMessages();\n\n open<D>(items: MxCommandItem<D>[], options: { placeholder?: string; label?: string } = {}): DialogRef<MxCommandItem<D>> {\n const t = this.i18n().command;\n const ref = this.dialog.open<MxCommandItem<D>>(MxCommandPaletteDialog, {\n data: { items, placeholder: options.placeholder ?? t.placeholder, label: options.label ?? t.label },\n size: 'md',\n ariaLabel: options.label ?? t.label,\n });\n ref.addPanelClass('mx-command-panel');\n return ref as unknown as DialogRef<MxCommandItem<D>>;\n }\n}\n\nexport const MX_COMMAND = [MxCommand, MxCommandItemTemplate] as const;\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 { input, inject, TemplateRef, Directive, model, booleanAttribute, numberAttribute, output, contentChildren, viewChild, ElementRef, Injector, signal, computed, afterRenderEffect, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { input, inject, TemplateRef, Directive, model, booleanAttribute, numberAttribute, computed, output, contentChildren, viewChild, ElementRef, Injector, signal, afterRenderEffect, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { injectMxMessages } from '@muxima-ui/core/i18n';
3
4
  import { NgTemplateOutlet } from '@angular/common';
4
5
  import { LiveAnnouncer } from '@angular/cdk/a11y';
5
6
  import { MxCheckbox } from '@muxima-ui/core/checkbox';
@@ -98,18 +99,20 @@ class MxDataGrid {
98
99
  density = input('comfortable', ...(ngDevMode ? [{ debugName: "density" }] : /* istanbul ignore next */ []));
99
100
  loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
100
101
  columnMenu = input(true, { ...(ngDevMode ? { debugName: "columnMenu" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
101
- ariaLabel = input('Tabela de dados', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
102
+ ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
103
+ i18n = injectMxMessages();
104
+ msg = computed(() => this.i18n().dataGrid, ...(ngDevMode ? [{ debugName: "msg" }] : /* istanbul ignore next */ []));
102
105
  /** Coluna cujo texto identifica a linha nos nomes ("Seleccionar FT 2026/0201"). */
103
106
  labelKey = input(null, ...(ngDevMode ? [{ debugName: "labelKey" }] : /* istanbul ignore next */ []));
104
- emptyText = input('Sem resultados.', ...(ngDevMode ? [{ debugName: "emptyText" }] : /* istanbul ignore next */ []));
105
- loadingText = input('A carregar...', ...(ngDevMode ? [{ debugName: "loadingText" }] : /* istanbul ignore next */ []));
106
- columnsText = input('Colunas', ...(ngDevMode ? [{ debugName: "columnsText" }] : /* istanbul ignore next */ []));
107
- filterText = input('Filtrar', ...(ngDevMode ? [{ debugName: "filterText" }] : /* istanbul ignore next */ []));
108
- allText = input('Todos', ...(ngDevMode ? [{ debugName: "allText" }] : /* istanbul ignore next */ []));
109
- selectAllText = input('Seleccionar todas as linhas', ...(ngDevMode ? [{ debugName: "selectAllText" }] : /* istanbul ignore next */ []));
110
- selectRowText = input('Seleccionar', ...(ngDevMode ? [{ debugName: "selectRowText" }] : /* istanbul ignore next */ []));
111
- selectText = input('Selecção', ...(ngDevMode ? [{ debugName: "selectText" }] : /* istanbul ignore next */ []));
112
- resizeHint = input('Alt e setas esquerda e direita mudam a largura da coluna.', ...(ngDevMode ? [{ debugName: "resizeHint" }] : /* istanbul ignore next */ []));
107
+ emptyText = input(...(ngDevMode ? [undefined, { debugName: "emptyText" }] : /* istanbul ignore next */ []));
108
+ loadingText = input(...(ngDevMode ? [undefined, { debugName: "loadingText" }] : /* istanbul ignore next */ []));
109
+ columnsText = input(...(ngDevMode ? [undefined, { debugName: "columnsText" }] : /* istanbul ignore next */ []));
110
+ filterText = input(...(ngDevMode ? [undefined, { debugName: "filterText" }] : /* istanbul ignore next */ []));
111
+ allText = input(...(ngDevMode ? [undefined, { debugName: "allText" }] : /* istanbul ignore next */ []));
112
+ selectAllText = input(...(ngDevMode ? [undefined, { debugName: "selectAllText" }] : /* istanbul ignore next */ []));
113
+ selectRowText = input(...(ngDevMode ? [undefined, { debugName: "selectRowText" }] : /* istanbul ignore next */ []));
114
+ selectText = input(...(ngDevMode ? [undefined, { debugName: "selectText" }] : /* istanbul ignore next */ []));
115
+ resizeHint = input(...(ngDevMode ? [undefined, { debugName: "resizeHint" }] : /* istanbul ignore next */ []));
113
116
  /** Enter ou duplo clique numa linha. */
114
117
  rowActivate = output();
115
118
  cells = contentChildren(MxGridCell, ...(ngDevMode ? [{ debugName: "cells" }] : /* istanbul ignore next */ []));
@@ -170,7 +173,7 @@ class MxDataGrid {
170
173
  const s = this.sort();
171
174
  const sc = s.key ? cols.find((c) => c.key === s.key) : null;
172
175
  if (sc) {
173
- const collator = new Intl.Collator('pt', { numeric: true, sensitivity: 'base' });
176
+ const collator = new Intl.Collator(this.i18n().intlLocale, { numeric: true, sensitivity: 'base' });
174
177
  const dir = s.direction === 'asc' ? 1 : -1;
175
178
  out = [...out].sort((a, b) => {
176
179
  const x = this.valueOf(sc, a);
@@ -213,14 +216,15 @@ class MxDataGrid {
213
216
  allSelected = computed(() => this.rows().length > 0 && this.rows().every((r) => this.selectedSet().has(this.keyOf(r))), ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
214
217
  someSelected = computed(() => !this.allSelected() && this.rows().some((r) => this.selectedSet().has(this.keyOf(r))), ...(ngDevMode ? [{ debugName: "someSelected" }] : /* istanbul ignore next */ []));
215
218
  statusText = computed(() => {
216
- const fmt = new Intl.NumberFormat('pt-AO');
219
+ const t = this.msg();
220
+ const fmt = new Intl.NumberFormat(this.i18n().intlLocale);
217
221
  const total = this.totalRows() ?? this.rows().length;
218
- const parts = [`${fmt.format(total)} ${total === 1 ? 'linha' : 'linhas'}`];
222
+ const parts = [t.rows(fmt.format(total), total)];
219
223
  if (!this.manual() && this.rows().length !== this.data().length)
220
- parts[0] += ` de ${fmt.format(this.data().length)}`;
224
+ parts[0] += t.of(fmt.format(this.data().length));
221
225
  const sel = this.selected().length;
222
226
  if (this.selection() !== 'none' && sel)
223
- parts.push(`${fmt.format(sel)} ${sel === 1 ? 'seleccionada' : 'seleccionadas'}`);
227
+ parts.push(t.selected(fmt.format(sel), sel));
224
228
  return parts.join(', ');
225
229
  }, ...(ngDevMode ? [{ debugName: "statusText" }] : /* istanbul ignore next */ []));
226
230
  constructor() {
@@ -265,9 +269,9 @@ class MxDataGrid {
265
269
  if (c.format)
266
270
  return c.format(v, row);
267
271
  if (v instanceof Date)
268
- return v.toLocaleDateString('pt-AO');
272
+ return v.toLocaleDateString(this.i18n().intlLocale);
269
273
  if (typeof v === 'number')
270
- return v.toLocaleString('pt-AO');
274
+ return v.toLocaleString(this.i18n().intlLocale);
271
275
  return v == null ? '' : String(v);
272
276
  }
273
277
  rowLabel(row) {
@@ -307,7 +311,7 @@ class MxDataGrid {
307
311
  return c.filterOptions;
308
312
  return [...new Set(this.data().map((r) => String(this.valueOf(c, r) ?? '')))]
309
313
  .filter(Boolean)
310
- .sort((a, b) => a.localeCompare(b, 'pt'));
314
+ .sort((a, b) => a.localeCompare(b, this.i18n().intlLocale));
311
315
  }
312
316
  isHidden(c) {
313
317
  const hidden = this.hiddenKeys();
@@ -334,8 +338,8 @@ class MxDataGrid {
334
338
  : { key: null, direction: 'asc' };
335
339
  this.sort.set(next);
336
340
  this.announcer.announce(next.key
337
- ? `Ordenado por ${c.header}, ${next.direction === 'asc' ? 'ascendente' : 'descendente'}`
338
- : 'Sem ordenação');
341
+ ? this.msg().sorted(c.header, next.direction)
342
+ : this.msg().unsorted);
339
343
  }
340
344
  setFilter(key, value) {
341
345
  this.filters.update((f) => ({ ...f, [key]: value }));
@@ -478,7 +482,7 @@ class MxDataGrid {
478
482
  (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {
479
483
  event.preventDefault();
480
484
  this.setWidth(col.key, this.widthOf(col) + (event.key === 'ArrowRight' ? 16 : -16));
481
- this.announcer.announce(`${col.header}, ${this.widthOf(col)} píxeis`);
485
+ this.announcer.announce(this.msg().width(col.header, this.widthOf(col)));
482
486
  return;
483
487
  }
484
488
  if (inSelect)
@@ -555,7 +559,7 @@ class MxDataGrid {
555
559
  stroke-linejoin="round"
556
560
  />
557
561
  </svg>
558
- {{ columnsText() }}
562
+ {{ (columnsText() ?? msg().columns) }}
559
563
  </button>
560
564
  <ng-template #colunas>
561
565
  <div mxMenu>
@@ -585,7 +589,7 @@ class MxDataGrid {
585
589
  <table
586
590
  class="mx-grid-table"
587
591
  role="grid"
588
- [attr.aria-label]="ariaLabel()"
592
+ [attr.aria-label]="(ariaLabel() ?? msg().label)"
589
593
  [attr.aria-rowcount]="rowCount()"
590
594
  [attr.aria-colcount]="colCount()"
591
595
  [attr.aria-multiselectable]="selection() === 'multiple' ? 'true' : null"
@@ -618,12 +622,12 @@ class MxDataGrid {
618
622
  mxCheckbox
619
623
  [checked]="allSelected()"
620
624
  [indeterminate]="someSelected()"
621
- [attr.aria-label]="selectAllText()"
625
+ [attr.aria-label]="(selectAllText() ?? msg().selectAll)"
622
626
  (change)="toggleAll()"
623
627
  tabindex="-1"
624
628
  />
625
629
  } @else {
626
- <span class="mx-visually-hidden">{{ selectText() }}</span>
630
+ <span class="mx-visually-hidden">{{ (selectText() ?? msg().selection) }}</span>
627
631
  }
628
632
  </th>
629
633
  }
@@ -713,11 +717,11 @@ class MxDataGrid {
713
717
  <select
714
718
  class="mx-grid-filter"
715
719
  tabindex="-1"
716
- [attr.aria-label]="filterText() + ' ' + c.header"
720
+ [attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
717
721
  [value]="filters()[c.key] || ''"
718
722
  (change)="setFilter(c.key, $any($event.target).value)"
719
723
  >
720
- <option value="">{{ allText() }}</option>
724
+ <option value="">{{ (allText() ?? msg().all) }}</option>
721
725
  @for (o of optionsOf(c); track o) {
722
726
  <option [value]="o" [selected]="filters()[c.key] === o">{{ o }}</option>
723
727
  }
@@ -728,7 +732,7 @@ class MxDataGrid {
728
732
  class="mx-grid-filter"
729
733
  tabindex="-1"
730
734
  type="search"
731
- [attr.aria-label]="filterText() + ' ' + c.header"
735
+ [attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
732
736
  [value]="filters()[c.key] || ''"
733
737
  (input)="setFilter(c.key, $any($event.target).value)"
734
738
  />
@@ -741,10 +745,7 @@ class MxDataGrid {
741
745
  inputmode="decimal"
742
746
  placeholder=">, <, 10-20"
743
747
  [attr.aria-label]="
744
- filterText() +
745
- ' ' +
746
- c.header +
747
- ', aceita maior que, menor que e intervalos'
748
+ msg().numberFilter(filterText() ?? msg().filter, c.header)
748
749
  "
749
750
  [value]="filters()[c.key] || ''"
750
751
  (input)="setFilter(c.key, $any($event.target).value)"
@@ -783,7 +784,7 @@ class MxDataGrid {
783
784
  mxCheckbox
784
785
  tabindex="-1"
785
786
  [checked]="isSelected(row)"
786
- [attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
787
+ [attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
787
788
  (change)="toggleRow(row)"
788
789
  />
789
790
  } @else {
@@ -793,7 +794,7 @@ class MxDataGrid {
793
794
  tabindex="-1"
794
795
  [name]="radioName"
795
796
  [checked]="isSelected(row)"
796
- [attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
797
+ [attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
797
798
  (change)="toggleRow(row)"
798
799
  />
799
800
  }
@@ -829,7 +830,7 @@ class MxDataGrid {
829
830
  [attr.colspan]="colCount()"
830
831
  [attr.data-cell]="headerRows() + ':0'"
831
832
  >
832
- {{ loading() ? loadingText() : emptyText() }}
833
+ {{ loading() ? (loadingText() ?? msg().loading) : (emptyText() ?? msg().empty) }}
833
834
  </td>
834
835
  </tr>
835
836
  }
@@ -849,7 +850,7 @@ class MxDataGrid {
849
850
  <span class="mx-grid-status" aria-live="polite">{{ statusText() }}</span>
850
851
  <ng-content select="[mxGridFooter]" />
851
852
  </div>
852
- <span class="mx-visually-hidden" [id]="resizeHintId">{{ resizeHint() }}</span>
853
+ <span class="mx-visually-hidden" [id]="resizeHintId">{{ (resizeHint() ?? msg().resizeHint) }}</span>
853
854
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MxCheckbox, selector: "input[type=checkbox][mxCheckbox]", inputs: ["size", "indeterminate"], exportAs: ["mxCheckbox"] }, { kind: "directive", type: i1.MxMenuTrigger, selector: "[mxMenuTriggerFor]", exportAs: ["mxMenuTrigger"] }, { kind: "directive", type: i1.MxMenu, selector: "[mxMenu]", exportAs: ["mxMenu"] }, { kind: "directive", type: i1.MxMenuItemCheckbox, selector: "[mxMenuItemCheckbox]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
854
855
  }
855
856
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxDataGrid, decorators: [{
@@ -879,7 +880,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
879
880
  stroke-linejoin="round"
880
881
  />
881
882
  </svg>
882
- {{ columnsText() }}
883
+ {{ (columnsText() ?? msg().columns) }}
883
884
  </button>
884
885
  <ng-template #colunas>
885
886
  <div mxMenu>
@@ -909,7 +910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
909
910
  <table
910
911
  class="mx-grid-table"
911
912
  role="grid"
912
- [attr.aria-label]="ariaLabel()"
913
+ [attr.aria-label]="(ariaLabel() ?? msg().label)"
913
914
  [attr.aria-rowcount]="rowCount()"
914
915
  [attr.aria-colcount]="colCount()"
915
916
  [attr.aria-multiselectable]="selection() === 'multiple' ? 'true' : null"
@@ -942,12 +943,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
942
943
  mxCheckbox
943
944
  [checked]="allSelected()"
944
945
  [indeterminate]="someSelected()"
945
- [attr.aria-label]="selectAllText()"
946
+ [attr.aria-label]="(selectAllText() ?? msg().selectAll)"
946
947
  (change)="toggleAll()"
947
948
  tabindex="-1"
948
949
  />
949
950
  } @else {
950
- <span class="mx-visually-hidden">{{ selectText() }}</span>
951
+ <span class="mx-visually-hidden">{{ (selectText() ?? msg().selection) }}</span>
951
952
  }
952
953
  </th>
953
954
  }
@@ -1037,11 +1038,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1037
1038
  <select
1038
1039
  class="mx-grid-filter"
1039
1040
  tabindex="-1"
1040
- [attr.aria-label]="filterText() + ' ' + c.header"
1041
+ [attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
1041
1042
  [value]="filters()[c.key] || ''"
1042
1043
  (change)="setFilter(c.key, $any($event.target).value)"
1043
1044
  >
1044
- <option value="">{{ allText() }}</option>
1045
+ <option value="">{{ (allText() ?? msg().all) }}</option>
1045
1046
  @for (o of optionsOf(c); track o) {
1046
1047
  <option [value]="o" [selected]="filters()[c.key] === o">{{ o }}</option>
1047
1048
  }
@@ -1052,7 +1053,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1052
1053
  class="mx-grid-filter"
1053
1054
  tabindex="-1"
1054
1055
  type="search"
1055
- [attr.aria-label]="filterText() + ' ' + c.header"
1056
+ [attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
1056
1057
  [value]="filters()[c.key] || ''"
1057
1058
  (input)="setFilter(c.key, $any($event.target).value)"
1058
1059
  />
@@ -1065,10 +1066,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1065
1066
  inputmode="decimal"
1066
1067
  placeholder=">, <, 10-20"
1067
1068
  [attr.aria-label]="
1068
- filterText() +
1069
- ' ' +
1070
- c.header +
1071
- ', aceita maior que, menor que e intervalos'
1069
+ msg().numberFilter(filterText() ?? msg().filter, c.header)
1072
1070
  "
1073
1071
  [value]="filters()[c.key] || ''"
1074
1072
  (input)="setFilter(c.key, $any($event.target).value)"
@@ -1107,7 +1105,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1107
1105
  mxCheckbox
1108
1106
  tabindex="-1"
1109
1107
  [checked]="isSelected(row)"
1110
- [attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
1108
+ [attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
1111
1109
  (change)="toggleRow(row)"
1112
1110
  />
1113
1111
  } @else {
@@ -1117,7 +1115,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1117
1115
  tabindex="-1"
1118
1116
  [name]="radioName"
1119
1117
  [checked]="isSelected(row)"
1120
- [attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
1118
+ [attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
1121
1119
  (change)="toggleRow(row)"
1122
1120
  />
1123
1121
  }
@@ -1153,7 +1151,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1153
1151
  [attr.colspan]="colCount()"
1154
1152
  [attr.data-cell]="headerRows() + ':0'"
1155
1153
  >
1156
- {{ loading() ? loadingText() : emptyText() }}
1154
+ {{ loading() ? (loadingText() ?? msg().loading) : (emptyText() ?? msg().empty) }}
1157
1155
  </td>
1158
1156
  </tr>
1159
1157
  }
@@ -1173,7 +1171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
1173
1171
  <span class="mx-grid-status" aria-live="polite">{{ statusText() }}</span>
1174
1172
  <ng-content select="[mxGridFooter]" />
1175
1173
  </div>
1176
- <span class="mx-visually-hidden" [id]="resizeHintId">{{ resizeHint() }}</span>
1174
+ <span class="mx-visually-hidden" [id]="resizeHintId">{{ (resizeHint() ?? msg().resizeHint) }}</span>
1177
1175
  `,
1178
1176
  }]
1179
1177
  }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], selection: [{ type: i0.Input, args: [{ isSignal: true, alias: "selection", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }], manual: [{ type: i0.Input, args: [{ isSignal: true, alias: "manual", required: false }] }], totalRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRows", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], virtual: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], columnMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnMenu", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], labelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelKey", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loadingText: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingText", required: false }] }], columnsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsText", required: false }] }], filterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterText", required: false }] }], allText: [{ type: i0.Input, args: [{ isSignal: true, alias: "allText", required: false }] }], selectAllText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllText", required: false }] }], selectRowText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectRowText", required: false }] }], selectText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectText", required: false }] }], resizeHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizeHint", required: false }] }], rowActivate: [{ type: i0.Output, args: ["rowActivate"] }], cells: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MxGridCell), { isSignal: true }] }], toolbarSlot: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MxGridToolbar), { isSignal: true }] }], scroller: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }] } });