@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
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { ConnectedPosition } from '@angular/cdk/overlay';
3
3
  import { ControlValueAccessor } from '@angular/forms';
4
4
  import { MxFormFieldControl, MxFormField } from '@muxima-ui/core/form-field';
5
+ import { MxMessages } from '@muxima-ui/core/i18n';
5
6
 
6
7
  /** Data sem horas, para comparar dias. */
7
8
  declare function mxStartOfDay(d: Date): Date;
@@ -31,9 +32,22 @@ declare class MxCalendar {
31
32
  readonly max: _angular_core.InputSignal<Date | null>;
32
33
  /** Dias que não se podem escolher (ex.: fins-de-semana). */
33
34
  readonly dateDisabled: _angular_core.InputSignal<(d: Date) => boolean>;
34
- readonly locale: _angular_core.InputSignal<string>;
35
- /** Primeiro dia da semana: 1 = segunda-feira. */
36
- readonly firstDayOfWeek: _angular_core.InputSignal<number>;
35
+ /** Locale dos nomes dos meses e dos dias; por omissão o do idioma activo. */
36
+ readonly locale: _angular_core.InputSignal<string | undefined>;
37
+ /** Primeiro dia da semana: 0 = domingo, 1 = segunda-feira. Por omissão o do idioma activo. */
38
+ readonly firstDayOfWeek: _angular_core.InputSignal<number | undefined>;
39
+ private readonly i18n;
40
+ protected readonly msg: _angular_core.Signal<{
41
+ previousMonth: (month: string) => string;
42
+ nextMonth: (month: string) => string;
43
+ rangeStart: string;
44
+ rangeEnd: string;
45
+ rangeStartEnd: string;
46
+ rangeHint: (start: string, end: string) => string;
47
+ rangeStartHint: (start: string) => string;
48
+ }>;
49
+ private readonly loc;
50
+ private readonly firstDay;
37
51
  readonly selected: _angular_core.OutputEmitterRef<Date>;
38
52
  /** `single` escolhe um dia; `range` escolhe um intervalo em [(range)]. */
39
53
  readonly mode: _angular_core.InputSignal<"single" | "range">;
@@ -87,9 +101,15 @@ declare class MxCalendar {
87
101
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxCalendar, "mx-calendar", ["mxCalendar"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateDisabled": { "alias": "dateDisabled"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "selected": "selected"; "range": "rangeChange"; "rangeSelected": "rangeSelected"; }, never, never, true, never>;
88
102
  }
89
103
 
90
- /** Converte "dd/mm/aaaa" numa data. Aceita também "-" e "." como separadores. */
91
- declare function mxParseDate(text: string): Date | null;
92
- declare function mxFormatDate(d: Date | null): string;
104
+ /** Ordem do dia (d), mês (m) e ano (y) numa data escrita. */
105
+ type MxDateOrder = 'dmy' | 'mdy' | 'ymd';
106
+ /**
107
+ * Converte uma data escrita (por omissão "mm/dd/aaaa"; "dmy" para "dd/mm/aaaa").
108
+ * Aceita também "-" e "." como separadores.
109
+ */
110
+ declare function mxParseDate(text: string, order?: MxDateOrder): Date | null;
111
+ /** Escreve a data na ordem indicada (por omissão "mm/dd/aaaa"). */
112
+ declare function mxFormatDate(d: Date | null, order?: MxDateOrder): string;
93
113
  /**
94
114
  * Campo de data: escreve-se "dd/mm/aaaa" ou escolhe-se no calendário.
95
115
  * O calendário abre num diálogo não modal com foco no dia; Escape fecha.
@@ -109,8 +129,17 @@ declare class MxDatePicker implements ControlValueAccessor, MxFormFieldControl {
109
129
  readonly min: _angular_core.InputSignal<Date | null>;
110
130
  readonly max: _angular_core.InputSignal<Date | null>;
111
131
  readonly dateDisabled: _angular_core.InputSignal<(d: Date) => boolean>;
112
- readonly locale: _angular_core.InputSignal<string>;
113
- readonly placeholder: _angular_core.InputSignal<string>;
132
+ /** Locale dos nomes dos meses e dos dias; por omissão o do idioma activo. */
133
+ readonly locale: _angular_core.InputSignal<string | undefined>;
134
+ /** Por omissão "dd/mm/aaaa" em português e "mm/dd/yyyy" em inglês. */
135
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
136
+ private readonly i18n;
137
+ protected readonly msg: _angular_core.Signal<{
138
+ placeholder: string;
139
+ choose: string;
140
+ change: (date: string) => string;
141
+ }>;
142
+ protected readonly loc: _angular_core.Signal<string>;
114
143
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
115
144
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
116
145
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -166,8 +195,12 @@ interface MxDateRangePreset {
166
195
  end: Date;
167
196
  };
168
197
  }
169
- /** Atalhos comuns: últimos 7 e 30 dias, este mês e o mês passado. */
170
- declare function mxDefaultRangePresets(): MxDateRangePreset[];
198
+ /**
199
+ * Atalhos comuns: últimos 7 e 30 dias, este mês e o mês passado.
200
+ * Os nomes vêm de `labels` (por omissão em inglês); para o idioma activo,
201
+ * usa `mxDefaultRangePresets(inject(MxI18n).messages().dateRangePicker)`.
202
+ */
203
+ declare function mxDefaultRangePresets(labels?: MxMessages['dateRangePicker']): MxDateRangePreset[];
171
204
  /**
172
205
  * Campo de intervalo de datas: dois campos (início e fim) que se escrevem em "dd/mm/aaaa"
173
206
  * ou se escolhem num calendário, com atalhos opcionais.
@@ -188,10 +221,26 @@ declare class MxDateRangePicker implements ControlValueAccessor, MxFormFieldCont
188
221
  readonly max: _angular_core.InputSignal<Date | null>;
189
222
  readonly dateDisabled: _angular_core.InputSignal<(d: Date) => boolean>;
190
223
  readonly presets: _angular_core.InputSignal<MxDateRangePreset[]>;
191
- readonly locale: _angular_core.InputSignal<string>;
192
- readonly placeholder: _angular_core.InputSignal<string>;
193
- readonly startLabel: _angular_core.InputSignal<string>;
194
- readonly endLabel: _angular_core.InputSignal<string>;
224
+ /** Locale dos nomes dos meses e dos dias; por omissão o do idioma activo. */
225
+ readonly locale: _angular_core.InputSignal<string | undefined>;
226
+ /** Por omissão "dd/mm/aaaa" em português e "mm/dd/yyyy" em inglês. */
227
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
228
+ readonly startLabel: _angular_core.InputSignal<string | undefined>;
229
+ readonly endLabel: _angular_core.InputSignal<string | undefined>;
230
+ private readonly i18n;
231
+ protected readonly msg: _angular_core.Signal<{
232
+ start: string;
233
+ end: string;
234
+ choose: string;
235
+ change: (start: string, end: string) => string;
236
+ presets: string;
237
+ last7Days: string;
238
+ last30Days: string;
239
+ thisMonth: string;
240
+ lastMonth: string;
241
+ }>;
242
+ protected readonly loc: _angular_core.Signal<string>;
243
+ protected readonly placeholderText: _angular_core.Signal<string>;
195
244
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
196
245
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
197
246
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -258,4 +307,4 @@ declare function mxDateRangeComplete(control: {
258
307
  } | null;
259
308
 
260
309
  export { MxCalendar, MxDatePicker, MxDateRangePicker, mxDateRangeComplete, mxDefaultRangePresets, mxFormatDate, mxParseDate, mxSameDay, mxStartOfDay };
261
- export type { MxDateRange, MxDateRangePreset };
310
+ export type { MxDateOrder, MxDateRange, MxDateRangePreset };
@@ -48,8 +48,19 @@ declare class MxEditor implements ControlValueAccessor, MxFormFieldControl {
48
48
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
49
49
  readonly id: _angular_core.InputSignal<string | undefined>;
50
50
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
51
- readonly toolbarLabel: _angular_core.InputSignal<string>;
52
- readonly linkLabel: _angular_core.InputSignal<string>;
51
+ readonly toolbarLabel: _angular_core.InputSignal<string | undefined>;
52
+ readonly linkLabel: _angular_core.InputSignal<string | undefined>;
53
+ private readonly i18n;
54
+ protected readonly msg: _angular_core.Signal<{
55
+ toolbar: string;
56
+ link: string;
57
+ apply: string;
58
+ remove: string;
59
+ cancel: string;
60
+ characters: string;
61
+ tools: Record<"bold" | "italic" | "underline" | "strike" | "code" | "heading2" | "heading3" | "paragraph" | "bulletList" | "orderedList" | "blockquote" | "link" | "undo" | "redo", string>;
62
+ }>;
63
+ protected toolLabel(t: MxEditorTool): string;
53
64
  protected readonly field: MxFormField | null;
54
65
  private readonly ngControl;
55
66
  private readonly content;
@@ -7,7 +7,7 @@ interface MxFileRejection {
7
7
  reason: 'type' | 'size' | 'count';
8
8
  message: string;
9
9
  }
10
- /** "1,2 MB", "340 kB". */
10
+ /** "1.2 MB", "340 kB" (com locale "pt-AO": "1,2 MB"). */
11
11
  declare function mxFormatBytes(bytes: number, locale?: string): string;
12
12
  /** true se o ficheiro corresponde a `accept` (".pdf,image/*"). */
13
13
  declare function mxFileMatches(file: File, accept: string): boolean;
@@ -38,14 +38,30 @@ declare class MxFileUpload implements ControlValueAccessor, MxFormFieldControl {
38
38
  readonly progress: _angular_core.InputSignal<Record<string, number>>;
39
39
  /** Erro de envio por nome de ficheiro. */
40
40
  readonly errors: _angular_core.InputSignal<Record<string, string>>;
41
- readonly dropText: _angular_core.InputSignal<string>;
42
- readonly buttonText: _angular_core.InputSignal<string>;
41
+ readonly dropText: _angular_core.InputSignal<string | undefined>;
42
+ private readonly i18n;
43
+ protected readonly msg: _angular_core.Signal<{
44
+ drop: string;
45
+ browse: string;
46
+ list: string;
47
+ remove: string;
48
+ done: string;
49
+ uploading: (name: string) => string;
50
+ rejectedType: (name: string) => string;
51
+ rejectedSize: (name: string, size: string, max: string) => string;
52
+ rejectedCount: (name: string, max: number) => string;
53
+ addedOne: (name: string) => string;
54
+ addedMany: (n: number) => string;
55
+ removed: (name: string) => string;
56
+ }>;
57
+ readonly buttonText: _angular_core.InputSignal<string | undefined>;
43
58
  /** Linha de ajuda dentro da área (ex.: "PDF até 5 MB"). */
44
59
  readonly description: _angular_core.InputSignal<string>;
45
- readonly listLabel: _angular_core.InputSignal<string>;
46
- readonly removeText: _angular_core.InputSignal<string>;
47
- readonly doneText: _angular_core.InputSignal<string>;
48
- readonly locale: _angular_core.InputSignal<string>;
60
+ readonly listLabel: _angular_core.InputSignal<string | undefined>;
61
+ readonly removeText: _angular_core.InputSignal<string | undefined>;
62
+ readonly doneText: _angular_core.InputSignal<string | undefined>;
63
+ /** Locale dos tamanhos ("1,2 MB"); por omissão o do idioma activo. */
64
+ readonly locale: _angular_core.InputSignal<string | undefined>;
49
65
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
50
66
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
51
67
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -157,13 +157,13 @@ declare class MxFieldset {
157
157
  *
158
158
  * ```html
159
159
  * <div mxInputGroup>
160
- * <span mxInputAddon>Kz</span>
160
+ * <span mxInputAddon>US$</span>
161
161
  * <input mxInput inputmode="decimal" aria-label="Valor" />
162
162
  * <span mxInputAddon>,00</span>
163
163
  * </div>
164
164
  * ```
165
165
  *
166
- * O prefixo e o sufixo são só visuais: inclui a unidade no label (ex.: "Valor em Kz").
166
+ * O prefixo e o sufixo são só visuais: inclui a unidade no label (ex.: "Valor em US$").
167
167
  */
168
168
  declare class MxInputGroup {
169
169
  static ɵfac: i0.ɵɵFactoryDeclaration<MxInputGroup, never>;
@@ -0,0 +1,322 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Signal, EnvironmentProviders } from '@angular/core';
3
+
4
+ /**
5
+ * Todos os textos que os componentes mostram ou anunciam ao leitor de ecrã.
6
+ * Os textos com valores variáveis são funções; os números e as datas chegam já formatados.
7
+ */
8
+ interface MxMessages {
9
+ /** Locale BCP 47 usado em Intl (números, datas, ordenação). Ex.: "pt-AO", "en-US". */
10
+ intlLocale: string;
11
+ /** Ordem do dia, mês e ano nos campos de data escritos à mão. */
12
+ dateOrder: 'dmy' | 'mdy' | 'ymd';
13
+ /** Primeiro dia da semana no calendário: 0 = domingo, 1 = segunda-feira. */
14
+ firstDayOfWeek: number;
15
+ alert: {
16
+ close: string;
17
+ };
18
+ breadcrumb: {
19
+ label: string;
20
+ };
21
+ calendar: {
22
+ previousMonth: (month: string) => string;
23
+ nextMonth: (month: string) => string;
24
+ rangeStart: string;
25
+ rangeEnd: string;
26
+ rangeStartEnd: string;
27
+ rangeHint: (start: string, end: string) => string;
28
+ rangeStartHint: (start: string) => string;
29
+ };
30
+ carousel: {
31
+ carousel: string;
32
+ slide: string;
33
+ previous: string;
34
+ next: string;
35
+ choose: string;
36
+ goTo: (n: number) => string;
37
+ position: (n: number, total: number) => string;
38
+ play: string;
39
+ pause: string;
40
+ };
41
+ chips: {
42
+ remove: string;
43
+ list: string;
44
+ help: string;
45
+ added: (tag: string) => string;
46
+ removed: (tag: string) => string;
47
+ max: (max: number) => string;
48
+ duplicate: (tag: string) => string;
49
+ };
50
+ clipboard: {
51
+ copy: string;
52
+ copied: string;
53
+ failed: string;
54
+ };
55
+ colorPicker: {
56
+ choose: string;
57
+ change: (name: string, hex: string) => string;
58
+ area: string;
59
+ hue: string;
60
+ alpha: string;
61
+ swatches: string;
62
+ eyeDropper: string;
63
+ hex: string;
64
+ areaValue: (saturation: number, brightness: number, name: string) => string;
65
+ hueValue: (degrees: number, name: string) => string;
66
+ names: MxColorNames;
67
+ };
68
+ combobox: {
69
+ placeholder: string;
70
+ empty: string;
71
+ loading: string;
72
+ };
73
+ command: {
74
+ placeholder: string;
75
+ label: string;
76
+ empty: string;
77
+ results: (n: number) => string;
78
+ };
79
+ dataGrid: {
80
+ label: string;
81
+ empty: string;
82
+ loading: string;
83
+ columns: string;
84
+ filter: string;
85
+ all: string;
86
+ selectAll: string;
87
+ selectRow: string;
88
+ selection: string;
89
+ resizeHint: string;
90
+ numberFilter: (filter: string, column: string) => string;
91
+ rows: (n: string, count: number) => string;
92
+ of: (total: string) => string;
93
+ selected: (n: string, count: number) => string;
94
+ sorted: (column: string, direction: 'asc' | 'desc') => string;
95
+ unsorted: string;
96
+ width: (column: string, px: number) => string;
97
+ };
98
+ datePicker: {
99
+ placeholder: string;
100
+ choose: string;
101
+ change: (date: string) => string;
102
+ };
103
+ dateRangePicker: {
104
+ start: string;
105
+ end: string;
106
+ choose: string;
107
+ change: (start: string, end: string) => string;
108
+ presets: string;
109
+ last7Days: string;
110
+ last30Days: string;
111
+ thisMonth: string;
112
+ lastMonth: string;
113
+ };
114
+ editor: {
115
+ toolbar: string;
116
+ link: string;
117
+ apply: string;
118
+ remove: string;
119
+ cancel: string;
120
+ characters: string;
121
+ tools: Record<'bold' | 'italic' | 'underline' | 'strike' | 'code' | 'heading2' | 'heading3' | 'paragraph' | 'bulletList' | 'orderedList' | 'blockquote' | 'link' | 'undo' | 'redo', string>;
122
+ };
123
+ fileUpload: {
124
+ drop: string;
125
+ browse: string;
126
+ list: string;
127
+ remove: string;
128
+ done: string;
129
+ uploading: (name: string) => string;
130
+ rejectedType: (name: string) => string;
131
+ rejectedSize: (name: string, size: string, max: string) => string;
132
+ rejectedCount: (name: string, max: number) => string;
133
+ addedOne: (name: string) => string;
134
+ addedMany: (n: number) => string;
135
+ removed: (name: string) => string;
136
+ };
137
+ imageCropper: {
138
+ alt: string;
139
+ help: string;
140
+ zoom: string;
141
+ rotateLeft: string;
142
+ rotateRight: string;
143
+ reset: string;
144
+ area: string;
145
+ size: (width: number, height: number) => string;
146
+ position: (width: number, height: number, x: number, y: number) => string;
147
+ rotated: (degrees: number) => string;
148
+ };
149
+ kanban: {
150
+ label: string;
151
+ empty: string;
152
+ help: string;
153
+ cards: (n: number, limit: number | null) => string;
154
+ grabbed: (card: string) => string;
155
+ position: (column: string, position: number, total: number) => string;
156
+ pickedUp: (card: string, where: string) => string;
157
+ dropped: (card: string, where: string) => string;
158
+ cancelled: (card: string, where: string) => string;
159
+ full: (column: string, limit: number) => string;
160
+ };
161
+ notifications: {
162
+ title: string;
163
+ markAll: string;
164
+ empty: string;
165
+ emptyUnread: string;
166
+ filter: string;
167
+ all: string;
168
+ unread: string;
169
+ unreadPrefix: string;
170
+ unreadCount: (n: number) => string;
171
+ markRead: (title: string) => string;
172
+ remove: (title: string) => string;
173
+ removed: (title: string) => string;
174
+ newOne: (title: string) => string;
175
+ newMany: (n: number) => string;
176
+ now: string;
177
+ bellCount: (label: string, n: number) => string;
178
+ };
179
+ pagination: {
180
+ label: string;
181
+ rowsPerPage: string;
182
+ first: string;
183
+ previous: string;
184
+ previousShort: string;
185
+ next: string;
186
+ nextShort: string;
187
+ last: string;
188
+ page: (n: number) => string;
189
+ pageOf: (current: number, total: number) => string;
190
+ range: (from: string, to: string, total: string) => string;
191
+ noResults: string;
192
+ };
193
+ progress: {
194
+ label: string;
195
+ };
196
+ rangeSlider: {
197
+ low: string;
198
+ high: string;
199
+ };
200
+ rating: {
201
+ label: string;
202
+ star: (n: number) => string;
203
+ summary: (value: string, max: number) => string;
204
+ };
205
+ select: {
206
+ placeholder: string;
207
+ empty: string;
208
+ loading: string;
209
+ };
210
+ sidebar: {
211
+ label: string;
212
+ collapse: string;
213
+ expand: string;
214
+ };
215
+ stepper: {
216
+ complete: string;
217
+ };
218
+ timePicker: {
219
+ placeholder: string;
220
+ label: string;
221
+ };
222
+ toast: {
223
+ region: string;
224
+ close: string;
225
+ action: (label: string) => string;
226
+ };
227
+ tour: {
228
+ next: string;
229
+ previous: string;
230
+ done: string;
231
+ skip: string;
232
+ close: string;
233
+ progress: (current: number, total: number) => string;
234
+ };
235
+ }
236
+ /** Nomes aproximados das cores, para o leitor de ecrã. */
237
+ interface MxColorNames {
238
+ black: string;
239
+ white: string;
240
+ lightGray: string;
241
+ gray: string;
242
+ darkGray: string;
243
+ brown: string;
244
+ red: string;
245
+ orange: string;
246
+ yellow: string;
247
+ lime: string;
248
+ green: string;
249
+ teal: string;
250
+ blue: string;
251
+ purple: string;
252
+ magenta: string;
253
+ /** Junta o tom ao nome: "azul escuro", "dark blue". */
254
+ tone: (name: string, tone: 'dark' | 'light') => string;
255
+ }
256
+ /** Objecto com todas as chaves opcionais, a qualquer profundidade. */
257
+ type MxDeepPartial<T> = {
258
+ [K in keyof T]?: T[K] extends (...args: never[]) => unknown ? T[K] : T[K] extends object ? MxDeepPartial<T[K]> : T[K];
259
+ };
260
+
261
+ /** Português (Angola). */
262
+ declare const MX_MESSAGES_PT: MxMessages;
263
+
264
+ /** English (United States). */
265
+ declare const MX_MESSAGES_EN: MxMessages;
266
+
267
+ /** Idiomas incluídos na biblioteca. Outros podem ser registados com `messages`. */
268
+ type MxBuiltInLocale = 'pt' | 'en';
269
+ interface MxI18nConfig {
270
+ /** Idioma inicial: "en" (por omissão) ou "pt". Aceita também "pt-BR", "en-GB", etc. */
271
+ locale?: string;
272
+ /**
273
+ * Textos por idioma. Para "pt" e "en" basta indicar o que muda; um idioma novo
274
+ * (ex.: "fr") parte do inglês e substitui o que indicares.
275
+ */
276
+ messages?: Record<string, MxDeepPartial<MxMessages>>;
277
+ }
278
+ declare const MX_I18N_CONFIG: InjectionToken<MxI18nConfig>;
279
+ /** Junta `patch` sobre `base`, objecto a objecto; funções, textos e números substituem. */
280
+ declare function mxMergeMessages<T>(base: T, patch: MxDeepPartial<T> | undefined): T;
281
+ /** Dicionário incluído para o idioma ("pt-BR" usa "pt"); inglês quando não há. */
282
+ declare function mxBuiltInMessages(locale: string): MxMessages;
283
+ /**
284
+ * Idioma activo e os textos dos componentes. Mudar o idioma com `setLocale`
285
+ * actualiza logo todos os componentes no ecrã.
286
+ *
287
+ * ```ts
288
+ * readonly i18n = inject(MxI18n);
289
+ * this.i18n.setLocale('en');
290
+ * ```
291
+ */
292
+ declare class MxI18n {
293
+ private readonly config;
294
+ private readonly custom;
295
+ private readonly current;
296
+ /** Idioma activo, tal como foi indicado ("pt", "en", "en-GB"...). */
297
+ readonly locale: Signal<string>;
298
+ /** Todos os textos do idioma activo. */
299
+ readonly messages: Signal<MxMessages>;
300
+ /** Locale para Intl (números, datas): "pt-AO", "en-US"... */
301
+ readonly intlLocale: Signal<string>;
302
+ setLocale(locale: string): void;
303
+ /** Acrescenta ou corrige textos de um idioma, sem perder os que já existem. */
304
+ register(locale: string, messages: MxDeepPartial<MxMessages>): void;
305
+ static ɵfac: i0.ɵɵFactoryDeclaration<MxI18n, never>;
306
+ static ɵprov: i0.ɵɵInjectableDeclaration<MxI18n>;
307
+ }
308
+ /**
309
+ * Configura o idioma dos componentes.
310
+ *
311
+ * ```ts
312
+ * bootstrapApplication(App, {
313
+ * providers: [provideMuximaI18n({ locale: 'en' })],
314
+ * });
315
+ * ```
316
+ */
317
+ declare function provideMuximaI18n(config: MxI18nConfig): EnvironmentProviders;
318
+ /** Textos do idioma activo; usar dentro de um componente ou serviço. */
319
+ declare function injectMxMessages(): Signal<MxMessages>;
320
+
321
+ export { MX_I18N_CONFIG, MX_MESSAGES_EN, MX_MESSAGES_PT, MxI18n, injectMxMessages, mxBuiltInMessages, mxMergeMessages, provideMuximaI18n };
322
+ export type { MxBuiltInLocale, MxColorNames, MxDeepPartial, MxI18nConfig, MxMessages };
@@ -37,7 +37,20 @@ interface MxCropArea extends MxRect {
37
37
  */
38
38
  declare class MxImageCropper {
39
39
  readonly src: _angular_core.InputSignal<string | File | Blob | null>;
40
- readonly alt: _angular_core.InputSignal<string>;
40
+ readonly alt: _angular_core.InputSignal<string | undefined>;
41
+ private readonly i18n;
42
+ protected readonly msg: _angular_core.Signal<{
43
+ alt: string;
44
+ help: string;
45
+ zoom: string;
46
+ rotateLeft: string;
47
+ rotateRight: string;
48
+ reset: string;
49
+ area: string;
50
+ size: (width: number, height: number) => string;
51
+ position: (width: number, height: number, x: number, y: number) => string;
52
+ rotated: (degrees: number) => string;
53
+ }>;
41
54
  /** Largura / altura da área (1 = quadrado, 16/9...). null = livre. */
42
55
  readonly aspectRatio: _angular_core.InputSignal<number | null>;
43
56
  /** Máscara redonda (fotografias de perfil). toBlob devolve PNG com cantos transparentes. */
@@ -48,11 +61,11 @@ declare class MxImageCropper {
48
61
  readonly minSize: _angular_core.InputSignalWithTransform<number, unknown>;
49
62
  readonly zoom: _angular_core.ModelSignal<number>;
50
63
  readonly rotation: _angular_core.ModelSignal<number>;
51
- readonly helpText: _angular_core.InputSignal<string>;
52
- readonly zoomText: _angular_core.InputSignal<string>;
53
- readonly rotateLeftText: _angular_core.InputSignal<string>;
54
- readonly rotateRightText: _angular_core.InputSignal<string>;
55
- readonly resetText: _angular_core.InputSignal<string>;
64
+ readonly helpText: _angular_core.InputSignal<string | undefined>;
65
+ readonly zoomText: _angular_core.InputSignal<string | undefined>;
66
+ readonly rotateLeftText: _angular_core.InputSignal<string | undefined>;
67
+ readonly rotateRightText: _angular_core.InputSignal<string | undefined>;
68
+ readonly resetText: _angular_core.InputSignal<string | undefined>;
56
69
  /** Área recortada em píxeis da imagem original. */
57
70
  readonly areaChange: _angular_core.OutputEmitterRef<MxCropArea>;
58
71
  private readonly stage;
@@ -45,10 +45,23 @@ declare class MxKanban<T = any> {
45
45
  readonly itemKey: _angular_core.InputSignal<string | ((item: T) => unknown)>;
46
46
  /** Nome do cartão nos anúncios. Por omissão o campo `title` ou `titulo`. */
47
47
  readonly itemLabel: _angular_core.InputSignal<(item: T) => string>;
48
- readonly ariaLabel: _angular_core.InputSignal<string>;
48
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
49
+ private readonly i18n;
50
+ protected readonly msg: _angular_core.Signal<{
51
+ label: string;
52
+ empty: string;
53
+ help: string;
54
+ cards: (n: number, limit: number | null) => string;
55
+ grabbed: (card: string) => string;
56
+ position: (column: string, position: number, total: number) => string;
57
+ pickedUp: (card: string, where: string) => string;
58
+ dropped: (card: string, where: string) => string;
59
+ cancelled: (card: string, where: string) => string;
60
+ full: (column: string, limit: number) => string;
61
+ }>;
49
62
  readonly headingLevel: _angular_core.InputSignal<number>;
50
- readonly emptyText: _angular_core.InputSignal<string>;
51
- readonly helpText: _angular_core.InputSignal<string>;
63
+ readonly emptyText: _angular_core.InputSignal<string | undefined>;
64
+ readonly helpText: _angular_core.InputSignal<string | undefined>;
52
65
  readonly moved: _angular_core.OutputEmitterRef<MxKanbanMove<T>>;
53
66
  protected readonly cardTpl: _angular_core.Signal<MxKanbanCard | undefined>;
54
67
  protected readonly footerTpl: _angular_core.Signal<MxKanbanColumnFooter | undefined>;
@@ -1,3 +1,4 @@
1
+ import * as _muxima_ui_core_i18n from '@muxima-ui/core/i18n';
1
2
  import * as _angular_core from '@angular/core';
2
3
  import { TemplateRef } from '@angular/core';
3
4
 
@@ -13,8 +14,8 @@ interface MxNotification<D = unknown> {
13
14
  category?: string;
14
15
  data?: D;
15
16
  }
16
- /** "agora", "há 5 min", "ontem", "há 3 dias" e, depois de uma semana, a data. */
17
- declare function mxRelativeTime(date: Date, now?: Date, locale?: string): string;
17
+ /** "now", "5 min ago", "yesterday", "3 days ago" e, depois de uma semana, a data (em inglês por omissão). */
18
+ declare function mxRelativeTime(date: Date, now?: Date, locale?: string, nowText?: string): string;
18
19
  /** Modelo para o conteúdo de cada notificação: `<ng-template mxNotificationContent let-n>`. */
19
20
  declare class MxNotificationContent {
20
21
  readonly template: TemplateRef<any>;
@@ -35,13 +36,13 @@ declare class MxNotificationContent {
35
36
  */
36
37
  declare class MxNotificationCenter<D = unknown> {
37
38
  readonly items: _angular_core.InputSignal<readonly MxNotification<D>[]>;
38
- readonly title: _angular_core.InputSignal<string>;
39
+ readonly title: _angular_core.InputSignal<string | undefined>;
39
40
  /** Nível do título para o leitor de ecrã (h2 por omissão). */
40
41
  readonly headingLevel: _angular_core.InputSignal<number>;
41
- readonly markAllText: _angular_core.InputSignal<string>;
42
- readonly emptyText: _angular_core.InputSignal<string>;
43
- readonly emptyUnreadText: _angular_core.InputSignal<string>;
44
- readonly filterLabel: _angular_core.InputSignal<string>;
42
+ readonly markAllText: _angular_core.InputSignal<string | undefined>;
43
+ readonly emptyText: _angular_core.InputSignal<string | undefined>;
44
+ readonly emptyUnreadText: _angular_core.InputSignal<string | undefined>;
45
+ readonly filterLabel: _angular_core.InputSignal<string | undefined>;
45
46
  /** Mostra os filtros Todas, Por ler e as categorias. */
46
47
  readonly showFilter: _angular_core.InputSignalWithTransform<boolean, unknown>;
47
48
  /** Mostra o botão de remover em cada notificação. */
@@ -50,7 +51,27 @@ declare class MxNotificationCenter<D = unknown> {
50
51
  readonly markReadOnOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
51
52
  /** Anuncia ao leitor de ecrã quando chegam notificações por ler. */
52
53
  readonly announce: _angular_core.InputSignalWithTransform<boolean, unknown>;
53
- readonly locale: _angular_core.InputSignal<string>;
54
+ /** Locale das datas; por omissão o do idioma activo. */
55
+ readonly locale: _angular_core.InputSignal<string | undefined>;
56
+ private readonly i18n;
57
+ protected readonly msg: _angular_core.Signal<{
58
+ title: string;
59
+ markAll: string;
60
+ empty: string;
61
+ emptyUnread: string;
62
+ filter: string;
63
+ all: string;
64
+ unread: string;
65
+ unreadPrefix: string;
66
+ unreadCount: (n: number) => string;
67
+ markRead: (title: string) => string;
68
+ remove: (title: string) => string;
69
+ removed: (title: string) => string;
70
+ newOne: (title: string) => string;
71
+ newMany: (n: number) => string;
72
+ now: string;
73
+ bellCount: (label: string, n: number) => string;
74
+ }>;
54
75
  readonly opened: _angular_core.OutputEmitterRef<MxNotification<D>>;
55
76
  readonly markRead: _angular_core.OutputEmitterRef<MxNotification<D>>;
56
77
  readonly markAllRead: _angular_core.OutputEmitterRef<void>;
@@ -82,7 +103,8 @@ declare class MxNotificationCenter<D = unknown> {
82
103
  declare class MxNotificationBell {
83
104
  readonly count: _angular_core.InputSignal<number>;
84
105
  readonly max: _angular_core.InputSignal<number>;
85
- readonly label: _angular_core.InputSignal<string>;
106
+ readonly label: _angular_core.InputSignal<string | undefined>;
107
+ protected readonly i18n: _angular_core.Signal<_muxima_ui_core_i18n.MxMessages>;
86
108
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxNotificationBell, never>;
87
109
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxNotificationBell, "button[mxNotificationBell]", ["mxNotificationBell"], { "count": { "alias": "count"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
88
110
  }