@muxima-ui/core 1.4.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) 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 +102 -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 +32 -27
  25. package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -1
  26. package/fesm2022/muxima-ui-core-form-field.mjs +2 -2
  27. package/fesm2022/muxima-ui-core-form-field.mjs.map +1 -1
  28. package/fesm2022/muxima-ui-core-i18n.mjs +550 -0
  29. package/fesm2022/muxima-ui-core-i18n.mjs.map +1 -0
  30. package/fesm2022/muxima-ui-core-image-cropper.mjs +27 -24
  31. package/fesm2022/muxima-ui-core-image-cropper.mjs.map +1 -1
  32. package/fesm2022/muxima-ui-core-kanban.mjs +22 -19
  33. package/fesm2022/muxima-ui-core-kanban.mjs.map +1 -1
  34. package/fesm2022/muxima-ui-core-notification-center.mjs +42 -37
  35. package/fesm2022/muxima-ui-core-notification-center.mjs.map +1 -1
  36. package/fesm2022/muxima-ui-core-pagination.mjs +29 -26
  37. package/fesm2022/muxima-ui-core-pagination.mjs.map +1 -1
  38. package/fesm2022/muxima-ui-core-progress.mjs +5 -3
  39. package/fesm2022/muxima-ui-core-progress.mjs.map +1 -1
  40. package/fesm2022/muxima-ui-core-rating.mjs +12 -8
  41. package/fesm2022/muxima-ui-core-rating.mjs.map +1 -1
  42. package/fesm2022/muxima-ui-core-select.mjs +14 -11
  43. package/fesm2022/muxima-ui-core-select.mjs.map +1 -1
  44. package/fesm2022/muxima-ui-core-sidebar.mjs +10 -7
  45. package/fesm2022/muxima-ui-core-sidebar.mjs.map +1 -1
  46. package/fesm2022/muxima-ui-core-slider.mjs +10 -8
  47. package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
  48. package/fesm2022/muxima-ui-core-stepper.mjs +5 -3
  49. package/fesm2022/muxima-ui-core-stepper.mjs.map +1 -1
  50. package/fesm2022/muxima-ui-core-table.mjs +4 -4
  51. package/fesm2022/muxima-ui-core-table.mjs.map +1 -1
  52. package/fesm2022/muxima-ui-core-time-picker.mjs +7 -5
  53. package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -1
  54. package/fesm2022/muxima-ui-core-toast.mjs +8 -5
  55. package/fesm2022/muxima-ui-core-toast.mjs.map +1 -1
  56. package/fesm2022/muxima-ui-core-tour.mjs +6 -12
  57. package/fesm2022/muxima-ui-core-tour.mjs.map +1 -1
  58. package/fesm2022/muxima-ui-core.mjs +1 -1
  59. package/fesm2022/muxima-ui-core.mjs.map +1 -1
  60. package/package.json +5 -1
  61. package/types/muxima-ui-core-alert.d.ts +3 -1
  62. package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
  63. package/types/muxima-ui-core-carousel.d.ts +4 -2
  64. package/types/muxima-ui-core-chips.d.ts +23 -3
  65. package/types/muxima-ui-core-clipboard.d.ts +6 -3
  66. package/types/muxima-ui-core-color-picker.d.ts +40 -7
  67. package/types/muxima-ui-core-combobox.d.ts +6 -3
  68. package/types/muxima-ui-core-command.d.ts +7 -3
  69. package/types/muxima-ui-core-data-grid.d.ts +30 -10
  70. package/types/muxima-ui-core-date-picker.d.ts +64 -15
  71. package/types/muxima-ui-core-editor.d.ts +13 -2
  72. package/types/muxima-ui-core-file-upload.d.ts +23 -7
  73. package/types/muxima-ui-core-form-field.d.ts +2 -2
  74. package/types/muxima-ui-core-i18n.d.ts +322 -0
  75. package/types/muxima-ui-core-image-cropper.d.ts +19 -6
  76. package/types/muxima-ui-core-kanban.d.ts +16 -3
  77. package/types/muxima-ui-core-notification-center.d.ts +31 -9
  78. package/types/muxima-ui-core-pagination.d.ts +16 -1
  79. package/types/muxima-ui-core-progress.d.ts +10 -8
  80. package/types/muxima-ui-core-rating.d.ts +6 -2
  81. package/types/muxima-ui-core-select.d.ts +6 -3
  82. package/types/muxima-ui-core-sidebar.d.ts +6 -3
  83. package/types/muxima-ui-core-slider.d.ts +6 -4
  84. package/types/muxima-ui-core-stepper.d.ts +10 -8
  85. package/types/muxima-ui-core-table.d.ts +3 -3
  86. package/types/muxima-ui-core-time-picker.d.ts +3 -1
  87. package/types/muxima-ui-core-toast.d.ts +3 -0
  88. package/types/muxima-ui-core-tour.d.ts +3 -3
  89. package/types/muxima-ui-core.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"muxima-ui-core-form-field.mjs","sources":["../../../projects/core/form-field/form-control.ts","../../../projects/core/form-field/form-field.ts","../../../projects/core/form-field/native-control.ts","../../../projects/core/form-field/input.ts","../../../projects/core/form-field/choice.ts","../../../projects/core/form-field/input-group.ts","../../../projects/core/form-field/muxima-ui-core-form-field.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * Contrato que um controlo (MxInput, MxSelect) cumpre para poder viver dentro de\n * um `<mx-form-field>`. O campo usa-o para ligar o label, as mensagens e o estado de erro.\n */\nexport interface MxFormFieldControl {\n /** id do elemento focável, usado pelo `for` do label. */\n readonly controlId: Signal<string>;\n /** true quando o controlo é inválido e o utilizador já interagiu com ele. */\n errorState(): boolean;\n /** true quando o controlo é obrigatório. */\n isRequired(): boolean;\n}\n\nexport const MX_FORM_FIELD_CONTROL = new InjectionToken<MxFormFieldControl>('MX_FORM_FIELD_CONTROL');\n\nlet nextId = 0;\n/** Gera ids estáveis e únicos para ligar elementos por aria-*. */\nexport function mxUniqueId(prefix: string): string {\n return `${prefix}-${nextId++}`;\n}\n\n/** Normaliza texto para pesquisa: sem acentos e em minúsculas (\"Huíla\" → \"huila\"). */\nexport function mxNormalize(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n computed,\n contentChild,\n contentChildren,\n inject,\n input,\n} from '@angular/core';\nimport { MX_FORM_FIELD_CONTROL, mxUniqueId } from './form-control';\n\n/** Texto de ajuda por baixo do controlo. */\n@Directive({\n selector: 'mx-hint, [mxHint]',\n host: {\n class: 'mx-hint',\n '[id]': 'id()',\n },\n})\nexport class MxHint {\n readonly id = input(mxUniqueId('mx-hint'));\n}\n\n/**\n * Mensagem de erro. Só aparece quando o controlo é inválido e o utilizador\n * já lhe tocou, e é anunciada pelos leitores de ecrã.\n */\n@Directive({\n selector: 'mx-error, [mxError]',\n host: {\n class: 'mx-error',\n role: 'alert',\n '[id]': 'id()',\n '[attr.hidden]': 'field?.showsError() ? null : \"\"',\n },\n})\nexport class MxError {\n readonly id = input(mxUniqueId('mx-error'));\n protected readonly field = inject(MxFormField, { optional: true });\n}\n\n/** Label ligado automaticamente ao controlo do campo. */\n@Directive({\n selector: 'label[mxLabel]',\n host: {\n class: 'mx-label',\n '[id]': 'id()',\n '[attr.for]': 'field?.controlId() ?? null',\n '[attr.data-required]': 'field?.isRequired() ? \"\" : null',\n },\n})\nexport class MxLabel {\n readonly id = input(mxUniqueId('mx-label'));\n protected readonly field = inject(MxFormField, { optional: true });\n}\n\n/**\n * Agrupa label, controlo, ajuda e erro, e liga-os entre si com\n * `for`, `aria-describedby` e `aria-invalid`.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Email</label>\n * <input mxInput type=\"email\" [formControl]=\"email\" required />\n * <mx-hint>Enviamos o recibo para este endereço.</mx-hint>\n * <mx-error>Introduz um email válido.</mx-error>\n * </mx-form-field>\n * ```\n */\n@Component({\n selector: 'mx-form-field',\n exportAs: 'mxFormField',\n template: `<ng-content />`,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mx-form-field' },\n})\nexport class MxFormField {\n private readonly control = contentChild(MX_FORM_FIELD_CONTROL);\n private readonly hints = contentChildren(MxHint);\n private readonly errors = contentChildren(MxError);\n private readonly label = contentChild(MxLabel);\n\n /** id do label, para controlos que precisam de aria-labelledby (ex.: a lista do Select). */\n readonly labelId = computed(() => this.label()?.id() ?? null);\n\n readonly controlId = computed(() => this.control()?.controlId() ?? null);\n\n showsError(): boolean {\n return this.control()?.errorState() ?? false;\n }\n\n isRequired(): boolean {\n return this.control()?.isRequired() ?? false;\n }\n\n /** ids que o controlo deve anunciar em aria-describedby. */\n describedBy(): string | null {\n const ids = this.hints().map((h) => h.id());\n if (this.showsError()) ids.push(...this.errors().map((e) => e.id()));\n return ids.length ? ids.join(' ') : null;\n }\n}\n","import { Directive, ElementRef, booleanAttribute, computed, inject, input } from '@angular/core';\nimport { NgControl, Validators } from '@angular/forms';\nimport { MxFormFieldControl, mxUniqueId } from './form-control';\nimport { MxFormField } from './form-field';\n\n/**\n * Base das directivas aplicadas a controlos nativos (input, textarea).\n * Trata do id, do estado de erro ligado ao Reactive Forms, de aria-invalid,\n * aria-required e aria-describedby, para que todos os campos se comportem igual.\n */\n@Directive({\n host: {\n '[id]': 'controlId()',\n '[attr.aria-invalid]': 'errorState() ? \"true\" : null',\n '[attr.aria-describedby]': 'describedBy()',\n '[attr.aria-required]': 'isRequired() && !nativeRequiredSupported ? \"true\" : null',\n },\n})\nexport abstract class MxNativeControl implements MxFormFieldControl {\n /** id do elemento. Por omissão é gerado automaticamente. */\n readonly id = input<string | undefined>(undefined);\n /** Força o estado de erro, para validações feitas fora dos formulários Angular. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** ids extra para aria-describedby, além da ajuda e do erro do campo. */\n readonly ariaDescribedBy = input<string | undefined>(undefined, { alias: 'aria-describedby' });\n\n private readonly generatedId = mxUniqueId('mx-control');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly ngControl = inject(NgControl, { self: true, optional: true });\n protected readonly field = inject(MxFormField, { optional: true });\n protected readonly element = inject<ElementRef<HTMLInputElement | HTMLTextAreaElement>>(ElementRef).nativeElement;\n /** Com o atributo required nativo o leitor de ecrã já anuncia \"obrigatório\". */\n protected get nativeRequiredSupported(): boolean {\n return this.element.required;\n }\n\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\n isRequired(): boolean {\n return this.element.required || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n protected describedBy(): string | null {\n const ids = [this.ariaDescribedBy(), this.field?.describedBy()].filter(Boolean);\n return ids.length ? ids.join(' ') : null;\n }\n}\n","import { Directive, booleanAttribute, input } from '@angular/core';\nimport { MX_FORM_FIELD_CONTROL } from './form-control';\nimport { MxNativeControl } from './native-control';\n\n/**\n * Campo de texto sobre o `<input>` ou `<textarea>` nativo.\n * Funciona com `ngModel`, `formControl` e `formControlName` sem configuração.\n *\n * ```html\n * <input mxInput type=\"email\" formControlName=\"email\" />\n * <textarea mxInput autosize rows=\"3\"></textarea>\n * ```\n */\n@Directive({\n selector: 'input[mxInput], textarea[mxInput]',\n exportAs: 'mxInput',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxInput }],\n host: {\n class: 'mx-input',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-autosize]': 'autosize() ? \"\" : null',\n },\n})\nexport class MxInput extends MxNativeControl {\n /** Altura: sm 32 px, md 36 px, lg 40 px. */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Só em textarea: a altura acompanha o texto (até max-height). */\n readonly autosize = input(false, { transform: booleanAttribute });\n}\n","import { Directive, booleanAttribute, input } from '@angular/core';\n\n/**\n * Label que envolve uma caixa de verificação, um botão de opção ou um interruptor\n * com o seu texto. Clicar no texto activa o controlo, sem ids.\n *\n * ```html\n * <label mxChoice><input type=\"checkbox\" mxCheckbox /> Aceito os termos</label>\n * ```\n */\n@Directive({\n selector: 'label[mxChoice]',\n host: { class: 'mx-choice', '[attr.data-card]': 'card() ? \"\" : null' },\n})\nexport class MxChoice {\n /** Mostra a opção como um cartão clicável, com borda Kwanza quando escolhida. */\n readonly card = input(false, { transform: booleanAttribute });\n}\n\n/** Texto secundário de uma opção, por baixo do título. */\n@Directive({ selector: '[mxChoiceDescription]', host: { class: 'mx-choice-description' } })\nexport class MxChoiceDescription {}\n\n/**\n * Grupo de controlos com título, sobre o `<fieldset>` e `<legend>` nativos.\n * O leitor de ecrã anuncia o título ao entrar no grupo.\n *\n * ```html\n * <fieldset mxFieldset>\n * <legend>Forma de pagamento</legend>\n * <label mxChoice><input type=\"radio\" mxRadio name=\"pag\" value=\"ref\" /> Referência</label>\n * </fieldset>\n * ```\n */\n@Directive({\n selector: 'fieldset[mxFieldset]',\n host: { class: 'mx-fieldset', '[attr.data-orientation]': 'orientation()' },\n})\nexport class MxFieldset {\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Junta um campo com texto ou botões antes e depois (prefixo e sufixo).\n *\n * ```html\n * <div mxInputGroup>\n * <span mxInputAddon>Kz</span>\n * <input mxInput inputmode=\"decimal\" aria-label=\"Valor\" />\n * <span mxInputAddon>,00</span>\n * </div>\n * ```\n *\n * O prefixo e o sufixo são só visuais: inclui a unidade no label (ex.: \"Valor em Kz\").\n */\n@Directive({ selector: '[mxInputGroup]', host: { class: 'mx-input-group' } })\nexport class MxInputGroup {}\n\n/** Texto, ícone ou botão colado ao campo dentro de um `[mxInputGroup]`. */\n@Directive({ selector: '[mxInputAddon]', host: { class: 'mx-input-addon' } })\nexport class MxInputAddon {}\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-form-field.mjs","sources":["../../../projects/core/form-field/form-control.ts","../../../projects/core/form-field/form-field.ts","../../../projects/core/form-field/native-control.ts","../../../projects/core/form-field/input.ts","../../../projects/core/form-field/choice.ts","../../../projects/core/form-field/input-group.ts","../../../projects/core/form-field/muxima-ui-core-form-field.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * Contrato que um controlo (MxInput, MxSelect) cumpre para poder viver dentro de\n * um `<mx-form-field>`. O campo usa-o para ligar o label, as mensagens e o estado de erro.\n */\nexport interface MxFormFieldControl {\n /** id do elemento focável, usado pelo `for` do label. */\n readonly controlId: Signal<string>;\n /** true quando o controlo é inválido e o utilizador já interagiu com ele. */\n errorState(): boolean;\n /** true quando o controlo é obrigatório. */\n isRequired(): boolean;\n}\n\nexport const MX_FORM_FIELD_CONTROL = new InjectionToken<MxFormFieldControl>('MX_FORM_FIELD_CONTROL');\n\nlet nextId = 0;\n/** Gera ids estáveis e únicos para ligar elementos por aria-*. */\nexport function mxUniqueId(prefix: string): string {\n return `${prefix}-${nextId++}`;\n}\n\n/** Normaliza texto para pesquisa: sem acentos e em minúsculas (\"Huíla\" → \"huila\"). */\nexport function mxNormalize(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n computed,\n contentChild,\n contentChildren,\n inject,\n input,\n} from '@angular/core';\nimport { MX_FORM_FIELD_CONTROL, mxUniqueId } from './form-control';\n\n/** Texto de ajuda por baixo do controlo. */\n@Directive({\n selector: 'mx-hint, [mxHint]',\n host: {\n class: 'mx-hint',\n '[id]': 'id()',\n },\n})\nexport class MxHint {\n readonly id = input(mxUniqueId('mx-hint'));\n}\n\n/**\n * Mensagem de erro. Só aparece quando o controlo é inválido e o utilizador\n * já lhe tocou, e é anunciada pelos leitores de ecrã.\n */\n@Directive({\n selector: 'mx-error, [mxError]',\n host: {\n class: 'mx-error',\n role: 'alert',\n '[id]': 'id()',\n '[attr.hidden]': 'field?.showsError() ? null : \"\"',\n },\n})\nexport class MxError {\n readonly id = input(mxUniqueId('mx-error'));\n protected readonly field = inject(MxFormField, { optional: true });\n}\n\n/** Label ligado automaticamente ao controlo do campo. */\n@Directive({\n selector: 'label[mxLabel]',\n host: {\n class: 'mx-label',\n '[id]': 'id()',\n '[attr.for]': 'field?.controlId() ?? null',\n '[attr.data-required]': 'field?.isRequired() ? \"\" : null',\n },\n})\nexport class MxLabel {\n readonly id = input(mxUniqueId('mx-label'));\n protected readonly field = inject(MxFormField, { optional: true });\n}\n\n/**\n * Agrupa label, controlo, ajuda e erro, e liga-os entre si com\n * `for`, `aria-describedby` e `aria-invalid`.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Email</label>\n * <input mxInput type=\"email\" [formControl]=\"email\" required />\n * <mx-hint>Enviamos o recibo para este endereço.</mx-hint>\n * <mx-error>Introduz um email válido.</mx-error>\n * </mx-form-field>\n * ```\n */\n@Component({\n selector: 'mx-form-field',\n exportAs: 'mxFormField',\n template: `<ng-content />`,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mx-form-field' },\n})\nexport class MxFormField {\n private readonly control = contentChild(MX_FORM_FIELD_CONTROL);\n private readonly hints = contentChildren(MxHint);\n private readonly errors = contentChildren(MxError);\n private readonly label = contentChild(MxLabel);\n\n /** id do label, para controlos que precisam de aria-labelledby (ex.: a lista do Select). */\n readonly labelId = computed(() => this.label()?.id() ?? null);\n\n readonly controlId = computed(() => this.control()?.controlId() ?? null);\n\n showsError(): boolean {\n return this.control()?.errorState() ?? false;\n }\n\n isRequired(): boolean {\n return this.control()?.isRequired() ?? false;\n }\n\n /** ids que o controlo deve anunciar em aria-describedby. */\n describedBy(): string | null {\n const ids = this.hints().map((h) => h.id());\n if (this.showsError()) ids.push(...this.errors().map((e) => e.id()));\n return ids.length ? ids.join(' ') : null;\n }\n}\n","import { Directive, ElementRef, booleanAttribute, computed, inject, input } from '@angular/core';\nimport { NgControl, Validators } from '@angular/forms';\nimport { MxFormFieldControl, mxUniqueId } from './form-control';\nimport { MxFormField } from './form-field';\n\n/**\n * Base das directivas aplicadas a controlos nativos (input, textarea).\n * Trata do id, do estado de erro ligado ao Reactive Forms, de aria-invalid,\n * aria-required e aria-describedby, para que todos os campos se comportem igual.\n */\n@Directive({\n host: {\n '[id]': 'controlId()',\n '[attr.aria-invalid]': 'errorState() ? \"true\" : null',\n '[attr.aria-describedby]': 'describedBy()',\n '[attr.aria-required]': 'isRequired() && !nativeRequiredSupported ? \"true\" : null',\n },\n})\nexport abstract class MxNativeControl implements MxFormFieldControl {\n /** id do elemento. Por omissão é gerado automaticamente. */\n readonly id = input<string | undefined>(undefined);\n /** Força o estado de erro, para validações feitas fora dos formulários Angular. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** ids extra para aria-describedby, além da ajuda e do erro do campo. */\n readonly ariaDescribedBy = input<string | undefined>(undefined, { alias: 'aria-describedby' });\n\n private readonly generatedId = mxUniqueId('mx-control');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly ngControl = inject(NgControl, { self: true, optional: true });\n protected readonly field = inject(MxFormField, { optional: true });\n protected readonly element = inject<ElementRef<HTMLInputElement | HTMLTextAreaElement>>(ElementRef).nativeElement;\n /** Com o atributo required nativo o leitor de ecrã já anuncia \"obrigatório\". */\n protected get nativeRequiredSupported(): boolean {\n return this.element.required;\n }\n\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\n isRequired(): boolean {\n return this.element.required || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n protected describedBy(): string | null {\n const ids = [this.ariaDescribedBy(), this.field?.describedBy()].filter(Boolean);\n return ids.length ? ids.join(' ') : null;\n }\n}\n","import { Directive, booleanAttribute, input } from '@angular/core';\nimport { MX_FORM_FIELD_CONTROL } from './form-control';\nimport { MxNativeControl } from './native-control';\n\n/**\n * Campo de texto sobre o `<input>` ou `<textarea>` nativo.\n * Funciona com `ngModel`, `formControl` e `formControlName` sem configuração.\n *\n * ```html\n * <input mxInput type=\"email\" formControlName=\"email\" />\n * <textarea mxInput autosize rows=\"3\"></textarea>\n * ```\n */\n@Directive({\n selector: 'input[mxInput], textarea[mxInput]',\n exportAs: 'mxInput',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxInput }],\n host: {\n class: 'mx-input',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-autosize]': 'autosize() ? \"\" : null',\n },\n})\nexport class MxInput extends MxNativeControl {\n /** Altura: sm 32 px, md 36 px, lg 40 px. */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Só em textarea: a altura acompanha o texto (até max-height). */\n readonly autosize = input(false, { transform: booleanAttribute });\n}\n","import { Directive, booleanAttribute, input } from '@angular/core';\n\n/**\n * Label que envolve uma caixa de verificação, um botão de opção ou um interruptor\n * com o seu texto. Clicar no texto activa o controlo, sem ids.\n *\n * ```html\n * <label mxChoice><input type=\"checkbox\" mxCheckbox /> Aceito os termos</label>\n * ```\n */\n@Directive({\n selector: 'label[mxChoice]',\n host: { class: 'mx-choice', '[attr.data-card]': 'card() ? \"\" : null' },\n})\nexport class MxChoice {\n /** Mostra a opção como um cartão clicável, com borda Kwanza quando escolhida. */\n readonly card = input(false, { transform: booleanAttribute });\n}\n\n/** Texto secundário de uma opção, por baixo do título. */\n@Directive({ selector: '[mxChoiceDescription]', host: { class: 'mx-choice-description' } })\nexport class MxChoiceDescription {}\n\n/**\n * Grupo de controlos com título, sobre o `<fieldset>` e `<legend>` nativos.\n * O leitor de ecrã anuncia o título ao entrar no grupo.\n *\n * ```html\n * <fieldset mxFieldset>\n * <legend>Forma de pagamento</legend>\n * <label mxChoice><input type=\"radio\" mxRadio name=\"pag\" value=\"ref\" /> Referência</label>\n * </fieldset>\n * ```\n */\n@Directive({\n selector: 'fieldset[mxFieldset]',\n host: { class: 'mx-fieldset', '[attr.data-orientation]': 'orientation()' },\n})\nexport class MxFieldset {\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Junta um campo com texto ou botões antes e depois (prefixo e sufixo).\n *\n * ```html\n * <div mxInputGroup>\n * <span mxInputAddon>US$</span>\n * <input mxInput inputmode=\"decimal\" aria-label=\"Valor\" />\n * <span mxInputAddon>,00</span>\n * </div>\n * ```\n *\n * O prefixo e o sufixo são só visuais: inclui a unidade no label (ex.: \"Valor em US$\").\n */\n@Directive({ selector: '[mxInputGroup]', host: { class: 'mx-input-group' } })\nexport class MxInputGroup {}\n\n/** Texto, ícone ou botão colado ao campo dentro de um `[mxInputGroup]`. */\n@Directive({ selector: '[mxInputAddon]', host: { class: 'mx-input-addon' } })\nexport class MxInputAddon {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,550 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, signal, computed, Injectable, makeEnvironmentProviders } from '@angular/core';
3
+
4
+ const plural$1 = (n, one, many) => (n === 1 ? one : many);
5
+ /** Português (Angola). */
6
+ const MX_MESSAGES_PT = {
7
+ intlLocale: 'pt-AO',
8
+ dateOrder: 'dmy',
9
+ firstDayOfWeek: 1,
10
+ alert: { close: 'Fechar aviso' },
11
+ breadcrumb: { label: 'Localização' },
12
+ calendar: {
13
+ previousMonth: (m) => `Mês anterior, ${m}`,
14
+ nextMonth: (m) => `Mês seguinte, ${m}`,
15
+ rangeStart: 'início do intervalo',
16
+ rangeEnd: 'fim do intervalo',
17
+ rangeStartEnd: 'início e fim do intervalo',
18
+ rangeHint: (s, e) => `Intervalo de ${s} a ${e}.`,
19
+ rangeStartHint: (s) => `Início ${s}. Escolhe a data de fim.`,
20
+ },
21
+ carousel: {
22
+ carousel: 'carrossel',
23
+ slide: 'diapositivo',
24
+ previous: 'Diapositivo anterior',
25
+ next: 'Diapositivo seguinte',
26
+ choose: 'Escolher diapositivo',
27
+ goTo: (n) => `Diapositivo ${n}`,
28
+ position: (n, total) => `${n} de ${total}`,
29
+ play: 'Iniciar a rotação automática',
30
+ pause: 'Parar a rotação automática',
31
+ },
32
+ chips: {
33
+ remove: 'Remover',
34
+ list: 'Etiquetas',
35
+ help: 'Enter para acrescentar. Backspace no campo vazio vai para a última etiqueta.',
36
+ added: (t) => `${t} acrescentado.`,
37
+ removed: (t) => `${t} removido.`,
38
+ max: (n) => `Máximo de ${n} etiquetas.`,
39
+ duplicate: (t) => `${t} já está na lista.`,
40
+ },
41
+ clipboard: { copy: 'Copiar', copied: 'Copiado', failed: 'Não foi possível copiar' },
42
+ colorPicker: {
43
+ choose: 'Escolher cor',
44
+ change: (name, hex) => `Mudar cor, ${name}, ${hex}`,
45
+ area: 'Saturação e brilho',
46
+ hue: 'Matiz',
47
+ alpha: 'Opacidade',
48
+ swatches: 'Cores sugeridas',
49
+ eyeDropper: 'Escolher uma cor do ecrã',
50
+ hex: 'Hex',
51
+ areaValue: (s, v, name) => `Saturação ${s}%, brilho ${v}%, ${name}`,
52
+ hueValue: (deg, name) => `${deg} graus, ${name}`,
53
+ names: {
54
+ black: 'preto',
55
+ white: 'branco',
56
+ lightGray: 'cinzento claro',
57
+ gray: 'cinzento',
58
+ darkGray: 'cinzento escuro',
59
+ brown: 'castanho',
60
+ red: 'vermelho',
61
+ orange: 'laranja',
62
+ yellow: 'amarelo',
63
+ lime: 'verde-lima',
64
+ green: 'verde',
65
+ teal: 'azul-petróleo',
66
+ blue: 'azul',
67
+ purple: 'roxo',
68
+ magenta: 'magenta',
69
+ tone: (name, tone) => `${name} ${tone === 'dark' ? 'escuro' : 'claro'}`,
70
+ },
71
+ },
72
+ combobox: { placeholder: 'Pesquisar', empty: 'Sem resultados', loading: 'A pesquisar...' },
73
+ command: {
74
+ placeholder: 'Pesquisar...',
75
+ label: 'Pesquisar',
76
+ empty: 'Nada encontrado para',
77
+ results: (n) => `${n} ${plural$1(n, 'resultado', 'resultados')}`,
78
+ },
79
+ dataGrid: {
80
+ label: 'Tabela de dados',
81
+ empty: 'Sem resultados.',
82
+ loading: 'A carregar...',
83
+ columns: 'Colunas',
84
+ filter: 'Filtrar',
85
+ all: 'Todos',
86
+ selectAll: 'Seleccionar todas as linhas',
87
+ selectRow: 'Seleccionar',
88
+ selection: 'Selecção',
89
+ resizeHint: 'Alt e setas esquerda e direita mudam a largura da coluna.',
90
+ numberFilter: (f, c) => `${f} ${c}, aceita maior que, menor que e intervalos`,
91
+ rows: (n, count) => `${n} ${plural$1(count, 'linha', 'linhas')}`,
92
+ of: (total) => ` de ${total}`,
93
+ selected: (n, count) => `${n} ${plural$1(count, 'seleccionada', 'seleccionadas')}`,
94
+ sorted: (c, d) => `Ordenado por ${c}, ${d === 'asc' ? 'ascendente' : 'descendente'}`,
95
+ unsorted: 'Sem ordenação',
96
+ width: (c, px) => `${c}, ${px} píxeis`,
97
+ },
98
+ datePicker: {
99
+ placeholder: 'dd/mm/aaaa',
100
+ choose: 'Escolher data',
101
+ change: (d) => `Mudar data, ${d}`,
102
+ },
103
+ dateRangePicker: {
104
+ start: 'início',
105
+ end: 'fim',
106
+ choose: 'Escolher intervalo',
107
+ change: (s, e) => `Mudar intervalo, ${s} a ${e}`,
108
+ presets: 'Atalhos',
109
+ last7Days: 'Últimos 7 dias',
110
+ last30Days: 'Últimos 30 dias',
111
+ thisMonth: 'Este mês',
112
+ lastMonth: 'Mês passado',
113
+ },
114
+ editor: {
115
+ toolbar: 'Formatação',
116
+ link: 'Endereço da ligação',
117
+ apply: 'Aplicar',
118
+ remove: 'Remover',
119
+ cancel: 'Cancelar',
120
+ characters: 'caracteres',
121
+ tools: {
122
+ bold: 'Negrito',
123
+ italic: 'Itálico',
124
+ underline: 'Sublinhado',
125
+ strike: 'Riscado',
126
+ code: 'Código',
127
+ heading2: 'Título',
128
+ heading3: 'Subtítulo',
129
+ paragraph: 'Parágrafo',
130
+ bulletList: 'Lista',
131
+ orderedList: 'Lista numerada',
132
+ blockquote: 'Citação',
133
+ link: 'Ligação',
134
+ undo: 'Anular',
135
+ redo: 'Refazer',
136
+ },
137
+ },
138
+ fileUpload: {
139
+ drop: 'Arrasta os ficheiros para aqui ou',
140
+ browse: 'escolhe no computador',
141
+ list: 'Ficheiros escolhidos',
142
+ remove: 'Remover',
143
+ done: 'Enviado',
144
+ uploading: (name) => `A enviar ${name}`,
145
+ rejectedType: (name) => `${name}: tipo de ficheiro não aceite.`,
146
+ rejectedSize: (name, size, max) => `${name}: tem ${size}, o máximo é ${max}.`,
147
+ rejectedCount: (name, max) => `${name}: só podes juntar ${max} ${plural$1(max, 'ficheiro', 'ficheiros')}.`,
148
+ addedOne: (name) => `${name} juntado.`,
149
+ addedMany: (n) => `${n} ficheiros juntados.`,
150
+ removed: (name) => `${name} removido.`,
151
+ },
152
+ imageCropper: {
153
+ alt: 'Imagem a recortar',
154
+ help: 'Setas movem a área. Alt e setas mudam o tamanho. Shift dá passos maiores.',
155
+ zoom: 'Zoom',
156
+ rotateLeft: 'Rodar para a esquerda',
157
+ rotateRight: 'Rodar para a direita',
158
+ reset: 'Repor',
159
+ area: 'área de recorte',
160
+ size: (w, h) => `${w} por ${h} píxeis`,
161
+ position: (w, h, x, y) => `${w} por ${h} píxeis, a ${x} da esquerda e ${y} do topo`,
162
+ rotated: (deg) => `Rodada ${deg} graus`,
163
+ },
164
+ kanban: {
165
+ label: 'Quadro',
166
+ empty: 'Sem cartões',
167
+ help: 'Espaço para agarrar. Setas para mover. Espaço para largar, Esc para cancelar.',
168
+ cards: (n, limit) => plural$1(n, 'cartão', 'cartões') + (limit ? `, máximo ${limit}` : ''),
169
+ grabbed: (card) => `${card}, agarrado`,
170
+ position: (col, p, total) => `${col}, posição ${p} de ${total}`,
171
+ pickedUp: (card, where) => `${card} agarrado. ${where}.`,
172
+ dropped: (card, where) => `${card} largado. ${where}.`,
173
+ cancelled: (card, where) => `Movimento cancelado. ${card} voltou a ${where}.`,
174
+ full: (col, limit) => `${col} está cheia, máximo ${limit}.`,
175
+ },
176
+ notifications: {
177
+ title: 'Notificações',
178
+ markAll: 'Marcar todas como lidas',
179
+ empty: 'Sem notificações.',
180
+ emptyUnread: 'Está tudo lido.',
181
+ filter: 'Mostrar',
182
+ all: 'Todas',
183
+ unread: 'Por ler',
184
+ unreadPrefix: 'Por ler: ',
185
+ unreadCount: () => 'por ler',
186
+ markRead: (t) => `Marcar como lida: ${t}`,
187
+ remove: (t) => `Remover: ${t}`,
188
+ removed: (t) => `${t} removida.`,
189
+ newOne: (t) => `Nova notificação: ${t}`,
190
+ newMany: (n) => `${n} notificações novas`,
191
+ now: 'agora',
192
+ bellCount: (label, n) => `${label}, ${n} por ler`,
193
+ },
194
+ pagination: {
195
+ label: 'Paginação',
196
+ rowsPerPage: 'Linhas por página',
197
+ first: 'Primeira página',
198
+ previous: 'Página anterior',
199
+ previousShort: 'Anterior',
200
+ next: 'Página seguinte',
201
+ nextShort: 'Seguinte',
202
+ last: 'Última página',
203
+ page: (n) => `Página ${n}`,
204
+ pageOf: (c, t) => `Página ${c} de ${t}`,
205
+ range: (from, to, total) => `${from}–${to} de ${total}`,
206
+ noResults: '0 resultados',
207
+ },
208
+ progress: { label: 'A carregar' },
209
+ rangeSlider: { low: 'mínimo', high: 'máximo' },
210
+ rating: {
211
+ label: 'Avaliação',
212
+ star: (n) => `${n} ${plural$1(n, 'estrela', 'estrelas')}`,
213
+ summary: (v, max) => `${v} de ${max} estrelas`,
214
+ },
215
+ select: { placeholder: 'Seleccionar', empty: 'Sem opções', loading: 'A carregar...' },
216
+ sidebar: { label: 'Principal', collapse: 'Recolher menu', expand: 'Expandir menu' },
217
+ stepper: { complete: 'concluído' },
218
+ timePicker: { placeholder: 'hh:mm', label: 'Horas' },
219
+ toast: {
220
+ region: 'Notificações',
221
+ close: 'Fechar notificação',
222
+ action: (label) => `Acção disponível: ${label}`,
223
+ },
224
+ tour: {
225
+ next: 'Seguinte',
226
+ previous: 'Anterior',
227
+ done: 'Concluir',
228
+ skip: 'Saltar',
229
+ close: 'Fechar a visita guiada',
230
+ progress: (c, t) => `Passo ${c} de ${t}`,
231
+ },
232
+ };
233
+
234
+ const plural = (n, one, many) => (n === 1 ? one : many);
235
+ /** English (United States). */
236
+ const MX_MESSAGES_EN = {
237
+ intlLocale: 'en-US',
238
+ dateOrder: 'mdy',
239
+ firstDayOfWeek: 0,
240
+ alert: { close: 'Dismiss alert' },
241
+ breadcrumb: { label: 'Breadcrumb' },
242
+ calendar: {
243
+ previousMonth: (m) => `Previous month, ${m}`,
244
+ nextMonth: (m) => `Next month, ${m}`,
245
+ rangeStart: 'range start',
246
+ rangeEnd: 'range end',
247
+ rangeStartEnd: 'range start and end',
248
+ rangeHint: (s, e) => `Range from ${s} to ${e}.`,
249
+ rangeStartHint: (s) => `Start ${s}. Choose the end date.`,
250
+ },
251
+ carousel: {
252
+ carousel: 'carousel',
253
+ slide: 'slide',
254
+ previous: 'Previous slide',
255
+ next: 'Next slide',
256
+ choose: 'Choose slide',
257
+ goTo: (n) => `Slide ${n}`,
258
+ position: (n, total) => `${n} of ${total}`,
259
+ play: 'Start automatic rotation',
260
+ pause: 'Stop automatic rotation',
261
+ },
262
+ chips: {
263
+ remove: 'Remove',
264
+ list: 'Tags',
265
+ help: 'Press Enter to add. Backspace in the empty field moves to the last tag.',
266
+ added: (t) => `${t} added.`,
267
+ removed: (t) => `${t} removed.`,
268
+ max: (n) => `Maximum of ${n} tags.`,
269
+ duplicate: (t) => `${t} is already in the list.`,
270
+ },
271
+ clipboard: { copy: 'Copy', copied: 'Copied', failed: 'Could not copy' },
272
+ colorPicker: {
273
+ choose: 'Choose color',
274
+ change: (name, hex) => `Change color, ${name}, ${hex}`,
275
+ area: 'Saturation and brightness',
276
+ hue: 'Hue',
277
+ alpha: 'Opacity',
278
+ swatches: 'Suggested colors',
279
+ eyeDropper: 'Pick a color from the screen',
280
+ hex: 'Hex',
281
+ areaValue: (s, v, name) => `Saturation ${s}%, brightness ${v}%, ${name}`,
282
+ hueValue: (deg, name) => `${deg} degrees, ${name}`,
283
+ names: {
284
+ black: 'black',
285
+ white: 'white',
286
+ lightGray: 'light gray',
287
+ gray: 'gray',
288
+ darkGray: 'dark gray',
289
+ brown: 'brown',
290
+ red: 'red',
291
+ orange: 'orange',
292
+ yellow: 'yellow',
293
+ lime: 'lime',
294
+ green: 'green',
295
+ teal: 'teal',
296
+ blue: 'blue',
297
+ purple: 'purple',
298
+ magenta: 'magenta',
299
+ tone: (name, tone) => `${tone} ${name}`,
300
+ },
301
+ },
302
+ combobox: { placeholder: 'Search', empty: 'No results', loading: 'Searching...' },
303
+ command: {
304
+ placeholder: 'Search...',
305
+ label: 'Search',
306
+ empty: 'Nothing found for',
307
+ results: (n) => `${n} ${plural(n, 'result', 'results')}`,
308
+ },
309
+ dataGrid: {
310
+ label: 'Data table',
311
+ empty: 'No results.',
312
+ loading: 'Loading...',
313
+ columns: 'Columns',
314
+ filter: 'Filter',
315
+ all: 'All',
316
+ selectAll: 'Select all rows',
317
+ selectRow: 'Select',
318
+ selection: 'Selection',
319
+ resizeHint: 'Alt and the left and right arrows change the column width.',
320
+ numberFilter: (f, c) => `${f} ${c}, accepts greater than, less than and ranges`,
321
+ rows: (n, count) => `${n} ${plural(count, 'row', 'rows')}`,
322
+ of: (total) => ` of ${total}`,
323
+ selected: (n) => `${n} selected`,
324
+ sorted: (c, d) => `Sorted by ${c}, ${d === 'asc' ? 'ascending' : 'descending'}`,
325
+ unsorted: 'Not sorted',
326
+ width: (c, px) => `${c}, ${px} pixels`,
327
+ },
328
+ datePicker: {
329
+ placeholder: 'mm/dd/yyyy',
330
+ choose: 'Choose date',
331
+ change: (d) => `Change date, ${d}`,
332
+ },
333
+ dateRangePicker: {
334
+ start: 'start',
335
+ end: 'end',
336
+ choose: 'Choose range',
337
+ change: (s, e) => `Change range, ${s} to ${e}`,
338
+ presets: 'Shortcuts',
339
+ last7Days: 'Last 7 days',
340
+ last30Days: 'Last 30 days',
341
+ thisMonth: 'This month',
342
+ lastMonth: 'Last month',
343
+ },
344
+ editor: {
345
+ toolbar: 'Formatting',
346
+ link: 'Link address',
347
+ apply: 'Apply',
348
+ remove: 'Remove',
349
+ cancel: 'Cancel',
350
+ characters: 'characters',
351
+ tools: {
352
+ bold: 'Bold',
353
+ italic: 'Italic',
354
+ underline: 'Underline',
355
+ strike: 'Strikethrough',
356
+ code: 'Code',
357
+ heading2: 'Heading',
358
+ heading3: 'Subheading',
359
+ paragraph: 'Paragraph',
360
+ bulletList: 'Bulleted list',
361
+ orderedList: 'Numbered list',
362
+ blockquote: 'Quote',
363
+ link: 'Link',
364
+ undo: 'Undo',
365
+ redo: 'Redo',
366
+ },
367
+ },
368
+ fileUpload: {
369
+ drop: 'Drag files here or',
370
+ browse: 'browse your computer',
371
+ list: 'Selected files',
372
+ remove: 'Remove',
373
+ done: 'Uploaded',
374
+ uploading: (name) => `Uploading ${name}`,
375
+ rejectedType: (name) => `${name}: file type not accepted.`,
376
+ rejectedSize: (name, size, max) => `${name}: is ${size}, the maximum is ${max}.`,
377
+ rejectedCount: (name, max) => `${name}: you can only add ${max} ${plural(max, 'file', 'files')}.`,
378
+ addedOne: (name) => `${name} added.`,
379
+ addedMany: (n) => `${n} files added.`,
380
+ removed: (name) => `${name} removed.`,
381
+ },
382
+ imageCropper: {
383
+ alt: 'Image to crop',
384
+ help: 'Arrows move the area. Alt and arrows resize it. Shift takes bigger steps.',
385
+ zoom: 'Zoom',
386
+ rotateLeft: 'Rotate left',
387
+ rotateRight: 'Rotate right',
388
+ reset: 'Reset',
389
+ area: 'crop area',
390
+ size: (w, h) => `${w} by ${h} pixels`,
391
+ position: (w, h, x, y) => `${w} by ${h} pixels, ${x} from the left and ${y} from the top`,
392
+ rotated: (deg) => `Rotated ${deg} degrees`,
393
+ },
394
+ kanban: {
395
+ label: 'Board',
396
+ empty: 'No cards',
397
+ help: 'Space to pick up. Arrows to move. Space to drop, Escape to cancel.',
398
+ cards: (n, limit) => plural(n, 'card', 'cards') + (limit ? `, maximum ${limit}` : ''),
399
+ grabbed: (card) => `${card}, picked up`,
400
+ position: (col, p, total) => `${col}, position ${p} of ${total}`,
401
+ pickedUp: (card, where) => `${card} picked up. ${where}.`,
402
+ dropped: (card, where) => `${card} dropped. ${where}.`,
403
+ cancelled: (card, where) => `Move cancelled. ${card} returned to ${where}.`,
404
+ full: (col, limit) => `${col} is full, maximum ${limit}.`,
405
+ },
406
+ notifications: {
407
+ title: 'Notifications',
408
+ markAll: 'Mark all as read',
409
+ empty: 'No notifications.',
410
+ emptyUnread: 'You are all caught up.',
411
+ filter: 'Show',
412
+ all: 'All',
413
+ unread: 'Unread',
414
+ unreadPrefix: 'Unread: ',
415
+ unreadCount: () => 'unread',
416
+ markRead: (t) => `Mark as read: ${t}`,
417
+ remove: (t) => `Remove: ${t}`,
418
+ removed: (t) => `${t} removed.`,
419
+ newOne: (t) => `New notification: ${t}`,
420
+ newMany: (n) => `${n} new notifications`,
421
+ now: 'now',
422
+ bellCount: (label, n) => `${label}, ${n} unread`,
423
+ },
424
+ pagination: {
425
+ label: 'Pagination',
426
+ rowsPerPage: 'Rows per page',
427
+ first: 'First page',
428
+ previous: 'Previous page',
429
+ previousShort: 'Previous',
430
+ next: 'Next page',
431
+ nextShort: 'Next',
432
+ last: 'Last page',
433
+ page: (n) => `Page ${n}`,
434
+ pageOf: (c, t) => `Page ${c} of ${t}`,
435
+ range: (from, to, total) => `${from}–${to} of ${total}`,
436
+ noResults: '0 results',
437
+ },
438
+ progress: { label: 'Loading' },
439
+ rangeSlider: { low: 'minimum', high: 'maximum' },
440
+ rating: {
441
+ label: 'Rating',
442
+ star: (n) => `${n} ${plural(n, 'star', 'stars')}`,
443
+ summary: (v, max) => `${v} of ${max} stars`,
444
+ },
445
+ select: { placeholder: 'Select', empty: 'No options', loading: 'Loading...' },
446
+ sidebar: { label: 'Main', collapse: 'Collapse menu', expand: 'Expand menu' },
447
+ stepper: { complete: 'completed' },
448
+ timePicker: { placeholder: 'hh:mm', label: 'Times' },
449
+ toast: {
450
+ region: 'Notifications',
451
+ close: 'Dismiss notification',
452
+ action: (label) => `Action available: ${label}`,
453
+ },
454
+ tour: {
455
+ next: 'Next',
456
+ previous: 'Back',
457
+ done: 'Done',
458
+ skip: 'Skip',
459
+ close: 'Close the tour',
460
+ progress: (c, t) => `Step ${c} of ${t}`,
461
+ },
462
+ };
463
+
464
+ const MX_I18N_CONFIG = new InjectionToken('MX_I18N_CONFIG');
465
+ const BUILT_IN = { pt: MX_MESSAGES_PT, en: MX_MESSAGES_EN };
466
+ function isPlainObject(v) {
467
+ return typeof v === 'object' && v !== null && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
468
+ }
469
+ /** Junta `patch` sobre `base`, objecto a objecto; funções, textos e números substituem. */
470
+ function mxMergeMessages(base, patch) {
471
+ if (!patch)
472
+ return base;
473
+ const out = { ...base };
474
+ for (const [k, v] of Object.entries(patch)) {
475
+ if (v === undefined)
476
+ continue;
477
+ const current = out[k];
478
+ out[k] = isPlainObject(v) && isPlainObject(current) ? mxMergeMessages(current, v) : v;
479
+ }
480
+ return out;
481
+ }
482
+ /** Dicionário incluído para o idioma ("pt-BR" usa "pt"); inglês quando não há. */
483
+ function mxBuiltInMessages(locale) {
484
+ const base = locale.toLowerCase().split(/[-_]/)[0];
485
+ return BUILT_IN[base] ?? MX_MESSAGES_EN;
486
+ }
487
+ /**
488
+ * Idioma activo e os textos dos componentes. Mudar o idioma com `setLocale`
489
+ * actualiza logo todos os componentes no ecrã.
490
+ *
491
+ * ```ts
492
+ * readonly i18n = inject(MxI18n);
493
+ * this.i18n.setLocale('en');
494
+ * ```
495
+ */
496
+ class MxI18n {
497
+ config = inject(MX_I18N_CONFIG, { optional: true }) ?? {};
498
+ custom = signal(this.config.messages ?? {}, ...(ngDevMode ? [{ debugName: "custom" }] : /* istanbul ignore next */ []));
499
+ current = signal(this.config.locale ?? 'en', ...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
500
+ /** Idioma activo, tal como foi indicado ("pt", "en", "en-GB"...). */
501
+ locale = this.current.asReadonly();
502
+ /** Todos os textos do idioma activo. */
503
+ messages = computed(() => {
504
+ const locale = this.current();
505
+ const custom = this.custom();
506
+ const base = locale.toLowerCase().split(/[-_]/)[0];
507
+ let m = mxBuiltInMessages(locale);
508
+ if (base !== locale)
509
+ m = mxMergeMessages(m, custom[base]);
510
+ return mxMergeMessages(m, custom[locale]);
511
+ }, ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
512
+ /** Locale para Intl (números, datas): "pt-AO", "en-US"... */
513
+ intlLocale = computed(() => this.messages().intlLocale, ...(ngDevMode ? [{ debugName: "intlLocale" }] : /* istanbul ignore next */ []));
514
+ setLocale(locale) {
515
+ this.current.set(locale);
516
+ }
517
+ /** Acrescenta ou corrige textos de um idioma, sem perder os que já existem. */
518
+ register(locale, messages) {
519
+ this.custom.update((c) => ({ ...c, [locale]: mxMergeMessages((c[locale] ?? {}), messages) }));
520
+ }
521
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxI18n, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
522
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxI18n, providedIn: 'root' });
523
+ }
524
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxI18n, decorators: [{
525
+ type: Injectable,
526
+ args: [{ providedIn: 'root' }]
527
+ }] });
528
+ /**
529
+ * Configura o idioma dos componentes.
530
+ *
531
+ * ```ts
532
+ * bootstrapApplication(App, {
533
+ * providers: [provideMuximaI18n({ locale: 'en' })],
534
+ * });
535
+ * ```
536
+ */
537
+ function provideMuximaI18n(config) {
538
+ return makeEnvironmentProviders([{ provide: MX_I18N_CONFIG, useValue: config }]);
539
+ }
540
+ /** Textos do idioma activo; usar dentro de um componente ou serviço. */
541
+ function injectMxMessages() {
542
+ return inject(MxI18n).messages;
543
+ }
544
+
545
+ /**
546
+ * Generated bundle index. Do not edit.
547
+ */
548
+
549
+ export { MX_I18N_CONFIG, MX_MESSAGES_EN, MX_MESSAGES_PT, MxI18n, injectMxMessages, mxBuiltInMessages, mxMergeMessages, provideMuximaI18n };
550
+ //# sourceMappingURL=muxima-ui-core-i18n.mjs.map